diff --git a/client/etc/preinit/NetLib.py b/client/etc/preinit/NetLib.py deleted file mode 100755 index 40e7fa9..0000000 --- a/client/etc/preinit/NetLib.py +++ /dev/null @@ -1,254 +0,0 @@ -import subprocess -import sys -import os - -from engine.FileLib import * -from engine.SystemLib import * - -def ogChangeRepo(): - SRCIMG = "" - NEWREPO = "" - REPO = "" - OGUNIT = "" - - if len(sys.argv) < 2: - print("Usage: ogChangeRepo IPREPO [ OgUnit ]") - print("Example: ogChangeRepo 10.1.120.3") - print("Example: ogChangeRepo 10.1.120.3 cdc") - return - - if sys.argv[1] == "help": - print("Usage: ogChangeRepo IPREPO [ OgUnit ]") - print("Example: ogChangeRepo 10.1.120.3") - print("Example: ogChangeRepo 10.1.120.3 cdc") - return - - if len(sys.argv) >= 2: - NEWREPO = sys.argv[1] - - # Opciones de montaje: lectura o escritura - subprocess.run(["mount", "|", "grep", "ogimages.*rw,"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - RW = ",rw" if subprocess.returncode == 0 else ",ro" - - # Si REPO tomamos el repositorio y la unidad organizativa actual - REPO = ogGetRepoIp() - OGUNIT = subprocess.run(["df", "|", "awk", "-F", " ", "'/ogimages/ {sub(\"//.*/ogimages\",\"\",$1); sub(\"/\",\"\",$1); print $1}'"], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().strip() - - # Parametros de entrada. Si $1 = "REPO" dejo el repositorio actual - if sys.argv[1].upper() == "REPO": - NEWREPO = REPO - - # Si $1 y $2 son el repositorio y la OU actual me salgo - if NEWREPO == REPO and sys.argv[2] == OGUNIT: - return 0 - - subprocess.run(["source", "/scripts/functions"], shell=True) - subprocess.run(["source", "/scripts/ogfunctions"], shell=True) - subprocess.run(["umount", OGIMG]) - - if sys.argv[2] == "": - SRCIMG = "ogimages" - else: - SRCIMG = "ogimages/" + sys.argv[2] - - subprocess.run(["eval", "$(grep \"OPTIONS=\" /scripts/ogfunctions)"]) - - ogEcho("session", "log", MSG_HELP_ogChangeRepo + " " + NEWREPO + " " + sys.argv[2].rstrip()) - ogConnect(NEWREPO, ogprotocol, SRCIMG, OGIMG, RW) - - # Si da error volvemos a montar el inicial - if subprocess.returncode != 0: - ogConnect(REPO, ogprotocol, SRCIMG, OGIMG, RW) - ogRaiseError("session", OG_ERR_REPO, NEWREPO) - return subprocess.returncode - -def ogGetGroupDir(): - REPO = "" - DIR = "" - GROUP = "" - - if len(sys.argv) < 2: - ogHelp("ogGetGroupDir", "ogGetGroupDir str_repo", "ogGetGroupDir REPO ==> /opt/opengnsys/images/groups/Grupo1") - return - - if len(sys.argv) == 1: - REPO = "REPO" - else: - REPO = sys.argv[1] - - GROUP = ogGetGroupName() - if GROUP: - DIR = ogGetPath(REPO, "/groups/" + GROUP, stderr=subprocess.DEVNULL) - if os.path.isdir(DIR): - print(DIR) - - return 0 - -def ogGetGroupName(): - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetGroupName", "ogGetGroupName", "ogGetGroupName => Grupo1") - return - - if "group" in globals() and group: - print(group) - - return 0 - -def ogGetHostname(): - HOST = "" - - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetHostname", "ogGetHostname", "ogGetHostname => pc1") - return - - # Tomar nombre de la variable HOSTNAME - HOST = os.getenv("HOSTNAME") - - # Si no, tomar del DHCP, opción host-name - if not HOST: - with open("/var/lib/dhcp3/dhclient.leases", "r") as f: - for line in f: - if "option host-name" in line: - HOST = line.split('"')[1] - break - - # Si no, leer el parámetro del kernel hostname - if not HOST: - with open("/proc/cmdline", "r") as f: - cmdline = f.read() - HOST = re.search(r"hostname=([^ ]+)", cmdline) - if HOST: - HOST = HOST.group(1) - - if HOSTNAME != HOST: - os.environ["HOSTNAME"] = HOST - - if HOST: - print(HOST) - -def ogGetIpAddress(): - IP = "" - - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetIpAddress", "ogGetIpAddress", "ogGetIpAddress => 192.168.0.10") - return - - if "IPV4ADDR" in os.environ: - IP = os.environ["IPV4ADDR"] - else: - # Obtener direcciones IP. - if "DEVICE" in os.environ: - IP = subprocess.run(["ip", "-o", "address", "show", "up", "dev", os.environ["DEVICE"]], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().split() - else: - IP = subprocess.run(["ip", "-o", "address", "show", "up"], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().split() - - IP = [addr.split("/")[0] for addr in IP if "inet" in addr] - - # Mostrar solo la primera. - if IP: - print(IP[0]) - - return 0 - -def ogGetMacAddress(): - MAC = "" - - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetMacAddress", "ogGetMacAddress", "ogGetMacAddress => 00:11:22:33:44:55") - return - - # Obtener direcciones Ethernet. - if "DEVICE" in os.environ: - MAC = subprocess.run(["ip", "-o", "link", "show", "up", "dev", os.environ["DEVICE"]], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().split() - MAC = [addr.upper() for addr in MAC if "ether" in addr] - else: - MAC = subprocess.run(["ip", "-o", "link", "show", "up"], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().split() - MAC = [addr.upper() for addr in MAC if "ether" in addr and "lo" not in addr] - - # Mostrar solo la primera. - if MAC: - print(MAC[0]) - - return 0 - -def ogGetNetInterface(): - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetNetInterface", "ogGetNetInterface", "ogGetNetInterface => eth0") - return - - if "DEVICE" in os.environ: - print(os.environ["DEVICE"]) - - return 0 - -def ogGetRepoIp(): - # Variables locales. - SOURCE = "" - FSTYPE = "" - - # Mostrar ayuda. - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetRepoIp", "ogGetRepoIp", "ogGetRepoIp => 192.168.0.2") - return - - # Obtener direcciones IP, según el tipo de montaje. - output = subprocess.run(["findmnt", "-P", "-o", "SOURCE,FSTYPE", OGIMG], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().strip() - lines = output.split("\n") - for line in lines: - fields = line.split() - if len(fields) == 2: - if fields[1] == "nfs": - SOURCE = fields[0].split(":")[0] - elif fields[1] == "cifs": - SOURCE = fields[0].split("/")[2] - - if SOURCE: - print(SOURCE) - - return 0 - -def ogGetServerIp(): - # Variables locales. - SOURCE = "" - FSTYPE = "" - - # Mostrar ayuda. - if len(sys.argv) >= 2 and sys.argv[1] == "help": - ogHelp("ogGetServerIp", "ogGetServerIp", "ogGetServerIp => 192.168.0.2") - return - - # Obtener direcciones IP, según el tipo de montaje. - output = subprocess.run(["findmnt", "-P", "-o", "SOURCE,FSTYPE", OGIMG], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.decode().strip() - lines = output.split("\n") - for line in lines: - fields = line.split() - if len(fields) == 2: - if fields[1] == "nfs": - SOURCE = fields[0].split(":")[0] - elif fields[1] == "cifs": - SOURCE = fields[0].split("/")[2] - - if SOURCE: - print(SOURCE) - - return 0 - -def ogMakeGroupDir(): - REPO = "" - DIR = "" - GROUP = "" - - if len(sys.argv) < 2: - ogHelp("ogMakeGroupDir", "ogMakeGroupDir str_repo", "ogMakeGroupDir", "ogMakeGroupDir REPO") - return - - if len(sys.argv) == 1: - REPO = "REPO" - else: - REPO = sys.argv[1] - - DIR = ogGetPath(REPO, "/groups/" + ogGetGroupName(), stderr=subprocess.DEVNULL) - if DIR: - subprocess.run(["mkdir", "-p", DIR], stderr=subprocess.DEVNULL) - - return 0 diff --git a/client/etc/preinit/__init__.py b/client/etc/preinit/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/client/etc/preinit/default.py b/client/etc/preinit/default.py deleted file mode 100644 index 7914407..0000000 --- a/client/etc/preinit/default.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -import subprocess - -print (">>>>>>>>>>>>>>>>>>>> Load ", __name__, " <<<<<<<<<<<<<<<<<<<<<<") - -print("==============================================") -print("OpenGnsys Clonning Engine Start...") -# Cargar entorno de OpenGnsys -#os.environ['OGETC'] = '/opt/opengnsys/etc' #Entorno opengnsys -os.environ['OGETC'] = 'etc' #Pruebas locales -print (f"OGETC: {os.environ['OGETC']}") - -os.environ['PYTHONUNBUFFERED'] = '1' -print (f"PYTHONUNBUFFERED: {os.environ['PYTHONUNBUFFERED']}") - -#loadenviron_path = os.path.join(os.environ['OGETC'], 'preinit', 'loadenviron.sh') -loadenviron_path = os.path.join(os.environ['OGETC'], 'preinit', 'loadenviron.py') -print (f"loadenviron_path: {loadenviron_path}") -print ("s//////////////////////////////////////////////////") -# Ejecutar el script y cargar las variables de entorno en Python -exec(open(loadenviron_path).read()) - -# Configurar las variables de entorno globales -for key, value in globals().items(): - if isinstance(value, str): - os.environ[key] = value - -print ("Variables de entorno cargadas desde loadenviron.py") - -# Ejecutar un subproceso que utilizará las nuevas variables de entorno -################################################################################subprocess.run(['bash', '-c', 'env'], shell=True) -# Scripts de inicio -print ("step 2.1 >>>>>>>>>>>>>>>>>>>>>>>>>>") -scripts = ['fileslinks', 'loadmodules', 'metadevs', 'mountrepo', 'poweroff', 'otherservices'] -for script in scripts: - script_path = os.path.join(os.environ['OGETC'], 'preinit', f'{script}.py') - print (f"<<<<<< script_path: {script_path}") - #subprocess.run(['bash', script_path]) - subprocess.run(['python3', script_path]) - -print ("step 2.2 >>>>>>>>>>>>>>>>>>>>>>>>>>") -# Check and run the appropriate init script -init_scripts = [ - os.path.join(os.environ['OGETC'], 'init', f'{os.environ.get("IPV4ADDR", "")}.sh'), - os.path.join(os.environ['OGETC'], 'init', f'{os.environ.get("OGGROUP", "")}.sh'), - os.path.join(os.environ['OGETC'], 'init', 'default.sh') -] - -print ("step 2.3 >>>>>>>>>>>>>>>>>>>>>>>>>>") -for script in init_scripts: - if os.path.isfile(script): - subprocess.run(['bash', script]) - break -else: - print("No se ha encontrado script de inicio (RUN halt)") - #subprocess.run(['halt']) - -print("OpenGnsys Clonning Engine End.") -print("==============================================") diff --git a/client/etc/preinit/fileslinks.py b/client/etc/preinit/fileslinks.py deleted file mode 100644 index 527dfd8..0000000 --- a/client/etc/preinit/fileslinks.py +++ /dev/null @@ -1,74 +0,0 @@ -import os -import shutil -import stat - -# Si está configurado OpenGnsys ... -if os.getenv("OPENGNSYS"): - print(os.getenv("MSG_MAKELINKS", ".")) - - # Shell BASH por defecto (para usar "runtest") - try: - os.symlink('/bin/bash', '/bin/sh') - except FileExistsError: - pass - - # Crear directorio de bloqueos - os.makedirs('/var/lock', exist_ok=True) - if not os.path.exists('/var/lock'): - os.makedirs('/run/lock', exist_ok=True) - - # Crear ficheros temporales. - oglogcommand = os.getenv("OGLOGCOMMAND") - oglogsession = os.getenv("OGLOGSESSION") - temp_files = [oglogcommand, f"{oglogcommand}.tmp", oglogsession, "/tmp/menu.tmp"] - for temp_file in temp_files: - with open(temp_file, 'a'): - os.utime(temp_file, None) - os.chmod(temp_file, 0o777) -##################################################################################### -##### Pendiente instalar Qt5 en el sistema y crear enlaces simbólicos a las librerías - # Enlaces para Qt Embeded. ###################################################### - qtdir = "/usr/local" - os.makedirs(os.path.join(qtdir, 'etc'), exist_ok=True) - os.makedirs(os.path.join(qtdir, 'lib'), exist_ok=True) - os.makedirs(os.path.join(qtdir, 'plugins'), exist_ok=True) - - oglib = os.getenv("OGLIB") - for i in os.listdir(os.path.join(oglib, 'qtlib')) + [os.path.join(oglib, 'fonts')]: - src = os.path.join(oglib, 'qtlib', i) - dst = os.path.join(qtdir, 'lib', i) - if not os.path.exists(dst): - try: - os.symlink(src, dst) - except FileExistsError: - pass - - for i in os.listdir(os.path.join(oglib, 'qtplugins')): - src = os.path.join(oglib, 'qtplugins', i) - dst = os.path.join(qtdir, 'plugins', i) - if not os.path.exists(dst): - try: - os.symlink(src, dst) - except FileExistsError: - pass - - ogetc = os.getenv("OGETC") - for i in os.listdir(ogetc): - if i.endswith('.qmap'): - src = os.path.join(ogetc, i) - dst = os.path.join(qtdir, 'etc', i) - if not os.path.exists(dst): - try: - os.symlink(src, dst) - except FileExistsError: - pass - - # Autenticación con clave pública para SSH - if os.path.isfile('/scripts/ssl/authorized_keys'): - for file in os.listdir('/scripts/ssl'): - shutil.copy(os.path.join('/scripts/ssl', file), '/root/.ssh') - -else: - # FIXME Error: entorno de OpenGnsys no configurado. - print("Error: OpenGnsys environment is not configured.") # FIXME: definir mensaje. - exit(1) \ No newline at end of file diff --git a/client/etc/preinit/loadenviron.py b/client/etc/preinit/loadenviron.py deleted file mode 100644 index 6ea85b9..0000000 --- a/client/etc/preinit/loadenviron.py +++ /dev/null @@ -1,215 +0,0 @@ -import os -import subprocess -import sys - -sys.path.append('/opt/opengnsys/client/lib/engine/bin') -from NetLib import * - -print(f"##################+++++++++++++++ {sys.path} ++++++++++++++################3") -print(" ") -print("=============== path =================") -print("-- step 0") -print(sys.path) -#!/usr/bin/env python3 - -# Cargar API de funciones. -def execute_lib_file(filepath): - with open(filepath) as f: - code = compile(f.read(), filepath, 'exec') - exec(code, globals()) - -print("=============== START LOAD ENVIRONMENT =================") -# Idioma por defecto. -os.environ["LANG"] = os.getenv("LANG", "es_ES") - -print("-- step 2") -os.environ["LC_ALL"] = os.getenv("LC_ALL", os.environ["LANG"]) - -print("-- step 3") -result = subprocess.run(["locale-gen", os.environ["LANG"]], capture_output=True, text=True) -if result.returncode != 0: - print(f"Error generating locale: {result.stderr}") - -print("-- step 4") -print("-- step 5") - -# Directorios del proyecto OpenGnsys. -os.environ["OPENGNSYS"] = os.getenv("OPENGNSYS", "/opt/opengnsys") - -opengnsys_path = os.environ['OPENGNSYS'] -print(f"OPENGNSYS Directory: {opengnsys_path}") - -print("-- step 6") - -print (f"OPENGNSYS: {os.environ['OPENGNSYS']}") - -if os.path.isdir(os.environ["OPENGNSYS"]): - print("OPENGNSYS directory found") - os.environ["OGBIN"] = os.path.join(os.environ["OPENGNSYS"], "bin") - os.environ["OGETC"] = os.path.join(os.environ["OPENGNSYS"], "etc") - os.environ["OGLIB"] = os.path.join(os.environ["OPENGNSYS"], "lib") - os.environ["OGAPI"] = os.path.join(os.environ["OGLIB"], "engine", "bin") - os.environ["OGSCRIPTS"] = os.path.join(os.environ["OPENGNSYS"], "scripts") - os.environ["OGIMG"] = os.path.join(os.environ["OPENGNSYS"], "images") - os.environ["OGCAC"] = os.path.join(os.environ["OPENGNSYS"], "cache") - os.environ["OGLOG"] = os.path.join(os.environ["OPENGNSYS"], "log") - - os.environ["PATH"] = os.pathsep.join([ - os.environ["PATH"], - "/sbin", - "/usr/sbin", - "/usr/local/sbin", - "/bin", - "/usr/bin", - "/usr/local/bin", - "/opt/oglive/rootfs/opt/drbl/sbin", - os.environ["OGSCRIPTS"], - os.environ["OGAPI"], - os.environ["OGBIN"] - ]) - print("-- step 7") - # Exportar parámetros del kernel. - with open("/proc/cmdline") as f: - for i in f.read().split(): - if "=" in i: - key, value = i.split("=", 1) - os.environ[key] = value - - print("-- step 8") - # Cargar fichero de idioma. - lang_file = os.path.join(os.environ["OGETC"], f"lang.{os.environ['LANG'].split('@')[0]}.conf") - if os.path.isfile(lang_file): - with open(lang_file) as f: - for line in f: - if "=" in line: - key, value = line.strip().split("=", 1) - os.environ[key] = value - print("-- step 9") - # Mensaje de carga del entorno. - print(os.getenv("MSG_LOADAPI", ".")) - - print("-- step 10") - # Cargar mapa de teclado. - subprocess.run(["loadkeys", os.environ["LANG"].split("_")[0]], stdout=subprocess.DEVNULL) - - - print("-- step 10.1") - # Imprimir todas las variables de entorno declaradas hasta el momento. - for key, value in os.environ.items(): - print(f"{key}: {value}") - - - print("-- step 11") - for lib_file in os.listdir(os.environ["OGAPI"]): - if lib_file.endswith(".lib"): - execute_lib_file(os.path.join(os.environ["OGAPI"], lib_file)) - - - -# for lib_file in os.listdir(os.environ["OGAPI"]): -# if lib_file.endswith(".lib"): -# exec(open(os.path.join(os.environ["OGAPI"], lib_file)).read()) - - print("-- step 12") - # Cargar configuración del engine. - engine_cfg = os.path.join(os.environ["OGETC"], "engine.cfg") - if os.path.isfile(engine_cfg): - exec(open(engine_cfg).read()) - os.environ["OGLOGCOMMAND"] = os.getenv("OGLOGCOMMAND", "/tmp/command.log") - os.environ["OGLOGSESSION"] = os.getenv("OGLOGSESSION", "/tmp/session.log") - - - print("-- step 13") - # Cargar las APIs según engine. - ogengine = os.getenv("ogengine") - if ogengine: - for api_file in os.listdir(os.environ["OGAPI"]): - if api_file.endswith(f".{ogengine}"): - exec(open(os.path.join(os.environ["OGAPI"], api_file)).read()) - - print("-- step 14") - # Configuración de la red (modo offline). - initrd_cfg = "/tmp/initrd.cfg" - if os.path.isfile(initrd_cfg): - with open(initrd_cfg) as f: - for line in f: - if line.startswith("DEVICECFG="): - device_cfg = line.strip().split("=", 1)[1] - os.environ["DEVICECFG"] = device_cfg - if os.path.isfile(device_cfg): - exec(open(device_cfg).read()) - - print("-- step 15") - # FIXME Pruebas para grupos de ordenadores - os.environ["OGGROUP"] = os.getenv("group", "") - - print("-- step 16") - root_repo = os.getenv("ROOTREPO", os.getenv("OGSERVERIMAGES")) - - print(f"-- step 17",ogGetIpAddress()) - # Fichero de registros. - og_log_file = os.path.join(os.environ["OGLOG"], f"{ogGetIpAddress()}.log") - os.environ["OGLOGFILE"] = og_log_file -else: - print("ERROR: OPENGNSYS directory not found") - -print("-- step 18") -# Compatibilidad para usar proxy en clientes ogLive. -if not os.getenv("http_proxy") and os.getenv("ogproxy"): - os.environ["http_proxy"] = os.getenv("ogproxy") - -print("-- step 19") -# Compatibilidad para usar servidor DNS en clientes ogLive. -if not os.path.isfile("/run/resolvconf/resolv.conf") and os.getenv("ogdns"): - os.makedirs("/run/resolvconf", exist_ok=True) - with open("/run/resolvconf/resolv.conf", "w") as f: - f.write(f"nameserver {os.getenv('ogdns')}\n") - -print("-- step 20") -# Declaración de códigos de error. -error_codes = { - "OG_ERR_FORMAT": 1, - "OG_ERR_NOTFOUND": 2, - "OG_ERR_PARTITION": 3, - "OG_ERR_LOCKED": 4, - "OG_ERR_IMAGE": 5, - "OG_ERR_NOTOS": 6, - "OG_ERR_NOTEXEC": 7, - "OG_ERR_NOTWRITE": 14, - "OG_ERR_NOTCACHE": 15, - "OG_ERR_CACHESIZE": 16, - "OG_ERR_REDUCEFS": 17, - "OG_ERR_EXTENDFS": 18, - "OG_ERR_OUTOFLIMIT": 19, - "OG_ERR_FILESYS": 20, - "OG_ERR_CACHE": 21, - "OG_ERR_NOGPT": 22, - "OG_ERR_REPO": 23, - "OG_ERR_NOMSDOS": 24, - "OG_ERR_IMGSIZEPARTITION": 30, - "OG_ERR_UPDATECACHE": 31, - "OG_ERR_DONTFORMAT": 32, - "OG_ERR_IMAGEFILE": 33, - "OG_ERR_GENERIC": 40, - "OG_ERR_UCASTSYNTAXT": 50, - "OG_ERR_UCASTSENDPARTITION": 51, - "OG_ERR_UCASTSENDFILE": 52, - "OG_ERR_UCASTRECEIVERPARTITION": 53, - "OG_ERR_UCASTRECEIVERFILE": 54, - "OG_ERR_MCASTSYNTAXT": 55, - "OG_ERR_MCASTSENDFILE": 56, - "OG_ERR_MCASTRECEIVERFILE": 57, - "OG_ERR_MCASTSENDPARTITION": 58, - "OG_ERR_MCASTRECEIVERPARTITION": 59, - "OG_ERR_PROTOCOLJOINMASTER": 60, - "OG_ERR_DONTMOUNT_IMAGE": 70, - "OG_ERR_DONTSYNC_IMAGE": 71, - "OG_ERR_DONTUNMOUNT_IMAGE": 72, - "OG_ERR_NOTDIFFERENT": 73, - "OG_ERR_SYNCHRONIZING": 74, - "OG_ERR_NOTUEFI": 80, - "OG_ERR_NOTBIOS": 81 -} -print("-- step 20") -for key, value in error_codes.items(): - os.environ[key] = str(value) diff --git a/client/etc/preinit/loadmodules.py b/client/etc/preinit/loadmodules.py deleted file mode 100644 index bae5ec7..0000000 --- a/client/etc/preinit/loadmodules.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import glob - -""" -@file loadmodules.py -@brief Script de inicio para cargar módulos complementarios del kernel. -@version 1.0.5 - Cargar módulos específicos para el cliente. -""" - - -def main(): - msg_loadmodules = os.getenv('MSG_LOADMODULES', '.') - print(msg_loadmodules) - - # Módulo del ratón. - subprocess.run(['modprobe', 'psmouse'], stderr=subprocess.DEVNULL) - - # Cargar módulos específicos del kernel del cliente. - kernel_version = os.uname().release - module_path = os.path.join(os.getenv('OGLIB', ''), 'modules', kernel_version, '*.ko') - for module in glob.glob(module_path): - if os.access(module, os.R_OK): - subprocess.run(['insmod', module], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/client/etc/preinit/metadevs.py b/client/etc/preinit/metadevs.py deleted file mode 100644 index 3d433a6..0000000 --- a/client/etc/preinit/metadevs.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import subprocess -import sys - -#!/usr/bin/env python3 -""" -@file metadevs.py -@brief Script de inicio para detectar metadispositivos LVM y RAID. -@note Desglose del script "loadenviron.sh". -@warning License: GNU GPLv3+ -""" - -def main(): - opengnsys = os.getenv('OPENGNSYS') - print(f"____________________________________ OpenGnsys environment: {opengnsys}") - msg_detectlvmraid = os.getenv('MSG_DETECTLVMRAID', '') - - print(f"____________________________________ Message: {msg_detectlvmraid}") - - if opengnsys: - print(msg_detectlvmraid) - # Detectar metadispositivos LVM. - subprocess.run(['vgchange', '-ay'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - # Detectar metadispositivos RAID. - subprocess.run(['dmraid', '-ay'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - else: - # FIXME Error: entorno de OpenGnsys no configurado. - print("Error: OpenGnsys environment is not configured.") # FIXME: definir mensaje. - sys.exit(1) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/client/etc/preinit/mountrepo.py b/client/etc/preinit/mountrepo.py deleted file mode 100644 index 488c6ad..0000000 --- a/client/etc/preinit/mountrepo.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess - -#/** -# @file mountrepo.py -# @brief Script para montar el repositorio de datos remoto. -#*/ - -OGIMG = os.getenv('OGIMG', '/opt/opengnsys/images') -ROOTREPO = os.getenv('ROOTREPO', os.getenv('ROOTSERVER')) -ogactiveadmin = os.getenv('ogactiveadmin') -ogprotocol = os.getenv('ogprotocol', 'smb') -ogunit = os.getenv('ogunit', '') -ogstatus = os.getenv('ogstatus') -SERVER = os.getenv('SERVER') -OGCAC = os.getenv('OGCAC') -MSG_MOUNTREPO = "Mounting repository using protocol: {} in mode: {}" - -def mount_repo(): - if ogactiveadmin == "true": - os.environ['boot'] = 'admin' # ATENCIÓN: siempre en modo "admin". - subprocess.run(['umount', OGIMG], stderr=subprocess.DEVNULL) - - protocol = ogprotocol - OGUNIT = f"/{ogunit}" if ogunit else "" - print(MSG_MOUNTREPO.format(protocol, 'admin')) - - if protocol == 'nfs': - subprocess.run(['mount.nfs', f'{ROOTREPO}:{OGIMG}{OGUNIT}', OGIMG, '-o', 'rw,nolock']) - elif protocol == 'smb': - PASS = get_password() - subprocess.run(['mount.cifs', f'//{ROOTREPO}/ogimages{OGUNIT}', OGIMG, '-o', f'rw,serverino,acl,username=opengnsys,password={PASS}']) - elif protocol == 'local': - handle_local_mount() - -def get_password(): - try: - with open('/scripts/ogfunctions') as f: - for line in f: - if 'OPTIONS=' in line: - return line.split('pass=')[1].split()[0] - except Exception: - pass - return 'og' - -def handle_local_mount(): - if ogstatus == "offline" or not SERVER: - TYPE = subprocess.getoutput("blkid | grep REPO | awk -F'TYPE=' '{print $2}' | tr -d '\"'") - if not TYPE: - if os.path.isdir(f'{OGCAC}/{OGIMG}'): - subprocess.run(['mount', '--bind', f'{OGCAC}/{OGIMG}', OGIMG]) - else: - subprocess.run(['mount', '-t', TYPE, 'LABEL=REPO', OGIMG], stderr=subprocess.DEVNULL) - else: - if subprocess.run(['smbclient', '-L', SERVER, '-N'], stderr=subprocess.DEVNULL).returncode == 0: - PASS = get_password() - subprocess.run(['mount.cifs', f'//{ROOTREPO}/ogimages', OGIMG, '-o', f'rw,serverino,acl,username=opengnsys,password={PASS}']) - -if __name__ == "__main__": - mount_repo() \ No newline at end of file diff --git a/client/etc/preinit/otherservices.py b/client/etc/preinit/otherservices.py deleted file mode 100644 index 30f7a6d..0000000 --- a/client/etc/preinit/otherservices.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess - -""" -@file otherservices.py -@brief Script de inicio para cargar otros servicios complementarios. -""" - -# Lanzar servicios complementarios del cliente. -print(os.getenv('MSG_OTHERSERVICES', '.')) - -# Iniciar rsyslog, si es necesario. -if not os.path.exists('/dev/log'): - subprocess.run(['service', 'rsyslog', 'start']) - -# Adpatar la clave de "root" para acceso SSH. -with open('/scripts/ogfunctions', 'r') as file: - for line in file: - if 'OPTIONS=' in line: - pass_option = line.split('pass=')[1].split()[0] - break - else: - pass_option = 'og' - -passwd = pass_option or 'og' -subprocess.run(['passwd', 'root'], input=f'{passwd}\n{passwd}\n', text=True) - -# Cargar el entorno OpenGnsys en conexión SSH. -subprocess.run(['cp', '-a', f'{os.getenv("OPENGNSYS")}/etc/preinit/loadenviron.py', '/etc/profile.d/']) - -# Arrancar SSH. -subprocess.run(['/etc/init.d/ssh', 'start'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - -# Desactivado apagado de monitor. -# subprocess.run(['setterm', '-blank', '0', '-powersave', 'off', '-powerdown', '0'], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - -# Activado WOL en la interfaz usada en arranque PXE. -subprocess.run(['ethtool', '-s', os.getenv('DEVICE'), 'wol', 'g'], stderr=subprocess.DEVNULL) - -# TODO Localizar correctamente el script de arranque. -if os.path.isfile('/opt/opengnsys/scripts/runhttplog.sh'): - subprocess.run(['/opt/opengnsys/scripts/runhttplog.sh'], stderr=subprocess.DEVNULL) \ No newline at end of file diff --git a/client/etc/preinit/poweroff.py b/client/etc/preinit/poweroff.py deleted file mode 100644 index 8b372dd..0000000 --- a/client/etc/preinit/poweroff.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys - -""" -@file poweroff.py -@brief Script de inicio para cargar el proceso comprobación de clientes inactivos. -@note Arranca y configura el proceso "cron". -""" - -def main(): - opengnsys = os.getenv('OPENGNSYS') - if opengnsys: - msg_poweroffconf = os.getenv('MSG_POWEROFFCONF', '.') - print(msg_poweroffconf) - - ogntp = os.getenv('ogntp') - status = os.getenv('status') - - # Sincronización horaria con servidor NTP. - if ogntp and status != "offline": - subprocess.run(['ntpdate', ogntp]) - - # Crear fichero de configuración por defecto (30 min. de espera). - poweroff_conf = '/etc/poweroff.conf' - with open(poweroff_conf, 'w') as f: - f.write("POWEROFFSLEEP=30\nPOWEROFFTIME=\n") - - # Incluir zona horaria en el fichero de configuración. - with open('/proc/cmdline') as f: - cmdline = f.read() - tz = ' '.join([x for x in cmdline.split() if x.startswith('TZ=')]) - with open(poweroff_conf, 'a') as f: - f.write(tz + '\n') - - # Lanzar el proceso "cron". - subprocess.run(['cron', '-l']) - - # Definir la "crontab" lanzando el proceso de comprobación cada minuto. - ogbin = os.getenv('OGBIN') - crontab_line = f"* * * * * [ -x {ogbin}/poweroffconf ] && {ogbin}/poweroffconf\n" - subprocess.run(['crontab', '-'], input=crontab_line, text=True) - - else: - # FIXME Error: entorno de OpenGnsys no configurado. - print("Error: OpenGnsys environment is not configured.") # FIXME: definir mensaje. - sys.exit(1) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/client/interfaceAdm/GetConfiguration.py b/client/interfaceAdm/GetConfiguration.py deleted file mode 100755 index eabf97c..0000000 --- a/client/interfaceAdm/GetConfiguration.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python3 -import os -import subprocess -import sys -import FileSystemLib -import DiskLib - -os.environ["DEBUG"] = "no" - -# Obtener el número de serie y configuración inicial -ser = subprocess.getoutput("ogGetSerialNumber") -cfg = "" - -# Obtener el número de discos -disks = len(subprocess.getoutput("ogDiskToDev").split()) - - -for dsk in disk_list: - # Número de particiones - particiones = FileSystemLib.ogGetPartitionsNumber(dsk) or "0" - particiones = int(particiones) - - # Tipo de tabla de particiones - ptt = DiskLib.ogGetPartitionTableType(dsk) - ptt_mapping = {"MSDOS": 1, "GPT": 2, "LVM": 3, "ZPOOL": 4} - ptt = ptt_mapping.get(ptt, 0) - - # Información de disco (partición 0) - disk_size = DiskLib.ogGetDiskSize(dsk) - cfg += f"{dsk}:0:{ptt}:::{disk_size}:0;" - - # Recorrer particiones - for par in range(1, particiones + 1): - # Código del identificador de tipo de partición - cod = DiskLib.ogGetPartitionId(dsk, par) - - # Tipo del sistema de ficheros - fsi = FileSystemLib.getFsType(dsk, par) or "EMPTY" - - # Tamaño de la partición - tam = DiskLib.ogGetPartitionSize(dsk, par) or "0" - - # Sistema operativo instalado - soi = "" - uso = 0 - if fsi not in ["", "EMPTY", "LINUX-SWAP", "LINUX-LVM", "ZVOL"]: - mount_point = DiskLib.ogMount(dsk, par) - if mount_point: - # Obtener la versión del sistema operativo instalado - try: - # Asumiendo que getOsVersion es una función disponible - import OsLib # Debes tener OsLib.py disponible con la función getOsVersion - soi_output = OsLib.getOsVersion(dsk, par) - except ImportError: - # Si no está disponible, usar subprocess como alternativa - soi_output = subprocess.getoutput(f"getOsVersion {dsk} {par} 2>/dev/null") - - soi = soi_output.split(':')[1] if ':' in soi_output else '' - # Hacer un segundo intento para algunos casos especiales - if not soi: - soi_output = subprocess.getoutput(f"getOsVersion {dsk} {par} 2>/dev/null") - soi = soi_output.split(':')[1] if ':' in soi_output else '' - - # Sistema de archivos para datos (sistema operativo "DATA") - if not soi and fsi not in ["EMPTY", "CACHE"]: - soi = "DATA" - - # Obtener porcentaje de uso - mount_point = DiskLib.ogGetMountPoint(dsk, par) - df_output = subprocess.getoutput(f"df {mount_point}") - lines = df_output.splitlines() - if len(lines) >= 2: - uso_str = lines[1].split()[4] # Esta debería ser la quinta columna - if uso_str.endswith('%'): - uso = int(uso_str.rstrip('%')) - else: - uso = int(uso_str) - else: - uso = 0 - else: - soi = "" - uso = 0 - else: - soi = "" - uso = 0 - - cfg += f"{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};" - -# Configuración por defecto para cliente sin disco -if not cfg: - cfg = "1:0:0:::0;" - -# Guardar salida en fichero temporal -cfgfile = "/tmp/getconfig" -with open(cfgfile, 'w') as f: - f.write(f"{ser + ';' if ser else ''}{cfg}") - -# Crear el menú por defecto desde el archivo generado -subprocess.run(["generateMenuDefault"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - -# Componer salida formateada -formatted_output = [] -with open(cfgfile, 'r') as f: - content = f.read().strip().split(";") - for item in content: - fields = item.split(":") - if len(fields) == 1: - formatted_output.append(f"ser={fields[0]}") - else: - formatted_output.append( - f"disk={fields[0]}\tpar={fields[1]}\tcpt={fields[2]}\tfsi={fields[3]}\tsoi={fields[4]}\ttam={fields[5]}\tuso={fields[6]}" - ) - -# Mostrar la salida formateada -print("\n".join(formatted_output)) - -# Borrar marcas de arranque de Windows -subprocess.run(["rm", "-f", "/mnt/*/ogboot.*", "/mnt/*/*/ogboot.*"]) - -# Volver a registrar los errores -os.environ.pop("DEBUG", None) diff --git a/client/lib/engine/bin/__init__.py b/client/lib/engine/bin/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/client/shared/scripts/__init__.py b/client/shared/scripts/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..62d1fb4 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,6 @@ +ogclient (0.1.0-1) stable; urgency=medium + + * First debian package for the client files + + -- OpenGnsys developers Thu, 26 Feb 2025 13:22:29 +0100 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +10 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..61875ca --- /dev/null +++ b/debian/control @@ -0,0 +1,16 @@ +Source: ogclient +Section: admin +Priority: optional +Maintainer: OpenGnsys developers +Build-Depends: debhelper (>= 7), po-debconf +Standards-Version: 3.9.2 +Homepage: https://opengnsys.es/ + +Package: ogclient +Section: admin +Priority: optional +Architecture: all +Depends: + samba, ucf, python3 (>=3.4) | python (>= 3.4), ${misc:Depends}, ${shlibs:Depends} +Description: OpenGnsys client files + This package provides the basic filesystem for clients. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..d1862d9 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,26 @@ +Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135 +Name: ogclient +Maintainer: OpenGnsys developers +Source: https://opengnsys.es + +Copyright: 2014 Virtual Cable S.L.U. +License: BSD-3-clause + +License: GPL-2+ +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 2 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, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +. +On Debian systems, the full text of the GNU General Public +License version 2 can be found in the file +`/usr/share/common-licenses/GPL-2'. diff --git a/debian/ogclient.dirs b/debian/ogclient.dirs new file mode 100644 index 0000000..97faff4 --- /dev/null +++ b/debian/ogclient.dirs @@ -0,0 +1,4 @@ +opt/opengnsys/ogclient_log +opt/opengnsys/ogclient/images +opt/opengnsys/ogclient/cache +opt/opengnsys/ogclient/log diff --git a/debian/ogclient.install b/debian/ogclient.install new file mode 100644 index 0000000..99eb7e9 --- /dev/null +++ b/debian/ogclient.install @@ -0,0 +1,2 @@ +ogclient opt/opengnsys/ +etc/samba/smb-ogclient.conf etc/samba/ diff --git a/debian/ogclient.postinst b/debian/ogclient.postinst new file mode 100644 index 0000000..e99fef5 --- /dev/null +++ b/debian/ogclient.postinst @@ -0,0 +1,53 @@ +#!/bin/sh + +set -e +case "$1" in + configure) + # Create a temporary file with the modified configuration + SMB_CONF="/etc/samba/smb-ogclient.conf" + OLD_FILE="/etc/samba/smb.conf" + NEW_FILE=$(mktemp) + + # Ensure the template file exists + if [ ! -f "$SMB_CONF" ]; then + echo "Config file missing!" + exit 1 + fi + + # Check if our share section already exists + if grep -q "include = /etc/samba/smb-ogclient.conf" "$OLD_FILE"; then + # Section already exists, do nothing + rm -f "$NEW_FILE" + else + # Copy the original file + cp -a "$OLD_FILE" "$NEW_FILE" + + # Append our configuration + echo "include = /etc/samba/smb-ogclient.conf" >> "$NEW_FILE" + + # Use ucf to handle the file update + ucf --debconf-ok "$NEW_FILE" "$OLD_FILE" + + # Clean up + rm -f "$NEW_FILE" + + # Reload Samba + if command -v systemctl >/dev/null 2>&1; then + systemctl reload smbd.service + else + service smbd reload || true + fi + fi + ;; + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/debian/ogclient.postrm b/debian/ogclient.postrm new file mode 100644 index 0000000..91878e6 --- /dev/null +++ b/debian/ogclient.postrm @@ -0,0 +1,26 @@ +#!/bin/sh -e + +set -e + +if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then + # Create a temporary file with the configuration without our share + OLD_FILE="/etc/samba/smb.conf" + NEW_FILE=$(mktemp) + + # Remove our share section from the file + grep -v "include = /etc/samba/smb-ogclient.conf" "$OLD_FILE" > "$NEW_FILE" + + # Use ucf to update the file + ucf --debconf-ok "$NEW_FILE" "$OLD_FILE" + ucf --purge "$OLD_FILE" + + # Clean up + rm -f "$NEW_FILE" + + # Reload Samba + if command -v systemctl >/dev/null 2>&1; then + systemctl reload smbd.service + else + service smbd reload || true + fi +fi diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..2d33f6a --- /dev/null +++ b/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f + +%: + dh $@ diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..9f67427 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) \ No newline at end of file diff --git a/etc/samba/smb-ogclient.conf b/etc/samba/smb-ogclient.conf new file mode 100644 index 0000000..a7c3422 --- /dev/null +++ b/etc/samba/smb-ogclient.conf @@ -0,0 +1,15 @@ +[ogclient] + comment = OpenGnsys Client + browseable = no + writeable = no + locking = no + path = /opt/opengnsys/ogclient + guest ok = no + +[oglog] + comment = OpenGnsys Log + browseable = no + writeable = yes + locking = no + path = /opt/opengnsys/ogclient_log + guest ok = no diff --git a/ogclient/LICENSE.en.txt b/ogclient/LICENSE.en.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/ogclient/LICENSE.en.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ogclient/README.es.txt b/ogclient/README.es.txt new file mode 100644 index 0000000..374bf3c --- /dev/null +++ b/ogclient/README.es.txt @@ -0,0 +1,23 @@ +OpenGnsys Client README +======================== + +Este directorio contiene la estructura principal de datos que será +importada por los clientes OpenGnsys mediante Samba. + +Los subdirectorios se copian íntegramente al servidor bajo +/opt/opengnsys/client y serán importados por los clientes en +/opt/opengnsys. + +La estructura de datos es la siguiente: + +- bin scripts o binarios ejecutables por el cliente (compilados estáticamente). +- etc ficheros de configuración del cliente. +- interfaceAdm interface con el agente +- lib librerías de funciones. + - engine/bin ficheros con las funciones del motor de clonación. + - httpd ficheros de configuración del servicio lighttpd. + - modules módulos extra para el Kernel del cliente. + - qtlib librerías Qt complementarias del Browser. + - qtplugins plugins Qt para el Browser. +- scripts funciones de alto nivel ejecutables por OpenGnsys Browser + y OpenGnsys Admin. diff --git a/ogclient/bin/EACInterfaces b/ogclient/bin/EACInterfaces new file mode 100755 index 0000000..b63b1db Binary files /dev/null and b/ogclient/bin/EACInterfaces differ diff --git a/ogclient/bin/browser b/ogclient/bin/browser new file mode 100755 index 0000000..54663a5 Binary files /dev/null and b/ogclient/bin/browser differ diff --git a/ogclient/bin/grub-probe1.99_i686 b/ogclient/bin/grub-probe1.99_i686 new file mode 100755 index 0000000..21659ef Binary files /dev/null and b/ogclient/bin/grub-probe1.99_i686 differ diff --git a/ogclient/bin/grub-probe1.99_x86_64 b/ogclient/bin/grub-probe1.99_x86_64 new file mode 100755 index 0000000..b62e88f Binary files /dev/null and b/ogclient/bin/grub-probe1.99_x86_64 differ diff --git a/ogclient/bin/poweroffconf b/ogclient/bin/poweroffconf new file mode 100755 index 0000000..de6726b --- /dev/null +++ b/ogclient/bin/poweroffconf @@ -0,0 +1,82 @@ +#!/bin/bash +#/** +#@file poweroffconf +#@brief Control de parada tras tiempo de inactividad para ahorro de energía. +#@license GNU GPLv3+ +#@param int_minutos Minutos de inactividad (opcional); "no" para deshabilitar.. +#@note La comprobación periódica debe ejecutarse en el "cron" del sistema. +#@note Fichero de configuración: /etc/poweroff.conf +#@author Ramón Gómez - Univ. Sevilla +#@date 2011-10-25 +#@version 1.0.5: incluir opción para deshabilitar ahorro de energía. +#@author Ramón Gómez - Univ. Sevilla +#@date 2014-02-07 +#@version 1.1.1: Corregir problema al cambiar de día +#@author Ramón Gómez - Univ. Sevilla +#@date 2018-07-04 +#*/ + + +# Variables generales. +OPENGNSYS=${OPENGNSYS:-/opt/opengnsys} # Instalación de OpenGnsys +OGETC=${OGETC:-$OPENGNSYS/etc} # Configuración de OpenGnsys +POWEROFFCONF=/etc/poweroff.conf # Configuración del script + +# Error si no existe el fichero de configuración de ahorro de energía. +if [ ! -f $POWEROFFCONF ]; then + ogRaiseError $OG_ERR_NOTFOUND "$POWEROFFCONF" + exit $? +fi +# Obtener parámetros de configuración de ahorro de energía. +source $POWEROFFCONF +export TZ + +case $# in + 0) # Sin parámetros, comprobar que existe la variable POWEROFFSLEEP. + if [ -z "$POWEROFFSLEEP" ]; then + ogRaiseError $OG_ERR_FORMAT "Sin tiempo de espera." + exit $? + fi + ;; + 1) # Nuevo timepo de espera. + POWEROFFSLEEP="$1" + # Se deshabilita si se introduce la cadena "no" como tiempo de espera. + [ "$POWEROFFSLEEP" == "no" ] && POWEROFFSLEEP= + # Error si tiempo de espera no es nulo o entero positivo. + if [[ ! "$POWEROFFSLEEP" =~ ^[0-9]*$ ]]; then + ogRaiseError $OG_ERR_FORMAT "Parámetro debe ser núm. minutos o \"no\" para deshabilitar." + exit $? + fi + # Actualizar fichero de configuración con nuevo periodo de parada. + perl -pi -e "s/POWEROFFSLEEP=.*/POWEROFFSLEEP=$POWEROFFSLEEP/" $POWEROFFCONF + # Si se necesita, recalcular tiempo de parada. + if [ -n "POWEROFFTIME" ]; then + # Asignar tiempo de apagado si no está deshabilitado y actualizar fichero. + POWEROFFTIME=${POWEROFFSLEEP:+$(date --date="$POWEROFFSLEEP min" +"%s")} + perl -pi -e "s/POWEROFFTIME=.*/POWEROFFTIME=$POWEROFFTIME/" $POWEROFFCONF + fi + exit 0 ;; + *) # Error de formato de ejecución. + ogRaiseError $OG_ERR_FORMAT "Formato: $0 [int_minutos | no]" + exit $? ;; +esac +# Comprobar si hay algún script en ejecución (verificando compatibilidad de "pgrep"). +[ -n "$(pgrep -fa 2>&1 | grep "invalid")" ] && PGREP="pgrep -fl" || PGREP="pgrep -fa" +if [ -n "$($PGREP $OPENGNSYS | egrep -v "$OGETC|$0")" ]; then + # Eliminar tiempo de inicio de espera, si se está ejecutando operación. + perl -pi -e 's/POWEROFFTIME=.*$/POWEROFFTIME=/' $POWEROFFCONF +else + # Si el sistema está en estado de espera, ... + NOW=$(date +"%s") + if [ -z "$POWEROFFTIME" ]; then + # Asignar tiempo de inicio, si no estaba definido. + POWEROFFTIME=$(date --date="$POWEROFFSLEEP min" +"%s") + perl -pi -e "s/POWEROFFTIME=.*$/POWEROFFTIME=$POWEROFFTIME/" $POWEROFFCONF + else + # Apagar el equipo si se sobrepasa el periodo de espera. + if [ $NOW -ge $POWEROFFTIME ]; then + $OPENGNSYS/scripts/poweroff + fi + fi +fi + diff --git a/ogclient/bin/rsync-31 b/ogclient/bin/rsync-31 new file mode 100755 index 0000000..366204f Binary files /dev/null and b/ogclient/bin/rsync-31 differ diff --git a/ogclient/bin/runtest b/ogclient/bin/runtest new file mode 100755 index 0000000..b18778c --- /dev/null +++ b/ogclient/bin/runtest @@ -0,0 +1,246 @@ +#!/usr/bin/env python +from __future__ import print_function + +import os +import subprocess +import doctest +import re + +FIRST_SCRIPT = 'prepare' +LAST_SCRIPT = 'cleanup' + +PRE_EXTENSION = '.pre' +POST_EXTENSION = '.post' + +PYTHON_TEST_EXTENSION = '.pytest' +BASH_TEST_EXTENSION = '.shtest' + + +class RunTest: + '''Runs the tests''' + + def __init__(self): + self.path = os.path.abspath('.') + + # Only no-hide files + self.all_files = [filename for filename in os.listdir(self.path) + if filename[0] != '.' and os.path.isfile(filename)] + + self.all_files = sorted(self.all_files) + + self.python_tests = [] + self.bash_tests = [] + self.script_tests = [] + self.first_script = '' + self.last_script = '' + self.pre_scripts = [] + self.post_scripts = [] + + for filename in self.all_files: + if filename.endswith(PYTHON_TEST_EXTENSION): + self.python_tests.append(filename) + + elif filename.endswith(BASH_TEST_EXTENSION): + self.bash_tests.append(filename) + + elif os.access(filename, os.X_OK): + basename, extension = os.path.splitext(filename) + if basename == FIRST_SCRIPT: + if self.first_script: + raise MoreThanOneFirstScript() + self.first_script = filename + elif basename == LAST_SCRIPT: + if self.last_script: + raise MoreThanOneLastScript() + self.last_script = filename + elif extension == PRE_EXTENSION: + self.pre_scripts.append(filename) + elif extension == POST_EXTENSION: + self.post_scripts.append(filename) + else: + self.script_tests.append(filename) + + self.fails = 0 + + def run_script(self, script): + '''Run a script test''' + path_script = os.path.join(self.path, script) + proc = subprocess.Popen((path_script), shell=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + return_value = proc.wait() + if return_value != 0: + self.fails += 1 + stdout, stderr = proc.communicate() + print("*******************************************************") + print("Error %d in %s:" % (return_value, script)) + print(stdout.decode(), end='') + print(stderr.decode(), end='') + + return return_value + + def run_bash_test(self, script): + '''Run bash test''' + #import pdb; pdb.set_trace() + path_script = os.path.join(self.path, script) + errors = 0 + test_no = 0 + + for command, result, line in read_bash_tests(path_script): + test_no += 1 + try: + proc = subprocess.Popen(('/bin/bash', '-c', command), + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + except OSError as exc: + print('File "%s" line %d:' % (script, line)) + print('Failed example:') + print(' ' + command) + print("Exception was raised:") + print(" ", end="") + print(exc) + print("*******************************************************") + errors += 1 + + else: + if result != stdout.decode(): + print('File "%s" line %d:' % (script, line)) + print('Failed example:') + print(' ' + command) + print("Expected:") + for l in result.split('\n')[:-1]: + print(' ' + l) + print("Got:") + for l in stdout.decode().split('\n')[:-1]: + print(' ' + l) + errors += 1 + print("*******************************************************") + + if errors != 0: + print("%d items had failures:" % errors) + print(" %d of %d in %s" % (errors, test_no, script)) + print("***Test failed***") + else: + print("%3d tests PASSED in %s" % (test_no, script)) + + return errors + + + def run_pre_test(self, test): + '''Run the pre-test of a test''' + pre_test = test + PRE_EXTENSION + return_value = 0 + if pre_test in self.pre_scripts: + return_value = self.run_script(pre_test) + if return_value: + print("No running: %s %s" % (test, test + POST_EXTENSION)) + + return return_value + + def run_post_test(self, test): + '''Run the post-test of a test''' + post_test = test + POST_EXTENSION + if post_test in self.post_scripts: + return self.run_script(post_test) + + def run_tests(self): + '''Run the tests in the correct order''' + if self.first_script: + if self.run_script(self.first_script) != 0: + print('*Error in prepare script. Aborting.*') + return self.show_errors() + + all_tests = sorted(self.script_tests + self.python_tests + self.bash_tests) + for test in all_tests: + if self.run_pre_test(test) != 0: + continue + + if test in self.script_tests: + self.run_script(test) + elif test in self.bash_tests: + fails = self.run_bash_test(test) + self.fails += fails + elif test in self.python_tests: + fails, n_tests = doctest.testfile(test, module_relative=False) + self.fails += fails + + self.run_post_test(test) + + if self.last_script: + self.run_script(self.last_script) + + return self.show_errors() + + def show_errors(self): + '''Show the total errors''' + if self.fails: + print("*******************************************************") + print("Total errors: %d" % self.fails) + + return self.fails + +class MoreThanOneFirstScript(Exception): + def __init__(self): + super(MoreThanOneFirstScript, self).__init__( + "More than one %s script" % FIRST_SCRIPT) + +class MoreThanOneLastScript(Exception): + def __init__(self): + super(MoreThanOneLastScript, self).__init__( + "More than one %s script" % LAST_SCRIPT) + + +def read_bash_tests(file_name): + '''Iterator that yields the found tests''' + fd = open(file_name) + command = '' + result = '' + tests = [] + line_no = 0 + command_line = 0 + command_re = re.compile("^\$ (.*)\n") + + for line in fd.readlines(): + line_no += 1 + + match = command_re.match(line) + if match: + # Is it a command? + if command: + # If it is a command but we have a previous command to send + yield (command, result, command_line) + result = '' + + command = match.group(1) + command_line = line_no + + elif command: + # If not a command but we have a previous command + if line != "\n": + # It's a part of the result + if line == "\n": + result += '\n' + else: + result += line + + else: + # Or it's the end of the result, yielding + + yield (command, result, command_line) + command = '' + result = '' + + + else: + # This line is a comment + pass + + if command: + # Cheking if the last command was sent + yield (command, result, command_line) + + fd.close() + + +if __name__ == "__main__": + r = RunTest() + r.run_tests() diff --git a/ogclient/etc/engine.cfg b/ogclient/etc/engine.cfg new file mode 100644 index 0000000..5e19664 --- /dev/null +++ b/ogclient/etc/engine.cfg @@ -0,0 +1,56 @@ +## Definicion general +set -a +OGENGINECONFIGURATE="TRUE" +OGLOGSESSION="/tmp/session.log" +OGLOGCOMMAND="/tmp/command.log" + +##Configuracion de la PostConfiguracion OS WIndows +#Hacer chkdisk tras la clonacion +OGWINCHKDISK=TRUE + +#Configuracion de interface restauracion +#Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ] +ACTIONCACHEFULL=NONE +#Que protocolo de restauracion usar en el caso de que no exista cache o no exista espacio sufiente. [NONE | UNICAST | MULTICAST].NONE retorna error +RESTOREPROTOCOLNOTCACHE=NONE + +#script Creacion imagen +IMGPROG="partclone" +IMGCOMP="lzop" +IMGEXT="img" +IMGREDUCE="TRUE" + +#Configuracion del asistente de Clonacion remota usando master +#Al enviar particion reducir el sistema de archivos previamente. +OGWINREDUCE=TRUE + +# Sesion MULTICAST de cliente +#timeout (segundos) para abortar la sesion de multicast si no contacta con el servidor de multicast. Valor asignado a 0, utiliza los valores por defecto de udp-cast +MCASTERRORSESSION=120 +# timeout (segundos) para abortar la la transferencia si se interrumpe. Valor asignado a 0, utiliza los valores por defecto de udp-cast +MCASTWAIT=30 + +# Imagenes sincronizadas +# Factor para calcular el time-out al crear la imagen. 100000k -> 4s +CREATESPEED=100000*4 +# Factor de compresion para las imagenes (windos en ext4). +FACTORSYNC=120 +# Realizar copia de seguridad antes de crear la imagen. +BACKUP=false +# Sistema de archivo de la imagenes sincronizadas. EXT4 o BTRFS +IMGFS=EXT4 + +# Tiempo de sleep antes de realizar el reboot +OGSLEEP="4" + +# La variable INSTALLOSCLIENT no se utiliza en OpenGnsys 1.1.0. + +# Funciones que no deben mostrar salida de avisos si son llamadas por otras funciones. +NODEBUGFUNCTIONS="ogCreateImageSyntax ogGetHivePath ogGetOsType ogRestoreImageSyntax ogUnmountAll ogUnmountCache" + +# Velocidad de comunicación por defecto (muestra aviso en Browser si no se cumple): +# "", no usar esta característica. +# "100Mb/s", Fast Ethernet. +# "1000Mb/s", Gigabit Ethernet. +DEFAULTSPEED="" + diff --git a/ogclient/etc/engine.json b/ogclient/etc/engine.json new file mode 100644 index 0000000..7d9e75f --- /dev/null +++ b/ogclient/etc/engine.json @@ -0,0 +1,804 @@ +{ + "variables": [ + { + "description": "applying engine configuration (boolean)", + "name": "OGENGINECONFIGURATE", + "value": true + }, + { + "description": "session log file (path)", + "name": "OGLOGSESSION", + "value": "/tmp/session.log" + }, + { + "description": "command log file (path)", + "name": "OGLOGCOMMAND", + "value": "/tmp/command.log" + }, + { + "description": "image clonation program (string)", + "name": "IMGPROG", + "value": "partclone" + }, + { + "description": "image compresson (string)", + "name": "IMGCOMP", + "value": "lzop" + }, + { + "description": "filesystem image extension (string)", + "name": "IMGEXT", + "value": "img" + }, + { + "description": "disk image extension (string)", + "name": "DISKIMGEXT", + "value": "dsk" + }, + { + "description": "trying to reduce image (boolean)", + "name": "IMGREDUCE", + "value": true + }, + { + "description": "trying to reduce Windows filesystem before creating image (boolean)", + "name": "OGWINREDUCE", + "value": true + }, + { + "description": "time to sleep before reboot (seconds)", + "name": "OGSLEEP", + "value": 20 + }, + { + "description": "do not show warnings in this functions (list of functions)", + "name": "NODEBUGFUNCTIONS", + "value": "ogCreateImageSyntax ogGetHivePath ogGetOsType ogRestoreImageSyntax ogUnmountAll ogUnmountCache" + }, + { + "description": "action to take if cache is full (NONE; FORMAT)", + "name": "ACTIONCACHEFULL", + "value": "NONE" + }, + { + "description": "restoration protocol if cache is full or it does not exists (NONE, returns error; UNICAST; MULTICAST)", + "name": "RESTOREPROTOCOLNOTCACHE", + "value": "UNICAST" + }, + { + "description": "timout if Multicast transfer does not begins (seconds)", + "name": "MCASTERRORSESSION", + "value": 120 + }, + { + "description": "timout if Multicast transfer does it's interrupted (seconds)", + "name": "MCASTWAIT", + "value": 30 + }, + { + "description": "run CHKDSK after Windows depolying (boolean)", + "name": "OGWINCHKDISK", + "value": true + }, + { + "description": "timeout factor creating synchronized image (integer, 100000k => 4s)", + "name": "CREATESPEED", + "value": 400000 + }, + { + "description": "compression factor creating synchronized image (integer)", + "name": "FACTORSYNC", + "value": 120 + }, + { + "description": "make backup before creating synchronized image (boolean)", + "name": "BACKUP", + "value": false + }, + { + "description": "filesystem type creating synchronized image (string)", + "name": "IMGFS", + "value": "EXT4" + }, + { + "description": "default communication speed (blank, do not use; 100Mb/s; 1000Mb/s)", + "name": "DEFAULTSPEED", + "value": "" + } + ], + "errors": [ + { + "id": 1, + "description": "format error", + "name": "OG_ERR_FORMAT" + }, + { + "id": 2, + "description": "resource not found", + "name": "OG_ERR_NOTFOUND" + }, + { + "id": 3, + "description": "partition error", + "name": "OG_ERR_PARTITION" + }, + { + "id": 4, + "description": "resource locked", + "name": "OG_ERR_LOCKED" + }, + { + "id": 5, + "description": "image error", + "name": "OG_ERR_IMAGE" + }, + { + "id": 6, + "description": "operating system not detected", + "name": "OG_ERR_NOTOS" + }, + { + "id": 7, + "description": "program or function not executable", + "name": "OG_ERR_NOTEXEC" + }, + { + "id": 14, + "description": "cannot write", + "name": "OG_ERR_NOTWRITE" + }, + { + "id": 15, + "description": "cache filesystem does not exists", + "name": "OG_ERR_NOTCACHE" + }, + { + "id": 16, + "description": "cache filesystem is full", + "name": "OG_ERR_CACHESIZE" + }, + { + "id": 17, + "description": "error reducing filesystem", + "name": "OG_ERR_REDUCEFS" + }, + { + "id": 18, + "description": "error extending filesystem", + "name": "OG_ERR_EXTENDFS" + }, + { + "id": 19, + "description": "value out of limit", + "name": "OG_ERR_OUTOFLIMIT" + }, + { + "id": 20, + "description": "filesystem error", + "name": "OG_ERR_FILESYS" + }, + { + "id": 21, + "description": "cache error", + "name": "OG_ERR_CACHE" + }, + { + "id": 22, + "description": "no GPT partition table", + "name": "OG_ERR_NOGPT" + }, + { + "id": 23, + "description": "cannot mount repository", + "name": "OG_ERR_REPO" + }, + { + "id": 30, + "description": "trying to restore an image into an smaller partition", + "name": "OG_ERR_IMGSIZEPARTITION" + }, + { + "id": 31, + "description": "error updating cache", + "name": "OG_ERR_UPDATECACHE" + }, + { + "id": 32, + "description": "formatting error", + "name": "OG_ERR_DONTFORMAT" + }, + { + "id": 40, + "description": "unknown error", + "name": "OG_ERR_GENERIC" + }, + { + "id": 50, + "description": "error preparing Unicast syntax", + "name": "OG_ERR_UCASTSYNTAXT" + }, + { + "id": 51, + "description": "error sending partition using Unicast protocol", + "name": "OG_ERR_UCASTSENDPARTITION" + }, + { + "id": 52, + "description": "error sending file using Unicast protocol", + "name": "OG_ERR_UCASTSENDFILE" + }, + { + "id": 52, + "description": "error receiving partition using Unicast protocol", + "name": "OG_ERR_UCASTRECEIVERPARTITION" + }, + { + "id": 53, + "description": "error receiving file using Unicast protocol", + "name": "OG_ERR_UCASTRECEIVERFILE" + }, + { + "id": 55, + "description": "error preparing Multicast syntax", + "name": "OG_ERR_MCASTSYNTAXT" + }, + { + "id": 56, + "description": "error sending file using Multicast protocol", + "name": "OG_ERR_MCASTSENDFILE" + }, + { + "id": 57, + "description": "error receiving file using Multicast protocol", + "name": "OG_ERR_MCASTRECEIVERFILE" + }, + { + "id": 58, + "description": "error sending partition using Multicast protocol", + "name": "OG_ERR_MCASTSENDPARTITION" + }, + { + "id": 59, + "description": "error receiving partition using Multicast protocol", + "name": "OG_ERR_MCASTRECEIVERPARTITION" + }, + { + "id": 60, + "description": "error connecting master node", + "name": "OG_ERR_PROTOCOLJOINMASTER" + }, + { + "id": 70, + "description": "cannot mount a syncrhronized image", + "name": "OG_ERR_DONTMOUNT_IMAGE" + }, + { + "id": 71, + "description": "it's not a syncrhronized image", + "name": "OG_ERR_DONTSYNC_IMAGE" + }, + { + "id": 72, + "description": "cannot unmount a syncrhronized image", + "name": "OG_ERR_DONTUNMOUNT_IMAGE" + }, + { + "id": 73, + "description": "there are no differences between basic image and filesystem", + "name": "OG_ERR_NOTDIFFERENT" + }, + { + "id": 74, + "description": "synchronization error", + "name": "OG_ERR_SYNCHRONIZING" + } + ], + "disks": [ + { + "type": "DISK" + }, + { + "type": "USB" + }, + { + "type": "CDROM" + }, + { + "type": "RAID" + }, + { + "type": "MAPPER" + } + ], + "partitiontables": [ + { + "id": 1, + "type": "MSDOS", + "partitions": [ + { + "id": "0", + "type": "EMPTY", + "clonable": false + }, + { + "id": "1", + "type": "FAT12", + "clonable": true + }, + { + "id": "5", + "type": "EXTENDED", + "clonable": false + }, + { + "id": "6", + "type": "FAT16", + "clonable": true + }, + { + "id": "7", + "type": "NTFS", + "clonable": true + }, + { + "id": "b", + "type": "FAT32", + "clonable": true + }, + { + "id": "11", + "type": "HFAT12", + "clonable": true + }, + { + "id": "16", + "type": "HFAT16", + "clonable": true + }, + { + "id": "17", + "type": "HNTFS", + "clonable": true + }, + { + "id": "1b", + "type": "HFAT32", + "clonable": true + }, + { + "id": "27", + "type": "HNTFS-WINRE", + "clonable": true + }, + { + "id": "82", + "type": "LINUX-SWAP", + "clonable": false + }, + { + "id": "83", + "type": "LINUX", + "clonable": true + }, + { + "id": "8e", + "type": "LINUX-LVM", + "clonable": true + }, + { + "id": "a5", + "type": "FREEBSD", + "clonable": true + }, + { + "id": "a6", + "type": "OPENBSD", + "clonable": true + }, + { + "id": "a9", + "type": "NETBSD", + "clonable": true + }, + { + "id": "af", + "type": "HFS", + "clonable": true + }, + { + "id": "be", + "type": "SOLARIS-BOOT", + "clonable": true + }, + { + "id": "bf", + "type": "SOLARIS", + "clonable": true + }, + { + "id": "ca", + "type": "CACHE", + "clonable": false + }, + { + "id": "da", + "type": "DATA", + "clonable": true + }, + { + "id": "ee", + "type": "GPT", + "clonable": false + }, + { + "id": "ef", + "type": "EFI", + "clonable": true + }, + { + "id": "fb", + "type": "VMFS", + "clonable": true + }, + { + "id": "fd", + "type": "LINUX-RAID", + "clonable": true + } + ] + }, + { + "id": 2, + "type": "GPT", + "partitions": [ + { + "id": "700", + "type": "WINDOWS", + "clonable": true + }, + { + "id": "c01", + "type": "WIN-RESERV", + "clonable": true + }, + { + "id": "2700", + "type": "WIN-RECOV", + "clonable": true + }, + { + "id": "7f00", + "type": "CHROMEOS-KRN", + "clonable": true + }, + { + "id": "7f01", + "type": "CHROMEOS", + "clonable": true + }, + { + "id": "7f02", + "type": "CHROMEOS-RESERV", + "clonable": true + }, + { + "id": "8200", + "type": "LINUX-SWAP", + "clonable": false + }, + { + "id": "8300", + "type": "LINUX", + "clonable": true + }, + { + "id": "8301", + "type": "LINUX-RESERV", + "clonable": true + }, + { + "id": "8302", + "type": "LINUX", + "clonable": true + }, + { + "id": "8e00", + "type": "LINUX-LVM", + "clonable": true + }, + { + "id": "a500", + "type": "FREEBSD-DISK", + "clonable": false + }, + { + "id": "a501", + "type": "FREEBSD-BOOT", + "clonable": true + }, + { + "id": "a502", + "type": "FREEBSD-SWAP", + "clonable": false + }, + { + "id": "a503", + "type": "FREEBSD", + "clonable": true + }, + { + "id": "a504", + "type": "FREEBSD", + "clonable": true + }, + { + "id": "a901", + "type": "NETBSD-SWAP", + "clonable": false + }, + { + "id": "a902", + "type": "NETBSD", + "clonable": true + }, + { + "id": "a903", + "type": "NETBSD", + "clonable": true + }, + { + "id": "a904", + "type": "NETBSD", + "clonable": true + }, + { + "id": "a905", + "type": "NETBSD", + "clonable": true + }, + { + "id": "a906", + "type": "NETBSD-RAID", + "clonable": true + }, + { + "id": "ab00", + "type": "HFS-BOOT", + "clonable": true + }, + { + "id": "af00", + "type": "HFS", + "clonable": true + }, + { + "id": "af01", + "type": "HFS-RAID", + "clonable": true + }, + { + "id": "af02", + "type": "HFS-RAID", + "clonable": true + }, + { + "id": "be00", + "type": "SOLARIS-BOOT", + "clonable": true + }, + { + "id": "bf00", + "type": "SOLARIS", + "clonable": true + }, + { + "id": "bf01", + "type": "SOLARIS", + "clonable": true + }, + { + "id": "bf02", + "type": "SOLARIS-SWAP", + "clonable": false + }, + { + "id": "bf03", + "type": "SOLARIS-DISK", + "clonable": true + }, + { + "id": "bf04", + "type": "SOLARIS", + "clonable": true + }, + { + "id": "bf05", + "type": "SOLARIS", + "clonable": true + }, + { + "id": "ca00", + "type": "CACHE", + "clonable": false + }, + { + "id": "ef00", + "type": "EFI", + "clonable": true + }, + { + "id": "ef01", + "type": "MBR", + "clonable": false + }, + { + "id": "ef02", + "type": "BIOS-BOOT", + "clonable": false + }, + { + "id": "fb00", + "type": "VMFS", + "clonable": true + }, + { + "id": "fb01", + "type": "VMFS-RESERV", + "clonable": true + }, + { + "id": "fb02", + "type": "VMFS-KRN", + "clonable": true + }, + { + "id": "fd00", + "type": "LINUX-RAID", + "clonable": true + }, + { + "id": "ffff", + "type": "UNKNOWN", + "clonable": true + } + ] + }, + { + "id": 3, + "type": "LVM", + "partitions": [ + { + "id": "10000", + "type": "LVM-LV", + "clonable": true + } + ] + }, + { + "id": 4, + "type": "ZPOOL", + "partitions": [ + { + "id": "10010", + "type": "ZFS-VOL", + "clonable": true + } + ] + } + ], + "filesystems": [ + { + "id": 1, + "type": "EMPTY" + }, + { + "id": 2, + "type": "CACHE" + }, + { + "id": 3, + "type": "BTRFS" + }, + { + "id": 4, + "type": "EXT2" + }, + { + "id": 5, + "type": "EXT3" + }, + { + "id": 6, + "type": "EXT4" + }, + { + "id": 7, + "type": "FAT12" + }, + { + "id": 8, + "type": "FAT16" + }, + { + "id": 9, + "type": "FAT32" + }, + { + "id": 10, + "type": "HFS" + }, + { + "id": 11, + "type": "HFSPLUS" + }, + { + "id": 12, + "type": "JFS" + }, + { + "id": 13, + "type": "NTFS" + }, + { + "id": 14, + "type": "REISERFS" + }, + { + "id": 15, + "type": "REISER4" + }, + { + "id": 16, + "type": "UFS" + }, + { + "id": 17, + "type": "XFS" + }, + { + "id": 18, + "type": "LINUX-SWAP" + }, + { + "id": 19, + "type": "EXFAT" + }, + { + "id": 20, + "type": "F2FS" + }, + { + "id": 21, + "type": "NILFS2" + } + ], + "operatingsystems": [ + { + "type": "Android" + }, + { + "type": "BSD" + }, + { + "type": "GrubLoader" + }, + { + "type": "Hurd" + }, + { + "type": "Linux" + }, + { + "type": "MacOS" + }, + { + "type": "Solaris" + }, + { + "type": "Windows" + }, + { + "type": "WinLoader" + } + ] +} diff --git a/ogclient/etc/es.qmap b/ogclient/etc/es.qmap new file mode 100644 index 0000000..fa1fc5a Binary files /dev/null and b/ogclient/etc/es.qmap differ diff --git a/ogclient/etc/init/default.sh b/ogclient/etc/init/default.sh new file mode 100755 index 0000000..1ca273b --- /dev/null +++ b/ogclient/etc/init/default.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Proceso general de arranque de OpenGnsys Client. + + +# Fichero de registro de incidencias (en el servidor; si no, en local). +OPENGNSYS=${OPENGNSYS:-/opt/opengnsys} +OGLOGFILE=${OGLOGFILE:-$OPENGNSYS/log/$(ogGetIpAdderss).log} +if ! touch $OGLOGFILE 2>/dev/null; then + OGLOGFILE=/var/log/opengnsys.log +fi +LOGLEVEL=5 + +# Matando plymount para inicir browser o shell +pkill -9 plymouthd + +# Arranque de OpenGnsys Client daemon (socket). +echo "${MSG_LAUNCHCLIENT:-.}" +# Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap"). +[ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap" + +if [ -f "/usr/share/OGAgent/opengnsys/linux/OGAgentService.py" -a "$ogstatus" != "offline" ]; then + # Ejecutar servicio cliente. + cd /usr/share/OGAgent + export OGAGENTCFG_OGCORE_IP=$ogcore + export OGAGENTCFG_OGLOG_IP=$oglog + export OGAGENTCFG_URLMENU_IP=$ogcore + python3 -m opengnsys.linux.OGAgentService fg +else + for FILE in index $OGGROUP $(ogGetIpAddress) + do + [ -f $OGCAC/menus/$FILE.html ] && OGMENU="$OGCAC/menus/$FILE.html" + done + echo "exec /usr/bin/OGBrowser $OGMENU" > /home/root/ + /usr/bin/OGBrowser -qws $OGMENU +fi + +# Si fallo en cliente y modo "admin", cargar shell; si no, salir. +if [ "$ogactiveadmin" == "true" ]; then + bash +fi \ No newline at end of file diff --git a/ogclient/etc/lang.ca_ES.UTF-8.conf b/ogclient/etc/lang.ca_ES.UTF-8.conf new file mode 120000 index 0000000..db97a00 --- /dev/null +++ b/ogclient/etc/lang.ca_ES.UTF-8.conf @@ -0,0 +1 @@ +lang.ca_ES.conf \ No newline at end of file diff --git a/ogclient/etc/lang.ca_ES.conf b/ogclient/etc/lang.ca_ES.conf new file mode 100644 index 0000000..6dce8a5 --- /dev/null +++ b/ogclient/etc/lang.ca_ES.conf @@ -0,0 +1,398 @@ +# Fichero de idioma: catalá. +#@version 1.1.1 +#@author + + +# Mensajes de error. +MSG_ERR_GENERIC="Error imprevisto no definido" +MSG_ERR_FORMAT="Formato de ejecución incorrecto" +MSG_ERR_OUTOFLIMIT="Valor fuera de rango o no válido" +MSG_ERR_NOTFOUND="Fichero o dispositivo no encontrado" +MSG_ERR_PARTITION="Partición errónea o desconocida" +MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" +MSG_ERR_CACHE="Error en partición de caché local" +MSG_ERR_NOGPT="El disco indicado no contiene una particion GPT" +MSG_ERR_REPO="Error al montar el repositorio de imágenes" +MSG_ERR_NOMSDOS="El disco indicado no contiene una partición MSDOS" +MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" +MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar" +MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" +MSG_ERR_IMAGEFILE="Archivo de imagen corrupto o de otra versión de partclone" +MSG_ERR_NOTEXEC="Programa o función no ejecutable" +MSG_ERR_NOTWRITE="No hay acceso de escritura" +MSG_ERR_NOTCACHE="No existe particion Cache en el cliente" +MSG_ERR_NOTUEFI="La interfaz UEFI no está activa" +MSG_ERR_NOTBIOS="La interfaz BIOS Legacy no está activa" +MSG_ERR_CACHESIZE="El espacio de la cache local o remota no es suficiente" +MSG_ERR_REDUCEFS="Error al reducir el sistema de archivos" +MSG_ERR_EXTENDFS="Error al expandir el sistema de archivos" +MSG_ERR_IMGSIZEPARTITION="Error al restaurar: Particion mas pequeña que la imagen" +MSG_ERR_UPDATECACHE="Error al realizar el comando updateCache" +MSG_ERR_UCASTSYNTAXT="Error en la generación de sintaxis de transferenica unicast" +MSG_ERR_UCASTSENDPARTITION="Error en envio UNICAST de una particion" +MSG_ERR_UCASTSENDFILE="Error en envio UNICAST de un fichero" +MSG_ERR_UCASTRECEIVERPARTITION="Error en la recepcion UNICAST de una particion" +MSG_ERR_UCASTRECEIVERFILE="Error en la recepcion UNICAST de un fichero" +MSG_ERR_MCASTSYNTAXT="Error en la generación de sintaxis de transferenica multicast" +MSG_ERR_MCASTSENDFILE="Error en envio MULTICAST de un fichero" +MSG_ERR_MCASTRECEIVERFILE="Error en la recepcion MULTICAST de un fichero" +MSG_ERR_MCASTSENDPARTITION="Error en envio MULTICAST de una particion" +MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepcion MULTICAST de un fichero" +MSG_ERR_PROTOCOLJOINMASTER="Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER" +MSG_ERR_DONTFORMAT="Error al formatear" +MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen" +MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen" +MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable" +MSG_ERR_NOTDIFFERENT="No se detectan diferencias entre la imagen basica y la particion." +MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restauracion de la imagen" + +# Mensajes de avisos. +MSG_DONTUSE="NO USAR" +MSG_DONTMOUNT="Sistema de archivos no montado" +MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado" +MSG_MOUNT="Sistema de archivos montado" +MSG_MOUNTREADONLY="Sistema de archivos montado solo de lectura" +MSG_OBSOLETE="EN DESUSO" + +# Mensajes complementarios para las ayudas. +MSG_64BIT="64 bits" +MSG_DISK="disc" +MSG_ERROR="Error" +MSG_EXAMPLE="Exemple" +MSG_FORMAT="Format" +MSG_FUNCTION="Funció" +MSG_HARDWAREINVENTORY="Inventario de maquinari de la màquina" +MSG_IMAGE="imatge" +MSG_INSTALLED="instal-lat" +MSG_NOCACHE="sense caché local" +MSG_NOEXTENDED="sense partició estensa" +MSG_PARTITION="partició" +MSG_PROTOCOL="protocol" +MSG_RESERVEDVALUE="Valor reservat" +MSG_SEE="Veure" +MSG_UNKNOWN="Desconegut" +MSG_WARNING="Avís" + +# Mensajes del proceso de arranque. +MSG_DETECTLVMRAID="Detectar metadispositivos LVM y RAID." +MSG_ERRBOOTMODE="$MSG_ERROR: Modo de arranque desconocido." +MSG_LAUNCHCLIENT="Ejecutar cliente." +MSG_LOADAPI="Cargar funciones del motor de clonación." +MSG_LOADMODULES="Cargar módulos del kernel." +MSG_MAKELINKS="Crear enlaces simbólicos." +MSG_MOUNTREPO="Montar repositorio por %s en modo %s." +MSG_OFFLINEMODE="Modo de arranque sin conexión." +MSG_OTHERSERVICES="Iniciar servicios complementarios del cliente." +MSG_POWEROFFCONF="Definir parámetros de ahorro de energía." + +# Mensajes del menú por defecto. +MSG_BOOT="Iniciar" +MSG_DUPLEX="Dúplex" +MSG_HOSTNAME="Equipo" +MSG_IPADDR="Dirección IP" +MSG_MACADDR="Dirección MAC" +MSG_MENUTITLE="Menú de opciones" +MSG_POWEROFF="Apagar el equipo" +MSG_SPEED="Velocidad" + +# Mensajes de descripción breve de las funciones de la API. +MSG_HELP_ogAclFilter="Extrae las acl de los ficheros de la diferencial" +MSG_HELP_ogAddCmd="Añade comandos al fichero creado por la función ogInstalMiniSetup." +MSG_HELP_ogAddRegistryKey="Añade una nueva clave al registro de Windows." +MSG_HELP_ogAddRegistryValue="Añade un nuevo valor al registro de Windows." +MSG_HELP_ogAddToLaunchDaemon="" +MSG_HELP_ogBoot="Arranca un sistema operativo instalado." +MSG_HELP_ogBootLoaderDeleteEntry="$MSG_DONTUSE." +MSG_HELP_ogBootLoaderHidePartitions="$MSG_DONTUSE." +MSG_HELP_ogBootMbrGeneric="" +MSG_HELP_ogBootMbrXP="" +MSG_HELP_ogBurgDefaultEntry="Configura la entrada por defecto de Burg." +MSG_HELP_ogBurgDeleteEntry="Borra en el Burg del MBR las entradas para el inicio en una particion." +MSG_HELP_ogBurgHidePartitions="Configura el Burg del MBR para que oculte las particiones de windows que no se esten iniciando. Permite definir una partición que no se ocultará (ej: para datos)." +MSG_HELP_ogBurgInstallMbr="Instal·la el carregador d'arrencada BURG al MBR del primer disc dur" +MSG_HELP_ogBurgOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de Burg." +MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero." +MSG_HELP_ogCalculateFullChecksum="" +MSG_HELP_ogChangeRepo="Cambia el repositorio para el recurso remoto images." +MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos." +MSG_HELP_ogCheckIpAddress="" +MSG_HELP_ogCheckProgram="" +MSG_HELP_ogCheckStringInGroup="" +MSG_HELP_ogCheckStringInReg="" +MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla." +MSG_HELP_ogCleanLinuxDevices="" +MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo." +MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros." +MSG_HELP_ogConfigureFstab="" +MSG_HELP_ogConfigureOgagent="Configura el nuevo agente OGAgent para sistemas ooperativos." +MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento." +MSG_HELP_ogCreateBootLoaderImage="" +MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco." +MSG_HELP_ogCreateDiskImage="Genera una imagen exacta de un disco completo." +MSG_HELP_ogCreateFileImage="Crea/Redimensiona el archivo de la imagen sincronizada" +MSG_HELP_ogCreateGptPartitions="" +MSG_HELP_ogCreateImage="Genera una imagen exacta de un sistema operativo instalado localmente." +MSG_HELP_ogCreateImageSyntax="" +MSG_HELP_ogCreateInfoImage="Crea informacion del contenido de la imagen" +MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." +MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." +MSG_HELP_ogCreatePartitionTable="Genera una tabla de particiones en caso de que no sea valida." +MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copia el cargador de arranque desde la partición EFI a la de sistema." +MSG_HELP_ogDeleteCache="Elimina la partición de caché local." +MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." +MSG_HELP_ogDeletePartitionTable="Elimina la tabla de particiones del disco" +MSG_HELP_ogDeleteRegistryKey="Borra una clave vacía del registro de Windows." +MSG_HELP_ogDeleteRegistryValue="Borra un valor del registro de Windows." +MSG_HELP_ogDeleteTree="Borra un árbol de directorios de un espacio de almacenamiento." +MSG_HELP_ogDevToDisk="Devuelve el nº de orden de disco o de partición correspondiente al camino del fichero de dispositivo." +MSG_HELP_ogDiskToDev="Devuelve el camino del fichero de dispositivo correspondiente al nº de orden de disco o de partición." +MSG_HELP_ogDomainScript="" +MSG_HELP_ogEcho="" +MSG_HELP_ogExecAndLog="" +MSG_HELP_ogExtendFs="Extiende el tamaño de un sistema de archivo al máximo de su partición." +MSG_HELP_ogFindCache="Indica la partición reservada para caché local." +MSG_HELP_ogFixBootSector="" +MSG_HELP_ogFormatCache="Formatea (inicia) el sistema de caché local." +MSG_HELP_ogFormat="Formatea o reformatea un sistema de archivos." +MSG_HELP_ogFormatFs=$MSG_HELP_ogFormat +MSG_HELP_ogGetArch="Devuelve el tipo de arquitectura del cliente." +MSG_HELP_ogGetCacheSize="Devuelve el tamaño de la partición de caché local." +MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser reservado para la partición de caché local." +MSG_HELP_ogGetCaller="" +MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco." +MSG_HELP_ogGetDiskType="Devuelve el mnemónico de tipo de disco." +MSG_HELP_ogGetFreeSize="" +MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos." +MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos." +MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente." +MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente." +MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows." +MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local." +MSG_HELP_ogGetImageCompressor="Devuelve la herramienta de compresión de la imagen." +MSG_HELP_ogGetImageInfo="Muestra información sobre la imagen monolitica: clonacion:compresor:sistemaarchivos:tamañoKB." +MSG_HELP_ogGetImageProgram="Devuelve el programa usado para crear la imagen." +MSG_HELP_ogGetImageSize="Devuelve el tamaño de una imagen de sistema." +MSG_HELP_ogGetImageType="Devuelve el sistema de ficheros de la imagen." +MSG_HELP_ogGetIpAddress="Devuelve la dirección IP del cliente." +MSG_HELP_ogGetLastSector="Devuelve el último sector usable del disco o de una partición." +MSG_HELP_ogGetMacAddress="Devuelve la dirección Ethernet del cliente." +MSG_HELP_ogGetMountImageDir="Devuelve el directorio de montaje de una imagen." +MSG_HELP_ogGetMountPoint="Devuelve el directorio donde está montado un sistema de archivos local." +MSG_HELP_ogGetNetInterface="" +MSG_HELP_ogGetOsType="Devuelve el tipo de un sistema operativo instalado." +MSG_HELP_ogGetOsUuid="" +MSG_HELP_ogGetOsVersion="Devuelve el tipo y la versión de un sistema operativo instalado." +MSG_HELP_ogGetParentPath="Devuelve el camino completo del directorio padre de un fichero de sistema OpenGnsys." +MSG_HELP_ogGetPartitionActive="Indica cual es la partición marcada como activa en un disco." +MSG_HELP_ogGetPartitionId="Devuelve el identificador de tipo de una partición." +MSG_HELP_ogGetPartitionSize="Devuelve el tamaño de una partición." +MSG_HELP_ogGetPartitionsNumber="" +MSG_HELP_ogGetPartitionTableType="Devuelve el tipo de tabla de particiones del disco" +MSG_HELP_ogGetPartitionType="Devuelve el mnemónico de tipo de una partición." +MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnsys." +MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows." +MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." +MSG_HELP_ogGetSerialNumber="Devuelve el número de serie del cliente." +MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." +MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido." +MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgLive="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDefaultEntry="Configura la entrada por defecto de GRUB." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando. Permite definir una partición que no se ocultará (ej: para datos)." +MSG_HELP_ogGrubInstallMbr="Instal·la el carregador d'arrencada GRUB al MBR del primer disc dur" +MSG_HELP_ogGrubInstallPartition="Instal·la el carregador d'arrencada BURG al BootSector" +MSG_HELP_ogGrubOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de GRUB." +MSG_HELP_ogGrubSecurity="Configura usuario y clave para modificar las entradas del menu del Grub." +MSG_HELP_ogGrubUefiConf="Genera el fichero grub.cfg de la partición EFI." +MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." +MSG_HELP_ogHidePartition="Oculta una partición de Windows." +MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." +MSG_HELP_ogNvramActiveEntry="Configura a activa entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramAddEntry="Crea nueva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramDeleteEntry="Borra entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetCurrent="Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo." +MSG_HELP_ogNvramGetNext="Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque." +MSG_HELP_ogNvramGetOrder="Muestra el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetTimeout="Muestra el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramInactiveEntry="Configura a inactiva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramList="Lista las entradas del gestor de arranque (NVRAN) marcando con un asterisco las activas" +MSG_HELP_ogNvramSetNext="Configura el próximo arranque con la entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetOrder="Configura el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetTimeout="Configura el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogGetOsType="Devuelve el tipo de un sistema operativo instalado." +MSG_HELP_ogInstallFirstBoot="Crea un archivo que se ejecutará en el primer arranque de Windows." +MSG_HELP_ogInstallLaunchDaemon="Instala un archivo que se ejecutará en el arranque de macOS." +MSG_HELP_ogInstallLinuxClient="$MSG_OBSOLETE." +MSG_HELP_ogInstallMiniSetup="Instala un archivo que se ejecutará en el arranque de Windows." +MSG_HELP_ogInstallRunonce="Crea un archivo que se ejecutará en el inicio de un usuario administrador de Windows." +MSG_HELP_ogInstallWindowsClient="$MSG_OBSOLETE." +MSG_HELP_ogIsFormated="Comprueba si un sistema de archivos está formateado." +MSG_HELP_ogIsImageLocked="Comprueba si una imagen está bloqueada por una operación de uso exclusivo." +MSG_HELP_ogIsLocked="Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo." +MSG_HELP_ogIsDiskLocked="Comprueba si un disco está bloqueado por una operación de uso exclusivo." +MSG_HELP_ogIsMounted="Comprueba si un sistema de archivos está montado." +MSG_HELP_ogIsNewerFile="Comprueba si un fichero es más nuevo (se ha modificado después) que otro." +MSG_HELP_ogIsPartitionLocked=$MSG_HELP_ogIsLocked +MSG_HELP_ogIsRepoLocked="" +MSG_HELP_ogIsSyncImage="Comprueba si la imagen es sincronizable." +MSG_HELP_ogIsVirtualMachine="" +MSG_HELP_ogIsWritable="Comprueba si un sistema de archivos está montado con permiso de escritura." +MSG_HELP_ogLinuxBootParameters="Devuelve los parámetros de arranque de un sistema operativo Linux instalado." +MSG_HELP_ogListHardwareInfo="Lista el inventario de dispositivos del cliente." +MSG_HELP_ogListLogicalPartitions="" +MSG_HELP_ogListPartitions="Lista la estructura de particiones de un disco." +MSG_HELP_ogListPrimaryPartitions="" +MSG_HELP_ogListRegistryKeys="Lista los nombres de las subclaves incluidas en una clave del registro de Windows." +MSG_HELP_ogListRegistryValues="Lista los nombres de los valores incluidos en una clave del registro de Windows." +MSG_HELP_ogListSoftware="Lista el inventario de programas instalados en un sistema operativo." +MSG_HELP_ogLock="Bloquea una partición para operación de uso exclusivo." +MSG_HELP_ogLockDisk="Bloquea un disco para operación de uso exclusivo." +MSG_HELP_ogLockImage="Bloquea una imagen para operación de uso exclusivo." +MSG_HELP_ogLockPartition=$MSG_HELP_ogLock +MSG_HELP_ogMakeChecksumFile="Almacena la suma de comprobación de un fichero." +MSG_HELP_ogMakeDir="Crea un directorio para OpenGnsys." +MSG_HELP_ogMakeGroupDir="Crea el directorio de grupo (aula) en un repositorio." +MSG_HELP_ogMcastReceiverFile="" +MSG_HELP_ogMcastReceiverPartition="" +MSG_HELP_ogMcastRequest="" +MSG_HELP_ogMcastSendFile="" +MSG_HELP_ogMcastSendPartition="" +MSG_HELP_ogMcastSyntax="" +MSG_HELP_ogMountCache="Monta el sistema de archivos dedicado a caché local." +MSG_HELP_ogMountCdrom="Monta dispositivo óptico por defecto." +MSG_HELP_ogMountFs=$MSG_HELP_ogMount +MSG_HELP_ogMountImage="Monta una imagen sincronizable" +MSG_HELP_ogMount="Monta un sistema de archivos y devuelve el punto de montaje." +MSG_HELP_ogNvramActiveEntry="Configura a activa entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramAddEntry="Crea nueva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramDeleteEntry="Borra entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetCurrent="Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo." +MSG_HELP_ogNvramGetNext="Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque." +MSG_HELP_ogNvramGetOrder="Muestra el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetTimeout="Muestra el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramInactiveEntry="Configura a inactiva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramList="Lista las entradas del gestor de arranque (NVRAN) marcando con un asterisco las activas" +MSG_HELP_ogNvramPxeFirstEntry="Configura la tarjeta de red como primer arranque en la NVRAM." +MSG_HELP_ogNvramSetNext="Configura el próximo arranque con la entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetOrder="Configura el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetTimeout="Configura el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogRaiseError="Muestra y registra mensajes de error y devuelve el código correspondiente." +MSG_HELP_ogReduceFs="Reduce el tamaño del sistema de archivos al mínimo ocupado por sus datos." +MSG_HELP_ogReduceImage="Reduce el tamaño de la imagen" +MSG_HELP_ogRefindDeleteEntry="Borra en rEFInd las entradas para el inicio en una particion." +MSG_HELP_ogRefindDefaultEntry="Configura la entrada por defecto de rEFInd." +MSG_HELP_ogRefindOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de rEFInd." +MSG_HELP_ogRefindSetTheme="Asigna un tema al rEFInd." +MSG_HELP_ogRefindSetTimeOut="Define el tiempo (segundos) que se muestran las opciones de inicio de rEFInd." +MSG_HELP_ogRefindSetResolution="Define la resolución que usuará el thema del gestor de arranque rEFInd." +MSG_HELP_ogRefindInstall="Instala y configura el gestor rEFInd en la particion EFI" +MSG_HELP_ogRestoreAclImage="" +MSG_HELP_ogRestoreBootLoaderImage="" +MSG_HELP_ogRestoreDiskImage="Restaura una imagen de un disco completo." +MSG_HELP_ogRestoreEfiBootLoader="Copia el cargador de arranque de la partición de sistema a la partición EFI." +MSG_HELP_ogRestoreImage="Restaura una imagen de sistema operativo." +MSG_HELP_ogRestoreInfoImage="Restablece informacion del sistema: acl y enlaces simbolicos" +MSG_HELP_ogRestoreMbrImage="Restaura una imagen del sector de arranque (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restaura los uuid de las particiones y la tabla de particiones." +MSG_HELP_ogSaveImageInfo="Crea un fichero con la información de la imagen." +MSG_HELP_ogSetLinuxName="" +MSG_HELP_ogSetPartitionActive="Establece el número de partición activa de un disco." +MSG_HELP_ogSetPartitionId="Modifica el tipo de una partición física usando el mnemónico del tipo." +MSG_HELP_ogSetPartitionSize="Establece el tamaño de una partición." +MSG_HELP_ogSetPartitionType="Modifica el identificador de tipo de una partición física." +MSG_HELP_ogSetRegistryValue="Asigna un dato a un valor del registro de Windows." +MSG_HELP_ogSetWindowsName="Asigna el nombre del cliente en el registro de Windows." +MSG_HELP_ogSetWinlogonUser="Asigna el nombre de usuario por defecto para el gestor de entrada de Windows." +MSG_HELP_ogSyncCreate="Sincroniza los datos de la particion a la imagen" +MSG_HELP_ogSyncRestore="Sincroniza los datos de la imagen a la particion" +MSG_HELP_ogTorrentStart="" +MSG_HELP_ogTypeToId="Devuelve el identificador asociado al mnemónico de tipo de partición." +MSG_HELP_ogUcastReceiverPartition="" +MSG_HELP_ogUcastSendFile="" +MSG_HELP_ogUcastSendPartition="" +MSG_HELP_ogUcastSyntax="" +MSG_HELP_ogUnhidePartition="Hace visible una partición de Windows." +MSG_HELP_ogUninstallLinuxClient="Desinstala el cliente OpenGnSys en un sistema operativo Linux." +MSG_HELP_ogUninstallWindowsClient="Desinstala el cliente OpenGnSys en un sistema operativo Windows." +MSG_HELP_ogUnlock="Desbloquea una partición tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockDisk="Desbloquea un disco tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockImage="Desbloquea una imagen tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockPartition=$MSG_HELP_ogUnlock +MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos." +MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local." +MSG_HELP_ogUnmount="Desmonta un sistema de archivos." +MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount +MSG_HELP_ogUnmountImage="Desmonta la imagen" +MSG_HELP_ogUnsetDirtyBit="" +MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." +MSG_HELP_ogUpdatePartitionTable="Actualiza informacion tabla particiones del disco" +MSG_HELP_ogUuidChange="Reemplaza el UUID de un sistema de ficheros." +MSG_HELP_ogWaitSyncImage="" +MSG_HELP_ogWindowsBootParameters="" +MSG_HELP_ogWindowsRegisterPartition="" + +# Scripts +MSG_HELP_configureOs="Post-configura de arranque del sistema" +MSG_HELP_createBaseImage="Genera imagen basica de la particion" +MSG_HELP_createDiffImage="Genera imagen diferencial de la particion respecto a la imagen basica" +MSG_HELP_installOfflineMode="Prepara el equipo cliente para el modo offline." +MSG_HELP_partclone2sync="Convierte imagen de partclone en imagen sincronizable." +MSG_HELP_restoreBaseImage="Restaura una imagen basica en una particion" +MSG_HELP_restoreDiffImage="Restaura una imagen diferencial en una particion" +MSG_HELP_updateCache="Realiza la actualizacion de la cache" + +# Mensajes de descripción breve de la interfaz. +MSG_INTERFACE_START="[START Interface] Ejecutar comando: " +MSG_INTERFACE_END="[END Interface] Comando terminado con este código: " + +# Mensajes de scripts. +MSG_SCRIPTS_START=" INICIO scripts : " +MSG_SCRIPTS_END=" FIN scripts: " +MSG_SCRIPTS_TASK_END="Fin de la tarea" + +MSG_SCRIPTS_TASK_SLEEP="Esperando para iniciar" +MSG_SCRIPTS_TASK_START="Iniciando" +MSG_SCRIPTS_TASK_ERR="Error" + +# Script createImage. +MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: " +MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: " + +# Script updateCache. +MSG_SCRIPTS_UPDATECACHE_DOUPDATE="comprovar si es necessari actualitzar el fitxer imatge" +MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la cache es mayor que el fichero a descargar." +# Script updateCache: para las imágenes sincronizadas tipo dir. +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calculamos el tamaño de la imagen." +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEIMG="Comprobamos si hay que la imagen del repositorio es mayor que la de la cache." +MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO="Comprobar el espacio libre de la cache y actuar según engine.cfg" + +MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION="Comprobando sesion multicast: ServidorMcast:PuertoDatos" + +# interface sustituye temporalmente al scritp restore +MSG_SCRIPTS_CHECK_ENGINE="Analizar proceso a realizar según engine.cfg" +MSG_SCRIPTS_MULTICAST_PRECHECK_PORT="Determinar puerto principal y auxiliar multicast." +MSG_SCRIPTS_MULTICAST_CHECK_PORT="Comprobar puertos de sesion y datos" +MSG_SCRIPTS_MULTICAST_REQUEST_PORT="Solicitar la apertura: " +MSG_SCRIPTS_OS_CONFIGURE="Iniciar la configuracion del sistema restaurado" + +# TIME MESSAGES +MSG_SCRIPTS_TIME_TOTAL="tiempo total del proceso" +MSG_SCRIPTS_TIME_PARTIAL="tiempo parcial del subproceso" + +# HTTPLOG +MSG_HTTPLOG_NOUSE="No apague este ordenador por favor" + +# Mensajes sincronizadas +MSG_SYNC_RESIZE="Redimensiona la imagen al tamaño necesario" +MSG_SYNC_RESTORE="Trae el listado ficheros y baja la imagen" +MSG_SYNC_DELETE="Diferencial: Borra archivos antiguos" +MSG_SYNC_SLEEP="Espera que se monte/reduzca la imagen" +# Mensajes sincronizadas complementarios a errores +MSG_SYNC_DIFFERENTFS="El sistema de ficheros de destino no coincide con el de la imagen" +MSG_SYNC_EXTENSION="Las extensiones de la imagenes deben ser img o diff" +MSG_SYNC_NOCHECK="La imagen esta montada por otro proceso, no podemos comprobarla" + +MSG_RESTORE="Restaura la imagen en" + diff --git a/ogclient/etc/lang.en_GB.UTF-8.conf b/ogclient/etc/lang.en_GB.UTF-8.conf new file mode 120000 index 0000000..3e5cc89 --- /dev/null +++ b/ogclient/etc/lang.en_GB.UTF-8.conf @@ -0,0 +1 @@ +lang.en_GB.conf \ No newline at end of file diff --git a/ogclient/etc/lang.en_GB.conf b/ogclient/etc/lang.en_GB.conf new file mode 100644 index 0000000..9b8469c --- /dev/null +++ b/ogclient/etc/lang.en_GB.conf @@ -0,0 +1,385 @@ +# English language file. +#@version 1.1.0 +#@author Jose Miguel Hernandez - Universidad de Salamanca +#@date 2018-03-01 + +# Error messages. +MSG_ERR_GENERIC="Undefined unknown error" +MSG_ERR_FORMAT="Wrong execution format" +MSG_ERR_OUTOFLIMIT="Out of range or invalid value" +MSG_ERR_NOTFOUND="File or device not found" +MSG_ERR_PARTITION="Unknown or wrong partition" +MSG_ERR_LOCKED="Resource locked by exclusive use operation" +MSG_ERR_CACHE="Local cache error" +MSG_ERR_NOGPT="Current disk does not include GPT partition" +MSG_ERR_REPO="Failed when mounting images repository" +MSG_ERR_NOMSDOS="Current disk does not include MSDOS partition" +MSG_ERR_FILESYS="Unknown or unmountable file system" +MSG_ERR_NOTOS="Cannot detect or boot OS" +MSG_ERR_IMAGE="Cannot create or restore a system image" +MSG_ERR_IMAGEFILE="Image file corrupt or of other partclone version" +MSG_ERR_NOTEXEC="Non executable program or function" +MSG_ERR_NOTWRITE="Write access denied" +MSG_ERR_NOTCACHE="No client cache partition" +MSG_ERR_NOTUEFI="UEFI isn't active" +MSG_ERR_NOTBIOS="BIOS legacy isn't active" +MSG_ERR_CACHESIZE="Not enough space in local or remote cache" +MSG_ERR_REDUCEFS="Error when reducing file system" +MSG_ERR_EXTENDFS="Error when expanding file system" +MSG_ERR_IMGSIZEPARTITION="Backup error: Partition smaller than image" +MSG_ERR_UPDATECACHE="Error when running `updateCache´ command" +MSG_ERR_UCASTSYNTAXT="Error when generating Unicast transfer syntax" +MSG_ERR_UCASTSENDPARTITION="Error when sending a Unicast partition" +MSG_ERR_UCASTSENDFILE="Error when sending a Unicast file" +MSG_ERR_UCASTRECEIVERPARTITION="Error when receiving an Unicast partition" +MSG_ERR_UCASTRECEIVERFILE="Error when receiving an Unicast file" +MSG_ERR_MCASTSYNTAXT="Error when generating Multicast transfer syntax" +MSG_ERR_MCASTSENDFILE="Error when sending Multicast file" +MSG_ERR_MCASTRECEIVERFILE="Error when receiving Multicast file" +MSG_ERR_MCASTSENDPARTITION="Error when sending Multicast partition" +MSG_ERR_MCASTRECEIVERPARTITION="Error when receiving Multicast partition " +MSG_ERR_PROTOCOLJOINMASTER="Error when connecting Unicast/Multicast session to Master" +MSG_ERR_DONTFORMAT="Formatting Error" +MSG_ERR_DONTMOUNT_IMAGE="Error when mounting/reducing image" +MSG_ERR_DONTUNMOUNT_IMAGE="Error when unmounting image" +MSG_ERR_DONTSYNC_IMAGE="Unsynchronizable image" +MSG_ERR_NOTDIFFERENT="Basic image identical to partition" +MSG_ERR_SYNCHRONIZING="Synchronizing error, it may affect image creation/restoration process" + +# Warning messages. +MSG_DONTUSE="DO NOT USE" +MSG_DONTMOUNT="Unmounted file system" +MSG_DONTUNMOUNT="Cannot unmount file system or it isn't mounted" +MSG_MOUNT="File system already mounted" +MSG_MOUNTREADONLY="Read-only file system mounted" +MSG_OBSOLETE="OBSOLETE" + +# Auxiliary help messages. +MSG_64BIT="64-bit" +MSG_DISK="Disk" +MSG_ERROR="Error" +MSG_EXAMPLE="Example" +MSG_FORMAT="Format" +MSG_FUNCTION="Function" +MSG_HARDWAREINVENTORY="Hardware inventory" +MSG_IMAGE="Image" +MSG_INSTALLED="Installed" +MSG_NOCACHE="No local cache" +MSG_NOEXTENDED="No extended partition" +MSG_PARTITION="Partition" +MSG_PROTOCOL="Protocol" +MSG_RESERVEDVALUE="Reserved value" +MSG_SEE="See" +MSG_UNKNOWN="Unknown" +MSG_WARNING="Warning" + +# Boot process messages. +MSG_DETECTLVMRAID="Detecting LVM and RAID meta-devices." +MSG_ERRBOOTMODE="$MSG_ERROR: Unknown boot mode." +MSG_LAUNCHCLIENT="Launching client browser." +MSG_LOADAPI="Loading cloning-engine functions." +MSG_LOADMODULES="Loading kernel modules." +MSG_MAKELINKS="Creating symbolic links." +MSG_MOUNTREPO="Mounting repository using %s by %s mode." +MSG_OFFLINEMODE="Off-line boot mode." +MSG_OTHERSERVICES="Starting client complementary services." +MSG_POWEROFFCONF="Defining power-saving parameters." + +# Default menu messages. +MSG_BOOT="Boot" +MSG_DUPLEX="Duplex" +MSG_HOSTNAME="Hostname" +MSG_IPADDR="IP Address" +MSG_MACADDR="MAC Address" +MSG_MENUTITLE="Options menu" +MSG_POWEROFF="Shutdown computer" +MSG_SPEED="Speed" + +# API functions messages. +MSG_HELP_ogAclFilter="Draws ACL files from differential image." +MSG_HELP_ogAddCmd="Adds commands to file created by ogInstalMiniSetup." +MSG_HELP_ogAddRegistryKey="Adds new Windows registry key." +MSG_HELP_ogAddRegistryValue="Adds new Windows registry value." +MSG_HELP_ogAddToLaunchDaemon="" +MSG_HELP_ogBoot="Boots installed OS." +MSG_HELP_ogBootLoaderDeleteEntry="$MSG_DONTUSE." +MSG_HELP_ogBootLoaderHidePartitions="$MSG_DONTUSE." +MSG_HELP_ogBootMbrGeneric="" +MSG_HELP_ogBootMbrXP="" +MSG_HELP_ogBurgDefaultEntry="Sets default Burg entry." +MSG_HELP_ogBurgDeleteEntry="Deletes partition start-entries from MBR BURG." +MSG_HELP_ogBurgHidePartitions="Sets MBR Burg to hide non starting windows partitions. Allows you to select a partition that will not be hidden (e.g. for data)." +MSG_HELP_ogBurgInstallMbr="Installs BURG boot-loader on 1st HD MBR." +MSG_HELP_ogBurgOgliveDefaultEntry="Sets ogLive input as default Burg input." +MSG_HELP_ogCalculateChecksum="Calculates file checksum." +MSG_HELP_ogCalculateFullChecksum="Calculates file full checksum" +MSG_HELP_ogChangeRepo="Changes repository for remote resource: images." +MSG_HELP_ogCheckFs="Checks file system consistence." +MSG_HELP_ogCheckIpAddress="" +MSG_HELP_ogCheckProgram="" +MSG_HELP_ogCheckStringInGroup="" +MSG_HELP_ogCheckStringInReg="" +MSG_HELP_ogCheckSyncImage="Displays image contents to check it." +MSG_HELP_ogCleanLinuxDevices="" +MSG_HELP_ogCleanOs="Deletes OS unnecessary files." +MSG_HELP_ogCompareChecksumFiles="Compares if the checksums match." +MSG_HELP_ogConfigureFstab="" +MSG_HELP_ogConfigureOgagent="Sets OS new agent: OGAgent." +MSG_HELP_ogCopyFile="Copies file to another storage unit ." +MSG_HELP_ogCreateBootLoaderImage="" +MSG_HELP_ogCreateCache="Saves space for cache partition at the end of disk." +MSG_HELP_ogCreateDiskImage="Creates exact image from local disk." +MSG_HELP_ogCreateFileImage="Creates/Resizes synchronized image file." +MSG_HELP_ogCreateGptPartitions="" +MSG_HELP_ogCreateImage="Creates exact image from local installed OS." +MSG_HELP_ogCreateImageSyntax="" +MSG_HELP_ogCreateInfoImage="Creates image content information." +MSG_HELP_ogCreateMbrImage="Creates MBR image." +MSG_HELP_ogCreatePartitions="Creates disk partition table." +MSG_HELP_ogCreatePartitionTable="Creates partition table, if necessary." +MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copy the boot loader from the EFI partition to system partition." +MSG_HELP_ogDeleteCache="Deletes local cache partition." +MSG_HELP_ogDeleteFile="Deletes file from storage." +MSG_HELP_ogDeletePartitionTable="Deletes disk table partition" +MSG_HELP_ogDeleteRegistryKey="Deletes empty Windows registry key." +MSG_HELP_ogDeleteRegistryValue="Deletes Windows registry value." +MSG_HELP_ogDeleteTree="Deletes directory tree." +MSG_HELP_ogDevToDisk="Returns disk or partition ordinal number for device file path." +MSG_HELP_ogDiskToDev="Returns device file path for disk or partition ordinal number." +MSG_HELP_ogDomainScript="" +MSG_HELP_ogEcho="Displays and log messages." +MSG_HELP_ogExecAndLog="Runs and logs command" +MSG_HELP_ogExtendFs="Expands file system size to partition maximum." +MSG_HELP_ogFindCache="Shows local cache reserved partition." +MSG_HELP_ogFixBootSector="" +MSG_HELP_ogFormatCache="Formats (clears) local cache." +MSG_HELP_ogFormat="Formats file system." +MSG_HELP_ogFormatFs=$MSG_HELP_ogFormat +MSG_HELP_ogGetArch="Returns client architecture." +MSG_HELP_ogGetCacheSize="Returns local cache partition size." +MSG_HELP_ogGetCacheSpace="Returns maximum available space that can be reserved for local cache partition." +MSG_HELP_ogGetCaller="Returns program or function which is calling to current one" +MSG_HELP_ogGetDiskSize="Returns disk size." +MSG_HELP_ogGetDiskType="Returns disk type." +MSG_HELP_ogGetFreeSize="" +MSG_HELP_ogGetFsSize="Returns file system size." +MSG_HELP_ogGetFsType="Returns file system type." +MSG_HELP_ogGetGroupDir="Returns default directory path for client group." +MSG_HELP_ogGetGroupName="Returns client group name." +MSG_HELP_ogGetHivePath="Returns full path of file from Windows registry section." +MSG_HELP_ogGetHostname="Returns local hostname." +MSG_HELP_ogGetImageCompressor="Returns image compression tool." +MSG_HELP_ogGetImageInfo="Displays monolithic image information: cloning; compressor; file system; size(KB)." +MSG_HELP_ogGetImageProgram="Returns used program to create image." +MSG_HELP_ogGetImageSize="Returns system image size." +MSG_HELP_ogGetImageType="Returns image file system." +MSG_HELP_ogGetIpAddress="Returns client IP." +MSG_HELP_ogGetLastSector="Returns last available sector from disk or partition." +MSG_HELP_ogGetMacAddress="Returns client Ethernet address." +MSG_HELP_ogGetMountImageDir="Returns mounting directory of image." +MSG_HELP_ogGetMountPoint="Returns directory of local file system mount point." +MSG_HELP_ogGetNetInterface="" +MSG_HELP_ogGetOsType="Returns installed OS type." +MSG_HELP_ogGetOsUuid="Returns OS UUID" +MSG_HELP_ogGetOsVersion="Returns OS version." +MSG_HELP_ogGetParentPath="Returns full path of OpenGnsys system file parent directory." +MSG_HELP_ogGetPartitionActive="Returns disk active partition." +MSG_HELP_ogGetPartitionId="Returns partition type ID." +MSG_HELP_ogGetPartitionSize="Returns partition size." +MSG_HELP_ogGetPartitionsNumber="Returns disk partitions number." +MSG_HELP_ogGetPartitionTableType="Returns disk partition table type." +MSG_HELP_ogGetPartitionType="Returns partition type." +MSG_HELP_ogGetPath="Returns full path of OpenGnsys system file." +MSG_HELP_ogGetRegistryValue="Returns data from Windows registry value." +MSG_HELP_ogGetRepoIp="Returns OpenGnsys Repository IP address ." +MSG_HELP_ogGetSerialNumber="Returns host serial number." +MSG_HELP_ogGetServerIp="Returns main OpenGnsys Server IP address." +MSG_HELP_ogGetSizeParameters="Returns file system data size, required space for image and if it fits in the chosen repository." +MSG_HELP_ogGetWindowsName="Returns saved client name on Windows registry." +MSG_HELP_ogGrubAddOgLive="Adds MBR grub an entry calling Opengnsys client." +MSG_HELP_ogGrubDefaultEntry="Sets GRUB default entry." +MSG_HELP_ogGrubDeleteEntry="Deletes partition start entries on MBR grub." +MSG_HELP_ogGrubHidePartitions="Sets MBR grub to hide non starting Windows partitions. Allows you to select a partition that will not be hidden (e.g. for data)." +MSG_HELP_ogGrubInstallMbr="Installs GRUB boot loader on 1st HD MBR" +MSG_HELP_ogGrubInstallPartition="Installs GRUB boot loader on BootSector" +MSG_HELP_ogGrubOgliveDefaultEntry="Sets ogLive entry as default GRUB entry." +MSG_HELP_ogGrubSecurity="Configures user and password for change the menu entries of grub." +MSG_HELP_ogGrubUefiConf="Generates the grub.cfg file of the EFI partition." +MSG_HELP_ogHelp="Shows functions help messages." +MSG_HELP_ogHidePartition="Hides Windows partition." +MSG_HELP_ogIdToType="Returns partition type identifier." +MSG_HELP_ogInstallFirstBoot="Creates file to run on first Windows boot." +MSG_HELP_ogInstallLaunchDaemon="Installs file to run on MACos boot." +MSG_HELP_ogInstallLinuxClient="$MSG_OBSOLETE." +MSG_HELP_ogInstallMiniSetup="Installs file to run on Windows boot." +MSG_HELP_ogInstallRunonce="Creates file to run on admin-user Windows boot." +MSG_HELP_ogInstallWindowsClient="$MSG_OBSOLETE." +MSG_HELP_ogIsFormated="Checks file system if formatted." +MSG_HELP_ogIsImageLocked="Checks image if blocked by exclusive use operation." +MSG_HELP_ogIsLocked="Checks partition or disk if blocked by exclusive use operation." +MSG_HELP_ogIsDiskLocked="Checks disk if blocked by exclusive use operation." +MSG_HELP_ogIsMounted="Checks file system if mounted." +MSG_HELP_ogIsNewerFile="Checks if one file is newer (or has been modified later) than another one." +MSG_HELP_ogIsPartitionLocked=$MSG_HELP_ogIsLocked +MSG_HELP_ogIsRepoLocked="" +MSG_HELP_ogIsSyncImage="Checks image if synchronizable." +MSG_HELP_ogIsVirtualMachine="Checks if client is a virtual machine" +MSG_HELP_ogIsWritable="Checks if mounted file system has write permissions." +MSG_HELP_ogLinuxBootParameters="Returns installed Linux boot parameters." +MSG_HELP_ogListHardwareInfo="Lists the client hardware inventory." +MSG_HELP_ogListLogicalPartitions="Lists disk logic partitions." +MSG_HELP_ogListPartitions="Lists disk partitions table." +MSG_HELP_ogListPrimaryPartitions="Lists disk primary partitions" +MSG_HELP_ogListRegistryKeys="Lists sub-keys names included on a Windows registry key." +MSG_HELP_ogListRegistryValues="Lists value names included on a Windows registry key." +MSG_HELP_ogListSoftware="Lists OS installed programs inventory." +MSG_HELP_ogLock="Blocks partition for exclusive use operation." +MSG_HELP_ogLockDisk="Blocks disk for exclusive use operation." +MSG_HELP_ogLockImage="Blocks image for exclusive use operation." +MSG_HELP_ogLockPartition=$MSG_HELP_ogLock +MSG_HELP_ogMakeChecksumFile="Stores file checksum." +MSG_HELP_ogMakeDir="Makes OpenGnsys directory." +MSG_HELP_ogMakeGroupDir="Makes group (lab) directory on repository." +MSG_HELP_ogMcastReceiverFile="" +MSG_HELP_ogMcastReceiverPartition="" +MSG_HELP_ogMcastRequest="" +MSG_HELP_ogMcastSendFile="" +MSG_HELP_ogMcastSendPartition="" +MSG_HELP_ogMcastSyntax="" +MSG_HELP_ogMountCache="Mounts cache file system." +MSG_HELP_ogMountCdrom="Mounts default optical drive." +MSG_HELP_ogMountFs=$MSG_HELP_ogMount +MSG_HELP_ogMountImage="Mounts synchronizable image" +MSG_HELP_ogMount="Mounts file system and returns mount point." +MSG_HELP_ogNvramActiveEntry="Sets active a bootloader (NVRAM) entry." +MSG_HELP_ogNvramAddEntry="Creates new entry in bootloader (NVRAM)." +MSG_HELP_ogNvramDeleteEntry="Deletes a bootloader (NVRAM) entry." +MSG_HELP_ogNvramGetCurrent="Displays the bootloader (NVRAM) entry that was started by the computer." +MSG_HELP_ogNvramGetNext="Displays the bootloader (NVRAM) entry for the boot next." +MSG_HELP_ogNvramGetOrder="Displays the bootloader (NVRAM) entries order." +MSG_HELP_ogNvramGetTimeout="Displays the bootloader (NVRAM) timeout." +MSG_HELP_ogNvramInactiveEntry="Sets inactive bootloader (NVRAM) entry." +MSG_HELP_ogNvramList="Lists bootloader (NVRAM) entries, by staring actives ones." +MSG_HELP_ogNvramPxeFirstEntry="Set the network as the NVRAM first boot." +MSG_HELP_ogNvramSetNext="Set the bootloader (NVRAM) entry for the boot next." +MSG_HELP_ogNvramSetOrder="Sets the bootloader (NVRAM) entries order." +MSG_HELP_ogNvramSetTimeout="Sets the bootloader (NVRAM) timeout." +MSG_HELP_ogRaiseError="Displays and registers error messages and returns code." +MSG_HELP_ogReduceFs="Reduces file system size to minimum." +MSG_HELP_ogReduceImage="Reduces image size." +MSG_HELP_ogRefindDeleteEntry="Deletes the menu entry of a partition in rEFInd." +MSG_HELP_ogRefindDefaultEntry="Configures default menu entry in rEFInd."" +MSG_HELP_ogRefindOgliveDefaultEntry="Configures ogLive menu entry as default menu entry in rEFInd." +MSG_HELP_ogRefindSetTheme="Configures rEFInd's theme." +MSG_HELP_ogRefindSetTimeOut="Defines the time that rEFInd shows the menu." +MSG_HELP_ogRefindSetResolution="Defines the resolucion of rEFInd's theme." +MSG_HELP_ogRefindInstall="Installs and configures rEFInd boot loader in ESP." +MSG_HELP_ogRestoreAclImage="Restores Windows ACL (Inf. must be on /tmp)." +MSG_HELP_ogRestoreBootLoaderImage="" +MSG_HELP_ogRestoreDiskImage="Restores disk image." +MSG_HELP_ogRestoreEfiBootLoader="Copy the boot loader from the system partition to the EFI partition." +MSG_HELP_ogRestoreImage="Restore OS image." +MSG_HELP_ogRestoreInfoImage="Restores system information: ACL and symbolic links" +MSG_HELP_ogRestoreMbrImage="Restores boot sector image (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restores UUID of partitions and partition table." +MSG_HELP_ogSaveImageInfo="Creates the image information file." +MSG_HELP_ogSetLinuxName="" +MSG_HELP_ogSetPartitionActive="Sets active partition number of disk." +MSG_HELP_ogSetPartitionId="Changes partition ID using mnemonic." +MSG_HELP_ogSetPartitionSize="Sets partition size." +MSG_HELP_ogSetPartitionType="Changes partition type ID." +MSG_HELP_ogSetRegistryValue="Assigns data to a Windows registry values." +MSG_HELP_ogSetWindowsName="Assigns client name to Windows registry." +MSG_HELP_ogSetWinlogonUser="Assigns Windows default user name to Windows input manager." +MSG_HELP_ogSyncCreate="Synchronizes partition data to image" +MSG_HELP_ogSyncRestore="Synchronize image data to partition" +MSG_HELP_ogTorrentStart="" +MSG_HELP_ogTypeToId="Returns the ID of partition type mnemonic." +MSG_HELP_ogUcastReceiverPartition="" +MSG_HELP_ogUcastSendFile="" +MSG_HELP_ogUcastSendPartition="" +MSG_HELP_ogUcastSyntax="" +MSG_HELP_ogUnhidePartition="Unhides Windows partition." +MSG_HELP_ogUninstallLinuxClient="Uninstalls old OpenGnSys agent from Linux OS." +MSG_HELP_ogUninstallWindowsClient="Uninstalls oldOpenGnSys agent from Windows OS." +MSG_HELP_ogUnlock="Unlocks partition after exclusive use operation." +MSG_HELP_ogUnlockDisk="Unlocks disk after exclusive use operation." +MSG_HELP_ogUnlockImage="Unlocks image after exclusive use operation." +MSG_HELP_ogUnlockPartition=$MSG_HELP_ogUnlock +MSG_HELP_ogUnmountAll="Unmounts all file systems." +MSG_HELP_ogUnmountCache="Unmounts cache file system." +MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount +MSG_HELP_ogUnmountImage="Unmounts image" +MSG_HELP_ogUnmount="Unmounts file system." +MSG_HELP_ogUnsetDirtyBit= +MSG_HELP_ogUpdateCacheIsNecesary="Checks if necessary file update in local cache." +MSG_HELP_ogUpdatePartitionTable="Updates disk partition table info " +MSG_HELP_ogUuidChange="Replaces the filesystem UUID" +MSG_HELP_ogWaitSyncImage="" +MSG_HELP_ogWindowsBootParameters="" +MSG_HELP_ogWindowsRegisterPartition="" + +# Scripts +MSG_HELP_configureOs="Post-configure system boot" +MSG_HELP_createBaseImage="Create partition basic image" +MSG_HELP_createDiffImage="Create partition differential image from basic image" +MSG_HELP_installOfflineMode="Prepare client for off-line mode." +MSG_HELP_partclone2sync="Turn part-clone image into synchronizable image." +MSG_HELP_restoreBaseImage="Restore basic image into partition" +MSG_HELP_restoreDiffImage="Restore differential image into partition" +MSG_HELP_updateCache="Update cache" + +# INTERFACE functions messages. +MSG_INTERFACE_START="[START Interface] Run command: " +MSG_INTERFACE_END="[END Interface] Command finished with this code: " + +# SCRIPTS messages. +MSG_SCRIPTS_START=" START scripts: " +MSG_SCRIPTS_END=" END scripts: " +MSG_SCRIPTS_TASK_END="End of task" + +MSG_SCRIPTS_TASK_SLEEP="Waiting to start" +MSG_SCRIPTS_TASK_START="Starting" +MSG_SCRIPTS_TASK_ERR="Error" + +# createImage script +MSG_SCRIPTS_FILE_RENAME="Rename previous image-file: " +MSG_SCRIPTS_CREATE_SIZE="Check required and available storing space(KB): " + +# updateCache script +MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Check if it is necessary to update image file" +MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Check if Cache size is bigger than image file size." +# Script updateCache: for dir synchronized images . +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calculate image size." +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEIMG="Check if repository image file size is bigger than Cache size." +MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO="Check free Cache and apply engine.cfg" + +MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION="Checking Multicast Session McastServer:DataPort" + +# interface temporarily replaces restore script +MSG_SCRIPTS_CHECK_ENGINE="Analyze process to carry out according to engine.cfg" +MSG_SCRIPTS_MULTICAST_PRECHECK_PORT="Check main and auxiliary Multicast port." +MSG_SCRIPTS_MULTICAST_CHECK_PORT="Check session and data ports" +MSG_SCRIPTS_MULTICAST_REQUEST_PORT="Request Multicast port opening: " +MSG_SCRIPTS_OS_CONFIGURE="Start restored system setting" + +# TIME MESSAGES +MSG_SCRIPTS_TIME_TOTAL="Total process time" +MSG_SCRIPTS_TIME_PARTIAL="Partial sub-process time" + +# HTTPLOG +MSG_HTTPLOG_NOUSE="PLEASE DO NOT TURN OFF THIS COMPUTER" + +# Messages for synchronized images (complementary to errors) +MSG_SYNC_RESIZE="Resize image to necessary size" +MSG_SYNC_RESTORE="Get files list and download image" +MSG_SYNC_DELETE="Differential: Delete old files" +MSG_SYNC_SLEEP="Wait for mounting/reducing image" +# Messages for synchronized images (complementary to errors) +MSG_SYNC_DIFFERENTFS="Destination file system does not match image" +MSG_SYNC_EXTENSION="Image extension must be img or diff" +MSG_SYNC_NOCHECK="Image mounted by another process. Cannot verify it" + +MSG_RESTORE="Restore image on " + diff --git a/ogclient/etc/lang.es_ES.UTF-8.conf b/ogclient/etc/lang.es_ES.UTF-8.conf new file mode 120000 index 0000000..330cec2 --- /dev/null +++ b/ogclient/etc/lang.es_ES.UTF-8.conf @@ -0,0 +1 @@ +lang.es_ES.conf \ No newline at end of file diff --git a/ogclient/etc/lang.es_ES.conf b/ogclient/etc/lang.es_ES.conf new file mode 100644 index 0000000..3129f83 --- /dev/null +++ b/ogclient/etc/lang.es_ES.conf @@ -0,0 +1,385 @@ +# Fichero de idioma: español. +#@version 1.1.1 +#@author + + +# Mensajes de error. +MSG_ERR_GENERIC="Error imprevisto no definido" +MSG_ERR_FORMAT="Formato de ejecución incorrecto" +MSG_ERR_OUTOFLIMIT="Valor fuera de rango o no válido" +MSG_ERR_NOTFOUND="Fichero o dispositivo no encontrado" +MSG_ERR_PARTITION="Partición errónea o desconocida" +MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" +MSG_ERR_CACHE="Error en partición de caché local" +MSG_ERR_NOGPT="El disco indicado no contiene una partición GPT" +MSG_ERR_REPO="Error al montar el repositorio de imágenes" +MSG_ERR_NOMSDOS="El disco indicado no contiene una partición MSDOS" +MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" +MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar" +MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" +MSG_ERR_IMAGEFILE="Archivo de imagen corrupto o de otra versión de partclone" +MSG_ERR_NOTEXEC="Programa o función no ejecutable" +MSG_ERR_NOTWRITE="No hay acceso de escritura" +MSG_ERR_NOTCACHE="No existe partición caché en el cliente" +MSG_ERR_NOTUEFI="La interfaz UEFI no está activa" +MSG_ERR_NOTBIOS="La interfaz BIOS Legacy no está activa" +MSG_ERR_CACHESIZE="El espacio de la caché local o remota no es suficiente" +MSG_ERR_REDUCEFS="Error al reducir el sistema de archivos" +MSG_ERR_EXTENDFS="Error al expandir el sistema de archivos" +MSG_ERR_IMGSIZEPARTITION="Error al restaurar: Partición mas pequeña que la imagen" +MSG_ERR_UPDATECACHE="Error al realizar el comando updateCache" +MSG_ERR_UCASTSYNTAXT="Error en la generación de sintaxis de transferenica Unicast" +MSG_ERR_UCASTSENDPARTITION="Error en envío Unicast de una partición" +MSG_ERR_UCASTSENDFILE="Error en envío Unicast de un fichero" +MSG_ERR_UCASTRECEIVERPARTITION="Error en la recepción Unicast de una partición" +MSG_ERR_UCASTRECEIVERFILE="Error en la recepción Unicast de un fichero" +MSG_ERR_MCASTSYNTAXT="Error en la generación de sintaxis de transferenica Multicast" +MSG_ERR_MCASTSENDFILE="Error en envío Multicast de un fichero" +MSG_ERR_MCASTRECEIVERFILE="Error en la recepción Multicast de un fichero" +MSG_ERR_MCASTSENDPARTITION="Error en envío Multicast de una partición" +MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepción Multicast de un fichero" +MSG_ERR_PROTOCOLJOINMASTER="Error en la conexión de una sesión Unicast|Multicast con el Master" +MSG_ERR_DONTFORMAT="Error al formatear" +MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen" +MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen" +MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable" +MSG_ERR_NOTDIFFERENT="No se detectan diferencias entre la imagen básica y la partición" +MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restauracion de la imagen" + +# Mensajes de avisos. +MSG_DONTMOUNT="Sistema de archivos no montado" +MSG_DONTUSE="NO USAR" +MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado" +MSG_MOUNT="Sistema de archivos montado" +MSG_MOUNTREADONLY="Sistema de archivos montado solo de lectura" +MSG_OBSOLETE="EN DESUSO" + +# Mensajes complementarios para las ayudas. +MSG_64BIT="64 bits" +MSG_DISK="disco" +MSG_ERROR="Error" +MSG_EXAMPLE="Ejemplo" +MSG_FORMAT="Formato" +MSG_FUNCTION="Función" +MSG_HARDWAREINVENTORY="Inventario de hardware de la máquina" +MSG_IMAGE="imagen" +MSG_INSTALLED="instalado" +MSG_NOCACHE="sin caché local" +MSG_NOEXTENDED="sin partición extendida" +MSG_PARTITION="partición" +MSG_PROTOCOL="protocolo" +MSG_RESERVEDVALUE="Valor reservado" +MSG_SEE="Ver" +MSG_UNKNOWN="Desconocido" +MSG_WARNING="Aviso" + +# Mensajes del proceso de arranque. +MSG_DETECTLVMRAID="Detectar metadispositivos LVM y RAID." +MSG_ERRBOOTMODE="$MSG_ERROR: Modo de arranque desconocido." +MSG_LAUNCHCLIENT="Ejecutar cliente." +MSG_LOADAPI="Cargar funciones del motor de clonación." +MSG_LOADMODULES="Cargar módulos del kernel." +MSG_MAKELINKS="Crear enlaces simbólicos." +MSG_MOUNTREPO="Montar repositorio por %s en modo %s." +MSG_OFFLINEMODE="Modo de arranque sin conexión." +MSG_OTHERSERVICES="Iniciar servicios complementarios del cliente." +MSG_POWEROFFCONF="Definir parámetros de ahorro de energía." + +# Mensajes del menú por defecto. +MSG_BOOT="Iniciar" +MSG_DUPLEX="Dúplex" +MSG_HOSTNAME="Equipo" +MSG_IPADDR="Dirección IP" +MSG_MACADDR="Dirección MAC" +MSG_MENUTITLE="Menú de opciones" +MSG_POWEROFF="Apagar el equipo" +MSG_SPEED="Velocidad" + +# Mensajes de descripción breve de las funciones de la API. +MSG_HELP_ogAclFilter="Extrae las acl de los ficheros de la diferencial" +MSG_HELP_ogAddCmd="Añade comandos al fichero creado por la función ogInstalMiniSetup." +MSG_HELP_ogAddRegistryKey="Añade una nueva clave al registro de Windows." +MSG_HELP_ogAddRegistryValue="Añade un nuevo valor al registro de Windows." +MSG_HELP_ogAddToLaunchDaemon="" +MSG_HELP_ogBoot="Arranca un sistema operativo instalado." +MSG_HELP_ogBootLoaderDeleteEntry="$MSG_DONTUSE." +MSG_HELP_ogBootLoaderHidePartitions="$MSG_DONTUSE." +MSG_HELP_ogBootMbrGeneric="" +MSG_HELP_ogBootMbrXP="" +MSG_HELP_ogBurgDefaultEntry="Configura la entrada por defecto de Burg." +MSG_HELP_ogBurgDeleteEntry="Borra en el Burg del MBR las entradas para el inicio en una particion." +MSG_HELP_ogBurgHidePartitions="Configura el Burg del MBR para que oculte las particiones de windows que no se esten iniciando. Permite definir una partición que no se ocultará (ej: para datos)." +MSG_HELP_ogBurgInstallMbr="Instala el gestor de arranque BURG en el MBR del primer disco duro" +MSG_HELP_ogBurgOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de Burg." +MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero." +MSG_HELP_ogCalculateFullChecksum="Calcula la suma de comprobación completa de un fichero." +MSG_HELP_ogChangeRepo="Cambia el repositorio para el recurso remoto images." +MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos." +MSG_HELP_ogCheckIpAddress="" +MSG_HELP_ogCheckProgram="" +MSG_HELP_ogCheckStringInGroup="" +MSG_HELP_ogCheckStringInReg="" +MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla." +MSG_HELP_ogCleanLinuxDevices="" +MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo." +MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros." +MSG_HELP_ogConfigureFstab="" +MSG_HELP_ogConfigureOgagent="Configura el nuevo agente OGAgent para sistemas operativos." +MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento." +MSG_HELP_ogCreateBootLoaderImage="" +MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco." +MSG_HELP_ogCreateDiskImage="Genera una imagen exacta de un disco completo." +MSG_HELP_ogCreateFileImage="Crea/redimensiona el archivo de la imagen sincronizada" +MSG_HELP_ogCreateGptPartitions="" +MSG_HELP_ogCreateImage="Genera una imagen exacta de un sistema operativo instalado localmente." +MSG_HELP_ogCreateImageSyntax="" +MSG_HELP_ogCreateInfoImage="Crea información del contenido de la imagen" +MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." +MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." +MSG_HELP_ogCreatePartitionTable="Genera una tabla de particiones en caso de que no sea valida." +MSG_HELP_ogCreateTorrent="" +MSG_HELP_ogCopyEfiBootLoader="Copia el cargador de arranque desde la partición EFI a la de sistema." +MSG_HELP_ogDeleteCache="Elimina la partición de caché local." +MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." +MSG_HELP_ogDeletePartitionTable="Elimina la tabla de particiones del disco" +MSG_HELP_ogDeleteRegistryKey="Borra una clave vacía del registro de Windows." +MSG_HELP_ogDeleteRegistryValue="Borra un valor del registro de Windows." +MSG_HELP_ogDeleteTree="Borra un árbol de directorios de un espacio de almacenamiento." +MSG_HELP_ogDevToDisk="Devuelve el nº de orden de disco o de partición correspondiente al camino del fichero de dispositivo." +MSG_HELP_ogDiskToDev="Devuelve el camino del fichero de dispositivo correspondiente al nº de orden de disco o de partición." +MSG_HELP_ogDomainScript="" +MSG_HELP_ogEcho="Muestra un mensaje en pantalla y permite registrarlo en fichero de log" +MSG_HELP_ogExecAndLog="Ejecuta un comando y registra su salida en fichero de log" +MSG_HELP_ogExtendFs="Extiende el tamaño de un sistema de archivo al máximo de su partición." +MSG_HELP_ogFindCache="Indica la partición reservada para caché local." +MSG_HELP_ogFixBootSector="" +MSG_HELP_ogFormatCache="Formatea (inicia) el sistema de caché local." +MSG_HELP_ogFormat="Formatea o reformatea un sistema de archivos." +MSG_HELP_ogFormatFs=$MSG_HELP_ogFormat +MSG_HELP_ogGetArch="Devuelve el tipo de arquitectura del cliente." +MSG_HELP_ogGetCacheSize="Devuelve el tamaño de la partición de caché local." +MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser reservado para la partición de caché local." +MSG_HELP_ogGetCaller="Devuelve el programa o función que llama al actual" +MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco." +MSG_HELP_ogGetDiskType="Devuelve el mnemónico de tipo de disco." +MSG_HELP_ogGetFreeSize="" +MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos." +MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos." +MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente." +MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente." +MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows." +MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local." +MSG_HELP_ogGetImageCompressor="Devuelve la herramienta de compresión de la imagen." +MSG_HELP_ogGetImageInfo="Muestra información sobre la imagen monolitica: clonacion:compresor:sistemaarchivos:tamañoKB." +MSG_HELP_ogGetImageProgram="Devuelve el programa usado para crear la imagen." +MSG_HELP_ogGetImageSize="Devuelve el tamaño de una imagen de sistema." +MSG_HELP_ogGetImageType="Devuelve el sistema de ficheros de la imagen." +MSG_HELP_ogGetIpAddress="Devuelve la dirección IP del cliente." +MSG_HELP_ogGetLastSector="Devuelve el último sector usable del disco o de una partición." +MSG_HELP_ogGetMacAddress="Devuelve la dirección Ethernet del cliente." +MSG_HELP_ogGetMountImageDir="Devuelve el directorio de montaje de una imagen." +MSG_HELP_ogGetMountPoint="Devuelve el directorio donde está montado un sistema de archivos local." +MSG_HELP_ogGetNetInterface="" +MSG_HELP_ogGetOsType="Devuelve el tipo de un sistema operativo instalado." +MSG_HELP_ogGetOsUuid="Devuelve el UUID de un sistema operativo" +MSG_HELP_ogGetOsVersion="Devuelve el tipo y la versión de un sistema operativo instalado." +MSG_HELP_ogGetParentPath="Devuelve el camino completo del directorio padre de un fichero de sistema OpenGnsys." +MSG_HELP_ogGetPartitionActive="Indica cual es la partición marcada como activa en un disco." +MSG_HELP_ogGetPartitionId="Devuelve el identificador de tipo de una partición." +MSG_HELP_ogGetPartitionSize="Devuelve el tamaño de una partición." +MSG_HELP_ogGetPartitionsNumber="Devuelve el número de particiones de un disco" +MSG_HELP_ogGetPartitionTableType="Devuelve el tipo de tabla de particiones del disco" +MSG_HELP_ogGetPartitionType="Devuelve el mnemónico de tipo de una partición." +MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnsys." +MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows." +MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." +MSG_HELP_ogGetSerialNumber="Devuelve el número de serie del equipo" +MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." +MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido." +MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgLive="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDefaultEntry="Configura la entrada por defecto de GRUB." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando. Permite definir una partición que no se ocultará (ej: para datos)." +MSG_HELP_ogGrubInstallMbr="Instala el gestor de arranque GRUB en el MBR del primer disco duro" +MSG_HELP_ogGrubInstallPartition="Instala el gestor de arranque GRUB en el BootSector" +MSG_HELP_ogGrubOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de GRUB." +MSG_HELP_ogGrubSecurity="Configura usuario y clave para modificar las entradas del menu del Grub." +MSG_HELP_ogGrubUefiConf="Genera el fichero grub.cfg de la partición EFI." +MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." +MSG_HELP_ogHidePartition="Oculta una partición de Windows." +MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." +MSG_HELP_ogInstallFirstBoot="Crea un archivo que se ejecutará en el primer arranque de Windows." +MSG_HELP_ogInstallLaunchDaemon="Instala un archivo que se ejecutará en el arranque de macOS." +MSG_HELP_ogInstallLinuxClient="$MSG_OBSOLETE." +MSG_HELP_ogInstallMiniSetup="Instala un archivo que se ejecutará en el arranque de Windows." +MSG_HELP_ogInstallRunonce="Crea archivo que se ejecutará en el inicio de un usuario administrador de Windows." +MSG_HELP_ogInstallWindowsClient="$MSG_OBSOLETE." +MSG_HELP_ogIsFormated="Comprueba si un sistema de archivos está formateado." +MSG_HELP_ogIsImageLocked="Comprueba si una imagen está bloqueada por una operación de uso exclusivo." +MSG_HELP_ogIsLocked="Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo." +MSG_HELP_ogIsDiskLocked="Comprueba si un disco está bloqueado por una operación de uso exclusivo." +MSG_HELP_ogIsMounted="Comprueba si un sistema de archivos está montado." +MSG_HELP_ogIsNewerFile="Comprueba si un fichero es más nuevo (se ha modificado después) que otro." +MSG_HELP_ogIsPartitionLocked=$MSG_HELP_ogIsLocked +MSG_HELP_ogIsRepoLocked="" +MSG_HELP_ogIsSyncImage="Comprueba si la imagen es sincronizable." +MSG_HELP_ogIsVirtualMachine="Comprueba si el cliente es una máquina virtual" +MSG_HELP_ogIsWritable="Comprueba si un sistema de archivos está montado con permiso de escritura." +MSG_HELP_ogLinuxBootParameters="Devuelve los parámetros de arranque de un sistema operativo Linux instalado." +MSG_HELP_ogListHardwareInfo="Lista el inventario de dispositivos del cliente." +MSG_HELP_ogListLogicalPartitions="Lista las particiones lógicas de un disco" +MSG_HELP_ogListPartitions="Lista la estructura de particiones de un disco." +MSG_HELP_ogListPrimaryPartitions="Lista las particiones primarias de un disco" +MSG_HELP_ogListRegistryKeys="Lista los nombres de las subclaves incluidas en una clave del registro de Windows." +MSG_HELP_ogListRegistryValues="Lista los nombres de los valores incluidos en una clave del registro de Windows." +MSG_HELP_ogListSoftware="Lista el inventario de programas instalados en un sistema operativo." +MSG_HELP_ogLock="Bloquea una partición para operación de uso exclusivo." +MSG_HELP_ogLockDisk="Bloquea un disco para operación de uso exclusivo." +MSG_HELP_ogLockImage="Bloquea una imagen para operación de uso exclusivo." +MSG_HELP_ogLockPartition=$MSG_HELP_ogLock +MSG_HELP_ogMakeChecksumFile="Almacena la suma de comprobación de un fichero." +MSG_HELP_ogMakeDir="Crea un directorio para OpenGnsys." +MSG_HELP_ogMakeGroupDir="Crea el directorio de grupo (aula) en un repositorio." +MSG_HELP_ogMcastReceiverFile="" +MSG_HELP_ogMcastReceiverPartition="" +MSG_HELP_ogMcastRequest="" +MSG_HELP_ogMcastSendFile="" +MSG_HELP_ogMcastSendPartition="" +MSG_HELP_ogMcastSyntax="" +MSG_HELP_ogMountCache="Monta el sistema de archivos dedicado a caché local." +MSG_HELP_ogMountCdrom="Monta dispositivo óptico por defecto." +MSG_HELP_ogMountFs=$MSG_HELP_ogMount +MSG_HELP_ogMountImage="Monta una imagen sincronizable" +MSG_HELP_ogMount="Monta un sistema de archivos y devuelve el punto de montaje." +MSG_HELP_ogNvramActiveEntry="Configura a activa entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramAddEntry="Crea nueva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramDeleteEntry="Borra entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetCurrent="Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo." +MSG_HELP_ogNvramGetNext="Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque." +MSG_HELP_ogNvramGetOrder="Muestra el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramGetTimeout="Muestra el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramInactiveEntry="Configura a inactiva entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramList="Lista las entradas del gestor de arranque (NVRAN) marcando con un asterisco las activas" +MSG_HELP_ogNvramPxeFirstEntry="Configura la tarjeta de red como primer arranque en la NVRAM." +MSG_HELP_ogNvramSetNext="Configura el próximo arranque con la entrada del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetOrder="Configura el orden de las entradas del gestor de arranque (NVRAM)." +MSG_HELP_ogNvramSetTimeout="Configura el tiempo de espera del gestor de arranque (NVRAM)." +MSG_HELP_ogRaiseError="Muestra y registra mensajes de error y devuelve el código correspondiente." +MSG_HELP_ogReduceFs="Reduce el tamaño del sistema de archivos al mínimo ocupado por sus datos." +MSG_HELP_ogReduceImage="Reduce el tamaño de la imagen" +MSG_HELP_ogRefindDeleteEntry="Borra en rEFInd las entradas para el inicio en una particion." +MSG_HELP_ogRefindDefaultEntry="Configura la entrada por defecto de rEFInd." +MSG_HELP_ogRefindOgliveDefaultEntry="Configura la entrada de ogLive como la entrada por defecto de rEFInd." +MSG_HELP_ogRefindSetTheme="Asigna un tema al rEFInd." +MSG_HELP_ogRefindSetTimeOut="Define el tiempo (segundos) que se muestran las opciones de inicio de rEFInd." +MSG_HELP_ogRefindSetResolution="Define la resolución que usuará el thema del gestor de arranque rEFInd." +MSG_HELP_ogRefindInstall="Instala y configura el gestor rEFInd en la particion EFI" +MSG_HELP_ogRestoreAclImage="Restaura las ACL de Windows (La informacion debe estar copiada en /tmp)." +MSG_HELP_ogRestoreBootLoaderImage="" +MSG_HELP_ogRestoreDiskImage="Restaura una imagen de un disco completo." +MSG_HELP_ogRestoreEfiBootLoader="Copia el cargador de arranque de la partición de sistema a la partición EFI." +MSG_HELP_ogRestoreImage="Restaura una imagen de sistema operativo." +MSG_HELP_ogRestoreInfoImage="Restablece información del sistema: ACL y enlaces simbolicos" +MSG_HELP_ogRestoreMbrImage="Restaura una imagen del sector de arranque (MBR)." +MSG_HELP_ogRestoreUuidPartitions="Restaura los uuid de las particiones y la tabla de particiones." +MSG_HELP_ogSaveImageInfo="Crea un fichero con la información de la imagen." +MSG_HELP_ogSetLinuxName="" +MSG_HELP_ogSetPartitionActive="Establece el número de partición activa de un disco." +MSG_HELP_ogSetPartitionId="Modifica el tipo de una partición física usando el mnemónico del tipo." +MSG_HELP_ogSetPartitionSize="Establece el tamaño de una partición." +MSG_HELP_ogSetPartitionType="Modifica el identificador de tipo de una partición física." +MSG_HELP_ogSetRegistryValue="Asigna un dato a un valor del registro de Windows." +MSG_HELP_ogSetWindowsName="Asigna el nombre del cliente en el registro de Windows." +MSG_HELP_ogSetWinlogonUser="Asigna el nombre de usuario por defecto para el gestor de entrada de Windows." +MSG_HELP_ogSyncCreate="Sincroniza los datos de la partición a la imagen" +MSG_HELP_ogSyncRestore="Sincroniza los datos de la imagen a la partición" +MSG_HELP_ogTorrentStart="" +MSG_HELP_ogTypeToId="Devuelve el identificador asociado al mnemónico de tipo de partición." +MSG_HELP_ogUcastReceiverPartition="" +MSG_HELP_ogUcastSendFile="" +MSG_HELP_ogUcastSendPartition="" +MSG_HELP_ogUcastSyntax="" +MSG_HELP_ogUnhidePartition="Hace visible una partición de Windows." +MSG_HELP_ogUninstallLinuxClient="Desinstala el antiguo cliente OpenGnSys en un sistema operativo Linux." +MSG_HELP_ogUninstallWindowsClient="Desinstala el antiguo cliente OpenGnSys en un sistema operativo Windows." +MSG_HELP_ogUnlock="Desbloquea una partición tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockDisk="Desbloquea un disco tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockImage="Desbloquea una imagen tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockPartition=$MSG_HELP_ogUnlock +MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos." +MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local." +MSG_HELP_ogUnmount="Desmonta un sistema de archivos." +MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount +MSG_HELP_ogUnmountImage="Desmonta la imagen." +MSG_HELP_ogUnsetDirtyBit="" +MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." +MSG_HELP_ogUpdatePartitionTable="Actualiza información de la tabla de particiones del disco." +MSG_HELP_ogUuidChange="Reemplaza el UUID de un sistema de ficheros." +MSG_HELP_ogWaitSyncImage="" +MSG_HELP_ogWindowsBootParameters="" +MSG_HELP_ogWindowsRegisterPartition="" + +# Scripts +MSG_HELP_configureOs="Post-configura de arranque del sistema" +MSG_HELP_createBaseImage="Genera imagen básica de la partición" +MSG_HELP_createDiffImage="Genera imagen diferencial de la partición respecto a la imagen básica" +MSG_HELP_installOfflineMode="Prepara el equipo cliente para el modo offline." +MSG_HELP_partclone2sync="Convierte imagen de partclone en imagen sincronizable." +MSG_HELP_restoreBaseImage="Restaura una imagen básica en una partición" +MSG_HELP_restoreDiffImage="Restaura una imagen diferencial en una partición" +MSG_HELP_updateCache="Realiza la actualización de la caché" + +# Mensajes de descripción breve de la interfaz. +MSG_INTERFACE_START="[START Interface] Ejecutar comando: " +MSG_INTERFACE_END="[END Interface] Comando terminado con este código: " + +# Mensajes de scripts. +MSG_SCRIPTS_START=" INICIO scripts: " +MSG_SCRIPTS_END=" FIN scripts: " +MSG_SCRIPTS_TASK_END="Fin de la tarea" + +MSG_SCRIPTS_TASK_SLEEP="Esperando para iniciar" +MSG_SCRIPTS_TASK_START="Iniciando" +MSG_SCRIPTS_TASK_ERR="Error" + +# Script createImage. +MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: " +MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: " + +# Script updateCache. +MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobar si es necesario actualizar el fichero imagen " +MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la caché es mayor que el fichero a descargar." +# Script updateCache: para las imágenes sincronizadas tipo dir. +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calcular el tamaño de la imagen." +MSG_SCRIPTS_UPDATECACHE_CHECKSIZEIMG="Comprobar si la imagen del repositorio es mayor que la de la caché." +MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO="Comprobar el espacio libre de la caché y actuar según engine.cfg" + +MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION="Comprobando sesión Multicast: ServidorMcast:PuertoDatos" + +# interface sustituye temporalmente al scritp restore +MSG_SCRIPTS_CHECK_ENGINE="Analizar proceso a realizar según engine.cfg" +MSG_SCRIPTS_MULTICAST_PRECHECK_PORT="Determinar puerto principal y auxiliar Multicast." +MSG_SCRIPTS_MULTICAST_CHECK_PORT="Comprobar puertos de sesión y datos" +MSG_SCRIPTS_MULTICAST_REQUEST_PORT="Solicitar la apertura: " +MSG_SCRIPTS_OS_CONFIGURE="Iniciar la configuración del sistema restaurado" + +# TIME MESSAGES +MSG_SCRIPTS_TIME_TOTAL="tiempo total del proceso" +MSG_SCRIPTS_TIME_PARTIAL="tiempo parcial del subproceso" + +# HTTPLOG +MSG_HTTPLOG_NOUSE="No apague este ordenador por favor" + +# Mensajes sincronizadas +MSG_SYNC_RESIZE="Redimensiona la imagen al tamaño necesario" +MSG_SYNC_RESTORE="Trae el listado ficheros y baja la imagen" +MSG_SYNC_DELETE="Diferencial: Borra archivos antiguos" +MSG_SYNC_SLEEP="Espera que se monte/reduzca la imagen" +# Mensajes sincronizadas complementarios a errores +MSG_SYNC_DIFFERENTFS="El sistema de ficheros de destino no coincide con el de la imagen" +MSG_SYNC_EXTENSION="Las extensiones de la imagenes deben ser img o diff" +MSG_SYNC_NOCHECK="La imagen esta montada por otro proceso, no podemos comprobarla" + +MSG_RESTORE="Restaura la imagen en" + diff --git a/ogclient/etc/preinit/default.sh b/ogclient/etc/preinit/default.sh new file mode 100755 index 0000000..e5d1d0b --- /dev/null +++ b/ogclient/etc/preinit/default.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Cargar entorno de OpenGnsys +set -a +source /opt/opengnsys/etc/preinit/loadenviron.sh + +# Scripts de inicio. +for f in fileslinks loadmodules metadevs mountrepo poweroff otherservices; do + $OGETC/preinit/$f.sh +done +unset f + +if [ -f $OGETC/init/$IPV4ADDR.sh ]; then + $OGETC/init/$OG_IP.sh + +elif [ -f $OGETC/init/$OGGROUP.sh ]; then + $OGETC/init/$OGGROUP.sh + +elif [ -f $OGETC/init/default.sh ]; then + $OGETC/init/default.sh + +else + echo "No se ha encontrado script de inicio" + halt +fi diff --git a/ogclient/etc/preinit/fileslinks.sh b/ogclient/etc/preinit/fileslinks.sh new file mode 100755 index 0000000..826282d --- /dev/null +++ b/ogclient/etc/preinit/fileslinks.sh @@ -0,0 +1,53 @@ +#!/bin/bash +#/** +#@file fileslinks.sh +#@brief Script de inicio para copiar ficheros y deinir enlaces simbólicos. +#@warning License: GNU GPLv3+ +#@version 0.9 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-10 +#@version 1.0.5 - Enlace para librería libmac (obsoleto en versión 1.1.1). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-28 +#@version 1.1.2 - Autenticación con clave pública para SSH +#@author Irina Gómez, ETSII Universidad de Sevilla +#@date 2019-09-25 +#*/ + + +# Si está configurado OpenGnsys ... +if [ -n "$OPENGNSYS" ]; then + echo "${MSG_MAKELINKS:-.}" + + # Shell BASH por defecto (para usar "runtest") + ln -fs /bin/bash /bin/sh 2>/dev/null + + # Crear directorio de bloqueos + mkdir -p /var/lock 2>/dev/null || mkdir -p /run/lock + + # Crear ficheros temporales. + touch $OGLOGCOMMAND $OGLOGCOMMAND.tmp $OGLOGSESSION /tmp/menu.tmp + chmod 777 $OGLOGCOMMAND $OGLOGCOMMAND.tmp $OGLOGSESSION /tmp/menu.tmp + + # Enlaces para Qt Embeded. + QTDIR="/usr/local" + mkdir -p $QTDIR/{etc,lib,plugins} + for i in $OGLIB/qtlib/* $OGLIB/fonts; do + [ -f $QTDIR/lib/$i ] || ln -fs $i $QTDIR/lib 2>/dev/null + done + for i in $OGLIB/qtplugins/*; do + [ -f $QTDIR/plugins/$i ] || ln -fs $i $QTDIR/plugins 2>/dev/null + done + for i in $OGETC/*.qmap; do + [ -f $QTDIR/etc/$i ] || ln -fs $i $QTDIR/etc 2>/dev/null + done + + # Autenticación con clave pública para SSH + [ -f /scripts/ssl/authorized_keys ] && cp /scripts/ssl/* /root/.ssh + +else + # FIXME Error: entorno de OpenGnsys no configurado. + echo "Error: OpenGnsys environment is not configured." # FIXME: definir mensaje. + exit 1 +fi + diff --git a/ogclient/etc/preinit/loadenviron.sh b/ogclient/etc/preinit/loadenviron.sh new file mode 100755 index 0000000..1687823 --- /dev/null +++ b/ogclient/etc/preinit/loadenviron.sh @@ -0,0 +1,150 @@ +#!/bin/bash +#/** +#@file loadenviron.sh +#@brief Script de carga de la API de funciones de OpenGnsys. +#@warning License: GNU GPLv3+ +#@version 0.9 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-10 +#@version 1.0.3 - Limpiar código y configuración modo off-line +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-01-12 +#@version 1.0.5 - Compatibilidad para usar proxy y servidor DNS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-04-23 +#*/ + +# Idioma por defecto. +export LANG="${LANG:-es_ES}" +locale-gen $LANG + +# Directorios del proyecto OpenGnsys. +export OPENGNSYS="${OPENGNSYS:-/opt/opengnsys}" +if [ -d $OPENGNSYS ]; then + export OGBIN=$OPENGNSYS/bin + export OGETC=$OPENGNSYS/etc + export OGLIB=$OPENGNSYS/lib + export OGAPI=$OGLIB/engine/bin + export OGPYFUNCS=$OPENGNSYS/functions + export OGSCRIPTS=$OPENGNSYS/scripts + export OGIMG=$OPENGNSYS/images + export OGCAC=$OPENGNSYS/cache + export OGLOG=$OPENGNSYS/log + + export PATH=$OGSCRIPTS:$OGPYFUNCS:$OGBIN:$PATH:/opt/oglive/rootfs/opt/drbl/sbin + export PYTHONPATH=$OPENGNSYS/lib/python3 + + # Exportar parámetros del kernel. + for i in $(cat /proc/cmdline); do + echo $i | grep -q "=" && export $i + done + + # Cargar sysctls + sysctl -p &>/dev/null + + # Cargar fichero de idioma. + LANGFILE=$OGETC/lang.${LANG%@*}.conf + if [ -f $LANGFILE ]; then + source $LANGFILE + for i in $(awk -F= '{if (NF==2) print $1}' $LANGFILE); do + export $i + done + fi + # Mensaje de carga del entorno. + echo "${MSG_LOADAPI:-.}" + + # Cargar mapa de teclado. + loadkeys ${LANG%_*} >/dev/null + + # Cargar API de funciones. + for i in $OGAPI/*.lib; do + source $i + done + + for i in $(typeset -F | cut -f3 -d" "); do + export -f $i + done + + # Cargar configuración del engine. + [ -f ${OGETC}/engine.cfg ] && source ${OGETC}/engine.cfg + export OGLOGCOMMAND=${OGLOGCOMMAND:-/tmp/command.log} + export OGLOGSESSION=${OGLOGSESSION:-/tmp/session.log} + + # Cargar las APIs según engine. + if [ -n "$ogengine" ]; then + for i in $OGAPI/*.$ogengine; do + [ -f $i ] && source $i + done + fi + + # Configuración de la red (modo offline). + eval $(grep "^DEVICECFG=" /tmp/initrd.cfg 2>/dev/null) + if [ -n "$DEVICECFG" ]; then + export DEVICECFG + [ -f $DEVICECFG ] && source $DEVICECFG + fi + + # FIXME Pruebas para grupos de ordenadores + export OGGROUP="$group" + + ROOTREPO=${ROOTREPO:-"$OGSERVERIMAGES"} + + # Fichero de registros. + export OGLOGFILE="$OGLOG/$(ogGetIpAddress).log" +fi + +# Compatibilidad para usar proxy en clientes ogLive. +[ -z "$http_proxy" -a -n "$ogproxy" ] && export http_proxy="$ogproxy" + +# Compatibilidad para usar servidor DNS en clientes ogLive. +if [ ! -f /run/resolvconf/resolv.conf -a -n "$ogdns" ]; then + mkdir -p /run/resolvconf + echo "nameserver $ogdns" > /run/resolvconf/resolv.conf +fi + +# Declaración de códigos de error. +export OG_ERR_FORMAT=1 # Formato de ejecución incorrecto. +export OG_ERR_NOTFOUND=2 # Fichero o dispositivo no encontrado. +export OG_ERR_PARTITION=3 # Error en partición de disco. +export OG_ERR_LOCKED=4 # Partición o fichero bloqueado. +export OG_ERR_IMAGE=5 # Error al crear o restaurar una imagen. +export OG_ERR_NOTOS=6 # Sin sistema operativo. +export OG_ERR_NOTEXEC=7 # Programa o función no ejecutable. +# Códigos 8-13 reservados por ogAdmClient.h +export OG_ERR_NOTWRITE=14 # No hay acceso de escritura +export OG_ERR_NOTCACHE=15 # No hay particion cache en cliente +export OG_ERR_CACHESIZE=16 # No hay espacio en la cache para almacenar fichero-imagen +export OG_ERR_REDUCEFS=17 # Error al reducir sistema archivos +export OG_ERR_EXTENDFS=18 # Error al expandir el sistema de archivos +export OG_ERR_OUTOFLIMIT=19 # Valor fuera de rango o no válido. +export OG_ERR_FILESYS=20 # Sistema de archivos desconocido o no se puede montar +export OG_ERR_CACHE=21 # Error en partición de caché local +export OG_ERR_NOGPT=22 # El disco indicado no contiene una particion GPT +export OG_ERR_REPO=23 # Error al montar el repositorio de imagenes +export OG_ERR_NOMSDOS=24 # El disco indicado no contienen una particion MSDOS + +export OG_ERR_IMGSIZEPARTITION=30 # Error al restaurar partición más pequeña que la imagen +export OG_ERR_UPDATECACHE=31 # Error al realizar el comando updateCache +export OG_ERR_DONTFORMAT=32 # Error al formatear +export OG_ERR_IMAGEFILE=33 # Archivo de imagen corrupto o de otra versión de $IMGPROG +export OG_ERR_GENERIC=40 # Error imprevisto no definido +export OG_ERR_UCASTSYNTAXT=50 # Error en la generación de sintaxis de transferenica UNICAST +export OG_ERR_UCASTSENDPARTITION=51 # Error en envío UNICAST de partición +export OG_ERR_UCASTSENDFILE=52 # Error en envío UNICAST de un fichero +export OG_ERR_UCASTRECEIVERPARTITION=53 # Error en la recepcion UNICAST de una particion +export OG_ERR_UCASTRECEIVERFILE=54 # Error en la recepcion UNICAST de un fichero +export OG_ERR_MCASTSYNTAXT=55 # Error en la generacion de sintaxis de transferenica Multicast. +export OG_ERR_MCASTSENDFILE=56 # Error en envio MULTICAST de un fichero +export OG_ERR_MCASTRECEIVERFILE=57 # Error en la recepcion MULTICAST de un fichero +export OG_ERR_MCASTSENDPARTITION=58 # Error en envio MULTICAST de una particion +export OG_ERR_MCASTRECEIVERPARTITION=59 # Error en la recepcion MULTICAST de una particion +export OG_ERR_PROTOCOLJOINMASTER=60 # Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER + +export OG_ERR_DONTMOUNT_IMAGE=70 # Error al montar una imagen sincronizada. +export OG_ERR_DONTSYNC_IMAGE=71 # Imagen no sincronizable (es monolitica) +export OG_ERR_DONTUNMOUNT_IMAGE=72 # Error al desmontar la imagen +export OG_ERR_NOTDIFFERENT=73 # No se detectan diferencias entre la imagen basica y la particion. +export OG_ERR_SYNCHRONIZING=74 # Error al sincronizar, puede afectar la creacion/restauracion de la imagen + +export OG_ERR_NOTUEFI=80 # La interfaz UEFI no está activa +export OG_ERR_NOTBIOS=81 # La interfaz BIOS legacy no está activa diff --git a/ogclient/etc/preinit/loadmodules.sh b/ogclient/etc/preinit/loadmodules.sh new file mode 100755 index 0000000..ded3539 --- /dev/null +++ b/ogclient/etc/preinit/loadmodules.sh @@ -0,0 +1,23 @@ +#!/bin/bash +#/** +#@file loadmodules.sh +#@brief Script de inicio para cargar módulos complementarios del kernel. +#@version 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-01-26 +#@version 1.0.5 - Cargar módulos específicos para el cliente. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-11-11 +#*/ + + +echo "${MSG_LOADMODULES:-.}" + +# Módulo del ratón. +modprobe psmouse 2>/dev/null + +# Cargar módulos específicos del kernel del cliente. +for m in $OGLIB/modules/$(uname -r)/*.ko; do + [ -r $m ] && insmod $m &>/dev/null +done + diff --git a/ogclient/etc/preinit/metadevs.sh b/ogclient/etc/preinit/metadevs.sh new file mode 100755 index 0000000..e2454c5 --- /dev/null +++ b/ogclient/etc/preinit/metadevs.sh @@ -0,0 +1,28 @@ +#!/bin/bash +#/** +#@file metadevs.sh +#@brief Script de inicio para detectar metadispositivos LVM y RAID. +#@note Desglose del script "loadenviron.sh". +#@warning License: GNU GPLv3+ +#@version 0.9 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-10 +#@version 0.9.4 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-04-19 +#*/ + + +# Si está configurado OpenGnsys ... +if [ -n "$OPENGNSYS" ]; then + echo "$MSG_DETECTLVMRAID" + # Detectar metadispositivos LVM. + vgchange -ay &>/dev/null + # Detectar metadispositivos RAID. + dmraid -ay &>/dev/null +else + # FIXME Error: entorno de OpenGnsys no configurado. + echo "Error: OpenGnsys environment is not configured." # FIXME: definir mensaje. + exit 1 +fi + diff --git a/ogclient/etc/preinit/mountrepo.sh b/ogclient/etc/preinit/mountrepo.sh new file mode 100755 index 0000000..e1c18fe --- /dev/null +++ b/ogclient/etc/preinit/mountrepo.sh @@ -0,0 +1,54 @@ +#!/bin/bash +#/** +#@file mountrepo.sh +#@brief Script para montar el repositorio de datos remoto. +#@warning License: GNU GPLv3+ +#@version 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-03-17 +#*/ + +OGIMG=${OGIMG:-/opt/opengnsys/images} +ROOTREPO=${ROOTREPO:-"$ROOTSERVER"} + +# TODO Revisar proceso de arranque para no montar 2 veces el repositorio. +if [ "$ogactiveadmin" == "true" ]; then + export boot=admin # ATENCIÓN: siempre en modo "admin". + umount $OGIMG 2>/dev/null + + protocol=${ogprotocol:-"smb"} + [ "$ogunit" != "" ] && OGUNIT="/$ogunit" + printf "$MSG_MOUNTREPO\n" "$protocol" "$boot" + case "$ogprotocol" in + nfs) mount.nfs ${ROOTREPO}:$OGIMG$OGUNIT $OGIMG -o rw,nolock ;; + smb) PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') + PASS=${PASS:-"og"} + mount.cifs //${ROOTREPO}/ogimages$OGUNIT $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS + ;; + local) # TODO: hacer funcion dentro de este script que monte smb + # Comprobamos que estatus sea online. + if [ "$ogstatus" == "offline" -o "$SERVER" == "" ]; then + # Si estatus es offline buscamos un dispositivo con etiqueta repo + # y si no existe montamos la cache como repo (si existe). + TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \") + if [ "$TYPE" == "" ]; then + [ -d $OGCAC/$OGIMG ] && mount --bind $OGCAC/$OGIMG $OGIMG + else + mount -t $TYPE LABEL=REPO $OGIMG &>/dev/null + fi + else + # Comprobamos que existe un servicio de samba. + smbclient -L $SERVER -N &>/dev/null + if [ $? -eq 0 ]; then + PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') + PASS=${PASS:-"og"} + mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS + fi + # TODO: buscar condicion para NFS + fi + ;; + esac +fi + diff --git a/ogclient/etc/preinit/otherservices.sh b/ogclient/etc/preinit/otherservices.sh new file mode 100755 index 0000000..bc5de62 --- /dev/null +++ b/ogclient/etc/preinit/otherservices.sh @@ -0,0 +1,38 @@ +#!/bin/bash +#/** +#@file otherservices.sh +#@brief Script de inicio para cargar otros servicios complementarios. +#@version 1.0.3 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-01-12 +#*/ + +# Montar efivar filesystem +ogIsEfiActive && mount -t efivarfs none /sys/firmware/efi/efivars + +# Lanzar servicios complementarios del cliente. +echo "${MSG_OTHERSERVICES:-.}" + +# Iniciar rsyslog, si es necesario. +[ -S /dev/log ] || service rsyslog start + +# Adpatar la clave de "root" para acceso SSH. +PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') +PASS=${PASS:-"og"} +echo -ne "$PASS\n$PASS\n" | passwd root 2>/dev/null +# Cargar el entorno OpenGnsys en conexión SSH. +cp -a $OPENGNSYS/etc/preinit/loadenviron.sh /etc/profile.d/ +# Arrancar SSH. +/etc/init.d/ssh start &>/dev/null + +# Desactivado apagado de monitor. +#setterm -blank 0 -powersave off -powerdown 0 < /dev/console > /dev/console 2>&1 + +# Activado WOL en la interfaz usada en arranque PXE. +ethtool -s $DEVICE wol g 2>/dev/null + +# TODO Localizar correctamente el script de arranque. +[ -f /opt/opengnsys/scripts/runhttplog.sh ] && /opt/opengnsys/scripts/runhttplog.sh 2>/dev/null + + diff --git a/ogclient/etc/preinit/poweroff.sh b/ogclient/etc/preinit/poweroff.sh new file mode 100755 index 0000000..f5f9f98 --- /dev/null +++ b/ogclient/etc/preinit/poweroff.sh @@ -0,0 +1,40 @@ +#!/bin/bash +#/** +#@file poweroff.sh +#@brief Script de inicio para cargar el proceso comprobación de clientes inactivos. +#@note Arranca y configura el proceso "cron". +#@warning License: GNU GPLv3+ +#@version 1.0.2 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-10-25 +#*/ + + +# Si está configurado OpenGnsys ... +if [ -n "$OPENGNSYS" ]; then + echo "${MSG_POWEROFFCONF:-.}" + + # Sincronización horaria con servidor NTP. + [ -n "$ogntp" -a "$status" != "offline" ] && ntpdate $ogntp + + # Crear fichero de configuración por defecto (30 min. de espera). + POWEROFFCONF=/etc/poweroff.conf + cat << FIN > $POWEROFFCONF +POWEROFFSLEEP=30 +POWEROFFTIME= +FIN + # Incluir zona horaria en el fichero de configuración. + awk 'BEGIN {RS=" "} /^TZ=/ {print}' /proc/cmdline >> $POWEROFFCONF + + # Lanzar el proceso "cron". + cron -l + + # Definir la "crontab" lanzando el proceso de comprobación cada minuto. + echo "* * * * * [ -x $OGBIN/poweroffconf ] && $OGBIN/poweroffconf" | crontab - + +else + # FIXME Error: entorno de OpenGnsys no configurado. + echo "Error: OpenGnsys environment is not configured." # FIXME: definir mensaje. + exit 1 +fi + diff --git a/client/shared/functions/ogAddCmd b/ogclient/functions/ogAddCmd similarity index 100% rename from client/shared/functions/ogAddCmd rename to ogclient/functions/ogAddCmd diff --git a/client/shared/functions/ogAddRegistryKey b/ogclient/functions/ogAddRegistryKey similarity index 100% rename from client/shared/functions/ogAddRegistryKey rename to ogclient/functions/ogAddRegistryKey diff --git a/client/shared/functions/ogAddRegistryValue b/ogclient/functions/ogAddRegistryValue similarity index 100% rename from client/shared/functions/ogAddRegistryValue rename to ogclient/functions/ogAddRegistryValue diff --git a/client/shared/functions/ogCalculateChecksum b/ogclient/functions/ogCalculateChecksum similarity index 100% rename from client/shared/functions/ogCalculateChecksum rename to ogclient/functions/ogCalculateChecksum diff --git a/client/shared/functions/ogCalculateFullChecksum b/ogclient/functions/ogCalculateFullChecksum similarity index 100% rename from client/shared/functions/ogCalculateFullChecksum rename to ogclient/functions/ogCalculateFullChecksum diff --git a/client/shared/functions/ogChangeRepo b/ogclient/functions/ogChangeRepo similarity index 100% rename from client/shared/functions/ogChangeRepo rename to ogclient/functions/ogChangeRepo diff --git a/client/shared/functions/ogCheckFs b/ogclient/functions/ogCheckFs similarity index 100% rename from client/shared/functions/ogCheckFs rename to ogclient/functions/ogCheckFs diff --git a/client/shared/functions/ogCheckIpAddress b/ogclient/functions/ogCheckIpAddress similarity index 100% rename from client/shared/functions/ogCheckIpAddress rename to ogclient/functions/ogCheckIpAddress diff --git a/client/shared/functions/ogCleanLinuxDevices b/ogclient/functions/ogCleanLinuxDevices similarity index 100% rename from client/shared/functions/ogCleanLinuxDevices rename to ogclient/functions/ogCleanLinuxDevices diff --git a/client/shared/functions/ogCleanOs b/ogclient/functions/ogCleanOs similarity index 100% rename from client/shared/functions/ogCleanOs rename to ogclient/functions/ogCleanOs diff --git a/client/shared/functions/ogConfigureFstab b/ogclient/functions/ogConfigureFstab similarity index 100% rename from client/shared/functions/ogConfigureFstab rename to ogclient/functions/ogConfigureFstab diff --git a/client/shared/functions/ogConfigureOgagent b/ogclient/functions/ogConfigureOgagent similarity index 100% rename from client/shared/functions/ogConfigureOgagent rename to ogclient/functions/ogConfigureOgagent diff --git a/client/shared/functions/ogCopyEfiBootLoader b/ogclient/functions/ogCopyEfiBootLoader similarity index 100% rename from client/shared/functions/ogCopyEfiBootLoader rename to ogclient/functions/ogCopyEfiBootLoader diff --git a/client/shared/functions/ogCopyFile b/ogclient/functions/ogCopyFile similarity index 100% rename from client/shared/functions/ogCopyFile rename to ogclient/functions/ogCopyFile diff --git a/client/shared/functions/ogCreateCache b/ogclient/functions/ogCreateCache similarity index 100% rename from client/shared/functions/ogCreateCache rename to ogclient/functions/ogCreateCache diff --git a/client/shared/functions/ogCreateGptPartitions b/ogclient/functions/ogCreateGptPartitions similarity index 100% rename from client/shared/functions/ogCreateGptPartitions rename to ogclient/functions/ogCreateGptPartitions diff --git a/client/shared/functions/ogCreateImage b/ogclient/functions/ogCreateImage similarity index 100% rename from client/shared/functions/ogCreateImage rename to ogclient/functions/ogCreateImage diff --git a/client/shared/functions/ogCreateImageSyntax b/ogclient/functions/ogCreateImageSyntax similarity index 100% rename from client/shared/functions/ogCreateImageSyntax rename to ogclient/functions/ogCreateImageSyntax diff --git a/client/shared/functions/ogCreatePartitionTable b/ogclient/functions/ogCreatePartitionTable similarity index 100% rename from client/shared/functions/ogCreatePartitionTable rename to ogclient/functions/ogCreatePartitionTable diff --git a/client/shared/functions/ogCreatePartitions b/ogclient/functions/ogCreatePartitions similarity index 100% rename from client/shared/functions/ogCreatePartitions rename to ogclient/functions/ogCreatePartitions diff --git a/client/shared/functions/ogCreateTorrent b/ogclient/functions/ogCreateTorrent similarity index 100% rename from client/shared/functions/ogCreateTorrent rename to ogclient/functions/ogCreateTorrent diff --git a/client/shared/functions/ogDeleteCache b/ogclient/functions/ogDeleteCache similarity index 100% rename from client/shared/functions/ogDeleteCache rename to ogclient/functions/ogDeleteCache diff --git a/client/shared/functions/ogDeleteFile b/ogclient/functions/ogDeleteFile similarity index 100% rename from client/shared/functions/ogDeleteFile rename to ogclient/functions/ogDeleteFile diff --git a/client/shared/functions/ogDeletePartitionTable b/ogclient/functions/ogDeletePartitionTable similarity index 100% rename from client/shared/functions/ogDeletePartitionTable rename to ogclient/functions/ogDeletePartitionTable diff --git a/client/shared/functions/ogDeleteRegistryKey b/ogclient/functions/ogDeleteRegistryKey similarity index 100% rename from client/shared/functions/ogDeleteRegistryKey rename to ogclient/functions/ogDeleteRegistryKey diff --git a/client/shared/functions/ogDeleteRegistryValue b/ogclient/functions/ogDeleteRegistryValue similarity index 100% rename from client/shared/functions/ogDeleteRegistryValue rename to ogclient/functions/ogDeleteRegistryValue diff --git a/client/shared/functions/ogDeleteTree b/ogclient/functions/ogDeleteTree similarity index 100% rename from client/shared/functions/ogDeleteTree rename to ogclient/functions/ogDeleteTree diff --git a/client/shared/functions/ogDevToDisk b/ogclient/functions/ogDevToDisk similarity index 100% rename from client/shared/functions/ogDevToDisk rename to ogclient/functions/ogDevToDisk diff --git a/client/shared/functions/ogDiskToDev b/ogclient/functions/ogDiskToDev similarity index 100% rename from client/shared/functions/ogDiskToDev rename to ogclient/functions/ogDiskToDev diff --git a/client/shared/functions/ogEcho b/ogclient/functions/ogEcho similarity index 100% rename from client/shared/functions/ogEcho rename to ogclient/functions/ogEcho diff --git a/client/shared/functions/ogExecAndLog b/ogclient/functions/ogExecAndLog similarity index 100% rename from client/shared/functions/ogExecAndLog rename to ogclient/functions/ogExecAndLog diff --git a/client/shared/functions/ogExtendFs b/ogclient/functions/ogExtendFs similarity index 100% rename from client/shared/functions/ogExtendFs rename to ogclient/functions/ogExtendFs diff --git a/client/shared/functions/ogFindCache b/ogclient/functions/ogFindCache similarity index 100% rename from client/shared/functions/ogFindCache rename to ogclient/functions/ogFindCache diff --git a/client/shared/functions/ogFixBootSector b/ogclient/functions/ogFixBootSector similarity index 100% rename from client/shared/functions/ogFixBootSector rename to ogclient/functions/ogFixBootSector diff --git a/client/shared/functions/ogFormat b/ogclient/functions/ogFormat similarity index 100% rename from client/shared/functions/ogFormat rename to ogclient/functions/ogFormat diff --git a/client/shared/functions/ogFormatCache b/ogclient/functions/ogFormatCache similarity index 100% rename from client/shared/functions/ogFormatCache rename to ogclient/functions/ogFormatCache diff --git a/client/shared/functions/ogFormatFs b/ogclient/functions/ogFormatFs similarity index 100% rename from client/shared/functions/ogFormatFs rename to ogclient/functions/ogFormatFs diff --git a/client/shared/functions/ogGetArch b/ogclient/functions/ogGetArch similarity index 100% rename from client/shared/functions/ogGetArch rename to ogclient/functions/ogGetArch diff --git a/client/shared/functions/ogGetCacheSize b/ogclient/functions/ogGetCacheSize similarity index 100% rename from client/shared/functions/ogGetCacheSize rename to ogclient/functions/ogGetCacheSize diff --git a/client/shared/functions/ogGetCacheSpace b/ogclient/functions/ogGetCacheSpace similarity index 100% rename from client/shared/functions/ogGetCacheSpace rename to ogclient/functions/ogGetCacheSpace diff --git a/client/shared/functions/ogGetCaller b/ogclient/functions/ogGetCaller similarity index 100% rename from client/shared/functions/ogGetCaller rename to ogclient/functions/ogGetCaller diff --git a/client/shared/functions/ogGetDiskSize b/ogclient/functions/ogGetDiskSize similarity index 100% rename from client/shared/functions/ogGetDiskSize rename to ogclient/functions/ogGetDiskSize diff --git a/client/shared/functions/ogGetDiskType b/ogclient/functions/ogGetDiskType similarity index 100% rename from client/shared/functions/ogGetDiskType rename to ogclient/functions/ogGetDiskType diff --git a/client/shared/functions/ogGetEsp b/ogclient/functions/ogGetEsp similarity index 100% rename from client/shared/functions/ogGetEsp rename to ogclient/functions/ogGetEsp diff --git a/client/shared/functions/ogGetFreeSize b/ogclient/functions/ogGetFreeSize similarity index 100% rename from client/shared/functions/ogGetFreeSize rename to ogclient/functions/ogGetFreeSize diff --git a/client/shared/functions/ogGetFsSize b/ogclient/functions/ogGetFsSize similarity index 100% rename from client/shared/functions/ogGetFsSize rename to ogclient/functions/ogGetFsSize diff --git a/client/shared/functions/ogGetFsType b/ogclient/functions/ogGetFsType similarity index 100% rename from client/shared/functions/ogGetFsType rename to ogclient/functions/ogGetFsType diff --git a/client/shared/functions/ogGetHivePath b/ogclient/functions/ogGetHivePath similarity index 100% rename from client/shared/functions/ogGetHivePath rename to ogclient/functions/ogGetHivePath diff --git a/client/shared/functions/ogGetHostname b/ogclient/functions/ogGetHostname similarity index 100% rename from client/shared/functions/ogGetHostname rename to ogclient/functions/ogGetHostname diff --git a/client/shared/functions/ogGetImageCompressor b/ogclient/functions/ogGetImageCompressor similarity index 100% rename from client/shared/functions/ogGetImageCompressor rename to ogclient/functions/ogGetImageCompressor diff --git a/client/shared/functions/ogGetImageInfo b/ogclient/functions/ogGetImageInfo similarity index 100% rename from client/shared/functions/ogGetImageInfo rename to ogclient/functions/ogGetImageInfo diff --git a/client/shared/functions/ogGetImageProgram b/ogclient/functions/ogGetImageProgram similarity index 100% rename from client/shared/functions/ogGetImageProgram rename to ogclient/functions/ogGetImageProgram diff --git a/client/shared/functions/ogGetImageSize b/ogclient/functions/ogGetImageSize similarity index 100% rename from client/shared/functions/ogGetImageSize rename to ogclient/functions/ogGetImageSize diff --git a/client/shared/functions/ogGetImageType b/ogclient/functions/ogGetImageType similarity index 100% rename from client/shared/functions/ogGetImageType rename to ogclient/functions/ogGetImageType diff --git a/client/shared/functions/ogGetIpAddress b/ogclient/functions/ogGetIpAddress similarity index 100% rename from client/shared/functions/ogGetIpAddress rename to ogclient/functions/ogGetIpAddress diff --git a/client/shared/functions/ogGetLastSector b/ogclient/functions/ogGetLastSector similarity index 100% rename from client/shared/functions/ogGetLastSector rename to ogclient/functions/ogGetLastSector diff --git a/client/shared/functions/ogGetMacAddress b/ogclient/functions/ogGetMacAddress similarity index 100% rename from client/shared/functions/ogGetMacAddress rename to ogclient/functions/ogGetMacAddress diff --git a/client/shared/functions/ogGetMountPoint b/ogclient/functions/ogGetMountPoint similarity index 100% rename from client/shared/functions/ogGetMountPoint rename to ogclient/functions/ogGetMountPoint diff --git a/client/shared/functions/ogGetOsType b/ogclient/functions/ogGetOsType similarity index 100% rename from client/shared/functions/ogGetOsType rename to ogclient/functions/ogGetOsType diff --git a/client/shared/functions/ogGetOsUuid b/ogclient/functions/ogGetOsUuid similarity index 100% rename from client/shared/functions/ogGetOsUuid rename to ogclient/functions/ogGetOsUuid diff --git a/client/shared/functions/ogGetOsVersion b/ogclient/functions/ogGetOsVersion similarity index 100% rename from client/shared/functions/ogGetOsVersion rename to ogclient/functions/ogGetOsVersion diff --git a/client/shared/functions/ogGetParentPath b/ogclient/functions/ogGetParentPath similarity index 100% rename from client/shared/functions/ogGetParentPath rename to ogclient/functions/ogGetParentPath diff --git a/client/shared/functions/ogGetPartitionActive b/ogclient/functions/ogGetPartitionActive similarity index 100% rename from client/shared/functions/ogGetPartitionActive rename to ogclient/functions/ogGetPartitionActive diff --git a/client/shared/functions/ogGetPartitionId b/ogclient/functions/ogGetPartitionId similarity index 100% rename from client/shared/functions/ogGetPartitionId rename to ogclient/functions/ogGetPartitionId diff --git a/client/shared/functions/ogGetPartitionSize b/ogclient/functions/ogGetPartitionSize similarity index 100% rename from client/shared/functions/ogGetPartitionSize rename to ogclient/functions/ogGetPartitionSize diff --git a/client/shared/functions/ogGetPartitionTableType b/ogclient/functions/ogGetPartitionTableType similarity index 100% rename from client/shared/functions/ogGetPartitionTableType rename to ogclient/functions/ogGetPartitionTableType diff --git a/client/shared/functions/ogGetPartitionType b/ogclient/functions/ogGetPartitionType similarity index 100% rename from client/shared/functions/ogGetPartitionType rename to ogclient/functions/ogGetPartitionType diff --git a/client/shared/functions/ogGetPartitionsNumber b/ogclient/functions/ogGetPartitionsNumber similarity index 100% rename from client/shared/functions/ogGetPartitionsNumber rename to ogclient/functions/ogGetPartitionsNumber diff --git a/client/shared/functions/ogGetPath b/ogclient/functions/ogGetPath similarity index 100% rename from client/shared/functions/ogGetPath rename to ogclient/functions/ogGetPath diff --git a/client/shared/functions/ogGetRegistryValue b/ogclient/functions/ogGetRegistryValue similarity index 100% rename from client/shared/functions/ogGetRegistryValue rename to ogclient/functions/ogGetRegistryValue diff --git a/client/shared/functions/ogGetRepoIp b/ogclient/functions/ogGetRepoIp similarity index 100% rename from client/shared/functions/ogGetRepoIp rename to ogclient/functions/ogGetRepoIp diff --git a/client/shared/functions/ogGetSerialNumber b/ogclient/functions/ogGetSerialNumber similarity index 100% rename from client/shared/functions/ogGetSerialNumber rename to ogclient/functions/ogGetSerialNumber diff --git a/client/shared/functions/ogGetServerIp b/ogclient/functions/ogGetServerIp similarity index 100% rename from client/shared/functions/ogGetServerIp rename to ogclient/functions/ogGetServerIp diff --git a/client/shared/functions/ogGetSizeParameters b/ogclient/functions/ogGetSizeParameters similarity index 100% rename from client/shared/functions/ogGetSizeParameters rename to ogclient/functions/ogGetSizeParameters diff --git a/client/shared/functions/ogGrubInstallMbr b/ogclient/functions/ogGrubInstallMbr similarity index 100% rename from client/shared/functions/ogGrubInstallMbr rename to ogclient/functions/ogGrubInstallMbr diff --git a/client/shared/functions/ogGrubInstallPartition b/ogclient/functions/ogGrubInstallPartition similarity index 100% rename from client/shared/functions/ogGrubInstallPartition rename to ogclient/functions/ogGrubInstallPartition diff --git a/client/shared/functions/ogHelp b/ogclient/functions/ogHelp similarity index 100% rename from client/shared/functions/ogHelp rename to ogclient/functions/ogHelp diff --git a/client/shared/functions/ogHidePartition b/ogclient/functions/ogHidePartition similarity index 100% rename from client/shared/functions/ogHidePartition rename to ogclient/functions/ogHidePartition diff --git a/client/shared/functions/ogIdToType b/ogclient/functions/ogIdToType similarity index 100% rename from client/shared/functions/ogIdToType rename to ogclient/functions/ogIdToType diff --git a/client/shared/functions/ogInstallFirstBoot b/ogclient/functions/ogInstallFirstBoot similarity index 100% rename from client/shared/functions/ogInstallFirstBoot rename to ogclient/functions/ogInstallFirstBoot diff --git a/client/shared/functions/ogInstallMiniSetup b/ogclient/functions/ogInstallMiniSetup similarity index 100% rename from client/shared/functions/ogInstallMiniSetup rename to ogclient/functions/ogInstallMiniSetup diff --git a/client/shared/functions/ogInstallRunonce b/ogclient/functions/ogInstallRunonce similarity index 100% rename from client/shared/functions/ogInstallRunonce rename to ogclient/functions/ogInstallRunonce diff --git a/client/shared/functions/ogIsDiskLocked b/ogclient/functions/ogIsDiskLocked similarity index 100% rename from client/shared/functions/ogIsDiskLocked rename to ogclient/functions/ogIsDiskLocked diff --git a/client/shared/functions/ogIsEfiActive b/ogclient/functions/ogIsEfiActive similarity index 100% rename from client/shared/functions/ogIsEfiActive rename to ogclient/functions/ogIsEfiActive diff --git a/client/shared/functions/ogIsFormated b/ogclient/functions/ogIsFormated similarity index 100% rename from client/shared/functions/ogIsFormated rename to ogclient/functions/ogIsFormated diff --git a/client/shared/functions/ogIsImageLocked b/ogclient/functions/ogIsImageLocked similarity index 100% rename from client/shared/functions/ogIsImageLocked rename to ogclient/functions/ogIsImageLocked diff --git a/client/shared/functions/ogIsLocked b/ogclient/functions/ogIsLocked similarity index 100% rename from client/shared/functions/ogIsLocked rename to ogclient/functions/ogIsLocked diff --git a/client/shared/functions/ogIsMounted b/ogclient/functions/ogIsMounted similarity index 100% rename from client/shared/functions/ogIsMounted rename to ogclient/functions/ogIsMounted diff --git a/client/shared/functions/ogIsPartitionLocked b/ogclient/functions/ogIsPartitionLocked similarity index 100% rename from client/shared/functions/ogIsPartitionLocked rename to ogclient/functions/ogIsPartitionLocked diff --git a/client/shared/functions/ogIsReadonly b/ogclient/functions/ogIsReadonly similarity index 100% rename from client/shared/functions/ogIsReadonly rename to ogclient/functions/ogIsReadonly diff --git a/client/shared/functions/ogIsRepoLocked b/ogclient/functions/ogIsRepoLocked similarity index 100% rename from client/shared/functions/ogIsRepoLocked rename to ogclient/functions/ogIsRepoLocked diff --git a/client/shared/functions/ogIsVirtualMachine b/ogclient/functions/ogIsVirtualMachine similarity index 100% rename from client/shared/functions/ogIsVirtualMachine rename to ogclient/functions/ogIsVirtualMachine diff --git a/client/shared/functions/ogIsWritable b/ogclient/functions/ogIsWritable similarity index 100% rename from client/shared/functions/ogIsWritable rename to ogclient/functions/ogIsWritable diff --git a/client/shared/functions/ogListHardwareInfo b/ogclient/functions/ogListHardwareInfo similarity index 100% rename from client/shared/functions/ogListHardwareInfo rename to ogclient/functions/ogListHardwareInfo diff --git a/client/shared/functions/ogListLogicalPartitions b/ogclient/functions/ogListLogicalPartitions similarity index 100% rename from client/shared/functions/ogListLogicalPartitions rename to ogclient/functions/ogListLogicalPartitions diff --git a/client/shared/functions/ogListPartitions b/ogclient/functions/ogListPartitions similarity index 100% rename from client/shared/functions/ogListPartitions rename to ogclient/functions/ogListPartitions diff --git a/client/shared/functions/ogListPrimaryPartitions b/ogclient/functions/ogListPrimaryPartitions similarity index 100% rename from client/shared/functions/ogListPrimaryPartitions rename to ogclient/functions/ogListPrimaryPartitions diff --git a/client/shared/functions/ogListRegistryKeys b/ogclient/functions/ogListRegistryKeys similarity index 100% rename from client/shared/functions/ogListRegistryKeys rename to ogclient/functions/ogListRegistryKeys diff --git a/client/shared/functions/ogListRegistryValues b/ogclient/functions/ogListRegistryValues similarity index 100% rename from client/shared/functions/ogListRegistryValues rename to ogclient/functions/ogListRegistryValues diff --git a/client/shared/functions/ogListSoftware b/ogclient/functions/ogListSoftware similarity index 100% rename from client/shared/functions/ogListSoftware rename to ogclient/functions/ogListSoftware diff --git a/client/shared/functions/ogLock b/ogclient/functions/ogLock similarity index 100% rename from client/shared/functions/ogLock rename to ogclient/functions/ogLock diff --git a/client/shared/functions/ogLockDisk b/ogclient/functions/ogLockDisk similarity index 100% rename from client/shared/functions/ogLockDisk rename to ogclient/functions/ogLockDisk diff --git a/client/shared/functions/ogLockImage b/ogclient/functions/ogLockImage similarity index 100% rename from client/shared/functions/ogLockImage rename to ogclient/functions/ogLockImage diff --git a/client/shared/functions/ogLockPartition b/ogclient/functions/ogLockPartition similarity index 100% rename from client/shared/functions/ogLockPartition rename to ogclient/functions/ogLockPartition diff --git a/client/shared/functions/ogMakeDir b/ogclient/functions/ogMakeDir similarity index 100% rename from client/shared/functions/ogMakeDir rename to ogclient/functions/ogMakeDir diff --git a/client/shared/functions/ogMcastReceiverFile b/ogclient/functions/ogMcastReceiverFile similarity index 100% rename from client/shared/functions/ogMcastReceiverFile rename to ogclient/functions/ogMcastReceiverFile diff --git a/client/shared/functions/ogMcastReceiverPartition b/ogclient/functions/ogMcastReceiverPartition similarity index 100% rename from client/shared/functions/ogMcastReceiverPartition rename to ogclient/functions/ogMcastReceiverPartition diff --git a/client/shared/functions/ogMcastSendFile b/ogclient/functions/ogMcastSendFile similarity index 100% rename from client/shared/functions/ogMcastSendFile rename to ogclient/functions/ogMcastSendFile diff --git a/client/shared/functions/ogMcastSendPartition b/ogclient/functions/ogMcastSendPartition similarity index 100% rename from client/shared/functions/ogMcastSendPartition rename to ogclient/functions/ogMcastSendPartition diff --git a/client/shared/functions/ogMcastSyntax b/ogclient/functions/ogMcastSyntax similarity index 100% rename from client/shared/functions/ogMcastSyntax rename to ogclient/functions/ogMcastSyntax diff --git a/client/shared/functions/ogMount b/ogclient/functions/ogMount similarity index 100% rename from client/shared/functions/ogMount rename to ogclient/functions/ogMount diff --git a/client/shared/functions/ogMountCache b/ogclient/functions/ogMountCache similarity index 100% rename from client/shared/functions/ogMountCache rename to ogclient/functions/ogMountCache diff --git a/client/shared/functions/ogMountCdrom b/ogclient/functions/ogMountCdrom similarity index 100% rename from client/shared/functions/ogMountCdrom rename to ogclient/functions/ogMountCdrom diff --git a/client/shared/functions/ogMountFirstFs b/ogclient/functions/ogMountFirstFs similarity index 100% rename from client/shared/functions/ogMountFirstFs rename to ogclient/functions/ogMountFirstFs diff --git a/client/shared/functions/ogMountFs b/ogclient/functions/ogMountFs similarity index 100% rename from client/shared/functions/ogMountFs rename to ogclient/functions/ogMountFs diff --git a/client/shared/functions/ogNvramActiveEntry b/ogclient/functions/ogNvramActiveEntry similarity index 100% rename from client/shared/functions/ogNvramActiveEntry rename to ogclient/functions/ogNvramActiveEntry diff --git a/client/shared/functions/ogNvramAddEntry b/ogclient/functions/ogNvramAddEntry similarity index 100% rename from client/shared/functions/ogNvramAddEntry rename to ogclient/functions/ogNvramAddEntry diff --git a/client/shared/functions/ogNvramDeleteEntry b/ogclient/functions/ogNvramDeleteEntry similarity index 100% rename from client/shared/functions/ogNvramDeleteEntry rename to ogclient/functions/ogNvramDeleteEntry diff --git a/client/shared/functions/ogNvramGetCurrent b/ogclient/functions/ogNvramGetCurrent similarity index 100% rename from client/shared/functions/ogNvramGetCurrent rename to ogclient/functions/ogNvramGetCurrent diff --git a/client/shared/functions/ogNvramGetNext b/ogclient/functions/ogNvramGetNext similarity index 100% rename from client/shared/functions/ogNvramGetNext rename to ogclient/functions/ogNvramGetNext diff --git a/client/shared/functions/ogNvramGetOrder b/ogclient/functions/ogNvramGetOrder similarity index 100% rename from client/shared/functions/ogNvramGetOrder rename to ogclient/functions/ogNvramGetOrder diff --git a/client/shared/functions/ogNvramGetTimeout b/ogclient/functions/ogNvramGetTimeout similarity index 100% rename from client/shared/functions/ogNvramGetTimeout rename to ogclient/functions/ogNvramGetTimeout diff --git a/client/shared/functions/ogNvramInactiveEntry b/ogclient/functions/ogNvramInactiveEntry similarity index 100% rename from client/shared/functions/ogNvramInactiveEntry rename to ogclient/functions/ogNvramInactiveEntry diff --git a/client/shared/functions/ogNvramList b/ogclient/functions/ogNvramList similarity index 100% rename from client/shared/functions/ogNvramList rename to ogclient/functions/ogNvramList diff --git a/client/shared/functions/ogNvramPxeFirstEntry b/ogclient/functions/ogNvramPxeFirstEntry similarity index 100% rename from client/shared/functions/ogNvramPxeFirstEntry rename to ogclient/functions/ogNvramPxeFirstEntry diff --git a/client/shared/functions/ogNvramSetNext b/ogclient/functions/ogNvramSetNext similarity index 100% rename from client/shared/functions/ogNvramSetNext rename to ogclient/functions/ogNvramSetNext diff --git a/client/shared/functions/ogNvramSetOrder b/ogclient/functions/ogNvramSetOrder similarity index 100% rename from client/shared/functions/ogNvramSetOrder rename to ogclient/functions/ogNvramSetOrder diff --git a/client/shared/functions/ogNvramSetTimeout b/ogclient/functions/ogNvramSetTimeout similarity index 100% rename from client/shared/functions/ogNvramSetTimeout rename to ogclient/functions/ogNvramSetTimeout diff --git a/client/shared/functions/ogRaiseError b/ogclient/functions/ogRaiseError similarity index 100% rename from client/shared/functions/ogRaiseError rename to ogclient/functions/ogRaiseError diff --git a/client/shared/functions/ogReduceFs b/ogclient/functions/ogReduceFs similarity index 100% rename from client/shared/functions/ogReduceFs rename to ogclient/functions/ogReduceFs diff --git a/client/shared/functions/ogRestoreEfiBootLoader b/ogclient/functions/ogRestoreEfiBootLoader similarity index 100% rename from client/shared/functions/ogRestoreEfiBootLoader rename to ogclient/functions/ogRestoreEfiBootLoader diff --git a/client/shared/functions/ogRestoreImage b/ogclient/functions/ogRestoreImage similarity index 100% rename from client/shared/functions/ogRestoreImage rename to ogclient/functions/ogRestoreImage diff --git a/client/shared/functions/ogRestoreImageSyntax b/ogclient/functions/ogRestoreImageSyntax similarity index 100% rename from client/shared/functions/ogRestoreImageSyntax rename to ogclient/functions/ogRestoreImageSyntax diff --git a/client/shared/functions/ogSetPartitionActive b/ogclient/functions/ogSetPartitionActive similarity index 100% rename from client/shared/functions/ogSetPartitionActive rename to ogclient/functions/ogSetPartitionActive diff --git a/client/shared/functions/ogSetPartitionId b/ogclient/functions/ogSetPartitionId similarity index 100% rename from client/shared/functions/ogSetPartitionId rename to ogclient/functions/ogSetPartitionId diff --git a/client/shared/functions/ogSetPartitionSize b/ogclient/functions/ogSetPartitionSize similarity index 100% rename from client/shared/functions/ogSetPartitionSize rename to ogclient/functions/ogSetPartitionSize diff --git a/client/shared/functions/ogSetPartitionType b/ogclient/functions/ogSetPartitionType similarity index 100% rename from client/shared/functions/ogSetPartitionType rename to ogclient/functions/ogSetPartitionType diff --git a/client/shared/functions/ogSetRegistryValue b/ogclient/functions/ogSetRegistryValue similarity index 100% rename from client/shared/functions/ogSetRegistryValue rename to ogclient/functions/ogSetRegistryValue diff --git a/client/shared/functions/ogSetWindowsName b/ogclient/functions/ogSetWindowsName similarity index 100% rename from client/shared/functions/ogSetWindowsName rename to ogclient/functions/ogSetWindowsName diff --git a/client/shared/functions/ogTorrentStart b/ogclient/functions/ogTorrentStart similarity index 100% rename from client/shared/functions/ogTorrentStart rename to ogclient/functions/ogTorrentStart diff --git a/client/shared/functions/ogTypeToId b/ogclient/functions/ogTypeToId similarity index 100% rename from client/shared/functions/ogTypeToId rename to ogclient/functions/ogTypeToId diff --git a/client/shared/functions/ogUcastReceiverPartition b/ogclient/functions/ogUcastReceiverPartition similarity index 100% rename from client/shared/functions/ogUcastReceiverPartition rename to ogclient/functions/ogUcastReceiverPartition diff --git a/client/shared/functions/ogUcastSendFile b/ogclient/functions/ogUcastSendFile similarity index 100% rename from client/shared/functions/ogUcastSendFile rename to ogclient/functions/ogUcastSendFile diff --git a/client/shared/functions/ogUcastSendPartition b/ogclient/functions/ogUcastSendPartition similarity index 100% rename from client/shared/functions/ogUcastSendPartition rename to ogclient/functions/ogUcastSendPartition diff --git a/client/shared/functions/ogUcastSyntax b/ogclient/functions/ogUcastSyntax similarity index 100% rename from client/shared/functions/ogUcastSyntax rename to ogclient/functions/ogUcastSyntax diff --git a/client/shared/functions/ogUnhidePartition b/ogclient/functions/ogUnhidePartition similarity index 100% rename from client/shared/functions/ogUnhidePartition rename to ogclient/functions/ogUnhidePartition diff --git a/client/shared/functions/ogUninstallLinuxClient b/ogclient/functions/ogUninstallLinuxClient similarity index 100% rename from client/shared/functions/ogUninstallLinuxClient rename to ogclient/functions/ogUninstallLinuxClient diff --git a/client/shared/functions/ogUninstallWindowsClient b/ogclient/functions/ogUninstallWindowsClient similarity index 100% rename from client/shared/functions/ogUninstallWindowsClient rename to ogclient/functions/ogUninstallWindowsClient diff --git a/client/shared/functions/ogUnlock b/ogclient/functions/ogUnlock similarity index 100% rename from client/shared/functions/ogUnlock rename to ogclient/functions/ogUnlock diff --git a/client/shared/functions/ogUnlockDisk b/ogclient/functions/ogUnlockDisk similarity index 100% rename from client/shared/functions/ogUnlockDisk rename to ogclient/functions/ogUnlockDisk diff --git a/client/shared/functions/ogUnlockImage b/ogclient/functions/ogUnlockImage similarity index 100% rename from client/shared/functions/ogUnlockImage rename to ogclient/functions/ogUnlockImage diff --git a/client/shared/functions/ogUnlockPartition b/ogclient/functions/ogUnlockPartition similarity index 100% rename from client/shared/functions/ogUnlockPartition rename to ogclient/functions/ogUnlockPartition diff --git a/client/shared/functions/ogUnmount b/ogclient/functions/ogUnmount similarity index 100% rename from client/shared/functions/ogUnmount rename to ogclient/functions/ogUnmount diff --git a/client/shared/functions/ogUnmountAll b/ogclient/functions/ogUnmountAll similarity index 100% rename from client/shared/functions/ogUnmountAll rename to ogclient/functions/ogUnmountAll diff --git a/client/shared/functions/ogUnmountCache b/ogclient/functions/ogUnmountCache similarity index 100% rename from client/shared/functions/ogUnmountCache rename to ogclient/functions/ogUnmountCache diff --git a/client/shared/functions/ogUnmountFs b/ogclient/functions/ogUnmountFs similarity index 100% rename from client/shared/functions/ogUnmountFs rename to ogclient/functions/ogUnmountFs diff --git a/client/shared/functions/ogUnsetDirtyBit b/ogclient/functions/ogUnsetDirtyBit similarity index 100% rename from client/shared/functions/ogUnsetDirtyBit rename to ogclient/functions/ogUnsetDirtyBit diff --git a/client/shared/functions/ogUpdateCacheIsNecesary b/ogclient/functions/ogUpdateCacheIsNecesary similarity index 100% rename from client/shared/functions/ogUpdateCacheIsNecesary rename to ogclient/functions/ogUpdateCacheIsNecesary diff --git a/client/shared/functions/ogUpdatePartitionTable b/ogclient/functions/ogUpdatePartitionTable similarity index 100% rename from client/shared/functions/ogUpdatePartitionTable rename to ogclient/functions/ogUpdatePartitionTable diff --git a/client/shared/functions/ogWindowsBootParameters b/ogclient/functions/ogWindowsBootParameters similarity index 100% rename from client/shared/functions/ogWindowsBootParameters rename to ogclient/functions/ogWindowsBootParameters diff --git a/client/shared/functions/ogWindowsRegisterPartition b/ogclient/functions/ogWindowsRegisterPartition similarity index 100% rename from client/shared/functions/ogWindowsRegisterPartition rename to ogclient/functions/ogWindowsRegisterPartition diff --git a/ogclient/interfaceAdm/Apagar b/ogclient/interfaceAdm/Apagar new file mode 100755 index 0000000..ae1e5ba --- /dev/null +++ b/ogclient/interfaceAdm/Apagar @@ -0,0 +1,3 @@ +#!/bin/bash +poweroff +exit 0 diff --git a/client/interfaceAdm/Apagar.py b/ogclient/interfaceAdm/Apagar.py similarity index 100% rename from client/interfaceAdm/Apagar.py rename to ogclient/interfaceAdm/Apagar.py diff --git a/ogclient/interfaceAdm/CambiarAcceso b/ogclient/interfaceAdm/CambiarAcceso new file mode 100755 index 0000000..88ce5c8 --- /dev/null +++ b/ogclient/interfaceAdm/CambiarAcceso @@ -0,0 +1,54 @@ +#!/bin/bash + +#______________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE +# $1 modo (admin, user) +#______________________________________ + +# Error si llamada no se realliza desde OpenGnsys Client. +PROG=$(basename $0) +#CALLER=$(ogGetCaller) +#if ! $(ogCheckStringInGroup "$CALLER" "CrearImagen ConsolaRemota CrearImagenBasica CrearSoftIncremental"); then +# ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" +# exit $? +#fi + +# Salir si el repositorio está bloquedo (tiene ficheros abiertos). +REPOIP=$(ogGetRepoIp) +if [ -z "$REPOIP" ]; then + ogRaiseError $OG_ERR_NOTFOUND "repo no montado" + exit $? +fi +if ogIsRepoLocked; then + ogRaiseError $OG_ERR_LOCKED "repo $REPOIP" + exit $? +fi + +# Comprobar protocolo y modo de acceso. +PROTO=${ogprotocol:-"smb"} +case "$PROTO" in + nfs|smb) ;; + *) ogRaiseError $OG_ERR_FORMAT "protocolo desconocido $PROTO" + exit $? ;; +esac +case "$1" in + admin) MODE="rw" ;; + user) MODE="ro" ;; + *) ogRaiseError $OG_ERR_FORMAT "modo desconocido $1" + exit $? ;; +esac + +# Desmontar repositorio y volver a montarlo con el modo adecuado. +umount $OGIMG +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="/$ogunit" +ogEcho info "$PROG: Montar repositorio $REPO por $PROTO en modo $1" +case "$PROTO" in + nfs) mount -t nfs $REPOIP:$OGIMG$OGUNIT $OGIMG -o $MODE ;; + smb) PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') + PASS=${PASS:-"og"} + mount.cifs //$REPOIP/ogimages$OGUNIT $OGIMG -o $MODE,serverino,acl,username=opengnsys,password=$PASS +esac + diff --git a/client/interfaceAdm/CambiarAcceso.py b/ogclient/interfaceAdm/CambiarAcceso.py similarity index 100% rename from client/interfaceAdm/CambiarAcceso.py rename to ogclient/interfaceAdm/CambiarAcceso.py diff --git a/ogclient/interfaceAdm/Configurar b/ogclient/interfaceAdm/Configurar new file mode 100755 index 0000000..e88d073 --- /dev/null +++ b/ogclient/interfaceAdm/Configurar @@ -0,0 +1,159 @@ +#!/bin/bash + + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimieincludento para httpdlog +echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +# Solo ejecutable por OpenGnsys Client. +PATH=$PATH:$(dirname $0) +PROG=$(basename $0) + +#____________________________________________________________________ +# +# El parámetro $2 es el que aporta toda la información y el $1 se queda obsoleto +# Formato de entrada: +# dis=Número de disco +# *=caracter de separación +# che=Vale 0 o 1 +# *=caracter de separación +# $tch=tamaño cache +# != caracter de separación +# +# Y un numero indeterminado de cadenas del tipo siguuenteseparadas por el caracter '$': +# par=Número de particion*cod=Código de partición*sfi=Sistema de ficheros*tam=Tamaño de la partición*ope=Operación +# @= caracter de separación +#____________________________________________________________________ + +# Captura de parámetros (se ignora el 1er parámetro y se eliminan espacios y tabuladores). +#param='dis=1*che=0*tch=70000000!par=1*cpt=NTFS*sfi=NTFS*tam=11000000*ope=0%' +shift +param="$(echo $* | sed 's/[ ]//g')" + +# Activa navegador para ver progreso +coproc /opt/opengnsys/bin/browser -qws http://localhost/cgi-bin/httpd-log.sh + +# Leer los dos bloques de parámetros, separados por '!'. +declare -a TBPRM + +IFS='!' read -a TBPRM <<<"$param" +pparam="${TBPRM[0]}" # Parámetros generales del disco. +sparam="${TBPRM[1]}" # Parámetros de particionado y formateo. + + +# Toma valores de disco y caché, separados por "*". +# Los valores están en las variables $dis: disco, $che: existe cache (1, 0), $tch: Tamaño de la cache. +unset TBPRM +IFS='*' read -a TBPRM <<<"$pparam" +[[ ${TBPRM} =~ = ]] && eval ${TBPRM[@]} # Comprobar asignación antes de exportar valores. + +# Error si no se define el parámetro de disco (dis). +[ -z "$dis" ] && exit $OG_ERR_FORMAT + +# Toma valores de distribución de particiones, separados por "%". +declare -a CFG # Valores de configuración. +declare -a TBP # Tabla de particionado. +declare -a TBF # Tabla de formateo. + +unset TBPRM +IFS='%' read -a TBPRM <<<"$sparam" + +maxp=0 +for ((i=0; i<${#TBPRM[@]}; i++)); do + # Leer datos de la partición, separados por "*". + unset par + IFS='*' read -a CFG <<<"${TBPRM[i]}" 2>/dev/null + [[ ${CFG} =~ = ]] && eval ${CFG[@]} # Comprobar asignación antes de exportar valores. + # Componer datos de particionado. + if [ "$cpt" != "CACHE" ]; then + TBP[par]="$cpt:$tam" + fi + # Si se activa operación de formatear, componer datos de formateo. + if [ "$ope" == 1 ]; then + # Comprobamos que la particion y el s.f sean validos. + ogCheckStringInGroup $cpt "EMPTY EXTENDED LINUX-LVM LVM ZPOOL" + [ $? -ne 0 ] && TBF[par]="$sfi" + fi + # Obtener la partición mayor. + [ $par -gt $maxp ] && maxp=$par +done +#____________________________________________________ +# +# Proceso +#____________________________________________________ + +# Tamaño actual de la cache +CACHESIZE=$(ogGetCacheSize) + +# Desmonta todas las particiones y la caché + +ogEcho session log "[10] $MSG_HELP_ogUnmountAll" +ogUnmountAll $dis &>/dev/null +ogUnmountCache + +# Elimina la tabla de particiones +if [ `ogGetPartitionTableType 1` != 'MSDOS' ]; then + ogDeletePartitionTable $dis + ogExecAndLog COMMAND ogUpdatePartitionTable $dis + + # Crea tabla de particiones MSDOS (NOTA: adaptar para tablas GPT). + ogCreatePartitionTable $dis MSDOS +fi + +# Inicia la cache. +if echo "$sparam" |grep "CACHE" >/dev/null; then + ogEcho session log "[30] $MSG_HELP_ogCreateCache" + ogEcho session log " initCache $tch" + ogExecAndLog COMMAND initCache $tch +fi + +# Definir particionado. +ogEcho session log "[50] $MSG_HELP_ogCreatePartitions" +ogEcho session log " ogCreatePartitions $dis ${TBP[@]}" +ogExecAndLog COMMAND ogCreatePartitions $dis ${TBP[@]} +if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogCreatePartitions $dis ${TBP[@]}") +fi +ogExecAndLog COMMAND ogUpdatePartitionTable $dis + +# Formatear particiones +ogEcho session log "[70] $MSG_HELP_ogFormat" + +for ((par=1; par<=$maxp; par++)); do + case "${TBF[par]}" in + CACHE) # Si el tamaño es distinto ya se ha formateado. + if [ "$CACHESIZE" == $tch ]; then + ogEcho session log " ogFormatCache" + ogExecAndLog COMMAND ogFormatCache + fi + ;; + "") ;; + *) ogEcho session log " ogFormatFs $dis $par ${TBF[par]}" + ogExecAndLog COMMAND ogFormatFs $dis $par ${TBF[par]} + if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogFormatFs $dis $par ${TBF[par]}"); + fi + ;; + esac +done +RETVAL=$? +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + +#___________________________________________________________________ +# +# Retorno +#___________________________________________________________________ + +kill $COPROC_PID +exit 0 + diff --git a/client/interfaceAdm/Configurar.py b/ogclient/interfaceAdm/Configurar.py similarity index 100% rename from client/interfaceAdm/Configurar.py rename to ogclient/interfaceAdm/Configurar.py diff --git a/ogclient/interfaceAdm/ConsolaRemota b/ogclient/interfaceAdm/ConsolaRemota new file mode 100755 index 0000000..f569771 --- /dev/null +++ b/ogclient/interfaceAdm/ConsolaRemota @@ -0,0 +1,3 @@ +#!/bin/bash +chmod +x $1 +$1>$2 || exit $? diff --git a/client/interfaceAdm/ConsolaRemota.py b/ogclient/interfaceAdm/ConsolaRemota.py similarity index 100% rename from client/interfaceAdm/ConsolaRemota.py rename to ogclient/interfaceAdm/ConsolaRemota.py diff --git a/ogclient/interfaceAdm/CrearImagen b/ogclient/interfaceAdm/CrearImagen new file mode 100755 index 0000000..4f84ec0 --- /dev/null +++ b/ogclient/interfaceAdm/CrearImagen @@ -0,0 +1,91 @@ +#!/bin/bash + +#___________________________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE: +# $1 Número de disco +# $2 Número de particion +# $3 Nombre canónico de la imagen (sin extensión) +# $4 Dirección del repositorio (REPO, por defecto) +#___________________________________________________ + + +#$OG_ERR_NOTEXEC Si no es llamada por OG client +#$OG_ERR_LOCKED=4 Si la particion está bloqueada. + + +#Codigos de error del scripts createImage +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@exception OG_ERR_PARTITION # 3 Error en partición de disco o en su sistema de archivos +#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage. +#@exception OG_ERR_NOTWRITE # 14 error de escritura +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16 +#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos. + + +#Códigos de error de la funcion ogCreateImage + + + +TIME1=$SECONDS + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +# Solo ejecutable por OpenGnsys Client. +PATH=$PATH:$(dirname $0) +PROG=$(basename $0) +#CALLER=$(ogGetCaller) +#if [ "$CALLER" != "ogAdmClient" ]; then +# ogRaiseError $OG_ERR_NOTEXEC "$CALLER -> $PROG" +# exit $? +#fi + +# Valor por defecto para el repositorio. +REPO=${4:-"REPO"} +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Unidad organizativa + [ "$ogunit" != "" ] && OGUNIT="$ogunit" + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO $OGUNIT || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO'; echo $?) + REPO="REPO" +fi + +# Si el destino es REPO y el cliente no está en modo "admin"; activar repositorio para escritura, +if [ "$REPO" == "REPO" -a "$boot" != "admin" ] +then + CambiarAcceso admin &>> $OGLOGFILE + RETVAL=$? + [ $RETVAL -gt 0 ] && exit $RETVAL +fi + +ogEcho createImage "$1" "$2" "$4" /"$3" +# Si existe, ejecuta script personalizado "createImageCustom"; si no, llama al genérico "createImage". +if which createImageCustom &>/dev/null; then + createImageCustom "$1" "$2" "$4" /"$3" &>> $OGLOGCOMMAND +else + createImage "$1" "$2" "$4" /"$3" &>> $OGLOGCOMMAND +fi +RETVAL=$? + +# Cambiar acceso a modo usuario, si es necesario. +[ "$REPO" == "REPO" -a "$boot" != "admin" ] && CambiarAcceso user + +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + +exit $RETVAL + diff --git a/client/interfaceAdm/CrearImagen.py b/ogclient/interfaceAdm/CrearImagen.py similarity index 100% rename from client/interfaceAdm/CrearImagen.py rename to ogclient/interfaceAdm/CrearImagen.py diff --git a/ogclient/interfaceAdm/EjecutarScript b/ogclient/interfaceAdm/EjecutarScript new file mode 100755 index 0000000..26453ed --- /dev/null +++ b/ogclient/interfaceAdm/EjecutarScript @@ -0,0 +1,44 @@ +#!/bin/bash +TIME1=$SECONDS + + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo -n "" > $OGLOGSESSION; echo -n "" > $OGLOGCOMMAND + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +echo -e "\n Instrucciones a ejecutar: *****************************" >> $OGLOGFILE +cat $1 >> $OGLOGFILE + + +echo -e "\n Salida de las instrucciones: *****************************" >> $OGLOGFILE +chmod +x $1 +# Si mandamos la salida a OGLOGCOMMAND reescribimos lo que manda el comando. +#$1 &>> $OGLOGCOMMAND +$1 +RETVAL=$? + + + +TIME=$[SECONDS-TIME1] +if [ $RETVAL == 0 ] +then + ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" +else + ogRaiseError log session $RETVAL + ogEcho log session error "Operacion no realizada" +fi + + +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" + + +exit $RETVAL + diff --git a/client/interfaceAdm/EjecutarScript.py b/ogclient/interfaceAdm/EjecutarScript.py similarity index 100% rename from client/interfaceAdm/EjecutarScript.py rename to ogclient/interfaceAdm/EjecutarScript.py diff --git a/ogclient/interfaceAdm/IniciarSesion b/ogclient/interfaceAdm/IniciarSesion new file mode 100755 index 0000000..750d96d --- /dev/null +++ b/ogclient/interfaceAdm/IniciarSesion @@ -0,0 +1,13 @@ +#!/bin/bash + +# UHU - Comprobamos el disco, si solo hay un parametro, disco es 1, por compatibilidad con clientes antiguos +if [ $# == 1 ] +then + disk=1 + part=$1 +else + disk=$1 + part=$2 +fi + +bootOs $disk $part diff --git a/client/interfaceAdm/IniciarSesion.py b/ogclient/interfaceAdm/IniciarSesion.py similarity index 100% rename from client/interfaceAdm/IniciarSesion.py rename to ogclient/interfaceAdm/IniciarSesion.py diff --git a/ogclient/interfaceAdm/InventarioHardware b/ogclient/interfaceAdm/InventarioHardware new file mode 100755 index 0000000..17614a5 --- /dev/null +++ b/ogclient/interfaceAdm/InventarioHardware @@ -0,0 +1,6 @@ +#!/bin/bash +# Script de interfaz para guardar en un fichero el inventario de hardware de un cliente. + +file=$(listHardwareInfo) +tail -n+2 $file >$1 + diff --git a/client/interfaceAdm/InventarioHardware.py b/ogclient/interfaceAdm/InventarioHardware.py similarity index 100% rename from client/interfaceAdm/InventarioHardware.py rename to ogclient/interfaceAdm/InventarioHardware.py diff --git a/ogclient/interfaceAdm/InventarioSoftware b/ogclient/interfaceAdm/InventarioSoftware new file mode 100755 index 0000000..fa96565 --- /dev/null +++ b/ogclient/interfaceAdm/InventarioSoftware @@ -0,0 +1,19 @@ +#!/bin/bash + +TIME1=$SECONDS + +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo -n " " | tee $OGLOGSESSION $OGLOGCOMMAND ${OGLOGCOMMAND}.tmp + +# Registro de inicio de ejecución +ogEcho log session "$MSG_INTERFACE_START $0 $*" + +file=$(listSoftwareInfo $1 $2) +cp $file $3 + +TIME=$[SECONDS-TIME1] +ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME/60]m $[TIME%60]s" + diff --git a/client/interfaceAdm/InventarioSoftware.py b/ogclient/interfaceAdm/InventarioSoftware.py similarity index 100% rename from client/interfaceAdm/InventarioSoftware.py rename to ogclient/interfaceAdm/InventarioSoftware.py diff --git a/ogclient/interfaceAdm/Reiniciar b/ogclient/interfaceAdm/Reiniciar new file mode 100755 index 0000000..df93c1b --- /dev/null +++ b/ogclient/interfaceAdm/Reiniciar @@ -0,0 +1,3 @@ +#!/bin/bash +reboot +exit 0 diff --git a/client/interfaceAdm/Reiniciar.py b/ogclient/interfaceAdm/Reiniciar.py similarity index 100% rename from client/interfaceAdm/Reiniciar.py rename to ogclient/interfaceAdm/Reiniciar.py diff --git a/ogclient/interfaceAdm/RestaurarImagen b/ogclient/interfaceAdm/RestaurarImagen new file mode 100755 index 0000000..6f9ae24 --- /dev/null +++ b/ogclient/interfaceAdm/RestaurarImagen @@ -0,0 +1,15 @@ +#!/bin/bash +#_______________________________________________________________________________________________________________________________ +# +# PARAMETROS RECIBIDOS DESDE EL CLIENTE: +# $1 disco +# $2 par=Número de particion +# $3 Nombre canónico de la imagen +# $4 Dirección IP del repositorio +# $5 Protocolo UNICAST MULTICAST TORRENT +# $6 Opciones del protocolo +#_______________________________________________________________________________________________________________________________ + +# Llamar al script de despliegue "deployImage". +deployImage "$4" "$3" "$1" "$2" "$5" "$6" "$7" "$8" || exit $? + diff --git a/client/interfaceAdm/RestaurarImagen.py b/ogclient/interfaceAdm/RestaurarImagen.py similarity index 100% rename from client/interfaceAdm/RestaurarImagen.py rename to ogclient/interfaceAdm/RestaurarImagen.py diff --git a/ogclient/interfaceAdm/getConfiguration b/ogclient/interfaceAdm/getConfiguration new file mode 100755 index 0000000..ddfc382 --- /dev/null +++ b/ogclient/interfaceAdm/getConfiguration @@ -0,0 +1,88 @@ +#!/bin/bash + +#_______________________________________________________________________________________________________________________________ +# +# Formato de salida: +# disk=Número de disco\tpar=Número de particion\tcod=Código de partición\tsfi=Sistema de ficheros\tsoi=Sistema instalado\ttam=Tamaño de la partición\n +#_______________________________________________________________________________________________________________________________ + + +# No registrar los errores. +export DEBUG="no" + +ser=$(ogGetSerialNumber) +cfg="" +disks=$(ogDiskToDev | wc -w) +for ((dsk=1; dsk<=$disks; dsk++)); do + particiones=$(ogGetPartitionsNumber $dsk) + particiones=${particiones:-0} + # Tipo de tabla de particiones: 1=MSDOS, 2=GPT + ptt=$(ogGetPartitionTableType $dsk) + case "$ptt" in + MSDOS) ptt=1 ;; + GPT) ptt=2 ;; + LVM) ptt=3 ;; + ZPOOL) ptt=4 ;; + *) ptt=0 ;; + esac + # Información de disco (partición 0) + cfg="$cfg$dsk:0:$ptt:::$(ogGetDiskSize $dsk):0;" + for ((par=1;par<=$particiones;par++)); do + # Código del identificador de tipo de partición + cod=$(ogGetPartitionId $dsk $par 2>/dev/null) + # Tipo del sistema de ficheros + fsi=$(getFsType $dsk $par 2>/dev/null) + fsi=${fsi:-"EMPTY"} + # Tamaño de la particón + tam=$(ogGetPartitionSize $dsk $par 2>/dev/null) + tam=${tam:-"0"} + # Sistema operativo instalado + case "$fsi" in + ""|EMPTY|LINUX-SWAP|LINUX-LVM|ZVOL) + soi=""; uso=0 ;; + *) if [ -n "$(ogMount $dsk $par 2>/dev/null)" ]; then + soi=$(getOsVersion $dsk $par 2>/dev/null | cut -f2 -d:) + # Hacer un 2º intento para algunos casos especiales. + [ -z "$soi" ] && soi=$(getOsVersion $dsk $par 2>/dev/null | cut -f2 -d:) + # Sistema de archivos para datos (sistema operativo "DATA") + [ -z "$soi" -a "$fsi" != "EMPTY" -a "$fsi" != "CACHE" ] && soi="DATA" + # Obtener porcentaje de uso. + uso=$(df $(ogGetMountPoint $dsk $par) | awk '{getline; printf "%d",$5}') + uso=${uso:0} + else + soi=""; uso=0 + fi + ;; + esac + cfg="$cfg$dsk:$par:$cod:$fsi:$soi:$tam:$uso;" + done +done + +# Crear configuración por defecto para cliente sin disco. +[ -z "$cfg" ] && cfg="1:0:0:::0;" + +# Guardar salida en fichero temporal. +cfgfile=/tmp/getconfig +echo "${ser:+$ser;}$cfg" > $cfgfile + +# Crear el menú por defecto a partir del fichero generado (no dar ninguna salida). +generateMenuDefault &>/dev/null + +# Componer salida formateada. +awk '{ n=split($0,sep,";"); + for (i=1; i min width + + direction = left_to_right + anchor = 1 + id = __menu__ + } + + panel { + height = 4 + width = 100% + class = container-title + + direction = left_to_right + + image { + image = "$$/images/txt-select.png" + attach_top = 0 + attach_left = 0 + } + + ### Tools Menu ### + image { + attach_right = 2 + image = "$$/images/button-tools.png:$$/images/button-tools-hover.png" + command = "menu_popup tools_menu" + } + } + } + + ### Progress Bar ### + panel { + halign = center + attach_vcenter = 20 + width = 80 + class = progressbar-background + id = __timeout__ + + progressbar { } + } +} + +template_menuitem { + panel { + width = 40 + height = 12 + + parameters = "class=image.class:title=panel.text.text" + + image { + attach_vcenter = 0 + attach_hcenter = 0 + } + + panel { + attach_vcenter = 0 + attach_hcenter = 0 + class = text-line + text { font = "Helvetica Regular 22" } + } + } +} diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_debian.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_debian.png new file mode 100644 index 0000000..55d7ce0 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_debian.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_elementary.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_elementary.png new file mode 100644 index 0000000..a2bc2b2 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_elementary.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_freebsd.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_freebsd.png new file mode 100644 index 0000000..eedade7 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_freebsd.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_haiku.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_haiku.png new file mode 100644 index 0000000..f6b21d6 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_haiku.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_linux.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_linux.png new file mode 100644 index 0000000..5064c4a Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_linux.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opengnsys.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opengnsys.png new file mode 100644 index 0000000..aea9bfe Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opengnsys.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opensuse.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opensuse.png new file mode 100644 index 0000000..bdc548b Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_opensuse.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_os.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_os.png new file mode 100644 index 0000000..abb4b29 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_os.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_osx.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_osx.png new file mode 100644 index 0000000..8a1c8f5 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_osx.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_recovery.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_recovery.png new file mode 100644 index 0000000..d9144a6 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_recovery.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_restart.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_restart.png new file mode 100644 index 0000000..9c30c23 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_restart.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_shutdown.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_shutdown.png new file mode 100644 index 0000000..39b123f Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_shutdown.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_ubuntu.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_ubuntu.png new file mode 100644 index 0000000..d1cda27 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_ubuntu.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows.png new file mode 100644 index 0000000..96e11c8 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows10.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows10.png new file mode 100644 index 0000000..0eabef7 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows10.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows7.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows7.png new file mode 100644 index 0000000..95d9e18 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows7.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows_metro.png b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows_metro.png new file mode 100644 index 0000000..7ace114 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/hover_windows_metro.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/icons b/ogclient/lib/burg/themes/OpenGnsys/icons/icons new file mode 100644 index 0000000..15d5bec --- /dev/null +++ b/ogclient/lib/burg/themes/OpenGnsys/icons/icons @@ -0,0 +1,21 @@ ++class +{ + -opengnsys { image = "$$/normal_opengnsys.png:$$/hover_opengnsys.png" } + -windows10 { image = "$$/normal_windows10.png:$$/hover_windows10.png" } + -windows7 { image = "$$/normal_windows7.png:$$/hover_windows7.png" } + -windows { image = "$$/normal_windows.png:$$/hover_windows.png" } + -elementary { image = "$$/normal_elementary.png:$$/hover_elementary.png" } + -elementaryos { image = "$$/normal_elementary.png:$$/hover_elementary.png" } + -recovery { image = "$$/normal_recovery.png:$$/hover_recovery.png" } + -shutdown { image = "$$/normal_shutdown.png:$$/hover_shutdown.png" } + -restart { image = "$$/normal_restart.png:$$/hover_restart.png" } + -linux { image = "$$/normal_linux.png:$$/hover_linux.png" } + -ubuntu { image = "$$/normal_ubuntu.png:$$/hover_ubuntu.png" } + -debian { image = "$$/normal_debian.png:$$/hover_debian.png" } + -suse { image = "$$/normal_opensuse.png:$$/hover_opensuse.png" } + -freebsd { image = "$$/normal_freebsd.png:$$/hover_freebsd.png" } + -macosx { image = "$$/normal_osx.png:$$/hover_osx.png" } + -haiku { image = "$$/normal_haiku.png:$$/hover_haiku.png" } + -image { image = "$$/normal_os.png:$$/hover_os.png" } + -os { image = "$$/normal_os.png:$$/hover_os.png" } +} diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_debian.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_debian.png new file mode 100644 index 0000000..88b19a3 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_debian.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_elementary.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_elementary.png new file mode 100644 index 0000000..31863ec Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_elementary.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_freebsd.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_freebsd.png new file mode 100644 index 0000000..1162e53 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_freebsd.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_haiku.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_haiku.png new file mode 100644 index 0000000..cab9bfd Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_haiku.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_linux.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_linux.png new file mode 100644 index 0000000..8e215df Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_linux.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opengnsys.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opengnsys.png new file mode 100644 index 0000000..687f180 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opengnsys.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opensuse.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opensuse.png new file mode 100644 index 0000000..6ab2c37 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_opensuse.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_os.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_os.png new file mode 100644 index 0000000..7d33f4d Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_os.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_osx.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_osx.png new file mode 100644 index 0000000..5955b67 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_osx.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_recovery.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_recovery.png new file mode 100644 index 0000000..a1c6db3 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_recovery.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_restart.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_restart.png new file mode 100644 index 0000000..1f0e69f Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_restart.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_shutdown.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_shutdown.png new file mode 100644 index 0000000..2176660 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_shutdown.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_ubuntu.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_ubuntu.png new file mode 100644 index 0000000..becf779 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_ubuntu.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows.png new file mode 100644 index 0000000..9609364 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows10.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows10.png new file mode 100644 index 0000000..8caf5c7 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows10.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows7.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows7.png new file mode 100644 index 0000000..34d50eb Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows7.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows_metro.png b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows_metro.png new file mode 100644 index 0000000..8d4974e Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/icons/normal_windows_metro.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/000-70opaque.png b/ogclient/lib/burg/themes/OpenGnsys/images/000-70opaque.png new file mode 100644 index 0000000..8f92c2f Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/000-70opaque.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-bg.png new file mode 100644 index 0000000..a3ee24e Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-bg.png new file mode 100644 index 0000000..cd88d06 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-l.png new file mode 100644 index 0000000..1a9a516 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-r.png new file mode 100644 index 0000000..a8befbb Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-hover-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-l.png new file mode 100644 index 0000000..34b3bf0 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-r.png new file mode 100644 index 0000000..0cb01e8 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-tools-hover.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-tools-hover.png new file mode 100644 index 0000000..a8c74b1 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-tools-hover.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/button-tools.png b/ogclient/lib/burg/themes/OpenGnsys/images/button-tools.png new file mode 100644 index 0000000..1cef055 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/button-tools.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-b.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-b.png new file mode 100644 index 0000000..54b5999 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-b.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-bg.png new file mode 100644 index 0000000..9d1a625 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-bl.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-bl.png new file mode 100644 index 0000000..aaadeae Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-bl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-br.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-br.png new file mode 100644 index 0000000..eb2fbcb Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-br.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-l.png new file mode 100644 index 0000000..d2bda89 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-r.png new file mode 100644 index 0000000..741e2ba Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-t.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-t.png new file mode 100644 index 0000000..2ab4a00 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-t.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-bg.png new file mode 100644 index 0000000..e269395 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-l.png new file mode 100644 index 0000000..eb80522 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-r.png new file mode 100644 index 0000000..4195892 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-t.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-t.png new file mode 100644 index 0000000..6c56bf8 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-t.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tl.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tl.png new file mode 100644 index 0000000..1d2ad5e Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tr.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tr.png new file mode 100644 index 0000000..dbd43df Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-title-tr.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-tl.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-tl.png new file mode 100644 index 0000000..b12e704 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-tl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/container-tr.png b/ogclient/lib/burg/themes/OpenGnsys/images/container-tr.png new file mode 100644 index 0000000..92ed266 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/container-tr.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-b.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-b.png new file mode 100644 index 0000000..7fdf4d3 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-b.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bg.png new file mode 100644 index 0000000..373414b Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.png new file mode 100644 index 0000000..1ef93ff Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.xcf b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.xcf new file mode 100644 index 0000000..e2b417d Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-bl.xcf differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-br.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-br.png new file mode 100644 index 0000000..b877839 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-br.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-lr.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-lr.png new file mode 100644 index 0000000..9ebb1ba Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-lr.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-spacer.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-spacer.png new file mode 100644 index 0000000..e96e664 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-spacer.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-t.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-t.png new file mode 100644 index 0000000..05720e6 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-t.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tl.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tl.png new file mode 100644 index 0000000..d9554e6 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tr.png b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tr.png new file mode 100644 index 0000000..9d4123e Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/dialog-tr.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-b.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-b.png new file mode 100644 index 0000000..c8295bb Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-b.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-bl.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-bl.png new file mode 100644 index 0000000..1854229 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-bl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-br.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-br.png new file mode 100644 index 0000000..ff8871c Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-br.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-l.png new file mode 100644 index 0000000..3a4fc40 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-r.png new file mode 100644 index 0000000..dadd4ac Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-t.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-t.png new file mode 100644 index 0000000..cd99485 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-t.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tl.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tl.png new file mode 100644 index 0000000..8341760 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tl.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tr.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tr.png new file mode 100644 index 0000000..72a05f6 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg-tr.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg.png b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg.png new file mode 100644 index 0000000..92db1e0 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/progressbar-bg.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/text-line-l.png b/ogclient/lib/burg/themes/OpenGnsys/images/text-line-l.png new file mode 100644 index 0000000..ed1852c Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/text-line-l.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/text-line-r.png b/ogclient/lib/burg/themes/OpenGnsys/images/text-line-r.png new file mode 100644 index 0000000..5c9f49a Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/text-line-r.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/tick.png b/ogclient/lib/burg/themes/OpenGnsys/images/tick.png new file mode 100644 index 0000000..292ceb8 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/tick.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/txt-about.png b/ogclient/lib/burg/themes/OpenGnsys/images/txt-about.png new file mode 100644 index 0000000..f104c82 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/txt-about.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/txt-help.png b/ogclient/lib/burg/themes/OpenGnsys/images/txt-help.png new file mode 100644 index 0000000..6fad772 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/txt-help.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/txt-select.png b/ogclient/lib/burg/themes/OpenGnsys/images/txt-select.png new file mode 100644 index 0000000..d459597 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/txt-select.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/txt-tools.png b/ogclient/lib/burg/themes/OpenGnsys/images/txt-tools.png new file mode 100644 index 0000000..d8eadd7 Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/txt-tools.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/images/ubuntu-glow-96.png b/ogclient/lib/burg/themes/OpenGnsys/images/ubuntu-glow-96.png new file mode 100644 index 0000000..b8fd92c Binary files /dev/null and b/ogclient/lib/burg/themes/OpenGnsys/images/ubuntu-glow-96.png differ diff --git a/ogclient/lib/burg/themes/OpenGnsys/menus b/ogclient/lib/burg/themes/OpenGnsys/menus new file mode 100644 index 0000000..f9a13fd --- /dev/null +++ b/ogclient/lib/burg/themes/OpenGnsys/menus @@ -0,0 +1,188 @@ +tools_menu { + panel { + class = overlay + + panel { + attach_hcenter = 0 + attach_vcenter = 0 + width = 30 + + panel { + class = dialog-title + image { image = "$$/images/txt-tools.png" attach_left = 0 } + } + + panel { + class = dialog-body + + text { class = br } + + text { + text = "Toggle Mode" + command = "menu_toggle_mode" + class = text-menu-item + } + text { + text="Terminal" + command = "menu_popup term_window" + class = text-menu-item + } + text { + text = "Restart" + command = reboot + class = text-menu-item + } + text { + text = "Shutdown" + command = halt + class = text-menu-item + } + text { + text = "Help" + command = "menu_popup help" + class = text-menu-item + } + text { + text = "About" + command = "menu_popup about" + class = text-menu-item + } + } + } + } +} + +about { + panel { + class = overlay + + panel { + attach_hcenter = 0 + attach_vcenter = 0 + margin_left = 2 + width = 60 + + panel { + class = dialog-title + image { image = "$$/images/txt-about.png" attach_left = 0 } + } + + panel { + class = dialog-body + + text { class = br } + text { text = "Darkness" class = "dialog-text" } + text { class = br } + text { text = "Designed & Created by LuxieRayku(luksi.reiku@gmail.com)" class = "dialog-text" } + text { text = "Darkness theme is designed to feel clean," class = "dialog-text" } + text { text = "light, modern & minimal." class = dialog-text } + text { class = br } + + panel { + halign = center + class = button + command = true + + text { text = OK class = button-text } + } + } + } + } +} + +help { + panel { + class = overlay + + panel { + attach_hcenter = 0 + attach_vcenter = 0 + margin_left = 2 + width = 48 + + panel { + class = dialog-title + image { image = "$$/images/txt-help.png" attach_left = 0 } + } + + panel { + class = dialog-body + + text { text = "F1/h - Help" class = dialog-text } + text { text = "F2/t - Change theme" class = dialog-text } + text { text = "F3/r - Change resolution" class = dialog-text } + text { text = "F5/ctrl-x - Finish edit" class = dialog-text } + text { text = "F6 - Next window" class = dialog-text } + text { text = "F7 - Show folded items" class = dialog-text } + text { text = "F8 - Toggle between text and graphic mode" class = dialog-text } + text { text = "F9 - Shutdown" class = dialog-text } + text { text = "F10 - Reboot" class = dialog-text } + text { text = "f - Toggle between folded and unfolded mode" class = dialog-text } + text { text = "c - Open terminal" class = dialog-text } + text { text = "2 - Open two terminals" class = dialog-text } + text { text = "e - Edit current command" class = dialog-text } + text { text = "q - Quit graphic mode" class = dialog-text } + text { text = "i - Show theme information" class = dialog-text } + text { text = "n - Next item with the same class" class = dialog-text } + text { text = "w - Next windows item" class = dialog-text } + text { text = "u - Next ubuntu item" class = dialog-text } + text { text = "ESC - Exit from window or menu" class = dialog-text } + + panel { + halign = center + class = button + command = true + + text { text = OK class = button-text } + } + } + } + } +} + +term_window { + panel { + class = terminal + width = 100% + height = 100% + term { + width=100% + height=100% + } + } +} + +two_term { + panel { + width = 100% + height = 100% + direction = left_to_right + + panel { + class = terminal + extend = 1 + + term { + width=100% + height=100% + } + } + + panel { + class = terminal + extend = 1 + + term { + width=100% + height=100% + } + } + } +} +/*menu { + Shutdown { + class = "shutdown" + group = "group_main" + command = "halt" + } +}*/ diff --git a/ogclient/lib/burg/themes/OpenGnsys/style b/ogclient/lib/burg/themes/OpenGnsys/style new file mode 100644 index 0000000..325e503 --- /dev/null +++ b/ogclient/lib/burg/themes/OpenGnsys/style @@ -0,0 +1,158 @@ ++class { + ### Default Elements ### + screen { + background = "#250040" + } + + text { + color = "#4d0085:#ffffff" + font = "Sans Bold 16" + } + + progressbar { + width = 80% + height = 4/1 + color = "#ffffff:#4d0085" + } + + edit { + color = "white" + } + + password { + color = "white" + } + + term { + color = "white" + } + + ### Text Styles ### + br { + text = "- " + font = "Sans Bold 16" + } + + text-menu-item { + color = "white" + font = "Sans Bold 16" + } + + dialog-title-text { + halign = center + color = "black" + } + + dialog-text { + color = "white" + font = "Sans Bold 16" + } + + button-text { + font = "Sans Bold 16" + color = "white" + } + + ### Panel Styles ### + text-line { + left = ",,,#0x0020:$$/images/text-line-l.png" + background = ",,,#0x0020:$$/images/dialog-bg.png" + right = ",,,#0x0020:$$/images/text-line-r.png" + } + + button { + left = "$$/images/button-l.png:$$/images/button-hover-l.png" + background = "$$/images/button-bg.png:$$/images/button-hover-bg.png" + right = "$$/images/button-r.png:$$/images/button-hover-r.png" + margin_left = 2 + margin_right = 2 + margin_top = 3/0 + margin_bottom = 3/0 + } + + terminal { + top_left = ",,light-gray/black,#0x2554:,,white/black,#0x250F" + top = ",,light-gray/black,#0x2550:,tiling,white/black,#0x2501" + top_right = ",,light-gray/black,#0x2557:,,white/black,#0x2513" + left = ",,light-gray/black,#0x2551:,tiling,white/black,#0x2503" + background="$$/images/000-70opaque.png" + right = ",,light-gray/black,#0x2551:,tiling,white/black,#0x2503" + bottom_left = ",,light-gray/black,#0x255A:,,white/black,#0x2517" + bottom = ",,light-gray/black,#0x2550:,tiling,white/black,#0x2501" + bottom_right = ",,light-gray/black,#0x255D:,tiling,white/black,#0x251B" + } + + progressbar-background { + top_left = "$$/images/progressbar-bg-tl.png" + top = "$$/images/progressbar-bg-t.png" + top_right = "$$/images/progressbar-bg-tr.png" + left = "$$/images/progressbar-bg-l.png" + background = "$$/images/progressbar-bg.png" + right = "$$/images/progressbar-bg-r.png" + bottom_left = "$$/images/progressbar-bg-bl.png" + bottom = "$$/images/progressbar-bg-b.png" + bottom_right = "$$/images/progressbar-bg-br.png" + } + + + dialog { + top_left = "$$/images/dialog-tl.png" + top = "$$/images/dialog-t.png" + top_right = "$$/images/dialog-tr.png" + left = "$$/images/dialog-lr.png" + background = "$$/images/dialog-bg.png" + right = "$$/images/dialog-lr.png" + bottom_left = "$$/images/dialog-bl.png" + bottom = "$$/images/dialog-b.png" + bottom_right = "$$/images/dialog-br.png" + } + + dialog-title { + top_left = "$$/images/dialog-tl.png" + top = "$$/images/dialog-t.png" + top_right = "$$/images/dialog-tr.png" + left = "$$/images/dialog-lr.png" + background = "$$/images/dialog-bg.png" + right = "$$/images/dialog-lr.png" + bottom_left = "$$/images/dialog-spacer.png" + bottom = "$$/images/dialog-spacer.png" + bottom_right = "$$/images/dialog-spacer.png" + } + + dialog-body { + left = "$$/images/dialog-lr.png" + background = "$$/images/dialog-bg.png" + right = "$$/images/dialog-lr.png" + bottom_left = "$$/images/dialog-bl.png" + bottom = "$$/images/dialog-b.png" + bottom_right = "$$/images/dialog-br.png" + } + +# container-title { +# top_left = "$$/images/container-title-tl.png" +# top = "$$/images/container-title-t.png" +# top_right = "$$/images/container-title-tr.png" +# left = "$$/images/container-title-l.png" +# background = "$$/images/container-title-bg.png" +# right = "$$/images/container-title-r.png" +# } + + container-body { + top_left = "$$/images/container-tl.png" + top = "$$/images/container-t.png" + top_right = "$$/images/container-tr.png" + left = "$$/images/container-l.png" + background = "$$/images/container-bg.png" + right = "$$/images/container-r.png" + bottom_left = "$$/images/container-bl.png" + bottom = "$$/images/container-b.png" + bottom_right = "$$/images/container-br.png" + } + + overlay { + height = 100% + width = 100% + absolute = 1 + background="$$/images/000-70opaque.png" + } +} diff --git a/ogclient/lib/burg/themes/OpenGnsys/theme b/ogclient/lib/burg/themes/OpenGnsys/theme new file mode 100644 index 0000000..4307c18 --- /dev/null +++ b/ogclient/lib/burg/themes/OpenGnsys/theme @@ -0,0 +1,231 @@ +include "menus" +include "../icons/hover" +include "icons/icons" +include "style" + +screen { + background = "$$/background.png" + + panel { + halign = center + attach_vcenter = 0 + height = 19 + # Flip so the cursor defaults to the main menu + direction = bottom_to_top + + ### Main Menu ### + panel { + min_width = 36 + class = container-body + height = 14 +# margin_top = 0 + max_width = 128 + + panel { + halign = center + + space = 0 + direction = left_to_right + anchor = 1 + id = __menu__ + popup = bottom + } + } + + panel { + halign = center + height = 4 + min_width = 36 + class = container-title + + space = 0 + direction = left_to_right + anchor = 1 + + image { + halign=center + image = "$$/images/txt-select.png" + attach_top = 2 + attach_left = 2 + } + + ### Tools Menu ### +# image { +# attach_right = 2 +# image = "$$/images/button-tools.png:$$/images/button-tools-hover.png" +# command = "menu_popup tools_menu" +# } + } + } + + ### Progress Bar ### + panel { + halign = center + attach_bottom = 4 + width = 60 + class = progressbar-background + id = __timeout__ + + progressbar { } + } +} + +template_menuitem { + panel { + width = 20 + height = 10 + + parameters = "class=image.class:title=panel.text.text" + + ### Icon ### + image { + attach_vcenter = 0 + attach_hcenter = 0 + } + + ### Text ### +# panel { +# attach_vcenter = 0 +# attach_hcenter = 0 +# margin_left = 1 +# margin_right = 1 +# class = text-line +# text {} +# } + } +} + +template_submenu { + panel { + class = dialog + } +} + +template_subitem { + panel { + parameters = "title=text.text" + text {} + } +} + +template_popup { + panel { + attach_hcenter = 0 + attach_vcenter = 0 + class = dialog + } +} + +dialog_line { + panel { + parameters = "text=edit.text" + class = dialog + width = 60 + attach_hcenter = 0 + attach_vcenter = 0 + + edit { + lines = 1 + max_lines = 1 + } + } +} + +dialog_edit { + panel { + parameters = "text=edit.text" + class = dialog + width = 90 + attach_hcenter = 0 + attach_vcenter = 0 + + edit { + lines = 10 + } + } +} + +dialog_message { + panel { + parameters = "text=text.text" + class = dialog + margin_size = 1 + margin_bottom = 0 + space = 1 + attach_hcenter = 0 + attach_vcenter = 0 + text {} + panel { + class = button + command = true + halign = center + text { text = OK class = button-text } + } + } +} + +dialog_password { + panel { + parameters = "username=__user__.text:password=__pass__.text" + class = dialog + margin_size = 1 + margin_bottom = 0 + attach_hcenter = 0 + attach_vcenter = 0 + + panel { + direction = left_to_right + space = 1 + text { + extend = 1 + valign = center + text = Username + } + + panel { + margin_left = 1 + margin_right = 1 + edit { + id = __user__ + max_lines = 1 + } + } + } + + panel { + direction = left_to_right + space = 1 + text { + extend = 1 + valign = center + text = Password + } + panel { + margin_left = 1 + margin_right = 1 + password { + id = __pass__ + } + } + } + + panel { + class = button + command = true + halign = center + margin_left = 1 + margin_right = 1 + text { + text = OK + class = button-text + } + } + } +} +menu { + +# Shutdown { +# command = "halt" +# class = "shutdown" +# } +} diff --git a/ogclient/lib/engine/bin/Boot.lib b/ogclient/lib/engine/bin/Boot.lib new file mode 100755 index 0000000..04eaded --- /dev/null +++ b/ogclient/lib/engine/bin/Boot.lib @@ -0,0 +1,2973 @@ +#!/bin/bash +#/** +#@file Boot.lib +#@brief Librería o clase Boot +#@class Boot +#@brief Funciones para arranque y post-configuración de sistemas de archivos. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogBoot int_ndisk int_nfilesys [str_kernel str_initrd str_krnlparams] +#@brief Inicia el proceso de arranque de un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_krnlparams parámetros de arranque del kernel (opcional) +#@return (activar el sistema de archivos). +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo. +#@note En Linux, si no se indican los parámetros de arranque se detectan de la opción por defecto del cargador GRUB. +#@note En Linux, debe arrancarse la partición del directorio \c /boot +#@version 0.1 - Integración para OpenGnSys. - EAC: HDboot; BootLinuxEX en Boot.lib +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-11 +#@version 1.0.4 - Soporta modo de arranque Windows (parámetro de inicio "winboot"). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-12 +#@version 1.0.6 - Selección a partir de tipo de sistema operativo (en vez de S.F.) y arrancar Linux con /boot separado. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-06-05 +#@version 1.1.0 - Nuevo parámetro opcional con opciones de arranque del Kernel. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-07-15 +#@version 1.1.1 - UEFI: Permite iniciar linux recien instalados (ticket #802 #890) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-03-13 +#*/ ## +function ogBoot () +{ +# Variables locales. +local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER f +local EFIDISK EFIPART EFIDIR BOOTLABEL BOOTLOADER BOOTNO DIRGRUB b + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_kernel str_initrd str_kernelparams]" \ + "$FUNCNAME 1 1" "$FUNCNAME 1 2 \"/boot/vmlinuz /boot/initrd.img root=/dev/sda2 ro\"" + return +fi +# Error si no se reciben 2 o 3 parámetros. +[ $# == 2 ] || [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Detectar tipo de sistema de archivos y montarlo. +PART=$(ogDiskToDev $1 $2) || return $? +TYPE=$(ogGetOsType $1 $2) || return $? +# Error si no puede montar sistema de archivos. +MNTDIR=$(ogMount $1 $2) || return $? + +case "$TYPE" in + Linux|Android) + # Si no se indican, obtiene los parámetros de arranque para Linux. + PARAMS="${3:-$(ogLinuxBootParameters $1 $2 2>/dev/null)}" + # Si no existe y el UEFI buscar en particion ESP + [ -z "$PARAMS" ] && ogIsEfiActive && PARAMS="$(ogLinuxBootParameters $(ogGetEsp))" + # Si no existe, buscar sistema de archivo /boot en /etc/fstab. + if [ -z "$PARAMS" -a -e $MNTDIR/etc/fstab ]; then + # Localizar S.F. /boot en /etc/fstab del S.F. actual. + PART=$(ogDevToDisk $(awk '$1!="#" && $2=="/boot" {print $1}' $MNTDIR/etc/fstab)) + # Montar S.F. de /boot. + MNTDIR=$(ogMount $PART) || return $? + # Buscar los datos de arranque. + PARAMS=$(ogLinuxBootParameters $PART) || exit $? + fi + read -e KERNEL INITRD APPEND <<<"$PARAMS" + # Si no hay kernel, no hay sistema operativo. + [ -n "$KERNEL" -a -e "$MNTDIR/$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $? + # Arrancar de partición distinta a la original. + [ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}') + # Comprobar tipo de sistema. + if ogIsEfiActive; then + # Comprobar si el Kernel está firmado. + if ! file -k "$MNTDIR/$KERNEL" | grep -q "EFI app"; then + ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE, EFI)" + return $? + fi + + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + BOOTLOADER="shimx64.efi" + # Obtener parcición EFI. + read -e EFIDISK EFIPART <<<"$(ogGetEsp)" + # TODO: Comprobamos que existe la BOOTLABEL, si no buscamos por sistema operativo + if [ "$(ogGetPath $EFIDISK $EFIPART EFI/$BOOTLABEL)" == "" ]; then + OSVERSION="$(ogGetOsVersion $1 $2)" + case $OSVERSION in + *SUSE*) + BOOTLABEL="opensuse" + ;; + *Fedora*) + BOOTLABEL="fedora" + ;; + *Ubuntu*) + BOOTLABEL="ubuntu" + ;; + *) + ogRaiseError $OG_ERR_NOTFOUND "$EFIDISK $EFIPART Boot loader"; return $? + ;; + esac + fi + + # Crear orden de arranque (con unos valores por defecto). + ogNvramAddEntry $BOOTLABEL "/EFI/$BOOTLABEL/Boot/$BOOTLOADER" + # Marcar próximo arranque y reiniciar. + ogNvramSetNext "$BOOTLABEL" + reboot + else + # Arranque BIOS: configurar kernel Linux con los parámetros leídos de su GRUB. + kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}" + kexec -e & + fi + ;; + Windows) + # Comprobar tipo de sistema. + if ogIsEfiActive; then + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + # Obtener parcición EFI. + read -e EFIDISK EFIPART <<<"$(ogGetEsp)" + [ -n "$EFIPART" ] || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? + EFIDIR=$(ogMount $EFIDISK $EFIPART) || exit $? + # Comprobar cargador (si no existe buscar por defecto en ESP). + LOADER=$(ogGetPath $EFIDIR/EFI/$BOOTLABEL/Boot/bootmgfw.efi) + [ -z "$LOADER" ] && BOOTLABEL=Microsoft && LOADER=$(ogGetPath $EFIDIR/EFI/Microsoft/Boot/bootmgfw.efi) + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE, EFI)" || return $? + + # Crear orden de arranque (con unos valores por defecto). + ogNvramAddEntry $BOOTLABEL "/EFI${LOADER#*EFI}" + # Marcar próximo arranque y reiniciar. + ogNvramSetNext "$BOOTLABEL" + reboot + else + # Arranque BIOS: comprueba si hay un cargador de Windows. + for f in io.sys ntldr bootmgr; do + FILE="$(ogGetPath $1 $2 $f 2>/dev/null)" + [ -n "$FILE" ] && LOADER="$f" + done + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $? + if [ "$winboot" == "kexec" ]; then + # Modo de arranque en caliente (con kexec). + cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) + kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init" + kexec -e & + else + # Modo de arranque por reinicio (con reboot). + dd if=/dev/zero of=${MNTDIR}/ogboot.me bs=1024 count=3 + dd if=/dev/zero of=${MNTDIR}/ogboot.firstboot bs=1024 count=3 + dd if=/dev/zero of=${MNTDIR}/ogboot.secondboot bs=1024 count=3 + if [ -z "$(ogGetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleannboot')" ]; then + ogAddRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot' + ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows\CurrentVersion\Run\ogcleanboot' "cmd /c del c:\ogboot.*" + fi + # Activar la partición. + ogSetPartitionActive $1 $2 + reboot + fi + fi + ;; + MacOS) + # Modo de arranque por reinicio. + # Nota: el cliente tiene que tener configurado correctamente Grub. + touch ${MNTDIR}/boot.mac &>/dev/null + reboot + ;; + GrubLoader) + # Reiniciar. + #reboot + ;; + *) ogRaiseError $OG_ERR_NOTOS "$1 $2 ${TYPE:+($TYPE)}" + return $? + ;; +esac +} + + +#/** +# ogGetWindowsName int_ndisk int_nfilesys +#@brief Muestra el nombre del equipo en el registro de Windows. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return str_name - nombre del equipo +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#*/ ## +function ogGetWindowsName () +{ +# Variables locales. +local MNTDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1 ==> PRACTICA-PC" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Montar el sistema de archivos. +MNTDIR=$(ogMount $1 $2) || return $? + +# Obtener dato del valor de registro. +ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' +} + + +#/** +# ogLinuxBootParameters int_ndisk int_nfilesys +#@brief Muestra los parámetros de arranque de un sistema de archivos Linux. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return str_kernel str_initrd str_parameters ... +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@warning Función básica usada por \c ogBoot +#@version 0.9 - Primera adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-11 +#@version 0.9.2 - Soporta partición /boot independiente. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-20 +#@version 1.0.5 - Mejoras en tratamiento de GRUB2. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-05-14 +#@version 1.0.6 - Detectar instalaciones sobre EFI. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-09-15 +#*/ ## +function ogLinuxBootParameters () +{ +# Variables locales. +local MNTDIR CONFDIR CONFFILE f + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 2 ==> /vmlinuz-3.5.0-21-generic /initrd.img-3.5.0-21-generic root=/dev/sda2 ro splash" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Detectar id. de tipo de partición y codificar al mnemonico. +MNTDIR=$(ogMount $1 $2) || return $? + +# Fichero de configuración de GRUB. +CONFDIR=$MNTDIR # Sistema de archivos de arranque (/boot). +[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Sist. archivos raíz con directorio boot. +for f in $MNTDIR/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub{2,},{,efi/}EFI/*}/{menu.lst,grub.cfg}; do + [ -r $f ] && CONFFILE=$f +done +[ -n "$CONFFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $? + +# Toma del fichero de configuracion los valores del kernel, initrd +# y parámetros de arranque usando las cláusulas por defecto +# ("default" en GRUB1, "set default" en GRUB2) +# y los formatea para que sean compatibles con \c kexec . */ +# /* (comentario Doxygen) +awk 'BEGIN {cont=-1;} + $1~/^default$/ {sub(/=/," "); def=$2;} + $1~/^set$/ && $2~/^default/ { gsub(/[="]/," "); def=$3; + if (def ~ /saved_entry/) def=0; + } + $1~/^(title|menuentry)$/ {cont++} + $1~/^set$/ && $2~/^root=.\(hd'$[1-1]',(msdos|gpt)'$2'\).$/ { if (def==0) def=cont; } + $1~/^(kernel|linux(16|efi)?)$/ { if (def==cont) { + kern=$2; + sub($1,""); sub($1,""); sub(/^[ \t]*/,""); app=$0 + } # /* (comentario Doxygen) + } + $1~/^initrd(16|efi)?$/ {if (def==cont) init=$2} + END {if (kern!="") printf("%s %s %s", kern,init,app)} + ' $CONFFILE +# */ (comentario Doxygen) +} + + +#/** +# ogSetWindowsName int_ndisk int_nfilesys str_name +#@brief Establece el nombre del equipo en el registro de Windows. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_name nombre asignado +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@exception OG_ERR_OUTOFLIMIT Nombre Netbios con más de 15 caracteres. +#@version 0.9 - Adaptación a OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-24 +#@version 1.0.5 - Establecer restricción de tamaño de nombre Netbios. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-03-20 +#*/ ## +function ogSetWindowsName () +{ +# Variables locales. +local PART MNTDIR NAME + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_name" \ + "$FUNCNAME 1 1 PRACTICA-PC" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Error si el nombre supera los 15 caracteres. +[ ${#3} -le 15 ] || ogRaiseError $OG_ERR_OUTOFLIMIT "\"${3:0:15}...\"" || return $? + +# Montar el sistema de archivos. +MNTDIR=$(ogMount $1 $2) || return $? + +# Asignar nombre. +NAME="$3" + +# Modificar datos de los valores de registro. +ogSetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerName\ComputerName' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\HostName' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\Hostname' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\Services\Tcpip\Parameters\NV HostName' "$NAME" 2>/dev/null +ogSetRegistryValue $MNTDIR system '\ControlSet001\services\Tcpip\Parameters\NV Hostname' "$NAME" 2>/dev/null +} + + +#/** +# ogSetWinlogonUser int_ndisk int_npartition str_username +#@brief Establece el nombre de usuario por defecto en la entrada de Windows. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_username nombre de usuario por defecto +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9.2 - Adaptación a OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-20 +#*/ ## +function ogSetWinlogonUser () +{ +# Variables locales. +local PART MNTDIR NAME + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_username" \ + "$FUNCNAME 1 1 USUARIO" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Montar el sistema de archivos. +MNTDIR=$(ogMount $1 $2) || return $? + +# Asignar nombre. +NAME="$3" + +# Modificar datos en el registro. +ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$3" +} + + +#/** +# ogBootMbrXP int_ndisk +#@brief Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows +#@param int_ndisk nº de orden del disco +#@return salida del programa my-sys +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGnSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + +function ogBootMbrXP () +{ +# Variables locales. +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \ + "$FUNCNAME 1" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +DISK="$(ogDiskToDev $1)" || return $? +ms-sys -z -f $DISK +ms-sys -m -f $DISK +} + + +#/** +# ogBootMbrGeneric int_ndisk +#@brief Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux. +#@param int_ndisk nº de orden del disco +#@return salida del programa my-sys +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGnSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + +function ogBootMbrGeneric () +{ +# Variables locales. +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \ + "$FUNCNAME 1 " + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK="$(ogDiskToDev $1)" || return $? +ms-sys -z -f $DISK +ms-sys -s -f $DISK + +# Firma necesaria para Windows equipos UEFI +SIGNATURE=0x$(cat /proc/sys/kernel/random/uuid | cut -d '-' -f1) +ms-sys -S $SIGNATURE $DISK +} + + + + +#/** +# ogFixBootSector int_ndisk int_parition +#@brief Corrige el boot sector de una particion activa para MS windows/dos -fat-ntfs +#@param int_ndisk nº de orden del disco +#@param int_partition nº de particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGnSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + +function ogFixBootSector () +{ +# Variables locales. +local PARTYPE DISK PART FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +#TODO, solo si la particion existe +#TODO, solo si es ntfs o fat +PARTYPE=$(ogGetPartitionId $1 $2) +case "$PARTYPE" in + 1|4|6|7|b|c|e|f|17|700|EF00) + ;; + *) + return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + ;; +esac + +ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + +#Preparando instruccion +let DISK=$1-1 +PART=$2 +FILE=/tmp/temp$$ +cat > $FILE < ${MOUNT}/tmp.boot.ini; mv ${MOUNT}/tmp.boot.ini ${MOUNT}/boot.ini + return 0 +fi + +ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + + +#Preparando instruccion Windows Resume Application +cat > $FILE < $FILE < $FILE < $FILE < $FILE < $FILE < $FILE < $FILE <stico de memoria de Windows +EOF +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE + +rm -f $FILE +} + + + +#/** +# ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition +#@brief Registra una partición en windows con un determinado volumen. +#@param int_ndisk nº de orden del disco a registrar +#@param int_partition nº de particion a registrar +#@param str_volumen volumen a resgistar +#@param int_ndisk_windows nº de orden del disco donde esta windows +#@param int_partition_windows nº de particion donde esta windows +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGnSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## +function ogWindowsRegisterPartition () +{ +# Variables locales. +local PART DISK FILE REGISTREDDISK REGISTREDPART REGISTREDVOL VERSION SYSTEMROOT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk_TO_registre int_partition_TO_registre str_NewVolume int_disk int_parition " \ + "$FUNCNAME 1 1 c: 1 1" + return +fi + +# Error si no se reciben 5 parámetros. +[ $# == 5 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +REGISTREDDISK=$1 +REGISTREDPART=$2 +REGISTREDVOL=$(echo $3 | cut -c1 | tr '[:lower:]' '[:upper:]') +DISK=$4 +PART=$5 +FILE=/tmp/temp$$ + +ogDiskToDev $REGISTREDDISK $REGISTREDPART || return $(ogRaiseError $OG_ERR_PARTITION "particion a registrar "; echo $?) +ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows"; echo $?) + +ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?) + +VERSION=$(ogGetOsVersion $DISK $PART) + +#Systemroot + +if ogGetPath $DISK $PART WINDOWS +then + SYSTEMROOT="Windows" +elif ogGetPath $DISK $PART WINNT +then + SYSTEMROOT="winnt" +else + return $(ogRaiseError $OG_ERR_NOTOS; echo $?) +fi + +ogUnmount $DISK $PART +let DISK=$DISK-1 +let REGISTREDDISK=$REGISTREDDISK-1 +#Preparando instruccion Windows Boot Manager +cat > $FILE <> /etc/default/grub + echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub + + + #Preparar configuración segunda etapa: crear ubicacion + mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/ + #Preparar configuración segunda etapa: crear cabecera del fichero (ignorar errores) + sed -i 's/^set -e/#set -e/' /etc/grub.d/00_header + # (ogLive 5.0) Si 'pkgdatadir' está vacía ponemos valor de otros ogLive + sed -i '/grub-mkconfig_lib/i\pkgdatadir=${pkgdatadir:-"${datarootdir}/grub"}' /etc/grub.d/00_header + /etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg 2>/dev/null + + #Preparar configuración segunda etapa: crear entrada del sistema operativo + grubSyntax "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg + + # Renombramos la configuración de grub antigua + [ -f ${SECONDSTAGE}/boot/grub/grub.cfg ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME + +fi + +#Instalar el grub +grub-install --force ${EFIOPTGRUB} --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE +EVAL=$? + +# Movemos el grubx64.efi +if ogIsEfiActive; then + mv ${EFISECONDSTAGE}/EFI/$EFISUBDIR/EFI/BOOT/* ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot + rm -rf ${EFISECONDSTAGE}/EFI/$EFISUBDIR/EFI + cp /usr/lib/shim/shimx64.efi.signed ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot/shimx64.efi + # Nombre OpenGnsys para cargador + cp ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot/{grubx64.efi,ogloader.efi} + + # Creamos entrada NVRAM y la ponemos en segundo lugar + ogNvramAddEntry grub /EFI/grub/Boot/shimx64.efi + GRUBENTRY=$(ogNvramList| awk '{if ($2=="grub") print $1}') + NEWORDER="$(ogNvramGetOrder|awk -v ENTRY=$GRUBENTRY '{gsub(",", " "); printf "%x %x %s\n", $1 , ENTRY , substr($0, index($0,$2))}')" + ogNvramSetOrder $NEWORDER +fi +return $EVAL + +} + + +#/** +# ogGrubInstallPartition int_disk_SECONDSTAGE int_partition_SECONDSTAGE bolean_Check_Os_installed_and_Configure_2ndStage +#@brief Instala y actualiza el gestor grub en el bootsector de la particion indicada +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default] +#@param str "kernel param " +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.2 - Primeras pruebas. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-10-29 +#@version 1.0.3 - Soporte para linux de 32 y 64 bits +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2012-03-13 +#@version 1.0.3 - Ficheros de configuracion independientes segun ubicación de la priemra etapa +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2012-03-13 +#@version 1.1.1 - #802 Equipos EFI: Se crea el grub.cfg de la partición EFI +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-08 +#@version 1.1.1 - #890 UEFI: el grub.cfg original es necesario para obtener los datos del kernel efi: se mueve al final. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-03-05 +#*/ ## + +function ogGrubInstallPartition () +{ + +# Variables locales. +local PART DISK VERSION FIRSTAGE SECONSTAGE CHECKOS KERNELPARAM BACKUPNAME +local EFIDISK EFIPART EFISECONDSTAGE EFISUBDIR EFIOPTGRUB EFIBOOTDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage \"param param \" " \ + "$FUNCNAME 1 1 FALSE " \ + "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK=$1; PART=$2; +CHECKOS=${3:-"FALSE"} +KERNELPARAM=$4 +BACKUPNAME=".backup.og" + +#error si no es linux. +VERSION=$(ogGetOsVersion $DISK $PART) +echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?) + +#Localizar primera etapa del grub +FIRSTSTAGE=$(ogDiskToDev $DISK $PART) + +#localizar disco segunda etapa del grub +SECONDSTAGE=$(ogMount $DISK $PART) + +#Localizar directorio segunda etapa del grub +PREFIXSECONDSTAGE="/boot/grubPARTITION" + +# Si es EFI instalamos el grub en la ESP +EFIOPTGRUB="" +# Desde el bootdir uefi y bios buscan el grub.cfg en subdirectorios distintos. +EFIBOOTDIR="" +if ogIsEfiActive; then + read EFIDISK EFIPART <<< $(ogGetEsp) + # Comprobamos que exista ESP y el directorio para ubuntu + EFISECONDSTAGE=$(ogMount $EFIDISK $EFIPART) + if [ $? -ne 0 ]; then + ogFormat $EFIDISK $EFIPART FAT32 + EFISECONDSTAGE=$(ogMount $EFIDISK $EFIPART) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? + fi + EFISUBDIR=$(printf "Part-%02d-%02d" $DISK $PART) + # Borramos la configuración anterior + [ -d ${EFISECONDSTAGE}/EFI/$EFISUBDIR ] && rm -rf ${EFISECONDSTAGE}/EFI/$EFISUBDIR + mkdir -p ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot + EFIOPTGRUB=" --removable --no-nvram --uefi-secure-boot --target $(ogGetArch)-efi --efi-directory=${EFISECONDSTAGE}/EFI/$EFISUBDIR " + EFIBOOTDIR="/boot" +fi + +# Si Reconfigurar segunda etapa (grub.cfg) == FALSE +if [ "${CHECKOS^^}" == "FALSE" ] && [ -f ${SECONDSTAGE}/boot/grub/grub.cfg -o -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] +then + # Si no se reconfigura se utiliza el grub.cfg orginal + [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg + # Si no se reconfigure se borra los ficheros previos de configuración específicos de opengnsys. + [ -d ${SECONDSTAGE}${PREFIXSECONDSTAGE} ] && rm -fr ${SECONDSTAGE}${PREFIXSECONDSTAGE} + # Reactivamos el grub con el grub.cfg original. + PREFIXSECONDSTAGE="" +else + # SI Reconfigurar segunda etapa (grub.cfg) == TRUE + + if ogIsEfiActive; then + # UEFI: grubSintax necesita grub.cfg para detectar los kernels: si no existe recupero backup. + if ! [ -f ${SECONDSTAGE}/boot/grub/grub.cfg ]; then + [ -f ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ] && mv ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME ${SECONDSTAGE}/boot/grub/grub.cfg + fi + else + #Evitar detectar modo recovery - mover grub.cfg original a grub.cfg.backup + mv ${SECONDSTAGE}/boot/grub/grub.cfg ${SECONDSTAGE}/boot/grub/grub.cfg$BACKUPNAME + fi + + #Configur la sintaxis grub para evitar menus de "recovery" en el OGLive + echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub + echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub + + #Preparar configuración segunda etapa: crear ubicacion + mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/ + #Preparar configuración segunda etapa: crear cabecera del fichero (ingnorar errores) + sed -i 's/^set -e/#set -e/' /etc/grub.d/00_header + # (ogLive 5.0) Si 'pkgdatadir' está vacía ponemos valor de otros ogLive + sed -i '/grub-mkconfig_lib/i\pkgdatadir=${pkgdatadir:-"${datarootdir}/grub"}' /etc/grub.d/00_header + /etc/grub.d/00_header > ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg 2>/dev/null + #Preparar configuración segunda etapa: crear entrada del sistema operativo + grubSyntax $DISK $PART "$KERNELPARAM" >> ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/grub/grub.cfg + +fi +#Instalar el grub +grub-install --force ${EFIOPTGRUB} --root-directory=${SECONDSTAGE}${PREFIXSECONDSTAGE} $FIRSTSTAGE +EVAL=$? + +# Movemos el grubx64.efi +if ogIsEfiActive; then + mv ${EFISECONDSTAGE}/EFI/$EFISUBDIR/EFI/BOOT/* ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot + rm -rf ${EFISECONDSTAGE}/EFI/$EFISUBDIR/EFI + cp /usr/lib/shim/shimx64.efi.signed ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot/shimx64.efi + # Nombre OpenGnsys para cargador + cp ${EFISECONDSTAGE}/EFI/$EFISUBDIR/Boot/{grubx64.efi,ogloader.efi} +fi + +return $EVAL +} + + +#/** +# ogConfigureFstab int_ndisk int_nfilesys +#@brief Configura el fstab según particiones existentes +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No se encuentra el fichero fstab a procesar. +#@warning Puede haber un error si hay más de 1 partición swap. +#@version 1.0.5 - Primera versión para OpenGnSys. Solo configura la SWAP +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2013-03-21 +#@version 1.0.6b - correccion. Si no hay partición fisica para la SWAP, eliminar entrada del fstab. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2016-11-03 +#@version 1.1.1 - Se configura la partición ESP (para sistemas EFI) (ticket #802) +#@author Irina Gómez, ETSII Universidad de Sevilla +#@date 2018-12-13 +#*/ ## +function ogConfigureFstab () +{ +# Variables locales. +local FSTAB DEFROOT PARTROOT DEFSWAP PARTSWAP +local EFIDISK EFIPART EFIDEV EFIOPT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Error si no se encuentra un fichero etc/fstab en el sistema de archivos. +FSTAB=$(ogGetPath $1 $2 /etc/fstab) 2>/dev/null +[ -n "$FSTAB" ] || ogRaiseError $OG_ERR_NOTFOUND "$1,$2,/etc/fstab" || return $? + +# Hacer copia de seguridad del fichero fstab original. +cp -a ${FSTAB} ${FSTAB}.backup +# Dispositivo del raíz en fichero fstab: 1er campo (si no tiene "#") con 2º campo = "/". +DEFROOT=$(awk '$1!~/#/ && $2=="/" {print $1}' ${FSTAB}) +PARTROOT=$(ogDiskToDev $1 $2) +# Configuración de swap (solo 1ª partición detectada). +PARTSWAP=$(blkid -t TYPE=swap | awk -F: 'NR==1 {print $1}') +if [ -n "$PARTSWAP" ] +then + # Dispositivo de swap en fichero fstab: 1er campo (si no tiene "#") con 3er campo = "swap". + DEFSWAP=$(awk '$1!~/#/ && $3=="swap" {print $1}' ${FSTAB}) + if [ -n "$DEFSWAP" ] + then + echo "Hay definicion de SWAP en el FSTAB $DEFSWAP -> modificamos fichero con nuevo valor $DEFSWAP->$PARTSWAP" # Mensaje temporal. + sed "s|$DEFSWAP|$PARTSWAP|g ; s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB} + else + echo "No hay definicion de SWAP y si hay partición SWAP -> moficamos fichero" # Mensaje temporal. + sed "s|$DEFROOT|$PARTROOT|g" ${FSTAB}.backup > ${FSTAB} + echo "$PARTSWAP none swap sw 0 0" >> ${FSTAB} + fi +else + echo "No hay partición SWAP -> configuramos FSTAB" # Mensaje temporal. + sed "/swap/d" ${FSTAB}.backup > ${FSTAB} +fi +# Si es un sistema EFI incluimos partición ESP (Si existe la modificamos) +if ogIsEfiActive; then + read EFIDISK EFIPART <<< $(ogGetEsp) + EFIDEV=$(ogDiskToDev $EFIDISK $EFIPART) + + # Opciones de la partición ESP: si no existe ponemos un valor por defecto + EFIOPT=$(awk '$1!~/#/ && $2=="/boot/efi" {print $3"\t"$4"\t"$5"\t"$6 }' ${FSTAB}) + [ "$EFIOPT" == "" ] && EFIOPT='vfat\tumask=0077\t0\t1' + + sed -i /"boot\/efi"/d ${FSTAB} + echo -e "$EFIDEV\t/boot/efi\t$EFIOPT" >> ${FSTAB} +fi +} + +#/** +# ogSetLinuxName int_ndisk int_nfilesys [str_name] +#@brief Establece el nombre del equipo en los ficheros hostname y hosts. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_name nombre asignado (opcional) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@note Si no se indica nombre, se asigna un valor por defecto. +#@version 1.0.5 - Primera versión para OpenGnSys. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2013-03-21 +#*/ ## +function ogSetLinuxName () +{ +# Variables locales. +local MNTDIR ETC NAME + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_name]" \ + "$FUNCNAME 1 1" "$FUNCNAME 1 1 practica-pc" + return +fi +# Error si no se reciben 2 o 3 parámetros. +case $# in + 2) # Asignar nombre automático (por defecto, "pc"). + NAME="$(ogGetHostname)" + NAME=${NAME:-"pc"} ;; + 3) # Asignar nombre del 3er parámetro. + NAME="$3" ;; + *) # Formato de ejecución incorrecto. + ogRaiseError $OG_ERR_FORMAT + return $? +esac + +# Montar el sistema de archivos. +MNTDIR=$(ogMount $1 $2) || return $? + +ETC=$(ogGetPath $1 $2 /etc) + +if [ -d "$ETC" ]; then + #cambio de nombre en hostname + echo "$NAME" > $ETC/hostname + #Opcion A para cambio de nombre en hosts + #sed "/127.0.1.1/ c\127.0.1.1 \t $HOSTNAME" $ETC/hosts > /tmp/hosts && cp /tmp/hosts $ETC/ && rm /tmp/hosts + #Opcion B componer fichero de hosts + cat > $ETC/hosts <&2; echo $?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?) + + # Si existe la entrada de opengnsys, se borra + grep -q "menuentry Opengnsys" $GRUBGFC && sed -ie "/menuentry Opengnsys/,+6d" $GRUBGFC + + # Tipo de tabla de particiones + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + + # Localizacion de la cache + read NUMDISK NUMPART <<< $(ogFindCache) + let NUMDISK=$NUMDISK-1 + # kernel y sus opciones. Pasamos a modo usuario + KERNEL="/boot/${oglivedir}/ogvmlinuz $(sed -e s/^.*linuz//g -e s/ogactiveadmin=[a-z]*//g /proc/cmdline)" + + # Configuracion offline si existe parametro + echo "$@" |grep offline &>/dev/null && STATUS=offline + echo "$@" |grep online &>/dev/null && STATUS=online + [ -z "$STATUS" ] || KERNEL="$(echo $KERNEL | sed s/"ogprotocol=[a-z]* "/"ogprotocol=local "/g ) ogstatus=$STATUS" + + # Numero de línea de la primera entrada del grub. + NUMLINE=$(grep -n -m 1 "^menuentry" $GRUBGFC|cut -d: -f1) + # Texto de la entrada de opengnsys +MENUENTRY="menuentry "OpenGnsys" --class opengnsys --class gnu --class os { \n \ +\tinsmod part_$PARTTABLETYPE \n \ +\tinsmod ext2 \n \ +\tset root='(hd${NUMDISK},$PARTTABLETYPE${NUMPART})' \n \ +\tlinux $KERNEL \n \ +\tinitrd /boot/${oglivedir}/oginitrd.img \n \ +}" + + + # Insertamos la entrada de opengnsys antes de la primera entrada existente. + sed -i "${NUMLINE}i\ $MENUENTRY" $GRUBGFC + + # Ponemos que la entrada por defecto sea la primera. + sed -i s/"set.*default.*$"/"set default=\"0\""/g $GRUBGFC + + # Si me dan valor para timeout lo cambio en el grub. + [ $TIMEOUT ] && sed -i s/timeout=.*$/timeout=$TIMEOUT/g $GRUBGFC +} + +#/** +# ogGrubHidePartitions num_disk num_part +#@brief ver ogBootLoaderHidePartitions +#@see ogBootLoaderHidePartitions +#*/ ## +function ogGrubHidePartitions () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [ num_disk_partdata num_partdata ]" \ + "$FUNCNAME 1 2" \ + "$FUNCNAME 1 2 1 3" + return + fi + ogBootLoaderHidePartitions $@ + return $? +} + +#/** +# ogBurgHidePartitions num_disk num_part +#@brief ver ogBootLoaderHidePartitions +#@see ogBootLoaderHidePartitions +#*/ ## +function ogBurgHidePartitions () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [ num_disk_partdata num_partdata ]" \ + "$FUNCNAME 1 2" \ + "$FUNCNAME 1 2 1 3" + return + fi + ogBootLoaderHidePartitions $@ + return $? +} + +#/** +# ogBootLoaderHidePartitions num_disk num_part +#@brief Configura el grub/burg para que oculte las particiones de windows que no se esten iniciando. +#@param 1 Numero de disco +#@param 2 Numero de particion +#@param 3 Numero de disco de la partición de datos (no ocultar) +#@param 4 Numero de particion de datos (no ocultar) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception No existe archivo de configuracion del grub/burg. +#@version 1.1 Se comprueban las particiones de Windows con blkid (y no con grub.cfg) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2015-11-17 +#@version 1.1 Se generaliza la función para grub y burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017-10-20 +#@version 1.1.1 Se incluye comentarios en codigo para autodocuemtnacion con Doxygen +#@author Antonio J. Doblas Viso, EVLT Univesidad de Malaga. +#@date 2018-07-05 +#@version Se permite una partición de datos que no se ocultará. Soporta más de un disco. Compatible con grub.cfg creado por ogLive 5.0 +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-08-26 +#*/ + +function ogBootLoaderHidePartitions () +{ + local FUNC DIRMOUNT GFCFILE PARTTABLETYPE WINENTRY WINPART ENTRY LINE PART PARTDATA TEXT PARTHIDDEN HIDDEN + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubHidePartitions ogBurgHidePartitions" + return + fi + + # Nombre de la función que llama a esta. + FUNC="${FUNCNAME[@]:1}" + FUNC="${FUNC%%\ *}" + + # Error si no se reciben 2 parámetros. + [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part [ num_disk_partdata num_partdata ]"; echo $?) + # Si no existe $4 pongo un valor imposible para la partición de datos + [ $# -eq 4 ] && PARTDATA=$(ogDiskToDev $3 $4) || PARTDATA=0 + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + # La función debe ser llamanda desde ogGrubHidePartitions or ogBurgHidePartitions. + case "$FUNC" in + ogGrubHidePartitions) + CFGFILE="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + ;; + ogBurgHidePartitions) + CFGFILE="$DIRMOUNT/boot/burg/burg.cfg" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubHidePartitions or ogBurgHidePartitions." + return $? + ;; + esac + + # Error si no existe archivo del grub + [ -r $CFGFILE ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$CFGFILE" 1>&2; echo $?) + + # Si solo hay una particion de Windows me salgo + [ $(fdisk -l $(ogDiskToDev) | grep 'NTFS' |wc -l) -eq 1 ] && return 0 + + # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion. + sed -i '/parttool/d' $CFGFILE + + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + +# /* (comentario de bloque para Doxygen) + # Entradas de Windows: numero de linea y particion. De mayor a menor. + WINENTRY=$(awk '/menuentry.*Windows/ {gsub(/\)\"/, ""); gsub(/^.*dev/,""); print NR":/dev"$1} ' $CFGFILE | sed -e '1!G;h;$!d') + #*/ (comentario para bloque Doxygen) + # Particiones de Windows, pueden no estar en el grub. + WINPART=$(fdisk -l $(ogDiskToDev)|awk '/NTFS/ {print $1}'|sed '1!G;h;$!d') + + + # Modifico todas las entradas de Windows. + for ENTRY in $WINENTRY; do + LINE=${ENTRY%:*} + PART=${ENTRY#*:} + + # En cada entrada, oculto o muestro cada particion. + TEXT="" + for PARTHIDDEN in $WINPART; do + # Muestro la particion de la entrada actual y la de datos. + [ "$PARTHIDDEN" == "$PART" -o "$PARTHIDDEN" == "$PARTDATA" ] && HIDDEN="-" || HIDDEN="+" + read NUMDISK NUMPART <<< $(ogDevToDisk $PARTHIDDEN) + + TEXT="\tparttool (hd$((NUMDISK-1)),$PARTTABLETYPE$NUMPART) hidden$HIDDEN \n$TEXT" + done + + sed -i "${LINE}a\ $TEXT" $CFGFILE + done + + # Activamos la particion que se inicia en todas las entradas de windows. + sed -i "/chainloader/i\\\tparttool \$\{root\} boot+" $CFGFILE +} + +#/** +# ogGrubDeleteEntry num_disk num_part num_disk_delete num_part_delete +#@brief ver ogBootLoaderDeleteEntry +#@see ogBootLoaderDeleteEntry +#*/ +function ogGrubDeleteEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_disk_delete int_npartition_delete" \ + "$FUNCNAME 1 6 2 1" + return + fi + ogBootLoaderDeleteEntry $@ + return $? +} + +#/** +# ogBurgDeleteEntry num_disk num_part num_disk_delete num_part_delete +#@brief ver ogBootLoaderDeleteEntry +#@see ogBootLoaderDeleteEntry +#*/ +function ogBurgDeleteEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_disk_delete int_npartition_delete" \ + "$FUNCNAME 1 6 2 1" + return + fi + ogBootLoaderDeleteEntry $@ + return $? +} + +#/** +# ogRefindDeleteEntry num_disk_delete num_part_delete +#@brief ver ogBootLoaderDeleteEntry +#@see ogBootLoaderDeleteEntry +#*/ +function ogRefindDeleteEntry () +{ + local EFIDISK EFIPART + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_disk_delete int_npartition_delete" \ + "$FUNCNAME 2 1" + return + fi + read EFIDISK EFIPART <<< $(ogGetEsp) + ogBootLoaderDeleteEntry $EFIDISK $EFIPART $@ + return $? +} + +#/** +# ogBootLoaderDeleteEntry num_disk num_part num_part_delete +#@brief Borra en el grub las entradas para el inicio en una particion. +#@param 1 Numero de disco donde esta el grub +#@param 2 Numero de particion donde esta el grub +#@param 3 Numero del disco del que borramos las entradas +#@param 4 Numero de la particion de la que borramos las entradas +#@note Tiene que ser llamada desde ogGrubDeleteEntry, ogBurgDeleteEntry o ogRefindDeleteEntry +#@return (nada) +#@exception OG_ERR_FORMAT Use ogGrubDeleteEntry or ogBurgDeleteEntry. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub. +#@version 1.1 Se generaliza la función para grub y burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017-10-20 +#*/ ## + +function ogBootLoaderDeleteEntry () +{ + local FUNC DIRMOUNT CFGFILE LABEL MENUENTRY DELETEENTRY ENDENTRY ENTRY + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogBurgDeleteEntry, ogGrubDeleteEntry or ogRefindDeleteEntry" + return + fi + + # Si el número de parámetros menos que 4 nos salimos + [ $# -lt 4 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part num_disk_delete num_part_delete"; echo $?) + + + # Nombre de la función que llama a esta. + FUNC="${FUNCNAME[@]:1}" + FUNC="${FUNC%%\ *}" + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + # La función debe ser llamanda desde ogGrubDeleteEntry, ogBurgDeleteEntry or ogRefindDeleteEntry. + case "$FUNC" in + ogGrubDeleteEntry) + CFGFILE="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + ;; + ogBurgDeleteEntry) + CFGFILE="$DIRMOUNT/boot/burg/burg.cfg" + ;; + ogRefindDeleteEntry) + CFGFILE="$DIRMOUNT/EFI/refind/refind.conf" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubDeleteEntry, ogBurgDeleteEntry or ogRefindDeleteEntry." + return $? + ;; + esac + + # Dispositivo + if [ "$(basename $CFGFILE)" == "refind.conf" ]; then + LABEL=$(printf "Part-%02d-%02d" $3 $4) + else + LABEL=$(ogDiskToDev $3 $4) + fi + + # Error si no existe archivo de configuración + [ -r $CFGFILE ] || ogRaiseError log session $OG_ERR_NOTFOUND "$CFGFILE" || return $? + + # Numero de linea de cada entrada. + MENUENTRY="$(grep -n -e menuentry $CFGFILE| cut -d: -f1 | sed '1!G;h;$!d' )" + + # Entradas que hay que borrar. + DELETEENTRY=$(grep -n menuentry.*$LABEL $CFGFILE| cut -d: -f1) + + # Si no hay entradas para borrar me salgo con aviso + [ "$DELETEENTRY" != "" ] || ogRaiseError log session $OG_ERR_NOTFOUND "Menuentry $LABEL" || return $? + + # Recorremos el fichero del final hacia el principio. + ENDENTRY="$(wc -l $CFGFILE|cut -d" " -f1)" + for ENTRY in $MENUENTRY; do + # Comprobamos si hay que borrar la entrada. + if ogCheckStringInGroup $ENTRY "$DELETEENTRY" ; then + let ENDENTRY=$ENDENTRY-1 + sed -i -e $ENTRY,${ENDENTRY}d $CFGFILE + fi + + # Guardamos el número de línea de la entrada, que sera el final de la siguiente. + ENDENTRY=$ENTRY + done +} + +#/** +# ogBurgInstallMbr int_disk_GRUBCFG int_partition_GRUBCFG +#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default] +#@brief Instala y actualiza el gestor grub en el MBR del disco duro donde se encuentra el fichero grub.cfg. Admite sistemas Windows. +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default] +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición no soportada +#@version 1.1.0 - Primeras pruebas instalando BURG. Codigo basado en el ogGrubInstallMBR. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2017-06-23 +#@version 1.1.0 - Redirección del proceso de copiado de archivos y de la instalacion del binario +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2018-01-21 +#@version 1.1.0 - Refactorizar fichero de configuacion +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2018-01-24 +#@version 1.1.1 - Se incluye comentarios en codigo para autodocuemtnacion con Doxygen +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2018-07-05 +#*/ ## + +function ogBurgInstallMbr () +{ + +# Variables locales. +local BINARYAVAILABLE PART DISK DEVICE MOUNTDISK FIRSTAGE SECONSTAGE PREFIXSECONDSTAGE CHECKOS KERNELPARAM BACKUPNAME FILECFG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage bolean_Configure_2ndStage \"param param \" " \ + "$FUNCNAME 1 1 FALSE " \ + "$FUNCNAME 1 1 TRUE \"nomodeset irqpoll pci=noacpi quiet splash \" " + return +fi + +# Error si no se reciben 2 parametros. +[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +#Error si no tenemos el binario burg +BINARYAVAILABLE=$(burg-install -v &>/dev/null && echo "YES" ||echo "NO") +if [ "$BINARYAVAILABLE" == NO ]; then + if [ -e $OGLIB/burg/burg.tgz ]; then + cd / ; tar xzvf $OGLIB/burg/burg.tgz --strip 1 &>/dev/null + else + return $(ogRaiseError $OG_ERR_NOTEXEC "Binary burg not found"; echo $?) + fi +fi + +DISK=$1; PART=$2; +CHECKOS=${3:-"FALSE"} +KERNELPARAM=$4 +BACKUPNAME=".backup.og" + +#Controlar disco no uefi +ogIsEfiActive && return $(ogRaiseError $OG_ERR_NOTBIOS " : grub4dos solo soporta PC con bios legacy"; echo $?) +#Controlar particionado tipo msdos +ogCheckStringInGroup $(ogGetPartitionTableType $DISK) "MSDOS" || return $(ogRaiseError $OG_ERR_NOMSDOS ": grub2dos requiere particionado tipo MSDOS"; echo $?) +#Controlar existencia de disco y particion +DEVICE=$(ogDiskToDev $DISK) || ogRaiseError $OG_ERR_NOTFOUND || return $? +MOUNTDISK=$(ogMount $DISK $PART) || ogRaiseError $OG_ERR_PARTITION "$MSG_ERROR " || return $? +#Controlar particion segunda etapa del burg +ogCheckStringInGroup $(ogGetFsType $DISK $PART) "CACHE EXT4 EXT3 EXT2" || return $(ogRaiseError $OG_ERR_PARTITION "burg.cfg soporta solo particiones linux"; echo $?) +#Controlar acceso de escritura a la particion segunda etapa del burg +ogIsReadonly $DISK $PART && return $(ogRaiseError $OG_ERR_NOTWRITE ": $DISK $PART" || echo $?) + +#Asigar la primera etapa del grub en el primer disco duro +FIRSTSTAGE=$(ogDiskToDev 1) +#Localizar disco segunda etapa del grub +SECONDSTAGE=$(ogMount $DISK $PART) + +#Preparar el directorio principal de la segunda etapa (y copia los binarios) +[ -d ${SECONDSTAGE}/boot/burg/ ] || mkdir -p ${SECONDSTAGE}/boot/burg/; cp -prv /boot/burg/* ${SECONDSTAGE}/boot/burg/ 2>&1>/dev/null; cp -prv $OGLIB/burg/themes ${SECONDSTAGE}/boot/burg/ 2>&1>/dev/null; #*/ ## (comentario Dogygen) #*/ ## (comentario Dogygen) +#Copiar el tema de opengnsys +mkdir -p ${SECONDSTAGE}/boot/burg/themes/OpenGnsys +cp -prv "$OGLIB/burg/themes" "${SECONDSTAGE}/boot/burg/" 2>&1>/dev/null + +# No configurar la segunda etapa (grub.cfg). Parámetro FALSE +if [ -f ${SECONDSTAGE}/boot/burg/burg.cfg -o -f ${SECONDSTAGE}/boot/burg/burg.cfg$BACKUPNAME ]; +then + if [ "$CHECKOS" == "false" -o "$CHECKOS" == "FALSE" ] + then + burg-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE 2>&1>/dev/null + return $? + fi +fi + +# Configurrar la segunda etapa (burg.cfg) == tercer parámetro TRUE + +#llamar a updateBootCache para que aloje la primera fase del ogLive +updateBootCache + +#Configur la sintaxis grub para evitar menus de "recovery" en el OGLive +echo "GRUB_DISABLE_RECOVERY=\"true\"" >> /etc/default/grub +echo "GRUB_DISABLE_LINUX_UUID=\"true\"" >> /etc/default/grub + +#Preparar configuración segunda etapa: crear ubicacion +mkdir -p ${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/burg/ +#Preparar configuración segunda etapa: crear cabecera del fichero +FILECFG=${SECONDSTAGE}${PREFIXSECONDSTAGE}/boot/burg/burg.cfg +#/* ## (comentario Dogygen) +cat > "$FILECFG" << EOF + +set theme_name=OpenGnsys +set gfxmode=1024x768 + + +set locale_dir=(\$root)/boot/burg/locale + +set default=0 +set timeout=25 +set lang=es + + +insmod ext2 +insmod gettext + + + + +if [ -s \$prefix/burgenv ]; then + load_env +fi + + + +if [ \${prev_saved_entry} ]; then + set saved_entry=\${prev_saved_entry} + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault { + if [ -z \${boot_once} ]; then + saved_entry=\${chosen} + save_env saved_entry + fi +} +function select_menu { + if menu_popup -t template_popup theme_menu ; then + free_config template_popup template_subitem menu class screen + load_config \${prefix}/themes/\${theme_name}/theme \${prefix}/themes/custom/theme_\${theme_name} + save_env theme_name + menu_refresh + fi +} + +function toggle_fold { + if test -z $theme_fold ; then + set theme_fold=1 + else + set theme_fold= + fi + save_env theme_fold + menu_refresh +} +function select_resolution { + if menu_popup -t template_popup resolution_menu ; then + menu_reload_mode + save_env gfxmode + fi +} + + +if test -f \${prefix}/themes/\${theme_name}/theme ; then + insmod coreui + menu_region.text + load_string '+theme_menu { -OpenGnsys { command="set theme_name=OpenGnsys" }}' + load_config \${prefix}/themes/conf.d/10_hotkey + load_config \${prefix}/themes/\${theme_name}/theme \${prefix}/themes/custom/theme_\${theme_name} + insmod vbe + insmod png + insmod jpeg + set gfxfont="Unifont Regular 16" + menu_region.gfx + vmenu resolution_menu + controller.ext +fi + + +EOF +#*/ ## (comentario Dogygen) + +#Preparar configuración segunda etapa: crear entrada del sistema operativo +grubSyntax "$KERNELPARAM" >> "$FILECFG" +#Instalar el burg +burg-install --force --root-directory=${SECONDSTAGE} $FIRSTSTAGE 2>&1>/dev/null +} + +#/** +# ogGrubDefaultEntry int_disk_GRUGCFG int_partition_GRUBCFG int_disk_default_entry int_npartition_default_entry +#@brief ver ogBootLoaderDefaultEntry +#@see ogBootLoaderDefaultEntry +#*/ ## +function ogGrubDefaultEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_disk_default_entry int_npartition_default_entry" \ + "$FUNCNAME 1 6 1 1" + return + fi + ogBootLoaderDefaultEntry $@ + return $? +} + +#/** +# ogBurgDefaultEntry int_disk_BURGCFG int_partition_BURGCFG int_disk_default_entry int_npartition_default_entry +#@brief ver ogBootLoaderDefaultEntry +#@see ogBootLoaderDefaultEntry +#*/ ## +function ogBurgDefaultEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_disk_default_entry int_npartition_default_entry" \ + "$FUNCNAME 1 6 1 1" + return + fi + ogBootLoaderDefaultEntry $@ + return $? +} + + +#/** +# ogRefindDefaultEntry int_disk_default_entry int_npartition_default_entry +#@brief ver ogBootLoaderDefaultEntry +#@see ogBootLoaderDefaultEntry +#*/ ## +function ogRefindDefaultEntry () +{ + local EFIDISK EFIPART + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_disk_default_entry int_npartition_default_entry" \ + "$FUNCNAME 1 1" + return + fi + + read EFIDISK EFIPART <<< $(ogGetEsp) + ogBootLoaderDefaultEntry $EFIDISK $EFIPART $@ + return $? +} + +#/** +# ogBootLoaderDefaultEntry int_disk_CFG int_partition_CFG int_disk_default_entry int_npartition_default_entry +#@brief Configura la entrada por defecto de Burg +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param int_disk_default_entry +#@param int_part_default_entry +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_OUTOFLIMIT Param $3 no es entero. +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: burg.cfg. +#@version 1.1.0 - Define la entrada por defecto del Burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017-08-09 +#@version 1.1 Se generaliza la función para grub y burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2018-01-04 +#*/ ## +function ogBootLoaderDefaultEntry () +{ + +# Variables locales. +local PART FUNC DIRMOUNT LABEL CFGFILE DEFAULTENTRY MENUENTRY MSG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubDefaultEntry, ogBurgDefaultEntry or ogRefindDefaultEntry." + return +fi + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + +# Error si no se reciben 3 parametros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage int_disk_default_entry int_partitions_default_entry" || return $? + +# Error si no puede montar sistema de archivos. +DIRMOUNT=$(ogMount $1 $2) || return $? + +# Comprobamos que exista fichero de configuración +# La función debe ser llamanda desde ogGrubDefaultEntry, ogBurgDefaultEntry or ogRefindDefaultEntry. +case "$FUNC" in + ogGrubDefaultEntry) + CFGFILE="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + ;; + ogBurgDefaultEntry) + CFGFILE="$DIRMOUNT/boot/burg/burg.cfg" + ;; + ogRefindDefaultEntry) + CFGFILE="$DIRMOUNT/EFI/refind/refind.conf" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubDefaultEntry, ogBurgDefaultEntry or ogRefindDefaultEntry." + return $? + ;; +esac + +# Error si no existe archivo de configuración +[ -r $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +# Dispositivo +if [ "$(basename $CFGFILE)" == "refind.conf" ]; then + LABEL=$(printf "Part-%02d-%02d" $3 $4) +else + LABEL=$(ogDiskToDev $3 $4) +fi + +# Número de línea de la entrada por defecto en CFGFILE (primera de la partición). +DEFAULTENTRY=$(grep -n -m 1 menuentry.*$LABEL $CFGFILE| cut -d: -f1) + +# Si no hay entradas para borrar me salgo con aviso +[ "$DEFAULTENTRY" != "" ] || ogRaiseError session log $OG_ERR_NOTFOUND "No menuentry $LABEL" || return $? + +# Número de la de linea por defecto en el menú de usuario +MENUENTRY="$(grep -n -e menuentry $CFGFILE| cut -d: -f1 | grep -n $DEFAULTENTRY |cut -d: -f1)" + +if [ "$(basename $CFGFILE)" == "refind.conf" ]; then + sed -i /default_selection.*$/d $CFGFILE + sed -i "1 i\default_selection $MENUENTRY" $CFGFILE +else + # En grub y burg las líneas empiezan a contar desde cero + let MENUENTRY=$MENUENTRY-1 + sed --regexp-extended -i s/"set default=\"?[0-9]*\"?$"/"set default=\"$MENUENTRY\""/g $CFGFILE +fi +MSG="MSG_HELP_$FUNC" +echo "${!MSG%%\.}: $@" +} + +#/** +# ogGrubOgliveDefaultEntry num_disk num_part +#@brief ver ogBootLoaderOgliveDefaultEntry +#@see ogBootLoaderOgliveDefaultEntry +#*/ ## +function ogGrubOgliveDefaultEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage" \ + "$FUNCNAME 1 6" + return + fi + ogBootLoaderOgliveDefaultEntry $@ + return $? +} + +#/** +# ogBurgOgliveDefaultEntry num_disk num_part +#@brief ver ogBootLoaderOgliveDefaultEntry +#@see ogBootLoaderOgliveDefaultEntry +#*/ ## +function ogBurgOgliveDefaultEntry () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage" \ + "$FUNCNAME 1 6" + return + fi + ogBootLoaderOgliveDefaultEntry $@ + return $? +} + + +#/** +# ogRefindOgliveDefaultEntry +#@brief ver ogBootLoaderOgliveDefaultEntry +#@see ogBootLoaderOgliveDefaultEntry +#*/ ## +function ogRefindOgliveDefaultEntry () +{ + local EFIDISK EFIPART + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return + fi + + read EFIDISK EFIPART <<< $(ogGetEsp) + ogBootLoaderOgliveDefaultEntry $EFIDISK $EFIPART + return $? +} + + +#/** +# ogBootLoaderOgliveDefaultEntry +#@brief Configura la entrada de ogLive como la entrada por defecto de Burg. +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: burg.cfg. +#@exception OG_ERR_NOTFOUND Entrada de OgLive no encontrada en burg.cfg. +#@version 1.1.0 - Primeras pruebas con Burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017-08-09 +#@version 1.1 Se generaliza la función para grub y burg +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2018-01-04 +#*/ ## +function ogBootLoaderOgliveDefaultEntry () +{ + +# Variables locales. +local FUNC PART CFGFILE NUMENTRY MSG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubOgliveDefaultEntry, ogBurgOgliveDefaultEntry or ogRefindOgliveDefaultEntry" \ + return +fi + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + +# Error si no se reciben 2 parametros. +[ $# -eq 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $1 $2) || return $? +# La función debe ser llamanda desde ogGrubOgliveDefaultEntry, ogBurgOgliveDefaultEntry or ogRefindOgliveDefaultEntry. +case "$FUNC" in + ogGrubOgliveDefaultEntry) + CFGFILE="$PART/boot/grubMBR/boot/grub/grub.cfg" + ;; + ogBurgOgliveDefaultEntry) + CFGFILE="$PART/boot/burg/burg.cfg" + ;; + ogRefindOgliveDefaultEntry) + CFGFILE="$PART/EFI/refind/refind.conf" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubOgliveDefaultEntry, ogBurgOgliveDefaultEntry or ogRefindOgliveDefaultEntry." + return $? + ;; +esac + +# Comprobamos que exista fichero de configuración +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +# Detectamos cual es la entrada de ogLive +NUMENTRY=$(grep ^menuentry $CFGFILE| grep -n "OpenGnsys Live"|cut -d: -f1) + +# Si no existe entrada de ogLive nos salimos +[ -z "$NUMENTRY" ] && (ogRaiseError $OG_ERR_NOTFOUND "menuentry OpenGnsys Live in $CFGFILE" || return $?) + +if [ "$(basename $CFGFILE)" == "refind.conf" ]; then + sed -i /default_selection.*$/d $CFGFILE + + sed -i "1 i\default_selection $NUMENTRY" $CFGFILE +else + let NUMENTRY=$NUMENTRY-1 + sed --regexp-extended -i s/"set default=\"?[0-9]+\"?"/"set default=\"$NUMENTRY\""/g $CFGFILE +fi + +MSG="MSG_HELP_$FUNC" +echo "${!MSG%%\.}: $@" +} + + +#/** +# ogGrubSecurity int_disk_GRUBCFG int_partition_GRUBCFG [user] [password] +#@brief Configura grub.cfg para que sólo permita editar entrada o acceder a línea de comandos al usuario especificado +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param user (default root) +#@param password (default "", no puede entrar) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar (ogMount). +#@exception OG_ERR_NOTFOUND No encuentra archivo de configuración del grub. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-12-17 +#*/ ## +function ogGrubSecurity () +{ +# Variables locales. +local SECONDSTAGE GRUBGFC FILE USER PASSWD ENCRYPTPASSWD + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage [USER] [PASSWORD]" \ + "$FUNCNAME 1 1 " \ + "$FUNCNAME 1 2 user clave" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage [USER] [PASSWORD]"|| return $? + +#localizar disco segunda etapa del grub +SECONDSTAGE=$(ogMount "$1" "$2") || return $? + +GRUBGFC=$(ls $SECONDSTAGE/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg,grub.cfg.backup.og} 2>/dev/null) + +# comprobamos que exista el archivo de configuración. +[ -n "$GRUBGFC" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $? + +USER=${3:-root} +PASSWD=${4:-""} + +ENCRYPTPASSWD=$(echo -e "$PASSWD\n$PASSWD"|grub-mkpasswd-pbkdf2|sed -e 1,2d -e s/^.*grub/grub/) + +for FILE in $GRUBGFC; do + # Eliminamos configuración anterior + sed -i -e /superusers/d -e /password_pbkdf2/d $FILE + + # Configuramos grub.cfg para que sólo permita editar o entrar en línea de comandos al usuario especificado + [ "$PASSWD" == "" ] || sed -i "1i\password_pbkdf2 $USER $ENCRYPTPASSWD" $FILE + sed -i "1i\set superusers=\"$USER\"" $FILE + + # Permitimos que se seleccionen las entradas + sed -i /"menuentry "/s/"{"/"--unrestricted {"/ $FILE +done +} + + +#/** +# ogGrubSetTheme num_disk num_part str_theme +#@brief ver ogBootLoaderSetTheme +#@see ogBootLoaderSetTheme +#*/ ## +function ogGrubSetTheme () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_themeName" \ + "$FUNCNAME 1 4 ThemeBasic"\ + "$FUNCNAME \$(ogFindCache) ThemeBasic" + return + fi + ogBootLoaderSetTheme $@ + return $? +} + +#/** +# ogBurgSetTheme num_disk num_part str_theme +#@brief ver ogBootLoaderSetTheme +#@see ogBootLoaderSetTheme +#*/ ## +function ogBurgSetTheme () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_themeName" \ + "$FUNCNAME 1 4 ThemeBasic" \ + "$FUNCNAME \$(ogFindCache) ThemeBasic" + echo "Temas disponibles:\ $(ls $OGCAC/boot/burg/themes/)" + + return + fi + ogBootLoaderSetTheme $@ + return $? +} + + +#/** +# ogRefindSetTheme str_theme +#@brief ver ogBootLoaderSetTheme +#@see ogBootLoaderSetTheme +#*/ ## +function ogRefindSetTheme () { + local PART DIRTHEME CFGFILE + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_themeName" \ + "$FUNCNAME ThemeBasic" + echo -e "\nThemes in $OGLIB/refind:\n$(ls $OGLIB/refind/themes/ 2>/dev/null)" + + return + fi + + # Detectamos partición ESP + read EFIDISK EFIPART <<< $(ogGetEsp) + + PART=$(ogMount $EFIDISK $EFIPART) || return $? + DIRTHEME="$PART/EFI/refind/themes" + CFGFILE="$PART/EFI/refind/refind.conf" + + # Para utilizar ogBootLoaderSetTheme es necesario la entrada set theme_name + if [ -f $CFGFILE ]; then + sed -i '1 i\set theme_name=none' $CFGFILE + else + ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + fi + # Creamos el directorio para los temas + [ -d $DIRTHEME ] || mkdir $DIRTHEME + + ogBootLoaderSetTheme $EFIDISK $EFIPART $@ + return $? +} + + +#/** +# ogBootLoaderSetTheme +#@brief asigna un tema al BURG +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param str_theme_name +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg refind.conf. +#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg. +#@exception OG_ERR_NOTFOUND Fichero de configuración del tema no encontrado: theme.conf (sólo refind). +#@note El tema debe situarse en OGLIB/BOOTLOADER/themes +#@version 1.1.0 - Primeras pruebas con Burg. grub no soportado. +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-24 +#@version 1.1.1 - Soporta rEFInd (ticket #802 #888). +#@author Irina Gomez. Universidad de Sevilla +#@date 2019-03-22 +#*/ ## +function ogBootLoaderSetTheme () +{ + +# Variables locales. +local FUNC PART CFGFILE THEME NEWTHEME BOOTLOADER MSG NEWTHEMECFG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubSetTheme, ogBurgSetTheme or ogRefindSetTheme." + return +fi + + +NEWTHEME="$3" + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + + + +# Error si no se reciben 3 parametros. +[ $# -eq 3 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_themeName" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $1 $2) || return $? +# La función debe ser llamanda desde ogGrubSetTheme, ogBurgSetTheme or ogRefindSetTheme. +case "$FUNC" in + ogGrubSetTheme) + BOOTLOADER="grub" + BOOTLOADERDIR="boot/grubMBR" + CFGFILE="$PART/boot/grubMBR/boot/grub/grub.cfg" + ogRaiseError $OG_ERR_FORMAT "ogGrubSetTheme not sopported" + return $? + ;; + ogBurgSetTheme) + BOOTLOADER="burg" + BOOTLOADERDIR="boot/burg" + CFGFILE="$PART/boot/burg/burg.cfg" + ;; + ogRefindSetTheme) + BOOTLOADER="refind" + BOOTLOADERDIR="EFI/refind" + CFGFILE="$PART/EFI/refind/refind.conf" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubSetTheme, ogBurgSetTheme or ogRefindSetTheme." + return $? + ;; +esac + +# Comprobamos que exista fichero de configuración +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +# Detectamos cual es el tema asignado +THEME=$(grep "set theme_name=" $CFGFILE | grep ^set | cut -d= -f2) +# Si no existe entrada de theme_name nos salimos +[ -z "$THEME" ] && (ogRaiseError $OG_ERR_NOTFOUND "theme_name in $CFGFILE" || return $?) + +#Actualizamos el tema del servidor a la particion +if [ -d $OGLIB/$BOOTLOADER/themes/$NEWTHEME ]; then + # Para refind es necesario que exista theme.conf en el directorio del tema. + if [ "$BOOTLOADER" == "refind" ]; then + NEWTHEMECFG="$OGLIB/$BOOTLOADER/themes/$NEWTHEME/theme.conf" + [ -f $NEWTHEMECFG ] || ogRaiserError $OG_ERR_NOTFOUND "theme.conf" || return $? + grep -v "^#" $NEWTHEMECFG >> $CFGFILE + # eliminamos "set theme" es de grub y no de refind + sed -i '/theme_name/d' $CFGFILE + fi + cp -pr $OGLIB/$BOOTLOADER/themes/$NEWTHEME $PART/$BOOTLOADERDIR/themes/ +fi + +#Verificamos que el tema esta en la particion +if ! [ -d $PART/$BOOTLOADERDIR/themes/$NEWTHEME ]; then + ogRaiseError $OG_ERR_NOTFOUND "theme_name=$NEWTHEME in $PART/$BOOTLOADERDIR/themes/" || return $? +fi + +#Cambiamos la entrada el fichero de configuración. +sed --regexp-extended -i s/"set theme_name=$THEME"/"set theme_name=$NEWTHEME"/g $CFGFILE + + +} + +#/** +# ogGrubSetAdminKeys num_disk num_part str_theme +#@brief ver ogBootLoaderSetTheme +#@see ogBootLoaderSetTheme +#*/ ## +function ogGrubSetAdminKeys () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_bolean" \ + "$FUNCNAME 1 4 FALSE "\ + "$FUNCNAME \$(ogFindCache) ThemeBasic" + return + fi + ogBootLoaderSetAdminKeys $@ + return $? +} + +#/** +# ogBurgSetAdminKeys num_disk num_part str_bolean +#@brief ver ogBootLoaderSetAdminKeys +#@see ogBootLoaderSetAdminKeys +#*/ ## +function ogBurgSetAdminKeys () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_bolean" \ + "$FUNCNAME 1 4 TRUE" \ + "$FUNCNAME \$(ogFindCache) FALSE" + return + fi + ogBootLoaderSetAdminKeys $@ + return $? +} + + + +#/** +# ogBootLoaderSetAdminKeys +#@brief Activa/Desactica las teclas de administracion +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param Boolean TRUE/FALSE +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg. +#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg. +#@version 1.1.0 - Primeras pruebas con Burg. grub no soportado. +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-24 +#*/ ## +function ogBootLoaderSetAdminKeys () +{ + +# Variables locales. +local FUNC PART CFGFILE BOOTLOADER BOOTLOADERDIR CFGFILE MSG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubSetSetAdminKeys ogBurgSetSetAdminKeys" + return +fi + + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + + +# Error si no se reciben 2 parametros. +[ $# -eq 3 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_bolean" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $1 $2) || return $? +# La función debe ser llamanda desde ogGrubSetAdminKeys or ogBurgSetAdminKeys. +case "$FUNC" in + ogGrubSetAdminKeys) + BOOTLOADER="grub" + BOOTLOADERDIR="grubMBR" + CFGFILE="$PART/boot/grubMBR/boot/grub/grub.cfg" + ogRaiseError $OG_ERR_FORMAT "ogGrubSetAdminKeys not sopported" + return $? + ;; + ogBurgSetAdminKeys) + BOOTLOADER="burg" + BOOTLOADERDIR="burg" + CFGFILE="$PART/boot/burg/burg.cfg" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubSetAdminKeys" + return $? + ;; +esac + + +# Comprobamos que exista fichero de configuración +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + + +case "$3" in + true|TRUE) + [ -f ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey.disabled ] && mv ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey.disabled ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey + ;; + false|FALSE) + [ -f ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey ] && mv ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey ${OGCAC}/boot/$BOOTLOADERDIR/themes/conf.d/10_hotkey.disabled + ;; + *) + ogRaiseError $OG_ERR_FORMAT "str bolean unknow " + return $? + ;; +esac +} + + + +#/** +# ogGrubSetTimeOut num_disk num_part int_timeout_seconds +#@brief ver ogBootLoaderSetTimeOut +#@see ogBootLoaderSetTimeOut +#*/ ## +function ogGrubSetTimeOut () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage int_timeout_seconds" \ + "$FUNCNAME 1 4 50 "\ + "$FUNCNAME \$(ogFindCache) 50" + return + fi + ogBootLoaderSetTimeOut $@ + return $? +} + +#/** +# ogBurgSetTimeOut num_disk num_part str_bolean +#@brief ver ogBootLoaderSetTimeOut +#@see ogBootLoaderSetTimeOut +#*/ ## +function ogBurgSetTimeOut () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage str_timeout_seconds" \ + "$FUNCNAME 1 4 50" \ + "$FUNCNAME \$(ogFindCache) 50" + return + fi + ogBootLoaderSetTimeOut $@ + return $? +} + + +#/** +# ogRefindSetTimeOut int_timeout_second +#@brief ver ogBootLoaderSetTimeOut +#@see ogBootLoaderSetTimeOut +#*/ ## +function ogRefindSetTimeOut () +{ + local EFIDISK EFIPART + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_timeout_seconds" \ + "$FUNCNAME 50" + return + fi + + read EFIDISK EFIPART <<< $(ogGetEsp) + ogBootLoaderSetTimeOut $EFIDISK $EFIPART $@ + return $? +} + +#/** +# ogBootLoaderSetTimeOut +#@brief Define el tiempo (segundos) que se muestran las opciones de inicio +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param int_timeout_seconds +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg. +#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg. +#@version 1.1.0 - Primeras pruebas con Burg. GRUB solo si está instalado en MBR +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-24 +#*/ ## +function ogBootLoaderSetTimeOut () +{ + +# Variables locales. +local FUNC PART CFGFILE TIMEOUT BOOTLOADER BOOTLOADERDIR CFGFILE MSG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubSetTimeOut, ogBurgSetTimeOut or ogRefindSetTimeOut" + return +fi + +ogCheckStringInReg $3 "^[0-9]{1,10}$" && TIMEOUT="$3" || ogRaiseError $OG_ERR_FORMAT "param 3 is not a integer" + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + +# Error si no se reciben 3 parametros. +[ $# -eq 3 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage int_timeout_seconds" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $1 $2) || return $? +# La función debe ser llamanda desde ogGrubSetTimeOut, ogBurgSetTimeOut or ogRefindSetTimeOut. +case "$FUNC" in + ogGrubSetTimeOut) + BOOTLOADER="grub" + BOOTLOADERDIR="boot/grubMBR" + CFGFILE="$PART/boot/grubMBR/boot/grub/grub.cfg" + ;; + ogBurgSetTimeOut) + BOOTLOADER="burg" + BOOTLOADERDIR="boot/burg" + CFGFILE="$PART/boot/burg/burg.cfg" + ;; + ogRefindSetTimeOut) + BOOTLOADER="refind" + BOOTLOADERDIR="EFI/refind" + CFGFILE="$PART/EFI/refind/refind.conf" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use ogGrubSetTimeOut, ogBurgSetTimeOut or ogRefindSetTimeOut." + return $? + ;; +esac + +# Comprobamos que exista fichero de configuración +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +# Asignamos el timeOut. +if [ "$BOOTLOADER" == "refind" ]; then + sed -i s/timeout.*$/"timeout $TIMEOUT"/g $CFGFILE +else + sed -i s/timeout=.*$/timeout=$TIMEOUT/g $CFGFILE +fi +} + + +#/** +# ogGrubSetResolution num_disk num_part int_resolution +#@brief ver ogBootLoaderSetResolution +#@see ogBootLoaderSetResolution +#*/ ## +function ogGrubSetResolution () +{ + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage [str_resolution]" \ + "$FUNCNAME 1 4 1024x768" \ + "$FUNCNAME \$(ogFindCache) 1024x768" \ + "$FUNCNAME 1 4" + return + fi + ogBootLoaderSetResolution $@ + return $? +} + +#/** +# ogBurgSetResolution num_disk num_part str_bolean +#@brief ver ogBootLoaderSetResolution +#@see ogBootLoaderSetResolution +#*/ ## +function ogBurgSetResolution () + { + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage [str_resolution]" \ + "$FUNCNAME 1 4 1024x768" \ + "$FUNCNAME \$(ogFindCache) 1024x768" \ + "$FUNCNAME 1 4" + return + fi + ogBootLoaderSetResolution $@ + return $? +} + + + +#/** +# ogBootLoaderSetResolution +#@brief Define la resolucion que usuara el thema del gestor de arranque +#@param int_disk_SecondStage +#@param int_part_SecondStage +#@param str_resolution (Opcional) +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg. +#@version 1.1.0 - Primeras pruebas con Burg. grub no soportado. +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-24 +#*/ ## +function ogBootLoaderSetResolution () +{ + +# Variables locales. +local FUNC PART CFGFILE RESOLUTION NEWRESOLUTION DEFAULTRESOLUTION BOOTLOADER BOOTLOADERDIR CFGFILE MSG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogGrubSetResolution, ogBurgSetResolution or ogRefindSetResolution." + return +fi + + +# Nombre de la función que llama a esta. +FUNC="${FUNCNAME[@]:1}" +FUNC="${FUNC%%\ *}" + + +# Error si no se reciben 2 parametros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndiskSecondStage int_partitionSecondStage [str_resolution]" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $1 $2) || return $? +# La función debe ser llamanda desde ogGrugSetResolution, ogBurgSetResolution or ogRefindSetResolution. +case "$FUNC" in + ogGrubSetResolution) + BOOTLOADER="grub" + BOOTLOADERDIR="grubMBR" + CFGFILE="$PART/boot/grubMBR/boot/grub/grub.cfg" + ogRaiseError $OG_ERR_FORMAT "ogGrubSetResolution not sopported" + return $? + ;; + ogBurgSetResolution) + BOOTLOADER="burg" + BOOTLOADERDIR="burg" + CFGFILE="$PART/boot/burg/burg.cfg" + ;; + *) + ogRaiseError $OG_ERR_FORMAT "Use GrugSetResolution, ogBurgSetResolution or ogRefindSetResolution." + return $? + ;; +esac + +DEFAULTRESOLUTION=1024x768 + +# Comprobamos que exista fichero de configuración +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +#controlar variable a consierar vga (default template) o video (menu) +#Si solo dos parametros autoconfiguracion basado en el parametro vga de las propiedad menu. si no hay menu asignado es 788 por defecto +if [ $# -eq 2 ] ; then + if [ -n $video ]; then + NEWRESOLUTION=$(echo "$video" | cut -f2 -d: | cut -f1 -d-) + fi + if [ -n $vga ] ; then + case "$vga" in + 788|789|814) + NEWRESOLUTION=800x600 + ;; + 791|792|824) + NEWRESOLUTION=1024x768 + ;; + 355) + NEWRESOLUTION=1152x864 + ;; + 794|795|829) + NEWRESOLUTION=1280x1024 + ;; + esac + fi +fi + +if [ $# -eq 3 ] ; then + #comprobamos que el parametro 3 cumple formato NNNNxNNNN + ogCheckStringInReg $3 "[0-9]{3,4}[x][0-9]{3,4}\$" && NEWRESOLUTION="$3" || ogRaiseError $OG_ERR_FORMAT "param 3 is not a valid resolution: 800x600, 1024x768, 1152x864, 1280x1024, 1600x1200" +fi + +# Si no existe NEWRESOLUCION asignamos la defaulT +[ -z "$NEWRESOLUTION" ] && NEWRESOLUTION=$DEFAULRESOLUTION + +#Cambiamos la entrada el fichero de configuración. +sed -i s/gfxmode=.*$/gfxmode=$NEWRESOLUTION/g $CFGFILE +} + + + + +#/** +# ogBootLoaderSetResolution +#@brief Define la resolucion que usuara el thema del gestor de arranque +#@param int_resolution1 +#@param int_resolution2 (Opcional) +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount). +#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg. +#*/ ## +function ogRefindSetResolution () { +local PART CFGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_resolution1 [int_resolution2]" \ + "$FUNCNAME 1366 768" \ + "$FUNCNAME 1" + return +fi + + # Error si no se reciben 2 parametros. +[ $# -ge 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_resolution1 [int_resolution2]" || return $? + +# Error si no puede montar sistema de archivos. +PART=$(ogMount $(ogGetEsp)) || return $? + +# Comprobamos que exista fichero de configuración +CFGFILE=$PART/EFI/refind/refind.conf +[ -f $CFGFILE ] || ogRaiseError $OG_ERR_NOTFOUND "$CFGFILE" || return $? + +# Borramos resolucion anterior y configuramos la nueva +sed -i /^resolution/d $CFGFILE + +sed -i "1 i\resolution $1 $2" $CFGFILE +} + +# ogRefindInstall bool_autoconfig +#@brief Instala y actualiza el gestor rEFInd en la particion EFI +#@param bolean_Check__auto_config true | false[default] +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No se encuentra la partición ESP. +#@exception OG_ERR_NOTFOUND No se encuentra shimx64.efi.signed. +#@exception OG_ERR_NOTFOUND No se encuentra refind-install o refind en OGLIB +#@exception OG_ERR_PARTITION No se puede montar la partición ESP. +#@note Refind debe estar instalado en el ogLive o compartido en OGLIB +#@version 1.1.0 - Primeras pruebas. +#@author Juan Carlos Garcia. Universidad de ZAragoza. +#@date 2017-06-26 +#@version 1.1.1 - Usa refind-install. Obtiene partición con ogGetEsp. Configura Part-X-Y y ogLive. +#@author Irina Gomez. Universidad de Sevilla. +#@date 2019-03-22 +#*/ ## +function ogRefindInstall () { +# Variables locales. +local CONFIG EFIDISK EFIPART EFIDEVICE EFIMNT EFIDIR SHIM REFINDDIR +local CACHEDEVICE OGLIVE OGLIVEDIR CMDLINE OGICON CFGFILE DEVICES +local LNXCFGFILE NUMENTRY DIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME boolean_autoconfig " \ + "$FUNCNAME TRUE" + return +fi + +# Recogemos parametros +CONFIG=${1:-"FALSE"} + +read -e EFIDISK EFIPART <<< $(ogGetEsp) +EFIDEVICE=$(ogDiskToDev $EFIDISK $EFIPART) || ogRaiseError $OG_ERR_NOTFOUND "ESP" || return $? +EFIMNT=$(ogMount $EFIDISK $EFIPART) || ogRaiseError $OG_ERR_PARTITION "$MSG_ERROR mount ESP" || return $? +EFIDIR="$EFIMNT/EFI" +[ -d $EFIDIR ] || mkdir $EFIDIR + +# Comprobamos que exista shimx64 +SHIM=$(ogGetPath /usr/lib/shim/shimx64.efi.signed) +[ "$SHIM" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "shimx64.efi.signed") + +# Si existe configuración anterior de refind la borro +[ -d "$EFIDIR/refind" ] && rm -rf $EFIDIR/refind + +# Instalamos rEFInd. +refind-install --yes --alldrivers --root $EFIMNT --shim $SHIM + +# Firmo refind con certificado de OpenGnsys +mv $EFIDIR/refind/grubx64.efi $EFIDIR/refind/grubx64.efi-unsigned +sbsign --key $OGETC/ssl/private/opengnsys.key --cert $OGETC/ssl/certs/opengnsys.crt --output $EFIDIR/refind/grubx64.efi $EFIDIR/refind/grubx64.efi-unsigned + +# Copio los certificados +cp /etc/refind.d/keys/* $EFIDIR/refind/keys +# Copio certificado opengnsys +cp $OGETC/ssl/certs/opengnsys.* $EFIDIR/refind/keys + +# Ponemos la entrada en NVRAM en el segundo lugar del orden de arranque +NEWORDER="$(ogNvramGetOrder|awk '{gsub(",", " "); printf "%x %x %s\n", $2, $1, substr($0, index($0,$3))}')" +ogNvramSetOrder $NEWORDER + +# Borramos configuración linux +[ -f $EFIMNT/boot/refind_linux.conf ] && mv $EFIMNT/boot/refind_linux.conf{,.ogbackup} + +# Eliminamos punto de motaje (por si ejecutamos más de una vez) +umount $EFIMNT/boot/efi + +# Para la configuración del ogLive +ogMountCache &>/dev/null +if [ $? -eq 0 ]; then + # Detectamos si hay ogLive + CACHEDEVICE=$(ogDiskToDev $(ogFindCache)) + OGLIVE=$(find $OGCAC/boot -name ogvmlinuz|head -1) + # Obtenemos parametros del kernel y sustituimos root + # La línea de opciones no puede contener la cadena initrd. + CMDLINE="$(cat /proc/cmdline|sed -e 's/^.*ogvmlinuz.efi //g' -e 's/^.*ogvmlinuz //g' -e 's|root=/dev/[a-z]* ||g' \ + -e 's/ogupdateinitrd=[a-z]* //g')" + CMDLINE="root=$CACHEDEVICE ${CMDLINE#*ogvmlinuz}" + + # Icono para la entrada de menú + OGICON=$(ls $OGLIB/refind/icons/so_opengnsys.png 2>/dev/null) + [ "$OGICON" == "" ] && OGICON="${EFIDIR}/refind/icons/os_unknown.png" + cp "$OGICON" "$OGCAC/.VolumeIcon.png" +fi + +# Configuramos rEFInd si es necesario +CFGFILE="${EFIDIR}/refind/refind.conf" +if [ "$CONFIG" == "TRUE" ]; then + echo -e "\n\n# Configuración OpenGnsys" >> $CFGFILE + # Excluimos dispositivos distintos de ESP y CACHE + DEVICES=$(blkid -s PARTUUID |awk -v D=$EFIDEVICE -v C=$CACHEDEVICE '$1!=D":" && $1!=C":" {gsub(/PARTUUID=/,"");gsub(/"/,""); aux = aux" "$2","} END {print aux}') + echo "dont_scan_volumes $DEVICES" >> $CFGFILE + # Excluimos en la ESP los directorios de los sistemas operativos + echo "dont_scan_dirs EFI/microsoft,EFI/ubuntu,EFI/grub" >> $CFGFILE + echo "use_graphics_for osx,linux,windows" >> $CFGFILE + echo "showtools reboot, shutdown" >> $CFGFILE + + # Configuramos ogLive + if [ "$OGLIVE" != "" ]; then + # Cambiamos nombre de kernel e initrd para que lo detecte refind + OGLIVEDIR="$(dirname $OGLIVE)" + cp "$OGLIVE" "${OGLIVE}.efi" + cp "$OGLIVEDIR/oginitrd.img" "$OGLIVEDIR/initrd.img" + + # Incluimos el directorio de ogLive. + echo "also_scan_dirs +,boot/$(basename $OGLIVEDIR)" >> $CFGFILE + # Fichero de configuración de refind para kernel de linux. + LNXCFGFILE="$OGLIVEDIR/refind_linux.conf" + echo "\"OpenGnsys Live\" \"$CMDLINE\"" > $LNXCFGFILE + + # Ponemos ogLive como la entrada por defecto + NUMENTRY=$(ls -d $EFIDIR/Part-??-??|wc -l) + echo "default_selection $((NUMENTRY+1))" >> $CFGFILE + fi +else + # Renombramos la configuración por defecto + mv $CFGFILE ${CFGFILE}.auto + + # Creamos nueva configuración + echo "# Configuración OpenGnsys" >> $CFGFILE + echo "timeout 20" > $CFGFILE + echo "showtools reboot, shutdown" >> $CFGFILE + echo -e "scanfor manual\n" >> $CFGFILE + # Configuración para sistemas restaurados con OpenGnsys + for DIR in $(ls -d /mnt/sda1/EFI/Part-*-* 2>/dev/null); do + echo "menuentry \"${DIR##*/}\" {" >> $CFGFILE + echo " loader /EFI/${DIR##*/}/Boot/ogloader.efi" >> $CFGFILE + [ -f $DIR/Boot/bootmgfw.efi ] && echo " icon /EFI/refind/icons/os_win8.png" >> $CFGFILE + [ -f $DIR/Boot/grubx64.efi ] && echo " icon /EFI/refind/icons/os_linux.png" >> $CFGFILE + echo "}" >> $CFGFILE + done + # Configuración ogLive si secureboot no está activado + if ! dmesg|grep secureboot.*enabled &>/dev/null; then + if [ "$OGLIVE" != "" ]; then + echo "menuentry \"OpenGnsys Live\" {" >> $CFGFILE + echo " volume CACHE" >> $CFGFILE + echo " ostype Linux" >> $CFGFILE + echo " loader /boot/$(basename ${OGLIVE%/*})/ogvmlinuz" >> $CFGFILE + echo " initrd /boot/$(basename ${OGLIVE%/*})/oginitrd.img" >> $CFGFILE + echo " options \"$CMDLINE\"" >> $CFGFILE + echo "}" >> $CFGFILE + + # Ponemos ogLive como la entrada por defecto + sed -i '1 i\default_selection "OpenGnsys Live"' $CFGFILE + fi + fi +fi +} + +#/** +# ogGrub4dosInstallMbr int_ndisk +#@brief Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux. +#@param int_ndisk nº de orden del disco +#@param int_ndisk nº de orden del particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar. +#@exception OG_ERR_NOTBIOS Equipo no firmware BIOS legacy +#@exception OG_ERR_NOMSDOS Disco duro no particioniado en modo msdos +#@exception OG_ERR_NOTWRITE Particion no modificable. +#@version 1.1.1 - Adaptacion a OpenGnSys. +#@author Alberto García Padilla / Antonio J. Doblas Viso. Universidad de Malaga +#@date 2009-10-17 +#*/ ## + +function ogGrub4dosInstallMbr () +{ +# Variables locales. +local DISK PART DEVICE MOUNTDISK GRUBDISK BINBDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part " \ + "$FUNCNAME 1 1 " + return +fi +# Error si no se recibe 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK="$1" +PART="$2" + +#Controlar existencia de disco y particion +DEVICE=$(ogDiskToDev $DISK) || ogRaiseError $OG_ERR_NOTFOUND || return $? +MOUNTDISK=$(ogMount $DISK $PART) || ogRaiseError $OG_ERR_PARTITION "$MSG_ERROR " || return $? +#Controlar acceso de escritura a la particion +ogIsReadonly $DISK $PART && return $(ogRaiseError $OG_ERR_NOTWRITE ": $DISK $PART" || echo $?) +#Controlar disco no uefi +ogIsEfiActive && return $(ogRaiseError $OG_ERR_NOTBIOS " : grub4dos solo soporta PC con bios legacy"; echo $?) +#Controlar particionado tipo msdos +ogCheckStringInGroup $(ogGetPartitionTableType $DISK) "MSDOS" || return $(ogRaiseError $OG_ERR_NOMSDOS ": grub2dos requiere particionado tipo MSDOS"; echo $?) +#Controlar la existencia del grub4dos con acceso a ntfs +BINDIR="${OGLIB}/grub4dos/grub4dos-0.4.6a" +[ -f ${BINDIR}/bootlace.com ] || ogRaiseError $OG_ERR_NOTFOUND ": ${BINDIR}/bootlace.com" || return $? + +#instalar el bootloader de grlrd en el MBR +${BINDIR}/bootlace64.com $DEVICE &>/dev/null +#copiar grld a la particion +cp ${BINDIR}/grldr $MOUNTDISK +#Instalar y configurar grub4dos +if [[ -f $MOUNTDISK/boot/grub/menu.lst ]]; then + rm $MOUNTDISK/boot/grub/menu.lst + rmdir /$MOUNTDISK/boot/grub +fi +if [[ ! -f $MOUNTDISK/boot/grub/menu.lst ]]; then + mkdir -p /$MOUNTDISK/boot/grub + touch /$MOUNTDISK/boot/grub/menu.lst + + GRUBDISK=$[$1-1] + +cat << EOT >/$MOUNTDISK/boot/grub/menu.lst +##NO-TOCAR-ESTA-LINEA MBR +timeout 0 +title MBR +root (hd$GRUBDISK,0) +chainloader (hd$GRUBDISK,0)+1 +boot +EOT + +fi +} diff --git a/ogclient/lib/engine/bin/Cache.lib b/ogclient/lib/engine/bin/Cache.lib new file mode 100755 index 0000000..cacba40 --- /dev/null +++ b/ogclient/lib/engine/bin/Cache.lib @@ -0,0 +1,439 @@ +#!/bin/bash +#/** +#@file Cache.lib +#@brief Librería o clase Cache +#@class Cache +#@brief Funciones para gestión de la caché local de disco. +#@version 1.1.1 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogCreateCache [int_ndisk] int_partsize +#@brief Define la caché local, por defecto en partición 4 del disco 1. +#@param int_ndisk numero de disco donde crear la cache, si no se indica es el 1 por defecto +#@param int_npart número de partición (opcional, 4 por defecto) +#@param int_partsize tamaño de la partición (en KB) +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@note Requisitos: sfdisk, parted, awk, sed +#@warning El tamaño de caché debe estar entre 50 MB y la mitad del disco. +#@warning La caché no puede solaparse con las particiones de datos. +#@version 0.9.1 - Definición de caché local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/09 +#@version 0.9.2 - Corrección definición de límites. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/06/01 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 +#@version 1.0.5 - Posibilidad de crear la cache en cualquier disco duro +#@author Universidad de Huelva +#@date 2012/09/18 +#@version 1.1.0 - Posibilidad de crear la caché en cualquier partición. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016/05/25 +#@version 1.1.0 - Soporte discos con sectores de 4k +#@date 2017/01/09 +#@version 1.0.6b - Al crear las particiones ordenamos los dispositivos en el fichero auxiliar. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/01/09 +#*/ ## +function ogCreateCache () +{ +# Variables locales. +local FINDCACHE IOSIZE NDSK SIZECACHE PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE +local PTTYPE ID TMPFILE NVME_PREFIX +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [int_ndisk [int_npart]] int_partsize" \ + "$FUNCNAME 10000000" "$FUNCNAME 1 10000000" "$FUNCNAME 1 4 10000000" + return +fi +# Si se recibe un parametro, sera el tamano de la cache +case $# in + 1) # Error, si no es un entero positivo + [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $? + NDSK=1 + PART=4 + SIZECACHE=$1 + ;; + 2) # Error, si no son enteros positivos + [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $? + [[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $? + NDSK=$1 + PART=4 + SIZECACHE=$2 + ;; + 3) # Error, si no son enteros positivos + [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $? + [[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $? + [[ $3 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$3" || return $? + NDSK=$1 + PART=$2 + SIZECACHE=$3 + ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? + ;; +esac + +TMPFILE=/tmp/sfdisk$$ +DISK=$(ogDiskToDev $NDSK) || return $? + + # PATCH Para discos nvme la particion debe ser p1, p2, etc...en lugar de 1,2, sino falla sfdisk +NVME_PREFIX="" +if [[ $DISK == *"nvme"* ]]; then + NVME_PREFIX="p" +fi + + +END=$[$(ogGetLastSector $NDSK 2>/dev/null)] # Sector final del disco. +SIZE=$[$SIZECACHE*2] # Tamaño en sectores de 512 B. +# Inicio partición cache según el disco tenga sectores de 4k o menores +IOSIZE=$(fdisk -l $DISK | awk '/I\/O/ {print $4}') +if [ $IOSIZE -eq 4096 ]; then + END=$[$END-8192] + START=$[END-SIZE+2048-(END-SIZE)%2048] +else + START=$[END-SIZE+1] +fi +ENDPREVPART=$[$(ogGetLastSector $NDSK $[PART-1] 2>/dev/null)] +# Error si tamaño no está entre límites permitidos o si se solapa con la partición anterior. +MINSIZE=25000 # Error de formateo si tamaño < 50 MB. +MAXSIZE=$END # Para restringir tamaño > mitad del disco: MAXSIZE=$[END/2] +if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then + ogRaiseError $OG_ERR_FORMAT "$1" || return $? +fi + +# Desmontar todos los sistemas de archivos del disco. +ogUnmountAll $NDSK 2>/dev/null +# Definir particiones y notificar al kernel. +# En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear, +# por lo que se pierden los datos. +PTTYPE=$(ogGetPartitionTableType $NDSK) +if [ -z "$PTTYPE" ]; then + PTTYPE="MSDOS" # Por defecto para discos vacíos. + ogCreatePartitionTable $NDSK $PTTYPE +fi +case "$(ogGetPartitionTableType $NDSK)" in + GPT) + # Si la tabla de particiones no es valida, volver a generarla. + [ ! $(sgdisk -p $DISK &>/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK + # Si existe la cache se borra previamente + [ -n "$(ogFindCache)" ] && ogDeleteCache + # Capturamos el codigo de particion GPT para cache + # PATCH - Cuando es GPT, la particion con codigo CACHE (CA00) no existe y no puede crearse, se cambia por LINUX (8300) + ID=$(ogTypeToId LINUX GPT) + sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null + ;; + MSDOS) + # Si la tabla de particiones no es valida, volver a generarla. + parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w" + # Definir particiones y notificar al kernel. + ID=$(ogTypeToId CACHE MSDOS) + # Salvamos la configuración de las particiones e incluimos la cache. + trap "rm -f $TMPFILE" 1 2 3 9 15 + sfdisk --dump $DISK | grep -v $DISK$PART > $TMPFILE + echo "$DISK$NVME_PREFIX$PART : start= $START, size= $SIZE, Id=$ID" >> $TMPFILE + # Ordenamos las líneas de los dispositivos + UNIT=$(grep unit $TMPFILE) + grep ^/dev $TMPFILE|sort -o $TMPFILE + sed -i "1i $UNIT\n" $TMPFILE + # Guardamos nueva configuración en el disco. + sfdisk --no-reread $DISK < $TMPFILE + rm -f $TMPFILE + ;; +esac +# Actualiza la tabla de particiones en el kernel. +ogUpdatePartitionTable +} + + +#/** +# ogDeleteCache +#@brief Elimina la partición de caché local. +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@note Requisitos: fdisk, sgdisk, partprobe +#@version 0.91 - Definición de caché local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/11 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 +#@version 1.0.6b - llamada correcta a ogUpdatePartitionTable +#@author Antonio Doblas Universidad de Málaga +#@date 2016/11/16 +#@version 1.1.0 - Sustituir "sfdisk" por "fdisk" para discos MSDOS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016/05/25 +#*/ ## +function ogDeleteCache () +{ +# Variables locales. +local NDISK NPART DISK +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" + return +fi +# Error si no se encuentra partición de caché. +read NDISK NPART <<<"$(ogFindCache)" +[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? +DISK=$(ogDiskToDev $NDISK) + +# Desmontar todos los sistemas de archivos del disco. +ogUnmountAll $NDISK 2>/dev/null +case "$(ogGetPartitionTableType $NDISK)" in + GPT) + # Si la tabla de particiones no es valida, volver a generarla. + [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK + sgdisk $DISK -d$NPART 2>/dev/null + ;; + MSDOS) + # Si la tabla de particiones no es valida, volver a generarla. + parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w" + # Eliminar la partición de caché. + echo -e "d\n$NPART\nw" | fdisk $DISK 2>/dev/null + ;; +esac +# Borrar etiqueta de la caché. +rm -f /dev/disk/by-label/CACHE +#Actualiza la tabla de particiones en el kernel. +ogUpdatePartitionTable $NDISK +} + + +#/** +# ogFindCache +#@brief Detecta la partición caché local. +#@param No requiere parametros +#@return int_ndisk int_npart - devuelve el par nº de disco-nº de partición . +#@warning Si no hay cache no devuelve nada +#@version 0.1 - Integracion para Opengnsys - EAC: FindCache() en ATA.lib - HIDRA: DetectarCache.sh +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/06/19 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@Date 2008/10/27 +#@version 0.91 - Adaptacion a la cache local de OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/16 +#@version 1.0.5 - Obtener caché en discos GPT. +#@author Alberto García, Universidad de Málaga y Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014/05/28 +#*/ ## +function ogFindCache () +{ +# Variables locales +local DISK PART +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 1 4" + return +fi +# Obtener el dispositivo del sistema de archivos etiquetado como "CACHE". +PART=$(blkid -L "CACHE") +# En discos nvme con particiones GPT la partición se detecta usando el tag PARTLABEL +PART=${PART:-$(blkid -t PARTLABEL=CACHE | awk -F: '{print $1}')} +# Si no se detecta, obtener particiones marcadas de tipo caché en discos MSDOS. +PART=${PART:-$(sfdisk -l 2>/dev/null | awk '$6~/ca|a7/ {print $1}')} + +# Por último revisar todos los discos GPT y obtener las particiones etiquetadas como caché. +if [ -z "$PART" ]; then + for DISK in $(ogDiskToDev); do + # Nota: se añade espacio separador solo si existe valor previo. + PART="${PART:+"$PART "}$(sgdisk -p $DISK 2>/dev/null | awk -v d=$DISK '$7~/CACHE/ {printf "%s%s",d,$1;}')" + done +fi + +# Devolver número de disco y número de partición de la 1ª partición encontrada. +ogDevToDisk ${PART%% *} 2>/dev/null +} + + +#/** +# ogFormatCache +#@brief Formatea el sistema de ficheros para la caché local. +#@return (por determinar) +#@warning Prueba con formato Reiser. +#@attention +#@note El sistema de archivos de la caché se queda montado. +#@version 0.1 - Integracion para Opengnsys - EAC: FormatCache() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.91 - Creacion cache local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-03-11 +#@version 1.1.0 - llamada a updateBootCache. +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-21 + +#*/ ## +function ogFormatCache () +{ +# Variables locales. +local DEV MNTDIR OPTIONS +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" + return +fi + +# Error si no hay definida partición de caché. +DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? +DEV=$(ogDiskToDev $DEV) || return $? + +# Formatear sistema de ficheros. +ogUnmountCache 2>/dev/null +OPTIONS="extent,large_file" +[[ $(uname -r) =~ ^5 ]] && OPTIONS+=",uninit_bg,^metadata_csum,^64bit" +mkfs.ext4 -q -F $DEV -L "CACHE" -O "$OPTIONS" 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $? + +# Crear estructura básica. +MNTDIR=$(ogMountCache) +mkdir -p $MNTDIR/$OGIMG + +# Incluir kernel e Initrd del ogLive +updateBootCache 2>&1>/dev/null +} + + +#/** +# ogGetCacheSize +#@brief Devuelve el tamaño definido para la partición de caché. +#@return int_partsize tamaño de la partición (en KB) +#@exception OG_ERR_PARTITION No existe partición de caché. +#@version 0.1 - Integracion para Opengnsys - EAC: InfoCache() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.91 - Definicion de cache local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/09 +#*/ ## +function ogGetCacheSize () +{ +# Variables locales +local PART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 10000000" + return +fi +# Error si no se encuentra partición de caché. +PART=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? + +# Devuelve tamaño de la partición de caché. +ogGetPartitionSize $PART +} + + +#/** +# ogGetCacheSpace +#@brief Devuelve el espacio de disco disponible para la partición de caché. +#@return int_size tamaño disponible (en KB) +#@note El espacio disponible es el que hay entre el límite superior de la partición 3 del disco 1 y el final de dicho disco, y no puede ser superior a la mitad de dicho disco. +#@version 0.1 - Integracion para Opengnsys - EAC: InfoCache() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.91 - Definicion de cache local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/09 +#@version 1.0.5 - Uso de ogFindCache para detectar disco y particion +#@author Universidad de Huelva +#@date 2012/09/18 +#*/ ## +function ogGetCacheSpace () +{ +# Variables locales. +local NDISK DISK NPART SECTORS CYLS ENDPART3 +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 23165386" + return +fi +# Parche UHU para usar ogFindCache en lugar de 1 +# Error si no se encuentra partición de caché. +read NDISK NPART <<<"$(ogFindCache)" +[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? +DISK=$(ogDiskToDev $NDISK) || return $? + +SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions) +CYLS=$(sfdisk -g $DISK | cut -f2 -d" ") +SECTORS=$[SECTORS/CYLS*CYLS-1] +ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}') +# Mostrar espacio libre en KB (1 KB = 2 sectores) +if [ $ENDPART3 -gt $[SECTORS/2] ]; then + echo $[(SECTORS-ENDPART3)/2] +else + echo $[SECTORS/4] +fi +} + + +#/** +# ogMountCache +#@brief Monta la partición Cache y exporta la variable $OGCAC +#@param sin parametros +#@return path_mountpoint - Punto de montaje del sistema de archivos de cache. +#@warning Salidas de errores no determinada +#@version 0.1 - Integracion para Opengnsys - EAC: MountCache() en FileSystem.lib - HIDRA: MontarCache.sh +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2008/06/19 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@Date 2008/10/27 +#@version 0.91 - Adaptacion a la cache local de OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/16 +#@version 1.0 - Correccion multiples montajes de cache. +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/02/24 +#*/ ## +function ogMountCache () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME ==> /mnt/sda4" + return +fi + +ogMountFs $(ogFindCache) 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? +} + + +#/** +# ogUnmountCache +#@brief Desmonta la particion Cache y elimina la variable $OGCAC +#@param sin parametros +#@return nada +#@warning Salidas de errores no determinada +#@version 0.1 - Integracion para Opengnsys - EAC: UmountCache() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@Date 2008/10/27 +#@version 0.91 - Adaptacion a la cache local de OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/16 +#@version 1.0 - Correccion multiples montajes de cache. +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/02/24 +#*/ ## +function ogUnmountCache () +{ +# Variables locales. +local CACHE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" + return +fi + +CACHE=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" +ogIsMounted $CACHE || return 0 +ogUnmountFs $CACHE +# Borrar enlace simbólico de /mnt/ParticiónCache. +rm -f $(ogDiskToDev $CACHE | sed 's/dev/mnt/') +} + diff --git a/ogclient/lib/engine/bin/Disk.lib b/ogclient/lib/engine/bin/Disk.lib new file mode 100755 index 0000000..f7def42 --- /dev/null +++ b/ogclient/lib/engine/bin/Disk.lib @@ -0,0 +1,1715 @@ +#!/bin/bash +#/** +#@file Disk.lib +#@brief Librería o clase Disk +#@class Disk +#@brief Funciones para gestión de discos y particiones. +#@version 1.1.1 +#@warning License: GNU GPLv3+ +#*/ + + +# Función ficticia para lanzar parted con timeout, evitando cuelgues del programa. +function parted () +{ +timeout -k 5s -s KILL 3s $(which parted) "$@" +} + + +#/** +# ogCreatePartitions int_ndisk str_parttype:int_partsize ... +#@brief Define el conjunto de particiones de un disco. +#@param int_ndisk nº de orden del disco +#@param str_parttype mnemónico del tipo de partición +#@param int_partsize tamaño de la partición (en KB) +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION error en partición o en tabla de particiones. +#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize +#@attention Pueden definirse particiones vacías de tipo \c EMPTY +#@attention No puede definirse partición de cache y no se modifica si existe. +#@note Requisitos: sfdisk, parted, partprobe, awk +#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc. +#@version 0.9 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/09/09 +#@version 0.9.1 - Corrección del redondeo del tamaño del disco. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/03/09 +#@version 1.0.4 - Llamada a función específica para tablas GPT. +#@author Universidad de Huelva +#@date 2012/03/30 +#@version 1.1.1 - El inicio de la primera partición logica es el de la extendida más 4x512 +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2016/07/11 +#*/ ## +function ogCreatePartitions () +{ +# Variables locales. +local ND DISK PTTYPE PART SECTORS START SIZE TYPE CACHEPART IODISCO IOSIZE CACHESIZE +local EXTSTART EXTSIZE NVME_PREFIX tmpsfdisk +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \ + "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000" + return +fi +# Error si no se reciben al menos 2 parámetros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Nº total de sectores, para evitar desbordamiento (evitar redondeo). +ND="$1" +DISK=$(ogDiskToDev "$ND") || return $? +PTTYPE=$(ogGetPartitionTableType $1) +PTTYPE=${PTTYPE:-"MSDOS"} # Por defecto para discos vacíos. +case "$PTTYPE" in + GPT) ogCreateGptPartitions "$@" + return $? ;; + MSDOS) ;; + *) ogRaiseError $OG_ERR_PARTITION "$PTTYPE" + return $? ;; +esac +SECTORS=$(ogGetLastSector $1) +# Se recalcula el nº de sectores del disco 1, si existe partición de caché. +CACHEPART=$(ogFindCache 2>/dev/null) +[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}') + +# Sector de inicio (la partición 1 empieza en el sector 63). +IODISCO=$(ogDiskToDev $1) +IOSIZE=$(fdisk -l $IODISCO | awk '/I\/O/ {print $4}') +if [ "$IOSIZE" == "4096" ]; then + START=4096 + SECTORS=$[SECTORS-8192] + [ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE+2048-(SECTORS-CACHESIZE)%2048-1] +else + START=63 + [ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE] +fi +PART=1 + +# Fichero temporal de entrada para "sfdisk" +tmpsfdisk=/tmp/sfdisk$$ +trap "rm -f $tmpsfdisk" 1 2 3 9 15 + +echo "unit: sectors" >$tmpsfdisk +echo >>$tmpsfdisk + +NVME_PREFIX="" +if [[ $DISK == *"nvme"* ]]; then + NVME_PREFIX="p" +fi + + +# Generar fichero de entrada para "sfdisk" con las particiones. +shift +while [ $# -gt 0 ]; do + # Conservar los datos de la partición de caché. + if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then + echo "$DISK$NVME_PREFIX$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk + PART=$[PART+1] + fi + # Leer formato de cada parámetro - Tipo:Tamaño + TYPE="${1%%:*}" + SIZE="${1#*:}" + # Obtener identificador de tipo de partición válido. + ID=$(ogTypeToId "$TYPE" MSDOS) + [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $? + # Comprobar tamaño numérico y convertir en sectores de 512 B. + [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $? + SIZE=$[SIZE*2] + # Comprobar si la partición es extendida. + if [ $ID = 5 ]; then + [ $PART -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? + # El inicio de la primera partición logica es el de la extendida más 4x512 + let EXTSTART=$START+2048 + let EXTSIZE=$SIZE-2048 + fi + # Incluir particiones lógicas dentro de la partición extendida. + if [ $PART = 5 ]; then + [ -n "$EXTSTART" ] || ogRaiseError $OG_ERR_FORMAT || return $? + START=$EXTSTART + SECTORS=$[EXTSTART+EXTSIZE] + fi + # Generar datos para la partición. + echo "$DISK$NVME_PREFIX$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk + # Error si se supera el nº total de sectores. + START=$[START+SIZE] + if [ "$IOSIZE" == "4096" -a $PART -gt 4 ]; then + START=$[START+2048] + fi + [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $? + PART=$[PART+1] + shift +done +# Si no se indican las 4 particiones primarias, definirlas como vacías, conservando la partición de caché. +while [ $PART -le 4 ]; do + if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then + echo "$DISK$NVME_PREFIX$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk + else + echo "$DISK$NVME_PREFIX$PART : start=0, size=0, Id=0" >>$tmpsfdisk + fi + PART=$[PART+1] +done +# Si se define partición extendida sin lógicas, crear particion 5 vacía. +if [ $PART = 5 -a -n "$EXTSTART" ]; then + echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk +fi + +# Desmontar los sistemas de archivos del disco antes de realizar las operaciones. +ogUnmountAll $ND 2>/dev/null +[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null + +# Si la tabla de particiones no es valida, volver a generarla. +ogCreatePartitionTable $ND +# Definir particiones y notificar al kernel. +sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK +rm -f $tmpsfdisk +[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null || return 0 +} + + +#/** +# ogCreateGptPartitions int_ndisk str_parttype:int_partsize ... +#@brief Define el conjunto de particiones de un disco GPT +#@param int_ndisk nº de orden del disco +#@param str_parttype mnemónico del tipo de partición +#@param int_partsize tamaño de la partición (en KB) +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION error en partición o en tabla de particiones. +#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize +#@attention Pueden definirse particiones vacías de tipo \c EMPTY +#@attention No puede definirse partición de caché y no se modifica si existe. +#@note Requisitos: sfdisk, parted, partprobe, awk +#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc. +#@version 1.0.4 - Primera versión para OpenGnSys +#@author Universidad de Huelva +#@date 2012/03/30 +#*/ ## +function ogCreateGptPartitions () +{ +# Variables locales. +local ND DISK PART SECTORS ALIGN START SIZE TYPE CACHEPART CACHESIZE DELOPTIONS OPTIONS +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \ + "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000" + return +fi +# Error si no se reciben menos de 2 parámetros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Nº total de sectores, para evitar desbordamiento (evitar redondeo). +ND="$1" +DISK=$(ogDiskToDev "$ND") || return $? +# Se calcula el ultimo sector del disco (total de sectores usables) +SECTORS=$(ogGetLastSector $1) +# Se recalcula el nº de sectores del disco si existe partición de caché. +CACHEPART=$(ogFindCache 2>/dev/null) +[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}') +[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE] +# Si el disco es GPT empieza en el sector 2048 por defecto, pero podria cambiarse +ALIGN=$(sgdisk -D $DISK 2>/dev/null) +START=$ALIGN +PART=1 + +# Leer parámetros con definición de particionado. +shift + +while [ $# -gt 0 ]; do + # Si PART es la cache, nos la saltamos y seguimos con el siguiente numero para conservar los datos de la partición de caché. + if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then + PART=$[PART+1] + fi + # Leer formato de cada parámetro - Tipo:Tamaño + TYPE="${1%%:*}" + SIZE="${1#*:}" + # Error si la partición es extendida (no válida en discos GPT). + if [ "$TYPE" == "EXTENDED" ]; then + ogRaiseError $OG_ERR_PARTITION "EXTENDED" + return $? + fi + # Comprobar si existe la particion actual, capturamos su tamaño para ver si cambio o no + PARTSIZE=$(ogGetPartitionSize $ND $PART 2>/dev/null) + # En sgdisk no se pueden redimensionar las particiones, es necesario borrarlas y volver a crealas + [ $PARTSIZE ] && DELOPTIONS="$DELOPTIONS -d$PART" + # Creamos la particion + # Obtener identificador de tipo de partición válido. + ID=$(ogTypeToId "$TYPE" GPT) + [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $? + # Comprobar tamaño numérico y convertir en sectores de 512 B. + [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $? + SIZE=$[SIZE*2] + # SIZE debe ser múltiplo de ALIGN, si no gdisk lo mueve automáticamente. + DIV=$[$SIZE/$ALIGN] + SIZE=$[$DIV*$ALIGN] + # En el caso de que la partición sea EMPTY no se crea nada + if [ "$TYPE" != "EMPTY" ]; then + OPTIONS="$OPTIONS -n$PART:$START:+$SIZE -t$PART:$ID " + fi + START=$[START+SIZE] + # Error si se supera el nº total de sectores. + [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $? + PART=$[PART+1] + shift +done + +# Desmontar los sistemas de archivos del disco antes de realizar las operaciones. +ogUnmountAll $ND 2>/dev/null +[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null + +# Si la tabla de particiones no es valida, volver a generarla. +ogCreatePartitionTable $ND +# Definir particiones y notificar al kernel. +# Borramos primero las particiones y luego creamos las nuevas +sgdisk $DELOPTIONS $OPTIONS $DISK 2>/dev/null && partprobe $DISK +[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null || return 0 +} + + +#/** +# ogCreatePartitionTable int_ndisk [str_tabletype] +#@brief Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada. +#@param int_ndisk nº de orden del disco +#@param str_tabletype tipo de tabla de particiones (opcional) +#@return (por determinar) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note tabletype: { MSDOS, GPT }, MSDOS por defecto +#@note Requisitos: fdisk, gdisk, parted +#@version 1.0.4 - Primera versión compatible con OpenGnSys. +#@author Universidad de Huelva +#@date 2012/03/06 +#@version 1.0.6a - Adaptar creación de nueva tabla MSDOS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016/01/29 +#*/ ## +function ogCreatePartitionTable () +{ +# Variables locales. +local DISK PTTYPE CREATE CREATEPTT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME int_ndisk [str_partype]" \ + "$FUNCNAME 1 GPT" "$FUNCNAME 1" + return +fi +# Error si no se reciben 1 o 2 parámetros. +case $# in + 1) CREATEPTT="" ;; + 2) CREATEPTT="$2" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac + +# Capturamos el tipo de tabla de particiones actual +DISK=$(ogDiskToDev $1) || return $? +PTTYPE=$(ogGetPartitionTableType $1) +PTTYPE=${PTTYPE:-"MSDOS"} # Por defecto para discos vacíos. +CREATEPTT=${CREATEPTT:-"$PTTYPE"} + +# Si la tabla actual y la que se indica son iguales, se comprueba si hay que regenerarla. +if [ "$CREATEPTT" == "$PTTYPE" ]; then + case "$PTTYPE" in + GPT) [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || CREATE="GPT" ;; + MSDOS) [ $(parted -s $DISK print >/dev/null) ] || CREATE="MSDOS" ;; + esac +else + CREATE="$CREATEPTT" +fi +# Dependiendo del valor de CREATE, creamos la tabla de particiones en cada caso. +case "$CREATE" in + GPT) + # Si es necesario crear una tabla GPT pero la actual es MSDOS + if [ "$PTTYPE" == "MSDOS" ]; then + sgdisk -go $DISK + else + echo -e "2\nw\nY\n" | gdisk $DISK + fi + partprobe $DISK 2>/dev/null + ;; + MSDOS) + # Si es necesario crear una tabla MSDOS pero la actual es GPT + if [ "$PTTYPE" == "GPT" ]; then + sgdisk -Z $DISK + fi + # Crear y borrar una partición para que la tabla se genere bien. + echo -e "o\nn\np\n\n\n\nd\n\nw" | fdisk $DISK + partprobe $DISK 2>/dev/null + ;; +esac +} + + +#/** +# ogDeletePartitionTable ndisk +#@brief Borra la tabla de particiones del disco. +#@param int_ndisk nº de orden del disco +#@return la informacion propia del fdisk +#@version 0.1 - Integracion para OpenGnSys +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 1.0.4 - Adaptado para su uso con discos GPT +#@author Universidad de Huelva +#@date 2012/03/13 +#*/ ## +function ogDeletePartitionTable () +{ +# Variables locales. +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME int_ndisk" "$FUNCNAME 1" + return +fi +# Error si no se reciben 1 parámetros. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obteniendo Identificador linux del disco. +DISK=$(ogDiskToDev $1) || return $? +# Crear una tabla de particiones vacía. +case "$(ogGetPartitionTableType $1)" in + GPT) sgdisk -o $DISK ;; + MSDOS) echo -ne "o\nw" | fdisk $DISK ;; +esac +} + + +#/** +# ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid" +#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o a la etiqueta o UUID del sistema de archivos asociado. +#@param path_device Camino del fichero de dispositivo. +#@param str_label etiqueta de sistema de archivos. +#@param str_uuid UUID de sistema de archivos. +#@return int_ndisk (para dispositivo de disco) +#@return int_ndisk int_npartition (para dispositivo de partición). +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Dispositivo no detectado. +#@note Solo se acepta en cada llamada 1 de los 3 tipos de parámetros. +#@version 0.1 - Integracion para Opengnsys - EAC: DiskEAC() en ATA.lib +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2009/07/20 +#@version 1.0.6 - Soporta parámetro con UIID o etiqueta. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014/07/13 +#*/ ## +function ogDevToDisk () +{ +# Variables locales. +local CACHEFILE DEV PART NVME_PREFIX d n +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_device | LABEL=str_label | UUID=str_uuid" \ + "$FUNCNAME /dev/sda => 1" \ + "$FUNCNAME /dev/sda1 => 1 1" \ + "$FUNCNAME LABEL=CACHE => 1 4" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener dispositivo a partir de camino, etiqueta o UUID. +DEV="$1" +case "$DEV" in + LABEL=*) DEV=$(blkid -L "${1#*=}") ;; + PARTLABEL=*) DEV=$(realpath "/dev/disk/by-partlabel/${1#*=}" 2>/dev/null) ;; + PARTUUID=*) DEV=$(realpath "/dev/disk/by-partuuid/${1#*=}" 2>/dev/null) ;; + UUID=*) DEV=$(blkid -U "${1#*=}") ;; +esac + +# Error si no es fichero de bloques o directorio (para LVM). +[ -b "$DEV" -o -d "$DEV" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + +# Buscar en fichero de caché de discos. +CACHEFILE=/var/cache/disks.cfg +PART=$(awk -F: -v d="$DEV" '{if ($2==d) {print $1}}' $CACHEFILE 2>/dev/null) +if [ -n "$PART" ]; then + echo "$PART" + return +fi +# Si no se encuentra, procesa todos los discos para devolver su nº de orden y de partición. +n=1 +for d in $(ogDiskToDev); do +NVME_PREFIX="" +if [[ $d == *"nvme"* ]]; then + NVME_PREFIX="p" +fi + + + [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d$NVME_PREFIX}" && return + n=$[n+1] +done +ogRaiseError $OG_ERR_NOTFOUND "$1" +return $OG_ERR_NOTFOUND +} + + +#/** +# ogDiskToDev [int_ndisk [int_npartition]] +#@brief Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return Para 0 parametros: Devuelve los nombres de ficheros de los dispositivos sata/ata/usb linux encontrados. +#@return Para 1 parametros: Devuelve la ruta del disco duro indicado. +#@return Para 2 parametros: Devuelve la ruta de la particion indicada. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Dispositivo no detectado. +#@note Requisitos: awk, lvm +#@version 0.1 - Integracion para Opengnsys - EAC: Disk() en ATA.lib; HIDRA: DetectarDiscos.sh +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/06/19 +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2009-07-20 +#@version 1.0.5 - Comprobación correcta de parámetros para soportar valores > 9. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2013-05-07 +#@version 1.0.6 - Soportar RAID hardware y Multipath. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014-09-23 +#@version 1.1.0 - Usar caché de datos y soportar pool de volúmenes ZFS. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2016-05-27 +#*/ ## +function ogDiskToDev () +{ +# Variables locales +local CACHEFILE ALLDISKS MPATH VOLGROUPS ZFSVOLS DISK PART ZPOOL i + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \ + "$FUNCNAME => /dev/sda /dev/sdb" \ + "$FUNCNAME 1 => /dev/sda" \ + "$FUNCNAME 1 1 => /dev/sda1" + return +fi + +# Borrar fichero de caché de configuración si hay cambios en las particiones. +CACHEFILE=/var/cache/disks.cfg +if ! diff -q <(cat /proc/partitions) /tmp/.partitions &>/dev/null; then + # Guardar copia de las particiones definidas para comprobar cambios. + cp -a /proc/partitions /tmp/.partitions + rm -f $CACHEFILE +fi + +# Si existe una correspondencia con disco/dispositivo en el caché; mostrarlo y salir. +PART=$(awk -F: -v d="$*" '{if ($1==d) {print $2}}' $CACHEFILE 2>/dev/null) +if [ -n "$PART" ]; then + echo "$PART" + return +fi + +# Continuar para detectar nuevos dispositivos. +# Listar dispositivos de discos. +ALLDISKS=$((lsblk -n -e 1,2 -x MAJ:MIN 2>/dev/null || lsblk -n -e 1,2) | \ + awk '$6~/^disk$/ {gsub(/!/,"/"); printf "/dev/%s ",$1}') +#ALLDISKS=$(lsblk -Jdp | jq -r '.blockdevices[] | select(.type=="disk").name') +# Listar volúmenes lógicos. +VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}') +ALLDISKS="$ALLDISKS $VOLGROUPS" + +# Detectar caminos múltiples (ignorar mensaje si no está configurado Multipath). +if MPATH=$(multipath -l -v 1 2>/dev/null | awk '{printf "/dev/mapper/%s ",$1}'; exit ${PIPESTATUS[0]}); then + # Quitar de la lista los discos que forman parte de Multipath. + for i in $(multipath -ll | awk '$6=="ready" {printf "/dev/%s ",$3}'); do + ALLDISKS="${ALLDISKS//$i/}" + done + # Añadir caminos múltiples a los discos detectados. + ALLDISKS="$ALLDISKS $MPATH" +fi + +# Detectar volúmenes ZFS. +ZFSVOLS=$(blkid | awk -F: '/zfs/ {print $1}') +ALLDISKS="$ALLDISKS $ZFSVOLS" + +# Mostrar salidas segun el número de parametros. +case $# in + 0) # Muestra todos los discos, separados por espacios. + echo $ALLDISKS + ;; + 1) # Error si el parámetro no es un número positivo. + [[ "$1" =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $? + DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}') + # Error si el fichero no existe. + [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + # Actualizar caché de configuración y mostrar dispositivo. + echo "$*:$DISK" >> $CACHEFILE + echo "$DISK" + ;; + 2) # Error si los 2 parámetros no son números positivos. + [[ "$1" =~ ^[1-9][0-9]*$ ]] && [[ "$2" =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1 $2" || return $? + DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}') + [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + PART="$DISK$2" + # Comprobar si es partición. + if [ -b "$PART" ]; then + # Actualizar caché de configuración y mostrar dispositivo. + echo "$*:$PART" >> $CACHEFILE + echo "$PART" + else + # Comprobar si RAID o Multipath (tener en cuenta enlace simbólico). + PART="${DISK}p$2" + if [ "$(stat -L -c "%A" "$PART" 2>/dev/null | cut -c1)" == "b" ]; then + # Actualizar caché de configuración y mostrar dispositivo. + echo "$*:$PART" >> $CACHEFILE + echo "$PART" + else + PART="" + # Comprobar si volumen lógico. /* (comentario Doxygen) + if ogCheckStringInGroup "$DISK" "$VOLGROUPS"; then + PART=$(lvscan -a 2>/dev/null | \ + awk -F\' -v n=$2 "\$2~/^${DISK//\//\\/}\// {if (NR==n) print \$2}") + [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? + # (comentario Doxygen) */ + fi + # Comprobar si volumen ZFS que puede ser montado. + if ogCheckStringInGroup "$DISK" "$ZFSVOLS"; then + zpool import -f -R /mnt -N -a 2>/dev/null + ZPOOL=$(blkid -s LABEL -o value $DISK) + PART=$(zfs list -Hp -o name,canmount,mountpoint -r $ZPOOL | \ + awk -v n=$2 '$2=="on" && $3!="none" {c++; if (c==n) print $1}') + fi + # Salir si no se encuentra dispositivo. + [ -n "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? + # Devolver camino al dispositivo. + # Actualizar caché de configuración y mostrar dispositivo. + echo "$*:$PART" >> $CACHEFILE + echo "$PART" + fi + fi + ;; + *) # Formato erroneo. + ogRaiseError $OG_ERR_FORMAT + return $OG_ERR_FORMAT + ;; +esac +} + + +#/** +# ogGetDiskSize int_ndisk +#@brief Muestra el tamaño en KB de un disco. +#@param int_ndisk nº de orden del disco +#@return int_size - Tamaño en KB del disco. +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@note Requisitos: sfdisk, awk +#@version 0.9.2 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/09/15 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014/09/04 +#*/ ## +function ogGetDiskSize () +{ +# Variables locales. +local DISK SIZE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1 => 244198584" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener el tamaño del disco. +DISK="$(ogDiskToDev $1)" || return $? +SIZE=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions) +# Si no, obtener tamaño del grupo de volúmenes. +[ -z "$SIZE" ] && SIZE=$(vgs --noheadings --units=B -o dev_size $DISK 2>/dev/null | \ + awk '{print $1/1024}') + +# Mostrar salida. +[ -n "$SIZE" ] && echo "$SIZE" +} + + +#/** +# ogGetDiskType path_device +#@brief Muestra el tipo de disco (real, RAID, meta-disco, USB, etc.). +#@param path_device Dispositivo +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco no detectado o no es un dispositivo de bloques. +#@note Requisitos: udevadm +#@version 1.1.1 - Primera version para OpenGnsys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2018-02-27 +#*/ ## +function ogGetDiskType () +{ +# Variables locales +local DEV MAJOR TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_device" \ + "$FUNCNAME /dev/sdb => USB" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener el driver del dispositivo de bloques. +[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? +DEV=${1#/dev/} +MAJOR=$(awk -v D="$DEV" '{if ($4==D) print $1;}' /proc/partitions) +TYPE=$(awk -v D=$MAJOR '/Block/ {bl=1} {if ($1==D&&bl) print toupper($2)}' /proc/devices) +# Devolver mnemónico del driver de dispositivo. +case "$TYPE" in + SD) + TYPE="DISK" + udevadm info -q property $1 2>/dev/null | grep -q "^ID_BUS=usb" && TYPE="USB" + ;; + BLKEXT) + TYPE="NVM" + ;; + SR|IDE*) + TYPE="CDROM" # FIXME Comprobar discos IDE. + ;; + MD|CCISS*) + TYPE="RAID" + ;; + DEVICE-MAPPER) + TYPE="MAPPER" # FIXME Comprobar LVM y RAID. + ;; +esac +echo $TYPE +} + + +#/** +# ogGetEsp +#@brief Devuelve números de disco y partición para la partición EFI (ESP). +#*/ ## +function ogGetEsp () +{ +local PART d +for d in $(blkid -o device|sort); do + # Previene error para /dev/loop0 + PART="$(ogDevToDisk $d 2>/dev/null)" || continue + # En discos NVMe blkid devuelve una salida del tipo: + # >/dev/loop0 + # >/dev/nvme0n1 + # >/dev/nvme0n1p1 + # al analizar la particion nvme0n1, PART solo tiene un argumento y hace que ogGetPartitionId lance un error + LEN=$(echo $PART | awk '{ print length($0) }') + if [ $LEN -gt 1 ]; then + if [ "$(ogGetPartitionId $PART)" == "$(ogTypeToId EFI GPT)" ]; then + echo $PART + break + fi + fi +done +} + + +#/** +# ogGetLastSector int_ndisk [int_npart] +#@brief Devuelve el último sector usable del disco o de una partición. +#@param int_ndisk nº de orden del disco +#@param int_npart nº de orden de la partición (opcional) +#@return Último sector usable. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo. +#@note Requisitos: sfdisk, sgdisk +#@version 1.0.4 - Primera versión compatible con OpenGnSys. +#@author Universidad de Huelva +#@date 2012-06-03 +#@version 1.0.6b - uso de sgdisk para todo tipo de particiones. Incidencia #762 +#@author Universidad de Málaga +#@date 2016-11-10 +#*/ ## +function ogGetLastSector () +{ +# Variables locales +local DISK PART LASTSECTOR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npart]" \ + "$FUNCNAME 1 => 488392064" \ + "$FUNCNAME 1 1 => 102400062" + return +fi + +# Obtener último sector. +case $# in + 1) # Para un disco. + DISK=$(ogDiskToDev $1) || return $? + LASTSECTOR=$(LANG=C sgdisk -p $DISK | awk '/last usable sector/ {print($(NF))}') + ;; + 2) # Para una partición. + DISK=$(ogDiskToDev $1) || return $? + PART=$(ogDiskToDev $1 $2) || return $? + LASTSECTOR=$(LANG=C sgdisk -p $DISK | awk -v P="$2" '{if ($1==P) print $3}') + ;; + *) # Error si se reciben más parámetros. + ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac +echo $LASTSECTOR +} + + +#/** +# ogGetPartitionActive int_ndisk +#@brief Muestra que particion de un disco esta marcada como de activa. +#@param int_ndisk nº de orden del disco +#@return int_npart Nº de partición activa +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note Requisitos: parted +#@todo Queda definir formato para atributos (arranque, oculta, ...). +#@version 0.9 - Primera version compatible con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/09/17 +#*/ ## +function ogGetPartitionActive () +{ +# Variables locales +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1 => 1" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Comprobar que el disco existe y listar su partición activa. +DISK="$(ogDiskToDev $1)" || return $? +LANG=C parted -sm $DISK print 2>/dev/null | awk -F: '$7~/boot/ {print $1}' +} + + +#/** +# ogGetPartitionId int_ndisk int_npartition +#@brief Devuelve el mnemónico con el tipo de partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return Identificador de tipo de partición. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo. +#@note Requisitos: sfdisk +#@version 0.9 - Primera versión compatible con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-03-25 +#@version 1.0.2 - Detectar partición vacía. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-12-23 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014-09-04 +#@version 1.1.0 - Soportar pool de volúmenes ZFS. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014-11-14 +#*/ ## +function ogGetPartitionId () +{ +# Variables locales. +local DISK ID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1 => 7" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Detectar y mostrar el id. de tipo de partición. +DISK=$(ogDiskToDev $1) || return $? +case "$(ogGetPartitionTableType $1)" in + GPT) ID=$(sgdisk -p $DISK 2>/dev/null | awk -v p="$2" '{if ($1==p) print $6;}') || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? + [ "$ID" == "8300" -a "$1 $2" == "$(ogFindCache)" ] && ID=CA00 + ;; + MSDOS) ID=$(sfdisk --id $DISK $2 2>/dev/null) || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? ;; + LVM) ID=10000 ;; + ZPOOL) ID=10010 ;; +esac +echo $ID +} + + +#/** +# ogGetPartitionSize int_ndisk int_npartition +#@brief Muestra el tamano en KB de una particion determinada. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return int_partsize - Tamaño en KB de la partición. +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@note Requisitos: sfdisk, awk +#@version 0.1 - Integracion para Opengnsys - EAC: SizePartition () en ATA.lib +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/07/24 +#@version 1.1.0 - Sustituir "sfdisk" por "partx". +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016/05/04 +#*/ ## +function ogGetPartitionSize () +{ +# Variables locales. +local PART SIZE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1 => 10000000" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Devolver tamaño de partición, del volumen lógico o del sistema de archivos (para ZFS). +PART="$(ogDiskToDev $1 $2)" || return $? +SIZE=$(partx -gbo SIZE $PART 2>/dev/null | awk '{print int($1/1024)}') +[ -z "$SIZE" ] && SIZE=$(lvs --noheadings -o lv_size --units k $PART | awk '{printf "%d",$0}') +[ -z "$SIZE" ] && SIZE=$(ogGetFsSize $1 $2) +echo ${SIZE:-0} +} + + +#/** +# ogGetPartitionsNumber int_ndisk +#@brief Detecta el numero de particiones del disco duro indicado. +#@param int_ndisk nº de orden del disco +#@return Devuelve el numero paritiones del disco duro indicado +#@warning Salidas de errores no determinada +#@attention Requisitos: parted +#@note Notas sin especificar +#@version 0.1 - Integracion para Opengnsys - EAC: DetectNumberPartition () en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date Date: 27/10/2008 +#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-24 +#@version 1.0.4 - Uso de /proc/partitions para detectar el numero de particiones +#@author Universidad de Huelva +#@date 2012-03-28 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014-09-04 +#@version 1.1.0 - Soportar ZFS y sustituir "sfdisk" por "partx". +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2016-04-28 +#*/ ## +function ogGetPartitionsNumber () +{ +# Variables locales. +local DISK +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => 3" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Contar el nº de veces que aparece el disco en su lista de particiones. +DISK=$(ogDiskToDev $1) 2>/dev/null +case "$(ogGetPartitionTableType $1)" in + GPT|MSDOS) + partx -gso NR $DISK 2>/dev/null | awk -v p=0 '{p=$1} END {print p}' ;; + LVM) lvs --noheadings $DISK 2>/dev/null | wc -l ;; + ZPOOL) zpool list &>/dev/null || modprobe zfs + zpool import -f -R /mnt -N -a 2>/dev/null + zfs list -Hp -o name,canmount,mountpoint -r $(blkid -s LABEL -o value $DISK) | \ + awk '$2=="on" && $3!="none" {c++} + END {print c}' + ;; +esac +} + + +#/** +# ogGetPartitionTableType int_ndisk +#@brief Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS) +#@param int_ndisk nº de orden del disco +#@return str_tabletype - Tipo de tabla de paritiones +#@warning Salidas de errores no determinada +#@note tabletype = { MSDOS, GPT } +#@note Requisitos: blkid, parted, vgs +#@version 1.0.4 - Primera versión para OpenGnSys +#@author Universidad de Huelva +#@date 2012/03/01 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014-09-04 +#@version 1.1.0 - Mejorar rendimiento y soportar ZFS. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014-11-14 +#*/ ## +function ogGetPartitionTableType () +{ +# Variables locales. +local DISK TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => MSDOS" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Sustituye n de disco por su dispositivo. +DISK=$(ogDiskToDev $1) || return $? + +# Comprobar tabla de particiones. +if [ -b $DISK ]; then + TYPE=$(parted -sm $DISK print 2>/dev/null | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}') + [ -z "$TYPE" ] && TYPE=$(parted -sm $DISK print 2>/dev/null | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}') +fi +# Comprobar si es volumen lógico. +[ -d $DISK ] && vgs $DISK &>/dev/null && TYPE="LVM" +# Comprobar si es pool de ZFS. +[ -z "$TYPE" -o "$TYPE" == "UNKNOWN" ] && [ -n "$(blkid -s TYPE $DISK | grep zfs)" ] && TYPE="ZPOOL" + +# Mostrar salida. +[ -n "$TYPE" ] && echo "$TYPE" +} + + +#/** +# ogGetPartitionType int_ndisk int_npartition +#@brief Devuelve el mnemonico con el tipo de partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return Mnemonico +#@note Mnemonico: valor devuelto por ogIdToType. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@version 0.1 - Integracion para Opengnsys - EAC: TypeFS() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera adaptacion para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-21 +#@version 1.0.3 - Código trasladado de antigua función ogGetFsType. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-12-01 +#@version 1.0.5 - Usar función ogIdToType para hacer la conversión id. a tipo. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-09-19 +#*/ ## +function ogGetPartitionType () +{ +# Variables locales. +local ID TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1 => NTFS" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Detectar id. de tipo de partición y codificar al mnemonico. +ID=$(ogGetPartitionId "$1" "$2") || return $? +TYPE=$(ogIdToType "$ID") +echo "$TYPE" +} + + +#/** +# ogHidePartition int_ndisk int_npartition +#@brief Oculta un apartición visible. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION tipo de partición no reconocido. +#@version 1.0 - Versión en pruebas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/01/12 +#@version 1.1.1 - Se incluye tipo Windows para UEFI (ticket #802) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019/01/18 +#*/ ## +function ogHidePartition () +{ +# Variables locales. +local PART TYPE NEWTYPE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +PART=$(ogDiskToDev "$1" "$2") || return $? + +# Obtener tipo de partición. +TYPE=$(ogGetPartitionType "$1" "$2") +case "$TYPE" in + NTFS) NEWTYPE="HNTFS" ;; + FAT32) NEWTYPE="HFAT32" ;; + FAT16) NEWTYPE="HFAT16" ;; + FAT12) NEWTYPE="HFAT12" ;; + WINDOWS)NEWTYPE="WIN-RESERV";; + *) ogRaiseError $OG_ERR_PARTITION "$TYPE" + return $? ;; +esac +# Cambiar tipo de partición. +ogSetPartitionType $1 $2 $NEWTYPE +} + + +#/** +# ogIdToType int_idpart +#@brief Devuelve el identificador correspondiente a un tipo de partición. +#@param int_idpart identificador de tipo de partición. +#@return str_parttype mnemónico de tipo de partición. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.5 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2013-02-07 +#*/ ## +function ogIdToType () +{ +# Variables locales +local ID TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_idpart" \ + "$FUNCNAME 83 => LINUX" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener valor hexadecimal de 4 caracteres rellenado con 0 por delante. +ID=$(printf "%4s" "$1" | tr ' ' '0') +case "${ID,,}" in + 0000) TYPE="EMPTY" ;; + 0001) TYPE="FAT12" ;; + 0005|000f) TYPE="EXTENDED" ;; + 0006|000e) TYPE="FAT16" ;; + 0007) TYPE="NTFS" ;; + 000b|000c) TYPE="FAT32" ;; + 0011) TYPE="HFAT12" ;; + 0012) TYPE="COMPAQDIAG" ;; + 0016|001e) TYPE="HFAT16" ;; + 0017) TYPE="HNTFS" ;; + 001b|001c) TYPE="HFAT32" ;; + 0042) TYPE="WIN-DYNAMIC" ;; + 0082|8200) TYPE="LINUX-SWAP" ;; + 0083|8300) TYPE="LINUX" ;; + 008e|8E00) TYPE="LINUX-LVM" ;; + 00a5|a503) TYPE="FREEBSD" ;; + 00a6) TYPE="OPENBSD" ;; + 00a7) TYPE="CACHE" ;; # (compatibilidad con Brutalix) + 00af|af00) TYPE="HFS" ;; + 00be|be00) TYPE="SOLARIS-BOOT" ;; + 00bf|bf0[0145]) TYPE="SOLARIS" ;; + 00ca|ca00) TYPE="CACHE" ;; + 00da) TYPE="DATA" ;; + 00ee) TYPE="GPT" ;; + 00ef|ef00) TYPE="EFI" ;; + 00fb) TYPE="VMFS" ;; + 00fd|fd00) TYPE="LINUX-RAID" ;; + 0700) TYPE="WINDOWS" ;; + 0c01) TYPE="WIN-RESERV" ;; + 7f00) TYPE="CHROMEOS-KRN" ;; + 7f01) TYPE="CHROMEOS" ;; + 7f02) TYPE="CHROMEOS-RESERV" ;; + 8301) TYPE="LINUX-RESERV" ;; + a500) TYPE="FREEBSD-DISK" ;; + a501) TYPE="FREEBSD-BOOT" ;; + a502) TYPE="FREEBSD-SWAP" ;; + ab00) TYPE="HFS-BOOT" ;; + af01) TYPE="HFS-RAID" ;; + bf02) TYPE="SOLARIS-SWAP" ;; + bf03) TYPE="SOLARIS-DISK" ;; + ef01) TYPE="MBR" ;; + ef02) TYPE="BIOS-BOOT" ;; + 10000) TYPE="LVM-LV" ;; + 10010) TYPE="ZFS-VOL" ;; + *) TYPE="UNKNOWN" ;; +esac +echo "$TYPE" +} + + +# ogIsDiskLocked int_ndisk +#@brief Comprueba si un disco está bloqueado por una operación de uso exclusivo. +#@param int_ndisk nº de orden del disco +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. +#@note Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-". +#@version 1.1.0 - Primera versión para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-04-08 +#*/ ## +function ogIsDiskLocked () +{ +# Variables locales +local DISK LOCKFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "if $FUNCNAME 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 1 ] || return 1 +DISK="$(ogDiskToDev $1 2>/dev/null)" || return 1 + +# Comprobar existencia de fichero de bloqueo para el disco. +LOCKFILE="/var/lock/lock${DISK//\//-}" +test -f $LOCKFILE +} + + +#/** +# ogListPartitions int_ndisk +#@brief Lista las particiones definidas en un disco. +#@param int_ndisk nº de orden del disco +#@return str_parttype:int_partsize ... +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@note Requisitos: \c parted \c awk +#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize +#@attention Las tuplas de valores están separadas por espacios. +#@version 0.9 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/07/24 +#*/ ## +function ogListPartitions () +{ +# Variables locales. +local DISK PART NPARTS TYPE SIZE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $? + +# Procesar la salida de \c parted . +DISK="$(ogDiskToDev $1)" || return $? +NPARTS=$(ogGetPartitionsNumber $1) +for (( PART = 1; PART <= NPARTS; PART++ )); do + TYPE=$(ogGetPartitionType $1 $PART 2>/dev/null); TYPE=${TYPE:-EMPTY} + SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null); SIZE=${SIZE:-0} + echo -n "$TYPE:$SIZE " +done +echo +} + + +#/** +# ogListPrimaryPartitions int_ndisk +#@brief Metafunción que lista las particiones primarias no vacías de un disco. +#@param int_ndisk nº de orden del disco +#@see ogListPartitions +#*/ ## +function ogListPrimaryPartitions () +{ +# Variables locales. +local PTTYPE PARTS + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => NTFS:10000000 EXT3:5000000 EXTENDED:1000000" + return +fi + +PTTYPE=$(ogGetPartitionTableType $1) || return $? +PARTS=$(ogListPartitions "$@") || return $? +case "$PTTYPE" in + GPT) echo $PARTS | sed 's/\( EMPTY:0\)*$//' ;; + MSDOS) echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//' ;; +esac +} + + +#/** +# ogListLogicalPartitions int_ndisk +#@brief Metafunción que lista las particiones lógicas de una tabla tipo MSDOS. +#@param int_ndisk nº de orden del disco +#@see ogListPartitions +#*/ ## +function ogListLogicalPartitions () +{ +# Variables locales. +local PTTYPE PARTS + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => LINUX-SWAP:999998" + return +fi +PTTYPE=$(ogGetPartitionTableType $1) || return $? +[ "$PTTYPE" == "MSDOS" ] || ogRaiseError $OG_ERR_PARTITION "" || return $? +PARTS=$(ogListPartitions "$@") || return $? +echo $PARTS | cut -sf5- -d" " +} + + +#/** +# ogLockDisk int_ndisk +#@brief Genera un fichero de bloqueo para un disco en uso exlusivo. +#@param int_ndisk nº de orden del disco +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-". +#@version 1.1.0 - Primera versión para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-04-07 +#*/ ## +function ogLockDisk () +{ +# Variables locales +local DISK LOCKFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +DISK="$(ogDiskToDev $1)" || return $? + +# Crear archivo de bloqueo exclusivo. +LOCKFILE="/var/lock/lock${DISK//\//-}" +touch $LOCKFILE +} + + +#/** +# ogSetPartitionActive int_ndisk int_npartition +#@brief Establece cual es la partición activa de un disco. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (nada). +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. +#@note Requisitos: parted +#@version 0.1 - Integracion para Opengnsys - EAC: SetPartitionActive() en ATA.lib +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version compatible con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/09/17 +#*/ ## +function ogSetPartitionActive () +{ +# Variables locales +local DISK PART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1" + return +fi + +# Si el EFI esta activo me salgo. +ogIsEfiActive && ogEcho session log warning "EFI: $MSG_DONTUSE $FUNCNAME" && return + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Comprobar que el disco existe y activar la partición indicada. +DISK="$(ogDiskToDev $1)" || return $? +PART="$(ogDiskToDev $1 $2)" || return $? +parted -s $DISK set $2 boot on 2>/dev/null +} + + +#/** +# ogSetPartitionId int_ndisk int_npartition hex_partid +#@brief Cambia el identificador de la partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param hex_partid identificador de tipo de partición +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. +#@exception OG_ERR_OUTOFLIMIT Valor no válido. +#@exception OG_ERR_PARTITION Error al cambiar el id. de partición. +#@attention Requisitos: fdisk, sgdisk +#@version 0.1 - Integracion para Opengnsys - SetPartitionType() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 +#@version 1.0.5 - Utiliza el id. de tipo de partición (no el mnemónico) +#@author Universidad de Huelva +#@date 2012/05/14 +#*/ ## +function ogSetPartitionId () +{ +# Variables locales +local DISK PART PTTYPE ID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition hex_partid" \ + "$FUNCNAME 1 1 7" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Sustituye nº de disco y nº partición por su dispositivo. +DISK=$(ogDiskToDev $1) || return $? +PART=$(ogDiskToDev $1 $2) || return $? +# Error si el id. de partición no es hexadecimal. +ID="${3^^}" +[[ "$ID" =~ ^[0-9A-F]+$ ]] || ogRaiseError $OG_ERR_OUTOFLIMIT "$3" || return $? + +# Elección del tipo de partición. +PTTYPE=$(ogGetPartitionTableType $1) +case "$PTTYPE" in + GPT) sgdisk -t$2:$ID $DISK 2>/dev/null ;; + MSDOS) sfdisk --id $DISK $2 $ID 2>/dev/null ;; + *) ogRaiseError $OG_ERR_OUTOFLIMIT "$1,$PTTYPE" + return $? ;; +esac + +# MSDOS) Correcto si fdisk sin error o con error pero realiza Syncing +if [ "${PIPESTATUS[1]}" == "0" -o $? -eq 0 ]; then + partprobe $DISK 2>/dev/null + return 0 +else + ogRaiseError $OG_ERR_PARTITION "$1,$2,$3" + return $? +fi +} + + +#/** +# ogSetPartitionSize int_ndisk int_npartition int_size +#@brief Muestra el tamano en KB de una particion determinada. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param int_size tamaño de la partición (en KB) +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@note Requisitos: sfdisk, awk +#@todo Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición. +#@version 0.9 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/07/24 +#*/ ## +function ogSetPartitionSize () +{ +# Variables locales. +local DISK PART SIZE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_size" \ + "$FUNCNAME 1 1 10000000" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener el tamaño de la partición. +DISK="$(ogDiskToDev $1)" || return $? +PART="$(ogDiskToDev $1 $2)" || return $? +# Convertir tamaño en KB a sectores de 512 B. +SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $? +# Redefinir el tamaño de la partición. +sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? +partprobe $DISK 2>/dev/null +} + + +#/** +# ogSetPartitionType int_ndisk int_npartition str_type +#@brief Cambia el identificador de la partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_type mnemónico de tipo de partición +#@return (nada) +#@attention Requisitos: fdisk, sgdisk +#@version 0.1 - Integracion para Opengnsys - SetPartitionType() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 +#@version 1.0.5 - Renombrada de ogSetPartitionId. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013/03/07 +#*/ ## +function ogSetPartitionType () +{ +# Variables locales +local DISK PART PTTYPE ID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \ + "$FUNCNAME 1 1 NTFS" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Sustituye nº de disco por su dispositivo. +DISK=`ogDiskToDev $1` || return $? +PART=`ogDiskToDev $1 $2` || return $? + +# Elección del tipo de partición. +PTTYPE=$(ogGetPartitionTableType $1) +ID=$(ogTypeToId "$3" "$PTTYPE") +[ -n "$ID" ] || ogRaiseError $OG_ERR_FORMAT "$3,$PTTYPE" || return $? +ogSetPartitionId $1 $2 $ID +} + + +#/** +# ogTypeToId str_parttype [str_tabletype] +#@brief Devuelve el identificador correspondiente a un tipo de partición. +#@param str_parttype mnemónico de tipo de partición. +#@param str_tabletype mnemónico de tipo de tabla de particiones (MSDOS por defecto). +#@return int_idpart identificador de tipo de partición. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@note tabletype = { MSDOS, GPT }, (MSDOS, por defecto) +#@version 0.1 - Integracion para Opengnsys - EAC: TypeFS () en ATA.lib +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2009-12-14 +#@version 1.0.4 - Soportar discos GPT (sustituye a ogFsToId). +#@author Universidad de Huelva +#@date 2012/03/30 +#*/ ## +function ogTypeToId () +{ +# Variables locales +local PTTYPE ID="" + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_parttype [str_tabletype]" \ + "$FUNCNAME LINUX => 83" \ + "$FUNCNAME LINUX MSDOS => 83" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && (ogRaiseError $OG_ERR_FORMAT; return $?) + +# Asociar id. de partición para su mnemónico. +PTTYPE=${2:-"MSDOS"} +case "$PTTYPE" in + GPT) # Se incluyen mnemónicos compatibles con tablas MSDOS. + case "$1" in + EMPTY) ID=0 ;; + WINDOWS|NTFS|EXFAT|FAT32|FAT16|FAT12|HNTFS|HFAT32|HFAT16|HFAT12) + ID=0700 ;; + WIN-RESERV) ID=0C01 ;; + CHROMEOS-KRN) ID=7F00 ;; + CHROMEOS) ID=7F01 ;; + CHROMEOS-RESERV) ID=7F02 ;; + LINUX-SWAP) ID=8200 ;; + LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS) + ID=8300 ;; + LINUX-RESERV) ID=8301 ;; + LINUX-LVM) ID=8E00 ;; + FREEBSD-DISK) ID=A500 ;; + FREEBSD-BOOT) ID=A501 ;; + FREEBSD-SWAP) ID=A502 ;; + FREEBSD) ID=A503 ;; + HFS-BOOT) ID=AB00 ;; + HFS|HFS+) ID=AF00 ;; + HFSPLUS) ID=AF00 ;; + HFS-RAID) ID=AF01 ;; + SOLARIS-BOOT) ID=BE00 ;; + SOLARIS) ID=BF00 ;; + SOLARIS-SWAP) ID=BF02 ;; + SOLARIS-DISK) ID=BF03 ;; + CACHE) ID=CA00;; + EFI) ID=EF00 ;; + LINUX-RAID) ID=FD00 ;; + esac + ;; + MSDOS) + case "$1" in + EMPTY) ID=0 ;; + FAT12) ID=1 ;; + EXTENDED) ID=5 ;; + FAT16) ID=6 ;; + WINDOWS|NTFS|EXFAT) + ID=7 ;; + FAT32) ID=b ;; + HFAT12) ID=11 ;; + HFAT16) ID=16 ;; + HNTFS) ID=17 ;; + HFAT32) ID=1b ;; + LINUX-SWAP) ID=82 ;; + LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS) + ID=83 ;; + LINUX-LVM) ID=8e ;; + FREEBSD) ID=a5 ;; + OPENBSD) ID=a6 ;; + HFS|HFS+) ID=af ;; + SOLARIS-BOOT) ID=be ;; + SOLARIS) ID=bf ;; + CACHE) ID=ca ;; + DATA) ID=da ;; + GPT) ID=ee ;; + EFI) ID=ef ;; + VMFS) ID=fb ;; + LINUX-RAID) ID=fd ;; + esac + ;; + LVM) + case "$1" in + LVM-LV) ID=10000 ;; + esac + ;; + ZVOL) + case "$1" in + ZFS-VOL) ID=10010 ;; + esac + ;; +esac +echo $ID +} + + +#/** +# ogUnhidePartition int_ndisk int_npartition +#@brief Hace visible una partición oculta. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION tipo de partición no reconocido. +#@version 1.0 - Versión en pruebas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/01/12 +#@version 1.1.1 - Se incluye tipo Windows Reserver para UEFI (ticket #802) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019/01/18 +#*/ ## +function ogUnhidePartition () +{ +# Variables locales. +local PART TYPE NEWTYPE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +PART=$(ogDiskToDev "$1" "$2") || return $? + +# Obtener tipo de partición. +TYPE=$(ogGetPartitionType "$1" "$2") +case "$TYPE" in + HNTFS) NEWTYPE="NTFS" ;; + HFAT32) NEWTYPE="FAT32" ;; + HFAT16) NEWTYPE="FAT16" ;; + HFAT12) NEWTYPE="FAT12" ;; + WIN-RESERV) NEWTYPE="WINDOWS" ;; + *) ogRaiseError $OG_ERR_PARTITION "$TYPE" + return $? ;; +esac +# Cambiar tipo de partición. +ogSetPartitionType $1 $2 $NEWTYPE +} + + +#/** +# ogUnlockDisk int_ndisk +#@brief Elimina el fichero de bloqueo para un disco. +#@param int_ndisk nº de orden del disco +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-". +#@version 1.1.0 - Primera versión para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-04-08 +#*/ ## +function ogUnlockDisk () +{ +# Variables locales +local DISK LOCKFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +DISK="$(ogDiskToDev $1)" || return $? + +# Borrar archivo de bloqueo exclusivo. +LOCKFILE="/var/lock/lock${DISK//\//-}" +rm -f $LOCKFILE +} + + +#/** +# ogUpdatePartitionTable +#@brief Fuerza al kernel releer la tabla de particiones de los discos duros +#@param no requiere +#@return informacion propia de la herramienta +#@note Requisitos: \c partprobe +#@warning pendiente estructurar la funcion a opengnsys +#@version 0.1 - Integracion para Opengnsys - EAC: UpdatePartitionTable() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 27/10/2008 +#*/ ## +function ogUpdatePartitionTable () +{ +local i +for i in `ogDiskToDev` +do + partprobe $i +done +} diff --git a/ogclient/lib/engine/bin/File.lib b/ogclient/lib/engine/bin/File.lib new file mode 100755 index 0000000..1be1a33 --- /dev/null +++ b/ogclient/lib/engine/bin/File.lib @@ -0,0 +1,422 @@ +#!/bin/bash +#/** +#@file File.lib +#@brief Librería o clase File +#@class File +#@brief Funciones para gestión de archivos y directorios. +#@version 1.0.4 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogCalculateChecksum [ str_repo | int_ndisk int_npart ] path_filepath +#@brief Devuelve la suma de comprobación (checksum) de un fichero. +#@param path_filepath camino del fichero (independiente de mayúsculas) +#@param str_repo repositorio de ficheros +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return hex_checksum Checksum del fichero +#@version 0.9.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-24 +#@version 1.0.4 - Calcula solo el checksum del último MB del fichero. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-03-16 +#*/ ## +function ogCalculateChecksum () +{ +# Variables locales. +local FILE +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf" + return +fi + +# Comprobar que existe el fichero y devolver sus datos. +FILE=$(ogGetPath "$@") +[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" " +} + + +#/** +# ogCompareChecksumFiles [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target +#@brief Metafunción que compara las sumas de comprobación almacenadas de 2 ficheros. +#@return bool_compare Valor de comparación. +#@warning No es necesario especificar la extensión ".sum". +#@version 0.9.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-24 +#*/ ## +function ogCompareChecksumFiles () +{ +# Variables locales. +local ARGS SOURCE TARGET +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ...; fi" + return +fi + +ARGS="$@" +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE=$(ogGetPath "$1") + shift ;; + [1-9]*) # ndisco npartición. + SOURCE=$(ogGetPath "$1" "$2" "$3") + shift 3 ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + SOURCE=$(ogGetPath "$1" "$2") + shift 2 ;; +esac +TARGET=$(ogGetPath "$@") + +# Comparar los ficheros de checksum. +test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)" +} + + +#/** +# ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath +#@brief Devuelve la suma COMPLETA de comprobación (checksum) de un fichero. +#@param path_filepath camino del fichero (independiente de mayúsculas) +#@param str_repo repositorio de ficheros +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return hex_checksum Checksum del fichero +#@version 1.0.5 - Primera versión para OpenGnSys. +#@author Antonio Doblas Viso, EVLT Universidad de Málaga +#@date 2014-07-09 +#*/ ## +function ogCalculateFullChecksum () +{ +# Variables locales. +local FILE +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf" + return +fi + +# Comprobar que existe el fichero y devolver sus datos. +FILE=$(ogGetPath "$@") +[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +#ADV +md5sum "$FILE" -b 2>&1 | cut -f1 -d" " +# tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" " +} + + + + +#/** +# ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target +#@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio. +#@see ogGetPath +#@return Progreso de la copia. +#@warning Deben existir tanto el fichero origen como el directorio destino. +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-20 +#@version 1.0.4 - Copiar usando rsync. +#@author Universidad de Huelva +#@date 2012-07-06 +#*/ ## +function ogCopyFile () +{ +# Variables locales. +local ARGS SOURCE TARGET +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \ + "$FUNCNAME REPO newfile.txt 1 2 /tmp/newfile.txt" + return +fi + +ARGS="$@" +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE="$(ogGetPath "$1")" + shift ;; + [1-9]*) # ndisco npartición. + SOURCE="$(ogGetPath "$1" "$2" "$3")" + shift 3 ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + SOURCE="$(ogGetPath "$1" "$2")" + shift 2 ;; +esac +# Comprobar fichero origen y directorio destino. +[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $? +TARGET="$(ogGetPath "$@")" +[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +# Copiar fichero (para evitar problemas de comunicaciones las copias se hacen con rsync en vez de cp). +rsync --progress --inplace -avh "$SOURCE" "$TARGET" +} + + +#/** +# ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath +#@brief Metafunción que borra un fichero de un dispositivo. +#@see ogGetPath +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-29 +#*/ ## +function ogDeleteFile () +{ +# Variables locales. +local FILE +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_file" \ + "$FUNCNAME 1 2 /tmp/newfile.txt" + return +fi + +# Comprobar que existe el fichero y borrarlo. +FILE="$(ogGetPath "$@")" +[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +rm -f "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +} + + +#/** +# ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath +#@brief Metafunción que borra todo un subárbol de directorios de un dispositivo. +#@see ogGetPath +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-29 +#*/ ## +function ogDeleteTree () +{ +# Variables locales. +local DIR +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \ + "$FUNCNAME 1 2 /tmp/newdir" + return +fi + +# Comprobar que existe el directorio y borrarlo con su contenido. +DIR="$(ogGetPath "$@")" +[ -n "$DIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +rm -fr "$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +} + + +#/** +# ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath +#@brief Inicia el proceso de arranque de un sistema de archivos. +#@param path_filepath camino del fichero (independiente de mayúsculas) +#@param str_repo repositorio de ficheros +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return path_file - camino completo real del fichero. +#@note repo = { REPO, CACHE, CDROM } +#@note Requisitos: \c grep \c sed +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@warning En caso de error, sólo devuelve el código y no da mensajes. +#@todo Terminar de definir parámetros para acceso a repositorios. +#@version 0.1 - Integracion para Opengnsys - HIDRA: CaminoWindows.sh; EAC: GetPath(), FormatSintaxSpacePath(), FormatSintaxBackSlashPath (), en FileSystem.lib +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/10/10 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-15 +#@version 1.1.1 - Correccion comentarios autodocumentacion doxygen . +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-07-05 +#*/ ## + +function ogGetPath () +{ +# Variables locales. +local MNTDIR FILE PREVFILE FILEPATH CURRENTDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS/System32" \ + "$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc/fstab" \ + "$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS/System32" + return +fi + +# Procesar camino según el número de parámetros. +case $# in + 1) FILE="$1" ;; + 2) case "${1^^}" in + REPO) + FILE="$OGIMG/$2" ;; + CACHE) + MNTDIR="$(ogMountCache)" || return $? + FILE="$MNTDIR/$OGIMG/$2" ;; + CDROM) + MNTDIR="$(ogMountCdrom)" || return $? + FILE="$MNTDIR/$2" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; + esac ;; + 3) MNTDIR="$(ogMount $1 $2)" || return $? + FILE="$MNTDIR/$3" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac + +# Eliminar caracteres \c / duplicados y finales. + +FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g; s/\/$//')" +# Comprobar si existe el fichero para reducir tiempos. +if [ -e "$FILE" ]; then + FILEPATH="$FILE" +else + # Buscar el nombre correcto en cada subdirectorio del camino. + FILEPATH="/" + + while [ "$FILE" != "$PREVFILE" ]; do + FILEPATH="$(ls -d "${FILEPATH%/}/${FILE%%/*}" 2>/dev/null || find "$FILEPATH" -maxdepth 1 -iname "${FILE%%/*}" -print 2>/dev/null)" #*/ (Comentario Doxygen) + PREVFILE="$FILE" + FILE="${FILE#*/}" + done + +fi +[ -n "$FILEPATH" ] && echo "$FILEPATH" +return 0 +} + + +#/** +# ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath +#@brief Metafunción que devuelve el camino del directorio padre. +#@see ogGetPath +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-29 +#*/ ## + +function ogGetParentPath () +{ +local PARENT +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS" \ + "$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc" \ + "$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS" + return +fi + +case $# in + 1) PARENT="$(dirname "$1")" ;; + 2) PARENT="$1 $(dirname "/$2")" ;; + 3) PARENT="$1 $2 $(dirname "/$3")" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac +ogGetPath $PARENT +} + + +#/** +# ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target +#@brief Metafunción que indica se un fichero es más nuevo que otro. +#@see ogGetPath +#@return Código de salida: 0 - nuevo, 1 - antiguo o error +#@warning Deben existir tanto el fichero origen como el destino. +#@version 0.9.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-24 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#*/ ## +function ogIsNewerFile () +{ +# Variables locales. +local ARGS SOURCE TARGET +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \ + "if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ... fi" + return +fi + +ARGS="$@" +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE="$(ogGetPath "$1")" + shift ;; + [1-9]*) # ndisco npartición. + SOURCE="$(ogGetPath "$1" "$2" "$3")" + shift 3 ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + SOURCE="$(ogGetPath "$1" "$2")" + shift 2 ;; +esac +# Comprobar que existen los ficheros origen y destino. +[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return 1 +TARGET=$(ogGetPath "$@") +[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return 1 +# Devolver si el primer fichero se ha modificado después que el segundo. +test "$SOURCE" -nt "$TARGET" +} + + +#/** +# ogMakeChecksumFile [ str_repo | int_ndisk int_npart ] path_filepath +#@brief Metafunción que guarda el valor de comprobación de un fichero. +#@see ogCalculateChecksum +#@warning Genera un fichero con extensión ".sum". +#@version 0.9.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-24 +#*/ ## +function ogMakeChecksumFile () +{ +# Variables locales. +local FILE +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME REPO ubuntu.img" + return +fi + +# Comprobar que existe el fichero y guardar su checksum. +FILE="$(ogGetPath "$@")" +[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +ogCalculateChecksum "$FILE" > "$FILE.sum" +} + + +#/** +# ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath +#@brief Metafunción que crea un subdirectorio vacío en un dispositivo. +#@see ogGetParentPath +#@version 0.1 - Integracion para Opengnsys - HIDRA: CrearDirectorio.sh, EAC: MkdirPath() en FileSystem.lib +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/10/10 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Pruebas con OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-29 +#*/ ## +function ogMakeDir () +{ +local PARENT DIR +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \ + "$FUNCNAME 1 2 /tmp/newdir" + return +fi + +PARENT="$(ogGetParentPath "$@")" || return $? +DIR="$(basename "${!#}")" +mkdir -p "$PARENT/$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +} + diff --git a/ogclient/lib/engine/bin/FileSystem.lib b/ogclient/lib/engine/bin/FileSystem.lib new file mode 100755 index 0000000..560250d --- /dev/null +++ b/ogclient/lib/engine/bin/FileSystem.lib @@ -0,0 +1,1205 @@ +#!/bin/bash +#/** +#@file FileSystem.lib +#@brief Librería o clase FileSystem +#@class FileSystem +#@brief Funciones para gestión de sistemas de archivos. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogCheckFs int_ndisk int_nfilesys +#@brief Comprueba el estado de un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición desconocida o no accesible. +#@note Requisitos: *fsck* +#@warning No se comprueban sistemas de archivos montados o bloqueados. +#@todo Definir salidas. +#@version 0.9 - Primera adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-07 +#@version 1.0.2 - Ignorar códigos de salida de comprobación (no erróneos). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-09-23 +#@version 1.0.4 - Soportar HFS/HFS+. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-05-21 +#@version 1.0.5 - Desmontar antes de comprobar, soportar Btrfs y ExFAT. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-09-05 +#@version 1.1.0 - Soportar F2FS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-05-03 +#*/ ## +function ogCheckFs () +{ +# Variables locales. +local PART TYPE PROG PARAMS CODES ERRCODE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener partición. +PART="$(ogDiskToDev $1 $2)" || return $? + +TYPE=$(ogGetFsType $1 $2) +case "$TYPE" in + EXT[234]|CACHE) PROG="e2fsck"; PARAMS="-y"; CODES=(1 2) ;; + BTRFS) PROG="btrfsck"; CODES=(1) ;; + REISERFS) PROG="fsck.reiserfs"; PARAMS="<<<\"Yes\""; CODES=(1 2) ;; + REISER4) PROG="fsck.reiser4"; PARAMS="-ay" ;; + JFS) PROG="fsck.jfs"; CODES=(1 2) ;; + XFS) PROG="xfs_repair" ;; + F2FS) PROG="fsck.f2fs" ;; + NTFS) PROG="ntfsfix" ;; + EXFAT) PROG="fsck.exfat" ;; + FAT32) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;; + FAT16) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;; + FAT12) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;; + HFS) PROG="fsck.hfs"; PARAMS="-f" ;; + HFSPLUS) PROG="fsck.hfs"; PARAMS="-f" ;; + UFS) PROG="fsck.ufs" ;; + ZFS) PROG="fsck.zfs" ;; + *) ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" + return $? ;; +esac +# Error si el sistema de archivos esta montado o bloqueado. +ogUnmount $1 $2 +if ogIsMounted $1 $2; then + ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error + return $? +fi +if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$1 $2" + return $? +fi +# Comprobar en modo uso exclusivo. +ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 +eval $PROG $PARAMS $PART +ERRCODE=$? +case $ERRCODE in + 0|${CODES[*]}) + ERRCODE=0 ;; + 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" + ERRCODE=$OG_ERR_NOTEXEC ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $2" + ERRCODE=$OG_ERR_PARTITION ;; +esac +ogUnlock $1 $2 +return $ERRCODE +} + + +#/** +# ogExtendFs int_ndisk int_nfilesys +#@brief Extiende un sistema de archivos al tamaño de su partición. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición desconocida o no accesible. +#@note Requisitos: *resize* +#@version 0.1 - Integracion para Opengnsys - EAC: EnlargeFileSystem() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera adaptacion para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#@version 1.0.5 - Soporte para BTRFS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-28 +#*/ ## +function ogExtendFs () +{ +# Variables locales. +local PART TYPE PROG PARAMS ERRCODE DOMOUNT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +PART="$(ogDiskToDev $1 $2)" || return $? + +# Redimensionar al tamano máximo según el tipo de partición. +TYPE=$(ogGetFsType $1 $2) +case "$TYPE" in + EXT[234]) PROG="resize2fs"; PARAMS="-f" ;; + BTRFS) PROG="btrfs"; PARAMS="filesystem resize max" + DOMOUNT=1 # Debe estar montado. + ;; + REISERFS|REISER4) + PROG="resize_reiserfs"; PARAMS="-f" ;; + F2FS) ;; # No se reduce (por el momento). + JFS) ;; # No se reduce (por el momento). + NILFS2) ;; # No se reduce (probar "nilfs-resize"). + XFS) ;; # No se reduce (por el momento). + NTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;; + EXFAT) ;; # No se reduce (por el momento). + FAT32|FAT16) ;; # No se reduce (probar "fatresize"). + HFS|HFSPLUS) ;; # No se reduce (por el momento). + UFS) ;; # No se reduce (por el momento). + *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" + return $? ;; +esac +# Salida normal si no se va a aplicar la operación. +[ -z "$PROG" ] && return +# Error si el sistema de archivos no se queda en el estado de montaje adecuado. +if [ "$DOMOUNT" ]; then + PART=$(ogMount $1 $2) || return $? # Indicar nuevo error +else + ogUnmount $1 $2 2>/dev/null + if ogIsMounted $1 $2; then + ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error + return $? + fi +fi +# Error si el sistema de archivos está bloqueado. +if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$1 $2" + return $? +fi +# Redimensionar en modo uso exclusivo. +ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 +eval $PROG $PARAMS $PART &>/dev/null +ERRCODE=$? +case $ERRCODE in + 0) ;; + 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" + ERRCODE=$OG_ERR_NOTEXEC ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $2" + ERRCODE=$OG_ERR_PARTITION ;; +esac +ogUnlock $1 $2 +return $ERRCODE +} + + +#/** +# ogFormat int_ndisk int_nfilesys | CACHE +#@see ogFormatFs ogFormatCache +#*/ ## +function ogFormat () +{ +case "$*" in + CACHE|cache) ogFormatCache ;; + *) ogFormatFs "$@" ;; +esac +} + + +#/** +# ogFormatFs int_ndisk int_nfilesys [type_fstype] [str_label] +#@brief Formatea un sistema de ficheros según el tipo de su partición. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param type_fstype mnemónico de sistema de ficheros a formatear (opcional al reformatear) +#@param str_label etiqueta de volumen (opcional) +#@return (por determinar) +#@exception OG_ERR_FORMAT Formato de ejecución incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición no accesible o desconocida. +#@note Requisitos: mkfs* +#@warning No formatea particiones montadas ni bloqueadas. +#@todo Definir salidas. +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-08 +#@version 1.0.4 - Solucionado error cuando no se detecta tipo de sistema de ficheros pero si se indica. +#@author Universidad de Huelva +#@date 2012-04-11 +#@version 1.0.5 - Comprobar errores al inicio e independizar del tipo de tabla de particiones. +#@author Universidad de Huelva +#@date 2013-05-16 +#@version 1.1.0 - Soportar F2FS y NILFS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-05-03 +#*/ ## +function ogFormatFs () +{ +# Variables locales +local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_label]" \ + "$FUNCNAME 1 1" \ + "$FUNCNAME 1 1 EXT4" \ + "$FUNCNAME 1 1 \"DATA\"" \ + "$FUNCNAME 1 1 EXT4 \"DATA\"" + return +fi +# Error si no se reciben entre 2 y 4 parámetros. +[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener fichero de dispositivo. +PART="$(ogDiskToDev $1 $2)" || return $? +# Error si la partición está montada o bloqueada. +if ogIsMounted $1 $2; then + ogRaiseError $OG_ERR_DONTFORMAT "$MSG_MOUNT: $1 $2" + return $? +fi +if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$1 $2" + return $? +fi +# Si no se indica el tipo de sisitema de archivos, intentar obtenerlo. +TYPE="${3:-$(ogGetFsType $1 $2)}" +# Error, si no especifica el tipo de sistema de archivos a formatear. +[ -n "$TYPE" ] || ogRaiseError $OG_ERR_FORMAT "$1 $2 ..." || return $? + +# Elegir tipo de formato. +case "$TYPE" in + EXT2) PROG="mkfs.ext2"; PARAMS="-F" ;; + EXT3) PROG="mkfs.ext3"; PARAMS="-F" ;; + EXT4) PROG="mkfs.ext4"; PARAMS="-F" ;; + BTRFS) PROG="mkfs.btrfs"; PARAMS="-f" ;; + REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f"; LABELPARAM="-l" ;; + REISER4) PROG="mkfs.reiser4"; PARAMS="-f <<<\"y\"" ;; + XFS) PROG="mkfs.xfs"; PARAMS="-f" ;; + JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;; + F2FS) PROG="mkfs.f2fs"; LABELPARAM="-l" ;; + NILFS2) PROG="mkfs.nilfs2"; PARAMS="-f" ;; + LINUX-SWAP) PROG="mkswap" ;; + NTFS) PROG="mkntfs"; PARAMS="-f" ;; + EXFAT) PROG="mkfs.exfat"; LABELPARAM="-n" ;; + FAT32) PROG="mkdosfs"; PARAMS="-F 32"; LABELPARAM="-n" ;; + FAT16) PROG="mkdosfs"; PARAMS="-F 16"; LABELPARAM="-n" ;; + FAT12) PROG="mkdosfs"; PARAMS="-F 12"; LABELPARAM="-n" ;; + HFS) PROG="mkfs.hfs" ;; + HFSPLUS) PROG="mkfs.hfsplus"; LABELPARAM="-v" ;; + UFS) PROG="mkfs.ufs"; PARAMS="-O 2" ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" + return $? ;; +esac + +# Etiquetas de particion. +if [ -z "$LABEL" ]; then + [ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $? + [ -n "$4" ] && PARAMS="$PARAMS ${LABELPARAM:-"-L"} $4" +else + PARAMS="$PARAMS ${LABELPARAM:-"-L"} $LABEL" +fi + +# Formatear en modo uso exclusivo (desmontar siempre). +ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 +umount $PART 2>/dev/null +eval $PROG $PARAMS $PART 2>/dev/null +ERRCODE=$? +case $ERRCODE in + 0) ;; + 127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;; +esac +ogUnlock $1 $2 +return $ERRCODE +} + + +#/** +# ogGetFsSize int_ndisk int_npartition [str_unit] +#@brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_unit unidad (opcional, por defecto: KB) +#@return float_size - Tamaño del sistema de archivos +#@note str_unit = { KB, MB, GB, TB } +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. +#@version 0.1 - Integracion para Opengnsys - EAC: SizeFileSystem() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 1.0.4 - Adaptación de las salidas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-18 +#*/ ## +function ogGetFsSize () +{ +# Variables locales. +local MNTDIR UNIT VALUE FACTOR SIZE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_unit]" \ + "$FUNCNAME 1 1 => 15624188" \ + "$FUNCNAME 1 1 KB => 15624188" + return +fi +# Error si no se reciben 2 o 3 parámetros. +[ $# == 2 ] || [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener unidad y factor de medida. +UNIT="$3" +UNIT=${UNIT:-"KB"} +case "$UNIT" in + [kK]B) + FACTOR=1 ;; + MB) FACTOR=1024 ;; + GB) FACTOR=$[1024*1024] ;; + TB) FACTOR=$[1024*1024*1024] ;; + *) ogRaiseError $OG_ERR_FORMAT "$3 != { KB, MB, GB, TB }" + return $? ;; +esac + +# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0). +MNTDIR="$(ogMount $1 $2 2>/dev/null)" +if [ -n "$MNTDIR" ]; then + VALUE=$(df -BK "$MNTDIR" | awk '{getline; print $2}') + SIZE=$(echo "$VALUE $FACTOR" | awk '{printf "%f\n", $1/$2}') +else + SIZE=0 +fi +# Devolver el tamaño (quitar decimales si son 0). +echo ${SIZE%.0*} +} + + +#/** +# ogGetFsType int_ndisk int_nfilesys +#@brief Devuelve el mnemonico con el tipo de sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Mnemonico +#@note Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT12, FAT16, FAT32, NTFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, HFS, HFSPLUS, CACHE } +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@version 0.1 - Integracion para Opengnsys - EAC: TypeFS() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera adaptacion para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-21 +#@version 1.0.2 - Obtención de datos reales de sistemas de ficheros. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-12-02 +#@version 1.0.5 - Usar "blkid" para detectar tipo de sistema de archivo. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-06-10 +#@version 1.1.0 - Detectar volumen ZFS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-11-14 +#*/ ## +function ogGetFsType () +{ +# Variables locales. +local PART TYPE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1 => NTFS" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Detectar tipo de sistema de archivo (independientemente del tipo de partición). +PART=$(ogDiskToDev "$1" "$2") || return $? +if [[ "$PART" =~ ^/ ]]; then + TYPE=$(blkid -o export $PART | awk -F= '$1~/^TYPE/ { print toupper($2) }') +else + zfs mount $PART 2>/dev/null + TYPE=$(mount | awk "\$1==\"$PART\" { print toupper(\$5) }") +fi + +# Componer valores correctos. +case "$TYPE" in + EXT4) # Comprobar si es caché o Ext4. + if [ "$1 $2" == "$(ogFindCache)" ]; then + ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE" + fi + ;; + VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1~/^VERSION$/ { print toupper($2) }')" ;; + SWAP) TYPE="LINUX-SWAP" ;; + LVM*) TYPE="LINUX-LVM" ;; + *RAID*) TYPE="LINUX-RAID" ;; + ZFS_MEMBER) TYPE="ZVOL" ;; + *_MEMBER) TYPE="${TYPE/_MEMBER/}" ;; +esac + +[ -n "$TYPE" ] && echo "$TYPE" +} + + +#/** +# ogGetMountPoint int_ndisk int_nfilesys +#@brief Devuelve el punto de montaje de un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Punto de montaje +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note Requisitos: \c mount* \c awk +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-15 +#@version 1.0.6 - Usar comando findmnt. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-09-04 +#*/ ## +function ogGetMountPoint () +{ +# Variables locales +local PART +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1 => /mnt/sda1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener partición. +PART="$(ogDiskToDev $1 $2)" || return $? + +# Devolver punto de montaje. +findmnt -n -o TARGET $PART +} + + +#/** +# ogIsFormated int_ndisk int_nfilesys +#@brief Comprueba si un sistema de archivos está formateado. +#@param int_ndisk nº de orden del disco o volumen. +#@param int_nfilesys nº de orden del sistema de archivos +#@return Código de salida: 0 - formateado, 1 - sin formato o error. +#@version 0.91 - Adaptación inicial para comprobar que existe caché. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-03-18 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#@version 1.0.5 - Dejar de usar "parted". +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-09-04 +#@version 1.1.0 - Comprobar sin montar el sistema de ficheros. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-01-21 +#*/ ## +function ogIsFormated () +{ +# Variables locales +local PART +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "if $FUNCNAME 1 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 2 ] || return 1 +PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1 + +# Revisar tipo de sistema de ficheros. +if [[ "$PART" =~ ^/ ]]; then + # Sistemas de ficheros genéricos. + test -n "$(blkid -s TYPE $PART | egrep -vi "swap|_member")" +else + # ZFS. + test "$(zfs list -Hp -o canmount $PART 2>/dev/null)" = "on" +fi +} + + +#/** +# ogIsLocked int_ndisk int_npartition +#@see ogIsPartitionLocked +#*/ +function ogIsLocked () +{ +ogIsPartitionLocked "$@" +} + +#/** +# ogIsPartitionLocked int_ndisk int_npartition +#@brief Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. +#@note Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-". +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-03 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#@version 1.1.0 - Comprobar si el disco está también bloqueado. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-04-08 +#*/ ## +function ogIsPartitionLocked () +{ +# Variables locales +local DISK PART LOCKDISK LOCKPART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "if $FUNCNAME 1 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 2 ] || return 1 +PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1 +DISK="$(ogDiskToDev $1)" + +# Comprobar existencia de fichero de bloqueo de la partición o de su disco. +LOCKDISK="/var/lock/lock${DISK//\//-}" +LOCKPART="/var/lock/lock${PART//\//-}" +test -f $LOCKDISK -o -f $LOCKPART +} + + +#/** +# ogIsMounted int_ndisk int_nfilesys +#@brief Comprueba si un sistema de archivos está montado. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Código de salida: 0 - montado, 1 - sin montar o error. +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-15 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#*/ ## +function ogIsMounted () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "if $FUNCNAME 1 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 2 ] || return 1 + +test -n "$(ogGetMountPoint $1 $2)" +} + + +#/** +# ogIsReadonly int_ndisk int_nfilesys +#@brief Comprueba si un sistema de archivos está montado solo de lectura. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Código de salida: 0 - montado solo de lectura, 1 - con escritura o no montado. +#@version 1.1.0 - Primera versión para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-01-20 +#*/ ## + +function ogIsReadonly () +{ +# Variables locales +local PART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + "if $FUNCNAME 1 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 2 ] || return 1 +PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1 + +test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^ro$/ {print}')" +} + + +#/** +# ogIsWritable int_ndisk int_nfilesys +#@brief Comprueba si un sistema de archivos está montado de lectura y escritura. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Código de salida: 0 - lectura y escritura, 1 - solo lectura o no montado. +#@version 1.0.5 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-09 +#*/ ## +function ogIsWritable () +{ +# Variables locales +local PART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + "if $FUNCNAME 1 1; then ... ; fi" + return +fi +# Falso, en caso de error. +[ $# == 2 ] || return 1 +PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1 + +test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^rw$/ {print}')" +} + + +#/** +# ogLock int_ndisk int_npartition +#@see ogLockPartition +#*/ +function ogLock () +{ +ogLockPartition "$@" +} + +#/** +# ogLockPartition int_ndisk int_npartition +#@brief Genera un fichero de bloqueo para una partición en uso exlusivo. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-". +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-03 +#*/ ## +function ogLockPartition () +{ +# Variables locales +local PART LOCKFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +PART="$(ogDiskToDev $1 $2)" || return $? + +# Crear archivo de bloqueo exclusivo. +LOCKFILE="/var/lock/lock${PART//\//-}" +touch $LOCKFILE +} + + +#/** +# ogMount int_ndisk int_nfilesys +#@see ogMountFs ogMountCache ogMountCdrom +#*/ ## +function ogMount () +{ +case "$*" in + CACHE|cache) + ogMountCache ;; + CDROM|cdrom) + ogMountCdrom ;; + *) ogMountFs "$@" ;; +esac +} + + +#/** +# ogMountFirstFs int_ndisk +#@brief Monta el primer sistema de archivos disponible en el disco. +#@param int_ndisk nº de orden del disco +#@return Punto de montaje del primer sistema de archivos detectado +#*/ ## +function ogMountFirstFs () +{ +# Variables locales +local PART NPARTS MNTDIR + +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener nº de particiones del disco. +NPARTS=$(ogGetPartitionsNumber "$1") || return $? +for (( PART = 1; PART <= NPARTS; PART++ )); do + MNTDIR=$(ogMount $1 $PART 2>/dev/null) + if [ -n "$MNTDIR" ]; then + echo "$MNTDIR" + return 0 + fi +done +ogRaiseError $OG_ERR_NOTFOUND "$1" +return $OG_ERR_NOTFOUND +} + + +#/** +# ogMountFs int_ndisk int_nfilesys +#@brief Monta un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Punto de montaje +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar. +#@version 0.1 - Integracion para Opengnsys - EAC: MountPartition() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera version para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-28 +#@version 1.0.5 - Independiente del tipo de sistema de ficheros. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-09-04 +#@version 1.1.0 - Montar sistema de archivos ZFS y NTFS hibernado. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-09-19 +#*/ ## +function ogMountFs () +{ +# Variables locales +local PART MNTDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1 => /mnt/sda1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +PART="$(ogDiskToDev "$1" "$2")" || return $? + +# Comprobar si el sistema de archivos ya está montada. +MNTDIR="$(ogGetMountPoint $1 $2)" +# Si no, montarlo en un directorio de sistema. +if [ -z "$MNTDIR" ]; then + # Error si la particion esta bloqueada. + if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION, $1 $2" + return $? + fi + # El camino de un dispositivo normal comienza por el carácter "/". + if [[ "$PART" =~ ^/ ]]; then + # Crear punto de montaje o enlace simbólico para caché local. + MNTDIR=${PART/dev/mnt} + DEBUG="no" + if [ "$(ogFindCache)" == "$1 $2" -a -n "$OGCAC" ]; then + mkdir -p $OGCAC + ln -fs $OGCAC $MNTDIR + else + mkdir -p $MNTDIR + fi + unset DEBUG + # Montar sistema de archivos. + mount $PART $MNTDIR &>/dev/null || \ + mount $PART $MNTDIR -o force,remove_hiberfile &>/dev/null + case $? in + 0) # Correcto. + ;; + 14) # Intentar limpiar hibernación NTFS y montar. + ntfsfix -d $PART &>/dev/null && mount $PART $MNTDIR &>/dev/null || \ + ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $? + ;; + *) # Probar montaje de solo lectura. + mount $PART $MNTDIR -o ro &>/dev/null || \ + ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $? + ;; + esac + # Aviso de montaje de solo lectura. + if ogIsReadonly $1 $2; then + ogEcho warning "$FUNCNAME: $MSG_MOUNTREADONLY: \"$1, $2\"" + fi + else + # Montar sistema de archivos ZFS (un ZPOOL no comienza por "/"). + zfs mount $PART 2>/dev/null + fi +fi +echo "$MNTDIR" +} + + +#/** +# ogMountCdrom +#@brief Monta dispositivo óptico por defecto +#@return Punto de montaje +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar. +#@version +#@author +#@date +#*/ ## +function ogMountCdrom () +{ +local DEV MNTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME" + return +fi +# Error si se reciben parámetros. +[ $# == 0 ] || ogRaiseError $OG_ERR_FORMAT || return $? +DEV="/dev/cdrom" # Por defecto +MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}') +if [ -z "$MNTDIR" ]; then + MNTDIR=${DEV/dev/mnt} + mkdir -p $MNTDIR + mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $? +fi +echo $MNTDIR +} + + +#/** +# ogReduceFs int_ndisk int_nfilesys +#@brief Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return int_tamañoKB - tamaño en KB +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición desconocida o no accesible. +#@warning En Windows, se borran los ficheros de hiberanción y de paginación. +#@warning El sistema de archivos se amplía al mínimo + 10%. +#@note Requisitos: *resize* +#@version 0.1 - Integracion para Opengnsys - EAC: ReduceFileSystem() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera version para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#@version 0.9.2 - Añadir un 10% al tamaño mínimo requerido. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-09-27 +#@version 1.0 - Deteccion automatica del tamaño minimo adecuado +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2011-02-24 +#@version 1.0.6 - Integrar código de antigua función "ogReduceFsCheck". +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-28 +#@version 1.1.1b - Detectar metadispositivos. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2020-02-24 +#*/ ## +function ogReduceFs () +{ +# Variables locales +local PART BLKS SIZE MAXSIZE EXTRASIZE=0 RETVAL + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +PART="$(readlink -f "$(ogDiskToDev $1 $2)")" || return $? + +# Redimensionar según el tipo de particion. +case "$(ogGetFsType $1 $2)" in + EXT[234]) + ogUnmount $1 $2 &>/dev/null + resize2fs -fpM $PART &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? + ;; + + BTRFS) + MNTDIR=$(ogMount $1 $2) + # Calcular tamaño ocupado + 10%, redondeado + 1 (incluyendo letra de unidad). + SIZE=$(btrfs filesystem show $MNTDIR | awk -v P=$PART '{ d=""; "readlink -f "$8" 2>/dev/null"|getline d; if(d==P) printf("%d%s", $6*1.1+1, substr($6,match($6,/[A-Z]/),1)) }') + btrfs filesystem resize ${SIZE} $MNTDIR &>/dev/null + ;; + REISERFS|REISER4) + # Calcular tamaño ocupado + 10%. + MNTDIR=$(ogMount $1 $2) + SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ] + ogUnmount $1 $2 2>/dev/null + resize_reiserfs -s${SIZE}K $PART <<<"y" + ;; + + F2FS) ;; # No se reduce (por el momento). + JFS) ;; # No se reduce (por el momento). + NILFS2) ;; # No se reduce (probar "nilfs-resize"). + XFS) ;; # No se reduce (por el momento). + + NTFS) + # Calcular tamaño ocupado + 10%. + ogUnmount $1 $2 &>/dev/null + read -e MAXSIZE SIZE <<<$(ntfsresize -fi $PART | \ + awk '/device size/ {d=$4} + /resize at/ {r=int($5*1.1/1024+1)*1024} + END { print d,r}') + # Error si no puede obtenerse el tamaño máximo del volumen. + [ -n "$MAXSIZE" -a -n "$SIZE" ] || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? + # Simular la redimensión y comprobar si es necesario ampliarala. + RETVAL=1 + while [ $RETVAL != 0 -a $[ SIZE+=EXTRASIZE ] -lt $MAXSIZE ]; do + # Obtener espacio de relocalización y devolver código de salida + # (ntfsresize devuelve 0 si no necesita relocalizar). + EXTRASIZE=$(ntfsresize -fns $SIZE $PART 2>/dev/null | \ + awk '/Needed relocations/ {print int($4*1.1/1024+1)*1024}' + exit ${PIPESTATUS[0]}) + RETVAL=$? + done + # Redimensionar solo si hace falta. + if [ $SIZE -lt $MAXSIZE ]; then + ntfsresize -fs $SIZE $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? + fi + ;; + + EXFAT) ;; # No se reduce (por el momento). + FAT32|FAT16) # Se deja comentado por no haber un método seguro para extender el SF. + # Calcular tamaño ocupado + 10%. + #ogUnmount $1 $2 &>/dev/null + #SIZE=$(fatresize --info $PART | awk -F: '/Min size/ {printf("%d", $2*1.1)}') + #[ "$SIZE" ] && fatresize --size $SIZE $PART &>/dev/null + ;; + HFS|HFSPLUS) ;; # No se reduce (por el momento). + UFS) ;; # No se reduce (por el momento). + + *) ogRaiseError $OG_ERR_PARTITION "$1,$2" + return $? ;; +esac + +# Devuelve tamaño del sistema de ficheros. +ogGetFsSize $1 $2 +} + + +#/** +# ogUnlock int_ndisk int_npartition +#@see ogUnlockPartition +#*/ ## +function ogUnlock () +{ +ogUnlockPartition "$@" +} + +#/** +# ogUnlockPartition int_ndisk int_npartition +#@brief Elimina el fichero de bloqueo para una particion. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-". +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-03 +#*/ ## +function ogUnlockPartition () +{ +# Variables locales +local PART LOCKFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición. +PART="$(ogDiskToDev $1 $2)" || return $? + +# Borrar archivo de bloqueo exclusivo. +LOCKFILE="/var/lock/lock${PART//\//-}" +rm -f $LOCKFILE +} + + +#/** +# ogUnmount int_ndisk int_npartition +#@see ogUnmountFs +#*/ ## +function ogUnmount () +{ +ogUnmountFs "$@" +} + +#/** +# ogUnmountFs int_ndisk int_nfilesys +#@brief Desmonta un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@return Nada +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@warning La partición no está previamente montada o no se puede desmontar. +#@version 0.1 - Integracion para Opengnsys - EAC: UmountPartition() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 0.9 - Primera version para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-28 +#*/ ## +function ogUnmountFs () +{ +# Variables locales +local PART MNTDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición y punto de montaje. +PART="$(ogDiskToDev $1 $2)" || return $? +MNTDIR="$(ogGetMountPoint $1 $2)" + +# Si está montada, desmontarla. +if [ -n "$MNTDIR" ]; then + # Error si la particion está bloqueada. + if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2" + return $? + fi + # Desmontar y borrar punto de montaje. + umount $PART 2>/dev/null || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1, $2\"" + rmdir $MNTDIR 2>/dev/null || rm -f $MNTDIR 2>/dev/null +else + ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\"" +fi +} + + +#/** +# ogUnmountAll int_ndisk +#@brief Desmonta todos los sistema de archivos de un disco, excepto el caché local. +#@param int_ndisk nº de orden del disco +#@return Nada +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@warning No se desmonta la partición marcada como caché local. +#@version 0.9 - Versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-07 +#*/ ## +function ogUnmountAll () +{ +# Variables locales +local DISK PART +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición y punto de montaje. +DISK="$(ogDiskToDev $1)" || return $? +for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do + case "$(ogGetFsType $1 $PART)" in + CACHE) ;; + *) ogUnmount $1 $PART 2>/dev/null ;; + esac +done +} + +#/** +# ogUnsetDirtyBit int_ndisk int_npart +#@brief Inhabilita el Dirty Bit del sistema de ficheros NTFS para evitar un CHKDSK en el primer arranque +#@param int_ndisk nº de orden del disco +#@param int_npart nº de orden de partición +#@return Nada +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.1.0 - Versión para OpenGnsys. +#@author Carmelo Cabezuelo, ASIC Universidad Politécnica de Valencia +#@date 2016-04-20 +#*/ ## +function ogUnsetDirtyBit () +{ +# Variables locales +local PART +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener partición y punto de montaje. +case "$(ogGetFsType $1 $2)" in + NTFS) + ogUnmount $1 $2 2>/dev/null + PART="$(ogDiskToDev $1 $2)" || return $? + ntfsfix -d $PART ;; + *) ;; +esac +} + + +#/** +# ogGetFreeSize int_disco int_partition str_SizeOutput +#@brief muestra informacion del tamaño total, datos y libre. +#@param int_ndisk nº de orden del disco +#@param int_npart nº de orden de partición +#@param str_unitSize unidad mostrada +#@return int_size:int_data:int_free +#@TODO Componer corretcamente esta función. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version +#@author +#@date +#*/ ## + +function ogGetFreeSize () +{ +local particion unit factor valor +if [ $# = 0 ] +then + echo "sintaxis: ogGetFreeSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red + echo "devuelve int_size : int_data : int_free" red +return +fi +if [ $# -ge 2 ] +then + particion=`ogMount $1 $2 ` #1>/dev/null 2>&1 + if [ -z $3 ] + then + unit=kB # s B kB MB GB TB % + else + unit=$3 + fi + case $unit in + kB) + factor="1.024"; + #valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d:%d:%d", size,used,free}'` + valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", free}'` + ;; + MB) + factor="1.024/1000"; + valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000; used=$3*1.024/1000; free=$4*1.024/1000; printf "%d:%d:%d", size,used,free}'` + ;; + GB) + factor="1.024/1000000"; + valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000000; used=$3*1.024/1000000; free=$4*1.024/1000000; printf "%f:%f:%f", size,used,free}'` + ;; + esac + #echo $valor + #NumberRound $valor + #valor=`NumberRound $valor`; + echo $valor +fi +} + diff --git a/ogclient/lib/engine/bin/Image.lib b/ogclient/lib/engine/bin/Image.lib new file mode 100755 index 0000000..cf9eb83 --- /dev/null +++ b/ogclient/lib/engine/bin/Image.lib @@ -0,0 +1,1209 @@ +#!/bin/bash +#/** +#@file Image.lib +#@brief Librería o clase Image +#@class Image +#@brief Funciones para creación, restauración y clonación de imágenes de sistemas. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogCreateImageSyntax path_device path_filename [str_tool] [str_compressionlevel] +#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen +#@param path_device dispositivo Linux del sistema de archivos +#@param path_fileneme path absoluto del fichero imagen +#@param [opcional] str_tool herrmaienta de clonacion [partimage, partclone, ntfsclone] +#@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] +#@return str_command - cadena con el comando que se debe ejecutar. +#@warning Salida nula si se producen errores. +#@TODO introducir las herramientas fsarchiver, dd +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#@version 1.0.5 - Incrustar códico de antigua función ogPartcloneSyntax +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012/09/14 +#*/ ## +function ogCreateImageSyntax() +{ +local FS TOOL LEVEL DEV IMGFILE BUFFER PARAM1 PARAM2 PARAM3 + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_device path_imagefile [str_tool] [str_compressionlevel]" \ + "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop" \ + "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img" + return +fi +# Error si no se reciben entre 2 y 4 parámetros. +[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? + +# Asignación de parámetros. +DEV="$1" +IMGFILE="$2" +case "$#" in + 2) # Sintaxis por defecto OG DEV IMGFILE + TOOL="partclone" + LEVEL="gzip" + ;; + 4) # Sintaxis condicionada. + TOOL="${3,,}" + LEVEL="${4,,}" + ;; +esac + +case "$TOOL" in + ntfsclone) + PARAM1="ntfsclone --force --save-image -O - $DEV" + ;; + partimage|default) + PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $DEV stdout" + ;; + partclone) + FS="$(ogGetFsType $(ogDevToDisk $DEV 2>/dev/null) 2>/dev/null)" + case "$FS" in + EXT[234]) PARAM1="partclone.extfs" ;; + BTRFS) PARAM1="partclone.btrfs" ;; + REISERFS) PARAM1="partclone.reiserfs" ;; + REISER4) PARAM1="partclone.reiser4" ;; + JFS) PARAM1="partclone.jfs" ;; + XFS) PARAM1="partclone.xfs" ;; + F2FS) PARAM1="partclone.f2fs" ;; + NILFS2) PARAM1="partclone.nilfs2" ;; + NTFS) PARAM1="partclone.ntfs" ;; + EXFAT) PARAM1="partclone.exfat" ;; + FAT16|FAT32) PARAM1="partclone.fat" ;; + HFS|HFSPLUS) PARAM1="partclone.hfsp" ;; + UFS) PARAM1="partclone.ufs" ;; + VMFS) PARAM1="partclone.vmfs" ;; + *) PARAM1="partclone.imager" ;; + esac + # Por compatibilidad, si no existe el ejecutable usar por defecto "parclone.dd". + which $PARAM1 &>/dev/null || PARAM1="partclone.dd" + PARAM1="$PARAM1 -d0 -F -c -s $DEV" + # Algunas versiones de partclone.dd no tienen opción "-c". + [ -z "$(eval ${PARAM1%% *} --help 2>&1 | grep -- -c)" ] && PARAM1="${PARAM1/ -c / }" + ;; +esac +# Comprobar que existe mbuffer. +which mbuffer &>/dev/null && PARAM2="| mbuffer -q -m 40M " || PARAM2=" " + +# Nivel de compresion. +case "$LEVEL" in + 0|none) PARAM3=" > " ;; + 1|lzop) PARAM3=" | lzop > " ;; + 2|gzip) PARAM3=" | gzip -c > " ;; + 3|bzip) PARAM3=" | bzip -c > " ;; +esac + +# Sintaxis final. +[ -n "$PARAM1" ] && echo "$PARAM1 $PARAM2 $PARAM3 $IMGFILE" +} + + +#/** +# ogRestoreImageSyntax path_filename path_device [str_tools] [str_compressionlevel] +#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen +#@param path_device dispositivo Linux del sistema de archivos +#@param path_fileneme path absoluto del fichero imagen +#@param [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] +#@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] +#@return cadena con el comando que se debe ejecutar. +#@exception OG_ERR_FORMAT formato incorrecto. +#@warning En pruebas iniciales +#@TODO introducir las herramientas fsarchiver, dd +#@TODO introducir el nivel de compresion gzip +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## +function ogRestoreImageSyntax () +{ +local TOOL COMPRESSOR LEVEL PART IMGFILE FILEHEAD INFOIMG + + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME filename partition [tool] [levelcompresor]" \ + "$FUNCNAME /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]" + return +fi + +# Error si no se reciben entre 2 y 4 parámetros. +[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? + +# controlamos que el parametro 1 (imagen) es tipo file. +[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + +# Si 2 parametros (file-origen-, device-destino-) = ogGetImageFull($1) +if [ "$#" -eq 2 ]; then + IMGFILE=$1 + PART=$2 + INFOIMG=$(ogGetImageInfo $IMGFILE) || ogRaiseError $OG_ERR_NOTFOUND "No Image $1" || return $? + TOOL=`echo $INFOIMG | cut -f1 -d:` + COMPRESSOR=`echo $INFOIMG | cut -f2 -d:` + ogRestoreImageSyntax $IMGFILE $PART $TOOL $COMPRESSOR +fi + + +# Si cuatro parametros genera sintaxis +if [ "$#" -eq 4 ]; then + IMGFILE=$1 + PART=$2 + # comprobamos parametro herramienta compresion. + TOOL=$(echo $3 | tr [A-Z] [a-z]) + #ogCheckProgram $TOOL + #comprobar parámetro compresor. + LEVEL=$(echo $4 | tr [A-Z] [a-z]) + #ogCheckProgram $LEVEL + + case "$LEVEL" in + "0"|"none") + COMPRESSOR=" " + ;; + "1"|"lzop" | "LZOP") + COMPRESSOR=" lzop -dc " + ;; + "2"|"gzip" | "GZIP") + COMPRESSOR=" gzip -dc " + ;; + "3"|"bzip" | "BZIP" ) + COMPRESSOR=" bzip -dc " + ;; + *) + ogRaiseError $OG_ERR_NOTFOUND "Compressor no valid $TOOL" || return $? + ;; + esac + #comprobar mbuffer + which mbuffer > /dev/null && MBUFFER="| mbuffer -q -m 40M " || MBUFFER=" " + + case "${TOOL,,}" in + ntfsclone) + TOOL="| ntfsclone --restore-image --overwrite $PART -" + ;; + partimage) + TOOL="| partimage -f3 -B gui=no restore $PART stdin" + ;; + partclone*) + # -C para que no compruebe tamaños + TOOL="| partclone.restore -d0 -C -I -o $PART" + ;; + dd) + TOOL="| pv | dd conv=sync,noerror bs=1M of=$PART" + ;; + *) + ogRaiseError $OG_ERR_NOTFOUND "Tools imaging no valid $TOOL" || return $? + ;; + esac + + echo "$COMPRESSOR $IMGFILE $MBUFFER $TOOL" +fi + +} + + + + +#/** +# ogCreateDiskImage int_ndisk str_repo path_image [str_tools] [str_compressionlevel] +#@brief Crea una imagen (copia de seguridad) de un disco completo. +#@param int_ndisk nº de orden del disco +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@return (nada, por determinar) +#@note repo = { REPO, CACHE } +#@note Esta primera versión crea imágenes con dd comprimidas con gzip. +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_LOCKED particion bloqueada por otra operación. +#@exception OG_ERR_IMAGE error al crear la imagen del sistema. +#@warning En pruebas iniciales +#@todo Gestión de bloqueos de disco +#@todo Comprobar si debe desmontarse la caché local +#@todo Comprobar que no se crea la imagen en el propio disco +#@version 1.1.0 - Primera versión para OpenGnsys con herramientas prefijadas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2016/04/08 +#*/ ## +function ogCreateDiskImage () +{ +# Variables locales +local DISK PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ + "$FUNCNAME 1 REPO /disk1" + return +fi +# Error si no se reciben entre 3 y 5 parámetros. +[ $# -ge 3 -a $# -le 5 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? + +# Comprobar que no está bloqueada ni la partición, ni la imagen. +DISK="$(ogDiskToDev $1)" || return $? +if ogIsDiskLocked $1; then + ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1" + return $? +fi +IMGTYPE="dsk" # Extensión genérica de imágenes de disco. +IMGDIR=$(ogGetParentPath "$2" "$3") +[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? +IMGFILE="$IMGDIR/$(basename "$3").$IMGTYPE" +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4" + return $? +fi + +# No guardar imagen en el propio disco (disco no incluido en el camino del repositorio). +if [[ $(ogGetPath "$2" /) =~ ^$DISK ]]; then + ogRaiseError $OG_ERR_IMAGE "$2 = $DISK" + return $? +fi + +# Generar la instruccion a ejecutar antes de aplicar los bloqueos. +PROGRAM=$(ogCreateImageSyntax $DISK $IMGFILE) +# Desmontar todos los sistemas de archivos del disco, bloquear disco e imagen. +ogUnmountAll $1 2>/dev/null +ogLockDisk $1 || return $? +ogLockImage "$2" "$3.$IMGTYPE" || return $? + +# Crear Imagen. +trap "ogUnlockDisk $1; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 +eval $PROGRAM + +# Controlar salida de error, crear fichero de información y desbloquear partición. +ERRCODE=$? +if [ $ERRCODE == 0 ]; then + echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info +else + ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE" + rm -f "$IMGFILE" +fi +# Desbloquear disco e imagen. +ogUnlockDisk $1 +ogUnlockImage "$2" "$3.$IMGTYPE" +return $ERRCODE +} + + +#/** +# ogCreateImage int_ndisk int_npartition str_repo path_image [str_tools] [str_compressionlevel] +#@brief Crea una imagen a partir de una partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@param [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] +#@param [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] +#@return (nada, por determinar) +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_PARTITION partición no accesible o no soportada. +#@exception OG_ERR_LOCKED particion bloqueada por otra operación. +#@exception OG_ERR_IMAGE error al crear la imagen del sistema. +#@todo Comprobaciones, control de errores, definir parámetros, etc. +#@version 0.1 - Integracion para Opengnsys - HIDRA:CrearImagen{EXT3, NTFS}.sh; EAC: CreateImageFromPartition () en Deploy.lib +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/05/13 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Versión en pruebas para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/10/07 +#@version 1.0 - Llama a función ogCreateImageSyntax para generar la llamada al comando. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## +function ogCreateImage () +{ +# Variables locales +local PART PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart str_repo path_image" \ + "$FUNCNAME 1 1 REPO /aula1/win7" + return +fi +# Error si no se reciben entre 4 y 6 parámetros. +[ $# -ge 4 -a $# -le 6 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $? + +# Comprobar que no está bloqueada ni la partición, ni la imagen. +PART="$(ogDiskToDev $1 $2)" || return $? +if ogIsLocked $1 $2; then + ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1, $2" + return $? +fi + +IMGTYPE="img" # Extensión genérica de imágenes. +IMGDIR=$(ogGetParentPath "$3" "$4") +[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? + +IMGFILE="$IMGDIR/$(basename "$4").$IMGTYPE" +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4" + return $? +fi +# Generar la instruccion a ejecutar antes de aplicar los bloqueos. +PROGRAM=$(ogCreateImageSyntax $PART $IMGFILE $5 $6) +# Desmontar partición, bloquear partición e imagen. +ogUnmount $1 $2 2>/dev/null +ogLock $1 $2 || return $? +ogLockImage "$3" "$4.$IMGTYPE" || return $? + +# Crear Imagen. +trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 +eval $PROGRAM + +# Controlar salida de error, crear fichero de información y desbloquear partición. +ERRCODE=$? +if [ $ERRCODE == 0 ]; then + echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info +else + ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE" + rm -f "$IMGFILE" +fi +# Desbloquear partición e imagen. +ogUnlock $1 $2 +ogUnlockImage "$3" "$4.$IMGTYPE" +return $ERRCODE +} + + +#/** +# ogCreateMbrImage int_ndisk str_repo path_image +#@brief Crea una imagen a partir del sector de arranque de un disco. +#@param int_ndisk nº de orden del disco +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@return (nada, por determinar) +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_IMAGE error al crear la imagen del sistema. +#@version 0.9 - Versión en pruebas para OpenGNSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/01/12 +#@version 1.0 - Adaptación a OpenGnSys 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011/03/10 +#*/ ## +function ogCreateMbrImage () +{ +# Variables locales +local DISK IMGDIR IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ + "$FUNCNAME 1 REPO /aula1/mbr" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +DISK=$(ogDiskToDev "$1") || return $? +IMGDIR=$(ogGetParentPath "$2" "$3") +[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? +IMGFILE="$IMGDIR/$(basename "$3").mbr" + +# Crear imagen del MBR. +dd if="$DISK" of="$IMGFILE" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + + +#/** +# ogCreateBootLoaderImage int_ndisk str_repo path_image +#@brief Crea una imagen del boot loader a partir del sector de arranque de un disco. +#@param int_ndisk nº de orden del disco +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@return (nada, por determinar) +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_IMAGE error al crear la imagen del sistema. +#@version 1.0 - Adaptacion de ogCreateMbrImage para guardar solo el Boot Loader +#@author Juan Carlos Xifre, SICUZ Universidad de Zaragoza +#@date 2011/03/21 +#*/ ## +function ogCreateBootLoaderImage () +{ +# Variables locales +local DISK IMGDIR IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \ + "$FUNCNAME 1 REPO /aula1/mbr" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +DISK=$(ogDiskToDev "$1") || return $? +IMGDIR=$(ogGetParentPath "$2" "$3") +[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? +IMGFILE="$IMGDIR/$(basename "$3").mbr" + +# Crear imagen del Boot Loader dentro del MBR. +dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + +#/** +# ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff] +#@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido. +#@param int_disk numero de disco +#@param int_part numero de particion +#@param str_repo repositorio de imágenes { REPO, CACHE } +#@param str_imageName Nombre de la imagen +#@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional) +#@return SIZEDATA SIZEREQUIRED SIZEFREE ISENOUGHSPACE +#@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage. +#@note para el tamaño de la imagen no sigue enlaces simbólicos. +#@exception OG_ERR_FORMAT formato incorrecto. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2014/10/24 +#@version 1.1.0 - En la salida se incluye el espacio disponible en el repositorio (ticket #771) +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2017-03-28 +#@version 1.1.0 - Si la imagen ya existe en el REPO se suma su tamaño al espacio libre +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2017-11-08 +#*/ ## +function ogGetSizeParameters () +{ +local REPO MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP FACTORSYNC SIZEFREE +local IMGTYPE IMGDIR IMGFILE IMGEXT IMGSIZE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo path_imgname [monolit|sync|diff]" \ + "if $FUNCNAME 1 2 REPO Windows10 sync ; then ...; fi" \ + "if $FUNCNAME 1 6 Ubuntu16 CACHE ; then ...; fi" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 4 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE imgname [monolit|sync|diff]" ; echo $?) + +# Recogemos parametros +REPO=${3^^} +IMGTYPE="_${5^^}_" + +MNTDIR=$(ogMount $1 $2) +if [ "$MNTDIR" == "" ]; then + ogRaiseError $OG_ERR_PARTITION "$1 $2" + return $? +fi + +# Datos contenidos en la particion o en la lista de archivos de contiene la diferencial. +if [ "$IMGTYPE" == "_DIFF_" ]; then + [ -r /tmp/ogimg.info ] || return $(ogRaiseError session $OG_ERR_NOTFOUND "/tmp/ogimg.info"; echo $?) + cd $MNTDIR + SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1) + cd / +else + SIZEDATA=$(df -k | grep $MNTDIR\$ | awk '{print $3}') +fi + +#Aplicar factor de compresion +if [ "$IMGTYPE" == "_SYNC_" -o "$IMGTYPE" == "_DIFF_" ]; then + + # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision + KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') + [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} + FACTORSYNC=${FACTORSYNC:-"130"} + # Si IMGFS="BTRFS" la compresion es mayor. + [ $IMGFS == "BTRFS" ] && let FACTORSYNC=$FACTORSYNC-20 + + let SIZEREQUIRED=$SIZEDATA*$FACTORSYNC/100 + # El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300 + [ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 + +else + FACTORGZIP=55/100 + FACTORLZOP=65/100 + let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP +fi + +#Comprobar espacio libre en el contenedor. +[ "$REPO" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) +[ "$REPO" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') + +# Comprobamos si existe una imagen con el mismo nombre en $REPO +# En sincronizadas restamos tamaño de la imagen y en monoloticas de la .ant +case "${IMGTYPE}" in + _DIFF_) IMGEXT="img.diff" + ;; + _SYNC_) IMGEXT="img" + ;; + *) IMGEXT="img.ant" + ;; +esac + +IMGDIR=$(ogGetParentPath "$REPO" "/$4") +IMGFILE=$(ogGetPath "$IMGDIR/$(basename "/$4").$IMGEXT") +if [ -z "$IMGFILE" ]; then + IMGSIZE=0 +else + IMGSIZE=$(ls -s "$IMGFILE" | cut -f1 -d" ") +fi + +let SIZEFREE=$SIZEFREE+$IMGSIZE + +[ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE + +echo $SIZEDATA $SIZEREQUIRED $SIZEFREE $ISENOUGHSPACE + +} + +#/** +# ogIsImageLocked [str_repo] path_image +#@brief Comprueba si una imagen está bloqueada para uso exclusivo. +#@param str_repo repositorio de imágenes (opcional) +#@param path_image camino de la imagen (sin extensión) +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@version 1.0 - Adaptación a OpenGnSys 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011/03/10 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#*/ ## +function ogIsImageLocked () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "if $FUNCNAME /opt/opengnsys/images/aula1/win7.img; then ...; fi" \ + "if $FUNCNAME REPO /aula1/win7.img; then ...; fi" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && return 1 + +# Comprobar si existe el fichero de bloqueo. +test -n "$(ogGetPath $@.lock)" +} + + +#/** +# ogLockImage [str_repo] path_image +#@brief Bloquea una imagen para uso exclusivo. +#@param str_repo repositorio de imágenes (opcional) +#@param path_image camino de la imagen (sin extensión) +#@return Nada. +#@note Se genera un fichero con extensión .lock +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@version 1.0 - Adaptación a OpenGnSys 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011/03/10 +#*/ ## +function ogLockImage () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \ + "$FUNCNAME REPO /aula1/win7.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# == 1 -o $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Comprobar que existe directorio de imagen +IMGDIR=$(ogGetParentPath $@) || return $? +# Crear fichero de bloqueo. +touch $IMGDIR/$(basename "${!#}").lock 2>/dev/null || ogRaiseError $OG_ERR_NOTWRITE "$*" || return $? +} + + +#/** +# ogRestoreDiskImage str_repo path_image int_npartition +#@brief Restaura (recupera) una imagen de un disco completo. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@return (por determinar) +#@warning Primera versión en pruebas +#@todo Gestionar bloqueos de disco +#@todo Comprobar que no se intenta restaurar de la caché sobre el mismo disco +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. +#@exception OG_ERR_LOCKED partición bloqueada por otra operación. +#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@exception OG_ERR_IMGSIZEPARTITION Tamaño de la particion es menor al tamaño de la imagen. +#@version 1.1.0 - Primera versión para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2016/04/08 +#*/ ## +function ogRestoreDiskImage () +{ +# Variables locales +local DISK DISKSIZE IMGFILE IMGTYPE IMGSIZE PROGRAM ERRCODE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ + "$FUNCNAME REPO /aula1/win7 1" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Procesar parámetros. +DISK="$(ogDiskToDev $3)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) +IMGTYPE="dsk" +IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") +[ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) + +# comprobamos consistencia de la imagen +ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) + +#/* (Comienzo comentario Doxygen) +# Error si la imagen no cabe en la particion. +#IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) +#DISKSIZE=$(ogGetDiskSize $3) +#if [ $IMGSIZE -gt $DISKSIZE ]; then +# ogRaiseError $OG_ERR_IMGSIZEPARTITION "$DISKSIZE < $IMGSIZE" +# return $? +#fi +#*/ (Fin comentario Doxygen) + +# Comprobar el bloqueo de la imagen y de la partición. +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" + return $? +fi +if ogIsDiskLocked $3; then + ogRaiseError $OG_ERR_LOCKED "$MSG_DISK $3" + return $? +fi +# Solicitamos la generación de la instruccion a ejecutar +PROGRAM=$(ogRestoreImageSyntax $IMGFILE $DISK) + +# Bloquear el disco +ogLockDisk $3 || return $? +trap "ogUnlockDisk $3" 1 2 3 6 9 + +# Ejecutar restauración según el tipo de imagen. +eval $PROGRAM + +ERRCODE=$? +if [ $ERRCODE != 0 ]; then + ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" +fi +ogUnlockDisk $3 $4 +return $ERRCODE +} + + +#/** +# ogRestoreImage str_repo path_image int_ndisk int_npartition +#@brief Restaura una imagen de sistema de archivos en una partición. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (por determinar) +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception OG_ERR_PARTITION 3 # Error en partición de disco. +#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. +#@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema. +#@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen. +#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc. +#@version 0.1 - Integracion para Opengnsys - HIDRA:RestaurarImagen{EXT3, NTFS}.sh; EAC: RestorePartitionFromImage() en Deploy.lib +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/05/13 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version muy en pruebas para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/09/10 +#@version 1.0 - generacion sintaxis de restauracion +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/02/01 +#@version 1.0.1 - Control errores, tamaño particion, fichero-imagen +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/05/11 +#*/ ## +function ogRestoreImage () +{ +# Variables locales +local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE PROGRAM ERRCODE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk int_npart" \ + "$FUNCNAME REPO /aula1/win7 1 1" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Procesar parámetros. +PART="$(ogDiskToDev $3 $4)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) +#IMGTYPE=$(ogGetImageType "$1" "$2") +IMGTYPE=img +IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") +[ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) +# comprobamos consistencia de la imagen +ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) + +# Error si la imagen no cabe en la particion. +IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) +#TODO: +#Si la particion no esta formateado o tiene problemas formateamos +ogMount $3 $4 || ogFormat $3 $4 +PARTSIZE=$(ogGetPartitionSize $3 $4) +if [ $IMGSIZE -gt $PARTSIZE ]; then + ogRaiseError $OG_ERR_IMGSIZEPARTITION " $PARTSIZE < $IMGSIZE" + return $? +fi +# Comprobar el bloqueo de la imagen y de la partición. +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" + return $? +fi +if ogIsLocked $3 $4; then + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4" + return $? +fi + +# Solicitamos la generación de la instruccion a ejecutar +# Atención: no se comprueba el tipo de sistema de archivos. +# Atención: no se comprueba incongruencia entre partición e imagen. +PROGRAM=`ogRestoreImageSyntax $IMGFILE $PART` + +# Desmontar y bloquear partición. +ogUnmount $3 $4 2>/dev/null || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?) +ogLock $3 $4 || return $? +trap "ogUnlock $3 $4" 1 2 3 6 9 + +# Ejecutar restauración según el tipo de imagen. +eval $PROGRAM + +ERRCODE=$? +if [ $ERRCODE != 0 ]; then + ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" +fi +ogUnlock $3 $4 +return $ERRCODE +} + + +#/** +# ogRestoreMbrImage str_repo path_image int_ndisk +#@brief Restaura la imagen del sector de arranque de un disco. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@return (por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. +#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@version 0.9 - Primera versión en pruebas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010/01/12 +#@version 1.0 - Adaptación a OpenGnSys 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011/03/10 +#*/ ## +function ogRestoreMbrImage () +{ +# Variables locales +local DISK IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ + "$FUNCNAME REPO /aula1/mbr 1" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Procesar parámetros. +DISK=$(ogDiskToDev "$3") || return $? +IMGFILE=$(ogGetPath "$1" "$2.mbr") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? + +# Restaurar imagen del MBR. +dd if="$IMGFILE" of="$DISK" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + + +#/** +# ogRestoreBootLoaderImage str_repo path_image int_ndisk +#@brief Restaura la imagen del boot loader del sector de arranque de un disco. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@return (por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. +#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@version 1.0 - Adaptacion de ogRestoreMbrImage para restaurar solo el Boot Loader +#@author Juan Carlos Xifre, SICUZ Universidad de Zaragoza +#@date 2011/03/21 +#*/ ## +function ogRestoreBootLoaderImage () +{ +# Variables locales +local DISK IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \ + "$FUNCNAME REPO /aula1/mbr 1" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Procesar parámetros. +DISK=$(ogDiskToDev "$3") || return $? +IMGFILE=$(ogGetPath "$1" "$2.mbr") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? + +# Restaurar imagen del MBR. +dd if="$IMGFILE" of="$DISK" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + +#/** +# ogUnlockImage [str_repo] path_image +#@brief Desbloquea una imagen con uso exclusivo. +#@param str_repo repositorio de imágenes (opcional) +#@param path_image camino de la imagen (sin extensión) +#@return Nada. +#@note repo = { REPO, CACHE } +#@note Se elimina el fichero de bloqueo con extensión .lock +#@exception OG_ERR_FORMAT formato incorrecto. +#@version 1.0 - Adaptación a OpenGnSys 1.0 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011/03/10 +#*/ ## +function ogUnlockImage () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \ + "$FUNCNAME REPO /aula1/win7.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# == 1 -o $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Borrar fichero de bloqueo para la imagen. +rm -f $(ogGetPath $@.lock) +} + + +#/** +# ogGetImageInfo filename +#@brief muestra información sobre la imagen monolitica. +#@param 1 filename path absoluto del fichero imagen +#@return cadena compuesta por clonacion:compresor:sistemaarchivos:tamañoKB +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@exception OG_ERR_IMAGE "Image format is not valid $IMGFILE" +#@warning En pruebas iniciales +#@TODO Definir sintaxis de salida (herramienta y compresor en minuscula) +#@TODO Arreglar loop para ntfsclone +#@TODO insertar parametros entrada tipo OG +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## + +function ogGetImageInfo () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_filename" \ + "$FUNCNAME /opt/opengnsys/images/prueba.img ==> PARTCLONE:LZOP:NTFS:5642158" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +#comprobando que el parametro uno es un file. +[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + +local TOOLS COMPRESSOR IMGFILE FILEHEAD FS FSPLUS SIZE SIZEFACTOR PARTIMAGEINFO PARTCLONEINFO NTFSCLONEINFO IMGDETECT +IMGDETECT="FALSE" + +IMGFILE=$1 +FILEHEAD=/tmp/`basename $IMGFILE`.infohead +COMPRESSOR=`file $IMGFILE | awk '{print $2}'` +ogCheckStringInGroup "$COMPRESSOR" "gzip lzop" || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? +$($COMPRESSOR -dc $IMGFILE 2>/dev/null | head -n 40 > $FILEHEAD) || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? + +## buscando Primera opción. +if [ "$IMGDETECT" == "FALSE" ] +then + PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1) + if `echo $PARTCLONEINFO | grep size > /dev/null` + then + TOOLS=PARTCLONE + FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') + if [[ "$FS" == "HFS" || "$FS" == "HFSPLUS" || "$FS" == "FAT32" ]]; then + FSPLUS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($9);}') + echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 + if [ "$FSPLUS" == "PLUS" ]; then + FS=$FS$FSPLUS + SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{printf "%d\n", $17*FACTOR;}') + else + SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{printf "%d\n", $16*FACTOR;}') + fi + else + echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 + SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}') + fi + IMGDETECT="TRUE" + fi +fi +#buscando segunda opcion. +if [ "$IMGDETECT" == "FALSE" -a ! -f /dev/loop2 ] +then + cat $FILEHEAD | grep -w ntfsclone-image > /dev/null && NTFSCLONEINFO=$(cat $FILEHEAD | ntfsclone --restore --overwrite /dev/loop2 - 2>&1) + if `echo $NTFSCLONEINFO | grep ntfsclone > /dev/null` + then + TOOLS=NTFSCLONE + SIZE=$(echo $NTFSCLONEINFO | awk '{gsub(/\(|\)|\./,""); printf "%d\n",$17/1000;}') + FS=NTFS + IMGDETECT="TRUE" + fi +fi +## buscando Tercer opción. +if [ "$IMGDETECT" == "FALSE" ] +then + PARTIMAGEINFO=$(partimage -B gui=no imginfo "$FILEHEAD" 2>&1) + if `echo $PARTIMAGEINFO | grep Partition > /dev/null` + then + TOOLS=PARTIMAGE + FS=$(echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $17;}' | awk '{sub(/\.\.+/," "); print toupper($2)}') + SIZE=$( echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $36;}' | awk '{sub(/\.\.+/," "); printf "%d\n",$2*1024*1024;}') + IMGDETECT="TRUE" + fi + if file $FILEHEAD 2> /dev/null | grep -q "boot sector"; then + TOOLS="partclone.dd" + FS= + SIZE= + IMGDETECT="TRUE" + fi +fi +#comprobamos valores #Chequeamos los valores devueltos. +if [ -z "$TOOLS" -o -z "$COMPRESSOR" -o "$IMGDETECT" == "FALSE" ] +then + ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? +else + COMPRESSOR=$(echo $COMPRESSOR | tr [a-z] [A-Z]) + echo $TOOLS:$COMPRESSOR:$FS:$SIZE +fi +} + +#/** +# ogGetImageProgram str_REPO str_imagen +#@brief muestra información sobre la imagen monolitica. +#@see ogGetImageInfo +#@param 1 REPO o CACHE contenedor de la imagen +#@param 2 filename nombre de la imagen sin extension +#@return nombre del programa usado para generar la imagen +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@note ogGetImageProgram REPO imagenA -> partclone +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## + +function ogGetImageProgram () +{ +local IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ + "$FUNCNAME REPO prueba ==> PARTCLONE" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +IMGFILE=$(ogGetPath "$1" "$2.img") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? +ogGetImageInfo $IMGFILE | awk -F: '{print $1}' +} + +#/** +# ogGetImageCompressor str_REPO str_imagen +#@brief muestra información sobre la imagen monolitica. +#@see ogGetImageInfo +#@param 1 REPO o CACHE contenedor de la imagen +#@param 2 filename nombre de la imagen sin extension +#@return tipo de compresión usada al generar la imagen +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@note ogGetImageCompressor REPO imagenA -> lzop +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## +function ogGetImageCompressor () +{ +local IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ + "$FUNCNAME REPO prueba ==> LZOP" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +IMGFILE=$(ogGetPath "$1" "$2.img") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? +ogGetImageInfo $IMGFILE | awk -F: '{print $2}' +} + + +#/** +# ogGetImageType str_REPO str_imagen +#@brief muestra información sobre el sistema de archivos de imagen monolitica. +#@see ogGetImageInfo +#@param 1 REPO o CACHE contenedor de la imagen +#@param 2 filename nombre de la imagen sin extension +#@return tipo de compresión usada al generar la imagen +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@note ogGetImageType REPO imagenA -> NTFS +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## +function ogGetImageType () +{ +local IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \ + "$FUNCNAME REPO prueba ==> NTFS" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +IMGFILE=$(ogGetPath "$1" "$2.img") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? +ogGetImageInfo $IMGFILE | awk -F: '{print $3}' +} + + +#/** +# ogGetImageSize str_REPO str_imagen +#@brief muestra información sobre el tamaño (KB) del sistema de archivos de imagen monolitica. +#@see ogGetImageInfo +#@param 1 REPO o CACHE contenedor de la imagen +#@param 2 filename nombre de la imagen sin extension +#@return tipo de compresión usada al generar la imagen +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@note ogGetImagesize REPO imagenA -> 56432234 > Kb +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## +function ogGetImageSize () +{ +# Variables locales +local IMGFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str repo path_image" \ + "$FUNCNAME REPO prueba ==> 5642158" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Error si el fichero de imagen no es accesible. +IMGFILE=$(ogGetPath "$1" "$2.img") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? + +# Devuelve el tamaño de la imagen en KB. +ogGetImageInfo $IMGFILE | awk -F: '{print $4}' +} + + +#/** +# ogCreateGptImage int_ndisk str_repo path_image +#@brief Crea una imagen de la tabla de particiones GPT de un disco. +#@param int_ndisk nº de orden del disco +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@return (nada, por determinar) +#@note repo = { REPO, CACHE } +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_IMAGE error al crear la imagen del sistema. +#@version 1.1 - Adaptación a OpenGnSys 1.1 +#@author Juan Carlos Garcia. Universidad de Zaragoza +#@date 2017/03/29 +#*/ ## +function ogCreateGptImage () +{ +# Variables locales +local DISK IMGDIR IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \ + "$FUNCNAME 1 REPO /aula1/gpt" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +DISK=$(ogDiskToDev "$1") || return $? +IMGDIR=$(ogGetParentPath "$2" "$3") +[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $? +IMGFILE="$IMGDIR/$(basename "$3").gpt" + +# Crear imagen de la tabla GPT. +sgdisk -b="$IMGFILE" "$DISK" || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + +#/** +# ogRestoreGptImage str_repo path_image int_ndisk +#@brief Restaura la imagen de la tabla de particiones GPT de un disco. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@return (por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. +#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@version 1.1 - Adaptación a OpenGnSys 1.1 +#@author Juan Carlos Garcia, Universidad de Zaragoza +#@date 2017/03/29 +#*/ ## +function ogRestoreGptImage () +{ +# Variables locales +local DISK IMGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \ + "$FUNCNAME REPO /aula1/gpt 1" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Procesar parámetros. +DISK=$(ogDiskToDev "$3") || return $? +IMGFILE=$(ogGetPath "$1" "$2.gpt") +[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $? + +# Restaurar tabla GPT del disco. +sgdisk -l="$IMGFILE" "$DISK" || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? +} + diff --git a/ogclient/lib/engine/bin/Inventory.lib b/ogclient/lib/engine/bin/Inventory.lib new file mode 100755 index 0000000..a905f1b --- /dev/null +++ b/ogclient/lib/engine/bin/Inventory.lib @@ -0,0 +1,528 @@ +#!/bin/bash +#/** +#@file Inventory.lib +#@brief Librería o clase Inventory +#@class Inventory +#@brief Funciones para recogida de datos de inventario de hardware y software de los clientes. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogGetArch +#@brief Devuelve el tipo de arquitectura del cliente. +#@return str_arch - Arquitectura (i386 para 32 bits, x86_64 para 64 bits). +#@version 0.9.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-07-17 +#*/ +function ogGetArch () +{ +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => x86_64" + return +fi + +[ -d /lib64 ] && echo "x86_64" || echo "i386" +} + + +#/** +# ogGetOsType int_ndisk int_npartition +#@brief Devuelve el tipo del sistema operativo instalado. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return OSType - Tipo de sistema operativo. +#@see ogGetOsVersion +#*/ ## +function ogGetOsType () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 2 => Linux" + return +fi +ogGetOsVersion "$@" | cut -sf1 -d: +} + + +#/** +# ogGetOsUuid int_ndisk int_nfilesys +#@brief Devuelve el UUID del sistema operativo instalado en un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden de la partición +#@return str_uuid - UUID del sistema operativo. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv +#@version 1.1.0 - Primera versión para OpenGnsys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-09-09 +#*/ ## +function ogGetOsUuid () +{ +# Variables locales. +local MNTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 2 => 540e47c6-8e78-4178-aa46-042e4803fb16" + return +fi +# Error si no se reciben 2 parametros. +[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Montar la particion, si no lo estaba previamente. +MNTDIR=$(ogMount $1 $2) || return $? + +# Obtener UUID según el tipo de sistema operativo. +case "$(ogGetOsType $1 $2)" in + Linux) + # Leer el UUID del sistema de ficheros raíz o el fichero de identificador. + findmnt -no UUID $MNTDIR 2>/dev/null || cat $MNTDIR/etc/machine-id 2>/dev/null + ;; + Windows) + # Leer identificador en clave de registro. + ogGetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Cryptography\MachineGuid' 2>/dev/null + ;; +esac +} + + +#/** +# ogGetSerialNumber +#@brief Obtiene el nº de serie del cliente. +#@version 1.1.0 - Primeras versión con OpenGnsys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-06-08 +#*/ ## +function ogGetSerialNumber () +{ +# Variables locales. +local SERIALNO +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 123456" + return +fi + +# Obtener nº de serie (ignorar los no especificados). +SERIALNO=$(dmidecode -s system-serial-number | egrep -vi "(^[ 0]+$|not specified|to be filled|invalid entry|default string)") +# Quitar espacios y truncar cadena si >25 caracteres. +SERIALNO="${SERIALNO// /}" +[ ${#SERIALNO} -gt 25 ] && SERIALNO="${SERIALNO:0:22}..." +[ -n "$SERIALNO" ] && echo "$SERIALNO" +return 0 +} + + +#/** +# ogIsEfiActive +#@brief Comprueba si el sistema tiene activo el arranque EFI. +#*/ ## +function ogIsEfiActive () +{ +test -d /sys/firmware/efi +} + + +#/** +# ogListHardwareInfo +#@brief Lista el inventario de hardware de la máquina cliente. +#@return TipoDispositivo:Modelo (por determinar) +#@warning Se ignoran los parámetros de entrada. +#@note TipoDispositivo = { bio, boa, bus, cha, cdr, cpu, dis, fir, mem, mod, mul, net, sto, usb, vga } +#@note Requisitos: dmidecode, lshw, awk +#@version 0.1 - Primeras pruebas con OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-28 +#@version 1.1.0 - Incluir nuevos componentes al inventario. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-04-23 +#*/ ## +function ogListHardwareInfo () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" + return +fi + +# Recopilación de dispositivos procesando la salida de \c lshw +ogEcho info "$MSG_HARDWAREINVENTORY}" +echo "cha=$(dmidecode -s chassis-type)" | grep -v "Other" +[ -e /sys/firmware/efi ] && echo "boo=UEFI" || echo "boo=BIOS" +lshw | awk 'BEGIN {type="mod";} + /product:/ {sub(/ *product: */,""); prod=$0;} + /vendor:/ {sub(/ *vendor: */,""); vend=$0;} + /version:/ {sub(/ *version: */,"v.");vers=$0;} + /size:/ {size=$2;} + /clock:/ {clock=$2;} + /slot:/ {sub(/ *slot: */,""); slot=$0;} + /\*-/ {if (type=="mem"){ + if (size!=""){ + numbank++; + print type"="vend,prod,size,clock" ("slot")";} + }else{ + if (type=="totalmem"){ + if (size!=""){ + totalmemory="mem="size;} + }else{ + if (type!="" && prod!=""){ + if (prod=="v."vers) + vers=""; + print type"="vend,prod,size,vers;} } + } + type=prod=vend=vers=size=clock=slot="";} + $1~/-core/ {type="boa";} + $1~/-firmware/ {type="bio";} + $1~/-cpu/ {type="cpu";} + $1~/-bank/ {type="mem";} + $1~/-memory/ {type="totalmem";} + $1~/-ide/ {type="ide";} + $1~/-storage/ {type="sto";} + $1~/-disk/ {type="dis";} + $1~/-cdrom/ {type="cdr";} + $1~/-display/ {type="vga";} + $1~/-network/ {type="net";} + $1~/-multimedia/ {type="mul";} + $1~/-usb/ {type="usb";} + $1~/-firewire/ {type="fir";} + $1~/-serial/ {type="bus";} + END {if (type!="" && prod!="") + print type"="vend,prod,size,vers; + if (length(numbank)==0 && length(totalmemory)>=4) + print totalmemory; } + ' +# */ (comentario para Doxygen) +} + + +#/** +# ogListSoftware int_ndisk int_npartition +#@brief Lista el inventario de software instalado en un sistema operativo. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return programa versión ... +#@warning Se ignoran los parámetros de entrada. +#@note Requisitos: ... +#@todo Detectar software en Linux +#@version 0.1 - Primeras pruebas con OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#@version 1.0.5 - Aproximación para inventario de software de Mac OS. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-08 +#@version 1.0.6 - Proceso depende del tipo de SO y soporte para FreeBSD. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-11-13 +#@version 1.1.0 - Se muestra el sistema operativo en la primera línea de la salida +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2016-04-26 +#*/ ## +function ogListSoftware () +{ +# Variables locales. +local APPS HIVE k KEYS KEYS32 MNTDIR PKGDIR PROG VERS TMPFILE TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME 1 1" + return +fi +# Error si no se reciben 2 parametros. +[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener tipo de sistema de archivos y montarlo. +MNTDIR=$(ogMount $1 $2) || return $? +TYPE=$(ogGetOsType $1 $2) || return $? + +# Ficheros temporales. +APPS=$(mktemp /tmp/apps.XXXXX) +TMPFILE=$(mktemp /tmp/tmp.XXXXX) +trap "rm -f $APPS $TMPFILE" 1 2 3 9 15 + +case "$TYPE" in + Linux) # Software de GNU/Linux. + # Procesar paquetes dpkg. + PKGDIR="${MNTDIR}/var/lib/dpkg" + if [ -r $PKGDIR ]; then + # Proceso de fichero en sistemas de 64 bits. + awk '/Package:/ {if (pack!="") print pack,vers; + sub(/-dev$/,"",$2); + pack=$2} + /Version:/ {sub(/^.*:/,"",$2); sub(/-.*$/,"",$2); + vers=$2} + /Status:/ {if ($2!="install") pack=vers=""} + END {if (pack!="") print pack,vers} + ' $PKGDIR/status > $APPS + fi + # Procesar paquetes RPM. + PKGDIR="${MNTDIR}/var/lib/rpm" + if [ -r $PKGDIR ]; then + # Listar si está instalado el paquete "rpm" en el cliente. + if which rpm &>/dev/null; then + rm -f ${PKGDIR}/__db.* + rpm --dbpath $PKGDIR -qa --qf "%{NAME} %{VERSION}\n" 2>/dev/null | \ + awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' > $APPS + rm -f ${PKGDIR}/__db.* + else + # Obtener el nombre de cada paquete en la BD de RPM. + python <<<" +import re; +import bsddb; +db=bsddb.hashopen('$PKGDIR/Name','r'); +for k in db.keys(): + print re.sub('-devel$','',k);" > $APPS + fi + fi + # Procesar paquetes pacman. + PKGDIR="${MNTDIR}/var/lib/pacman/local" + if [ -r $PKGDIR ]; then + ls $PKGDIR | awk -F- '/-/ {print gensub(/-/, " ", NF-2);}' > $APPS + fi + # Procesar aplicaciones Snappy. + PKGDIR="${MNTDIR}/snap" + find $PKGDIR/*/current/meta -name snap.yaml -exec \ + awk '/name:/ {pack=$2} + /version:/ {vers=$2} + END {if (pack!="") print pack,"(snap)",vers}' {} 2>/dev/null \; >> $APPS + # Procesar aplicaciones Flatpak. + PKGDIR="${MNTDIR}/var/lib/flatpak" + ls -1 $PKGDIR/app/*/current/active/deploy 2> /dev/null | python -c " +import sys +for f in sys.stdin: + p = open(f.strip()).read().split('\0') + try: + if(p[0] != 'flathub'): + raise ValueError + print('{} (flatpak) {}'.format(p[p.index('appdata-name') + 4], p[p.index('appdata-version') + 1])) + except ValueError: + pass +" >> $APPS + ;; + Windows) # Software de Windows. + # Comprobar tipo de proceso del registro de Windows. + if which hivexregedit &>/dev/null; then + # Nuevo proceso más rápido basado en "hivexregedit". + HIVE=$(ogGetHivePath $MNTDIR software 2>/dev/null) + if [ -n "$HIVE" ]; then + # Claves de registro para programas instalados. + hivexregedit --unsafe-printable-strings --export "$HIVE" '\Microsoft\Windows\CurrentVersion\Uninstall' > $TMPFILE 2>/dev/null + hivexregedit --unsafe-printable-strings --export "$HIVE" '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' >> $TMPFILE 2>/dev/null + # Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave. + awk -F\" '$1~/^\[/ {n=""} + $2~/DisplayName/ {n=$4} + $2~/DisplayVersion/ {print n,$4} + ' $TMPFILE > $APPS + fi + else + # Compatibilidad con clientes ogLive antiguos. + # Claves de registro para programas instalados: formato "{clave}". + KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall') + KEYS32=$(ogListRegistryKeys $MNTDIR software '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') + # Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave. + for k in $KEYS; do + PROG=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName") + if [ -n "$PROG" ]; then + VERS=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion") + echo "$PROG $VERS" + fi + done > $APPS + for k in $KEYS32; do + PROG=$(ogGetRegistryValue $MNTDIR software "\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName") + if [ -n "$PROG" ]; then + VERS=$(ogGetRegistryValue $MNTDIR software "\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion") + echo "$PROG $VERS" + fi + done >> $APPS + fi + ;; + MacOS) # Software de Mac OS. + # Listar directorios de aplicaciones e intentar obtener la versión del fichero .plist (tanto original como descomprimido). + find "${MNTDIR}/Applications" -type d -name "*.app" -prune -print | \ + while read k; do + FILE="$k/Contents/version.plist" + [ -s "$FILE" ] || FILE="$k/Contents/version.plist.uncompress" + [ -s "$FILE" ] && VERSION=$(awk -F"[<>]" '/ShortVersionString/ {getline;v=$3} + END {print v}' "$FILE") + echo "$(basename "$k" .app) $VERSION" + done > $APPS + ;; + BSD) # Software de FreeBSD. + sqlite3 $MNTDIR/var/db/pkg/local.sqlite <<<"SELECT name FROM pkg_search;" 2>/dev/null | \ + sed 's/\(.*\)-\(.*\)/\1 \2/g' > $APPS + ;; + *) ogRaiseError $OG_ERR_NOTOS "$1, $2 ${TYPE+($TYPE)}" + return $? ;; +esac + +# Mostrar sistema Operativo y aplicaciones. +ogGetOsVersion $1 $2 | awk -F: '{print $2}' +sort $APPS | uniq | iconv -ct utf-8 +rm -f $APPS $TMPFILE +} + +#/** +# ogGetOsVersion int_ndisk int_nfilesys +#@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden de la partición +#@return OSType:OSVersion - tipo y versión del sistema operativo. +#@note OSType = { Android, BSD, GrubLoader, Hurd, Linux, MacOS, Solaris, Windows, WinLoader } +#@note Requisitos: awk, head, chroot +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv +#@exception OG_ERR_PARTITION Fallo al montar el sistema de archivos. +#@version 0.9 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-15 +#@version 1.0.4 - Incluir tipos BSD, MacOS y Solaris. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-29 +#@version 1.0.5 - Incluir tipos GrubLoader, Hurd y WinLoader, leer por defecto fichero /etc/os-release. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-07 +#@version 1.0.6 - Detectar GrubLoader al final y sistemas basados en EFI. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 +#*/ ## +function ogGetOsVersion () +{ +# Variables locales. +local MNTDIR TYPE DISTRIB VERSION IS64BIT FILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 2 => Linux:Ubuntu precise (12.04 LTS) 64 bits" + return +fi +# Error si no se reciben 2 parametros. +[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Montar la particion, si no lo estaba previamente. +MNTDIR=$(ogMount $1 $2) || return $? + +# Buscar tipo de sistema operativo. +# Para GNU/Linux: leer descripción. +TYPE="Linux" +FILE="$MNTDIR/etc/os-release" +[ -r $FILE ] && VERSION="$(awk -F= '$1~/PRETTY_NAME/ {gsub(/\"/,"",$2); print $2}' $FILE)" +# Si no se puede obtener, buscar en ficheros del sistema. +if [ -z "$VERSION" ]; then + FILE="$MNTDIR/etc/lsb-release" + [ -r $FILE ] && VERSION="$(awk -F= '$1~/DESCRIPTION/ {gsub(/\"/,"",$2); print $2}' $FILE)" + for DISTRIB in redhat SuSE mandrake gentoo; do + FILE="$MNTDIR/etc/${DISTRIB}-release" + [ -r $FILE ] && VERSION="$(head -1 $FILE)" + done + FILE="$MNTDIR/etc/arch-release" + [ -r $FILE ] && VERSION="Arch Linux" + FILE="$MNTDIR/etc/slackware-version" + [ -r $FILE ] && VERSION="Slackware $(cat $FILE)" +fi +# Si no se encuentra, intentar ejecutar "lsb_release". +[ -z "$VERSION" ] && VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null | awk -F":\t" '{print $2}') +# Comprobar Linux de 64 bits. +[ -n "$VERSION" ] && [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT" +# Para Android, leer fichero de propiedades. +if [ -z "$VERSION" ]; then + TYPE="Android" + FILE="$MNTDIR/android*/system/build.prop" + [ -r $FILE ] && VERSION="Android $(awk -F= '$1~/(product.brand|build.version.release)/ {print $2}' $FILE | tr '\n' ' ')" + [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT" +fi +# Para GNU/Hurd, comprobar fichero de inicio (basado en os-prober). +if [ -z "$VERSION" ]; then + TYPE="Hurd" + FILE="$MNTDIR/hurd/init" + [ -r $FILE ] && VERSION="GNU/Hurd" +fi +# Para Windows: leer la version del registro. +if [ -z "$VERSION" ]; then + TYPE="Windows" + FILE="$(ogGetHivePath $MNTDIR SOFTWARE)" + if [ -n "$FILE" ]; then + # Nuevo método más rápido para acceder al registro de Windows.. + VERSION=$(echo $(hivexsh << EOT 2>/dev/null +load $FILE +cd \Microsoft\Windows NT\CurrentVersion +lsval ProductName +lsval ReleaseId +EOT + )) + [ -n "$(reglookup -H -p "Microsoft/Windows/CurrentVersion/ProgramW6432Dir" "$FILE" 2>/dev/null)" ] && IS64BIT="$MSG_64BIT" + if [ -z "$VERSION" ]; then + # Compatibilidad con métrodo antiguo y más lento de acceder al registro. + VERSION=$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows NT\CurrentVersion\ProductName' 2>/dev/null) + [ -n "$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows\CurrentVersion\ProgramW6432Dir' 2>/dev/null)" ] && IS64BIT="$MSG_64BIT" + fi + fi +fi +# Para cargador Windows: buscar versión en fichero BCD (basado en os-prober). +if [ -z "$VERSION" ]; then + TYPE="WinLoader" + FILE="$(ogGetPath $MNTDIR/boot/bcd)" + [ -z "$FILE" ] && FILE="$(ogGetPath $MNTDIR/EFI/Microsoft/boot/bcd)" + if [ -n "$FILE" ]; then + for DISTRIB in "Windows Recovery" "Windows Boot"; do + if grep -aqs "$(echo "$DISTRIB" | sed 's/./&./g')" $FILE; then + VERSION="$DISTRIB loader" + fi + done + fi +fi +# Para macOS: detectar kernel y completar con fichero plist de información del sistema. +if [ -z "$VERSION" ]; then + TYPE="MacOS" + # Kernel de Mac OS (no debe ser fichero de texto). + FILE="$MNTDIR/mach_kernel" + if [ -z "$(file -b $FILE | grep 'text')" ]; then + # Obtener tipo de kernel. + [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="macOS" + [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT" + # Datos de configuración de versión de Mac OS. + FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist" + [ -r $FILE ] && VERSION=$(awk -F"[<>]" ' + /ProductName/ {getline;s=$3} + /ProductVersion/ {getline;v=$3} + END {print s,v}' $FILE) + # Datos de recuperación de macOS. + FILE="$MNTDIR/com.apple.recovery.boot" + [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery" + fi +fi +# Para FreeBSD: obtener datos del Kernel. +### TODO Revisar solución. +if [ -z "$VERSION" ]; then + TYPE="BSD" + FILE="$MNTDIR/boot/kernel/kernel" + if [ -r $FILE ]; then + VERSION="$(strings $FILE|awk '/@.*RELEASE/ {sub(/@\(#\)/,""); print $1,$2}')" + [ -n "$(file -b $FILE | grep 'x86-64')" ] && IS64BIT="$MSG_64BIT" + fi +fi +# Para Solaris: leer el fichero de versión. +### TODO Revisar solución. +if [ -z "$VERSION" ]; then + TYPE="Solaris" + FILE="$MNTDIR/etc/release" + [ -r $FILE ] && VERSION="$(head -1 $FILE)" +fi +# Para cargador GRUB, comprobar fichero de configuración. +if [ -z "$VERSION" ]; then + TYPE="GrubLoader" + for FILE in $MNTDIR/{,boot/}grub/menu.lst; do + [ -r $FILE ] && VERSION="GRUB Loader" + done +#/* (comentario Doxygen) + for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do + [ -r $FILE ] && VERSION="GRUB2 Loader" + done +fi +#*/ (Comentario Doxygen) +# Mostrar resultado y salir sin errores. +[ -n "$VERSION" ] && echo "$TYPE:$VERSION $IS64BIT" +return 0 +} diff --git a/ogclient/lib/engine/bin/Net.lib b/ogclient/lib/engine/bin/Net.lib new file mode 100755 index 0000000..d8f272b --- /dev/null +++ b/ogclient/lib/engine/bin/Net.lib @@ -0,0 +1,345 @@ +#!/bin/bash +#/** +#@file Net.lib +#@brief Librería o clase Net +#@class Net +#@brief Funciones básicas de red. +#@version 1.0.6 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogChangeRepo IPREPO [ OgUnit ] +#@brief Cambia el repositorio para el recurso remoto images. +#@param 1 Ip Repositorio +#@param 2 Abreviatura Unidad Organizativa +#@return Cambio recurso remoto en OGIMG. +#@version 1.1 - Primera versión para OpenGnSys. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2015-06-16 +#*/ +function ogChangeRepo () +{ +local SRCIMG NEWREPO REPO OGUNIT + +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME IPREPO [ OgUnit ]" \ + "$FUNCNAME 10.1.120.3" \ + "$FUNCNAME 10.1.120.3 cdc" + return +fi + + +if [ $# -lt 1 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME IPREPO [ OgUnit ]" + return $? +fi + + +# Opciones de montaje: lectura o escritura +mount |grep "ogimages.*rw," &>/dev/null && RW=",rw" || RW=",ro" + +# Si REPO tomamos el repositorio y la unidad organizativa actual +REPO=$(ogGetRepoIp) +OGUNIT="$(df | awk -F " " '/ogimages/ {sub("//.*/ogimages","",$1); sub("/","",$1); print $1}')" + +# Parametros de entrada. Si $1 = "REPO" dejo el repositorio actual +[ "${1^^}" == "REPO" ] && NEWREPO="$REPO" || NEWREPO="${1}" + +# Si $1 y $2 son el repositorio y la OU actual me salgo +[ "$NEWREPO" == "$REPO" ] && [ "$2" == "$OGUNIT" ] && return 0 + +source /scripts/functions +source /scripts/ogfunctions +umount $OGIMG +[ "$2" == "" ] && SRCIMG="ogimages" || SRCIMG="ogimages/$2" +eval $(grep "OPTIONS=" /scripts/ogfunctions) + +ogEcho session log "$MSG_HELP_ogChangeRepo $NEWREPO ${2%/}" +ogConnect $NEWREPO $ogprotocol $SRCIMG $OGIMG $RW + +# Si da error volvemos a montar el inicial +if [ $? -ne 0 ]; then + ogConnect $REPO $ogprotocol $SRCIMG $OGIMG $RW + ogRaiseError session $OG_ERR_REPO "$NEWREPO" + return $? +fi + +} + + +#/** +# ogGetGroupDir [ str_repo ] +#@brief Devuelve el camino del directorio para el grupo del cliente. +#@param str_repo repositorio de imágenes (opcional) +#@return path_dir - Camino al directorio del grupo. +#@note repo = { REPO, CACHE } REPO por defecto +#@exception OG_ERR_FORMAT formato incorrecto. +#@version 1.0.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-10-03 +#*/ +function ogGetGroupDir () +{ +local REPO DIR GROUP +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \ + "$FUNCNAME REPO ==> /opt/opengnsys/images/groups/Grupo1" + return +fi +# Error si se recibe más de 1 parámetro. +case $# in + 0) REPO="REPO" ;; + 1) REPO="$1" ;; + *) ogRaiseError $OG_ERR_FORMAT "$*" + return $? ;; +esac + +GROUP="$(ogGetGroupName)" +if [ -n "$GROUP" ]; then + DIR=$(ogGetPath "$REPO" "/groups/$GROUP" 2>/dev/null) + [ -d "$DIR" ] && echo "$DIR" +fi +# Para que no haya error al fallar la condición anterior +return 0 +} + + +#/** +# ogGetGroupName +#@brief Devuelve el nombre del grupo al que pertenece el cliente. +#@return str_group - Nombre de grupo. +#@version 1.0.2 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-10-03 +#*/ +function ogGetGroupName () +{ +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => Grupo1" + return +fi +[ -n "$group" ] && echo "$group" +} + + +#/** +# ogGetHostname +#@brief Muestra el nombre del cliente. +#@return str_host - nombre de máquina +#@version 0.10 - Integración en OpenGnSys 0.10 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-02-11 +#*/ ## +function ogGetHostname () +{ +local HOST +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => pc1" + return +fi +# Tomar nombre de la variable HOSTNAME +HOST="$HOSTNAME" +# Si no, tomar del DHCP, opción host-name /* (comentario para Doxygen) +[ -z "$HOST" ] && HOST=$(awk -F\" '/option host-name/ {gsub(/;/,""); host=$2} + END {print host} + ' /var/lib/dhcp3/dhclient.leases) +# Si no, leer el parámetro del kernel hostname (comentario para Doxygen) */ +[ -z "$HOST" ] && HOST=$(awk 'BEGIN {RS=""; FS="="} + $1~/hostname/ {print $2}' /proc/cmdline) +[ "$HOSTNAME" != "$HOST" ] && export HOSTNAME="$HOST" +[ -n "$HOST" ] && echo $HOST +} + + +#/** +# ogGetIpAddress +#@brief Muestra la dirección IP del sistema +#@return str_ip - Dirección IP +#@version 0.10 - Integración en OpenGnSys 0.10 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-02-11 +#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing +#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-02-24 +#@version 1.0.2 - Soporte para varias tarjetas de red +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-06-17 +#*/ ## +function ogGetIpAddress () +{ +local IP +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.10" + return +fi +if [ -n "$IPV4ADDR" ]; then + IP="$IPV4ADDR" +else + # Obtener direcciones IP. + if [ -n "$DEVICE" ]; then + IP=$(ip -o address show up dev "$DEVICE" 2>/dev/null | awk '{if ($3~/inet$/) {printf ("%s ", $4)}}') + else + IP=$(ip -o address show up | awk '$2!~/lo/ {if ($3~/inet$/) {printf ("%s ", $4)}}') + fi +fi +# Mostrar solo la primera. +echo "${IP%%/*}" # (comentario para Doxygen) */ +} + + +#/** +# ogGetMacAddress +#@brief Muestra la dirección Ethernet del cliente. +#@return str_ether - Dirección Ethernet +#@version 0.10 - Integración en OpenGnSys 0.10 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-02-11 +#@version 1.0.2 - Soporte para varias tarjetas de red +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-06-17 +#*/ ## +function ogGetMacAddress () +{ +local MAC +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 00:11:22:33:44:55" + return +fi +# Obtener direcciones Ethernet. +if [ -n "$DEVICE" ]; then + MAC=$(ip -o link show up dev "$DEVICE" 2>/dev/null | awk '{sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}') +else + MAC=$(ip -o link show up | awk '$2!~/lo/ {sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}') +fi +# Mostrar sólo la primera. +echo ${MAC%% *} +} + + +#/** +# ogGetNetInterface +#@brief Muestra la interfaz de red del sistema +#@return str_interface - interfaz de red +#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing +#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-02-24 +#*/ ## +function ogGetNetInterface () +{ +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => eth0" + return +fi +[ -n "$DEVICE" ] && echo "$DEVICE" +} + + +#/** +# ogGetRepoIp +#@brief Muestra la dirección IP del repositorio de datos. +#@return str_ip - Dirección IP +#@version 0.10 - Integración en OpenGnSys 0.10 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-01-13 +#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing +#@note Comprobacion segun protocolo de conexion al Repo +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-02-24 +#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 +#*/ ## +function ogGetRepoIp () +{ +# Variables locales. +local SOURCE FSTYPE + +# Mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2" + return +fi + +# Obtener direcciones IP, según el tipo de montaje. +eval $(findmnt -P -o SOURCE,FSTYPE $OGIMG) +case "$FSTYPE" in + nfs) echo "$SOURCE" | cut -f1 -d: ;; + cifs) echo "$SOURCE" | cut -f3 -d/ ;; +esac +} + + +#/** +# ogGetServerIp +#@brief Muestra la dirección IP del Servidor de OpenGnSys. +#@return str_ip - Dirección IP +#@version 0.10 - Integración en OpenGnSys 0.10 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-01-13 +#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing +#@note Comprobacion segun protocolo de conexion al Repo +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-02-24 +#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 +#*/ ## +function ogGetServerIp () +{ +# Variables locales. +local SOURCE FSTYPE + +# Mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2" + return +fi + +# Obtener direcciones IP, según el tipo de montaje. +eval $(findmnt -P -o SOURCE,FSTYPE $OPENGNSYS) +case "$FSTYPE" in + nfs) echo "$SOURCE" | cut -f1 -d: ;; + cifs) echo "$SOURCE" | cut -f3 -d/ ;; +esac +} + + +#/** +# ogMakeGroupDir [ str_repo ] +#@brief Crea el directorio para el grupo del cliente. +#@param str_repo repositorio de imágenes (opcional) +#@return (nada) +#@note repo = { REPO, CACHE } REPO por defecto +#@exception OG_ERR_FORMAT formato incorrecto. +#@version 1.0.5 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-09-26 +#*/ +function ogMakeGroupDir () +{ +local REPO DIR GROUP +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \ + "$FUNCNAME" "$FUNCNAME REPO" + return +fi +# Error si se recibe más de 1 parámetro. +case $# in + 0) REPO="REPO" ;; + 1) REPO="$1" ;; + *) ogRaiseError $OG_ERR_FORMAT "$*" + return $? ;; +esac +# Comprobar tipo de repositorio. +DIR=$(ogGetPath "$REPO" / 2>/dev/null) +[ -n "$DIR" ] || ogRaiseError $OG_ERR_FORMAT "$1" +GROUP="$(ogGetGroupName)" +if [ -n "$GROUP" ]; then + mkdir -p "$DIR/groups/$GROUP" 2>/dev/null +fi +} + diff --git a/ogclient/lib/engine/bin/PostConf.lib b/ogclient/lib/engine/bin/PostConf.lib new file mode 100755 index 0000000..4fe47b5 --- /dev/null +++ b/ogclient/lib/engine/bin/PostConf.lib @@ -0,0 +1,543 @@ +#!/bin/bash +#/** +#@file PostConf.lib +#@brief Librería o clase PostConf +#@class PostConf +#@brief Funciones para la postconfiguración de sistemas operativos. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogCleanOs int_ndisk int_nfilesys +#@brief Elimina los archivos que no son necesarios en el sistema operativo. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición desconocida o no accesible. +#@note Antes incluido en la funcion ogReduceFs +#@author Irina Gomez. Universidad de Sevilla. +#@return (nada) +#@date 2014-10-27 +#*/ ## +function ogCleanOs () +{ + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys" || return $? + +case "$(ogGetOsType $1 $2)" in + Linux) + # Borramos los ficheros de dispositivos y los temporales. + ogCleanLinuxDevices $1 $2 + rm -rf $(ogMount $1 $2)/tmp/* #*/ Comentario Doxygen + ;; + Windows) + # Borrar ficheros de hibernación y paginación de Windows. + [ -n "$(ogGetPath $1 $2 pagefile.sys)" ] && ogDeleteFile $1 $2 pagefile.sys + [ -n "$(ogGetPath $1 $2 hiberfil.sys)" ] && ogDeleteFile $1 $2 hiberfil.sys + [ -n "$(ogGetPath $1 $2 swapfile.sys)" ] && ogDeleteFile $1 $2 swapfile.sys + ;; +esac + +} + + + +#/** +# ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ] +#@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows. +#@see ogInstallFirstBoot ogInstallRunonce +#*/ ## +function ogInstallMiniSetup () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$MSG_SEE ogInstallFirstBoot ogInstallRunonce" + return +fi +case $# in + 3) # Ejecución en el primer arranque de la máquina. + ogInstallFirstBoot "$@" ;; + 6|8) # Ejecución en el "runonce". + ogInstallRunonce "$@" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac +} + + +#/** +# ogInstallFirstBoot int_ndisk int_npartition str_filename +#@brief Crea unas claves del registro y el archivo cmd que se ejecutara en el primer arranque estando la maquina en un estado bloqueado +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del archivo .cmd a ejecutar en el arranque +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@note El archivo estará en system32 y será visible por el sistema. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Heredada de antigua función ogInstallMiniSetup. +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogInstallFirstBoot () +{ +local MNTDIR DIR CMDDIR CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename" \ + "$FUNCNAME 1 1 filename.cmd" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Comprobar que existe el directorio del fichero de comandos. +MNTDIR=$(ogMount "$1" "$2") || return $? +for i in winnt windows; do + DIR=$(ogGetPath $MNTDIR/$i/system32) + [ -n "$DIR" ] && CMDDIR=$DIR +done +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MNTDIR/windows/system32" || return $? +CMDFILE="$CMDDIR/$3" + +# Creamos el archivo cmd y creamos un par de comandos para que una vez acabe la +# postconfiguracion resetee el mini setup, sino lo haria en cada arranque. +cat > "$CMDFILE" << EOF +REG ADD HKLM\System\Setup /v SystemSetupInProgress /t REG_DWORD /d 0 /f +REG ADD HKLM\System\Setup /v CmdLine /t REG_SZ /d "" /f +EOF + +# Crear los valores de registro necesarios para que se haga la ejecución del .cmd al aranque. +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SystemSetupInProgress" 1 +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SetupType" 4 +#ogDeleteRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine" +ogAddRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine" +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine" "cmd.exe /c $(basename $CMDFILE)" +} + + +#/** +# ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password] +#@brief Crea el archivo cmd que se ejecutara en el runonce de un usuario administrador +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del archivo .cmd a ejecutar en el arranque (estara en system32 y sera visible por el sistema) +#@param str_adm_user usuario administrador para hacer autologin y ejecutar el runonce +#@param str_adm_password password del usuario administrador +#@param bool_autologin si despues de la postconfiguracion queremos que la maquina haga autologin (0 o 1) +#@param str_auto_user Usuario con el que queremos que haga autologin despues de la postconfiguracion +#@param str_auto_password Password del usuario que hara autologin +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Heredado de antigua función ogInstallMiniSetup +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#@version 1.1.0 - Resuelve problemas a partir de Windows 10 +#@author Carmelo Cabezuelo Aguilar - Universidad Politécnica de Valencia +#@date 2018-02-20 +#*/ ## +function ogInstallRunonce () +{ +local MOUNTPOINT DIR CMDDIR CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]" \ + "$FUNCNAME 1 1 filename.cmd administrator passadmin 1 userauto passuserauto" \ + "$FUNCNAME 1 1 filename.cmd administrator passadmin 0" + return +fi +# Error si no se reciben 6 u 8 parámetros. +[ $# == 6 -o $# == 8 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje. +MOUNTPOINT="$(ogGetPath "$1" "$2" /)" +# Comprobar que existe el directorio del fichero de comandos. +for i in winnt windows; do + DIR=$(ogGetPath $MOUNTPOINT/$i/system32) + [ -n "$DIR" ] && CMDDIR=$DIR +done +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/Windows/System32" || return $? +CMDFILE="$CMDDIR/$3" + +if [ $6 == 0 ]; then + # Si no queremos hacer autologin despues de la postconfiguracion lo indicamos en las claves de registro + cat > "$CMDFILE" << EOF +DEL C:\ogboot.* +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "" /f +REG DELETE "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f +EOF +else + # Si queremos hacer autologin despues de la postconfiguracion introducimos la informacion en las claves de registro + cat > "$CMDFILE" << EOF +DEL C:\ogboot.* +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "$7" /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "$8" /f +EOF +fi +#Creamos las claves de registro necesarias para que meter el cmd en el runonce del usuario y este haga autologin +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' "C:\windows\system32\\$3" 2>/dev/null +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon' 1 2>/dev/null +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$4" 2>/dev/null +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName' ".\\" 2>/dev/null +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' "$5" 2>/dev/null +ogDeleteRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceAutoLockOnLogon' 2>/dev/null +ogDeleteRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoLogonCount' 2>/dev/null +} + +#/** +# ogAddCmd int_ndisk int_npartition str_filename str_commands +#@brief Añade comandos al cmd creado por ogInstalMiniSetup +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del fichero cmd (siempre se guardara en windows\system32\para que sea visible por el sistema +#@param str_commands comando o comandos que se añadiran al fichero +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Cambios en los parametros de entrada de la funcion +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogAddCmd () +{ +local MOUNTPOINT CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_commands" \ + "$FUNCNAME 1 1 filename.cmd command" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje +MOUNTPOINT="$(ogMount "$1" "$2")" || return $? +# Crear fichero de comandos, si no existe. +CMDFILE="$(ogGetPath "$MOUNTPOINT/windows/system32")/$3" +[ -n "$CMDFILE" ] || ogInstallMiniSetup "$1" "$2" "$3" +[ -n "$CMDFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/windows/system32/$3" || return $? + +# Concatenamos el comando en el fichero de comandos +cat >> "$CMDFILE" << EOF +$4 +EOF +} + + +#/** +# ogDomainScript int_ndisk int_npartition str_domain str_user str_password +#@brief Crea un script .vbs para unir al dominio una maquina windows y el comando adequado en el archivo cmd creado por ogInstallMiniSetup +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs +#@param str_domain dominio donde se quiere conectar +#@param str_user usuario con privilegios para unir al dominio +#@param str_password password del usuario con privilegios +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Cambios en los parametros de entrada de la funcion +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogDomainScript () +{ +local CMDDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" \ + "$FUNCNAME int_ndisk int_npartition str_filename str_domain str_user str_password" \ + "$FUNCNAME 1 1 filename.cmd domain user password_user" + return +fi +# Error si no se reciben 6 parámetros. +[ $# == 6 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje +MOUNTPOINT="$(ogMount "$1" "$2")" || return $? +# Comprobar que existe el directorio de comandos. +CMDDIR=$(ogGetPath "$MOUNTPOINT/windows/system32") +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32" || return $? + +# Añadimos en el cmd que se ejecutara al arranque, el comando de ejecutar el script que añade al dominio. +ogAddCmd $1 $2 "$3" "CSCRIPT joindomain.vbs" +# Eliminamos el script porque tiene el usuario de administrador de dominio en claro +ogAddCmd $1 $2 "$3" "DEL /Q C:\Windows\System32\joindomain.vbs" +# Metemos unas claves de registro para que el dominio salga seleccionado por defecto +ogAddCmd $1 $2 "$3" "REG ADD \"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" /v DefaultDomainName /t REG_SZ /d \"$4\" /f" + +# Creamos el archivo joindomain.vbs que nos introduce la maquina en el dominio +cat > "$CMDDIR/joindomain.vbs" << EOF +Const JOIN_DOMAIN = 1 +Const ACCT_CREATE = 2 +Const ACCT_DELETE = 4 +Const WIN9X_UPGRADE = 16 +Const DOMAIN_JOIN_IF_JOINED = 32 +Const JOIN_UNSECURE = 64 +Const MACHINE_PASSWORD_PASSED = 128 +Const DEFERRED_SPN_SET = 256 +Const INSTALL_INVOCATION = 262144 + +strDomain = "$4" +strUser = "$5" +strPassword = "$6" + +Set objNetwork = CreateObject("WScript.Network") +strComputer = objNetwork.ComputerName + +Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\\" & _ + strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & strComputer & "'") + +ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, strPassword, _ + strDomain & "\" & strUser, NULL, JOIN_DOMAIN + ACCT_CREATE) +EOF + +#*/ " (comentario Doxygen) + + +} + + +### PRUEBAS. + +#/** +# ogConfigureOgagent int_ndisk int_filesys +#@brief Modifica el fichero de configuración del nuevo agente OGAent para sistemas operativos. +#@param int_ndisk nº de orden del disco +#@param int_filesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_LOCKED Sistema de archivos bloqueado. +#@version 1.1.0 - Primera adaptación para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-07-15 +#*/ ## +function ogConfigureOgagent () +{ +# Variables locales. +local MNTDIR AGENTDIR CFGFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener sistema de archvios. +MNTDIR=$(ogMount $1 $2) || return $? + +# Comprobar si existe el fichero de configuración de OGAgent. +for AGENTDIR in usr/share/OGAgent "Program Files/OGAgent" "Program Files (x86)/OGAgent" Applications/OGAgent.app; do + CFGFILE=$(ogGetPath "$MNTDIR/$AGENTDIR/cfg/ogagent.cfg") + [ -n "$CFGFILE" ] && break +done +[ -n "$CFGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "ogagent.cfg" || return $? +# Parchear dirección del servidor OpenGnsys en el fichero de configuración de OGAgent. +sed -i "0,/remote=/ s,remote=.*,remote=https://$(ogGetServerIp):8443/opengnsys/rest/," "$CFGFILE" +} + + +#/** +# ogInstallLaunchDaemon int_ndisk int_nfilesys str_filename +#@brief Instala archivo que se ejecutará en el arranque de macOS. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_filename nombre del script +#return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado. +#@npte Crea ficheros de configuración /Library/LaunchDaemon/es.opengnsys.Script.plist. +#@version 1.0.6 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-06 +#*/ ## +function ogInstallLaunchDaemon () +{ +# Variables locales. +local LAUNCHDIR SCRIPTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \ + "$FUNCNAME 1 2 postconf" + return +fi + +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Comprobar directorios. +LAUNCHDIR=$(ogGetPath $1 $2 /Library/LaunchDaemons) +[ -n "$LAUNCHDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /Library/LaunchDaemons" || return $? +SCRIPTDIR=$(ogGetPath $1 $2 /usr/share) +[ -n "$SCRIPTDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share" || return $? + +# Crear fichero de configuración del servicio de arranque. +cat << EOT $LAUNCHDIR/es.opengnsys.$3.plist + + + + Label + es.opengnsys.$3 + ProgramArguments + + $SCRIPTDIR/$3.sh + + RunAtLoad + + StandardOutPath + /var/log/$3.log + StandardErrorPath + /var/log/$3.err + + + +EOT + +# Crear un fichero de script vacío. +rm -f $SCRIPTDIR/$3.sh +touch $SCRIPTDIR/$3.sh +chmod +x $SCRIPTDIR/$3.sh +} + + +### PRUEBAS. + +#/** +# ogAddToLaunchDaemon int_ndisk int_nfilesys str_filename str_commands +#@brief Añade comandos al script creado por ogInstalLaunchDaemon. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_filename nombre del script (siempre se guardará en /usr/share para que sea visible por el sistema +#@param str_commands comando o comandos que se añadiran al fichero +#return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado. +#@version 1.0.6 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-06 +#*/ ## +function ogAddToLaunchDaemon () +{ +# Variables locales. +local SCRIPTFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \ + "$FUNCNAME 1 2 postconf \"diskutil enableJournal disk0s2\"" + return +fi + +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Comprobar que existe el fichero de comandos. +SCRIPTFILE=$(ogGetPath $1 $2 "/usr/share/$3.sh") +[ -n "$SCRIPTFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share/$3" || return $? + +# Concatenamos el comando en el fichero de comandos +cat >> "$SCRIPTFILE" << EOT +$4 +EOT +} + + +#/** +# ogUninstallLinuxClient int_ndisk int_filesys +#@brief Desinstala el cliente OpenGnSys para sistemas operativos GNU/Linux. +#@param int_ndisk nº de orden del disco +#@param int_filesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos. +#@exception OG_ERR_LOCKED Sistema de archivos bloqueado. +#@version 1.1.0 - Primera adaptación para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-08-22 +#*/ ## +function ogUninstallLinuxClient () +{ +# Variables locales. +local MNTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener sistema de archvios. +MNTDIR=$(ogMount $1 $2) || return $? + +# Borrar ficheros y quitar llamada al cliente durante el proceso de inicio. +rm -f $MNTDIR/{usr/sbin,sbin,usr/local/sbin}/ogAdmLnxClient +rm -f $MNTDIR/{etc,usr/local/etc}/ogAdmLnxClient.cfg +sed -i -e '/ogAdmLnxClient/ d' $MNTDIR/{etc,usr/local/etc}/{rc.local,rc.d/rc.local} 2>/dev/null +} + + +#/** +# ogUninstallWindowsClient int_ndisk int_filesys str_filename +#@brief Desinstala el cliente OpenGnSys para sistemas operativos Windows. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos. +#@exception OG_ERR_LOCKED Sistema de archivos bloqueado. +#@version 1.1.0 - Primera adaptación para OpenGnsys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-08-22 +#*/ ## + +function ogUninstallWindowsClient () +{ +# Variables locales. +local MNTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_filename" \ + "$FUNCNAME 1 1 filename.cmd" + return +fi + +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener sistema de archvios. +MNTDIR=$(ogMount "$1" "$2") || return $? + +# Crear órdenes para desinstalar servicio y borrar ejecutable del cliente. +if [ -n "$(ogGetPath $MNTDIR/windows/ogAdmWinClient.exe)" -o -n "$(ogGetPath $MNTDIR/winnt/ogAdmWinClient.exe)" ]; then + ogAddCmd $1 $2 "$3" 'ogAdmWinClient -remove' + ogAddCmd $1 $2 "$3" 'DEL C:\Windows\ogAdmWinClient.exe' + ogAddCmd $1 $2 "$3" 'DEL C:\Winnt\ogAdmWinClient.exe' +fi +} + diff --git a/ogclient/lib/engine/bin/PostConfEAC.lib b/ogclient/lib/engine/bin/PostConfEAC.lib new file mode 100755 index 0000000..d34864d --- /dev/null +++ b/ogclient/lib/engine/bin/PostConfEAC.lib @@ -0,0 +1,699 @@ +#!/bin/bash + +# ogLoadHiveWindows int_ndisk int_partiton +#@brief Localiza los hive del registro de windows (de sistema y usuarios) +#@param int_ndisk nº de orden del disco +#@param int_partition nº de particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + + +function ogLoadHiveWindows () { +# Variables locales. +local PART DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK=$1; PART=$2; + +#Comprobaciones redundantes: borrar" +#ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows no detectada"; echo $?) +#ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?) +#VERSION=$(ogGetOsVersion $DISK $PART) +#Fin Comprobaciones redundantes: borrar" + + +# primera fase, carga de los hive del sistema +if ogGetPath $DISK $PART WINDOWS +then + SYSTEMROOT="Windows" +elif ogGetPath $DISK $PART WINNT +then + SYSTEMROOT="winnt" +else + return $(ogRaiseError $OG_ERR_NOTOS "version windows no detectada"; echo $?) +fi + +hiveSAM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/SAM) +[ -n "$hiveSAM" ] && export hiveSAM || return $(ogRaiseError $OG_ERR_NOTOS " hive SAM no detectada"; echo $?) +hiveSYSTEM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/system) +[ -n "$hiveSYSTEM" ] && export hiveSYSTEM || return $(ogRaiseError $OG_ERR_NOTOS "hive SYSTEM no detectada"; echo $?) +hiveSOFTWARE=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/software) +[ -n "$hiveSOFTWARE" ] && export hiveSOFTWARE || return $(ogRaiseError $OG_ERR_NOTOS "hive SOFTWARE no detectada"; echo $?) +export TEMPhive=/tmp/tmpregistry + +# segunda fase, carga de los hive de usuarios windows. +declare -i COUNT +COUNT=3 +#TODO WINDOWS XP WINDOWS7 +BASEHOMEDIR=$(ogGetPath $DISK $PART /"Documents and Settings") +TMPUSERFILE="/tmp/WuserRegAndDAT.tmp" +find "$BASEHOMEDIR/" -type f -name NTUSER.DAT > $TMPUSERFILE +LISTUSERS=$(drbl-chntpw -l $hiveSAM | grep RID | awk -F"<" '{print $2}' | awk -F">" '{print $1}') +#echo "$BASEHOMEDIR" $LISTUSERS +for user in $LISTUSERS +do + # Comprobamos que el usuario registrado tiene .DAT + if HOMEDIR=$(cat $TMPUSERFILE | grep -w $user) + then + #echo "$user exportamos los usuarios de windows como variables, y como valor hiveUSERX; donde la X es 3 4 5 6 ... X" + export `echo $user=hiveUSER$COUNT` + #echo "$user exportamos la variable hiveUSERX con el valor del home de la variable-usuario_windows" + ##export `echo hiveUSER$COUNT`="$(echo $HOMEDIR | sed -e 's/ /\\ /'g | sed -e 's/\\/\\\\/g')" + export `echo hiveUSER$COUNT`="$(echo $HOMEDIR)" + #echo " estas variables \$USUARIO -> Identificador del HIVE ; \${!USUARIO} -> path del HIVE " + COUNT=${COUNT}+1 + fi + +done +COUNT=0 +} + + +# ogUpdateHiveWindows +#@brief Actualiza los hive de windows. +#@param int_ndisk +#@param int_partition +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + + +function ogUpdateHiveWindows (){ +# Variables locales. +local PART DISK FILE + +#TODO detectar llamada a ogLoadHiveWindows + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME " \ + "$FUNCNAME " + return +fi + +echo drbl-chntpw -f $TEMPhive $hiveSAM $hiveSYSTEM $hiveSOFTWARE \"${hiveUSER3}\" \"${hiveUSER4}\" \"${hiveUSER5}\" \"${hiveUSER6}\" \"${hiveUSER7}\" \"${hiveUSER8}\" \"${hiveUSER9}\" > /tmp/run.sh +cat /tmp/run.sh; sh /tmp/run.sh; rm -fr $TEMPhive; rm /tmp/run.sh + +unset hiveSAM hiveSYSTEM hiveSOFTWARE TEMPhive hiveUSER3 hiveUSER4 hiveUSER5 hiveUSER6 hiveUSER7 hiveUSER8 hiveUSER9 + + +} + + + +function ogHiveNTRunMachine () { +#echo sintaxis: PathScripts idScripts +#echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 +#echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +#echo "identifica 0=$hiveSAM 1=$hiveSystem 2=$hiveSoftware 3=$HiveUser3" + +local PART DISK FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME PathScripts|command keyName " \ + "$FUNCNAME c:\\\\Windows\\\\crearusuarios.cmd scripts_crearUsuarios "\ + "$FUNCNAME "cmd /c del c:\ogboot.*" ogcleanboot "\ + "$FUNCNAME Requiere la previa ejecución de ogLoadHive int_disk int_part"\ + "$FUNCNAME Despues requiere el ogUpdateHive" + return +fi + + +# Error si no se reciben al menos 1 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + + +cat >> $TEMPhive << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +#ogGetRegistryValue /mnt/sda1 software '\Microsoft\Windows\CurrentVersion\Run\og3' +} + +function ogNTPolUserOn () { + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME id_hive_user " \ + "$FUNCNAME NombreUsuario"\ + "$FUNCNAME " + return +fi + +# TODO: error si no se ha llamado previamente a ogLoadHiveWindows +[ -n $hiveSAM ] || return $(ogRaiseError $OG_ERR_FORMAT "se debe utilizar primero la utilidad ogLoadHiveWindows"; echo $?) + +# TODO: error si el usuario no tiene cuenta en windows. +drbl-chntpw -l $hiveSAM | grep RID | grep -w $1 || return $(ogRaiseError $OG_ERR_FORMAT "el usuario $1 no tiene cuenta en este windows: Compruebe mayusculas o minusculas"; echo $?) + +# TODO: error si no el usario no no tiene HIVE asociado. +[ -n "${!1}" ] || return $(ogRaiseError $OG_ERR_FORMAT "el usuario no tiene hive creado"; echo $?) + + +HIVEID=$(echo ${!1} | tr -d "hiveUSER") + + +#echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +echo $HIVEID +#cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/ + +cat >> $TEMPhive << EOF +h $HIVEID +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\fondo.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\Policies +nk Explorer +cd Explorer + +nv 4 NoDesktop +ed NoDesktop +1 + +nv 4 NoSimpleStartMenu +ed NoSimpleStartMenu +1 +nv 4 NoWindowsUpdate +ed NoWindowsUpdate +1 + +nv 4 NoSMConfigurePrograms +ed NoSMConfigurePrograms +1 + +nv 4 NoChangeStartMenu +ed NoChangeStartMenu +1 + +nv 4 Intellimenus +ed Intellimenus +1 + +nv 4 NoRun +ed NoRun +1 + +nv 4 NoRecentDocsHistory +ed NoRecentDocsHistory +1 +EOF +} + + + + + +########################################################## +########################################################## +#####librerias de PostConfiguracion v0.1para Advanced Deploy enViorenment########### +# Liberado bajo licencia GPL ################ +############# 2008 Antonio Jes�s Doblas Viso adv@uma.es ########################## +########### Universidad de Malaga (Spain)############################ +########################################################## + + + + + +function NTChangeName () { +if [ $# = 0 ] +then +echo sintaxis: NTChangeNAME str_$var +echo ejemplos: NTCHangeName adi${IPcuatro}-xp +fi +cat >> $temporal << EOF +h 1 +ed ControlSet001\Control\ComputerName\ComputerName\ComputerName +$1 +ed ControlSet001\Services\Tcpip\Parameters\Hostname +$1 +ed ControlSet001\Services\Tcpip\Parameters\NV Hostname +$1 +h 2 +cd \Microsoft\Windows NT\CurrentVersion\Winlogon +ed DefaultDomainName +$1 +EOF +} + + + +function NTSetGroupName () { +if [ $# = 0 ] +then +echo sintaxis: NTSetGroupName str_$var +echo ejemplos: NTSetGroupName adi +fi +cat >> $temporal << EOF +h 2 +ed \Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName +$1 +EOF +} + + +function NTSetOwner (){ +if [ $# = 0 ] +then +echo sintaxis: NtSetOwner str_propietario str_organizacion +echo ejemplos: NTSetOwner eu\ politecnica universidad\ de\ malaga +fi +cat >> $temporal << EOF +h 2 +ed \Microsoft\Windows NT\CurrentVersion\RegisteredOwner +$1 +ed \Microsoft\Windows NT\CurrentVersion\RegisteredOrganization +$2 +EOF +} + + +function NTAutoLogon (){ +if [ $# = 0 ] +then +echo sintaxis: Int_Activar Int_nves str_usuario str_passwd str_equipo +echo ejemplos: 1 2 administrador 3451 $equipo +echo IMPORTANTE: cuando AutoLogonCount llegue a 0, activa el AutoAdminLogon a 0. Pero no borra los valores de DefaultPassword +return 2 +fi +#echo la pass es $4 +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +hive 2 +cd \Microsoft\Windows NT\CurrentVersion\Winlogon +nv 1 AutoAdminLogon +ed AutoAdminLogon +$1 +nv 1 AutoLogonCount +ed AutoLogonCount +$2 +nv 1 DefaultUserName +ed DefaultUserName +$3 +nv 1 DefaultDomainName +ed DefaultDomainName +$5 +EOF +if [ "$4" == none ] +then +echo "debe aparecer done" $4 +cat >> $temporal << EOF +dv DefaultPassword + + +EOF +else +cat >> $temporal << EOF +nv 1 DefaultPassword +ed DefaultPassword +$4 +EOF +fi +} + +function NTStatusRatonTeclado (){ +if [ $# = 0 ] +then +echo sintaxis: Int-StatusRaton Int-StatusTeclado +echo ejemplos: int=1 activo int=4 desactivado +return 2 +fi +cat >> $temporal << EOF +hive 1 +cd \ControlSet001\Services\Mouclass +ed Start +$1 +cd \ControlSet001\Services\Kbdclass +ed Start +$2 +EOF +} + +function NTRunOnceMachine () { +if [ $# = 0 ] +then +echo sintaxis: PathScripts idScripts +echo "ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1" +echo "IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\" +return 2 +fi +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\RunOnce +nv 1 $2 +ed $2 +$1 +EOF +} + +function NTRunMachine () { +if [ $# = 0 ] +then +echo sintaxis: PathScripts idScripts +echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 +echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +return 2 +fi +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +} + +function NTRunUser () { +if [ $# = 0 ] +then +echo sintaxis: str_PathWINScripts str_idScripts Int_hive||\$usuario +echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 3 +echo IMPORTANTE: el pathWIN debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +echo IMPORTANTE: el pathLinux si lleva espacios debe escaparse con una barra \\ +echo IMPORTANTE Int_hive: 3 para el primer usuario, 4 para el segundo usuario +echo requiere export un HiveUser3=/mnt/windows/Document\ and\ Seeting\alumnmos\NTUSER.dat +return 2 +fi +cat >> $temporal << EOF +h $3 +cd \Software\Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +} + + + +function NTPolUserOn () { +if [ $# = 0 ] +then +Msg "requiere LoadRegistryUser str_user1 str_user2..." orange +echo "sintaxis: Int_hive" +echo "ejemplo: NTPolUserOn 3" +echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +return 2 +fi +cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/ +cat >> $temporal << EOF +h $1 +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\fondo.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\Policies +nk Explorer +cd Explorer + +nv 4 NoDesktop +ed NoDesktop +1 + +nv 4 NoSimpleStartMenu +ed NoSimpleStartMenu +1 +nv 4 NoWindowsUpdate +ed NoWindowsUpdate +1 + +nv 4 NoSMConfigurePrograms +ed NoSMConfigurePrograms +1 + +nv 4 NoChangeStartMenu +ed NoChangeStartMenu +1 + +nv 4 Intellimenus +ed Intellimenus +1 + +nv 4 NoRun +ed NoRun +1 + +nv 4 NoRecentDocsHistory +ed NoRecentDocsHistory +1 +EOF +} + +function NTPolUserOFF () { +if [ $# = 0 ] +then +Msg "requiere LoadRegistryUser str_user1 str_user2..." orange +echo "sintaxis: Int_hive" +echo "ejemplo: NTPolUserOFF 3" +echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +return 2 +fi +cat >> $temporal << EOF +h $1 +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\web\\wallpaper\\Felicidad.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\ +rdel Policies +nk Policies +1 +EOF +} + + +function ogSetWindowsChkdisk() { +if [ $# = 0 ] +then +echo sintaxis: true|TRUE|0 false|false|1 +echo ejemplos: int=0 desactivado int=1 activado +return 2 +fi +case $1 in + 0|true|TRUE) + valor="autocheck autochk *";; + 1|false|FALSE) + valor="none";; + *) + return 0 ;; +esac + +cat >> $TEMPhive << EOF +hive 1 +cd \ControlSet001\Control\Session Manager +ed BootExecute +$valor +--n +EOF +} + + + +### FASE DE PRUEBAS NO FUNCIONA +function NTStartRecovery () { +if [ $# = 0 ] +then + echo sintaxis: Int-Status + echo ejemplos: int=0 desactivado int=1 activado + return 2 +fi + +[ $1 = 0 ] && valor="none" +[ $1 = 1 ] && valor="00000000" + + +cat >> $TEMPhive << EOF +hive 2 +#cd \Policies\Microsoft\Windows\WinRE +#ed DisableSetup +cd \Policies\Microsoft\Windows +nk WinRE +nv 4 DisableSetup +ed DisableSetup +$valor +--n +EOF + + +#Activado +#[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WinRE] +#"DisableSetup"=- + +# Desactivado +#[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WinRE] +#"DisableSetup"=dword:00000000 + + +} + + +function ogSchrootLinux () { + +# Variables locales. +local PART DISK DIRCONF SCHROOTDEVICE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK=$1; PART=$2; DIRCONF="/etc/schroot" + + +VERSION=$(ogGetOsVersion $DISK $PART) +echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?) + +ogUnmount $DISK $PART || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?) + +SCHROOTDEVICE=$(ogDiskToDev $DISK $PART) + + +rm ${DIRCONF}/mount-defaults +rm ${DIRCONF}/schroot.conf + +cat >> ${DIRCONF}/mount-defaults << EOF +# +proc /proc proc defaults 0 0 +/dev /dev none rw,bind 0 0 +/dev/pts /dev/pts none rw,bind 0 0 +/dev/shm /dev/shm none rw,bind 0 0 +EOF + + +cat >> ${DIRCONF}/schroot.conf << EOF +[linux] +description=$VERSION +type=block-device +device=$SCHROOTDEVICE +EOF + + + + +schroot -c linux + +schroot -end-sessiona --all-sessions +} + + +#/** @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1 +#@param Admite 1 parametro: $1 int_numdisk +#@param Admite 2 parametro: $1 int_numdisk $2 int_partition +#@return Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda +#@return Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC........... ejemplo: IdPartition 2 1 => sdb1 +#@warning No definidas +#@attention +#@note Notas sin especificar +#@version 0.1 - Integracion para Opengnsys - EAC: IdPartition en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 27/10/2008 +#*/ +function ogDiskToRelativeDev () { +if [ $# = 0 ] +then + Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info + Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example + Msg "Sintaxis2: IdPartition int_disk int_partition --Ejemplo2: IdPartition 1 2 -> sda2 " example + +return +fi +#PART="$(Disk|cut -f$1 -d' ')$2" # se comenta esta linea porque doxygen no reconoce la funcion disk y no crea los enlaces y referencias correctas. +PART=$(ogDiskToDev|cut -f$1 -d' ')$2 +echo $PART | cut -f3 -d \/ +} + + +#/** @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos +#@param No requiere +#@return Nada +#@warning +#@attention Requisitos: comando interno linux rm +#@note +#@version 0.1 - Integracion para Opengnsys - EAC: DeletePartitionTable() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 27/10/2008 +#*/ +function ogDeletePartitionsLabels () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME " \ + "$FUNCNAME " + return +fi + +rm /dev/disk/by-label/* # */ COMENTARIO OBLIGATORIO PARA DOXYGEN +} + + +#/** @function ogInfoCache: @brief muestra la informacion de la CACHE. +#@param sin parametros +#@return texto que se almacena en $IP.-InfoCache. punto_montaje, tama?oTotal, TamanioOcupado, TaminioLibre, imagenes dentro de la cahce +#@warning Salidas de errores no determinada +#@warning printf no soportado por busybox +#@attention +#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga +#*/ +function ogInfoCache () +{ +local info infoFilesystem infoSize infoUsed infoUsedPorcet infoMountedOn content +if ogMountCache +then + info=`df -h | grep $OGCAC` + infoFilesystem=`echo $info | cut -f1 -d" "` + infoSize=`echo $info | cut -f2 -d" "` + infoUsed=`echo $info | cut -f3 -d" "` + infoAvail=`echo $info | cut -f4 -d" "` + infoUsedPorcet=`echo $info | cut -f5 -d" "` + infoMountedOn=`echo $info | cut -f2 -d" "` + if `ls ${OGCAC}$OGIMG > /dev/null 2>&1` + then + cd ${OGCAC}${OPENGNSYS} + #content=`find images/ -type f -printf "%h/ %f %s \n"` busybox no soporta printf + content=`find images/ -type f` + cd / + echo $info + echo -ne $content + echo " " + #echo "$info" > ${OGLOG}/${IP}-InfoCache + #echo "$content" >> {$OGLOG}/${IP}-InfoCache + else + echo $info + #echo "$info" > {$OGLOG}/${IP}-InfoCache + fi + ogUnmountCache +else + echo " " + #echo " " > {$OGLOG}/${IP}-InfoCache + +fi +} + diff --git a/ogclient/lib/engine/bin/Protocol.lib b/ogclient/lib/engine/bin/Protocol.lib new file mode 100755 index 0000000..02ccdf9 --- /dev/null +++ b/ogclient/lib/engine/bin/Protocol.lib @@ -0,0 +1,1182 @@ +#!/bin/bash +#/** +#@file Protocol.lib +#@brief Librería o clase Protocol +#@class Protocol +#@brief Funciones para transmisión de datos +#@version 1.0.5 +#@warning License: GNU GPLv3+ +#*/ + + +##################### FUNCIONES UNICAST ################ + +#/** +# ogUcastSyntax +#@brief Función para generar la instrucción de transferencia de datos unicast +#@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ] +#@param 2 Sesion Unicast +#@param 3 Dispositivo (opción PARTITION) o fichero(opción FILE) que será enviado. +#@param 4 Tools de clonación (opcion PARTITION) +#@param 5 Tools de compresion (opcion PARTITION) +#@return instrucción para ser ejecutada. +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_UCASTSYNTAXT formato de la sesion unicast incorrecta. +#@note Requisitos: mbuffer +#@todo: controlar que mbuffer esta disponible para los clientes. +#@version 1.0 - +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2011/03/09 +#*/ ## + +function ogUcastSyntax () +{ + +local PARM SESSION SESSIONPARM MODE PORTBASE PERROR ADDRESS +local TOOL LEVEL DEVICE MBUFFER SYNTAXSERVER SYNTAXCLIENT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" -o "$2" == "help" ]; then + ogHelp "$FUNCNAME SENDPARTITION str_sessionSERVER str_device str_tools str_level" \ + "$FUNCNAME RECEIVERPARTITION str_sessionCLIENT str_device str_tools str_level "\ + "$FUNCNAME SENDFILE str_sessionSERVER str_file "\ + "$FUNCNAME RECEIVERFILE str_sessionCLIENT str_file " \ + "sessionServer syntax: portbase:ipCLIENT-1:ipCLIENT-2:ipCLIENT-N " \ + "sessionServer example: 8000:172.17.36.11:172.17.36.12" \ + "sessionClient syntax: portbase:ipMASTER " \ + "sessionClient example: 8000:172.17.36.249 " + return +fi +PERROR=0 + + + + +# Error si no se reciben $PARM parámetros. +echo "$1" | grep "PARTITION" > /dev/null && PARM=5 || PARM=3 +[ "$#" -eq "$PARM" ] || ogRaiseError $OG_ERR_FORMAT "sin parametros"|| return $? + + +# 1er param check +ogCheckStringInGroup "$1" "SENDPARTITION sendpartition RECEIVERPARTITION receiverpartition SENDFILE sendfile RECEIVERFILE receiverfile" || ogRaiseError $OG_ERR_FORMAT "1st param: $1" || PERROR=1 #return $? + +# 2º param check +echo "$1" | grep "SEND" > /dev/null && MODE=server || MODE=client + +######### No controlamos el numero de elementos de la session unicast porque en el master es variable en numero +#TODO: diferenciamos los paramatros especificos de la sessión unicast +#SI: controlamos todos los parametros de la sessión unicast. +#[ $MODE == "client" ] && SESSIONPARM=2 || SESSIONPARM=6 +OIFS=$IFS; IFS=':' ; SESSION=($2); IFS=$OIFS + + +#[[ ${#SESSION[*]} == $SESSIONPARM ]] || ogRaiseError $OG_ERR_FORMAT "parametros session multicast no completa" || PERROR=2# return $? + + +#controlamos el PORTBASE de la sesion. Comun.- +PORTBASE=${SESSION[0]} +ogCheckStringInGroup ${SESSION[0]} "8000 8001 8002 8003 8004 8005" || ogRaiseError $OG_ERR_FORMAT "McastSession portbase ${SESSION[0]}" || PERROR=3 #return $? + +if [ $MODE == "server" ] +then + SIZEARRAY=${#SESSION[@]} + for (( i = 1 ; i < $SIZEARRAY ; i++ )) + do + ADDRESS="$ADDRESS -O ${SESSION[$i]}:$PORTBASE" + #echo " -O ${SESSION[$i]}:$PORTBASE" + done + +else + ADDRESS=${SESSION[1]}:${PORTBASE} +fi + +#3er param check - que puede ser un dispositvo o un fichero. +#[ -n "$(ogGetPath "$3")" ] || ogRaiseError $OG_ERR_NOTFOUND " device or file $3" || PERROR=9 #return $? +DEVICE=$3 + +#4 y 5 param check . solo si es sobre particiones. +if [ "$PARM" == "5" ] +then + # 4 param check + ogCheckStringInGroup "$4" "partclone PARTCLONE partimage PARTIMAGE ntfsclone NTFSCLONE" || ogRaiseError $OG_ERR_NOTFOUND " herramienta $4 no soportada" || PERROR=10 #return $? + TOOL=$4 + ogCheckStringInGroup "$5" "lzop gzip LZOP GZIP 0 1" || ogRaiseError $OG_ERR_NOTFOUND " compresor $5 no valido" || PERROR=11 #return $? + LEVEL=$5 +fi + +[ "$PERROR" == "0" ] || ogRaiseError $OG_ERR_UCASTSYNTAXT " $PERROR" || return $? + +# Generamos la instrucción base de unicast -Envio,Recepcion- +SYNTAXSERVER="mbuffer $ADDRESS" +SYNTAXCLIENT="mbuffer -I $ADDRESS " + + +case "$1" in +SENDPARTITION) + PROG1=`ogCreateImageSyntax $DEVICE " " $TOOL $LEVEL | awk -F"|" '{print $1 "|" $3}' | tr -d ">"` + echo "$PROG1 | $SYNTAXSERVER" + ;; + RECEIVERPARTITION) + COMPRESSOR=`ogRestoreImageSyntax " " $DEVICE $TOOL $LEVEL | awk -F\| '{print $1}'` + TOOLS=`ogRestoreImageSyntax " " $DEVICE $TOOL $LEVEL | awk -F\| '{print $NF}'` + echo "$SYNTAXCLIENT | $COMPRESSOR | $TOOLS " + ;; + SENDFILE) + echo "$SYNTAXSERVER -i $3" + ;; + RECEIVERFILE) + echo "$SYNTAXCLIENT -i $3" + ;; + *) + ;; +esac +} + + +#/** +# ogUcastSendPartition +#@brief Función para enviar el contenido de una partición a multiples particiones remotas usando UNICAST. +#@param 1 disk +#@param 2 partition +#@param 3 sesionUcast +#@param 4 tool image +#@param 5 tool compresor +#@return +#@exception $OG_ERR_FORMAT +#@exception $OG_ERR_UCASTSENDPARTITION +#@note +#@todo: ogIsLocked siempre devuelve 1 +#@version 1.0 - +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2011/03/09 +#*/ ## + +function ogUcastSendPartition () +{ + +# Variables locales +local PART COMMAND RETVAL + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart SessionUNICAST-SERVER tools compresor" \ + "$FUNCNAME 1 1 8000:172.17.36.11:172.17.36.12 partclone lzop" + return +fi +# Error si no se reciben 5 parámetros. +[ "$#" == 5 ] || ogRaiseError $OG_ERR_FORMAT || return $? +#chequeamos la particion. +PART=$(ogDiskToDev "$1" "$2") || return $? + +#ogIsLocked $1 $2 || ogRaiseError $OG_ERR_LOCKED "$1,$2" || return $? +ogUnmount $1 $2 + +#generamos la instrucción a ejecutar. +COMMAND=`ogUcastSyntax SENDPARTITION "$3" $PART $4 $5` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_UCASTSENDPARTITION " "; return $? +fi + +} + + +#/** +# ogUcastReceiverPartition +#@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por UNICAST. +#@param 1 disk +#@param 2 partition +#@param 3 session unicast +#@return +#@exception OG_ERR_FORMAT +#@exception OG_ERR_UCASTRECEIVERPARTITION +#@note +#@todo: +#@version 1.0 - Integración para OpenGNSys. +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2011/03/09 +#*/ ## +function ogUcastReceiverPartition () +{ +# Variables locales +local PART COMMAND RETVAL + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart SessionMulticastCLIENT tools compresor" \ + "$FUNCNAME 1 1 8000:ipMASTER partclone lzop" + return +fi +# Error si no se reciben 5 parámetros. +[ "$#" == 5 ] || ogRaiseError $OG_ERR_FORMAT || return $? +#chequeamos la particion. +PART=$(ogDiskToDev "$1" "$2") || return $? + +#ogIsLocked $1 $2 || ogRaiseError $OG_ERR_LOCKED "$1,$2" || return $? +ogUnmount $1 $2 + +#generamos la instrucción a ejecutar. +COMMAND=`ogUcastSyntax RECEIVERPARTITION "$3" $PART $4 $5` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " "; return $? +fi +} + + + +#/** +# ogUcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast +#@brief Envía un fichero por unicast ORIGEN(fichero) DESTINO(sessionmulticast) +#@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast +#@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast +#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast +#@return +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception $OG_ERR_NOTFOUND +#@exception OG_ERR_UCASTSENDFILE +#@note Requisitos: +#@version 1.0 - Definición de Protocol.lib +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## +# + +function ogUcastSendFile () +{ +# Variables locales. +local ARG ARGS SOURCE TARGET COMMAND DEVICE RETVAL LOGFILE + + +#ARGS usado para controlar ubicación de la sesion multicast +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast(puerto:ip:ip:ip)" \ + "$FUNCNAME 1 1 /aula1/winxp.img 8000:172.17.36.11:172.17.36.12" \ + "$FUNCNAME REPO /aula1/ubuntu.iso sesionUcast" \ + "$FUNCNAME CACHE /aula1/winxp.img sesionUcast" \ + "$FUNCNAME /opt/opengnsys/images/aula1/hd500.vmx sesionUcast" + return +fi + +ARGS="$@" +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE=$(ogGetPath "$1") + ARG=2 + DEVICE="$1" + ;; + [1-9]*) # ndisco npartición. + SOURCE=$(ogGetPath "$1" "$2" "$3") + ARG=4 + DEVICE="$1 $2 $3" + ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + SOURCE=$(ogGetPath "$1" "$2") + ARG=3 + DEVICE="$1 $2 " + ;; +esac + + +# Error si no se reciben los argumentos ARG necesarios según la opcion. +[ $# == "$ARG" ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Comprobar fichero origen +[ -n "$(ogGetPath $SOURCE)" ] || ogRaiseError $OG_ERR_NOTFOUND " device or file $DEVICE not found" || return $? + + +SESSION=${!ARG} + +#generamos la instrucción a ejecutar. +COMMAND=`ogUcastSyntax "SENDFILE" "$SESSION" "$SOURCE"` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_UCASTSENDFILE " "; return $? +fi + +} + + + +#/** +# ogMcastSyntax +#@brief Función para generar la instrucción de ejucción la transferencia de datos multicast +#@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ] +#@param 2 Sesión Mulicast +#@param 3 Dispositivo (opción PARTITION) o fichero(opción FILE) que será enviado. +#@param 4 Tools de clonación (opcion PARTITION) +#@param 5 Tools de compresion (opcion PARTITION) +#@return instrucción para ser ejecutada. +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTEXEC +#@exception OG_ERR_MCASTSYNTAXT +#@note Requisitos: upd-cast 2009 o superior +#@todo localvar check versionudp +#@version 1.0 - +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#@version 2.0 - cambios en udp-receiver para permitir multicast entre subredes +#@author Juan Carlos Garcia, Universidad de Zaragoza +#@date 2015/11/17 +#@version 1.1 - Control de errores en transferencia multicast (ticket #781) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/04/20 +#@version 1.1.0.a - Parametros de clientes como sesision de multicast (ticket #851) +#@author Antonio J. Doblas Viso +#@date 2018/09/22 +#*/ ## +# + +function ogMcastSyntax () +{ + +local ISUDPCAST RECEIVERTIMEOUT STARTTIMEOUT PARM SESSION SESSIONPARM MODE PORTBASE PERROR +local METHOD ADDRESS BITRATE NCLIENTS MAXTIME CERROR +local TOOL LEVEL DEVICE MBUFFER SYNTAXSERVER SYNTAXCLIENT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" -o "$2" == "help" ]; then + ogHelp "$FUNCNAME SENDPARTITION str_sessionSERVER str_device str_tools str_level" \ + "$FUNCNAME RECEIVERPARTITION str_sessionCLIENT str_device str_tools str_level "\ + "$FUNCNAME SENDFILE str_sessionSERVER str_file "\ + "$FUNCNAME RECEIVERFILE str_sessionCLIENT str_file " \ + "sessionServer syntax: portbase:method:mcastaddress:speed:nclients:ntimeWaitingUntilNclients " \ + "sessionServer example: 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60 " \ + "sessionClient syntax: portbase " \ + "sessionClient example: 9000 "\ + "sessionClient syntax: portbase:serverIP:TimeOut_session:TimeOut_transmision" \ + "sessionClient example: 9000:172.17.88.161:40:120" + return +fi +PERROR=0 + +#si no tenemos updcast o su version superior 2009 udpcast error. +ISUDPCAST=$(udp-receiver --help 2>&1) +echo $ISUDPCAST | grep "not found" > /dev/null && (ogRaiseError $OG_ERR_NOTEXEC "upd-cast no existe " || return $?) + +############ BEGIN NUMBERS PARAMETERS CHECK AND SESSION OPTIONS IF CLIENT OR SERVER ############## +# Definimos los parametros de la funcion segun la opcion de envio/recepcion. +echo "$1" | grep "PARTITION" > /dev/null && PARM=5 || PARM=3 +[ "$#" -eq "$PARM" ] || ogRaiseError $OG_ERR_FORMAT "sin parametros"|| return $? +# 1er param check: opcion de envio/recepcion +ogCheckStringInGroup "$1" "SENDPARTITION sendpartition RECEIVERPARTITION receiverpartition SENDFILE sendfile RECEIVERFILE receiverfile" || ogRaiseError $OG_ERR_FORMAT "1st param: $1" || PERROR=1 #return $? +# 1º param check : opcion de cliente/servidor +echo "$1" | grep "SEND" > /dev/null && MODE=server || MODE=client + +# 2º param check: sesion multicast cliente/servidor. comprobamos el numero de parametros segun el tipo de sesion cliente o servidor. +#Definimos los parametros de la sesion multicast. La sesion de cliente seran 3, aunque uno es el obligado y dos opcionales. puerto:server:autostart +[ $MODE == "client" ] && SESSIONPARM=1 || SESSIONPARM=6 +#Controlamos el numero de paratros incluidos en la sesion usada como paraetro $2 +OIFS=$IFS; IFS=':' ; SESSION=($2); IFS=$OIFS +#Controlamos la sesion multicast del server +if [ $MODE == "server" ] +then + [[ ${#SESSION[*]} == $SESSIONPARM ]] || ogRaiseError $OG_ERR_FORMAT "parametros session de servidor multicast no completa" || PERROR=2# return $? +fi +#controlamos la sesion de cliente. +if [ $MODE == "client" ] +then + [[ ${#SESSION[*]} -ge $SESSIONPARM ]] || ogRaiseError $OG_ERR_FORMAT "parametros session de cliente multicast no completa" || PERROR=2# return $? +fi +############ END NUMBERS PARAMETERS CHECK ############## + +##### BEGIN SERVER SESSION ##### +# 2º param check: controlamos el primer componente comun de las sesiones de servidor y cliente: PORTBASE +PORTBASE=${SESSION[0]} +ogCheckStringInGroup ${SESSION[0]} "$(seq 9000 2 9098)" || ogRaiseError $OG_ERR_FORMAT "McastSession portbase ${SESSION[0]}" || PERROR=3 #return $? +# 2º param check: Controlamos el resto de componenentes de la sesion del servidor. +if [ $MODE == "server" ] +then + ogCheckStringInGroup ${SESSION[1]} "full-duplex FULL-DUPLEX half-duplex HALF-DUPLEX broadcast BROADCAST" || ogRaiseError $OG_ERR_FORMAT "McastSession method ${SESSION[1]}" || PERROR=4 #return $? + METHOD=${SESSION[1]} + ogCheckIpAddress ${SESSION[2]} || ogRaiseError $OG_ERR_FORMAT "McastSession address ${SESSION[2]}" || PERROR=5 #return $? + ADDRESS=${SESSION[2]} + ogCheckStringInReg ${SESSION[3]} "^[0-9]{1,3}\M$" || ogRaiseError $OG_ERR_FORMAT "McastSession bitrate ${SESSION[3]}" || PERROR=6 # return $? + BITRATE=${SESSION[3]} + ogCheckStringInReg ${SESSION[4]} "^[0-9]{1,10}$" || ogRaiseError $OG_ERR_FORMAT "McastSession nclients ${SESSION[4]}" || PERROR=7 # return $? + NCLIENTS=${SESSION[4]} + ogCheckStringInReg ${SESSION[5]} "^[0-9]{1,10}$" || ogRaiseError $OG_ERR_FORMAT "McastSession maxtime ${SESSION[5]}" || PERROR=8 # return $? + MAXTIME=${SESSION[5]} +fi + +#3er param check - que puede ser un dispositvo o un fichero. +# [ -n "$(ogGetPath $3)" ] || ogRaiseError $OG_ERR_NOTFOUND " device or file $3" || PERROR=9 #return $? +DEVICE=$3 + +#4 y 5 param check . solo si es sobre particiones. +if [ "$PARM" == "5" ] +then + # 4 param check + ogCheckStringInGroup "$4" "partclone PARTCLONE partimage PARTIMAGE ntfsclone NTFSCLONE" || ogRaiseError $OG_ERR_NOTFOUND " herramienta $4 no soportada" || PERROR=10 #return $? + TOOL=$4 + ogCheckStringInGroup "$5" "lzop LZOP gzip GZIP 0 1" || ogRaiseError $OG_ERR_NOTFOUND " compresor $5 no valido" || PERROR=11 #return $? + LEVEL=$5 +fi +# Controlamos si ha habido errores en la comprobacion de la sesion de servidor. +if [ "$PERROR" != "0" ]; then + ogRaiseError $OG_ERR_MCASTSYNTAXT " $PERROR"; return $? +fi +# Asignamos mas valores no configurables a la sesioe servidor. +CERROR="8x8/128" +# opcion del usuo de tuberia intermedia en memoria mbuffer. +which mbuffer > /dev/null && MBUFFER=" --pipe 'mbuffer -q -m 20M' " + +# Generamos la instruccion base del servidor de multicast -Envio- +SYNTAXSERVER="udp-sender $MBUFFER --nokbd --portbase $PORTBASE --$METHOD --mcast-data-address $ADDRESS --fec $CERROR --max-bitrate $BITRATE --ttl 16 --min-clients $NCLIENTS --max-wait $MAXTIME --autostart $MAXTIME --log /tmp/mcast.log" +########################################################################## +#### END SERVER SESSION ############## + + +##### BEGIN CLIENT SESSION ##### +#La primera opcion PORTBASE, ya esta controlado. Porque es comun al server y al cliente. +#La segunda opcion de la sesion para el cliente:: SERVERADDRES +if ogCheckIpAddress ${SESSION[1]} 2>/dev/null +then + SERVERADDRESS=" --mcast-rdv-address ${SESSION[1]}" +else + # Deteccion automatica de la subred del cliente para anadir la IP del repositorio a la orden udp-receiver en el caso de encontrarse en distinta subred del repo + REPOIP="$(ogGetRepoIp)" + CLIENTIP=$(ip -o address show up | awk '$2!~/lo/ {if ($3~/inet$/) {printf ("%s ", $4)}}') + MASCARA=`echo $CLIENTIP | cut -f2 -d/` + CLIENTIP=`echo $CLIENTIP | cut -f1 -d/` + RIPBT="" + IPBT="" + for (( i = 1 ; i < 5 ; i++ )) + do + RIP=`echo $REPOIP | cut -f$i -d.` + RIP=`echo "$[$RIP + 256]"` + RIPB="" + while [ $RIP -gt 0 ] + do + let COCIENTE=$RIP/2 + let RESTO=$RIP%2 + RIPB=$RESTO$RIPB + RIP=$COCIENTE + done + RIPB=`echo "$RIPB" | cut -c2-` + RIPBT=$RIPBT$RIPB + IP=`echo $CLIENTIP | cut -f$i -d.` + IP=`echo "$[$IP + 256]"` + IPB="" + while [ $IP -gt 0 ] + do + let COCIENTE=$IP/2 + let RESTO=$IP%2 + IPB=$RESTO$IPB + IP=$COCIENTE + done + IPB=`echo "$IPB" | cut -c2-` + IPBT=$IPBT$IPB + done + REPOSUBRED=`echo $RIPBT | cut -c1-$MASCARA` + CLIENTSUBRED=`echo $IPBT | cut -c1-$MASCARA` + if [ $REPOSUBRED == $CLIENTSUBRED ]; then + SERVERADDRESS=" " + else + SERVERADDRESS=" --mcast-rdv-address $REPOIP" + fi +fi +#La tercera opcion de la sesion para el cliente: ${SESSION[2]} ERRORSESSION - TIMEOUT ERROR IF NO FOUNT SESSEION MULTICAST +if ogCheckStringInReg ${SESSION[2]} "^[0-9]{1,10}$" &>/dev/null +then + case ${SESSION[2]} in + 0) + STARTTIMEOUT=" " + ;; + *) + STARTTIMEOUT=" --start-timeout ${SESSION[2]}" + ;; + esac +else + #asignamos valor definido en el engine.cfg + STARTTIMEOUT=" --start-timeout $MCASTERRORSESSION" +fi +#Verificamos que la opcion start-time out esta soportada por la version del cliente +echo $ISUDPCAST | grep start-timeout > /dev/null || STARTTIMEOUT=" " + +#La cuarta opcion de la sesion para el cliente: ${SESSION[2]} ERROR TRANSFER - TIMEOUT EEOR IF NOT RECEIVER DATA FROM SERVER +if ogCheckStringInReg ${SESSION[3]} "^[0-9]{1,10}$" &>/dev/null +then + case ${SESSION[3]} in + 0) + RECEIVERTIMEOUT=" " + ;; + *) + RECEIVERTIMEOUT=" --receive-timeout ${SESSION[3]}" + ;; + esac +else + #asignamos valor definido en el engine.cfg + RECEIVERTIMEOUT=" --receive-timeout $MCASTWAIT" +fi +#Verificamos que la opcion receive-timeou esta soportada por la version del cliente +echo $ISUDPCAST | grep receive-timeout > /dev/null || RECEIVERTIMEOUT=" " + +#Componenemos la sesion multicast del cliente +SYNTAXCLIENT="udp-receiver $MBUFFER --portbase $PORTBASE $SERVERADDRESS $STARTTIMEOUT $RECEIVERTIMEOUT --log /tmp/mcast.log" +########################################################################## +#### END CLIENT SESSION ############## + + ######## BEGIN MAIN PROGAM ##### +case "$1" in + SENDPARTITION) + PROG1=`ogCreateImageSyntax $DEVICE " " $TOOL $LEVEL | awk -F"|" '{print $1 "|" $3}' | tr -d ">"` + echo "$PROG1 | $SYNTAXSERVER" + ;; + RECEIVERPARTITION) + COMPRESSOR=`ogRestoreImageSyntax " " $DEVICE $TOOL $LEVEL | awk -F\| '{print $1}'` + TOOLS=`ogRestoreImageSyntax " " $DEVICE $TOOL $LEVEL | awk -F\| '{print $NF}'` + echo "$SYNTAXCLIENT | $COMPRESSOR | $TOOLS " + ;; + SENDFILE) + echo "$SYNTAXSERVER --file $3" + ;; + RECEIVERFILE) + echo "$SYNTAXCLIENT --file $3" + ;; + *) + ;; +esac +######## END MAIN PROGAM ##### +} + + + +#/** +# ogMcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast +#@brief Envía un fichero por multicast ORIGEN(fichero) DESTINO(sessionmulticast) +#@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast +#@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast +#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast +#@return +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception $OG_ERR_NOTFOUND +#@exception OG_ERR_MCASTSENDFILE +#@note Requisitos: +#@version 1.0 - Definición de Protocol.lib +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## +# + +function ogMcastSendFile () +{ +# Variables locales. +local ARGS ARG SOURCE TARGET COMMAND DEVICE RETVAL LOGFILE + +#LOGFILE="/tmp/mcast.log" + +#ARGS usado para controlar ubicación de la sesion multicast +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast" \ + "$FUNCNAME 1 1 /aula1/winxp.img sesionMcast" \ + "$FUNCNAME REPO /aula1/ubuntu.iso sesionMcast" \ + "$FUNCNAME CACHE /aula1/winxp.img sesionMcast" \ + "$FUNCNAME /opt/opengnsys/images/aula1/hd500.vmx sesionMcast" + return +fi + +ARGS="$@" +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE=$(ogGetPath "$1") + ARG=2 + DEVICE="$1" + ;; + [1-9]*) # ndisco npartición. + SOURCE=$(ogGetPath "$1" "$2" "$3") + ARG=4 + DEVICE="$1 $2 $3" + ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + SOURCE=$(ogGetPath "$1" "$2") + ARG=3 + DEVICE="$1 $2 " + ;; +esac + + +# Error si no se reciben los argumentos ARG necesarios según la opcion. +[ $# == "$ARG" ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Comprobar fichero origen +[ -n "$(ogGetPath $SOURCE)" ] || ogRaiseError $OG_ERR_NOTFOUND " device or file $DEVICE not found" || return $? + +# eliminamos ficheros antiguos de log +#rm $LOGFILE + +SESSION=${!ARG} + + +#generamos la instrucción a ejecutar. +COMMAND=`ogMcastSyntax "SENDFILE" "$SESSION" "$SOURCE"` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_MCASTSENDFILE " "; return $? + #[ -s "$LOGFILE" ] || return 21 +fi + +} + + + +#/** +# ogMcastReceiverFile sesion Multicast [ str_repo | int_ndisk int_npart ] /Relative_path_file +#@brief Recibe un fichero multicast ORIGEN(sesionmulticast) DESTINO(fichero) +#@param (2 parámetros) $1 sesionMcastCLIENT $2 path_aboluto_fichero_destino +#@param (3 parámetros) $1 sesionMcastCLIENT $2 Contenedor REPO|CACHE $3 path_absoluto_fichero_destino +#@param (4 parámetros) $1 sesionMcastCLIENT $2 disk $3 particion $4 path_absoluto_fichero_destino +#@return +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception $OG_ERR_MCASTRECEIVERFILE +#@note Requisitos: +#@version 1.0 - Definición de Protocol.lib +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## +# + +function ogMcastReceiverFile () +{ + +# Variables locales. +local ARGS ARG TARGETDIR TARGETFILE + + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_portMcast] [ [Relative_path_file] | [str_REPOSITORY path_file] | [int_ndisk int_npart path_file ] ]" \ + "$FUNCNAME 9000 /PS1_PH1.img" \ + "$FUNCNAME 9000 CACHE /aula1/PS2_PH4.img" \ + "$FUNCNAME 9000 1 1 /isos/linux.iso" + return +fi + +ARGS="$@" +case "$2" in + /*) # Camino completo. */ (Comentrio Doxygen) + TARGETDIR=$(ogGetParentPath "$2") + ARG=2 + ;; + [1-9]*) # ndisco npartición. + TARGETDIR=$(ogGetParentPath "$2" "$3" "$4") + ARG=4 + ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + TARGETDIR=$(ogGetParentPath "$2" "$3") + ARG=3 + ;; +esac + +# Error si no se reciben los argumentos ARG necesarios según la opcion. +[ $# == "$ARG" ] || ogRaiseError $OG_ERR_FORMAT "Parametros no admitidos"|| return $? + +#obtenemos el nombre del fichero a descargar. +TARGETFILE=`basename ${!ARG}` + +#generamos la instrucción a ejecutar. +COMMAND=`ogMcastSyntax RECEIVERFILE "$1" $TARGETDIR/$TARGETFILE ` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_MCASTRECEIVERFILE "$TARGETFILE"; return $? + #[ -s "$LOGFILE" ] || return 21 +fi +} + + +#/** +# ogMcastSendPartition +#@brief Función para enviar el contenido de una partición a multiples particiones remotas. +#@param 1 disk +#@param 2 partition +#@param 3 session multicast +#@param 4 tool clone +#@param 5 tool compressor +#@return +#@exception OG_ERR_FORMAT +#@exception OG_ERR_MCASTSENDPARTITION +#@note +#@todo: ogIsLocked siempre devuelve 1. crear ticket +#@version 1.0 - Definición de Protocol.lib +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## + +function ogMcastSendPartition () +{ + +# Variables locales +local PART COMMAND RETVAL + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart SessionMulticastSERVER tools compresor" \ + "$FUNCNAME 1 1 9000:full-duplex:239.194.37.31:50M:20:2 partclone lzop" + return +fi +# Error si no se reciben 5 parámetros. +[ "$#" == 5 ] || ogRaiseError $OG_ERR_FORMAT || return $? +#chequeamos la particion. +PART=$(ogDiskToDev "$1" "$2") || return $? + +#ogIsLocked $1 $2 || ogRaiseError $OG_ERR_LOCKED "$1,$2" || return $? +ogUnmount $1 $2 + +#generamos la instrucción a ejecutar. +COMMAND=`ogMcastSyntax SENDPARTITION "$3" $PART $4 $5` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_MCASTSENDPARTITION " "; return $? +fi + + +} + +#/** +# ogMcastReceiverPartition +#@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por multicast. +#@param 1 disk +#@param 2 partition +#@param 3 session multicast +#@param 4 tool clone +#@param 5 tool compressor +#@return +#@exception $OG_ERR_FORMAT +#@note +#@todo: +#@version 1.0 - Definición de Protocol.lib +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## +function ogMcastReceiverPartition () +{ +# Variables locales +local PART COMMAND RETVAL + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart SessionMulticastCLIENT tools compresor" \ + "$FUNCNAME 1 1 9000 partclone lzop" + return +fi +# Error si no se reciben 5 parámetros. +[ "$#" == 5 ] || ogRaiseError $OG_ERR_FORMAT || return $? +#chequeamos la particion. +PART=$(ogDiskToDev "$1" "$2") || return $? + +#ogIsLocked $1 $2 || ogRaiseError $OG_ERR_LOCKED "$1,$2" || return $? +ogUnmount $1 $2 + +#generamos la instrucción a ejecutar. +COMMAND=`ogMcastSyntax RECEIVERPARTITION "$3" $PART $4 $5` +RETVAL=$? + +if [ "$RETVAL" -gt "0" ] +then + return $RETVAL +else + echo $COMMAND + eval $COMMAND || ogRaiseError $OG_ERR_MCASTSENDPARTITION " "; return $? +fi + +} + + +#/** +# ogMcastRequest +#@brief Función temporal para solicitar al ogRepoAux el envio de un fichero por multicast +#@param 1 Fichero a enviar ubicado en el REPO. puede ser ruta absoluta o relatica a /opt/opengnsys/images +#@param 2 PROTOOPT opciones protocolo multicast +#@return +#@exception +#@note +#@todo: +#@version 1.0.5 +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2012/05/29 +#@version 1.1 - Control de errores en transferencia multicast (ticket #781) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/04/20 +#@version 1.1 - Unidades organizativas con directorio de imágenes separado. (ticket #678) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/06/23 +#*/ ## +function ogMcastRequest () { return 0; } + + +########################################## +############## funciones torrent +#/** +# ogTorrentStart [ str_repo | int_ndisk int_npart ] Relative_path_file.torrent | SessionProtocol +#@brief Función iniciar P2P - requiere un tracker para todos los modos, y un seeder para los modos peer y leecher y los ficheros .torrent. +#@param str_pathDirectory str_Relative_path_file +#@param int_disk int_partition str_Relative_path_file +#@param str_REPOSITORY(CACHE - LOCAL) str_Relative_path_file +#@param (2 parámetros) $1 path_aboluto_fichero_torrent $2 Parametros_Session_Torrent +#@param (3 parámetros) $1 Contenedor CACHE $2 path_absoluto_fichero_Torrent $3 Parametros_Session_Torrent +#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero_Torrent 4$ Parametros_Session_Torrent +#@return +#@note protocoloTORRENT=mode:time mode=seeder -> Dejar el equipo seedeando hasta que transcurra el tiempo indicado o un kill desde consola, mode=peer -> seedear mientras descarga mode=leecher -> NO seedear mientras descarga time tiempo que una vez descargada la imagen queremos dejar al cliente como seeder. +#@todo: +#@version 0.1 - Integración para OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date +#@version 0.2 - Chequeo del tamaño de imagen descargado. +#@author Irina . Univesidad de Sevilla. +#@date +#@version 0.3 - Control de los modos de operación, y estado de descarga. +#@author Antonio J. Doblas Viso. Univesidad de Málaga. +#@date +#@version 0.4 - Enviadando señal (2) a ctorrent permiendo la comunicación final con tracker +#@author Antonio J. Doblas Viso. Univesidad de Málaga. +#@date +#*/ ## +function ogTorrentStart () +{ + +# Variables locales. +local ARGS ARG TARGETDIR TARGETFILE SESSION ERROR +ERROR=0 + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME $FUNCNAME [ str_repo] [ [Relative_path_fileTORRENT] | [str_REPOSITORY path_fileTORRENT] | [int_ndisk int_npart path_fileTORRENT ] ] SessionTorrent" \ + "$FUNCNAME CACHE /PS1_PH1.img.torrent seeder:10000" \ + "$FUNCNAME /opt/opengnsys/cache/linux.iso peer:60" \ + "$FUNCNAME 1 1 /linux.iso.torrent leecher:60" + return +fi + +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE=$(ogGetPath "$1") + ARG=2 + ;; + [1-9]*) # ndisco npartición. + SOURCE=$(ogGetPath "$1" "$2" "$3") + ARG=4 + ;; + *) # Otros: Solo cache (no se permiten caminos relativos). + SOURCE=$(ogGetPath "$1" "$2" 2>/dev/null) + ARG=3 + ;; +esac + +# Error si no se reciben los argumentos ARG necesarios según la opcion. +[ $# == "$ARG" ] || ogRaiseError $OG_ERR_FORMAT "Parametros no admitidos"|| return $? + +#controlar source, que no se haga al repo. +if [ $ARG == "3" ] +then + ogCheckStringInGroup "$1" "CACHE cache" || ogRaiseError $OG_ERR_FORMAT "La descarga torrent solo se hace desde local, copia el torrent a la cache y realiza la operación desde esa ubicación" || return $? +fi +if [ $ARG == "2" ] +then + if `ogCheckStringInReg "$1" "^/opt/opengnsys/images"` + then + ogRaiseError $OG_ERR_FORMAT "La descarga torrent solo se hace desde local, copia el torrent a la cache y realiza la operación desde esa ubicación" + return $? + fi +fi + +#controlar el source, para que sea un torrent. +ctorrent -x ${SOURCE} &> /dev/null; [ $? -eq 0 ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $? + +TARGET=`echo $SOURCE | awk -F.torrent '{print $1}'` +DIRSOURCE=`ogGetParentPath $SOURCE` +cd $DIRSOURCE + + + +SESSION=${!ARG} +OIFS=$IFS; IFS=':' ; SESSION=($SESSION); IFS=$OIFS +[[ ${#SESSION[*]} == 2 ]] || ogRaiseError $OG_ERR_FORMAT "parametros session Torrent no completa: modo:tiempo" || ERROR=1# return $? +#controlamos el modo de operación del cliente- +ogCheckStringInGroup ${SESSION[0]} "seeder SEEDER peer PEER leecher LEECHER" || ogRaiseError $OG_ERR_FORMAT "valor modo Torrent no valido ${SESSION[0]}" || ERROR=1 #return $? +MODE=${SESSION[0]} +#contolamos el tiempo para el seeder o una vez descargada la imagen como peer o leecher. +ogCheckStringInReg ${SESSION[1]} "^[0-9]{1,10}$" || ogRaiseError $OG_ERR_FORMAT "valor tiempo no valido ${SESSION[1]}" || ERROR=1 # return $? +TIME=${SESSION[1]} +# si ha habido error en el control de parametros error. +[ "$ERROR" == "1" ] && return 1 + + +#SYNTAXSEEDER="echo MODE seeder ctorrent ; (sleep \$TIME && kill -9 \`pidof ctorrent\`) & ; ctorrent \${SOURCE}" + +# si No fichero .bf, y Si fichero destino imagen ya descargada y su chequeo fue comprobado en su descarga inicial. +if [ ! -f ${SOURCE}.bf -a -f ${TARGET} ] +then + echo "imagen ya descargada" + case "$MODE" in + seeder|SEEDER) + echo "MODE seeder ctorrent" #### ${SOURCE} -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100" + (sleep $TIME && kill -2 `pidof ctorrent`) & + ctorrent -f ${SOURCE} + esac + return 0 +fi + +#Si no existe bf ni fichero destino descarga inicial. +if [ ! -f ${SOURCE}.bf -a ! -f ${TARGET} ] +then + OPTION=DOWNLOAD + echo "descarga inicial" +fi + +# Si fichero bf descarga anterior no completada -. +if [ -f ${SOURCE}.bf -a -f ${TARGET} ] +then + echo Continuar con Descargar inicial no terminada. + OPTION=DOWNLOAD +fi + +if [ "$OPTION" == "DOWNLOAD" ] +then + case "$MODE" in + peer|PEER) + echo "Donwloading Torrent as peer" ### echo "ctorrent -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100 $SOURCE -s $TARGET -b ${SOURCE}" + # Creamos el fichero de resumen por defecto + touch ${SOURCE}.bf + # ctorrent controla otro fichero -b ${SOURCE}.bfog + ctorrent -f -c -X "sleep $TIME; kill -2 \$(pidof ctorrent)" -C 100 ${SOURCE} -s ${TARGET} -b ${SOURCE}.bfog + ;; + leecher|LEECHER) + echo "Donwloading Torrent as leecher" # echo "ctorrent ${SOURCE} -X 'sleep 30; kill -9 \$(pidof ctorrent)' -C 100 -U 0" + ctorrent ${SOURCE} -X "sleep 30; kill -2 \$(pidof ctorrent)" -C 100 -U 0 + ;; + seeder|SEEDER) + echo "MODE seeder ctorrent" #### ${SOURCE} -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100" + # Creamos el fichero de resumen por defecto + touch ${SOURCE}.bf + # ctorrent controla otro fichero -b ${SOURCE}.bfog + ctorrent -f -c -X "sleep $TIME; kill -2 \$(pidof ctorrent)" -C 100 ${SOURCE} -s ${TARGET} -b ${SOURCE}.bfog + ;; + esac +fi +cd /tmp +} + +#/** +# ogCreateTorrent [ str_repo | int_ndisk int_npart ] Relative_path_file +#@brief Función para crear el fichero torrent. +#@param str_pathDirectory str_Relative_path_file +#@param int_disk int_partition str_Relative_path_file +#@param str_REPOSITORY(CACHE - LOCAL) str_Relative_path_file +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo. +#@note +#@version 0.1 - Integración para OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date +#@version 0.2 - Integración para btlaunch. +#@author Irina . Univesidad de Sevilla. +#@date +#*/ ## + +function ogCreateTorrent () +{ +# Variables locales. +local ARGS ARG SOURCE EXT IPTORRENT + + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_REPOSITORY] [int_ndisk int_npart] Relative_path_file IpBttrack" \ "$FUNCNAME 1 1 /aula1/winxp 10.1.15.23" \ + "$FUNCNAME REPO /aula1/winxp 10.1.15.45" + + return +fi + +# Error si se quiere crear el fichero en cache y no existe +[ "$1" != "CACHE" ] || `ogFindCache >/dev/null` || ogRaiseError $OG_ERR_NOTFOUND "CACHE"|| return $? + +case "$1" in + /*) # Camino completo. */ (Comentrio Doxygen) + SOURCE=$(ogGetPath "$1.img") + ARG=2 + ;; + [1-9]*) # ndisco npartición. + SOURCE=$(ogGetPath "$1" "$2" "$3.img") + ARG=4 + ;; + *) # Otros: repo, cache, cdrom (no se permiten caminos relativos). + EXT=$(ogGetImageType "$1" "$2") + SOURCE=$(ogGetPath "$1" "$2.$EXT") + ARG=3 + ;; +esac + +# Error si no se reciben los argumentos ARG necesarios según la opcion. +[ $# -eq "$ARG" ] || ogRaiseError $OG_ERR_FORMAT || return $? + + +# Error si no existe la imagen +[ $SOURCE ] || ogRaiseError $OG_ERR_NOTFOUND || return $? + +[ -r $SOURCE.torrent ] && mv "$SOURCE.torrent" "$SOURCE.torrent.ant" && echo "Esperamos que se refresque el servidor" && sleep 20 + +IPTORRENT="${!#}" +# Si ponemos el path completo cuando creamos el fichero torrent da error +cd `dirname $SOURCE` +echo ctorrent -t `basename $SOURCE` -u http://$IPTORRENT:6969/announce -s $SOURCE.torrent +ctorrent -t `basename $SOURCE` -u http://$IPTORRENT:6969/announce -s $SOURCE.torrent + +} + + +#/** +# ogUpdateCacheIsNecesary [ str_repo ] Relative_path_file_OGIMG_with_/ +#@brief Comprueba que el fichero que se desea almacenar en la cache del cliente, no esta. +#@param 1 str_REPO +#@param 2 str_Relative_path_file_OGIMG_with_/ +#@param 3 md5 to check: use full to check download image torrent +#@return 0 (true) cache sin imagen, SI es necesario actualizar el fichero. +#@return 1 (false) imagen en la cache, NO es necesario actualizar el fichero +#@return >1 (false) error de sintaxis (TODO) +#@note +#@todo: Proceso en el caso de que el fichero tenga el mismo nombre, pero su contenido sea distinto. +#@todo: Se dejan mensajes mientras se confirma su funcionamiento. +#@version 0.1 - Integracion para OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date +#@version 1.6 - gestiona ficheros hash full.sum (TORRENT) y .sum (MULTICAST) +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date +#*/ ## +function ogUpdateCacheIsNecesary () +{ +#echo "admite full check con 3param TORRENT" +# Variables locales. +local ERROR SOURCE CACHE FILESOURCE MD5SOURCE FILETARGET MD5TARGET +ERROR=0 + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME str_repo relative_path_image [protocol|FULL]" \ + "$FUNCNAME REPO /PS1_PH1.img UNICAST" \ + "$FUNCNAME REPO /ogclient.sqfs FULL" + + return +fi + +#Control de la cache +ogFindCache &>/dev/null || return $(ogRaiseError $OG_ERR_NOTCACHE; echo $?) + +#Control de parametros: ahora admite tres. +[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_repo relative_path_image [protocol|FULL]"; echo $?) + +ogCheckStringInGroup "$1" "REPO repo" || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) +FILESOURCE=`ogGetPath $1 $2` +[ -n "$FILESOURCE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) + +#echo "paso 1. si no existe la imagen, confirmar que es necesario actualizar la cache." +FILETARGET=`ogGetPath CACHE $2` +if [ -z "$FILETARGET" ] +then + # borramos el fichero bf del torrent, en el caso de que se hubiese quedado de algun proceso fallido + [ -n "$(ogGetPath CACHE "/$2.torrent.bf")" ] && ogDeleteFile CACHE "/$2.torrent.bf" &> /dev/null + [ -n "$(ogGetPath CACHE "/$2.sum")" ] && ogDeleteFile CACHE "/$2.sum" &> /dev/null + [ -n "$(ogGetPath CACHE "/$2.full.sum")" ] && ogDeleteFile CACHE "/$2.full.sum" &> /dev/null + echo "TRUE(0), es necesario actualizar. Paso 1, la cache no contiene esa imagen " + return 0 +fi + +#echo "Paso 2. Comprobamos que la imagen no estuviese en un proceso previo torrent" +if [ -n "$(ogGetPath "$FILETARGET.torrent.bf")" ]; then + #TODO: comprobar los md5 del fichero .torrent para asegurarnos que la imagen a descarga es la misma. + echo "TRUE(0), es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido" + return 0 +fi + +## En este punto la imagen en el repo y en la cache se llaman igual, +#echo "paso 4. Obtener los md5 del fichero imagen en la cacha segun PROTOCOLO $3" +case "${3^^}" in + FULL|TORRENT) + #Buscamos MD5 en el REPO SOURCE + if [ -f $FILESOURCE.full.sum ] + then + MD5SOURCE=$(cat $FILESOURCE.full.sum) + else + MD5SOURCE=$(ogCalculateFullChecksum $FILESOURCE) + fi + # Generamos el MD5 (full) en la CACHE + [ ! -f $FILETARGET.full.sum ] && ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum + MD5TARGET=$(cat $FILETARGET.full.sum) + # Generamos el MD5 (little) en la CACHE para posteriores usos del protocolo MULTICAST + [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum + ;; + *) + #Buscamos MD5 en el REPO SOURCE + if [ -f $FILESOURCE.sum ] + then + MD5SOURCE=$(cat $FILESOURCE.sum) + else + MD5SOURCE=$(ogCalculateChecksum $FILESOURCE) + fi + # Generamos el MD5 (little) en la CACHE + [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum + MD5TARGET=$(cat $FILETARGET.sum) + #Generamos o copiamos MD5 (full) en la CACHE para posteriores usos con Torrent + # Si no existe el full.sum y si existe el .sum es porque el upateCACHE multicast o unicast ha sido correcto. + if [ ! -f $FILETARGET.full.sum -a $FILETARGET.sum ] + then + if [ -f $FILESOURCE.full.sum ] + then + #Existe el .full.sum en REPO realizamos COPIA + cp $FILESOURCE.full.sum $FILETARGET.full.sum + else + #No existe .full.sum no en REPO LO GENERAMOS en la cache: situacion dificil que ocurra + ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum + fi + fi + +esac + +#echo "Paso 5. comparar los md5" +if [ "$MD5SOURCE" == "$MD5TARGET" ] +then + echo "FALSE (1), No es neceario actualizar. Paso5.A la imagen esta en cache" + return 1 +else + echo "imagen en cache distinta, borramos la imagen anterior" + rm -f $FILETARGET $FILETARGET.sum $FILETARGET.torrent $FILETARGET.full.sum + echo "TRUE (0), Si es necesario actualizar." + return 0 +fi +} + diff --git a/ogclient/lib/engine/bin/Registry.lib b/ogclient/lib/engine/bin/Registry.lib new file mode 100755 index 0000000..60f7124 --- /dev/null +++ b/ogclient/lib/engine/bin/Registry.lib @@ -0,0 +1,455 @@ +#!/bin/bash +#/** +#@file Registry.lib +#@brief Librería o clase Registry +#@class Boot +#@brief Funciones para gestión del registro de Windows. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +# Función ficticia para lanzar chntpw con timeout de 5 s., evitando cuelgues del programa. +function chntpw () +{ +local CHNTPW +CHNTPW=$(which drbl-chntpw) +CHNTPW=${CHNTPW:-$(which chntpw)} +timeout --foreground 5s $CHNTPW -e "$@" +} + + +#/** +# ogAddRegistryKey path_mountpoint str_hive str_keyname +#@brief Añade una nueva clave al registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_keyname nombre de la clave +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogAddRegistryKey () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Añadir nueva clave. +chntpw "$FILE" << EOT &> /dev/null +cd ${3%\\*} +nk ${3##*\\} +q +y +EOT +} + +#/** +# ogAddRegistryValue path_mountpoint str_hive str_valuename [str_valuetype] +#@brief Añade un nuevo valor al registro de Windows, indicando su tipo de datos. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@param str_valuetype tipo de datos del valor (opcional) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, COMPONENTS } +#@note valuetype = { STRING, BINARY, DWORD }, por defecto: STRING +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogAddRegistryValue () +{ +# Variables locales. +local FILE TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename [str_valuetype]" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' DWORD" + return +fi +# Error si no se reciben 3 o 4 parámetros. +[ $# == 3 -o $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? +case "${4^^}" in + STRING|"") TYPE=1 ;; + BINARY) TYPE=3 ;; + DWORD) TYPE=4 ;; + *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4" + return $? ;; +esac + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT &> /dev/null +cd ${3%\\*} +nv $TYPE ${3##*\\} +q +y +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogDeleteRegistryKey path_mountpoint str_hive str_keyname +#@brief Elimina una clave del registro de Windows con todo su contenido. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_keyname nombre de la clave +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@warning La clave debe estar vacía para poder ser borrada. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogDeleteRegistryKey () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Añadir nueva clave. +chntpw "$FILE" << EOT &> /dev/null +cd ${3%\\*} +dk ${3##*\\} +q +y +EOT +} + + +#/** +# ogDeleteRegistryValue path_mountpoint str_hive str_valuename +#@brief Elimina un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogDeleteRegistryValue () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT &> /dev/null +cd ${3%\\*} +dv ${3##*\\} +q +y +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogGetHivePath path_mountpoint [str_hive|str_user] +#@brief Función básica que devuelve el camino del fichero con una sección del registro. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@return str_path - camino del fichero de registro +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, COMPONENTS, NombreDeUsuario } +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#@version 1.1.0 - Soportar registro de un usuario local. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-10-14 +#*/ ## +function ogGetHivePath () +{ +# Variables locales. +local FILE HIVE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint [str_hive|str_user]" \ + "$FUNCNAME /mnt/sda1 SOFTWARE => /mnt/sda1/WINDOWS/System32/config/SOFTWARE" \ + "$FUNCNAME /mnt/sda1 user1 => /mnt/sda1/Users/user1/NTUSER.DAT" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Camino del fichero de registro de usuario o de sistema (de menor a mayor prioridad). +FILE="$(ogGetPath "/$1/Windows/System32/config/$2")" +[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/Users/$2/NTUSER.DAT")" +[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/winnt/system32/config/$2")" +[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/Documents and Settings/$2/NTUSER.DAT")" +[ -f "$FILE" ] && echo "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? +} + + +#/** +# ogGetRegistryValue path_mountpoint str_hive str_valuename +#@brief Devuelve el dato de un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@return str_valuedata - datos del valor. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-11 +#@version 1.1.0 - Soportar tipos BINARY (parejas hexadecimales separadas por espacio). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-09-28 +#*/ ## +function ogGetRegistryValue () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' ==> 1" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT 2> /dev/null | awk '/> Value/ {if (index($0, "REG_BINARY") > 0) + {data=""} + else + {getline; data=$0;} } + /^:[0-9A-F]+ / {data=data""substr($0, 9, 48);} + END {print data;}' +cd ${3%\\*} +cat ${3##*\\} +q +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogListRegistryKeys path_mountpoint str_hive str_key +#@brief Lista los nombres de subclaves de una determinada clave del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_key clave de registro +#@return str_subkey ... - lista de subclaves +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#*/ ## +function ogListRegistryKeys () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver la lista de claves de registro. +chntpw "$FILE" << EOT 2> /dev/null | awk 'BEGIN {FS="[<>]"} $1~/^ $/ {print $2}' +ls $3 +q +EOT +} + + +#/** +# ogListRegistryValues path_mountpoint str_hive str_key +#@brief Lista los nombres de valores de una determinada clave del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_key clave de registro +#@return str_value ... - lista de valores +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 1.0.1 - Nueva función. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-26 +#*/ ## +function ogListRegistryValues () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver la lista de claves de registro. +chntpw "$FILE" << EOT 2> /dev/null | awk 'BEGIN {FS="[<>]"} $1~/REG_/ {print $2}' +ls $3 +q +EOT +} + + +#/** +# ogSetRegistryValue path_mountpoint str_hive str_valuename str_valuedata +#@brief Establece el dato asociado a un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor de registro +#@param str_valuedata dato del valor de registro +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-24 +#@version 1.1.0 - Soportar tipos BINARY (parejas hexadecimales separadas por espacio). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-09-28 +#*/ ## +function ogSetRegistryValue () +{ +# Variables locales. +local FILE i n tmpfile + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\StringValue' \"Abcde Fghij\"" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\DwordValue' 1" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\BinaryValue' \"04 08 0C 10\"" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Fichero temporal para componer la entrada al comando "chntpw". +tmpfile=/tmp/chntpw$$ +trap "rm -f $tmpfile" 1 2 3 9 15 + +# Comprobar tipo de datos del valor del registro. +cat << EOT >$tmpfile +ls ${3%\\*} +q +EOT +if [ -n "$(chntpw "$FILE" < $tmpfile 2> /dev/null | grep "BINARY.*<${3##*\\}>")" ]; then + # Procesar tipo binario (incluir nº de bytes y líneas de 16 parejas hexadecimales). + [[ "$4 " =~ ^([0-9A-F]{2} )*$ ]] || ogRaiseError $OG_ERR_FORMAT "\"$4\"" || return $? + let n=${#4}+1 + cat << EOT >$tmpfile +cd ${3%\\*} +ed ${3##*\\} +$[n/3] +EOT + # Formato de líneas hexadecimales: :OFFSET XX YY ZZ ... (hasta 16 parejas). + for (( i=0; i> $tmpfile + done + echo -e "s\nq\ny" >> $tmpfile +else + # Cambiar el dato del valor de registro para cadenas y bytes. + cat << EOT >$tmpfile +cd ${3%\\*} +ed ${3##*\\} +$4 +q +y +EOT + +fi + +# Aplicar cambios. +chntpw "$FILE" < $tmpfile &> /dev/null +rm -f $tmpfile +} + + diff --git a/ogclient/lib/engine/bin/String.lib b/ogclient/lib/engine/bin/String.lib new file mode 100755 index 0000000..5774fe7 --- /dev/null +++ b/ogclient/lib/engine/bin/String.lib @@ -0,0 +1,122 @@ +#!/bin/bash + +#/** +# ogCheckStringInGroup +#@brief Función para determinar si el elemento pertenece a un conjunto +#@param 1 elemento a comprobar +#@param 2 grupo de elementos para comprobar tipo "valor1 valor2 valor3" +#@return 0 si pertenece al grupo +#@return 1 si NO pertenece al grupo +#@exception OG_ERR_FORMAT formato incorrecto. +#@note +#@todo +#@version 0.91 - Definición de +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## + +function ogCheckStringInGroup () +{ +local i +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME str_elemento str_grupo" \ + "$FUNCNAME full-duplex \"full-duplex half-duplex broadcast\" " + return +fi + +# Error si no se recibe 2 parámetro. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + + +for i in `echo $2` +do + if [ "$1" == "$i" ] + then + return 0 + fi +done + +return 1 +} + +#/** +# ogCheckStringInReg +#@brief Función para determinar si el elemento contiene una "expresión regular" +#@param 1 elemento a comprobar +#@param 2 expresión regular" +#@return 0 si coincide con la expresión +#@return 1 si NO coincide con la expresión +#@exception OG_ERR_FORMAT formato incorrecto. +#@note +#@todo +#@version 0.91 - Definición de +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## + +function ogCheckStringInReg() +{ + +local REG + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME str_elemento str_expresión_regular" \ + "$FUNCNAME 50M \"^[0-9]{1,2}\M$\" " + return +fi + +# Error si no se recibe 2 parámetro. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +REG=$2 +[[ $1 =~ $REG ]] && return 0 || return 1 +} + + + +#/** +# ogCheckIpAddress +#@brief Función para determinar si una cadena es una dirección ipv4 válida +#@param 1 string de la ip a comprobar +#@return 0 si es una dirección válida +#@return 1 si NO es una dirección válida +#@exception OG_ERR_FORMAT formato incorrecto. +#@note +#@todo +#@version 0.91 - Definición de +#@author Antonio Doblas Viso, Universidad de Málaga +#@date 2010/05/09 +#*/ ## + +function ogCheckIpAddress() +{ +local REG IP arrIP + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME str_IpAddressToCheck" \ + "$FUNCNAME 192.18.35.3" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + + +IP=$1 +REG="^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" +if [[ "$IP" =~ $REG ]] +then + OIFS=$IFS; + IFS='.' ; + arrIP=($IP) + IFS=$OIFS + if [[ ${arrIP[0]} -le 255 && ${arrIP[1]} -le 255 && ${arrIP[2]} -le 255 && ${arrIP[3]} -le 255 ]] + then + return 0 + fi +fi +return 1 +} diff --git a/ogclient/lib/engine/bin/System.lib b/ogclient/lib/engine/bin/System.lib new file mode 100755 index 0000000..5124ce1 --- /dev/null +++ b/ogclient/lib/engine/bin/System.lib @@ -0,0 +1,339 @@ +#!/bin/bash +#/** +#@file System.lib +#@brief Librería o clase System +#@class System +#@brief Funciones básicas del sistema. +#@version 1.1.0 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogEcho [str_logtype ...] [str_loglevel] "str_message" ... +#@brief Muestra mensajes en consola y lo registra en fichero de incidencias. +#@param str_logtype tipo de registro de incidencias. +#@param str_loglevel nivel de registro de incidencias. +#@param str_message mensaje (puede recibir más de 1 parámetro. +#@return Mensaje mostrado. +#@warning Si no se indica nivel de registro, solo muestra mensaje en pantalla. +#@warning Si DEBUG="no", no se registran mensajes de error. +#@note logfile = { log, command, session }; usa "log" si se indica nivel de registro. +#@note loglevel = { help, info, warning, error } +#@note El nivel de ayuda \c (help) no se registra en el fichero de incidencias. +#@version 0.9 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-23 +#@version 1.0.5 - Elegir fichero de log. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-03-17 +#@version 1.1.0 - Posibilidad de no registrar mensajes en ficheros. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2015-11-10 +#*/ +function ogEcho () { + +# Variables locales +local CONT=1 LOGS LOGLEVEL DATETIME + +# Selección de ficheros de rgistro de incidencias. +while [ $CONT ]; do + case "${1,,}" in + log) LOGS="$LOGS $OGLOGFILE"; shift ;; + command) LOGS="$LOGS $OGLOGCOMMAND"; shift ;; + session) LOGS="$LOGS $OGLOGSESSION"; shift ;; + *) CONT= ;; + esac +done + +# Selección del nivel de registro (opcional). +case "${1,,}" in + help) shift ;; + info) LOGLEVEL="$1"; shift ;; + warning) LOGLEVEL="$1"; shift ;; + error) LOGLEVEL="$1"; shift ;; + *) ;; +esac + +if [ -n "$LOGLEVEL" ]; then + DATETIME=$(date +"%F %T") + # Registrar mensajes en fichero de log si la depuración no está desactivada. + [ "${DEBUG,,}" != "no" ] && LOGS="$OGLOGFILE $LOGS" + echo "OpenGnsys $LOGLEVEL" "$DATETIME $*" 2>&1 | tee -a $LOGS +else + echo "$*" | tee -a $LOGS +fi +} + + +#/** +# ogExecAndLog str_logfile ... str_command ... +#@brief Ejecuta un comando y guarda su salida en fichero de registro. +#@param str_logfile fichero de registro (pueden ser varios). +#@param str_command comando y comandos a ejecutar. +#@return Salida de ejecución del comando. +#@note str_logfile = { LOG, SESSION, COMMAND } +#@version 1.0.6 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-07-02 +#*/ +function ogExecAndLog () { + +# Variables locales +local ISCOMMAND ISLOG ISSESSION COMMAND CONTINUE=1 FILES REDIREC + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME str_logfile ... str_command ..." \ + "$FUNCNAME COMMAND ls -al /" + return +fi + +# Procesar parámetros. +while [ $CONTINUE ]; do + case "${1,,}" in + command) ISCOMMAND=1; shift ;; + log) ISLOG=1; shift ;; + session) ISSESSION=1; shift ;; + *) COMMAND="$@" + CONTINUE= ;; + esac +done +# Error si no se recibe un comando que ejecutar. +[ -n "$COMMAND" ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Componer lista de ficheros de registro. +if [ $ISCOMMAND ]; then + FILES="$OGLOGCOMMAND" + > $FILES + REDIREC="2>&1" +fi +[ $ISLOG ] && FILES="$FILES $OGLOGFILE" +[ $ISSESSION ] && FILES="$FILES $OGLOGSESSION" + +# Ejecutar comando. +eval $COMMAND $REDIREC | tee -a $FILES +# Salida de error del comando ejecutado. +return ${PIPESTATUS[0]} +} + + +#/** +# ogGetCaller +#@brief Devuelve nombre del programa o script ejecutor (padre). +#@param No. +#@return str_name - Nombre del programa ejecutor. +#@version 0.10 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-01-17 +#*/ +function ogGetCaller () { + +# Obtener el nombre del programa o del script que ha llamado al proceso actual. +basename "$(COLUMNS=200 ps hp $PPID -o args | \ + awk '{if ($1~/bash/ && $2!="") { print $2; } + else { sub(/^-/,"",$1); print $1; } }')" +} + + +#/** +# ogHelp ["str_function" ["str_format" ["str_example" ... ]]] +#@brief Muestra mensaje de ayuda para una función determinda. +#@param str_function Nombre de la función. +#@param str_format Formato de ejecución de la función. +#@param str_example Ejemplo de ejecución de la función. +#@return str_help - Salida de ayuda. +#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME +#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas. +#@note Pueden especificarse varios mensajes con ejemplos. +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-27 +#*/ +function ogHelp () { + +# Variables locales. +local FUNC MSG + +# Mostrar función, descripción y formato. +FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}" +MSG="MSG_HELP_$FUNC" +ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}" +[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2" +# Mostrar ejemplos (si existen). +shift 2 +while [ $# -gt 0 ]; do + ogEcho help " $MSG_EXAMPLE: $1" + shift +done +} + + +#/** +# ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...] +#@brief Devuelve el mensaje y el código de error correspondiente. +#@param str_logtype tipo de registro de incidencias. +#@param int_errcode código de error. +#@param str_errmessage mensajes complementarios de error. +#@return str_message - Mensaje de error, incluyendo las funciones relacionadas. +#@warning No definidas +#@note Mensajes internacionales del fichero de idiomas. +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-21 +#@version 1.0.5 - Muestra en el mensaje todas las funciones relacionadas (separadas por <-). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-03-17 +#*/ +function ogRaiseError () { + +# Variables locales +local CONT=1 LOGS MSG CODE FUNCS + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_logfile ...] int_errorcode str_errormessage" + return +fi + +# Selección de rgistros de incidencias. +while [ $CONT ]; do + case "${1,,}" in + log|command|session) LOGS="$LOGS $1"; shift ;; + *) CONT= ;; + esac +done + +# Obtener código y mensaje de error. +CODE="$1" +case "$CODE" in + $OG_ERR_FORMAT) MSG="$MSG_ERR_FORMAT \"$2\"" ;; + $OG_ERR_NOTFOUND) MSG="$MSG_ERR_NOTFOUND \"$2\"" ;; + $OG_ERR_OUTOFLIMIT) MSG="$MSG_ERR_OUTOFLIMIT \"$2\"" ;; + $OG_ERR_PARTITION) MSG="$MSG_ERR_PARTITION \"$2\"" ;; + $OG_ERR_LOCKED) MSG="$MSG_ERR_LOCKED \"$2\"" ;; + $OG_ERR_CACHE) MSG="$MSG_ERR_CACHE \"$2\"" ;; + $OG_ERR_NOGPT) MSG="$MSG_ERR_NOGPT \"$2\"" ;; + $OG_ERR_REPO) MSG="$MSG_ERR_REPO \"$2\"" ;; + $OG_ERR_FILESYS) MSG="$MSG_ERR_FILESYS \"$2\"" ;; + $OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;; + $OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;; + $OG_ERR_NOTEXEC) MSG="$MSG_ERR_NOTEXEC \"$2\"" ;; + $OG_ERR_NOTWRITE) MSG="$MSG_ERR_NOTWRITE \"$2\"" ;; + $OG_ERR_NOTCACHE) MSG="$MSG_ERR_NOTCACHE \"$2\"" ;; + $OG_ERR_CACHESIZE) MSG="$MSG_ERR_CACHESIZE \"$2\"" ;; + $OG_ERR_REDUCEFS) MSG="$MSG_ERR_REDUCEFS \"$2\"" ;; + $OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;; + $OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;; + $OG_ERR_UPDATECACHE) MSG="$MSG_ERR_UPDATECACHE \"$2\"" ;; + $OG_ERR_DONTFORMAT) MSG="$MSG_ERR_DONTFORMAT \"$2\"" ;; + $OG_ERR_IMAGEFILE) MSG="$MSG_ERR_IMAGEFILE \"$2\"" ;; + $OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;; + $OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;; + $OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;; + $OG_ERR_UCASTRECEIVERPARTITION) MSG="$MSG_ERR_UCASTRECEIVERPARTITION \"$2\"" ;; + $OG_ERR_UCASTRECEIVERFILE) MSG="$MSG_ERR_UCASTRECEIVERFILE \"$2\"" ;; + $OG_ERR_MCASTSYNTAXT) MSG="$MSG_ERR_MCASTSYNTAXT \"$2\"" ;; + $OG_ERR_MCASTSENDFILE) MSG="$MSG_ERR_MCASTSENDFILE \"$2\"" ;; + $OG_ERR_MCASTRECEIVERFILE) MSG="$MSG_ERR_MCASTRECEIVERFILE \"$2\"" ;; + $OG_ERR_MCASTSENDPARTITION) MSG="$MSG_ERR_MCASTSENDPARTITION \"$2\"" ;; + $OG_ERR_MCASTRECEIVERPARTITION) MSG="$MSG_ERR_MCASTRECEIVERPARTITION \"$2\"" ;; + $OG_ERR_PROTOCOLJOINMASTER) MSG="$MSG_ERR_PROTOCOLJOINMASTER \"$2\"" ;; + $OG_ERR_DONTMOUNT_IMAGE) MSG="$MSG_ERR_DONTMOUNT_IMAGE \"$2\"" ;; + $OG_ERR_DONTUNMOUNT_IMAGE) MSG="$MSG_ERR_DONTUNMOUNT_IMAGE \"$2\"" ;; + $OG_ERR_DONTSYNC_IMAGE) MSG="$MSG_ERR_DONTSYNC_IMAGE \"$2\"" ;; + $OG_ERR_NOTDIFFERENT) MSG="$MSG_ERR_NOTDIFFERENT \"$2\"" ;; + $OG_ERR_SYNCHRONIZING) MSG="$MSG_ERR_SYNCHRONIZING \"$2\"" ;; + $OG_ERR_NOTUEFI) MSG="$MSG_ERR_NOTUEFI \"$2\"" ;; + $OG_ERR_NOMSDOS) MSG="$MSG_ERR_NOMSDOS \"$2\"" ;; + $OG_ERR_NOTBIOS) MSG="$MSG_ERR_NOTBIOS \"$2\"" ;; + *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;; +esac + +# Obtener lista de funciones afectadas, incluyendo el script que las llama. +FUNCS="${FUNCNAME[@]:1}" +FUNCS="${FUNCS/main/$(basename $0 2>/dev/null)}" + +# Mostrar mensaje de error si es función depurable y salir con el código indicado. +if [ $CODE == $OG_ERR_FORMAT ] || ogCheckStringInGroup "$FUNCS" "$NODEBUGFUNCTIONS" || ! ogCheckStringInGroup "${FUNCS%% *}" "$NODEBUGFUNCTIONS"; then + ogEcho $LOGS error "${FUNCS// /<-}: $MSG" >&2 +fi +return $CODE +} + + +#/** +# ogIsRepoLocked +#@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos). +#@param No. +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. +#@version 0.10 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-01-17 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#*/ +function ogIsRepoLocked () +{ +# Variables locales. +local f FILES + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" "if $FUNCNAME; then ...; fi" + return +fi + +# No hacer nada, si no está definido el punto de montaje del repositorio. +[ -z "$OGIMG" ] && return 1 + +# Comprobar si alguno de los ficheros abiertos por los procesos activos está en el +# punto de montaje del repositorio de imágenes. +FILES=$(for f in /proc/[0-9]*/fd/*; do readlink -f "$f"; done | grep "^$OGIMG") # */ (comentario Doxygen) +test -n "$FILES" +} + + +function ogCheckProgram () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME \"str_program ...\"" \ + "$FUNCNAME \"partimage partclone mbuffer\"" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +local PERROR PLOG i +PERROR=0 +PLOG=" " +for i in `echo $1` +do + if [ ! `which $i` ] + then + PERROR=1 + PLOG="$PLOG $i" + fi +done +if [ "$PERROR" == "1" ] +then + ogRaiseError $OG_ERR_NOTEXEC "$PLOG" || return $? +else + return 0 +fi +} + + + +#### PRUEBA +function ogIsVirtualMachine() { +case "$(dmidecode -s system-product-name)" in + KVM|VirtualBox) + return 1 ;; + *) return 0 ;; +esac +} + diff --git a/ogclient/lib/engine/bin/UEFI.lib b/ogclient/lib/engine/bin/UEFI.lib new file mode 100755 index 0000000..f7fe367 --- /dev/null +++ b/ogclient/lib/engine/bin/UEFI.lib @@ -0,0 +1,679 @@ +#!/bin/bash +# Libreria provisional para uso de UEFI +# Las funciones se incluirán las librerías ya existentes + +#/** +# ogNvramActiveEntry +#@brief Activa entrada de la NVRAM identificada por la etiqueta o el orden +#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar. +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#*/ ## +function ogNvramActiveEntry () { +local NUMENTRY + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \ + "$FUNCNAME 2" \ + "$FUNCNAME \"Windows Boot Manager\"" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Distingo si es número de orden o etiqueta +if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then + NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}') +else + NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}') +fi + +[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'") + +efibootmgr -a -b $NUMENTRY &>/dev/null +} + +#/** +# ogNvramAddEntry +#@brief Crea nueva entrada en el gestor de arranque (NVRAM), opcionalmente la incluye al final del orden de arranque. +#@param Str_Label_entry Número de disco o etiqueta de la entrada a crear. +#@param Str_BootLoader Número de partición o cargador de arranque. +#@param Bool_Incluir_Arranque Incluir en el orden de arranque (por defecto FALSE) (opcional) +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#*/ ## +function ogNvramAddEntry () { +local EFIDISK EFIPART BOOTLABEL BOOTLOADER ADDORDER + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME Str_label_entry Str_boot_loader [ Bool_add_bootorder ]" \ + "$FUNCNAME 1 2 TRUE" \ + "$FUNCNAME grub /EFI/grub/grubx64.efi TRUE" \ + "$FUNCNAME Windows /EFI/Microsoft/Boot/bootmgfw.efi" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Str_label_entry Str_boot_locader" || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +read -e EFIDISK EFIPART <<<"$(ogGetEsp)" +[ -n "$EFIPART" ] || ogRaiseError $OG_ERR_NOTFOUND "ESP" || return $? + +# Recogemos parámetros +# Distinguimos si es disco/partición o etiqueta/cargador +if [[ "$1$2" =~ ^([0-9]+)$ ]]; then + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + BOOTLOADER="/EFI/$BOOTLABEL/Boot/ogloader.efi" +else + BOOTLABEL="$1" + BOOTLOADER="$2" +fi + + +# Si existe entrada con la misma etiqueta la borramos +ogNvramDeleteEntry "$BOOTLABEL" 2>/dev/null + +efibootmgr -C -d $(ogDiskToDev $EFIDISK) -p $EFIPART -L "$BOOTLABEL" -l "$BOOTLOADER" &>/dev/null + +# Incluimos la entrada en el orden de arranque (opcional) +if [ "${3^^}" == "TRUE" ]; then + NUMENTRY=$(efibootmgr |awk -v LABEL="$BOOTLABEL" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}') + ogNvramSetOrder $(ogNvramGetOrder |tr , " ") $NUMENTRY +fi +} + + +#/** +# ogCopyEfiBootLoader int_ndisk str_repo path_image +#@brief Copia el cargador de arranque desde la partición EFI a la de sistema. +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@note Si existe el cargador en la partición de sistema no es válido +#*/ ## +function ogCopyEfiBootLoader () { +# Variables locales +local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ + "$FUNCNAME 1 2" + return +fi + +# Error si no se reciben 2 arámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? + +# Comprobamos que exista partición de sistema y la ESP +MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? +EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? + +# Comprobamos que exista el cargador +BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) +OSVERSION=$(ogGetOsVersion $1 $2) +case $OSVERSION in + *Windows\ 10*) + for f in $EFIDIR/EFI/{Microsoft,$BOOTLABEL}/Boot/bootmgfw.efi; do + [ -r $f ] && LOADER=$f + done + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? + # Si existe el directorio Boot lo borramos + [ -d $MNTDIR/ogBoot ] && rm -rf $MNTDIR/ogBoot + DIRLOADER=$(realpath "${LOADER%/*}/..") + cp -r ${DIRLOADER}/Boot $MNTDIR/ogBoot + ;; +esac +} + + +#/** +# ogNvramDeleteEntry +#@brief Borra entrada de la NVRAM identificada por la etiqueta o el orden +#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar. +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada en NVRAM). +#*/ ## +function ogNvramDeleteEntry () { +local NUMENTRY n + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \ + "$FUNCNAME 2" \ + "$FUNCNAME \"Windows Boot Manager\"" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Distingo si es número de orden o etiqueta +if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then + NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}') +else + NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}') +fi + +[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'") + +for n in $NUMENTRY; do + efibootmgr -B -b $n &>/dev/null +done +} + + +#/** +# ogNvramGetCurrent +#@brief Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo. +#@return Entrada con la que se ha iniciado el equipo +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramGetCurrent () { + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +efibootmgr| awk -v bootentry=99999 '{if ($1~/BootCurrent/) bootentry=$2; if ($1~bootentry) printf "%s %s %s\n", gensub(/^0{1,3}/,"",1,substr($1,5,4))," ", substr($0, index($0,$2))}' +} + + +# ogNvramGetNext +#@brief Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque. +#@return Entrada que se utilizará en el próximo arranque +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramGetNext () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +efibootmgr|awk '{ if ($1 == "BootNext:") print $2}' +} + + +# ogNvramGetOrder +#@brief Muestra el orden de las entradas del gestor de arranque (NVRAM) +#@return Orden de las entradas +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramGetOrder () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +efibootmgr|awk '{ if ($1 == "BootOrder:") print $2}' +} + + +#/** +# ogNvramGetTimeout +#@brief Muestra el tiempo de espera del gestor de arranque (NVRAM) +#@return Timeout de la NVRAM +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramGetTimeout () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +efibootmgr|awk '{ if ($1 == "Timeout:") print substr($0, index($0,$2))}' +} + + +#/** +# ogGrubUefiConf int_ndisk int_part str_dir_grub +#@brief Genera el fichero grub.cfg de la ESP +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@param str_dir_grub prefijo del directorio de grub en la partición de sistema. ej: /boot/grubPARTITION +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@TODO Confirmar si el fichero "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" es necesario. +#*/ ## +function ogGrubUefiConf () { +local EFIDIR BOOTLABEL GRUBEFI UUID DEVICE PREFIXSECONDSTAGE EFIGRUBDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" \ + "$FUNCNAME 1 2" \ + "$FUNCNAME 1 3 /boot/grubPARTITION" + return +fi + +# Error si no se reciben al menos 2 parámetros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" || return $? + +# Directorio del grub en la partición de sistema +PREFIXSECONDSTAGE="$3" + +EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? +BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) +EFIGRUBDIR="$EFIDIR/EFI/$BOOTLABEL/boot/grub" +# Comprobamos que existe directorio +[ -d "$EFIGRUBDIR" ] || mkdir -p "$EFIGRUBDIR" +# Parcheamos uuid y particion en grub.cfg +UUID=$(blkid -o value -s UUID $(ogDiskToDev $1 $2)) +DEVICE="hd$(expr $1 - 1 ),gpt$2" + +cat << EOT > $EFIGRUBDIR/grub.cfg +set root='$DEVICE' +set prefix=(\$root)'${PREFIXSECONDSTAGE}/boot/grub' +configfile \$prefix/grub.cfg +EOT + +# Provisional: confirmar si el segundo archivo se utiliza +cp $EFIGRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" +} + + +#/** +# ogNvramInactiveEntry +#@brief Inactiva entrada de la NVRAM identificada por la etiqueta o el orden +#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar. +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramInactiveEntry () { +local NUMENTRY + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \ + "$FUNCNAME 2" \ + "$FUNCNAME \"Windows Boot Manager\"" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Distingo si es número de orden o etiqueta +if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then + NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}') +else + NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}') +fi + +[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'") + +efibootmgr -A -b $NUMENTRY &>/dev/null +} + + +#/** +# ogNvramList +#@brief Lista las entradas de la NVRAN (sólo equipos UEFI) +#@return Entradas de la NVRAM con el formato: orden etiqueta [* (si está activa) ] +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramList () { + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +efibootmgr |awk '{if($1~/Boot[[:digit:]]/) ; active="" ;if ($1~/*/) active="*"; if($1~/Boot[[:digit:]]/) printf "%4s %s %s %s\n", gensub(/^0{1,3}/,"",1,substr($1,5,4))," ", substr($0, index($0,$2)), active}' +} + + +#/** +# ogNvramPxeFirstEntry +#@brief Sitúa la entrada de la tarjeta de red en el primer lugar en la NVRAM. +#@return (nada) +#@exception OG_ERR_NOTUEFI UEFI no activa. +#*/ ## +function ogNvramPxeFirstEntry (){ +local NUMENTRY ORDER + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME" \ + "$FUNCNAME" + return +fi + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +NUMENTRY=$(printf %04X 0x$(efibootmgr|awk '/IP[vV]{0,1}4/ {print gensub(/^0{1,3}/,"",1,substr($1,5,4))}')) + +# Si la entrada es la primera nos salimos. +[[ $(ogNvramGetOrder) =~ ^$NUMENTRY ]] && return + +# Si la entrada ya existe la borramos. +ORDER="$NUMENTRY $(ogNvramGetOrder| sed -e s/$NUMENTRY//g -e s/,/' '/g)" + +ogNvramSetOrder $ORDER +} + + +#/** +# ogRestoreEfiBootLoader int_ndisk str_repo +#@brief Copia el cargador de arranque de la partición de sistema a la partición EFI. +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI). +#@exception OG_ERR_NOTOS sin sistema operativo. +#*/ ## +function ogRestoreEfiBootLoader () { +# Variables locales +local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f UUID DEVICE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ + "$FUNCNAME 1 2" + return +fi + +# Error si no se reciben 2 arámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? + +# Comprobamos que exista partición de sistema y la ESP +MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? +EFIDIR=$(ogMount $(ogGetEsp)) +if [ "$EFIDIR" == "" ]; then + ogFormat $(ogGetEsp) FAT32 + EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? +fi + +# Comprobamos que exista el cargador +#BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) +OSVERSION=$(ogGetOsVersion $1 $2) +case $OSVERSION in + *Windows\ 10*) + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + LOADER=$(ogGetPath $MNTDIR/ogBoot/bootmgfw.efi) + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? + [ -r $EFIDIR/EFI/$BOOTLABEL ] && rm -rf $EFIDIR/EFI/$BOOTLABEL + mkdir -p $EFIDIR/EFI/$BOOTLABEL + cp -r "${LOADER%/*}" $EFIDIR/EFI/$BOOTLABEL/Boot + # Nombre OpenGnsys para cargador + cp $LOADER $EFIDIR/EFI/$BOOTLABEL/Boot/ogloader.efi + + # Si existe subcarpeta Microsoft en la partición EFI la renombramos + [ "$(ogGetPath $EFIDIR/EFI/Microsoft)" == "" ] || mv $EFIDIR/EFI/{Microsoft,Microsoft.backup.og} + ;; +esac +} + + +#/** +# ogRestoreUuidPartitions +#@brief Restaura los uuid de las particiones y la tabla de particiones +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param REPO|CACHE repositorio +#@param str_imgname nombre de la imagen +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid) +#*/ ## +function ogRestoreUuidPartitions () { +local DISK PART IMGNAME INFOFILE DEVICE DATA GUID UUID IMGGUID +local EFIDEVICE EFIDATA EFIGUID EFIUUID EFIUUID IMGEFIGUID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" \ + "$FUNCNAME REPO Windows 1 2" + return +fi +# Error si no se reciben 4 parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" || return $? + +# Sólo se ejecuta si es UEFI +ogIsEfiActive || return + +# Parámetros de entrada +IMGNAME="$2" +INFOFILE="$OGIMG/.$IMGNAME.img.json" +[ "${1^^}" == "CACHE" ] && INFOFILE="$OGCAC$INFOFILE" +# TODO: que la función getPath soporte archivos ocultos +ls $INFOFILE &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "$INFOFILE" || return $? +DISK=$3 +PART=$4 + +DEVICE=$(ogDiskToDev $DISK) +read -e EFIDISK EFIPART <<<"$(ogGetEsp)" + +# Datos de la imagen +IMGGUID=$(jq .guid $INFOFILE|tr -d \") +IMGEFIGUID=$(jq .espguid $INFOFILE|tr -d \") + +# Datos actuales +DATA=$(sfdisk -J $DEVICE) +GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") + +if [ "$IMGGUID" != "$GUID" ]; then + echo sgdisk -U "$IMGGUID" "$DEVICE" + sgdisk -U "$IMGGUID" "$DEVICE" + partprobe +fi + +if [ $DISK -eq $EFIDISK ]; then + EFIDATA=$DATA + EFIDEVICE=$DEVICE +else + EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $? + EFIDATA=$(sfdisk -J $EFIDEVICE) + EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") + if [ "$IMGEFIGUID" != "$EFIGUID" ]; then +echo sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" + sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" + partprobe + fi +fi +} + + +#/** +# ogNvramSetNext +#@brief Configura el próximo arranque con la entrada del gestor de arranque (NVRAM) identificada por la etiqueta o el orden. +#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar. +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#*/ ## +function ogNvramSetNext () { +local NUMENTRY + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \ + "$FUNCNAME 2" \ + "$FUNCNAME \"Windows Boot Manager\"" + return +fi + +# Error si no se recibe 1 parámetro. +[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Distingo si es número de orden o etiqueta +if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then + NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}') +else + NUMENTRY=$(efibootmgr | awk -v LABEL="$1" '$0 ~ LABEL { print substr($1,5,4) }') +fi + +[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'") + +efibootmgr -n $NUMENTRY &>/dev/null +} + +#/** +# ogNvramSetOrder +#@brief Configura el orden de las entradas de la NVRAM +#@param Orden de las entradas separadas por espacios +#@return (nada) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTUEFI UEFI no activa. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada NVRAM). +#*/ ## +function ogNvramSetOrder () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME Num_order1 [ Num_order2 ] ... " \ + "$FUNCNAME 1 3" + return +fi +# +# Error si no se recibe al menos 1 parámetro. +[ $# -ge 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Num_order1 [ Num_order2 ] ..." || return $? + +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Comprobamos que sean números +[[ "$@" =~ ^([0-9a-fA-F ]+)$ ]] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Num_order1 [ Num_order2 ] ..." || return $? + +# Entradas de la NVRAM actuales +NUMENTRYS=$(efibootmgr|awk '{ if ($1~/Boot[0-9a-fA-F]{4}/) printf "0%s ", substr($1,5,4)}') + +ORDER="" +for ARG in $@; do + # Si no existe la entrada me salgo + ARG=$(printf %04X 0x$ARG) + echo $NUMENTRYS | grep "$ARG" &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry order \"$ARG\"" || return $? + ORDER=${ORDER},$ARG +done + +# Cambiamos el orden +efibootmgr -o ${ORDER#,} &>/dev/null +} + + +#/** +# ogNvramSetTimeout +#@brief Configura el tiempo de espera de la NVRAM +#@param Orden de las entradas separadas por espacios +#@return (nada) + +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#*/ ## +function ogNvramSetTimeout () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_Timeout (seg)" \ + "$FUNCNAME 2" + return +fi +# +# Si no es equipo UEFI salir con error +ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $? + +# Error si no se recibe 1 parámetro. +[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_Timeout (seg)" || return $? + +# Comprobamos que sea un número +[[ "$1" =~ ^([0-9 ]+)*$ ]] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_Timeout (seg)" || return $? + +# Cambiamos el orden +efibootmgr -t $1 &>/dev/null +} + + +#/** +# ogUuidChange int_ndisk str_repo +#@brief Reemplaza el UUID de un sistema de ficheros. +#@param int_ndisk nº de orden del disco +#@param int_part nº de partición +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. +#*/ ## +function ogUuidChange () { +local MNTDIR DEVICE UUID NEWUUID f + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ + "$FUNCNAME 1 2" + return +fi + +# Error si no se reciben al menos 2 parámetros. +[ $# -eq 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? + +# Comprobamos que exista la partición +MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_NOTFOUND "Device $1 $2" || return $? +DEVICE=$(ogDiskToDev $1 $2) +UUID=$(blkid -o value -s UUID $DEVICE) +NEWUUID=$(cat /proc/sys/kernel/random/uuid) + +# Cambiamos UUID a la partición +ogUnmount $1 $2 +tune2fs $DEVICE -U $NEWUUID + +# Cambiamos UUID en la configuración (fstab y grub) +ogMount $1 $2 +for f in $MNTDIR/etc/fstab $MNTDIR/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg}; do + [ -r $f ] && sed -i s/$UUID/$NEWUUID/g $f +done +} diff --git a/ogclient/lib/engine/tests/Modify/Cache.shtest b/ogclient/lib/engine/tests/Modify/Cache.shtest new file mode 100644 index 0000000..de7ab66 --- /dev/null +++ b/ogclient/lib/engine/tests/Modify/Cache.shtest @@ -0,0 +1,93 @@ +Test de comprobacion de la librería Cache.lib y los script relacionados +======================================================================= +Este test destruye la cache +Necesita que las particiones sean tres como máximo +================================================= + +$ ogUnmountCache 2>/dev/null ; df|grep cache + + +$ ogCreateCache 10000000 1>/dev/null 2>&1 + +$ AUX=$(ogListPartitions 1) ; echo ${AUX##*CACHE:} | sed s/\ .*\$//g +10000000 + +# Comprobamos que no esta formateada +$ ogCheckFs 1 4 +OpenGnsys error: ogCheckFs: "1, 4, CACHE" + +$ ogFormatCache|tail -1 +ReiserFS is successfully created on /dev/sda4. + +$ ogMountCache +/opt/opengnsys/cache + +$ echo $OGCAC +/opt/opengnsys/cache + +$ touch $OGCAC$OGIMG/lll +$ ls $OGCAC$OGIMG +lll + +$ rm $OGCAC$OGIMG/lll + +$ ogFindCache +1 4 + +$ ogGetCacheSize +10000000 + + +$ ogDeleteCache >/dev/null 2>&1 +$ ogFindCache + +$ initCache 2000000 1>/dev/null 2>&1 +$ touch $OGCAC$OGIMG/lll +$ ls $OGCAC$OGIMG +lll + +$ rm $OGCAC$OGIMG/lll + +#################################################33 +# No permite unicast +#################################################33 +#$ echo ooo > $OGCAC$OGIMG/_test_.img +#$ echo jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj > $OGIMG/_test_.img +#$ touch $OGIMG/_test_.torrent +#$ updateCache REPO _test_ UNICAST + + +Comprobamos los errores de las entradas de datos +================================================ +$ ogCreateCache +OpenGnsys error: ogCreateCache: "" + +$ ogCreateCache -1 +OpenGnsys error: ogCreateCache: "-1" + +$ ogCreateCache 0 +OpenGnsys error: ogCreateCache: "0" + +# cuando se está usando la cuarta partitión no debe crearse la cache +#$ ogCreatePartition 1 NTFS:200000 EXT3:2000000 EXT3:2000000 NTFS:30000000 +#$ ogListPartitions 1 +#NTFS:200000 EXT3:2000000 EXT3:2000000 EXTENDED:20000000 LINUX-SWAP:199999 +#$ ogCreateCache 1000000 +#$ ogFindCache + + +# si hay cache no podemos +$ ogDeleteCache 1>/dev/null 2>&1 +$ ogCreatePartitions 1 NTFS:200000 EXT3:2000000 EXT3:2000000 1>/dev/null 2>&1 +$ ogCreateCache 1000000 1>/dev/null 2>&1 +$ ogCreatePartitions 1 NTFS:200000 EXT2:2000000 EXT2:2000000 LINUX-SWAP:200000 1>/dev/null 2>&1; echo $? +1 + +FALTA +==== +ogGetCacheSpace +updateCache + +Error +===== +Al crear la cache no se comprueba si existe una cuarta particion. La machaca diff --git a/ogclient/lib/engine/tests/NoModify/File1.shtest b/ogclient/lib/engine/tests/NoModify/File1.shtest new file mode 100644 index 0000000..0bb4d69 --- /dev/null +++ b/ogclient/lib/engine/tests/NoModify/File1.shtest @@ -0,0 +1,75 @@ +Test de compribación de la libreria File No modifica nada +======================================== +Este test NECESITA LA CACHE + +Comprobamos que existe CACHE +$ ls -d $OGCAC$OGIMG # Este test NECESITA LA CACHE ############################## +/opt/opengnsys/cache/opt/opengnsys/images + + +$ ogMakeDir CACHE prueba +$ ls -d $OGCAC$OGIMG/prueba +/opt/opengnsys/cache/opt/opengnsys/images/prueba + +$ touch $OGCAC$OGIMG/fichero_prueba +$ ogCopyFile CACHE fichero_prueba CACHE prueba +$ ls $OGCAC$OGIMG/prueba +fichero_prueba + +$ ogGetPath CACHE fichero_prueba +/opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba + +# Si no existe el fichero +$ ogGetPath CACHE fichero_prueba3; echo $? +1 + +$ ogGetParentPath CACHE fichero_prueba +/opt/opengnsys/cache/opt/opengnsys/images + +# si el fichero no existe +$ ogGetParentPath CACHE prueba/fichero_prueba3q23 +/opt/opengnsys/cache/opt/opengnsys/images/prueba + +# Si dir padre no existe +$ ogGetParentPath CACHE pruebaNO/fichero_prueba3; echo $? +1 + +$ AUX=$(ogCalculateChecksum $OGCAC$OGIMG/fichero_prueba); AUX2=$(md5sum $OGCAC$OGIMG/fichero_prueba| cut -f1 -d\ ); if [ "$AUX" == "$AUX2" ]; then echo si; else echo no; fi +si + +$ ogCompareChecksumFiles CACHE fichero_prueba CACHE prueba/fichero_prueba; echo $? +0 + +$ echo 333 >> $OGCAC$OGIMG/fichero_prueba2 +$ ogMakeChecksumFile CACHE fichero_prueba2 +$ ls $OGCAC$OGIMG/fichero_prueba2.sum +/opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba2.sum + +$ ogMakeChecksumFile CACHE prueba/fichero_prueba +$ ogCompareChecksumFiles CACHE fichero_prueba2 CACHE prueba/fichero_prueba; echo $? +1 + +$ ogIsNewerFile CACHE fichero_prueba2 CACHE prueba/fichero_prueba; echo $? +0 + +$ ogIsNewerFile CACHE prueba/fichero_prueba CACHE fichero_prueba2; echo $? +1 + +$ ogIsNewerFile CACHE fichero_prueba CACHE prueba/fichero_prueba; echo $? +1 + +$ ogDeleteTree CACHE prueba +$ ls -d $OGCAC$OGIMG/prueba +ls: cannot access /opt/opengnsys/cache/opt/opengnsys/images/prueba: No such file or directory + +$ ogDeleteFile CACHE fichero_prueba +$ ls $OGCAC$OGIMG/fichero_prueba +ls: cannot access /opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba: No such file or directory + +# Limpiamos el directorio +$ rm -rf $OGCAC$OGIMG/fichero_prueba2* $OGCAC$OGIMG/prueba2 + + +MEJORAS +======= +ogCompareChecksumFiles -> si no existen los ficheros de Checksum da verdadero. Deberia dar falso diff --git a/ogclient/lib/engine/tests/NoModify/Lock1.shtest b/ogclient/lib/engine/tests/NoModify/Lock1.shtest new file mode 100644 index 0000000..eb4ead7 --- /dev/null +++ b/ogclient/lib/engine/tests/NoModify/Lock1.shtest @@ -0,0 +1,85 @@ +€jemplo de test de funciones de bloqueo de particiones e imagenes +================================================================= +# Funciones de bloqueo + +$ ogLock 1 1 +$ ls /var/lock/lock-dev-sda1 +/var/lock/lock-dev-sda1 + +$ if ogIsLocked 1 1; then echo si; else echo no; fi +si + +$ ls /var/lock/lock-dev-sda1 +/var/lock/lock-dev-sda1 + +$ ogUnlock 1 1 +$ if ogIsLocked 1 1; then echo si; else echo no; fi +no + +$ ogLockPartition 1 1 +$ if ogIsLocked 1 1; then echo si; else echo no; fi +si + +$ ogUnlockPartition 1 1 +$ if ogIsLocked 1 1; then echo si; else echo no; fi +no + + + + +# Es necesario desmontar para probar ogCheck +$ ogUnmount 1 1 >/dev/null 2>&1 + +$ ogLock 1 1 + +$ ogCheckFs 1 1 +OpenGnsys error: ogCheckFs: "1 1" + +$ ogUnlock 1 1 + +$ ogCheckFs 1 1 >/dev/null 2>&1; echo $? +0 + + +# Bloqueo del repositorio + +$ ogIsRepoLocked; echo $? +1 + +# FALTA: test bloqueo repo cuando esta bloqueado + +# bloqueo de imagenes + + + +# Creo una imagen ficticia +$ touch $OGIMG/_test_.img + +$ ogLockImage REPO _test_ +$ ls $OGIMG/_test_.lock +/opt/opengnsys/images/_test_.lock + +$ if ogIsImageLocked REPO _test_ ; then echo si; else echo no; fi +si + +$ ogUnlockImage REPO _test_ +$ if ogIsImageLocked REPO _test_ ; then echo si; else echo no; fi +no + +$ rm $OGIMG/_test_.* + +# Comprobando los errores (FALTA) +$ ogLock +OpenGnsys error: ogLockPartition: "" + + +$ ogLock 1 10 +OpenGnsys error: ogDiskToDev: "" + + +$ ogIsLocked +OpenGnsys error: ogIsLocked: "" + +$ ogIsLocked 1 10 +OpenGnsys error: ogDiskToDev: "" + diff --git a/ogclient/lib/engine/tests/NoModify/Net1.shtest b/ogclient/lib/engine/tests/NoModify/Net1.shtest new file mode 100644 index 0000000..977b00d --- /dev/null +++ b/ogclient/lib/engine/tests/NoModify/Net1.shtest @@ -0,0 +1,21 @@ +Test para la librería Net.lib No modifica +========================================= +$ if [ "$(ogGetHostname)" == "$(hostname)" ] ; then echo si; else echo no; fi +si + +$ if [ "$(ogGetNetInterface)" == "$(ifconfig|head -1|cut -d\ -f1 )" ]; then echo si; else echo no; fi +si + +$ AUX=$(ifconfig eth0|grep 'inet addr'|cut -dB -f1|sed s/\ //g); if [ "$(ogGetIpAddress)" == "${AUX#*:}" ]; then echo si; else echo no; fi +si + +$ AUX=$(ifconfig |head -1|sed s/\ //g| tr '[a-z]' '[A-Z]'); if [ "$(ogGetMacAddress)" == "${AUX##*HWADDR}" ]; then echo si; else echo no; fi +si + +$ AUX=$(df|grep $OGIMG); if [ "//$(ogGetRepoIp)" == "${AUX%/ogimages*}" ]; then echo si; else echo no; fi +si + +$ AUX=$(df|grep $OGIMG); if [ "//$(ogGetServerIp)" == "${AUX%/ogimages*}" ]; then echo si; else echo no; fi +si + + diff --git a/ogclient/lib/engine/tests/README b/ogclient/lib/engine/tests/README new file mode 100644 index 0000000..f319097 --- /dev/null +++ b/ogclient/lib/engine/tests/README @@ -0,0 +1,6 @@ +Separamos los test que no modifican el cliente y los que sí lo hacen (pueden modificar la partitiones, imagenes, etc) en dos directorios distintos. + +Ademas los numeramos diferentes por si los queremos mover de sitio: + Los test acabados en 1x no modifican nada + Los test acabados en 2x modifican el cliente + diff --git a/ogclient/lib/engine/tests/crearTestDisk1 b/ogclient/lib/engine/tests/crearTestDisk1 new file mode 100755 index 0000000..ab40522 --- /dev/null +++ b/ogclient/lib/engine/tests/crearTestDisk1 @@ -0,0 +1,160 @@ +#!/bin/bash +# Descripcion: Crea un test no destructivo de la libreria Disk.lib conficurandolo +# para un cliente concreto. +# Se ejecuta en el servidor y el test creado se utiliza en el cliente +# Los datos los toma de la base de administración. +# Uso: creaTestDisk1 NombreCliente +# +# Falta: la bd no tiene información de las particiones lógicas (el script sí esta preparado para ellas) +# la bd no tiene datos del tamaño del disco + + +# Variables. +PROG=$(basename $0) +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg +TESTDIR="$OPENGNSYS/client/lib/engine/tests/NoModify" +TESTFILE="$TESTDIR/Disk1-$1.shtest " +# Control básico de errores. +if [ $# -ne 1 ]; then + echo "$PROG: Error de ejecución" + echo "Formato: $PROG NOMBRE_PC" + exit 1 +fi + +# Obtener datos de acceso a la Base de datos. +source $SERVERCONF + +# Comprobar si se recibe nombre de aula o de equipo. +PARTICIONES=$(mysql -u "$USUARIO" -p"$PASSWORD" -D "$CATALOG" -N -e \ + "SELECT ordenadores_particiones.numpar, tipospar.tipopar, ordenadores_particiones.tamano + FROM tipospar INNER JOIN ordenadores_particiones INNER JOIN ordenadores + WHERE tipospar.codpar=ordenadores_particiones.codpar + AND ordenadores.idordenador=ordenadores_particiones.idordenador + AND nombreordenador='$1' + ORDER By ordenadores_particiones.numpar;") +# Si la cadena esta vacia, error +if [ -z "$PARTICIONES" ]; then + echo "El equipo $1 no existe en la base de datos" + exit 2 +fi + +# Ejemplo para añadir partitiones lógicas +#PARTICIONES="$PARTICIONES 5 LINUX-SWAP 1999999" +PRI=$( echo ${PARTICIONES%%\ 5\ *}|awk '{print $2"_"$3" "$5"_"$6" "$8"_"$9" "$11"_"$12}' |sed s/\ _//g |sed s/\ //g) + +if $(echo $PARTICIONES |grep " 5 " >/dev/null); then + LOG=$( echo ${PARTICIONES##*\ 5\ }|awk '{print $1"_"$2" "$4"_"$5" "$7"_"$8" "$10"_"$11" "}' |sed s/\ _//g |sed s/\ //g) +else + LOG="" +fi +AUX=$(echo $PARTICIONES| wc -w) +let NUMPART=AUX/3 +P1SIZE=$(echo $PARTICIONES|cut -d\ -f3) +P1TYPE=$(echo $PARTICIONES|cut -d\ -f2) +case "$P1TYPE" in + EMPTY) P1ID=0 ;; + FAT12) P1ID=1 ;; + EXTENDED) P1ID=5 ;; + FAT16) P1ID=6 ;; + NTFS|EXFAT) P1ID=7 ;; + FAT32) P1ID=b ;; + HFAT12) P1ID=11 ;; + HFAT16) P1ID=16 ;; + HNTFS) P1ID=17 ;; + HFAT32) P1ID=1b ;; + LINUX-SWAP) P1ID=82 ;; + EXT[234]|REISERFS|REISER4|XFS|JFS) + P1ID=83 ;; + LINUX-LVM) P1ID=8e ;; + SOLARIS) P1ID=bf ;; + CACHE) P1ID=ca ;; + LINUX-RAP1ID) P1ID=fd ;; + *) P1ID="" ;; +esac + +cat > $TESTFILE << EOF +Ejemplo de test funciones de particionado no destrutivo +======================================================= + +# Desmontamos antes de empezar +$ ogUnmountAll 1 2>/dev/null + +$ ogUnmountCache 2>/dev/null + +# Cambio de formato + +$ ogDevToDisk /dev/sda +1 + +$ ogDevToDisk /dev/sda1 +1 1 + +$ ogDiskToDev +/dev/sda + +$ ogDiskToDev 1 +/dev/sda + +$ ogDiskToDev 1 1 +/dev/sda1 + +$ ogTypeToId NTFS +7 + +$ ogTypeToId LINUX +83 + +$ ogTypeToId LINUX GPT +8300 + + +# Tamaño de disco (cuando haya informacion en la base de datos) + +#$ ogGetDiskSize 1 +#312571224 + +# Tamaño de la particion + +$ ogGetPartitionSize 1 1 +$P1SIZE + +# Información de las particiones +$ ogListPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g | sed s/\ //g +$PRI$LOG +$ ogListPrimaryPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g | sed s/\ //g +$PRI + +$ ogListLogicalPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g +$LOG + +$ ogGetPartitionsNumber +$NUMPART + +# Partición activa + +$ ogSetPartitionActive 1 2 >/dev/null +$ ogGetPartitionActive 1 +2 + +$ ogSetPartitionActive 1 1 >/dev/null +$ ogGetPartitionActive 1 +1 + + +# Tipo de particiones + +$ ogGetPartitionId 1 1 +$P1ID + + +# Montamos la cache al final +$ ogMountCache >/dev/null 2>&1 + + +EOF + + + +echo "Test creado en $TESTFILE" +echo "Las particiones logicas hay que incluirlas a mano, porque no hay información de las mismas en la base de datos." diff --git a/ogclient/lib/engine/tests/crearTestLock2 b/ogclient/lib/engine/tests/crearTestLock2 new file mode 100755 index 0000000..c3ac2cd --- /dev/null +++ b/ogclient/lib/engine/tests/crearTestLock2 @@ -0,0 +1,82 @@ +#!/bin/bash +# Descripcion: Crea un test DESTRUCTIVO de los bloqueos de particiones y de imagenes +# Se ejecuta en el servidor y el test creado se utiliza en el cliente +# La imagen de prueba puede sufrir daños +# Uso: creaTestLock2 NombreImagen + +# Variables. +PROG=$(basename $0) +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg +TESTDIR="$OPENGNSYS/client/lib/engine/tests/Modify" +TESTFILE="$TESTDIR/Lock2-img$1.shtest " +# Control básico de errores. +if [ $# -ne 1 ]; then + echo "$PROG: Error de ejecución" + echo "Formato: $PROG NOMBRE_IMAGEN" + echo " La imagen de prueba puede sufrir daños" + exit 1 +fi + +IMG=$1 + +cat > $TESTFILE << EOF +Test de bloqueos Destructivos +============================================================================= +# Bloqueo de particiones +$ ogUnmountAll 1 2>/dev/null + +$ ogLock 1 1 + +$ ogExtendFs 1 1 +OpenGnsys error: ogExtendFs: "1 1" + + +$ ogFormatFs 1 1 +OpenGnsys error: ogFormatFs: "1 1" + +############################################################################# +# Los dos comandos siguientes dan error. Los comentamos por ahora +############################################################################# +#$ ogMount 1 1 + +#$ ogUnmount 1 1; df|grep sda1 + +$ ogUnlock 1 1 + +$ ogExtendFs 1 1 >/dev/null 2>&1; echo $? +0 + +$ ogFormatFs 1 1 >/dev/null 2>&1; echo $? +0 + +$ ogMount 1 1 +/mnt/sda1 + +$ ogUnmount 1 1; df|grep sda1 + +# Bloqueo de imagenes +############################################################################# +# Los tres comandos siguientes dan error. Los comentamos por ahora +############################################################################# +#$ ogLockImage REPO $IMG + +#$ ogRestoreImage REPO $IMG 1 1 >/dev/null 2>&1; echo $? + +#$ ogCreateImage 1 1 REPO $IMG >/dev/null 2>&1; echo $? + + +$ ogUnlockImage REPO $IMG + +# Lo mismo con la imagen desbloqueada. + +$ ogRestoreImage REPO $IMG 1 1 >/dev/null 2>&1; echo $? +0 + +$ ogCreateImage 1 1 REPO $IMG >/dev/null 2>&1; echo $? +0 +EOF + +echo "Test creado en $TESTFILE" +echo " La imagen de $IMG prueba puede quedar dañada despues de realizar el test" +echo " Hay cinco comandos comentados porque por ahora dan error" diff --git a/ogclient/lib/fonts/DejaVuSans-Bold.ttf b/ogclient/lib/fonts/DejaVuSans-Bold.ttf new file mode 100644 index 0000000..040bb9d Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSans-Bold.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSans-BoldOblique.ttf b/ogclient/lib/fonts/DejaVuSans-BoldOblique.ttf new file mode 100644 index 0000000..d0fc12f Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSans-BoldOblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSans-Oblique.ttf b/ogclient/lib/fonts/DejaVuSans-Oblique.ttf new file mode 100644 index 0000000..19f9f74 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSans-Oblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSans.ttf b/ogclient/lib/fonts/DejaVuSans.ttf new file mode 100644 index 0000000..7e411a7 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSans.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSansMono-Bold.ttf b/ogclient/lib/fonts/DejaVuSansMono-Bold.ttf new file mode 100644 index 0000000..86f9722 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSansMono-Bold.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSansMono-BoldOblique.ttf b/ogclient/lib/fonts/DejaVuSansMono-BoldOblique.ttf new file mode 100644 index 0000000..b143938 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSansMono-BoldOblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSansMono-Oblique.ttf b/ogclient/lib/fonts/DejaVuSansMono-Oblique.ttf new file mode 100644 index 0000000..81208a6 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSansMono-Oblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSansMono.ttf b/ogclient/lib/fonts/DejaVuSansMono.ttf new file mode 100644 index 0000000..029fcac Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSansMono.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSerif-Bold.ttf b/ogclient/lib/fonts/DejaVuSerif-Bold.ttf new file mode 100644 index 0000000..e7aeb9e Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSerif-Bold.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSerif-BoldOblique.ttf b/ogclient/lib/fonts/DejaVuSerif-BoldOblique.ttf new file mode 100644 index 0000000..a457fd8 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSerif-BoldOblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSerif-Oblique.ttf b/ogclient/lib/fonts/DejaVuSerif-Oblique.ttf new file mode 100644 index 0000000..887939c Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSerif-Oblique.ttf differ diff --git a/ogclient/lib/fonts/DejaVuSerif.ttf b/ogclient/lib/fonts/DejaVuSerif.ttf new file mode 100644 index 0000000..5d096d1 Binary files /dev/null and b/ogclient/lib/fonts/DejaVuSerif.ttf differ diff --git a/ogclient/lib/fonts/README b/ogclient/lib/fonts/README new file mode 100644 index 0000000..076fc9c --- /dev/null +++ b/ogclient/lib/fonts/README @@ -0,0 +1,21 @@ +Copyright statements and the source of the qpf fonts are located in ../../src/3rdparty/fonts + +The fonts here are in various formats: + + *.ttf - TrueType fonts, requires QT_FEATURE_TRUETYPE + *.pfa - PostScript fonts, used as source material for some QPF fonts + *.qpf - Qt prerendered fonts (QPF format) rendered from above fonts. + +QPF is the portable, endian-independent format used by Qt/Embedded 2.x and 3.x. + +The prerendered fonts are generated from various sources: + + fixed* - Fixed font. + helvetica* - Helvetica BDF format font distributed with X11 + - Latin-1 characters (about 250 characters). + japanese* - Helvetica BDF format font distributed with X11 + - ISO 10646-1 encoding. + micro* - Micro font (see micro.bdf). + unifont* - Unifont (see unifont.bdf) + - full unicode range (about 50000 characters). + diff --git a/ogclient/lib/fonts/UTBI____.pfa b/ogclient/lib/fonts/UTBI____.pfa new file mode 100644 index 0000000..a4fda2e --- /dev/null +++ b/ogclient/lib/fonts/UTBI____.pfa @@ -0,0 +1,1172 @@ +%!PS-AdobeFont-1.0: Utopia-BoldItalic 001.001 +%%CreationDate: Wed Oct 2 18:45:57 1991 +%%VMusage: 34429 41321 +%% Utopia is a registered trademark of Adobe Systems Incorporated. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def +/FullName (Utopia Bold Italic) readonly def +/FamilyName (Utopia) readonly def +/Weight (Bold) readonly def +/ItalicAngle -13 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Utopia-BoldItalic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 36546 def +/FontBBox{-141 -250 1297 916}readonly def +currentdict end +currentfile eexec +f9d13ed4c538ee56ca0c8979e615439db5863a5292e578086555752cf04323b5 +761364ec433e576f108b1bff6c56d0f56331bc1243c31feb9985de983b0b3300 +e35eaa63cb5ef5a522d2e2731f37eef0cc62a540af58c4780559b4a0499bd168 +7642677ef167669aa264d68a8ef6da7425b771d48260108ab87a077560b2ebc7 +dafcace10cee472c35746fc11d5304e441fa0678decc0652588a56cef7c28ba5 +5cbd94a7acac9a06942a82d6abc1ed45ef21f4f3f5f61d0002340725ba15b9b3 +0b9992741770f020ec318f514874b6abdb27c3f0dee979cce17199b9f3ecb0f0 +709736e55bc48c55ebc8f7259d9e0ba13b46c2983c6e8265633d11358057019a +9bc40f9ef8830b5cf7022bc19c01160d17df4ab51d113cd49bde4d1e3b5f8ba2 +7d179464b8fa28e12092267d5c70cc341eb3ed0eec08b343175d5458311a7404 +a9463d728eda1642be73366ec57a705501aa054b60b04983e30b9987bdbd1c69 +95ef18d327beb2f2086a2245602495ccb7851bcc5eb302b980ada64a262c562f +6b2748b8f7dc4a0a06c69a7231fd40568bb236b33f33ac04f1d2f91573f60470 +599ca51abce802711c7fbd95247ec33fba3a393195a5cd54622434e668d1e63a +a39a51699962bfcc4774228ebdb0b01f29b430434d8023331bd1b6b2c76e43df +b3c68753c55075856e9ea0f5c7d60f510bc115bb70e0a8eb9998d3f32a0b72d3 +ab524841ef36b198e3ae58129ca64e005f776a0676dcef57e7961dd2b948c2da +f392cba950f1101a7bba99952251c82ab5d0eb5ecd8af07973eeafcb3e0b5f2a +3b6c8852ea072b9787fb945cb7cc7a2acebe92a5458e7dab5ea2551a61a55068 +d7023b6193c750e32502fe1e1d8e8d497453fff493caaed83c410eef050c30c6 +e38339831517101b07fc15d5f63470a9863bbfee0c0002695669900aa70a18f7 +a87f1b0b83494c39c3c90a8313060204d19553e2d66419e7b002b25108ba00ff +a7e60c68b73c53f306e112ecba3b64d35caf59f11a41ae76aa2fb4882ffffb96 +400c2b6b0051c90d7279ffd0df3a6ba63daf802888bb6b98db281b89734b6e2c +9ebd473352b36e11b5c3f3c7ecb22095b7aae220fbc89cf6036fa963530b8a01 +1cb06875ceaa143eacdbf1015631e8858bfe5917e01737ec6c840fa7097a42f1 +15884772664b9665e5575dc3003914643d34f329b9cd12b1012e93133a27d139 +ebcf7f9b68dc21575f3ef070ef94d4f3f9ea0d3ab4a75e6ec849a4630f4f13f5 +0883dd86a9903613ecf36ed6ab7294afdc167e0eda4b1944870a2f99ae8a22c8 +1b711d1eeefd489009b86f08078f4510c6846b17ae72c87dc51d0433ed9cb40f +197db7e3c2ef41f077481b3d194aa3284d5400681001e0531348b91cb957c396 +5611aab14b92dbb110db950073dcaf69d6454588bf63c477112c38ac578b0ddb +18fbf7f0d44138c4721743fc05cbef7cc3c684328df7c4bbc17afd9084bafec9 +99b4b8304cfd2d604e31d96c466466cebb6ef3a2236498e31b3c8dd8f15c1ec1 +c67d2b6472c3dce8f613c8a206e5dbca88b03ea931fdbb7e2d19625d4aa0d800 +b2eb953de5ae22b2478432710ad8efc57558171c332f6b27a2cac9145badf751 +9cf4987b853ed30d3a726039a83158c03a0f457dfc9a81e78d909f070e8d47e0 +252b72d03d049ed6349c752a01b92072a2c8f6c50ae85d6a5469eedab2e0a5f2 +6e502cf72a76706ecaaf7a590105feb6f0c1f52a820369fe3b903b08ec602ab6 +882e1ea21007443e2460e29de7fc07fa72bf89c145b04be55df48c0ae5ba1bcc +c84bbf0a2de650ded51dbb240dadc2faf3a2fd0fa8749f0b1e372c579f905148 +706e910cd5578d06c8018e3ff8b88af6002c549b87a9fe2b1f804e95921ef83a +2810e015e315d55496eec2bd16e0b71e4d7004dfbaab8a5d651c4446e343e382 +8204f6e7b4cababa6aed624942902c65899615d858ca24fe6c91a41d087fd647 +e50c52850049c81a5dd9447761b3a308df7403fa4f8669df366d3e114628858d +17ba68a92fed47c199d1f7d415c8315d30b394177b161fa487225c38e0b9d9c7 +ab236e90e926614f9fbdb3bc081e948319ec3871fd37193f0889ecf2c47841c0 +666b272328bbd281f719181b4e509c01ce80afe08f6244ecbfc136f8edaccf79 +36399e63e5982d27fbdaffab086e1e064c84cd97d4eef959aa3a452e065618f6 +b549e3fe7207bcdf85ec1917612c098236b9124d6f1c037bd0656777dfee995d +5d125d678fa7ac5c995515e952194f9620579316eb0f0ad55930ac82fa773159 +c1ac7f4b072f06baef03ee07c23fcb4ad8072503469a8e4eda4cf143c7a68d27 +bbf01668c0abf4950277c195fa1cba7297a2e863299e195c6684f2a076427e5a +a2f308fcfb1dc11d14bcc8a4a59611eb8bfcbfcd73e963d69c82fcd95e989ff5 +ed486f9809d3f9e1a0ddfb573b37d1d3d57e0fa4594f66ac56fe16168a472552 +eca179c7ad26be24e9afb1a759b73de53e9f7075b7ce0ab8bc8e30ec6d68aa42 +a84b36f2c4e4afa9e59c6dfa9af97a93b2cbd9ba786fff8d8b60305b608bfc36 +83c2c94dac72000fa51ff15739975e9ec0185f3b7cd805e67b5ff91fabfa648d +81e0beddecb47dbbad28a99acc3074f1c248b2231be3fb01b331e90a1bc723e2 +8a0b2e99f2defe00a0b33c13f0a6a37717089fb28b7c58daf478e877e4bcb73d +54b358c509a630d73938bca5126547c94f88c97cedd1c65a3d514b3ab86a489c +317554f67e1aecc75e3c71cd37f268999f17fb649cc52ce4ada26d2d4ff1c248 +e9e4f6f5ccb85aa64e90f371cb94da1ecf5b995ded0fa6771e3f874ef449186b +4b78c298d5c24e5127532b67c9479f70c3703ab7800ba8ecbca511703d6a1733 +7f2edbaa61171f00f01debc6eba2094465e248cc8262bd35cab622443a1be5c2 +8e6318e4f3b7131045b8f676e2086f0432f51983c74fea25cd5aad0797a4cb5c +6503695292d798c755170f0ae137674d25759bbd89cf4fe0917e32999b4a04a3 +655ea871b30e22b0ee39f29f7915fa3dbac0d01c55a454728869501335f97e3d +24b17ab7ea28784b6f8c9e0b72b38f64e0fdb578eecaa5590c20a1d17ebd4ec4 +1632b40553aa80fced6d88079eee8097a410a29b549a0bb3b6fec526caa745a7 +202eabbe2cf3f1262db3e6e309e0afc3d9c808fced17b05c320945fdf0a05459 +ea7ba64fc4112fa68eb4887bc845e63a598e2d31df0ab0d64155e631e3ab4621 +744da7c3da19a2e66ed2bf759505e0cfb47a76a81ed7242cc29c7383989afc30 +df86c4b38be0a5c8b360f586f463e53d6684584a3a5fc75495200fc707cd1981 +1a0fbcc0fa784b02140158ef0913170979c4fe96f3fdeb414cad01b38d2b5934 +0b21cf14a28c24a583472ae3cd667ab094e56744c6b35ab7870ee5b0aa22a70d +dc68afd34b44e45275ca8d12747dc6fef76b826f1dcd70a5a30537e096935f7d +ba37414aa1f0111cf7a1844c5e2b3f63764458ce9e113d06cc844bead4d22109 +069b5174e0ba5aabef78dea7e384369de2e4142bfe6521efadfe67aa41fd7bf5 +52ff016ad8d6314b4285e129ebbdbfd3c6e3383906248f0ce045ad370b0f90f2 +a832944cbd59bc7cf15a9c17ee0fa0bbe12f2304fd6a9f56cbd65e7cc91ed860 +7d09e58934079a74d02c1b25b958567133657dc028148e9f13a0ff6db812422b +6c7cfe064a171b4fc5e1764000d4a761d1c476aeb59a45f7b64ba1c8623b1423 +91d79d124b8506eaf94ef8fd28b5fa6ca6aa5677ffe979dd3d75f540d577ea8f +9cc95f5b41942294df812c4d4aa4ee701f654be2c00440ba575c5512bb5c196b +3ad24366514f2b4ea4ab0c35927517bfe166c261c0c7f9b73ab0c52ed0da3696 +628a1f230e48cdaf2ae53000dbb2ee3fe17b9785faf74baec7caadb23fe6e329 +b2b908bae996af74097cdb6e280b5d5c2783b33ba106d6f458179822af89ee24 +f99514605cb4e232b62d92014636841a991b3790ae7478d020d6513e70244034 +dec5f2106a1820acac4b7e091dce521896f25dcfaf58a521ecb5d26ae3b8bed6 +c61c3c25d09d159d5ef58e253dc0f9817fbb469e44eed683ffecb08689e66108 +ce6f93327a5ade948640d0e9347b113d846846fae982687d95b66d6a75ffe876 +a2c50ce60e3f7953d9dd5a9f5d65b1105a7849d734336804de32576e81abd201 +4aff1a36aae15c725df295daaf26238b21c6d288450aa4d94e26ce6a1de7f096 +5838c195a97ddeb019500e8fb95e8b48190b020cbf0582a99df66b7192b67448 +c1695882808efb39a3c54fa42c183f65492f9d0cccd832b5590a6c4cf18e8d2a +e9f50100f197818f192c39d4204b6dab711c2f8cb53e5ef002719755cfee11e4 +f1ca77783034901fa2da7f82254d1184f2f724e36be731fe923c99d444407539 +3000ceb19548d5c11d7aab1e13917ea4391ac626e02bd7a1960bcdf24e048f46 +76fc3cb4031811d94f83a0c23b309cc9a537b599c174dc862429bba8b94e7e56 +56682c13bc4deb402af2334993c66d6ef48cebcf6dcc924a2a1615ee92edb7bd +221fd3204d9dfc6b2abe84d5b47a9d03227a4c015204af7dc5f937adc8c60de9 +feb1c1c722a911b2a5f186478ad7540ff28f7cbc82d85e461c740e8aa51c16d8 +8f939075b78f8a097f647de080dadd87dd5a4107ae7cbc25a7964e5e8e0aff10 +1f17185e95a7c432c76f5fba2138ee76b7ec76c691df228099c0de7107aa0f5b +523209576c023ed23e9ea9047d1def8175e515bd1ee133167f0f92fc87732091 +4be8e6a04a796e5affd91f2e0bfb1b47d960228b970cae0824b32f602504cb12 +9f29f933e538a01fc231eedadd0bea5523ce4acd3ca5d512aeffd4bd91adc088 +47e520f07aa173dc6d1dcda5c7a20a1cbb399d7a11694bd2c959d2546d5cd1b9 +b7afba473e7c9f0492c2d4b4ed1204d6f633a431d83b813b5ec5ecbe41b6c8ac +003fbe65fee1581fb80c2f4c691f9e8a33630940b198deba7491d83421017409 +6dd46e914bf82841e2377e57cf81c0f03db26133519f638d0b6422585af7f7f2 +589aed2dfd15c02f83bb6fbac42b4fe85e14256c5b5f6e7a287953a4f96a0c6c +562b87ff8a8ddf922571aedf6898faf7f9327f92a6f736546c5699aefc4cd1ba +b403a43f8464b215993ef53d2d9186ab1218f7e1f2ccf589ee0a52096a153ac5 +e328654465f3f734fb590ed232399f9f6dcfdfe7f702b4ed829e444ad685b1e0 +d0764217ae144e4af82554faf6d013be83816ab94a6b175905916bea3c053fdf +8d033e48ce7e6a7338fdebdf9cd047624cfcf3be1aa133690eed083e28939707 +778274ae874e906f972080d9dd453ff5039cd351776a1ed52d3e4a8fbc749f9c +588478826593e0e8625b013ff1469bf76aef8ae06a63ebbda3176d517a7cc32d +ad93a096258b227102b2b748359ff2e70a438709eb5f1b60be92f7a6c8f92372 +c3b9a58ee0934083f2300c6423250c00ecc2cfc67a6be83450eeaeca993fd695 +939e47e7c7d28f9db30e2a82ad4895092a1a5a734f1727b4734a14743ee1c9dc +851c9463451042f28a519e8c532e16c6a7f65a11286b85d48ee3bd6f09caf327 +cd87df6f40cc9ed5784744408da6a2e65cdbc6838812b2da414fcf7a33ebe676 +d381f7cb0bc1d84273b03240fd3eacfab2693d04abe2a89f6d884fc1ba2c0c6b +183916096f98f062bbe990f87a9d74d275f18d5d97e9eff897b99fd5e5f2353e +16fe417e644364017a1f014cd0ea62ad0a684fcb1f7a4969bb2d0119d3021ea6 +91ad90564b7cd59c03662d4809943ac3c0316c45b3e6576a9cac3f549f04a9cf +b21aa641eeced2af9c0e9944bcd355444f1ef2dd626d94d65c1e00b208f06fd7 +526f73917bfebde0538984edc704fb56a92f429f2b3ccd2324926605ffb9e06c +e3f9435778a9972bc1d9511b1c9e013c9232cfa8fa03b8076de78144e24583da +ce13c107390a4b4a66fcf41d02c7ea3889fcf648bd9b202a77ee0debb98745c9 +b424aa89f8028129fea8293f44efdfea96ca75d1462715087baceb18506124ad +843bf5b5eb3044665921c1e711ae61d7ea772773f99f7aee6de71fcd8c5c2c9a +4e5d5a1f02ba9ad0e31ac0673594882b491d8dcc9b7c4d8bf806845cb7e7b054 +e073b9379f6f7b756786174fdf25b080adf0cb4645dd8fe1b4cb5377195bbbc8 +88e09bf98c82e523794bc350fa0fa12413dbffc006a66c47c402b78164fd9234 +b9fae67432f7a9423ee7569d3e6bb293cc0a095f3c5a0abb6a2c52a0c4dccddf +54dccede5914afbb9bce717409060d5772bf6c19ec65700c6395884b3da5bd6c +d81daba48977e3af9653875148fe7ddab905a0cf6c5352a468c36ad2bd09d897 +2d54f62bf9af9688c1454b67f24b5cbe39e9c069d6b5429ab9e8b2117c0b09eb +7f877d667af2af4c06339230c2e2d082f389d7006f8bacf00bcef8b652a8f1a7 +e210e7facbe69f8b0cebc21b6cb559ce9f6d8e1b0546870d773f6335426b6978 +60bfe9e2c6cfd1206ff1fa27cadbdd58c4c2368e95e17bda712c4feb1e89c63c +45c0cc72dac845d10847408dfc7dd390ea0c50fbf3012939372707be42c88a8b +025a77150be73e08e73fa1e15fb39d985d5e6666d2a4f77f947eb1b2228ef0e4 +bdb7f767621b7edf5b863d44c09a02b08a41a3feeb239ec9e022d0d8c2fbe939 +fc242a923b082a3035a23c0ae48dae76b4c2147a7f8126ab66dfbb8c892d858a +48f8b65eb85d3216b8c156ee4005045697a11f0f349d05620b1c0d41575c11bd +e8165d443d4e836d4b4b2fc028e3ee7eb995115de8bb5b58d7575a260c8ebb93 +cc5d43766f56ce454dff93669f41be40953c42ffcc98a89e9f6ab320f7688083 +32a48d4ff8eb88c84c7e0cbb9e031ac71c53873da074cd4112dc30b4f27c163c +0d6371b35d0571dbc1b80f5101c90d4745e978091c4c8b2bfe8aa23db4979a9f +143dba6c041772bfdda2077985fe5da829d9de5d8c5c9d02175f65e23495756e +2ba67a1f46d862bb76a4f330c66adc2df5303b34ca0e705f28a97e2782105359 +3ade715c3f7eea39e401af757229bd314b886dda55f418b3a67657d199cdc8b4 +d05a5b7aaf37b53e1c5707fe5454d512c954b6887731d2626499cccd6e80b1cf +9b3116814c0f7705d53b402fc4e9b6307b22941daa12d9c66849165e8de01e0b +20c33b1b503c6ac7995d4bda83da72dee3b177389d500061e16c6decd05bd391 +1e2d1727b5436aa550e1bd505e91ce0efcea62d9fcaebc098880180caa252f6a +667c75a3185f62caa0c28763104f57e93fba3a396d7015b3a55161401970668c +7e6ed168f6e0f1029216c27c33544cc77111b2ef2b1538f1e89397a2e78f0319 +28e948640198d7d2b5684f9566b5e70988c2516a81623a6fba82c1554f3a8a85 +98c1efd626eea0ea586cea3b1f6b62f97b1ea416332ae107f0f174ebde1f84b7 +4af56a9495913e0e84ed0d8702ebe1c699f8e8f056de6e7728023e6fe0dc68cc +aa76c3e2aac6eb5f5ee502c1098db8033c4432fd0c6f62aadb989954d81e4247 +6efe3ddfef52cb066d3da1811e1bf13a9da68d77b3d88ae4b5e0ec252a992b2b +dd6b487458694df4bb1f300f88f6891f2033dfd4ed6eb147315ea84efef20c16 +3b2acdbd1a6812ebfa51f69413d1750c60d374839d46400b9563daea410e4bb6 +4231cc49a6db6f9acad1bd930faa27bc25e636deef091d07ee8c405eacf00d37 +a67027a49443231fb38cf74b4afe723353838866c9d56c2218507344cfe23e85 +264ec426283982e0e299b8557f37010c921d4b1e92b1997498426d3690408685 +5e0ab86ffb4c74192269197dad437aafdfc98809cc865a72f397901a02e22f97 +f035deb4063864798cbbdca6adfdd2e1f644c299d5acaa8b0ebf0102cdc1e478 +77179fd1e5c69595485ce83dd18e3a154e8f6bf6aad3752f209ad3e561cb2400 +0959f964e853ec9cde9deea9278c5988db3f026a6120e0020438f44066d270f4 +af05c4d6568fa3b288c0443be3cc406b6ea555ba97b9fae56c2b7e75263397c4 +f247bee72066fc445c158297eab5151852dc2c32306794b7be0a5f23c22f76f8 +4c80909a303d6d29d808a606b8c0739e69d715778ae843c033bcc8065ce83795 +f3d5b1a403aecd1ce8db79b148946d9f96673b51840fe073065a7da8cf8a8e98 +0e70984d88ef691e21a7f3b52c2a455286d80e3831ef4b7119459970a77e2bfb +1b2e12a6e2cd4e02d80cdf90fc00a1fbcb42817660487d5fadefde0278d4fcad +98fe39b3827b681d4427fe992adae296946720129777c73d954e1f91dfe80130 +362fd97c8a7f693b73ebe45155434eb078fc66adde8f9217583680f5e0c9f80e +c413226de65a1e06fd6bb4a4870e8702d2d77eeafc0ea5634272f19f31a6ea21 +b51de45449e89807b18588c9a43524713c31f27be41941c32da7c5cb636c5e1d +0ef69e2ef2c18ab0746cb2d19980fbdcf9691c1d74606830522219310193b32e +f886e8f200135b55e178d832f0416de4b86e2fb4eb8731337efccf833c044446 +1ab477118d9b6d53ebf5c42e46ed8e5d0181eef7a15145d5a51d7a1b8f82189a +f6ccde81e2f1da5a0e419838b90adc945a7e74a2132aa57807fe6107caff8296 +aca45bdc7366cf3b738cf402674c2c2ef0954ccdf7c7df0377641e9ffa12a165 +725cc7bca1a0d38dbabd6982b2f1c432454919fb58876f7854ec713ebf05e0e7 +01d1135f89b31ffa94413f30f72527de872418559c07c8a87556fb558bbd7726 +aa9cfb99d41a7ddbc8d5e4f8aaf20619b2dfdc18ed319b958b5812867e5f4442 +fc670f55f78be8ec1c3ed00fa36cbd52c5c15d45a5c77746de5aaadbce70eb29 +05c3972ddd7e2c220ba4137a5a6aa178af65fd65f225393a08197057d5dd407e +9c238702425991496f7c7c91754399ff3be95c95704f26de0cf99aabc5786994 +9b727f5cd72f4428908b95f1b879c2366ebc061ad4ef68ccd4f957cc76594d88 +dbea7f48b814a94be79e2cebf4de7d2f6b2fa680baab5196b132c5970d035801 +e021704e10823478c68b4f791e63cf7d9725088a6fc2279e1d09a68b04f31901 +7bfdf33caf58ef856a1aaa0793d327c91a2224e7239c211f1210ab11cab44b93 +0ac2b75868db9a0faca784a130fdf9f47cc09d44f9bc9f697f698d2da440441c +1adf05c77b768535ec2dd30b9897c52b1e28d081f1dde26d5e8438c405277c2c +2291b1911cbd914a714159a957e0b436583b1d90cd36c7ba1b6e1041c8eb3996 +dd2715fc01e9a82bd1590cb4ad8fbbdac9410beda818b81260a3a8742c137f6d +175fa8bf26d648c991fe684e0e1469900ed0a53b7d44e35e63c7e1fd0b5aacbf +5e9b854f302f3ee9c7620f5c9e2a5446f7653446f0bdc192a34e23654830e5d1 +52bf36fc02c220ac72569f80795ee9271fa89b438a8fa4de0a3fef6de60310e0 +77bb99f86ae3e0824c593cb2d0387faf97b3612131a2b0edbbc79a4444acd77a +53ec23d447610ad92120f7702df3c0955e5870e1ede213b5edcfe5c0405538bd +6d1a06aa55a8afa73fb82a29c6eba9adb721473d0756c31e77a4012d10dab6e5 +80c90caae60c3ea5a846f74536079bd790979059936c7e879eb79905e3b67b3f +ace6bd0a20a8afbf1034dff455f130347f54b6f7862a772f0afd46f3601349e8 +9d1caf04d0598df4cdb164190614aaa872036855c02c3c92374a3baf5453baec +0c0d2d89d79fd0452babb562e925422d17e888a9350fa50d9b34bd119618a1a3 +50f9059f36ffc5adb1f29923af100fadb5d32aa948ae738d53ba04c44c3afb82 +e935f0ccf3a7903ee5f939f10d3668c672b75e90777354d1429453010e4f72ac +23bb5cd7ddb1712a6851c033bfc10470f8ae87308777dc1d69a1b95e0ab1a655 +e46f843d3c4bbf2714177d4c83747f918884d366dad7705e4668087eb0d13548 +2d3c35939ad5402b94d3fd7f2bdceb0ec55ec0fde7fe7a555ab921dac698917a +fc4bd079834d26e0b1d4020bb50588e961658935079e8b542f927ec7a7e0ccfc +d03a7bff24ddedd6d7df33c3507c449067e548b0db1a42baa9e3b1d0528298ce +981f8e35b10b00f69c92390e4aa06d2b3374e868b4ee0cf0ee5f59f1c734550f +640bd5eeeddf30a340558a831b9e39bff15b35649a22b23b8f39d0d473a07be8 +0c757d16f7738a0190178de0e5509ad9fe624499d7464c43833515c9a5841c1b +e704c88e2df4508101dbb7330ab3dd863f544294887e6ad56bdf15800ae7a0d8 +e523cc1bd1f9424576492b11b41ccbdf5daaf31e3278b3d1c9160c9310f604be +1e869ce18ea776bd3ad33ad41dbc5b3a0acce72033b37aaa5fd6854d0f2faf59 +d2e674cf97ed09c3ec2f7a02657bc036f78c29e25284c7caa6e480beec4772ff +09b02feed2cf374a02b43f653c1d095d21cccefd30d2049c50327fc38bf44e61 +1e5afc9d29d37fc5c22f62b927fd2c5720a8025194734d8d361bd63745781d3c +996f448dd51f345442f1738ef8915a69bced678b6dc75ce6d77c44464d4e3c23 +0f90600074b5d31a870ccb24ccca94e8597177d51f85f9079d3de3ea0978a8fe +f94346f14cc5dca7c6476dd60ee8a7f402e498d91f4c3b8071f5238bf16e8909 +0c0d2b246fd6ac9bdff3ec3633c6d90dc5ae76e353293823b20abdaae12a66f5 +19637c1e69ddfd24df8a76807c441732f3bc7d334bdf5cd5eca5b3ef88798b59 +6f0eee2d147dd35f57c4a776a9c89eb781acc56491e6adf40b94df9e8953df54 +ebff8faa7bc3128a375ee91a17ef4e6ac5fbd17f84db3bcb2ac0468efcf8575f +b51865ed827e1dae4a3b601239519fc552e9959875285d9f688b1f4da4a62ffb +b166645fcc7e587fa82d02f8ea43049f9c589a3b570c16aa3d37f34f999c4f13 +ef852c19789834269ecdc91433b6351f1936b24fda2c6614a467855679c50162 +fb62daa72b9b971511e81c8dc7305e90cfad4950bc2dcfee8f1ad6f30c2133cf +c117dacb41836efe6d5ddb09b6948475c21a7c7e0b843820564b7f4375b43c09 +a07632390ba4fb796e2ff6b45a0584f763873e6a36768ef958c306fdb23607ba +73cfc5d53a282585b9c7c97e8b59ceeb43360107efd16c2d54f825fc77e4eeed +50c040e210a2be8034648a0cd886e2720b8d939ef7c94df36bec7ceb983e7157 +5d8c7d688fdbea4c23b8bdca5e5719ad6bbd1384032235ab03d05af8e86b2e01 +2f6ba96703f6d2e4a014c3de80067fd3fd665ed1c64c3362f254e3c7fba06800 +389cbf12c7b229b66b2df82a823765b41235e31a1e348cf57da0e304fca82b44 +0b2af48040f04750d7df18ebf95da0101b418c3820e161be149a3459e1c39758 +e8063dd0fce331702e9f7be3d10da99033bf2c90a1a24ebc48cc276d78f61cc2 +a6721f3ec1d48d86b54f8eb88b9ef248ee50896901be472b8196f52289869d9a +a656932d4872bab54cfde6eb67537c70078bb808bdd52f4d4b99f4d3a3d7fa4a +ee72b2b5202983641496ab3cd44434d44062db39d6c3e8b60ac6f73ab9b101a3 +2d687ab24b84e27043126bf4eee162f2cbea040586f49fd91b5d4069704bb9d6 +9ea28a6c20643c3f92f648b38273abb8bd944e7edabfd4e3085056f4b29fbe1f +ff5ec131de60fa61812a8ab0d3673272309e36f6a1bd1552a3c41af2a2228f85 +f3809d222aec8eedcb4baf373f37d2a5de8ecc62ea37b335b81005f8e92f27fa +6b2397952bbbe44fe9a3213c33e368d9dc37465e84f538d969f97d55b31956ae +7d8522a5ee6d6fdcef2cb6ecb636de6ee1b2e7b44530166f7b2eb278a0892504 +30cd9e39ad1d38748ccef3f201330fc43f12f6581162775064b6275c6959ad21 +b5486b450d8581de96291f870ed3768da5833520cc36c14b31a90232d1d1cb03 +de7f8f0a506c979b765205d82b518a8ddf6e3e494b4217e47c5dd770c51e47f8 +106f23e7e9c0c4c9b2bdbba64bef04c5acbcf437db53d1c47fcde3bf88d58f23 +fa8a8c482b5d45c78985e7e850b676d773a4ad42bea32e3090403c01c1532a7f +ec6e008ca9911f15319bb2708a57499e19b3482537ac0bcfe8a2dd398b0ad1a3 +a4f9812a66e9b82b095da83a9925c4e9128ad159dfb674cef7090c06626853c9 +0f5d64f662ce69cb135a4ed6eab6f69df2f376f1e3ea47a1903d066441d157f8 +858848b89aa4634011799b26842adc6981686381638e9d7e2c6c8ca22e8cb9ba +d86986aa0300a224d2d0bc6fd227fd557de7da66c301e4cac1aae538c62697b0 +b2258394e0af0333ef56007b98b436dde0d40937923c9c72ad3e3fc7b39d1c70 +2851b4dde84e697f7983d5f71089c3f94abe8ea47392800d7300f4576e9498a4 +20b537ff69231fe3643209c59c485471b2cfa89aec05e50b2ab081eefc80e1f2 +b08f772631c8c649497745610363246af135e2c3231b64be0d5db3789aa6a000 +f27ede24cbc19346557465818d4bf4c4286e08840f030dddf30bb175e81482a6 +bdbdd5c83a361a28b8ea5654a9066b5c8cfc8f5d4380cae506d6a61cf0ad481e +832e08f17bd9bf87749ef53d858b2a9eeab8d7be7e259bf110c4e3313d6ea87c +1ae3664089e4af8160d334fb3c3005de0d5037211f888ac0d959dad0a586b61c +0dddb0be9c5110479f5b0674d00f0e54ca7f642b62b32593779591b4dc119a25 +1e8fb9c40b68ecc9e5a08e63bae86aa52235dea3902f3c355fc1ae6b8c79644c +01a54c68fcbcf46ebfdf0a54eedeafd5d1120bf228ef499913b4426ba7dba017 +75d6e240dcb7d41352b5cb624bafd11fa37fde8b4d4fed2c106a34d8325fc31a +b86701cc72fc1e8db68a1508337947352c46d46d4393384cfef2c9e9e9d6d877 +f13780441ed70e86aee02516ee87bf567857f6af21aeb625ac3e30fb1b873bb2 +862a5ba6c7a6f30dba14fea378a41d38116214c999ab4666e48ce091751ce700 +62bd9e47351e9458e355e08bdf9f38ce3f52993df8d6893bdfa29813fafcefd2 +217b481c1100b8db69b9f3a2169c2a66300af2099a9acecbc542f140ad5d3a64 +6a1d818b0cfad8cd8b4b8a3f8e8ffddc03ba62a624e72df170b65fafed325883 +feb1bd45e3865043bb008d3055c08a3e4c95734db50f983f3ce6b6fb9367104e +c44b96c80b2fff43285967667a3edfd341ce587b212e12b2fcf156f03b0848b9 +3545bf50fe4ba75c13529ee16857d317ae98a934a369b83db5f6039b72bc09be +6d14c88a6e2c77543796939789252b70f51fa37a69b08551be5416fe8c785110 +30264f52592909c8e7f81f54f1b37c2b488f088e85994336c7a075779b168464 +fb37e8f7085f8fbeee68fb68ca9fb2986a53878454d72a3ead0b5b2ed507528a +ff6aa53b238380d6f0e59e991f4092d68e2001c0e6d945b810141d3d1bbb7405 +46d378af9ba3fefd4d44f6caf78b74450a0e230431a5c46e79c222c3767c4132 +90cb9f75baea5d1bbd25a718e8cbbe551441b642f10173e90aaa9b2cd6301332 +0ced79e66e38e8dd290bf36fe33244548216916fad18f20da7b73e31838930c7 +f4a9c44b3207eeb6c103f633f3fc8b2b74fb04a072fbc156089ee3f7351ef196 +f365dd43088f4d4a280be7e81fe73293912000e3e5f493dc4bfc275b5b8a8796 +bdbd266090733ba17e45239f7c0dfb4153be451a8560de6551202f700efafa6d +2bdaac1ba9c8f6e084e4b273fb8c501f336b005cab01ffd38cb6d27941096f75 +db1721eeaec315842dc7938dfa1b9e530b285604ec2c6982389e6c22fbb126c1 +e6a21916e06ee778b51fd72db2dcc11d878f21276a00bae3cf3ad0999c64d007 +f909d0ee79251810c64c4d05a2a759ef0837cf5563a8765817003dac3aa1bd1e +7e3b868307e2d1ccc93b1a5a0a4cc32b4eb6961f71750644fde26dc7b01a66dc +667005b396bb597d1eaeaa55b46506d447449497d29872485b31207e460df2b8 +c5b181459bc68b686182f1b6e164a825199c3ee24c1bd6a1dca450ca1a3fde70 +2d2e89bf6d8b98e4c4f25284b667cec77677be9046ede444a1b93b3b03db6aea +f89aa0759cc8aa7f10a2c4b36f63487f59bfd6e3a2025f26c346847fc257741b +629a3f662e3bda8c3c010c5dc1838afd26f875a56fd6042aebe1dbf119cfd387 +477d713cdda669f61ec1070705382520548a94749711144d8311df5db319ec0a +033f2d5c4c639b5af42549b1bcfd95afa55994389ca8a66b64c28520f821c808 +4ae9dcc9d6020aa6b1f93de064318e5e464e8808bdf0ac519653752e612c9149 +6e3c8e61434d012a5e4537465cb678b6e9a9005f5039e415dd2872ff0985439d +12d524a4f34c520aeecdc4d96383e1edd0059943d59d47880f51729e54a68a98 +a03fd6ba4ecb567c47422e04966c4655f9bb6f74f2b82d4d3ded42a42e90157c +6639f18ecae1cdc636bd616b60218d1b6f8294ecd09a88fc5928c37c9304d7b9 +5bc609286a3524fcfb9e406f636bf1b40573225e658543c29be863964556b622 +da308dcbb6516c88155f6d9b8ae4fe34b17374d46dc560809fccb19e87f7fede +beaece1ec0f41102b99ba6c4de9dd105dc5d90b6d3b392040273e0703b204d26 +89d1a340d0d32d6e201b91244e07ebbaae8b4c877a213ceb2f1b1d3ca07880ec +3f4817c00d48a06102352ef4de3440699cfd69ffaddfd1b90edb42034e5b8e3b +c42fa37c38d563554f8d5b96956879b63866e552fb931c6462b934dd0454dd9f +965055bb3e969b0063dfd2bc299df5552d8edb68b6530673fc08f3a0bb96557f +13b068d62dd8b42060e67d2584b4e6fb97e9dc7439f5c1d23c6a324e72062395 +6305ab4be3a430141d8e615b9f59c3a3eb2b1267ede3987cefcc1419a9f6de7d +d73ff35749b44018da9e79aadebafd0495ee9e29ae4fc7e420d86572f735134a +f54e8f853b764c6e0319f720e8350110c1b300290c8bf8fa4cd3be47533482d1 +53553691ebcdfb46c6879347e3573c318195bc13ea1c732d8d0e7567eb655b22 +1960e8476188532af8af85f7ed7d399ce2ced204894be3a592ffbccbd831f027 +7ae604851702b50c4ef6482c78c77c7959869e83001f7f8f93bb3b8be70d587d +9e5cae3aeccfb455463adef4038ccb6eb8447a7e1992929f5ff7f8e6f37d4a11 +d5815c2ae35f90d3708f3e2a166953d9823846d87d2e7a7419abc47f4044c8bb +a9129cbda3c7fef7725b481fbfab1ec2b3700b3b3780ce5e711663557e873531 +72c3bf0ea8ba03a66c5033602f12cd8aeb3c5cd0e0abd65c936cd7d973e8d3d7 +c5d09bec259f41005187115317afe5f6ef895eac769459c0ad7ab039febed7c1 +dadaf14d015a7a3356982c242713e27eccc7c4d7237052b004e8e5f15008a826 +ed515dd699e6bf60e3a2aba08c07b8c8d9df393094069e781c7d75b090445c7b +1741949aeddd01691102b001781598b87f493ed956b500b2d813d50ba749ea1e +bdceede30f45e0fac0aae683ae087a635ca344411c26a2dcd04a084b5d1774fe +c1f77079af1f9d8c75f383b3755f3ea120e2bef4375dccdd221e1811b4b775a4 +f45b142ae17f1654a53a938eab4c2b2e71293cdc8e2d18ebb8b502af594de4f5 +00795c3712a58bb65b8287aadf183e508d907290cdb9ad20e578ee485ca6aedd +432f01a550980bf7ffdd0a61834748fa4ddd4d2f561b9aabab279e8c131f4d32 +68d89b5f8f542d881286b3c8913a0a71036058755e2f47994157f645ff086729 +67ae4c8461191607b1cd8c4c83298a4bcb397fa5eeef83c5955b301fa270c293 +88d0fa7d58b00f5f79cdb0326172364a0f4f91e189101a2bbbbd448b576c275e +ae6b320f61d6536649b0b0f9340d25ed5ef2746f385bec9526a2d989271e9a38 +302c84169518891d336882d85871ab751c147d1c8563e2d7bf5c3a660c0b0ae4 +9c0981e96dcd4ec45c166f7a34270018a852d5108219486b706f84ebbe9ede96 +6dabe61fcaa62658db716919af23f384948b4ed54ed369dd3e6e9a4f0422f35c +afac114819e7b1b9a09bfd1b985e18e6dde975e610f48d752eebea00ede16f3a +0b090103100000d0c213c4425a5b0ff3193941e27eeb978c7a42dc6927bf301d +1f0f366a5d0ed75b8a969ba68c8106466db17cdf5b516a0ab63f3772dc7ffcf0 +4ff5a952d0798b68273dcefc30c3324ab824690821875bb8580543ada7b15b50 +aa04cefb22aedd548ca17e0c334493245c2eb4fa7549fbf0833f142967753111 +96dfd986a2536834b4dbee2945c2ed76205a05b9fdef35c9b4e41a808220e6d6 +e0349659c3ac8c3f86462866807ee5179d6994dca75b8d162763e8af6107b272 +bb10c72d297aa93c0055125a426ca0ef9a2c79a4b73060ff6b45719c3dfe2924 +8ee4430acc1c9c28f8b93f554f668cf14f39a728d7b2cf00523248d5877c718d +28aa6d2b25e1b0ef7fbca7bd87a1bba4ea760b7db91c7d8f0811840654860fcb +ef679163d03dab048f05194924b68433b76330a6ac806034e954b80b5a7c8652 +719aa83b70fd434ede624963a0ffe25bb1f72b71f3351164d1124712d58a79f2 +5c60a3fdecccb25a5658ad50961a756880b81698c2f2915d13f02ec6cbd28edf +587457d825544af042a800e4387e004d0701b12b8281bdc76197de64309c5a33 +463bb7d317e7646ea2e7bdf7c0a38e82b0142d51a055bb90689f11bfb8cc5065 +b98cb98bcac7c740d9b1676a103af5a3501e6949ebd9705131b7f30f10323ac8 +0e69159b8da52acc1bbcccb8096d378536ecb498900fcf1d21a92dfcadcca90f +cceeb56d38916c2fb64a9c9df5ceada68553e18d5c5d184c8c23ec78dd5fbc1e +f685737e77767afdf33fc585e5d4e9fa1d85446b1b209ed0f18e529dc1487bef +57c45e10759705297476b4d9b323b45c9d7b364df726b9108f4efdf1c080c151 +5d379adb369724746185abfb9567978b090f9159317be68fefd735a62d686ff5 +0b08e19c87f668aebde88f66fbba5c614415c7ba4085b35b3b086662064ad401 +abe40b7c4d0541d69b745f7e4a9ff3657e74c797ee656e721088409226aeee8a +be944ef94ccc9d0d7f4f059eeba35ad008e961a252119950277e7f1028305b7c +a09a5f4c99a3620001d53d8df889589c9aca04f525a39a67fe2f776fc650b3f2 +ec5a895911171356df2bef1fb6302d4e9ec698af4e2c4320821f37533e1cae94 +a5e14eb18f98a127c498ea7e70b1c8599d4ca425272bca3aad3f499130c386a3 +ec3632c8ce2d714d309b52a90ae662ffd310e335a3690bdd831f52ac88279a31 +c3441d8e0c6a741f615c78ef08502af34d81cb1ebd03af02a3fcc76b6648efa4 +d8e550d995bbfa02d5a1d08d0625432267ed55aa34fecd3078c75e1d8e4185f0 +390abfacbf6dc83e8e6bd75094a54a28ac5c44ba886c3b586759e192beaa88ad +b1f1e7b59703ccc55d0c4383875f8d9fc1e24d7574828f8db01ed10919e3abdf +f062f0350da3414719c765b600a281ac245f4f7a33efdaf6ea3cefcf081158e3 +1451b8bef0e8ac74d0ecd0ea1958e171fe2a1f23b8557556927b4db67a09a077 +fca48bfd110420bd160c931c07799fddc47df1d5a7050bf1221bf3c5335f994e +c002a6621068cf4630fc508cfbb7a89ed86593370fe36d559e4fad3853aa596f +50a4d4fa7c28ddb348986fd5e41c12aa6612e1b8ae69723decfecf062e7108d9 +f0b6f92c3d9251d7d061911fa6d35ed466763f82f669b3ff5dc1cdc5ecd21b23 +6424453dc9fd542578983cecdccd279cd52a2461499ff3709ca9b52e7d8ca177 +b59ebb7aac2e5a65dad9f3d07694e4f161b6c78c37f85cb9d21f2a4908c523e6 +5faf1a391066e68344a9f15467991f809d421af2cbdb9692e4ad9e64d0175f59 +729db92384af1d1c9d058b4c5c9808404e72db14c434929a2ee56772a623811c +4bd21e254fc99e23ed1f8b2997ab725f809b5b4a6a9019d61e82b151a3a03c24 +4189ad819e0c0852ece01cdb4829fdb205a3f704480c57235cef0b9960134ab7 +4b3bdc8ed7376980e75d48829dfa6b1f6b3300e2ed170771b9c450ff104ea759 +666461d62a16674950d54d804ae25dbe2540896e7a9fe57006efa21a6efc9630 +4836db559319fe389cf960f041a4d9a0366121a1ead35032afd4b699db7e6252 +abc9a67d9bbd956f5e99de22a0ca48ae978d2c8e018bff87406a9f0c437eb552 +e19d2455b56d4ef37b47577d009d14b2ce56b87966b8d2de7a7c423f89a22ca2 +60c837d76b2ba0d5c4817e9f67ea9348d65975fa356851a9e56c19bce0ef8aaf +3905b73c16eae90cbcd8c1eb4c8e9d840cb7158f145120e3dd6398e3a2034fd9 +95f34006745ccac381cf8c36a13bad6cc4a5420ebe75ee9aa608437fa831d5d3 +3113083cad048dc0730667388bdbed24b33d2c39f67f501f948fd810b8111903 +63e2fe20f823845f9a876e679120f93ba686cf408bd7d69237538e3751c20e84 +4b48e15f86188b8b1002be79cbbc75f226bdf458193c024629aa680f650cc8c8 +71f4a6983ae5a1598821f3f4d8a53aeca3fb8b3bb4266c4aca496110962a8de4 +bf4d133bef58ce2dda36222249d0532cb935804e1ab3fa15066bd90ce643ef8f +4446bf23d64a9212f5386f4cec60ac632c0e9d7404eb70303f35c50b3ec8dd5a +99d309b6b7364cdf5fbc1ef653b661442b260764c902e8f4cf6f2ff2252472b7 +53fdea2300d5d6e1f77e46494d6dc0533a77fc007e723591769fea95906c9a0a +c65f04a8fab8fae134b1227406bb3e44fa20a8379c91318d21315f730b208763 +654d279af7d123b98f2ae67bd5b2f7920187ca936b45b7e3d1da116953f1416c +46a41d922df8d5941e1a860879c052020ee0ebb78eab5e0936b1c8d02eb4061c +11c2cd1098e566a180e63cbc8ccf70a0298f45adbfd0db942abb2470bc1b9c3c +98f61b3ca787d0f823c90231439ac4c5f8ffc7057469b2955b9bea13dcd9835d +8d020f593e21b87cc8becab62522a1b1dcde669760e830be5c3bb7b12decca2d +785e1eafc5d6bb3ddb447c2e69215f7647d4e725a2c647746b7bc7f5df9d3189 +d6239ee2a2bfded2745418befb8def463433405f4b4c278295c8c2ad9ee43917 +11353ecb9ae9685f17550f208bb3eb7179a1fa69882ee2691d280ead58e93f37 +70ca26ac429ee5b8e0dbbb7dc1876f11ebe6f1a0dc330cdbb24b9cd1439b3044 +8cb62e50b33ff18099602c620af45674a3ec0c93fde12ebde8b1543c1f9c5d0e +0a12916ed048ea3244f07060235145cd2a366581ea658b85272d59cd429fc509 +8f62c9937dfa11d29ef22c74e5115f6383d5aea6b2de0ca4c5366800a2bd802f +162c3e3774b12b016914e4c4e008d81b0278c336d764dad0cbbda4652abd4a8c +213c7da9c9fd6ff7270575c6c15bf622b6f6f4802ff6f7991d371a7f06755ff3 +cc7b344749f239036a68803d367d121a24241a559e8d64b6658a8363371cd9e9 +b79231afa2f6284a1ba5b99f18bded77db058469932ebe7d405cc7fad3224536 +fa5fa3f7c643637960e88b0e50014a391c65f22424f7edada3a7dd72a3bbe5cf +47a7dbc05a7955d77fd115db666f4858df46260425575b8ad8ad44912540ff7d +1cc336c3f9056df50f5a0a2c34f12830f81a332b982db204d218593b804661df +5adf14c6ff71504cf9a6faf948601e3e1319c806301ba2915fcb59208ca378e7 +afb5adee01e4167cac25e8a1da13034162c5b1d648bf608174a38205ef838067 +c4943118642ac1d5723eccb0d5e365226ff4c34ab97cec6c9ccb7b73c01ca8c5 +85ec906334753fe353bdee090a79bd56905deeb8e4314620e509a83867ea1c19 +a16599dcf0f2d2f3eae58d8bcd8da926a1af99b4057ce29d6ffdec24a7db1a14 +4ed9feaedaa325b6eb583ed87901c43f9f31bb97563afe8630df00acced9d95d +4b8c1d0f47e02a76730b960e95fb78a4a11284923e9c91a2a5804c14ffb3e352 +943cefbcb1dc6ac888c3a332528a89ffe36fd2824c48eaca69919838665a3367 +7d528ce020fbf68a32d10f0e0708e16611e734a0b20d18aa6dcbf8c450e2b5b5 +f09d32c94c115e9ea5e1a634a163cec01c3a2f3c7826ef7e9d5e8d19d4c4866c +84666db73ec62d9c5b2508b05145522c3da50a31871ef2b6ea0f48187c191e06 +e0d8160390c05376f0eb931bc07007fb313af86bc0934bcab824073d6b30aed6 +5bcb843f80cfd4c3ca11926c604512bb9c14ddc64bed2eeb5522a4ff3120fa47 +d454352891efe9fac5fa88660011a8c0ec0570e0430b19b698160d4ddebf7051 +079809d76d8aecd01ead398d4e2fb15423fb38a6dbec48fbad2098a9ed738f81 +f6330165622f646fdb5b148ae89168c3a1fbadedd5d316246ae37e45bc896d9b +aee9dff0f5de45b6121e9a092ac8b4c69eb61138505ec66b367f59b0c6f18fec +c0010864ccc7a0dfb650115242f1664ec78b1861b93a82a793ad55f1d27d646e +90cb1534ffc6b9f5e982db9070fc65c9559b67285696acb8c7d680e7f109890f +4df338c15cc2359fdc3d52bf64c5f1f04d2507e80b4f3c51e68c2fc099e56fcb +89d0d3bc15657fce79a2633352e4b6ef022f23f17c9b99006de8f42b6c09f5c2 +c82d88b0bf013d7500e10a838d34098b657ce411d22916acfa09121a3a84fce2 +a6ebf229b12763e2f5777c99234ec8a966a7858330ef3330a3e3d0fed0c8969c +1d5099164cc9f1dc0e398cd9d30bcaf6a4b02b148705de166306633ae538f9cc +e791641864e73441382828e68f406a673cae2853224428921ffec808630e495c +64ab4c0754cd85327bfd7fc9ef957642a6d30258b4b9d29bc059392b7e3fd339 +5a6e5a0eb060f9dbd09d110fadbd8a061b1ee8880c61e01fce52c661e1d1b5f7 +cc45b9efab2880a9bea2bd64e8ec183632b1a7a996baa7eff23b18ccaac6c88b +1835eb751974d2930c1f354f5173c9266918872eb7c70d90f64113f12b86e6f2 +eca0e29c4d4c20fa26df487b9be3323ef6de8dfad3f81c7a23a4930fd3a1c6ff +ae0a952f8e074f0f034d4dc16e0f3c11463a57ce0c14fba845733568ae0e8f46 +1a00d55508e00a80be53d818d38acc4f7212c628cb2047f18bcaef075e7fb3d9 +6d090ea9a95a21ca3e7f797aa2934653176bd7ae0e72c52dc19196142e571338 +572a939790b6fab6592f56f8a876c99bc0f9d04afb37da897e2dd8a3818f9134 +ff6dfc66c7142738167ac5688b4da11dbbf343aeab2fddc82631fc7f5e3e5bae +c857ff3757de3c01f097db34436e6d9ce0736734acc91c447277baf1df07c5ab +ae7bed411bb203043f0c16155e38f62da67dff78f94bff4e8ee86e0261628487 +0290e8b302f9941c60a04973aaebd7ff2c4fd0c5fad6e85625921e641b73bd91 +8ab85ecc505552442e1d1802460024a9d3f523fde2d1139733fe54e74dc1322c +0d67261490354ed262e2601098689d583f0feabd9b90fe030812442be5645817 +5fcb9cc603f45146004f4f06d3b6325adb329b6c0686403678ee2901165cd44a +f85d7977c6e3c84a0c5f5d7ac40be097e91259eb0928f84166b2bea549d82ffb +e2187555d160a406a8f273d18778b42f37ec7045734e579b9a7141f48559d8a1 +2a491e774eb885449bf57ed3737c42ebfeff262bff74eed2d0a2a8915006950d +24b1f2ed4bccaaa7a37f126759e52034dc7264eedad951a69dfaa509af59549a +f2de1eb4a74f18abd83d7e8bf00ebc4755ca342836ecfdd0c11221aa26c187ea +95700568592036fa3a03b7378633984b7340e8080f82355c2a572579c06d2c86 +b3602943102236aa99d971cd3fab42db95dcedf44d04c8f05a2a1381c6e9c58a +a526db2ab99b4033ba0d339ab2e1d93b57e691e66efbb79e627f2d0eba005080 +7ed4a60011be87ceae68fade61f969daec01accbaa640cca88a550c7de3b13c0 +ee86bcc1b3d11cb069bb2c205c205b35da97c554e0eac66dd8585bbfcb18c8a0 +cb3941d9eef3a493a2f7dc187a480d21a7b4e5285de82b81e04d6e239f7807a6 +6a334b6c7bf6fafe27c1a81c3957ac1590de2f5d74a0c9b8a990e2dfbde91298 +30c494a28e29557f3cb2ae8a6637fa3d83eb11331f8a3554a1419d8c5e84c1e3 +35f4325506a08bc8ae49a113a5c3a10f6d4b5446fca9a287d02d8db0bd53d706 +00137e83ed703f3e72e6f5f3f2fb14b6dc3e61c1bf7d910f03610666f5579a81 +644c5eca8ba56df6790561ecc91db4fbb7872fa49d2b7f10ba2aa28fb9ac85a3 +4d571ad54e98993f94b7c551e237b314536681cf8e42a26144ea39d9f9a9b295 +9aff80e5b965d2b3127d89e27ab1c8804c68ff4a1ab678ad2f1bfd5b2df38985 +bce719099c9c7a128e29ca4ba9187ef9462d4059034d7379a04aba778756f48a +2373c32c4b29b769c6e9fb458bacc4bf10bf25320d757b76bacf1745c0593e2c +fd20432e32bade5a213d53c77d56d34d67f436c1566395e6143c36c16796cb27 +bdbdad5cfe3dd3eae67b9474edd492c85879169324cd9fdef636d5b9c3abaf36 +edbb4ac14a98893e36dfbe7316c3b9dd3c072327b0bee8bf09fed0a0262f0e5c +08bb6dc0474ac2b428a4c1ee5b624bb1833be8b2f4b14c254d7129a2162308e6 +48035a579d1a7c236ec5bf6255630be94bf6129b96989b933f9ce2745f69140a +515da1fdf975588afbd4c39201ab3ae8b016635c2bbbe6aa27bdca6215617e2e +b9d4c0e1fdcffa313d847929c37ac7b07f96b0180fbbb67f46e9b6cfcae1a66d +4be0afa99fa7787e7f8be5a04e723d4f30abd5a25f080f51de36130b7862b025 +eb56872f2744686fe5959fd51b40e6d11876f61bd9e3eaecd57b40441b5bf86b +378c83c4deaddddb6ea17f6997549eccdcee9a7a48a24466d9c55ed17d7733fb +f323871fd7bcb8414609729c27575ba9fd429553e3d63ecdf78851b72dabe4eb +9ac67e961a4dc4cabf70946cfecc144a87dbd9c73259455199412faeeaa3644c +2022489a3136253e1497bb3458be497afd4c9049c4a615a102829c85e9a4576e +350e14d837372b4b1663d415cbae6a3a954880114b13a1c214b61ea6594127e5 +742b98849778893631b67469aef59b15919872a7cfd255910f17c53576f03571 +0819d59e2c1a46d0dea64fa7e03a63256a8e65047a1ffe4fe36497d2281b6aa8 +9ce1ec831cce61de63c1da6c8a5672c25e5a5a7bf20a7f933bfdc45cf7bbe921 +42d8625b3aac773bafdcc614425fadc62699de088714b72691a1447506e9a37a +093a960287e418f2e530c537c08a3e19ec7becfa4ca9320b05f27974d4c22ddf +61a0ccb6b866d8961f04f9f9b85809bc57d358cd918dfdc9603b32fcbea81d3b +e193034bc458941b7a413947a1594e46b4ac9bdfe9416c275807a4302694f7b9 +2a226b8c96361a389a9bf92a47b28e501a06d91d6cd54fd2d2707ce52af2c279 +24c6e95948a936b4e0cea35c6bc62edb1f545a28ab762ebc3c2ab4c4c3a670fd +14cd631fb5fbc26cb51ded32461d69a2b82c586c40cd1841fa3ba780dbad789a +cca61d286389dae51295141ed27217db047eea3247388390c153c22f949642b8 +5f87f9193421abdcb6d4d3882578f9e70b28ad6238d1fc25877f42e3899ed0eb +4cd9f13eb898e67a053d41ec485931655c9575370aa8f4ff30e8d3e7a26bf27e +f32f2ad0bd244272f84af019bcb2bc6332142b4d0bb50fcfe13b9c4e9883f0cd +c4773686b3ebc08b1dbd2ee12fc3f18a28be0610c4bea2df1543ae37dabd861e +2c1a65515d8bddd314f8949b5941aca77220073b541c9ee457e24c862781f8b7 +56fa69719cfcea364a0d983989ced39ba2c910fcc25a00601b0340d8d6083f54 +73d54c577012ff8895d006922198cbd4718e32d5fdfc56143818901a670d67e1 +0971b6754390848db25f059764a99801ecb89fd0f38d46c8da9e01011bcd32ef +c3c445769122d22409c8492bd716782f411aef4b4e0f1234a936e71b9e8a6237 +9b18088464e5e2934c748c64d69b3f2a92d81a1e0ff81a3150013c3764ca0194 +110f7691c3a2b8809900ab262825cef744812fd2f5566894ba1f8d2250d98b89 +a8683f736d4b5a59f51f2e332c8ed0751089e9c51b91b1c54d9b260e312959f0 +c692d4a760932264214ed92c3ded8f45ed1f40dbde9f20fa7a658b6a36e121dd +cd1bde6e0b8942715b5080fc04a7e6db224faedd8c5778219966177e476de4a5 +a22be484107a0c11d6eaded4ebb020651777add24537d83b6d61b407df0f60cd +34ee532a9343f5b4231937839a5b330df795293ffb2b27521d142065edeeefc4 +8fc9f90558cae326dc18fa6b759e4d0db1decbe33bf3c1fae3e3ab33c9392d62 +429506196d1050a0e2da447161f2e323103da806d05c40618288fbeff828d053 +d3c6e0b0718f5c9afd1581f0098eb9b97c35aad2cd590e97f4a139733cfcc7dc +acaa5814d3b63efee7c764c0d0a8ef392e3dc3f02c8e89f64fae8ee4ca05f115 +4314eb98e6a0e032886fdf29692dfed62802e84b48e4705cc0c158eaccf4d7db +dc47b91aa3c5a49ab600679c13a2177c145759d8bdd337e35c77717a15c55caa +45339aadbda46e71a8a018d7782b9299a2681c927888408328699da5b8cbc45a +b2705038b818fc0bdca4d52896057e105c8b859a52676735022208a76abe3f53 +3b012a22daadacfdf29aefd86f67ca840a1473dcd650f03c315f23bc6ed8285a +9d1796862a88051a4ec70fab8697b54c53260eb12edcb9e533eba6f9c1668f5c +9709dc308f35b927c974fb1d0c58757086770e1774485e757f1b777db15a6857 +1c084f48b3da6102cc7b38dc89f7a8e33411d7e35434750ebc98dab8439fce99 +37f7b35ebdef734e2b44faf3dc68fd5d36e8fa82face91146ca6bfe1b1710cfa +60a6178c88ef1137074956c67cf81e0052d7109debf10409d752e3f770933111 +a069a639005c0e043d42f622e96fab8a4a203857a788b32d3b2b5867c7fcc075 +9236e5dea77a574f4cf964d0cc2cc786c6f0068049f20015dda844a3f409b4dd +bc95f22266529f58e88eb9568ba44cc414535075b383937d1b33135f77c87a92 +9e77f95cdb0d71a1807f1193ef20ecc1c497df8e08732505288fd2ccc73b77dc +cd88fa4db43b9410af1524b03864642f44ded44466b5caf39429e2c18e634834 +11bda54bfb6787cdf3810a3f2e15141d7dbf09aec5b80675d65aec2c66e80177 +4bd3e428b6d111e50d6f2e6b5d4d9140689598d147473b57a71ab08080d37d2a +7f2b89ae2f5948eb11f3808542b8af7ca2173bd33eb513c67f28bbeb87627ad0 +09fff3b7ab0c2deb1668fb922649bec4bde78448bf7070e07b101055584d002e +93826a781916f1e2ac7d272f1a31611835737d54671d9fe6e5b9460b15e39fa9 +af198819f2073d6dae3b3763abc240732d719b0b1c8a37e5f9f76103e770c0fc +9343289d8cf3cb969bb4053cd377413a610084e68c255a6faed405bed1e4437f +f93b34eae37559b78cac42761c985e280b92c57c0641c244f3c480bf57fdbf6f +8749fa7a45d44a40f690d7cbf8b6d9d014a533b8fc62717eac7e069cbe6e3a2d +62e0472bdd23f0edf4202a643c8fe7dcf37f4401d94abf44c749ccd26c2d8fd7 +1ebf9ecfcf534280e759959c243f3592622d799747efa7d5b75964090e0a3dbe +dd08b6106631bdfcc890bd5eac60e6fe316e1780b0073eb4a25dd38ea62793c2 +e3e73f9c4ec3d85693dfe038e322c2c383193b789d13c4be802852b7c877cf29 +4b58bf6ab55f9d6669bae41771d926ca28aa6a58c2601f13fd1aa9b0d7b481f6 +2be12d72c3ee24851851bbaca53045b24823e02581988e4432a8ec843866efbe +5f4511418efec41146309c7a57d665d8ff4d97dd85578dece104a6589ab5de28 +c7d3e653f01ca8492ae98a2dc7381be07abdbb5ca3ef9241ad0e74561f9f5a15 +2ae8cd680fe804aeb1f73eba506da5aab780d3fb24f617957f7835c406c2f017 +1bcedf43715e7f01450f3bdd30c91d91c64e55ea52a8fe5423d54965aebf4574 +b1e9c8e46c78b76fb87df3491440a7bedc74af6a963a2d34486b81daabdf4ff0 +37529951e2bac3dc85ae2aa8a2a0543a0093d2ad7a872369458db38188a346bf +43d572f9e2bc2f780ec70a5b65d94aad411f888b5592894da1e4486a0d800895 +c08accb0c9b8e0f18c0ded81be332ce12989c95f451c661496fae73ed7f0eced +8a9a8754bf7778ff0b4cb4ba16c67c9a905e781ddbe16bfa57462ccb6044d891 +83d761ce58941024a403ab718764a1855d0673d39975a286ac8b32f043176f85 +f2efab1f0a0fa4e32ff159be4f53292d5e393262e9f6404b6ed6349ee4ebb62a +53dfe5dbd2f6b63960cb2bbbfa89d7c66a44b2cf5969ee98854cea3e04b27c19 +f4c79157311318bc975bdcac70548ace6dcce4d71e506e4fcf2eb115309a4444 +f76b6c271017a02953d0ea0a2448aa832e89ab0895bcccc314fb02968cf754ed +3307f1c59306eb773d7f63f7b853f0ae71093da716b6c0b8ab469c2371c26c85 +193ef171b6c1f48c559146d1989af1700d9d08e3d60ffdf548d5cf7a8712c75d +24ad4dc445f310b625c4a00e0879b95a2699189cbf88fa7d2c3fd191c963164b +d363998c215e8121fc3c44a6fd4e428b244a8f2c08b3b058220bd3a83ecc4b12 +24b192d8972430693d9692a045df6f8cc8e04829a1ad2a690cb876c8c72ef8b7 +d04a119430d9882aa7b4994581ea9d846970e80f29c4e4386e95cc74e60d1aa0 +e0eb8d5a9b018dcb3bdb9fca1605efebb39bab3abdeed7585fb989f8149db2b1 +22bff8090404c44bf2da1492a697454804b85f7f282f78ed0df62d59d911107d +524f6db56e00f897c58015f399bc82d4340a62025c7867c38f7063dc4012a795 +016ee4d90f14c9568d5e324e73f6b7c57ee5f5375907bc403584eb44a4e33c4a +88435a399d72307c46d232ae24b3ffd31514ad891b7af711263d5778f1412db7 +4b8302b179fa8810340f07fc9b0acc27c06c915f1b45dd1d4d238e00796d937b +4539a8386a42d6d73f66bea6d8719d057d54cfcaa282c4f06336c05285f53667 +8feeae08253eb094aa8290c40ad00bcb7e1ec20cc99a0ceb80f08f8f356657da +ba56829d869fde7c4645559f9349d3371efa44f58bc36aa493d9a0624b5ed4fa +935703ee695de66e687f27e1f88228261eb8c5a42a6c9b30eb45227874f42fa6 +aeb66ec01d1b140af535b1e28d625b1849d2914cba6545727125f739bcd1da1b +7d1fa4b2b0e6db67c549e0e2e52953cd3a240d3eacbf623043d28b119193923c +94a15f4773e0c3c974325f608d0ac0015cd450c02118fef94cd39341b8b1144d +9ed9f3764f3c7796bae60881f6d9d84e76fc18ed060cc82a1beba6123f05ea92 +9a3f3eb82e2ac1eb99e5c6ec65a9cf2a4e0b3c9d55816779edf45c429b49f553 +f0ef1f1c49966a822920230d1a4dd6c05e2c676780ad7a6cd325422d3fb97cfb +1594f9a31f0730c1c811cd0533671940b3dca7a70fe1c1a79cb4d22194a7eb83 +20323cea558fa1ab48573b4d56fadc9ffc911c8e94680985b0f527be4d218233 +890a06787f21b60b459b8a712eda9797f9dfefea8bdadd077e56ae6035fd5ce1 +a405b543538c790b0bac9c7586d9677feb4518aa590e4b4499902f8afba48386 +908d301b8ed6b87ee1f1ddfe80c37eb0affdc1406617d37613b9a3e82694f7b1 +60b2d43483a09811ea5f50cb559022034d9726c0f9f80b5efbbae8d1dff34e34 +ad6a03f4fe2396b50560fb8a9e9edb2c33f359728f2ff393da760f9a50a04320 +916a583228be053cf17a11246d97e2adf68891b73cf607a1c2705f9066408137 +39c09fe101bbf9d6f0be4fea0b469c47ce6bc2ab1df3c5123f3693ecd1e29ce4 +20f76b77f99d428254f8bc54f0cb95ec02872f83677bdb3aa42e6ac247df1a65 +9c53f63c779b4a2d8a720818033395d47798594ae67a5d84c4505697991830a1 +b244d86dbdcb1b57499332ce0c7c2b69275d043e5be094d835ed3058fef037d1 +2771c26dcbb2da45f3cbf68f219f102b5926200726ae55a214c5267b0ea374de +41c46376cfb6bc7c005fc5cc803822982133c604261f3a53c7f100fb43638195 +5f4d544d99e3296fec2d65b9f3c40636cbf6f6225e62498320a0148dea171546 +6ec4a4a6626c2d69ade49abc9856a5df5d5854aeec16070750dd7de29b8b6a30 +63aeb9bd772f232e80080f9eec514e8578ff7a51f2d7c083695c50c679130a83 +9708e9e7111c6d8abeb055502ab14e0e4310676140a79bc88a0cd652eaf497df +e92d43ac0bc724892d7b44926852030ba229527177d42f648f829a77942f1181 +2aa4688d4953c18b231b0e016441022450b6a4efa08a10b550734c2e7794bf06 +567fec60c62d0c159025dec3805ee2ff0e85280442f9cb14b5e6d2cbf2035153 +b49ba7836a372a2c4a4173e2b63fa839a368ac7896cfe0e3c8b131cc4385377c +b4ce47bb4fc50e84a24af35342cd3356b1299d421ef7d172679816d7bc8ec23e +e778c76e59cff801a01bacea63f46568ce5fdb81e5fd21f9f43661a9f8815df2 +58e2e9de4b22fb8b2588cdb3037b5725ebdd76a50ebf6afe36eaaa072aabbebd +0c6adb74468395b34b84567cfa423b19deb4bc67dcfc86345cda9a9f511ee834 +a17ea4349584ece87b4fb9ea12718c600a1122c1096326e06e193da1b32f9945 +3a40f5f8b37245c99e5225c6b75e1bf9af0fb5d0b522fad58eeb2d6dd9d63ec3 +d9dc272a5a80ee7626651f9181ce39fd8717c870dd9e84ce9e942e1713c11c6c +87acd1b3415c15ac0b34c24dcdfc59acdfa56d5980efbeba111a4e5693c341f8 +613d83b3a0828d48ea00487e55a27ee4be7b93c30bee530ebd2bd0c41e280f60 +eaf6ea444894e24af55e04c7892dc8860d19dbd60f157537e2808d2f561bf869 +143efcd8a7e3e52911c58f2148fc2485e3b37ddb23e933b074638c6459c09e2c +29244a49f8e7fc86546210e7bd68b966e67333b2b527ae20180f8af858a1e2d9 +8f21bda6e98e02f310ad7960411eb89bdd97e79751ce5cad665ecd7e7995cc6b +18969d13e902252b163eb346857d6b091c1f8e5f7ac76284be6eec4748e92c68 +4e31a333726ff7d5c1fe6d9867814781ccbdcbd1d270cc2bf014d8d1cce6a8dc +b184f18651a2cc94975385906e22128aadf419672cc862aafe5110fd9cb4a028 +4f7413e4e244638660a20968a81ad923eaf27bcbb2aae3106ebc5050a69a92d3 +483e3ce8e5ce69f06edfe2c6a1ead8522184f4beff28313a8109731fda4228ff +e3ca429f4cfd68035d2f73667bf0510135d968fff85cf8c516a09cf60bddecea +8f889b3e63bbb6ebd2ef7ccb0db00ef5a92794b162c82846f7fcf3e69bc6956c +5e63776482c6043bf73c986f1f18c6abe32c71f1a4a74f29e9fddada315f5ec7 +e4b38e1225ae92ba3dfd4746ce74c1004a7c2007bc3a95d0bca6eedaacc05078 +ec3a6e32fe37b6b3edc1ba46da5eb8bb981867b64404805dcc91b4b5e0b527b0 +be53e79596a7db573edd7f8f913082e0ba15e74d44ba59f89b0c9d46fb34c2f1 +25ce2d967c903debbdf67040af8bdae68ee0b1e0e89d79e9bec185394ce531ec +8ff639e1ad00caefc9fab3880fccf55dce1e3937860b25a47aab8fbe4376f854 +f0c983ae950bfa5b53ac225557d28dbef67a89ea7571ddc8a710756833bdb5c4 +30ce1ddcb86623a82cb4e1be4ffe6b777a0a8409813580b75a89f6a8c65e81c0 +168dc486916be4f40cafa4cc6b1e22d553963b2449e00796e459c57b94e34ed9 +5bd4f1eb9798dac04521d031bb8eef565c6b0740dbe50f0b23fb1d799fdc2f61 +3f46ccdd6ff1ae778909d8998598fb796e9921069e4766ed35a4422782f62338 +a03acbc0a8f42c0dbba5917d7fd0bd2481e1835c660ceb5f2334acd57d4427d1 +97a82e44b0b172ee769b69666776597e018d05db7161e3662e42e0a1d5906c96 +607ae2ed6447cf857ce0e58984d8c363a3a6516bf4713c3b23246232b5e512d3 +9d2c3e32c33408c03262cbf5c517772ace92982b59db582ff69a3ff6c0497405 +8dac147089c03c44bff3ac70e685939ed4c1097a0cb6bb9fb399c5c0950f6689 +5dd9f05c7d262061813eca80e87e2c15a266f5be420796d1493ff3547db70f66 +26543b1ae2d6fa431c5623191327118c5eb8b331ccaa0f198f062c51cfbb981a +dbc442937f63c8a0c179c2c42d572564bb872a2e6dde8e7d680372b157e840f6 +6fef984b009c671bbec94d3446e85579806b11586cdfefd7e2bffce117f15e11 +f9f47bcc9e390595b06f7207f6457cf1f775f781af79b5b825dbbc98e3858056 +aec61f1d9210769e2761f216f01038b24422e67b5c2386182a4e9382d1f345c2 +c6ee6299e4e3a784a4166183be9c2628afcc27c45ca0391975591961cdd718a4 +3c3d1b85b793b5f3a8b6d7590daa27eb6e73ed7726d9719b43aa13e05ea7ade5 +ccef5bf1333eb7880311869e055391412a9f09b676ec67c994783d0be74cca70 +76424bad7f2c80f031c2dcfefb6f2c8e352d2f41e010dff7d37dd6b03cfd207c +6308d43432d33a1ffc94b74248b5db43f044764a865cf2a6671bb1f99a7e0df9 +5ac614da6c4a8d2f8fafef2fb5358abeb8cf307e0a710a4d3670de75e0f19410 +3062037291a143c03375e6c1fcca2711de12aafacdd5c071adf22c86dc240ce2 +d5182701ade04a8a1c73144012e2b88d4d5621e76a26dd5418f171f8edcd1dee +3bbe3d6a357b75a217a40e79545113fa2ee15ac0ea2a94b8abdc82e7645596b0 +d8de0966693b23183fc34324b6b7c3d58dcd3b9a6fee2df7b599ec03fddc0aac +632305776c092c7d45c8e64d9f4c4d9342fa55f9777ebe941ac71abcbaa94a0f +91ecd9ba159dbaa6ab418c1bdc3580728705e782b6259478a036df71d56cd481 +1e5679ec3fe59432d6491749a9653ea2f22a16cb93a0762e7f2aae8fcfdfb43c +fee053fd488746b2af285ac480e7830a0707adc87161595a5cc5a81feeaae5e7 +64a73af7c1d7e8c1dcca93374c6dcd57d0d31c479b3e89ff4135e66352290dac +86d663c53d9b2f4479662c8a335b00ff194e0a29931552a641510bb9b08dc991 +78a63331f41b7a813ac7640ba77d7a82d9f9823f75c01175d49d2d357b2be420 +b8137c3821f260f3dac79818a7d0b4d86d257af7bec5fed35f157024f89795fb +6723d13bdc0f41a1d16cb2a232d457376acc0e332fbe5b36344fbdb22ca8d7e5 +660a86f3902f04ad8e1685998888baa9b4e0a2c064d2b63cbbde79914f3d8f52 +059ba32a5f541fed91ab69b69ad53d045755270345d3ce9916488f75bc83e7ce +041b96eded251aaf6abc9b68b16da135f86c74556394cf9042b54cb38784c548 +6491c83043598564ca6c64ac7e11fa09a3c3887fe20d9314c21ad36136e6bc05 +561c0c1e9be70079846939b84eafbb0030f4a9b0cb303cbcfcf16ddbf44cf977 +7f8cfd027bad28fb461b29ec10abf2655341f0dd3950a508026ad4031f3b139c +1e16220521c36ed2f7a0e11780dd8982747af44a62bf13bba9eec406077238b6 +a03acfc88709d33589cbf6341eb2d1f3b096e515efbca9b6c1328d97cd840dec +e341741bac9d0ac07f5608652af7caec833adff0e09eb728588a6da3e3fa8038 +b8c1f4105a5fd50dabc7609007ed1ae39a0b75f11772a452ca7d0bf856e0c9f4 +fa0e98d21df2f47924528b6edaf372b937d3fc9e418b6e5c18058f93d5bb0e28 +a2b59dfb5b5924cb20ba6aa4a5e5a1239e864c9de629aa43543ac2eacf89f6fc +cac316215a3295ff05f42bc41cd8504f33326a3f1596c63f15272c2484386544 +9ce9e479d5df3214c91b9ee0fa94da29036912a6b1f2b8e240a9123a6854d84a +08f647bad14829aeb65a3a6fc8b7cc53723b992db9a94d8057c33c369b401ad7 +1ddbf2078bd8ab303b399002600d5eea4dc469535562e1e6e50366728441fd2d +35cd771495ffa169ed4cdac01f988e7ce5c7d28f9dd0093bb95aa97ffb30bc6e +dbe2f71fd3e70aa1e2de7cdbe96181e92326d26a7558b1c1fd0edb58c63c51f8 +b1d741513d98e06d3769d64e1a11fae44088583ee7584e867b9492e66e9c7114 +3e165b672204d444aad59893d4212860f074d1c6079a261f6b3e7383c57ef17a +bb600552eb518698dff54a48ef83ac82ad43534c07dce6e9e32078b5d60240f8 +b10d07d496f7b7de76fda6a20db434f88428dda2c5320a38836ab84de94645f1 +c511080a50d8254c0cfb67bc3ac2101c401541a34959107898bfacc611bb2962 +f4b3d1ba8006c28103c2a55286bcdba75a3537f81e7cd0d02a9a3f574cb6389f +332983f4cce98c6d53089588532402a4b8a1d1427d550c7015e5ef584272160f +a044a92664299ddfc990ab0c885666c09b6f2d6240db9f7dd3f1a53a6e312a80 +963080a78e62169cfc1a1a7a329ea2998568d9be427b7c69a504e56a7920246b +1d12fc87e7f797798b01aa76fb34594749fca31041373c2a3e1bdf066c839925 +fd89b479bc991372dedcd1c4588f1edc25ba46b7f48c93d13ee470727c9f9f27 +dc942e55051d4f73af8ff183bcd232980fa907def8f9192c3397552070d0792a +0e13f3dce6f14c904992940dc66abcf4de5d31be037a8d913fbf6f0a71c8a9b3 +ae5962d0e70397aef6d42d2959bf2f4058f4aa2226afdaf9a24f326e37d3757c +56d590dfc41a5a2313ef3a460932e71c16229a152a36bfda828d9d68a411d64b +24e4854cf677d412d22db866c7f70ce1514684a9a09203572a0b5088ce3d2652 +b014a181389279bc373f982b2db5d6cd9e6f17af6dc1ffa3b05787c50ff2b9c5 +21509b9ff68384217c6c8027b93478e31083e71b91ac4e8de22352ac08aff22f +e7821600af0d1a269bc56a658bf7650187545a1ff2b85d73c969199277a76dbc +5f1246a6a7066720b62310321411be865fabd80cba515d52a7767fd70d3bd0c3 +7512150200b4d5e8d92548bd3f392c1f16a55ae1a110fa2bc6ebacc5276e6983 +7dedca629ff9d85218522e59566991ac22a584af50b6155873012e623e64c0dd +9b029546c73368bd1a91a1365a3082b715738d2d470b4c9cc0798a9d09756157 +74b8b5fe0fd88864260e3af1b2cb01f3cb6123834a468fcf1de1f1ecf945b6fb +6e2eac258b0e67cbae19250eb2ec927bacde291d4424d8a5537bafdc2bea300e +3fb2eb614a952717fa35749dc90a683359dc426d901b4f407710ca529f6d100a +143cc3264586dcf7aeb6ae1e0a38ce7efa0bcc2eaba937bc1d924c61fc4e1214 +f421cab4a51d223cb75fb13258fe0cf3001760df8081e5d8796e329b2219c773 +4ba75cd625e873f19d07dca484886174c089c1a50482edce0b33e297980eca19 +7e80f95612562f655958510bee41fc43eb6f3a6dcfac20af5492449994016664 +9f17f649844b0061a2c7bdfdc3d2d8bbc0decf248382e29b34ec934c3be95aa4 +4d7ad210d2f47c986bb74b162a8b646246e7399dbf42e744dda2aa4814f184be +9e5b40762dc25102e036833f22f02ac701bcd27adfd7233ecf8178c4406372a9 +44b2afe64739bec4f3fb782643245a7c76a541997da6ab9273d73b506775db1c +d1009aab2289e1bec86bbb3079e20b0814a0dc046c557d8d5d9a04fcd8deb4ac +76bc3daaeaa95012770da4d96120e153595c2cfde91499ec1d3371e4f662cd2b +4b3becdaf3d3cef3c93e786bead46fc8b7dcafddf067e43571cfac08e2c2a94b +33c824176159bd0612cbad0ab9c87e86ecc7e6fce0e09ac6b42aa81cf1d216ca +5fa78b5e5df6ea279a8466822c15e9c570c782dbedfd2a2b472dd555551d7e06 +6c582844169e4ff992f0632f3a5d84d0ad97e5e0c87471714f87fd02f7470af0 +f64820292af14a29e600293cd53e9a0d3c2e4a10386913a08d3aeb81830745be +be651d33c4dc3f9a362b295a9feeaed0a2691659f86846dbf96fa73d14c69fb6 +2934e3e881ed6ac09db98bc4d485ce9b190d1aab30e1bb2c6fac242505c68e89 +d796cafde8195ca0922fe315295e9644d4aed6b4f2a0219784b3933b7814ef25 +5e37a309edb100a6a9484778f195f1b89620e7a46a719953fbf11ea504575842 +9deed1c4d9d9eeffc4988e1db72107ae09873586256168e00f74efc803245f90 +7191058b70b823f06a5728d4bb2cc329b16b1622efe45898da9c3eeb82a0faaa +ceb67820fc60ed2f8673e089ede97024fd7e7a4c34fe53882f09aaa8fa14d5a8 +ae172b4a20774dba7e98bcd626b6f45ff15742fbb2586c581a44ec7197019e2a +2a53038e15af2acd5e33fea4f76617d0bdfa83fb7a8ce070abbf357a394c166b +7991ccfb463e4178d4d4e92629e993639b9f2e80d90d0e040e12c60b563426cf +0c5444224aee42c44f7dedc06aa93cee86fe7407f2f8cb11d1ecd71852eabc6c +bf25ce66d4776da60f4daeebfcafa240620e9b261b922ffb670d53007ad659ad +f25e33c2635201b15afa6ccd81b225d9d59ef78e6f809d03f39b6b968deaf8e3 +b52bcc1c9dc6ff4de50d039d98d0b36773cc230153fa438f8fb4de8fe1f0a3d9 +548ef3078abac9aa74bb499fb06fecc78db02bfe48dc441510a393f6805613f5 +a762368142cc9b1de1163bee652ff1427f0b81836d42bc0d50e70d29846115f7 +3299bec648eaa5afa960b13740716767c92e4217eeabf4f42f7773cf08eede70 +c092e17c4be3e18a0a18bed80c2538f53dbc7410e9cb346df72070dceea70d68 +fcf91f821da4fac781a50ace3f2fa9a4d1f843e07d24b906ac9eee025ba98f5c +29de05050c88a0c5e645bb6abb68ac9b6e1b376e32d0e6e312bf8115479bdc62 +c34a9d7dbd3b7232e96e326352c6957e316c4b68befaaec0d8c72835a4833ee4 +e745985eacb33c712ac6639f86959c11d6d22c562de124dc83613e86e9359c07 +a1517830eadd1286aa48f699258e9d85678cfeb425680f630c5090d9528ee401 +26b02bac723e01b5613ef12dc9dc22f5c3061f5c39a3948bbb46c20fe86f48c2 +408bfc9d8b8d6bbe00b14bb86070df73dd49d24db3e54a11c87aae6741ea6419 +bd9a370f71f23a42d2ab67d8a7b01967416dfec9220c40ec6203e0739034e29d +ea00e150ad58da630bb057036216c811a26fd1dc945babf9af676f1bc6f67a7a +f4ff3f67e34677c5c5012de714c8c0fb6ad2cebbccc73f82b0cc4b52eb992756 +51dbf27622056839bb491674f7632c55a7ef67b249e3d695a883d6fc0cdde6b3 +79cdecea565d186d798bbf65b2a420896dd075df38bd54236a93e968b5d9fd75 +cb178a7da86634231332d0382a0e58c800f453e1fc1a83e19d17115037466395 +71987f6a57092bb46e0ae10110f84d1d959c567b67b9603d22b4e5cacdc827e1 +85e5559fed3b702e3f79577c4b4b3ad26fc8e14a326a94e776f4ada16ad544e9 +0b3a19012f9d6e0d3583f2e814648e86c01561fed1bddcf9b3cde825d0a7eec9 +bc7aeb705c5d1476ecb00ae4b8b8a021bf03aed4e7c9c5c6753f04fd87bb1322 +350e6db3ed8da517dd938dec6befce20a854567d0fcf1a339149369235889a1d +70f31bad6c47c4e52f6b2e785a0eb141359d76a05a37bd1c566e36d262780140 +65a4fd366723c4841bec798e4ce07f542183a01ef9d7f8f1979539e84ec241d6 +6aa2339275f588352fbe3b05bbae7b7bef3485b05641ebb8c8e3a619c48f93a6 +dd301f0b108ae77b36302af00e580cae0174eb6d30813e9ffad6058e7e850338 +1e53adb9f1f03d8524c4aad05c98ab3862d6d7cbbdcd7d2d7bd921a4069392b0 +bc8a531ae000b67c7e8bebd6b94c2c79f5303c53b045a47be451a3f10afafc76 +a28360374d5fda8895b79d1f94555c30966e5ad8a5f58d54b2dc4c4c39e47b1e +b3b2a57c8f7aed2ae776fdf4f839cb77f1b2be2d23aa4cb8b8d205152fe3f9b0 +d9002b58fdda551caac65569880995267003437b20cd3a72c3ab3166e593f3e2 +c5399da8ee17843e224b01cbe2c1548d1054a8c21304085b93b95caed462679a +fa228b98a458e5f08435bcc981e58e4cdc310f57c85478e56b186a65cb8ed185 +4e8a1b30ac414152cabcf2773a2a6c296f89fda5f0cb3634288291022eb1e608 +d7d0a8a46f84aaf58929f8dd7097ca83443ce71f56455092d27b22816379eb04 +4930c56449c419e37978806f3b42e97e1279e9e897a3a709dacdd5d87d0d774b +e14672a4ef12ba4b49915c76d4d574d44f3e94a20d911db728d973356e91604b +45e6eb25bc0dd3d285311bd2b01a22559f1e14387c996d531898d5fafceba4ba +0c6b87aaf5f8e82afc71c04d634c782ae7288f397e50ca0cace18eaa1c17cea0 +cf388e326c7ea4ba925331fefbda0606aec1defbee547666002d478a69538c99 +28106f509a53bdc2167903c9e1d54c41b3696e25106a6062c10d945602e341c9 +b50f1df6630a886c8c6f27383f29817e1b2aa326cc85e43afb136fa58ec24dd7 +03c43b4694b403a1471053cff14fbf9b34567b4eaa0b96adea3a5d428bdf8b9f +c0159e4acb57deac8d87597b4ee450e93f682bca0712f2136f8216945ea482ec +8ca99a112e447aab44850a576b69a254a9cfaf86d7cd1c130dc6c1181515b79a +d703f0903faea4c8e76375951b03b924c1079df5ac55802b53cb34113ffdc513 +8201c1fb93767ede80e76cfbea2f07ac0f95f250697ff0267c206bb7048a862b +7715741877e4c27b7a88bae1414be335d97ddc235deb4b95a5c51089f50996d6 +a812c4e9cefbcbdfe18388e75df88d04df66eb53cf3e7eac5fea15ff041ac3c8 +834356278f31517ef1d30d53e0dbadab04bd70f2ac190c35e7273d45a0259363 +40dc1e0b0017a7ef36c4c8669f29f21591e43541f149c4a3b1412a5057c5348d +33b8aee4f452db49b54d4faac7ec9c4eff03bc3c783d901a896fb7533b51097b +81783a016b20dacb75f52bf78dde107172803db8d3a24300aaff61863ac87c27 +f62e44bafd260a687a8cb47daddc2bdb6570669fd3b63b9609c57caad4fc29b2 +01082b752a679423dde1a8c86836c44dba5d1e3ab96676707df07bb47f730363 +cf78ceff36ff2ca976c969cb74abb3f72f693396518e9f1ec0fab6b53fa334ec +741b043045e31ace728698c097d458dc733fa74a63d61f53fd4f45b9ac1880d0 +ade4bad2e774af7ee6549e2824168f0aadebcc069efea4a90d4f2d327a242042 +9557284971dc1f1ecef59b92550929dcc42a3168d7f5df5d18e53837ca6bd01e +003a02c3700842fac98946f6d516ef503be66d4897cf2f138286ee3aa79f771b +4af8541855c21d583f747c294bf1d1016d3e4313b5df8fd2c3172820bdf19792 +428072fae237ea94b4e28daf257d41cbcbbf9c56dc2d964ad26aab3df4f912db +71546ec1fb9dbaef67a4a8771f859e0e78a9f6972724df27f79ded61b92ff3df +4de0f497c50f569891279b968d0567d17c99cacf6c07da376b986299423adc90 +84d4f8e93dead2970857b2c562244f898a59995b5ba464087cb3e2318eff4975 +5079a9ec897cc4dd5bed02e820619bc1edcb56385e0fde4c2ba27fb51a3e80be +9a2116bf27a5a42e2a70487177d1ab878bfd89347513c54eb92abbc87d50ce70 +3e2d237187cc8abeda00f686bca95cfb404053b6261d4795e558f3886c523282 +06adbea3cb36212dd839d26755ac16632a723754890ac8d9a6599d6f2663f2c9 +b920d92da7c773aecbe0cc7b950e619ba5eb1abc667cd354d417995d6eee1b0e +e43f5bc9061b897e0779b023eaf9aed24ea5cec2082050c92e0f30e23ba713f6 +2fe14d9957dace391f05e8370b9551423dd76bb50dc218d7fddbbf235753e1fd +f35e73d4b81e2f8bce061451a2c53e95015a7be71df27847b628bf8d3b682b4f +0ea381f5635fdd2b8e49e534a9c4d50e2e3991a7d5d418c9922774246f8e9e62 +9096c4c4bbbdb0b7fa78877883fe2f47f4570b4188d540163bfbd5d10975a80e +c4a21c1ecd43e211ecfbcdc391869a27b06a47bc1540a708a4e58c2fce67bdde +94fbf0310a60fc2baab83cd16b1c0c3b05a6fe84367b3e46f93a409633ce202b +fef120b0c791a48d376e3707689a186c73135f034ec6bc28870ff0f9ca5c2dab +2412d8292fdca20113abfff496ca34eb7829f43d6e1b51eb79ec9d331d6aad28 +2046c1eac346953e6db62225770dda2d02150601fc66f53f94e9d58b4d3499ff +22494b4ce45de3739f3ed286e421febeaf9e125168babd9b705b51ea733e31f1 +ce295f4d144d86a26bc8aabcd042a4953ac9d61b90e2d4feabab18648ba16ea3 +ae99f53b971f48ce1985c0a02703f1c609b7cc77d551fca1a6dbae9ad7d2dc7b +a61a5e6f8b729bd7623d9c73d33fe9ae249a3b776634e10dd49222cbc4705af6 +4e262a75bf5e60b249acf6d40358f5ead7fc3096342ea25de703909be907e364 +0a1315a1589df358b7eadf394d4b355571809b1e860d96f4d1386b9d8276b85d +6ff051e2883e2fb05c809d189e66bce5465fbe830282a23f1bdf0fe3bbf77780 +8b2c93fe7b69d6156f6ec93cae83bbe9c54638bba8d6df08da9bafcb3d080d3c +775c0347a472a23da6a22ca855ace9385893fa7d851cace8768fda1b2716e6cb +fe875530ed94c49e8c67922ee003911c08f2165d97d8a18f62d040e64b35b544 +d740bd40d8715005dd5469d106a4bd8040fa53cef750287560433965c6656508 +9cdc19875262c227b8ca384cd97047d279224e13bc8cb280f18e163d1aceaadf +d4986a6db5a6bdad04d188a927b6b7a8c21bd67bdd4210eca16dfdef107c8228 +0d722d8a3bb5102c0dceba5e75a5d8834e8f253bc5b9938d5099873e1848b0d2 +76040a020d677b2b5b4f7e029df54650b0d1408bb81824f003232c5e8fa4cc52 +8da2f15b4cfa2fd8770e0ef75a7a82d92fe20af3d5132d00c136a8740d88b7bd +5004d69fc459d373672b2b72f3ca1fbe58a3c2dbe5708b57bb3c2489f28a9e3a +81d61c0a661b8b039b1b7677438906399a6b8fabedf9b25dc024a038574d7719 +cc4686a43725c624d07a0760aac63f477123f7f4af8caf41874046fb963eaf4d +eb027b0651dfe68f224a5631eec6342258f71bae4053cb491c6c37bd9c4c0915 +2a643ca05150b84e2342205415be8556ce7b2f22ebceea680873da60f1a1efe6 +97e3e9e43c1756a243d3a9757f1219ae739579d393d46d747bf36bbea11dc549 +df94f5b12386c770d6927ca29b80eb728d68b7c20438ba3932429e5e7cb190e0 +3213cfe74fe392ba93dedd3b1779fc44c85d9ad678d92bc25827807b607aacc2 +414b2d0d59147ab8e0be0d32f76b95b27fddb2ff275c870a5c441612faa47330 +5ff3ea6caa6cfd284c2349ac9e5d185beb1eedbbe07b8c2a3ad4766142c02434 +042568172b0d3781bfe703b149eaa84fd09e8d488b99aa38eb577f7b21c740e4 +6088dbc4e17d9333a3e387531f97b4ca1ea179952eb33878bcaa465333e1de7c +83616e413ee6e4c5bcc1fde1987a0cc78d279468b9b1511081f6e3bc802e8d6d +78b19dc59990579eddcfaad310e0f360632da25ed5f6f16d560ae7d0175e7b2b +01c3dbd8c98f55f494bfc52b49f3227ce12dc4f458de34b2ad36b3b00168ac80 +85e35caa9ffb7ff60098e5027e32be43790a0dbdeeb8223b692aedb3d6c6130b +b6089c764fa7897b9a36207c9fbf50ac0c481a37096a57da8beadd05bd16deeb +d93fd56fe54a6097c61c1d647f2f52553609c3f936831f4f981862526139cb29 +48a02146d1815d3d078bc3dbd7c32f2167a70edc28b30025ef761cd43bcecf7a +a8ea6619cecdeb83147467c3970c772db2989301cc8337350be1f55c8566d14d +8d963234133bc7ad37397be014950d325d2b67d70232a50fc6a4a064dab0a970 +e7d4e1949f7a0e50ea970934a621330fd477107843bcc7713dd08075127c19d1 +5497f2a13f917c3b7a8917a5e7be2009dba70ea513b405b8926631562a0a8ffb +4bee56250fd7c147f5b515a8f1032564b6baf2569e913e7660098d72eaf586a0 +078af231d4595d67cc0c73faaf4463fe6ca8f94a8aa8f9132106da58d45bbfb8 +3e574f76201cd5ef05d47daa02001a89452b5a8bcef2cdb714b0bf5c36c76557 +7e2eb7aa71d085de5a4f5fefd4b22e25854c21a8e9e8460a2686da7f4dd2926d +3533f3fd3ef0d7cf276fabccf0c1dd01eaf32d788aa6e01d810713bf2d236a83 +4c67f4c69fa9281451c98307d7e69afafe851f8502421c4276061bd6c3790029 +5f72f1ac5d78564cc221302cd97889400b3238c65a2cb820bf23006208c65d23 +9b428ba1a5f9696665bfdf9057d645615993d7f572c6646d710482b9ed62f0cd +4dd6515b31ddc3a154beac3d89c81c8628daf456ac62abbe9de7a5b6062cf650 +4060c23ae920cc4967798b6eefbc752e3baf2492d8327d295f710814eb11b167 +629c496c555117f76309ea311c03ed7fc7f248f7d1492587d0cd5c5ae5e037a9 +57e68d48f4b8128c31dd014ad5230ea69ce33ba6c0c4e6aa1e1a7b3eb2245445 +979a59d7796a059f54c3a1332e06906cd565d21c0acef799d9d8aadfa6f5aa2a +309b296c1bd84c1fe08bae310f5f22e60c9ec7096490bbee14ca80cafee768f5 +7ca0d7a51894b2d52ffe875b3762d20f0a1500adda6a401dfc1adace27677890 +ec2794c07529ee08ff575ebcce496c16e6b36f9a9beb924f95c4566ac092be59 +1694ca2a76062112ac62b1360cccda1c5020fcb4f400de7e87b26391d4177341 +c91c4633b878ff121715bdf6eaef905841cb096f66547d03aea8d8c66dc7b603 +9b354bf14f3bdb74184393f00dd5840e23b08653d045f18155098fcaefaaf8b6 +2c548f4a756994f8427598ac8f68d7304ee37107738c74c0b1c911396c7de26a +3f33dc50809c971c394d2846208999bdb9bbe252ce67cd7df343a4f0e108623a +837a18e3f19a9689b823ede76f782b46d3635d60e4fb66d7a672b973d3d14262 +dc6e05092fc79544b2d82b03a089e8314c4ad8a64498f1bc699f58983c1c5087 +98aa563860b833bcc7c490b0eb852d2ec7ee9d9a02c91ae1e94a4f5a94688492 +05bc1df3e49c6368463303c81ebd9ec0742a8374ddbc39da1ba8e51d1e074e05 +1b3311fab5daab09de62bc9580ba9dd337f8c72fe557ae91caf5bb3c1932b544 +04eb6a55d79892f70331e72acb7093b38e7327c336fb6b4a6e6cfaf17ea978f0 +04b58b0c8a04b0c8806741abd1684835fd5a1a7c0345d5a2387f22ddd0b93269 +8559f7a4b1170e98ca957fc9c903cffd18fe9b92b4b32c508e53efb68883e042 +7f8b646afc1d1c597942e79111d571be9cec5221383f5f6b03193e0c8eeedd50 +261b9f57e594b795c3c7f493296e9a8ba1f4506f868b8502649d7784503fd253 +c5e99f3041f2b4cd9db715728f1e692ae507e234e0e8a3a8f6c732413b90176d +48e910abc918ccfd30a33c872f9efe34a8944f692f5f770c027da9bad3f65866 +2abeeb55a57dc13c71bfb71cef2886453b43d9961172723556639642ae281980 +50fb7ee850651738a68be6420eefae78d1a20817ed96dff413656bb4a968a70c +b9fdd1e9bdb2c0e1dd5d32ea1b50cc487de1f55407eadbf2b3fb9c03b64c15c9 +5aeb67cbb5ecba0889ea4708141e82d2ace7a841896c77ab00dfdbccfafa1f64 +61abe7803872d15961c1c31a6b1ad50f120d555471579bf02399f815988958ff +97d0132e6429769ecfe39b270a07ffd1469246229cbc1450251e71b1beb00886 +35399527233576ead74ef01d7bd7bad02d951e93b2e71dd1a82c523abba753e0 +95af0c249ad1f5d59f5c95da00d4eafeede3a093e4cb6e108469c6cc80fdb8b4 +5116c29b0a9a02a48f6f77115649b583ba4474900f69e9472ff178e41a33842e +78b476a924c14814191a61620e398ee3b48ebaff1b3635edb48ad16d497b3362 +ca9fe38284e1261344b34dfa8d46e43324b3d3b21f31146ef95c2c7c08029e20 +776474fa622d5f145ee66aef74e4d42b40e981fd5ca36c6697c2655b2183c655 +9901a8f632beaee841515da5956eb82b341d4683c37050ce998df19480662d7e +2d09b430b0d79441295b2d599bcb59a3ccbbf3333745e509903400c74b30dfc7 +7da9616b21b268b07f65a4a32d878feca9852a78d43e341e893238a2b2c0cf1e +3dfd75592bb9f15c4e8653dd6e8aee0b772961a9e54696a266506ae7146947f0 +ea378bd1ed22b391795bbe5737994bf9756ca3019f42a032435f9429eedf2d41 +5ff27dfa5aac62a418667843ad3995684018c1b1de4ea68848e3762818e5b80e +0d5bbd9dd866753537ed7ba8ec145d49df30fc8d293d69e3083209754a4b425b +99e39da47bf27152049231f60dc3a849ad6a21b86771e945877cb2ecf7451261 +b5943f02252618cc734cd0ddcdb312ab729f35826c89fa9420fb1ad70647a74b +70474ddd8ae200fca9317e1c50f9cb68de8379399bfa7424e66311c9d7574746 +e19d44413a0c6149f28a340062946288f9f78b1c2b6f5233885e6a19cacb78f2 +31534202b24aa659211adc6420b95b17b20226e74e9ebe01948582b8ea2d3ab1 +78d5b4ed4c778041fc17d11157d5262c90571ff706099c5b06130412490833b9 +c5267a7163ff7e1d45c89050d6497d097826f5b26be150ddf1ee486d232e687e +453116f0b6b7c93064207213540cbbd88d549b74dbea59176bb6d7f7712dd598 +5256a9273aa32d1701a6b2faa0da6d21356be95968dfc03221b0ac65b2b22287 +90c3cb64ab2a65909824dbee9b5399b0c651bf5efd603621b94feae2fde41963 +c266e40755ca4266496ece2fe93c4397d907cf8d413a230701e7045cb9da1d17 +f1a00e00ea64b45dbca755a454a9fb232a8b4b80d6032650231b9fde78ad9664 +71232d9076520306940852e529fc46d83fee4d6fea15056cf42fafba1e8482db +6870f41187c0906484e8996738b52a946aa34dae017d19faa08c86845a85a543 +20dad4f4002f6625b84a1b4b80467d102c678823b676df24c9ca802d568ccccd +615858fe6517ae56d631eba96da6b71e0e0e7b71ad9a9483c61574e23c47bfc9 +a0394b4bd85fe41c3a8bb60ee8c6f788017ea90ede0a70cf82f14056b24a6c3f +58849d613f08ec3ee21d990dc4fe661dcf4b3afc8ed34ec2ddd279cfc2cee1b7 +f1929ecb72d10752ea012342923450110ec1868292babcf755d0b393768de27f +702fb68daf1154e8855a89bc32bc378580ad405a05cd12b35826a9d88a3cfb65 +987f364b89c30340a2b1e25ca29cec4988afd940c1321d12cbd50eb411a29a65 +657b2e7fe642bd8c90cce146b9d216b7f87aa135ffb9ccf0fc8da1146bb6f03c +1cea3f7d532fb572bae2db81b7f15c14de973f6bacaadde5cd0333e71a9a539a +8356038f876ece85f7e6b2d057ee8d48626483ba054f8a662991cd52fc317738 +2d029b04dc44da269de8be9b025f7929a34ccb6efeef271232894ba8c837698a +fe6cefeb4c1ca0180215c2adb029986953af902ba21c7531850ca7ef798ce22b +3496988dd07347e36f26cd55db9caaa73c5ac260256432c9e0f6e3bdcebd81a6 +59e822ba4188ef395f10c448c4c09270daa19a856c34f5cf0f91a74ea962b4a9 +5459408633966d6730b85c54e2de6ae317409287414079072d9422ff38db6c93 +d37994e7ef1a0e65c88019e729528b51ad23bffad9ec9954de8678f03a307c43 +0c498a7c16b3b348947e25a896bdab2168bf3119b296a327c2378904045e322b +9cb321d23d74f470fafc828404612288252f1701df6c743de571e2e876cc2672 +23f2aff00d26f1155d6d41a3b08322cf8eab002fe47f5265bfb67a405d4ed77e +89cbb4a61b54e796b8f3cdf388d5418b96615c1312ab7d4e7deb1aba8984e3a6 +76dccad1bb953569931f8c26f7af460c5689412648cdb7803f1c93dd452a8ec1 +6c8e3e6190d558919b855b7b5db34bc42b992ea155615cab202009a96fe13363 +4f649e77e4268cf651a74b8c8c645aae6dff800ad17b194c0b883867151c6230 +dddfaf596c2639a46e6746fc3ccd1593d432063ba27bf2476bb3ee610fd7d92c +c09b70c657a8255cbe2d8ac281892280d5f19fc27b5f0e912eed9c38007e748b +079ce05131c3956dd078c0846963268fb4dfb5eda5ee8894a89920088f721d1e +b725870aa43e92c565d10d5d796cc04a114b5c32e90c9c7f5a9b5d03d894f96b +9ef0b123b9f90d1692be30515757e54c2f9e073c16c04587363c1e9bd4f834df +4134a10fffc0b5960a83c4f75979a14bbbbd52d4d4b5eb75901fd20a36613826 +0d39c035f3144381fb6d4eaa99953736614d1a46fc05f800ee66ca63b1c6ef10 +673e4faec2288afbf5cae62b7f6ab8c80e96c8cbc7b666ebe78e68d184d85c4c +d8b92adb253aef17ada1dcb3eb1895047b93163050a6f3c1a69a7935a12244ba +cc164a780f44dba4c432f913f5b649529721b123f4d6816ac8f1029bba12f442 +935e1b03a434297d33e03357e0a4a56a10f0fc2c16dcd060cf858b58f3cdb5b3 +4f571ca4ef8a7a22bf7b54c35b38aeaa6548be8a70027994834ba2d55b4893a3 +c70d9d44cdf6cb9d1d6b92af027a0fa802f207d34c10f8c4aa3a2cb64f8817b5 +78408cd8f98466905ec58a8df6cf060d6ba17235dc6591e2ebf061f5a7f1bf9a +7690df303dffc583b98e8765977c887e776814899b45feb0f0cac642912d4b81 +e51c5ae48c0cdf9024cb96f421d1b7ae45b5ce9d41d9d35c2b00416c8b9c032f +b27680c1f8c1e55d9973a698180a786b92fe97c1b0a9017e37b51cab3f388b2f +42329ec38e452fceaef2152d36471573caa830a5c80eb0ea73c1c7161f7b21b4 +cb7d3e55f29e36dfaa09c8b3592fd8afbb64adde44d8665143ebf1f3afa1a5eb +a16860b8e8f52eda1a6793be62ee8a682a1dd30b6482a3188b5e6b8dcad4c688 +98e39892691434d85c42922a035c752827474e01cfa507d0c434f746993ed746 +3d32f530ea324bbe0ff4a38581296788fa2dde0db5dec9666d8af2deb947f200 +b617a83e84114e684442fe3360e0a66880f3a87f1030dead88eba805cdceb8fa +4b110dcd71f720d93de7c0e8122a09081b9cd1152dbba5f0411728ed87028a21 +9cc36c72bccd73e3cd517b9a7210cf1f3c719e7e23511b0f0c272de69951e0cc +c264387948b95b3fd7d7d849947117e1f14bec10d2d718374eb09734709ca60e +c7037c7c3c5d1b9797b9e4c539733fb69fe61cc569f76b269780fe9abd497f54 +4d728bea738a4ec3e17aae0ffc36c2bce74cd24bb8a2758b9c8554d92a64413b +ad5f35aafdb387b28f1ca329a32d8d99db75121207109e6fba304fc86e027bab +b631f93526be28022f06af5126cf0a69c7de8aec8043aff5a47f6397097b8dd8 +8538bb33987fbdd064558e7634612b8b2c22390f35b8096fb0674fd62084d7fd +15d98b22fab5dd19f9d222a2c4d2573badb76db8383c74b4996cb068ad4856b3 +a01a8f42bda0501aa7c317c275e050a133df090b6274f9beb1af87f8b48f7b03 +64bb4e937369972839448dc459dbb463e8df91e0fc7fb909f5a423ea9aeb2f23 +0d24b27dbe955c4b6c3a9d22603b42c6c5ebcfd67c74f915a47ed1b762e10738 +b7f181feb8e6a3b2b764336966c6acff5a2e2fe237a4dcd64b7dc7b7dd33669d +8dea06bc3c1ad351e2305335036b8f109fece9e30cde9ae2f472907780dc1667 +e34cc399da1ae24fb728529cf610c6592df901ec9a7a1d0c52ef3840a99861da +b28412b3751b07206391aa61c33ca87d4164876b92bd6d27de24d6abe4af0119 +aed63c73e43a696bebc21252a6c39d5ecdf45042d230a583e177b1e41167ff25 +1e633941dd1808f8a4436e663197fd2442e085c596d3fc12b654f94f05453599 +e7957e70a965c87132bdebab6eb857a450c23d36538da886be9785a15ed6a2d1 +64dcce81504e271f58101d36257f8cb1d146c5dca3d00963d245634ab074b95d +d490b8a999b83ad4e4fba3573858fda34ef4735ece350868c4ab772298e22b6e +d78e9faa6af70f400df8c6777d27a205fc1b40b26e9ebd72e37a18948d447dd6 +021aefcbc2ab7939928daa51eb03d66172d0d4df7e01b032de40c3ff156e46be +28fad368241ae811d6914a3cc4ecb640531adc026496999ffa429093a40615db +81b63de704aeb0ae6363559a0b70d55940bfa22415edb9239b27bc5ef0e4fdf6 +3a91764ca5dbc491df84e07875da4814bcae9b715d3e4dccc55cd83fcfd63696 +c30648600c986bdf4b1f00c1334b1403670a56d0cc8bae15187e1f4dc8082eb6 +7d85d9413fa5bd3215c6af814cdb8c1b7dc579c6f8f2bb11836a5760021c0fe5 +e715080339b24aa017ce4aae8bafa417f889c5d27a285004429383bf4cb8f65a +6bb72bcb975d903020bc27752c7e40a2d00ea67609a04b125da0ae443cba553e +d3d7bed8408f3cf9d22176f96382fe832a85fcdc995663c777ba80b9750000a7 +921d3fb174ffc454547a90a74289c2a5b49029b3e7798f5587e9c646ac23f2b9 +254b151cfbab3472eff67ded7ce08db90c0a9a858b3d58e7b185212a0c45c1d2 +ba5d5527e23860ff4a9c985f74efa6c70a749206addbd93278965d3b6ade68ca +8e2e9ad4974a836fb78836fb95e4fb7dd7d6c2b5423334aed2644b09259367ab +8a06c57a99803b547e3becb7ccdbba446a7061d624a8ed0ab1f86740351ffa61 +2f55ad009fe1486418119f3b9932014cc92ed1f13ec433c62c3a004f9fa207a8 +da0dc1d5adc59d2268866b143868feabd83a7a27aa68c1d2d31b5a3c5b2dc1b5 +6f65f46b5a3e33c9d2202d901c9eb2b100667903493999f0a23bff58c6dafedb +7f2914f65e1654579b4a7df69ee950a223b679161f4455cde3d275edb6e8977b +5067a80d040e349655f4a3a60adffa2a9e56a4c0a3b1d4475c29dbcb177b18bc +2c755214570988ebdcce1d8f54c59fca0b0e19116e6a2bf951ee7d00b3feca8c +bbfe7c9914ff0eca51ac6273ce6e8f5915eae72bb2e3b8c67635da114e783e91 +57f1ea86d828fc1aa506e0fd7843bb036aea75714c5638793076f0b87de3f6d8 +8527a8b3adfb5171c076ad8fc47b68f186af94a0de3b7badfa167cf09c7909dc +d9649484238f6be5c2cea6b58f37e55e6aa1e331d2bfd64e5103841ebd324f3a +f9b9d7ff7dd9934a1eca605ba4a38c926c654d0c9ed2ef59506fd93f25ee09f9 +ef6383481ff4f29d33098d0b1c3675a256d924c8a344590fde46880cf9c12128 +dbe09c32735b56de14dbab2957fae3ba143a07de4b48c25b399b0e77d537da00 +f0fe4d154f1e9a09b9c4bb74f62ae698fbfe43bd06f038089e8b1876eb07e249 +533f9aca9fe1eba0d89e0bc4a0f98488462a11f95f6d77ee6ff20508293d8e71 +cc81d9bc80450c2c6e6a0fd46b8a24aa263acd703217ff2e19e7c61d7d1200aa +b8c6234e397ae8f474f7afd9dabb65cb6de25212987a8530dd5ee78aeea4226b +56fbc58fc736c7fe3eaa7a842907cb4f4589814479ad2a09bd1e3bb0bf575d15 +f0aa886a56e30b5991f7064d4b298c4eeb2c6a33a7307014315e3dae2ff72581 +283e0a607a7d8c62766a23f42c8722590a784b34f5e97b9707bd45fbe3b08630 +1df111d0aba815c03369f7caf6aa950498bcd6bd02736bf70970525b70c023eb +11ef2901a01abc672153ddeb66264d59a7eca681c602e1b4a362bd4fe09ec788 +2e739d4c3aa9ac9446b2cb7da376c4617cdf9fe436aab026d2e23c755be7ba9c +fb61013c90dd986c2f90ab7444661c16ac4db3a8402b03450173aba644a61e98 +99d1cafa06a27e428ecd6307ae89b1747de0609ba95f4d882986a904f1c1f3bb +da550327d637a29fb1b4b23f5e08772889d27bf3cb461144d0f01db6699b2cc4 +8c2a7cb91090432d70fa673b7ade79f862e9b79a94f06405c44c2b0de8f233b4 +8080e440921cfabc9133916a0419613528f04b00275b140d691f4057c5420d49 +a1e53fde0e926a60613d1168d886ba0e2d5de629e212cb9b8b4e2253a7c7b531 +8287a0fa5438528bd414e679d20b92d0ae2ed58d2c6874354ece38b933a1da35 +508e5c4e63e62437a77a443a2a9ad7044d63f36c23b5f3a2ab443c717219e02f +dcb6a4286f765477eaae1a18bb63c3375fcd109a953a644e168f2ac0e1d85f91 +3d62b34dc51e3a134aa30bfccfd6178cbe7dfde088a435ecd7b310f5f10a5b8d +9387ad196d7e1b37047670c8ef0397cd1f380415de77419a20ea5349ce908027 +a8f8d1498f5bffa712690e4ccca077a452c902fc4a9b7c7882ad7b9db0d626c6 +7def29713c25d7ca466958350d56aeb8dcd0987ac05fce2205081d301cd3e601 +f386f99eef9857fabc6bf49a32ec3d4a921ed57063e5366cfe51adbcc48b3fc1 +ea1e40205c7fccec4fbe6dc0bcc7af55984f6e49a8a466e144b7e1bbf63506c5 +f60caa2320f9ec1732e9767ff4c9effc5b2f9ba6a9dad549dd30771c53f9a4dd +24adfd39cc5be74851d51b4fb038b22fb65eca6cecf6c7e902e9391c89b1587c +509bf28a987cb1c8ad74ebe7557792a9ddad7dbdb1a367c633a8eacb91e3131f +02000b5d06213700a011011cc1cfc3abe1bac54878cf32145d9b18eea7b59b9e +19f551170b92472f8922c0838f5d7ab5421d59a325c05372fe2c4c37184361a3 +71572d378c3d0de308e2c1cf3dd7f2c3dfe703de9df84e569dbe2e8cf00c54f5 +15db602bb2d44d1f99cf2aaaf78953b4e838fc1532e2ef4de4f0268b2e6e2c2b +cdd46138aac78f9f34d6911ae387008d594291c7a57d693386170e7e6d377cf8 +11966b59bfa3cf47fae49324348a91f80399e29991d659b32e0fb0af79763ad0 +93630b21d061cd935351fad564039a2fac55b025a04e9668771118e86f9216bc +55c4cc8ac588333bbc1b8fbf6b76a08bc14e1f83a683aefed0e20c7bacd2ee51 +96d723daf15279d8e2ebb993847b43d63e4960ad2f4150b07fd081517de48a9f +6f4ab09802181a2e4e44cb0204200fc112fd99ee2e09cbaa3c6d3cbf97f95bdc +a4f6d06ad415ebe00d6a78c3ac0ce6cd4dbc06d2829749b7e410e6fbd6f8390a +b958ce73414a8766576c3b642916778c22cfcaa498afd93aaa19cd506e231a81 +f9994006f5e948a2b20912d70132e6a0382666f35fcf21b6edd947d1e497f66e +da9cb07d716cabfdb6535e5ebffff6196b495327fa4e5c60778f76b40d46d4f2 +769ea09961f24b8110be2c59f426f16928866233066135ff9e1f15379ed5b11e +de442dae3895e438ac05889c683687242a4758f1a234ef144510bbcc89e20954 +93272fa2dd7373c6b7cf9170287f4dbe3022b20bfc08e27c3232514c813e93b1 +cb37193b2eb17a832c1833ece9666aa24c12424d6c157d4f279e1950d45b4940 +2c54e2bee3f3eb017af95881e32f009764f5e67b93eeb2172023b510a874a159 +4975ed54f35268d3df9c2cfb65c6316b8178d1945abae3c5566b9da3c8681b4d +acee486d5084d66e88620af120a44b5e35ab55591ea5283b4a69a31a9f5b212f +96456ccee559dd42c58b6da34dc181a0ec0a5be41a9b3e0958f399d083fba072 +686a38da9b05355fd47c3f59708c7b7d4c31de833a87a4d8da6abb4b9d2ef519 +7575de9dc5b012e2e3aa51c407afe407001a0714d7ef1184b33afe085754edeb +3ae4472f53011049af4ce4e0ef299720cf8c10911dc0bcb0f9f81a8caec00855 +91b750dcae4e3b0e0f507c25c1ca59cc38e366f27ea5f13427f2bf6809fcff29 +5d513e03c98272a0a822592dc9682a49d9324dc1c07f5b8b933ea9232ada0108 +27eba8837797d8782f46dadf53cb7404cb6612e71820478bf37f88615ada4989 +00f10078a2385cb83c8e41aa5464148bd90f7f2a18fd0b3f41a78b10471bc33e +0b2815ed757515a331a6dbf861844ffcbf6b37ef7f348d7d918fefa2248d82d5 +56580cbbc3ff9c079d04b9ab4fccf1682c0b66358cff6840a9808d91374319b3 +09fb2f795569eab9c00e850a50afeb42248a251473156bf4d220f220e8acd814 +2554128f83693005694e19707d0630ddf56bb55f47f21f87c37286015677685d +d6763e4a3e28de9d9f7292f659ac307ef3e83d84529389f7eb0639c02239861b +86df711f11038176d9a70b04aad94f14285bd7ba4b264696c383bdb6cde76ea2 +c3870ada2dbd7fa7c70e3fbf92ee9baebf07e97da553aec0c90ea3feb38ff428 +7625706fd41f54aa6d85124920c33c48228cdfb0e426eefbc3732e12813bd368 +01698802e58db4eed2aa7fda4c1e439ce2012457c55115d69eedb9f587e46b5d +35abf7e7372203b01ffecff24226de4e428217c5313a2e8bb58efd0f465cc612 +c143ccae5d8b6dfe04583b1168259f15c363bd4a7db272642b0816c7e0e5ba0c +b2bb4690aed8e0455b878e139c15ffa403828e30c079b3c3a26278050ba66ba6 +fce91bad29dc2d980c06678131d961e47363f11856b72f5ca039fc991ba248fc +f838d935789da19681db4d9119cf55bd29847d2536ef4f69327163c3e262cf63 +695d42a83ab0553b4c72c5eebb9e71c358c5fdbc209ada006f885f262e3d077f +b9966e8f53ce61e144d5a2d096a2ba15af75790609218bcbf7097a0342e1dacd +4eecf33fe3c4c7dff8b4c1f501007957f8aaba2e7176a707064c266cb723ba18 +6139e0bd697b37528fbd3a4bc8be5f7c6a50aa6fc65a0a52fd310140e750176c +698a919512867a1ae998b32043c0e11106f81154aad48fa3f6acc98bb2b38493 +863b2ab05aa77dc16e5b01b328d10dd7af79ec3a5fd38eb7712e9624cfa2a620 +74988bbd4014a7816a4826319490594c0abba1643e85e961870e7125de720ed9 +db31febdcb739b3f8f0a5a2803819f9f7f3fb3ac983e3b6743c7cb3feeebe578 +0b0456f15047a76ade4d764e56093b19ae91d52cd93ca61bab22095711e2dd56 +cdb2db4cb0a1120dba8939720c84f2faadbda3b0cab8ffd83bd77580e0dd59da +67cebf38ac126e54f6b70b55e7940c6b44d459757958c13f1c6f248eefb5af86 +48d752e91788945fda3da668a887f657de389b123260e3ef4f1b93393c1f484f +7268e84e78585c0a3695ce84bf217637f8326c98407c1060a00ef8950e498d0b +79ce31264ab755493d4ec00babe341e431d34c8b7228d0c5297bb776992586c5 +ae9ceaed8020f3ed8c0ff4bb963b9c488f8ca6c667c851861e8410973373fbf7 +56b0355b1a0dea5adf037ccf59bd1d4957c116187c99c558d5827d609dd27cd3 +b2fcede2d281ad3c33c5f9d55cce22bb1b8e9b14d9b6dc140620733a10389574 +eed9fa2caffd5591b8091c8533cc29d600b4a75b738f8dd2951983f06da5cb54 +26c1b1039bdb3550ec6cba9be971034a125f58e74152bf38e59b6365e7c6be2a +8d5decd0397e0edeb638238e8320f0425c5ba6f18ed9bb32693dfe1b079ffaa0 +3bef302dad880b1b4625865d2e8794793e1e63fdd5b0acc91d1f83d12238427b +47dc31e3b218ddef4813ba2e15d872b0e6b640905e261405d148de380b062b9b +a73f115b4f5ef94d4023bbad60fe61939b5c6cfcfacbd85110cc027a194d92b6 +f64b2b2bd0c5648e744da3048486e5d9b77b45f0360aed982351fadce42a42fe +f2151ec97e2e546940a7d9154cef3b2b8dc94aa1076369d9b1fc54e22d65b6c3 +bdbbc16f315b52e31933acb14929e23f0a1806d7bef12578a6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/UTB_____.pfa b/ogclient/lib/fonts/UTB_____.pfa new file mode 100644 index 0000000..36ef339 --- /dev/null +++ b/ogclient/lib/fonts/UTB_____.pfa @@ -0,0 +1,1134 @@ +%!PS-AdobeFont-1.0: Utopia-Bold 001.001 +%%CreationDate: Wed Oct 2 18:24:56 1991 +%%VMusage: 33079 39971 +%% Utopia is a registered trademark of Adobe Systems Incorporated. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def +/FullName (Utopia Bold) readonly def +/FamilyName (Utopia) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Utopia-Bold def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 36543 def +/FontBBox{-155 -250 1249 916}readonly def +currentdict end +currentfile eexec +f9cd86fd4821715265f16a614e3770ef80561e77ba6ecbb4ef4232445eef2839 +94e93e3c8c9b09c09d71542241821e07888ceb54e8cacc8a45802f50c0afeeca +5e3d9114c1860bcb2ba5fd2a879a0d79953e30c90d8347513f4ca5f05b2e231b +4973bd1e9db66a39d846a8b3d9e48da72e2de8743ba2e104893167c235719245 +87b43ed3b6552cd85e4bbdeb9f46bd813298d531c74be81995a52ceaad4112c7 +f65773b088bffbc9874f615371c5e7b50ae99d5b6acf9c80d87057bf3a424377 +f4284b7232096b6ea623dacd1c925ce09cfa6515f675aacf815c38e984b4ba40 +0d409bb62cd4ebac75201c8e782e68fd73e8622c46b696b1ba37ca9621400041 +d95b948a6bbc089fe6b230b39bd358228af9b3e68418166a9adc4e7665341088 +c47c074aa4b21b0949fef9929e1a32ffddd2d02145cdb256863cf6067d27ed9a +f0aba85b1e0cfcbab7e74880e9693b5626ad31e6b5c2d208087d86c116513212 +710c9d6ca50e1503f8d4c2863fa378f8184189af0cf109f4affe7cb74563d513 +2104fb9dc6f3f5992e075633a0baebda8ebe9a07c3ec4b25fef015d9915a26b1 +d401a6722015090672714181580350560caf79bccd6040c0c1651d917c73107c +2d46aad5d4a370b55e896ce1eed127b6f0aabaf7c4ca62e89003032abb2c95ba +58c4a0eb0bb1a59a439a6a0c2082e50725b9e8139324af06ff03b4269a697342 +8fab0c1fabd320f1452d9c435e48037eb8cf6df4233cd9c05691604146cc813f +7ea131f21e9863b7bd1b087a583af14675b9bd31fd364d5dbddbc9b533a6ac38 +c4bdeb28a1ae3d2b374da72405acf67b1b3a83d80726301b3677c067c748d857 +ae1da4f723d4365647de10f90e96dd7e9ab9ef5c7e6866a13b807fd3f78136d5 +72950a10bb0165e61f12c60a813c7e35eeb9a0500725dd912ca2deebb238538e +790af851b14643f40e5eea13660e57b5c407735079a292a7c162dd11d0a3d342 +67290f1c9261fa5de6b92ca1e7daeb7cb970c766b3e0396ec0ce55dffbef0bdc +b437fbb4d63634b9abcf5844e76f9313ab2182e1fb3c47a705a1d97b79e93dbc +5e48ac19b45f9be4b9225e5a7e1d3679dd21001eca3c08d6febd35fa5453290e +1269c1d195e45338c10aa60fb8ab9e5a5aaf08c82e737f082bb6216d7cc1d5d8 +8906c8b05c4432d04561377438447eb5fade652af84c1ced99551365cf9e6f99 +03d1593de0e450003fb0d5b5588330d6527fdd0c8193fc0cd2293012310a425e +0ea0f8b901b991648ebbc894cfb7d95da6d35fb7c947e887bd3b6599e673b921 +c96f2a033e30b341a14066076ff0abd5fe77f393b548a15ea2185f99a3545b01 +dada854fce1ddd3448a9aa42ba260a4f85a0d1bdcf08b3de2ff8b6411adff446 +4a2929193ade35f4e26006cfdc45929250bb76ef007043d739d798a4973f350f +52fa1690423381539e3a4cc458600fed91fa8e16b5ae0aca710dbf318d16e3d9 +16a082a093b59f35ff92a1b235d5621e87ab471310ca26a07a9ecdd3cbdc9bdc +7506ff13b886b26eda6d4ccc52a312593a0f2845a4a30aef829109e6b76bfcbd +2f2fe267d9376acc0686c9b1df3a25fc41d9e5390a90249cc26c502e4bcf582e +ca5054d96b6ebb2bec79ae23125b4c2a13a97570153b83dfcc4d9dec9717679a +ba8c37c02697d8f47269b9ddb983bd4dc029968d0d1729bcb9f94c899906af40 +0df490eaad13acd5a893663fc90a850533263cf6657632e8e4df31e6e6636521 +78dac783feb9616172d7651e3e4092b409383ccfcf8aa04b330119c334d6c8ab +bdf97d97fb475c25331044413a117dee0f15d6560cac5ca6c01c1c98b56d2971 +724c135de3c624fb7a1994a8267ead0628af72d5af1dc0ae3177c3b678dc15cf +9dcf100dd9de9bb71f568661293515002220681b0afd9775464be2f66df08c5c +7d3995a57ffd2af299564dd57614e3273d8555f705ce2a2cb095cd662acb8163 +dc5c587747e27fbfab667dd449228e7b2f40cea584c997d2b98e78a063edd327 +9e23947ba2577035ff349019293b13953ceea11b49b230e2a29d295b032ebbe1 +dacf823e3587184182d0b910794a1d784f0bdc21c74a65d12b5875cdf0c1cddd +5995a6e56c9a95dfff55167f82b3de41a2eb653b0d1eb61e9c48654424ce13ec +8671211b2b8a78839a4569b3cefae520e91c538f09d96f98ebbe905b01ddb080 +f7f6ff00d2f662e02bbe7dc3044b66723956559669000810f706f4ad544b9a29 +b384f554816696eb7b59540b407d438efb6c8bfdcf05324cdb65e9ffb8864a9a +05adaa3678a341983aac1f6bed28040df2f0e18d27300cab0930958704d900fc +5e194b149740b089814d1050e11a9d885bb1d835a7cc092ada9f08858e1ac5b1 +84b6fdfdea41d4b1241ae64fa3c47f125f48cc05c5dd8e2c896bb88b0a846379 +4477252f0d7abd31d4bd5703b9f280b09a59bfaec0663dcb2ccce2821e0e382f +837f4a4fdf0e57d531383155f4fd633bc4b7315e54425a0395bd91f050783685 +eb0b85e15e331166795acc5dcb2ea1239209f8296c2c4cd1eb15b37e3ddfd2ba +33a25c3761da66c0c08635101534607ca02990447c210689d31e49376d152161 +7696160aa2da75f993535e6cfbce229c657578620d7c8de8cf720f21ccc22ed1 +2be5c92bf7e26cb750f707fa7e2348a04a642ff319cda45fb9884caacb562df1 +365992416084a4d40da9831865b02246bda402f4354e8882e98215c37d3eb3c4 +d2f9ba2b93f190005da1bbb506a5d39e2a24be0ddc50e1bc5235d221a151698b +803f0f0414bc085a395fbada62a73a9a3d4c66415ff1704226f8437e9bc470cc +63011be0e1f3dbe6e6ad3ff35541961f6dfaae1425b2020349486880fe7fae78 +5a2db27a586f0daddab8ca62887db0a18462a9a3d821f31923c583bb731d7299 +f051b8db5f33fcf53c37c1e4ac7fa0275dd39ab9abc97cedd1c65a3d514d96df +8b7a49217fe1af15b5c738e927028d1ec523e8e8575f018e7bb3f7e9afc81ff9 +3de7a4969ba59f7093772e5696bc4f2d6616419b43ff26f2a9da0e183f7bd542 +b31f175724d2e8f18a61ccd010d8c18394f640f905b6832fcfe7d3e9c02e3e03 +911dff14d0a1c73129ba85e2179372aff3c028388f30621d1f8aac757660079c +63c22cfec96ad9ee4846c0854ec912abbf3f934e293e0f1211786455019a7f7f +38f9e877f4186a9440c75a4babf3a9fbad1c5fc484082e1be4084ca3018b676f +0e037cfaa4195a18948d8bb46a6d00b68213c09d5e69673ed4e00155fba9d840 +9e08ca2dffafc93110751b59ebc2b6ed4bf5f535ac9d73c9399d9081eb6b2ba0 +a13aabde56a7f9200749c9e866cac735bc6e2f7859cbda912f0c26e85d3f7b25 +3185ec64546cfeb89d3992b12815e70a548299615c6889379218c0e7dd1cffaa +ff4ccaf3c35c77b09513b5f9b0d501322a862af4f6df0af50b62e4e1c1b3067a +f5b24a44190c41e96b659f62921dd6075609f7d7db532298a425c675e4537952 +bf06fa9b1295e32068740c361048301f6ba6386602b8cb54bf8f38fd77669f5d +791a7b1854b7f3effa193e9e5a435694b1c8578ec78426134c9c56e6c9f08951 +2469a5137bb452be5ec3b3d27c3cbf6e6fee0d58d73dd3d277bb0c1540ad102c +50b746093832be65d05c102ddc982b08c7ec1fba629dbe27d4604c1476d91392 +801f91ff781aeabec88132162e021741f8f31f06db82b29d17fe66ee04e9c200 +5240d68ba82373c7a567ba33bad4aed1d6b5c570d03c5c394c09e5c5eb9e924d +9e1c2f161a9d52cbafdad75dd674327ec81ce286cf1abfb5ddd8606de9265784 +5c950413caeca8ef80303793826c3ac4b58d9fd4b02fab612fdbf71c2a1698f9 +048769235eb9dd35823536662ccccc128c74818c8ae48edbe9a4624ece9d1ff5 +39795c7b4808520a08d611af58eec60bfc8d272a944201096c45749bc97f32ce +a52618a1d6d53267ab4fde671ef1a47b03687a59e47a8e277c02a618af09b78c +f5be89f5da433ea9d31cb8319bbd220099a8d7d2f879abd99b4a96b06ae3f8ab +4cb89e72fea1355a010405cd72dedc7bd35b3ae32fac3d40642fe88e7a938579 +f4c10f751174cf042331e7274eeeaa28e5829f0e6e866783412a45e8ce8ce127 +5438c3fedf8cfbc9078e2b6dc439d9a513fb2a74a672b496e19af3c092342811 +983b1a3d6c60981db5aaf03b1fcd375f4ad64a10b57d378f52f29cb89dc77814 +1dd5106934bae98eee32b779eddc6cb5fd13d38ee5b39d4513338af4feafcece +dda1f3d9b6f0b5cae4e7efa14921578cf07ad6e1eb7e0a3bf7d52bb7e2fc9656 +32c5c642a6ab07c108d79699d56727db2da956cb576b97648ade80eab2ae12bb +2dedab0672ae666115758614c91108c9e4a4da0bd49f15379cf6716a303accbf +477ae6756d18a0f6e3801f72eaff179849888104e38e69fb722a385a630e06ad +e71c5553a14c5955f6189e08f8cce45ba8fbb5c5b6b0bac8ca48d11c0656f21a +9b9286c4f958db61b111ffd40b3c8d69720b6e2eeac5452ba0837fd6806464f1 +0cf5bd73423b9f065b6ff58954a9090a53e31a16fa9703700fba14f8b6666ee7 +4b6a7bec61fdce1fc10245e2e90e31463bb7d326857e389d87834ddffa9ca581 +5a5abc54a958bd3738753e38b255cb1012cadb7278f8e84d9c649a4a659a8385 +19e128ddbd0985505fc613d9c577fc10c429648ad18771b0da1087ef584c2628 +b91d33da27c403c0214e0b7f984a9bfe6c2c574883f446e4dc1a563c32898bff +ca2433f1161168565e063ecf045408d619f2a3215ee881cbd13a7751b14189bd +a0cfafee7ce4d9600fdf993ceddd965c4a608129c89b52b5b59419ed079a6f57 +9efc222187cf25f848d47bf3bdca06ec2573fa8fe20624cfeec3f9ead6ded709 +75cae667bf025ad867944faef14fa9d6617b74cee3804d5edb688d9ed4a0c2bf +1aede05eaca61e297f03026864c738014d8afd79294e062e04e5fce1a784d850 +b00e58fdf6fb5182d6ff08bcd05d2c7860dde223a37ce53131c09cba9c52e9e5 +76cf7e58bb99f045c8b23d67c43449c6c3f6acdb5b5f35be96d17fb0f8d42685 +cc79fbd421fdbed2fbfbdbac976736a6fb34c62eded4a12ad456d94aea2a2bf5 +f1fe4e1519361177998c8272866d26cc0e1af48fcc5a399edb8550046f3e8b31 +baf20c0ba1210fa2487cc2982e3d39e6a630d11813801bfdf4cc3695384410e6 +067d10d37aed54394448427032c9cce4d00f89418f10a45fda8aa392db636c06 +a26c0b39b25f128f7e5ad81a548f643eb1802117172d9be1fccaa3f1a73b7c1f +1cb21f7f8f71fd8d063ebf41cf2f3eba32392f0303affcb36e113a7e46e5406d +20e6c47a9be1e8f8085a8c49b04d219e13082d344c91dda69384c0b16d3fd7e5 +e46f213b789603c5d89257d6510ab618f24df56b1ded2029779af220b40eb86b +cb9ecc32f2b1b713132ba229c3bfa888b014e12ccc1cc902b28bd5a9d5263ac2 +a47b38f37f0c9b279418b1bb81b288d0312667dfeb0aff86b8072c2bbdc79835 +f6a04d34c0825caef54293348bd6c672ba2ace4d7d3fa604faacba1a42dfe02c +0150abaf33d0a6582071af6b15929a4857cd57048c9e32b04237ba047a2e2837 +a23da6917bf5912e2b1abaab68fa65891788a6c3b30ced2fb907e603a7654c27 +976d2fffbad1538395c05cf876bb3b64198e0a1b94f40d748c03373736018466 +6a9a9e53e0a159ac7a5890bcc18cab7172dedf4b8fdea3544184b0032edee0f4 +6429cd0451949277013d89dc6bbb23566cb158489d168a341271aa99618de261 +9580e6ebc094ebc5d7122fac0cc95021df41feffbf34ed59dee7556ecad36d75 +12b96ace5f81203e47d9e3b9698163a175767762fe2278648d0823b7a41e8730 +16fea5eaf17effef6b2c537b2727de3ab71987b49f9bed16fd8aaa06e5580643 +c2514bda11e7fb68f310bdded37ff6e6fd67b04c83fb8ef288da520954f0c2e4 +ee463de5ce7bcbdfa5403a4de7c64a7d9807dc7fc21678fcbee60d8b2bfa59bb +c8303d7f060c0a2182f6779a386fd82b9b44550a03d98cfc0095524a7308cf6a +e0c2c366b8bba56ccc354f3319a888e1483595b28f38868231631d25f50743f5 +07d08da61232da0353fe9fef9bee08c93e66b4cde93369efa538d03dcae19d88 +1fffcbd05c767b97fdf225685d18d7076b2b9b788404b79715b18655bf816f57 +2d96ea5f0d6ec848b399d0629c5775e5edde2a79a3dc6bb189506fcf65ff104b +389ccf9387a3d6d243e4c83a5d78e9ee659b8e47b54559c80e15e1d9b3fdf838 +565e0ec14404dbfb5da05ebd0c3cc925f2a0be3ba741b9dfdc0531c2d35985ff +89268541bbc6e4ecc13a50d937cead6b3a9863f85a8c1870838f4abd35494e28 +92248f65c7d3c452f6f743a345087661c3f5e8f09cc6854e7f2d6b5c9461c0f8 +3170337fb694d91478be1ccefe270f28e1c8ce48ffd25ed2dc83c070289405ce +533af0bd4aa922d8d3b9220edc5b2fe6fadeeb81dfd270ee469b434f44622223 +307e041823e65f762048d028c2b66c306422102c19e3eb113b6f613759b68d15 +9ed5665ab83a1fd1e8d45f0de9c187db9f0f7d145c3bc457b5ac065a0bf447d4 +2f92b61a915f4dc8c03757eaf6cc115c87cf2aba456e01834a0e283347d487b5 +0e9bf1ef39ff7ce6505d1be0e20f425943cbbb4c188a359348d67c0247da0c3e +3116f9a961e616894a704f192f550ed25503bf14c828ab8bf3211ce02689ba55 +49b2237fb5861f7fd2003d4c82a15ac10f5e1325928aeff9169fcf585334f62c +571057f3e5d5bf3ebbbac63110353fcb05a533af4199d0abf922653efecb2177 +5fe358df229a5daac3ebede23bb469173a33ada03cb2afbe309195dbcfe08cf5 +472f9979956828289448a9781ff3b8a4a3f375a57ccc6d1ed120ac150b1b4ad0 +5d76760c330d85616e88801050c93c9e44dde990a8d1867ecdcea7700b6ad389 +010a5f0b846c2fbc7e4c4b2daaf0fc6443004d6993fbf3990f78d69350bdec37 +66b9f8d3659fb44cc7917208072d1cdc3618044e0706804aadbfd6e6823e197e +e8dcbeac8f6ae996260f5d75279b3d1508ba47b61759dbc1dfe41cc229ff0f5a +a3ff10b0e1ab34e1b29fc95f245b69d61f8ccd5835937b8cf2afda032bd85635 +9448b70d736946734ecacdfc0652cd5fc7653b3fd367c4c5d9c7f7ae1be27671 +8bf62030e55fed95b073eb8b805088eda02d726e2f9416eb02ef7ed5ee19b57f +f196b0ce036cee614680585d911a289a4953b5288dbadd44e2e6c1e406836a6f +cab530c36ddfcef4a58922f96cdb00a41929cc98dc77c52dc6c7e9d83b188a88 +1c8a16de3557f9bd5b23e03d5c9cd00f921a1e7f7c520b6c55205ab0dfc8caa7 +6f6d7aa1e2c4819e4d19af8bd07aebb63e716d0a4fefbd0c9600e5c5a9857ff8 +a637e2da191cc7bb8b1a09f4f4d1ebad7549b7b2d41d74cc991cb0ef99fc1bd7 +b3575dc3003914643d277f88131facc8b58b3bdcc55dcbc372de6e3104a92609 +09d9fe9c16e18ddb44a481438ca22330c7d6b7a4eedda79f01bf19c266ec672f +99fd1f26d55faa7c485af35609a799918dce99225bc28a60256f5d393d488bc8 +660af7a2651391bfb765a8e7993a8701dec9254c983682fbcd136b4774ee2c41 +bb2e1c64a6371db80c433e8b0c14658ce0ae511bef8da3ab0d10d4aec7d9545b +90881504302bcb086528834bee3a0c744092067de2205a7d773a5b1882d6094b +9f32b36d94033259881aaf60c7ea2eb496ff2bf705aeb576a41170461fd95e2c +0c4a65ba15357e7ef123f8a749b89583e037e1e9e2ea2d8f435bce1627cbe529 +7183f4634de4d321d6b63d939abd38085a1d1ecd916fceb8dccac6798b358449 +ae06c3f7dc948b9f32346a3f492db2b894605f0d33bf2ad98445afcb05b6be5c +2f38338c78b40cc533b4d7dea2b9760f48a5822ce3776e87a8748f81c84ee7d3 +d43971f8d572904da8b6e1f2f20f95bb2c31a4febdf195973dbb2b8399883d9d +7edd05e710d4161fa96e30244dea9c2dae7ed30e36058bf077f060067c3c6331 +b26d7e358cf3efbd5dd8820d0f383071fd7c8f29886e7fa098a9521eeb557af5 +d275f95ccd75f593e97aa2a1d7463ed69ca8b87e3ca8359861cdf24ff3a01955 +befe00289476891a2db20b0c808ccd590598c4486d00a53ae66acea05e921f91 +b6b8410bb4708bf580998f9e08df92798f3da75b1ba7e380d4e3a5efac7424a1 +83bd2adcfd45d84a0495cb2cf6f647ed38042d03ebc57cc7fb01c9b6eb809815 +aaff355c0048fd1456bb3b666d69b61e62e5f8764d8fb8cbe568ffab07b2b20a +dd75e6e8afc57cdd6a368b35903177c16db14c14f861eb4318e158caa7615743 +c847e066be616524248056f1f1323cb75f976f3c45db703df818eb011499049a +3795c81add7bdb60c942fc7dc78cc0644a6cbffee86744af3127d021b0db7cad +29745fed8dcc7c814da5085ffb6537dc87b2b10c0d739ec72037060d77d03479 +80b7c1c66f33594dcb8fab64cb6a7595bf4321074e177b613d8ff0d6b3165734 +ef7ba807198398cbfa82b5c22268966bf1c6efcb763bda2771370fe353d5f74e +39b97d0007c8f07cd4ec408d5fd8e0b91898da51c5995f1bf401201f3d990741 +a413a1873c0630b02461dbe7eefc315718b935819245a3e4ed6f7245205b0260 +2ba4e3fbd10e9e9a6d795b7e5faeeb4bb327f8e2bf6288afa17b33febc30da26 +339646fde4bc2052156bb105b6495ebb1f109772fc0cf4e74d04fc343e59455d +f66e127b01af76306f1eefb66cdde33513c9cd8cfde5191a30a611fc740c7778 +a8ec6ed6ab7294afdc13c647b5beb50d055f1713d94f8f4c34198de9e7d69140 +4a6ac35aee04add4622ee052dc6e5ac069ca16f44699d6dd1135b167daef2640 +6354b17dd0065b0667167a32152e0a1bfabcc906d6a83f57322b6aaeb665739b +0a129704c95439feae80813d4e016707e58501284f589bcfefb24f2d4f4a64f6 +8f498156b4b33739c6d709353b297803d5e2be86d22a8537ecd6f22eae4a9a08 +8675186ed6b6f04bf4ebf656f62c93b707b488177b56c671218c0ecfc7c331e5 +ebf4d7d19e24e3874722d2ec41850586bed01c51501cdafb58f62da3bacf1e5f +fbe991ae47504f4cff536cd07c27ea98c7874d0332184e8e9ec489a8b88cf4da +3aab2cbf5fce08fce1aac46f7be72bfd13b2e68247c6dbc126e94b6c223b65b8 +e10e023b083a73ba7116097cc30b32619e0337e0234231d125c615edab87a076 +11dedf515e1015422838455580e1ee2332f79b66e0b187045fc80b02a42b5864 +ca8f5ec65bcd6740cac58c1bef50462dab2b0148c1f38ece89fbdc8fa08aa8c2 +6bb7f7c2760f88e4b56e3ead341f6696544fc6735122c136ebab68afa8dadb4f +54c6fc0166bf56990d9b28d0fa8d843f1c971029a46665c1e5b7bcd2b9d794cd +ef19e52d4a154e0d537d14c4bf0feb4ee4f289cae0c86cc82fbac3b43102c28c +b5f6a82948da4c51fcf85d95a91a5a60806815f04c7175f695e1af5270f961ca +bf7ca7376887489e598d4014b2bcfb9f4a745a14f577ccb2f402be279fda4d02 +3f464004998682716083496d4112ed9ec7351d81bd4729511a96f001d119e714 +7641307abad87eef8cb42bb7ddd62f61eee2a3944a834039a5456d3324c53c4e +7b44016242baa784eba34a2ca7556dedad425bdefc04f11aab77263b508ac9b4 +4f372af561266420f852b0f288c5a8d08cb682b47bcd0f8c738370c48ff9dc51 +17e8551a946b9b0d0b441e8353e15214cb669f5a696b50a23a4092b65d3fdec6 +f174fd8b2d51b22cefac51cd5fc7653b3fd367dbf0aad2f94172a50a1bc5c236 +103d08e2aca1b465cdbd6441a8b9f05b2e998d330ae453cb4d2ecebd069ea9ea +10a0652dc518141e6bf674282bd3ac1aaf7361513a945163bbfd249effeba765 +38c41e708a6e765fe6b7fde08d192ae7e1e4a12e61ced834f873f89bd13934db +828fe9925e412e687fd5b99ce4f0fadd5d20a2d5d2c083b98d7e85655df6dcb7 +f488d3bafc7e1cf88a8ddac3e33b3f38c1da0bca42f052f379bf663f7ddd047f +227dc4461713cf88d27780480ef4154c1cda2c40ef944a86aa053375d9504107 +4149481e9f6d061b6cf70d533ea7f4df16075c1cb2d84fe52ea967b85adee81d +976e3b5cc75fa41286cefd804fd3b471c74e973e3961346a3b6473390660492f +1e602e7f27c38f282c7d398013f133812a6e8d2d20c45f8c31c8dd26e53ac22c +5581ab149190010f6e3213f77da2662dbe1919d79a23aa976d23183074171102 +9dc5311c96a7dcd36bf4e60780ba68f44292b23c6301bfe39defe3f420306b6f +c94a224e43638aaa1d3ddcaf6d4976dc33831d413f691ad7867feebf53ff31e9 +05a6f084f525873c6e1a7eaf956f8c1f9728f88303c6cb14b6f79fd730febac7 +1552d5a8e5f4b8e0bcb10efbf8a49ca6f470ef4ba8fc2b5b05d0e2077ff12202 +bf480f21c47ef74592b6f8a25ed1bdec3a87a3afca117fd40ce5fd5700cc0b62 +5f29828d7dc95812d142e1967b748961b343cb96408146a6aee63d8cb82e0984 +1073d3085e5db40b230814bf4a2fe816891d33003db3cd0a585c1dd306042423 +a212af55353f1e915436137cb6ef0823dc1f14746d0de7425e036cfb6722a890 +3e5260dec6a7dafd44c995c215d6a917075a3c8220884be62c0660b833b658a8 +74f9af8d280d67bcaa96429d4882427c81b38570c66d0e309628d8d7cc28c442 +2511210838a12cde39af4eca0423e5b040c52124b5c549774e207401ffe8a771 +08192fcbbfb5a127c24241c8d3e0bd8a70456ae850725fc1dc1b2d5c2d1acb49 +71fcdcd33e027a562c0ab202e73bb3e701d4f675fc4e301a710bfcef00da6ff0 +926112665593322dfac72485b8eddfaf4cc449154c53c4403eed5332f38c7498 +9851e9e056c6b8cf9fb7079b48420f04cd54cc12d505f13f111df1a51672447a +71defa3128cbd7ccd50afa388170bc80162228c1ab8b8b98ab9bcfb0d49686f9 +2fef95de610905562e92665992fc6fc31c2a0e9ec7fc06bd22addc740e02bb02 +d08cff9cdd111cf41b91a7e4d8f38d88d8cbb7dcd4120fbb76f69a24a773f32e +a1f63f906a92a16861db77523c55cfbfee0e96b00e1f93dd20d154343ee774e0 +1fdb1be91c43a7d690a557dcd5f75fc2bb0e3e18286dd8e1e23412fd61fd79ad +602259e90d0e5a2894a29eda1c096289766160e356931015f1ccda0a56f3f2a9 +d9c2e495157514e1b03768d8190619e0bd113afcf91f67de3ec80a09281107b6 +b2af3e22a970ddc8a28c61140b102d990392c923a50e55971f6751287aef256e +f1c4540af2b1d7754b16fec88e3ecaedb6b713ba39fe835b27cd7fc8c132a740 +46702a4b9737dc04b12310ba7f30ad94de90c4cc2c0e174c5a119d14ba6488a6 +a1134a68ec0ea009c0caef6c0b1edbfcac670162a1b3235757ad4dc4b0ef153e +a4c396a809c8ad3945607752dc6ecd49348d9100c3029da91cdd15852d80cff2 +dddce3e7e2818294a4113ce0bb2e4d930b1069156c346c2eef80e8441084fa66 +7ed142e5f9414f02a362992ad52055fb82d627dd481405966836efb51f858f8b +6104fe5d335427b528c2a83512fc056de5f0590945e84d9da75012e2382cc99d +cd957c861f43582d982411c74d62c0ba1320d0e069cdf1ad193a4afdae8b0b3e +8bc1179ed8b02e0acf0591edd39971dc36698a884f750694b57bcd28ffa1848b +621f22b1a5c9b85498caa13e82aa9573695d3e1ddd2c408123494d46e671b50f +5314e92a073fc52522f6492de090208493f1581017e05d7f8bcda9cd8cb62cf8 +2cfa57390a3e27ea3a15014a00c9b6189bc82996f2823b1f7b6c932ae9d44cd2 +351af96c918294e743f054f1cd71f1287e7d0dd8908e573c3113734c091cd343 +95647aea885cd9df1211028b13f99591f653f69df2bc629297ec1c273ff6c446 +a7d6bc6579118915705baad148ce2d8d0f032ab0ce4608d3f2c19ec255df6b86 +c88700d11dfc2953b60391c5c4eafab97fb6fc87c467f25db92c05ac2aec8ab9 +f4f624b08f92522739d920f7e07eb4d32807990a1f03dd323c5b5d2b4b5af128 +c18cf5270e0cfbb3744fbe8041d7ffebbaea8bbc7b851f6e34e7abe48cfa8b72 +00ba0034a95bec468ca2f49f7f34fb3a441936128fe1d842380aee63867b2ec7 +38963bd51781d14bb5971e156e6fb64b2ac5fd5fb3c1c1569a6081ba0f98d8c7 +7736a52aa2313dece258c0b9e2cc3c8547fcdf0ecaf7c704cb646eb9b00b0d29 +4ff444b03c4d041667206d44adf45890b1672eed8cd460c32b8cb37e21be14c6 +0852be32de9002618df604770ffadf5cfc05857966bccb01edd59906bbf4faca +52a14c2e1f0857cf039a4a82474f03dafd54b8c163882ba77436820fec657082 +45bb02be9e7fcad3cc9ffbd119ab53982acb49e7c74fa8fcd92b2b0dee92eb87 +fc7f8bde3000b42656b338078c2ae8f58eb616fdf447c06ca70048b2f5ae25c5 +123655dd45b546277bd35b63a1308ca47cf4d8917c4bbde2b8a07855a0628c7e +eb5bef472819729b3878168096a81bf7dcdd59df236fabfcb0c95c86ad80800f +c2f69fc835544ea36403ff2cf0f3bc8127bc2eb5abacaee987b76e202c8de7d9 +954fdfb49cad1a5e9dd6e5b943d9b3477acb63cc884168cdda0961b483c20b73 +2f7012e980d1c6a353134e2ab65b8f93b6c6929ba78287c215daf08f480b786c +45b5ee6df0b2b030fa7a27e39268c1526759aa0e095606d2de48f0e7ead25596 +09eae59437b3621716a4892a241d8fa957bb65db783ce120cbd1e6bd83b8a26f +579f062654e17f8e35159212f7b1b7788934279c0315b9a603b3008cfb1393d0 +edd53889e22df7108a6cb6e2732f9edb9ea792e00469f192a288ca6fe995c7f9 +e3b321efa32329d3b1f0d467e49aa584000810c5b547149295a7676ff1e4cd89 +d8d6da7e117e8cfd0877e8d7ad0869b15e69da45fe038ba3d62ae756bec8802e +e27ead377a333d62377718b523658dce2f8669a67a70585fc50549b52ec5289d +22dd47a8892152cde34423e671a3820089f4f3b4007759dd686bbce52c7c9fde +61585a41e1e74d33d72e052708b3163d62ca2e89fd981b595b3840c94afc7b5a +3148be452208a894dab2becf9820d8e7769ec43d9635aa867edc4453e7d03b4d +f0e4b89b4b6a3297cfbcdb97b158e46503f38c9543c49d81a41665228c07c28c +33965bb4fbdf8fe213bba119605114bf07c4de83aca1eeaddea3345caec6ef41 +ea7bc93bab21a2948eb3808f467090058fd08f00510ff600658fa971d1f66e54 +7ad1965a174786e4d92e059fb6769e965b1147f4048648fe82ec51b13bc56c71 +229b19829abcc1ffa85a051c413245bacfe48d720fbf8d4496c05d7b5f45572e +6190fdc37301f6cbdc44031c1e97cf47f9c5b9ebec8f79c8bf8157c5fd861ca6 +4a5d258d12a8e48f7c9ed901fdc289b53641d5cd5e63310a8be495b1104a96ea +664da883db4d8b8dd8ab1dfcdc10d771d37562edaa793cc9019389d060709efd +18d78bcb6d3719a0ee0a5316f9f40fa503d9707a6d6abd1cced61dbfccb06be6 +714985a9ca63809cbba77857712c2381c569207cf9db2699dc0aa6b7f5565043 +816bdeb09e29be611cc336c31e84302245c9ed37231a7b92d711742c640d06ce +e484024b5335dbd0387548b2b71655e83cad37abc1496e1cf9d8fe792fde96a3 +bb684ca9fed1bd75d9bf50b06d58bc2929de047f96f003302fa2872ad8be3e0b +68873f143abdfa4a73702f481ec4e32018581f19ff862c93fdba310f5914a242 +30a24df9f56ee75d274c9d5cdeeecd61618c14a3c2d36ae5167b04312e7a7797 +0267e2df6837256f0cad7af1b5e29386fb384a8ec2a3a116e026bd2e48fdbc5a +90d503e2f3c5919c715724b234b71349ccc9dbee51808884d39a8b1ffa448488 +504b67e245eb403221348735723197708a564298581b5d75384b13ba92a7e25a +5c40792e86d3401f9fab4a41762d95982365f6408f9683877402ce4e98e4a00c +c3178e104c0857719ac4cfd53d07c219eb60e66d463708e3ed65cb4280285c2e +723673836995e18aef5a9a503d7e89aa2ce4e17c33a1214df21ef551d68c3066 +64583dfd9664e09acecee772d6a70a23f3840ecdf6a671dd7870e1fa9f261e79 +6048168a73a20c53a971656d47a0ecdf7e7c5cad76073335ccdc14477746c675 +e2628951ee83c402f7a0b581af8ee6a594923a375d18c98a2dd01d3d5eb8f71e +657bd49e5b0c4f4cc0a62ffbe13f10cbca8bc2b631d21b43827a5c3ee7548ed2 +baee96c94af70cadccd81dd3a48c7190b0630a0c7ce48249b91d92a1bfd06ba3 +123f97326e31c195fd1771fe71abf66fe3fcea8b285d6a1d4cb55b9de4699b0e +c55bf2f5d6c245f41cd933a4ce3eda258cb90e401c6075a02757e36717c8f547 +4b4e9f3a8c2d172b5d380dbb9e5cf8dbbd8b2d8cfd014a5011b9069cc00b7dba +21b4d17f44a55ef1e5c49ae01d91ab509c3313f2b0a8461194bb89fec131a396 +4e58fceb5677baa816bfb9e15a5121b3f0649562f920ddc302a949268741a677 +4e8c2fcd11288f6705250232d4de4caa56a8e8219dcb805ed08722a674d94491 +ee9f530d2eb8e07173f86912f0e585e0051cdb190e4d0040f9da037f29890068 +4e4d5577f67a9359e6f86b690ed5e6d3e772f7817edc2867dcd6d11dbd59b9ed +904a57f2c5dbaedc298dc4f2bffd42a93e77925e00b4d74460c68196f0326f39 +f1ba9059cdee88c8a5377b623fe791c7eaaaf6ee2454ec3f681bf42600a97acf +bba69df07157f26b64a642849a3da66f0e458fa885255699024771c0e448e620 +c3a2607b32cedb6e0b72a5a5dddb10981c3cefe08ed3921c4d0ff87c18cea04c +16bde8148e530979c140973c68ae56da99048448c6041f1e15d162163c46f7f0 +5f9bd3ec2c7b2012d6f3c29eb76abfb56641774cf6b6bf17ba63b7dc94efd7f0 +c5412d1448ae3a093cce169908469e6ce06971d89a547f25d5479fbce1b89278 +2440339e904500a9446ed22e000a9213858c097896a83f008b180d942e397804 +a669da5d731b2b29c3af90d009e4d5fc9885e9a446a8e4c7d1e4f2e64629d829 +444da50342173a10deee11630aa33d865c532f39cad6326674ec49a348a02da9 +966cf4f77692ec51253f5dbc8650e28992673c97a8bb57ae2b2a1331644d3de2 +0236f8cf1c3f071fa6bb2bbda641410c39585a57895988e5d653daa8558d797a +87d8ad98fdd07477a82c09076c6d5b8c2b6da0c3f4b916149bfae6ab3e47b977 +9c00f9e01cefe0e56a3dc2820a78bac7ce577e4e3e9b30724ca1ae980bf5320a +41f38e2fea835dd1b7f8f252ec7052793b34314e0faa27ab4edc58ce25feaef4 +011cda00461160b772ac3dbb072cb3bb02b27f33ac2b9873a8131954a4abcffe +1ff1b3acbb237877ef0faebe4ba87e886a217d62a86fff64119cb68a54ea16e4 +6042eb0ac3194be279f6662a3bc1f6d46aad795274df8c5810832a8a7b442a4b +acdef42384bd3c25765321fa46f000e330d01a4d63cd71f11bf2cccecbc0916d +3a78816f519b6ab5e58cae3543236eea83678c61c3bf8da0db91f4f9553565a1 +ef7cada3a2eaf42bdad0fb7702dbf84ccaee6e01b97b2acec60a47cf19f42871 +c4255eae175c0265ce822ba301bbf495104a995014cd9456e73d2ec34d417402 +38c08c6c296cca1ca3b6591e3bb34ed9aa0061b1309444c29f544bdc8b22083e +f8a1975c3b20d6d5ca9c351c26334eea4dd8b8a94f33e6195c1a80d6e37bd2e8 +4122ec755d4c52614af9dd42d9741e365b019654bfadfc69a90e2ef9b84957fc +6d546f6d8d8f75f7dcf53ac4f597cb302ff298fd67a72ec5fd2d2e480e239060 +d6c242f3101f449fb1c394a0e5aab4e2c045506d3839f811d173c0564fcd1657 +f668ba835451a95dee465ae2ea790afe0e9538a6da482e3c9dfd134366ebe8ef +d446d7daa9c05da01815985a2a5f2c3ec1f0a7a929717d234e3e2eb26a5552dc +3577e7aa7bb1ca1ca6c3b36503d08f079892a2e797a54def5681eee1f9a3577c +40e7ca2fc5dea406e54890bab23732e6384a647926d8e072de0bd636f1c75e51 +952c8aa250389079d6b04490e372b4218613ab658ac1c77ea9a1ab429277b778 +6ea8dde78ffb71bc0bc4dfd9ff7e1a6b2ef19a12276f3ce7d4a5b281401af046 +f8b6c6548bda69192ca355cf43bf1175b033f01e1bf61ef403053a79288671ba +85dfda331ad1fdcd203e875047c740c42bb12304c4a18a407bc99a2c13a87c60 +645b158b0513a90049845a03cf574e1496acd0f2fb0f914e011b103533e61aa0 +1ac25bcfadd456f33b64000440c1e935fc1681e9fb6685786b72c909055e4f40 +b70afc227ac5f2dc1e3e58363547223cd835d369351f36cf698120403c53e4e5 +a16b756600bf0a37d1965a2ea457df75e07f3021023072b12aa7f3d9e8dd010b +2dfa92b24d7375b7ba1290060b5b5c9f1537dd0969cf9a7701fda9f9a96359c6 +ccc15f736f5d2479824e8488f6aba11b3d25187a9337effa41ae611da4e35763 +f60ab26fc896697bddca64b70300f09a104d041ea41c4dff6f33861b8ce4f45d +98fe08b1626cd9e60a4453597e2fc3287d9790296da5087c25ae7b85be898583 +ba29d25a59c776bc93fef8f3059e77827449056c2e55a4772385354bfdd19284 +7a02b8d0d5ab6b34ad9968d68c1641a4ccb2c03e5253f1aac444c1afcca8c94b +934806c61442f810a7c53f06db5b23d0b017a72afb5be70287eedd1e0289ad87 +43965dae9770a18faa7944cad4c638eb8d918558aec3a0a695765172d5c834c2 +13e680fc79d9566fc3b47601c706c2609892dc9d1650465703ee6c2f7eeadf92 +809cd4831e47a0188c633102019b6425cb76403f967af48976a2737504060649 +954c118f616bae1de9cb94ed75f6a3dff1ce4954dd298ce8b5007d1e182a7e6c +e0c6873f582d21cbc2f0638d4a7b2679ae58bb54c7f8a1bc1c3e9eafbbe909c6 +40ac2bba74aeed432242720e473163091cf6fbfec4d44095434600789d7d795b +e5ae5500584e8e637daf9a7ac458532f3e44320be7ce7aa1f106b6420e67a96f +459c23b7b02404c1b7620742766142545551de23fa8ca655c1579fb2c0a10e93 +1c220e584e9fc86eca3aab882f3881c530ff92dae83340193d5aa93bc857671d +ca3fb1f03534ef6ab4cab64e29c02a5c37e19d1274618211f2e7493a4a7045b5 +3d39adcc8de68bc7f2265914218d2d69abd7c49bc9237535b4d364cd67bbbe35 +f13f71b88e83e3bd6f09caf327c629cbc2b8ee728daa1626795c2995c7919a2a +e966108bc76de252e4df625e95338332b6aba850f0fe97fdf247e85db1fa4a8f +3d307543c80426061ff86b4ef8d26997baaed5679cf430bc88ce20e31cf510e6 +987be01e58a170bfc8a6259f113cdd3541fac41467a862acb3de36fb60f72de3 +e0cb8a02e17ea8cd2eea27aba315fc34795ab06dcabf5ffd1b83e2308b2a21c7 +72cb356f98a7d2d0f0cfcf69d672aaf7fbe6198344aadd2ec28f593c7332b0f6 +1809ef49d7c19bcb6c065ec2d890d4c8a172e061f47ef2cc392e974d1874278e +250453cfbbe55c77a0715475a7cb383a287cb83f5a14fd027c332f79a09cfcfb +2c7546c8aa601d925ef6b72a2f1ac1df26505bcc8229a4aa0c7167b9d7c56508 +901efdc77754cdc396482d17a6e9fcd200a0cf35f67948d11beec6d38794a826 +7c48da337fd191705e26eed2981df5ac1e8f4bb23952b9eb6f92cef4139e1884 +bff9f37257cced07790b6ec333d66a6800d8c8befb1d6362786b3ed00ccd233d +80e8c4fbec37dc7dcde3e5ff2b8a81596dd10b714d9697419ecc542a661be66e +a5082e50ab273dbae50d60ba68273be1adc6f750ba2115af58ce22e8e10443e7 +2048d5b248294cf81e9e1995dffa731795817c556133b714d4970b379b310698 +d4f690f2d799153b8890e74dfb72a5a50c476be90cd65157b82fe6b42c5f1be4 +3d5cb0c00ccc62f270ba879311467dcfe9fb62aec22c5d4872f6b02b8a8442d9 +d309722c4d30047232cd0c97049695a2cd80478ef3845f6d1005f36730c41429 +0576753e869c83d458f0dc3f42f68264e020270889c63218df8e1a8ee73488f6 +49ff10926847ac73be9e89879157cf78af203a66ac491eb93ba365b8891dbb8a +bf8a4403b36e0334beea6749cc202ab18dcd07028f2f6b29b0eb5865a3748aaa +c60575212f532b4cd4c9dfdf00aedf6cfe6703ec89b63950a1011785f6dc9c78 +d09280ba67eb5a78f9bfb797add8d7b705ac5ac61a16fbdedfc1ae720f9a4ca3 +4cd9828c287b680c24f11bad00b644beb9f6196dbaec8ba231de2d065bd7f42c +d731e09725adc7213bb1f5e675bc11aadaa56da37f62ede33a390d43f42a795a +0a5df034adca9ecd0e3132453aba99fdf4ae8cc2a7600e4aa10db1db113674f5 +10b2427b1dcb424623a259cca49ed14c97f0613edeb93f459fe9b9cb75b4f308 +15f5c65f839208a6f25652c8f63196ebc83c081c4739a692bf14ee8ee54ec4ce +72a35bf84d5f4e6c0015a4443e7f799b7bc6828e30a97687a0e5b8b722fc69ab +5baa477d07bbe2ef09a4fb7f05db2e02923bc8582f27693a5ce2b473ca02a815 +9c0789ef683ad4c7d8708dd28c408a21e358fa2c30cc598bc36c5651917da2e0 +593e472b57d70c0d6854fa5422e8b3825a9e39b0a54b0634190c2aebff4913a9 +7534bc70e3e9b3458f272d24087e74a538764b43168e74108da00351ea558e3c +34bc8bdac1e1bc9061a688723bd54f0bd4ed7c165f32dec016b056b7cc566a4b +1c873e36ffdb7e29fb088782ce60524e2d75cacd23fc274e307dd1d2b07558a2 +7f64c4742eb3ba451c8ef3b6591d193d4a55a42fddc17f12ec3aaf51de8056d2 +80f09997bb31a07d6112a855dbf7062218dbe89a6844a006f23899f98624ff6c +6c364bf079c4b3c2f92cd79534f89925cfc55016218192a98cdf6cf4fe1b5fc6 +9540ea49643891db45a7a71cbb85f41035f507dbc6b161f7f1eada70e7905aea +0b1983f7909d5575e3e7e8095bf0f4978217b23f329f057f1152ffc14b9bad8e +cd6fff8598542a6adabc992ab3563f424d108d95abffe9977f09630ef4c6ba01 +90828d34098bb40bd230685153e7282671478138e578f608873d64b00eaf1339 +6dbfa02de3fa983735d90fe2d0cf7d28bd9f35a475a6f55017124a58988d00c8 +713745c7c999ea746bc969d31aa62eb0d722cab1e57cb0ee97cb969d1c3c1b41 +cced2d7ad87df16215f908e02a358b725eb5b234fd620f7f54d70f764eafe8a5 +de65e3e171c885eb012b3db1707c76724b62bb0c1a51be0b67179f96a46ea538 +17bd480e774c31fa131141e017ecd4c1864f62636127a4c7e9bdd05679462314 +042f0858441e3d261ded65833d91d80a6ce303de41060312e60527a3dd45404f +55c93a9535c3a393f1748609b002be9511d87af20c7bb2c4cfffe466df21b100 +e20172c8215855aec00e3680c7efc58128a95820085cbe598b9603c70638e128 +bf0c2ab7113eb95b62fd40fef845b1eb5414737cd94ac65970a4d6dc2726d2ed +2ba7567155154ad30301ee997a3bd52738dd17030860d3a479426c652cdc22b6 +2c70f185d812543f836c7d0253ebf8788cd6148ffc163699f72a85bd2600cd2a +72104cfae46c836939c5a8a6584a58022d0ffbbc1d1f035d959fe58013611cd5 +be08db068630e5a4c5fe915e20e5652bcdcc44f0ce93221ae09c55fd565c2523 +79189a85ccb93f2d6162402f2209df604f140799d7e0b34639149eb5e54c33c4 +05389d46c775ef19519f1ad4a6f63a62435c090d8e3bdcd6423f5b7dab32d263 +165c93dbfb1af542af08aa5ea25595b3d8ef053e19a16e5a1b13f437fcd2586e +4534aafbbfe1e76906e832c6d1d47a3c5c868e65afa7af2e21e54ce233170b0d +e44bf290c512ff3acc84f0e492c73a0d827d701bc9766abc4c08d12fee986020 +d06762d4a0163a976031bb13e7e86fdd3101b8d5155046ad9d82fc26496661d8 +8cc516350229461d6c11114c35a0d13a1c6ffcb96fdd56105d67bc5666512de9 +6aa15713998ad53064b7023f64dcbec8ecfee625ef76f5a024c92330585cd17f +1c3f82bbcb509d4d31b535cd5853d803ab7cf1862e8a87cc3d6557aeb7567ac7 +9ee04bfc8a445169afdd1b1375274fbb78ce431ffb9c6fd61a99a0bf1b41c19e +1ccd5dff38a45647d51fb014099c74ebb11c5a07050078507d45a1ff1fa2e178 +567f745448157bad850f1fdcf9a37afc8968120892ebc0f85f5dfce9116a7108 +b5cc34c5d85a91a65d18b9093fd27e9778ce26bd93644e4c20ffad131503b509 +850f4fb260edb6d8cd0bdcca4beb8a25ec1fa44eb5b31e9213d11d0a42d1aac0 +650e1ad3880d59d2256a2720081fa2a7482e3bf1e4f4afa59ec16b810c0c1cf3 +2cfc726205b285ad7cb21d7a59fbe526a844a5d75ab5d61a801701c2984b48f4 +ff020607f2ce9b468df2f74e04812262943d8932d2e3c0478afd42a8a04eb7eb +44f9dd70b1da28153f4f366df0fd25e89f942aef374fb9bd31d9575803c03e57 +50e5e75975f108b6c7bb770d824e5eb88d67dac4526d6e4df1c6fca0a5fce033 +84b06624e906912a26412b36cb177fa2dd18279591a0db289d18b1754461b97d +076631b5d598cb2741652bcbcb9804e1d01a8502b03739981b42e4754e21287f +ae2adecc9ab60a3ba753bf94d1b586c0f689309cddf12131eb442180c1c25b75 +05bae86b985d6975d1048d3da9ccac02bac3e6d8a2748082e252167809ec7b81 +7cd72fd364f27f9aa276cd5e70edf56cd5a0b9cd00b815411c766b67dfa424a5 +1d9a9c7e27cf57e513965379e180f1bb94b174bf827dcbdc89ffef77f5e2ffe3 +9f1dafdb747f003723dfdfc91af3c6c23619237e4f661de027809a510242ea85 +d9b93733b9276e37c01da481bf86fd040b2a21df21b3aebd8cb974925ac339cc +110b604531af29325b8d844305196e5e1366edbd5e6196ddfcfafb27e28b1adb +6c2a3fd16d904a1ffb4a998a4614cacc85157d8463f7cda5363f5f03b9141bbf +4788f8e92de9680f3fdea66415c9ce8295c8a1276fbb9b57e97f899caa8ccd60 +275e20ef7c0ea888cd60bae018ab8d59d4b9b0e9a19d71cdaa96392893a7284f +6d94291130edefb156dd9a7d172c89b881aa5dd8d1a4d9177640bcc8d308a801 +547a4fe7b75f04f99d529c854dc059641c7652132291dcd0deca5ae1044880d0 +4a82600f293dbce78d2dd503a4b20ea39f25633c216021b78cdeedf51fd73c9f +ff3b4e7b637e90de3838f8aa7e1703cbb6b5c74e1f0ef474c9ecfedd79d0b8a6 +1559407b87435fad2ca5ec36b170391fea7cde5824286f66bb0f2b14431d2481 +0fe6b2a6905c2ef0908bdd4b05a16c01c00b2eae7bf294251633e806ba08d21c +3e1823e8c0e9b6ff171c19f2d4b27f070389606d90ddbe0303133f565644c8ec +d9dac4daeeeb490b2dd2ffecc57d69daf3fd4ac8666adc318c245e14f5e67d44 +d8941a967696da623d22c077d7484bb1c9029bcf536aa060626df3d5593bd4b7 +af56296934d03d03c682426f00542ad5d3f9f8631e97eba46416979b6b2fd5f4 +4f19b0cc18d28d551fec3b3fc5440f3dd5a0d79fff8df917dd515f68eea2ed9b +73fe68e395c7fa2cfcbbffbb4a7cef13b875b96f5e805dd45a7c8d3e2eaae5a1 +34e00e26988281b159cd8f9d31a2f15246efd8d927e881a173487df644cc7656 +b847682c04542f35de33a7d638b5a2187a74f036ac693e4ad95142e8fd852899 +b8ffd2405f5d79af6fa919f2613c2f6f4fb729f5d6c3fc8ae921eb23a0827667 +11432b8e7ea4c6c823b57acb073fc00ae93223a0f893bb8e3ddcde28de69cec6 +5c0ab65d48799ab8d1c269ce7ce346d40256992947b609cf9d3da1d758ceb593 +1d6f05acddafc290e2b59a93bd94507be8a4d4d675dccca80891ee13846be24b +8cc4f7052c5de700c953319b29aa4b87ac3c85377ad31a14584ed6970928e850 +5819d527dfdb85e330a5cd47a60932ac93b359bc0921ca40703f8abea6ad6d63 +83f8d2660f8c8571c5a13d889437d12d6a41552d9c4afcdf2fbc2bde8055d681 +3b7be320d48247a34cbe1b84791d2c8e9c417777bab9869cafea2c522c59b12f +23cd59779cb58f047e0b81fe4d42d1f4433dae0ad691b9c26e8f82b5ab867ea6 +fcb2d7f2c0718610130ecb7ce93d1ec2eddd2cedf1458412dfed5f7f067c473e +aa0235862bac6f8c8408c0f61d978312fc1a671c292620bc863537d286a60a22 +03a2d5dbbb772b365b925b9a616ec398359425e3b935c7e833e572ca8ecddf98 +121a7bbbef3f8e262d4c08cab12d97f15776e7e202f493e2e12b87f2e421e5b7 +6e3db0ebae2f1e62239072e98391135f5ce4141cea6d7e7a19ec1236b81d1ea8 +0fde0b0f2fb4aad1fdde1a004ac235c896a8a5cb15a4806401727e7dbd148ec5 +8bbdadd754e31592c37a7207a82989e5405a7ac58067f07932acadb77de65c56 +92caff85e5c183181cfde88b045e596cfbca6b4e0d37e6b881bd3f081ccc4a04 +a6d576b41e277b1eccff69feeb5253bbd9a8e11b554e496a16f714ad3bd963f6 +b8425f07ca5de122de2717d09917f19ec3238fe557c44782caca0e4e52f38b5f +7c207b180b498a8fa04e66f6abee7d7e79fae9e54cf566803a885db7488506e3 +8727b5bd772198624051c64da3945da5e904788ec969dbb890f264e54e2c661a +9574347d34634550d5b1a1355f35140adbc07be4d5ca5c791cc8cc01c4b26875 +26d8937cfea55684de8165b792f7740044e50ba4c19677a30bd453419a7b8d46 +437f44d206dd8a871269c903d78bfaa35c4d1a054d0935afc44f048da40cdfdb +5c15cfe9c8f19cf87cb93a6594cd394c7f64fe21cb599985a69836ddbaf80410 +4848eb7252b523563b1c24e57d4966d1eb261e4c9c5ecdb8547e936506175440 +381020593bd8cbce659a7a345a4c05a9790df98ef2bddc9fe45f6968c49373d2 +d55cbdb4de22c4f7d53f8263843f8690baa842f6f1bc7cc1545f3e0a169633a4 +01e5656f08a48b17a69d7babea61d476ec62fe1395d1c01988926fb0e69326da +c69b5e5347167c0541f226d4d2d8ed2b4828ba74f3939a4b77dea31d881c7b70 +18e1c1b646c10a935807e6d3a9e6674aee575023f941a098d2df22af754b5296 +360777bd1a5b1a8fbb29ec9ad201dbe0170850ecde219ad290af01017f26b777 +56c14a5d3ebe7ab8560ddf0140924131cb0a693433437d4a17f33bb22e92503a +337de079b27ceea348d9218278870e1404f7733200e31de980e38ffc55268921 +200bb4a6bf116ffc94e5d68015c7b0957254589bbcfd6b0d7318e1983d18bb22 +982e598484b2c7c7ca5b08482cc0f23f74d1ca4baa5bc61d1fd9094b860edffc +44c5bba1d314b46d6c45a5a1ad97706893733a9eaab22bec79f4437a5917beed +f24271040da4386867c830621ffd6744ddfb078caf5cf59e7e7fa456eac5abba +dfea921d226d36cc6d03c73716badab60c4021630643824a81ae62a731d7d647 +69749ec4f34068330b11d2f9664f56ab8b8a91864a3a2d2680717a6f7ebf8785 +a18fababe5abf9b1e759573dad33c4a968505e887c7b0f9bdf65db75bc04c8e3 +f397740b94b07dd154a5523b19b87879f8f0466d8fc9f3acfee32fba47661417 +a6a97aa66eb83ab06a8347a76890bc83e6bbb6de46f007e7ddf4c316e904244c +214382939b4507a69a29fa3a60ad96e420d6873f0f28c8283fe85c59f9a5ec11 +0001740aad1de7f7bb72ab2b699492b5b6855c1bb78562caf497ef78ce8ac3fe +b5f05639785318ce1b7e9ece0f28d560dbda6d134ba8222d94fc98e1910eabb5 +b8ac30c4d0f2574f2e83f309293c3530ffa08d140c4b568e1868c7b5b3edc79d +716a5597bc45616e2f11b4caa3e248fb96d9e84afc205280fcd76842b913fdb0 +d22a1c741274af30fe94c29a2c690e4e32292220e58e31e815000aadd624fee2 +4d72625d57ebd75a24ead23e75889bf3fb35738516b3b77a6fddb6590ce59804 +6bc39e4e9ae32ecdccb0bf9490ce9c8cd23e997a63bbef088fdedfd9ea40f21c +4d89f264329c674689a8536d83e395b5c17e6714cb48fc72a4879e525a954048 +595ef80d4b03d92f12664b841e00220e3a2c7abd65457f95d1d6b53ac96e545c +25b8ac77d8549bf343fbd27700f1d5b344e965aed917c82211f723410c8260e5 +ec603111b03673922f118f1b41f1b436dc347909355467db3bf0dee4a7844c27 +5b15c9ffcdcf334ccde89fb61c58e42848582bd44e2833619b0ad907fdfaa8b6 +97a09f114e9e204db7e2319a41a5866eccc8665ef6d94a9abaf54a71760bcae3 +f253f7079fde5e138dfa210368707b963f0c4ad772d30e1b56b969d911192482 +e1c3484f52bcc8751b4c4a20430316d90adb8114ac02e8fa845dc66978cdf313 +4f1c58be8a9c2990a1dbf0c1151996d1eed8dbc6f35d4a0a5f44c22515575d32 +6772a70d00dd938360ef9940beec9ac9a9aa2143cc02c3c030fc6288ae783bf9 +e6c6a04cc0549e2e0108807b31acc0def31458a8b32096d5ec0ea1e9871db2b6 +35dba89e4b0cb6b965c48be61d891a0faeedc6ce4ff743bf826f524d4f313414 +9368b2da65c9c14546084d955e937ac3ebeb5823d90670e2480b29402d0db8c4 +31e12164912a5214b439d8546711a39648e652d68cddb4c4e28aec95cacdf5d5 +73a7141e0963422cd82cb1d4568ff99cd8cfc938614f13a5948add5d8914dc57 +ac6b916f4fc5fa6b0a42f35e7c2120b623c61a6b95e35ee2c6040654623d2e78 +f2009bc55a897e0373ec35427787370450bf03ee788482396b09dbe8e2ca8d19 +dbbd3d71115978044e3568b63fe15d56cc5b08767f5a72861b85262e8b194db3 +5e2bd58275c19de4a46f45b3ac0c297a9e1d8238cacdad6b8728fc1c3c7c980e +49e05424f7cb02991dafd70e277388591e3e34923415c383d62cb366dec6f2f5 +da863baefbece4000fc620227cd325071aef5e62dc3e4bfdbd4915c03e686d17 +371c75ae25ac8cbc6683a378f9f617d19725057d84531c89cb0bb686bf9e66e4 +844fc8d6ac46b4c309cc74a1a948bffdd1d5d663672ccd358c9ed2e21e72767c +16a968605b3c403d99b8bc2bd8d9fc41a1f30a692a1302943db69e5b9c69076c +51233bd6963cfa363b280b8499331c172abef2000c09ef43f04db75fd5502a77 +b0c1027c3fb29456f60b56d7e9983e8574b1e75032b8605a27a713be6e0106f5 +fc61ff596c600275a27a13140056fca17426d235e71cb6c4eaede2cac9529d0e +e0bbe303ef02bd6e4cf0446fc21d90079f91eab4484a9251bd956483113c5eab +36e7b8c94cd0dcd6c5c82a082d335665b37effc612bcb5793e7db4a831b51ba3 +2b44f1f9a10027a92cd92634c93167e88b0564498af080eb0e1f92bac9672986 +ceda766c4d674cf74a1124f9aba60cf8074b493bb28cc379485fc6d11f050dd0 +80a6fb444933008df47b50a0214bc210090f9a0cadff94f254e58af23ed76340 +34eba92a70693c7288a79477d7e9a6afbe342867ccbf6b44ee7c9adebde42793 +e4a59ef5953d031f33fe4f12652f26a74b958fe4ced8e6025289027340bb27aa +946ae6445d6c3f79147c67393cf739061c2417cf81c75f85be80c99c8f37331a +e6526df9d46a11c3c1fd15886f07ca08112fe60ee83cea46016d15f68e64bb48 +167cfce032d138f6c124ac0281f297439995583cb9825547be0017918dde64c0 +1d78776bee428f7534f80a3bac7005aaeb2ab9abc0b534be7563cb582d298390 +f47c2e5a6f0376e7312d6d0093bf017f64f6697b18b9ef831b2a29ac630f80dd +1d6cee9eba526f2eab63cd1a53d842f52e58df2815f07f166e7960a410726b4e +b4437978696e134d4cbc80a465744b872bbf340155d9789194a06e891d1a1f88 +7a74da8de0065d6bfe492d1326910624cc8f50405bd9510c27dab17e281b462f +7decb40932108ec5ad173e146a3258d88c43c9f30be963eefc7bfe130beaafd4 +98e339cafccb138f954576ad1a38c0f149aa852cb3f0354fde3c7949de59dcbd +a42a73f39348a8fa776c27b5e23dcb6d90adf52289f3c84d49c185fd5394f712 +0d2c35f112a99197484795467b3215ecc0d51a807fc77d76264c305cb61377b4 +97a0f1dbaf69c35529584a46de46f516fd4d1a8172360bb1e1d0d0c44e158511 +87b471d543e4884c6ae7cb6f5618cc584d1e978f744b3bee0269bbae4dd4718c +ba02513e332a6170d0ea4015dc74aec1ff63a35b13b2bb91233026504a8a328f +ac1e11c82fe34d6d24bd5753caf5f0d8b83c945add3e7b36cd0aed086bcd0e47 +3996dd6f821236d36324e3d387ca7bf1707e7de378286a5065e050dcbfad91d3 +5c82b436b4fdf3736b422c00c6728583539527b554ef64b1c2e6a9c1d17e35b1 +3c58226254ac2a47dd1223193b4e1649095013734c40aeaffbd7160679f8e801 +f18376260ee6e393deec9e0693b4e6b728e35de36b1f40a6683f7e34e6e086cc +9805432b4ccda429b0136dcb4115c56cb01fc85f333204e534fa17558f7fe48c +ad9a89128ca6c821b01864bbb67062d5286283ebc1c559e5668e11f469bc7e33 +ef69003732d1bd8f0b3f153bc22e8b99a3ca9669ebc50526461fe3baca5cfa6b +5f7962fbc8cf0372cc716062f29dc7728499c9861424ee92b094227303046fbf +54aa62766e8c9eec066901a8a54f395beadf01af8620298cff08f20a455416e2 +2247b637c6597a272f7b0a28d616a82e234e49b0ada3999073e77b58f11fd0aa +ef941d49f73e962e9ae57574d57fc46a6b3ba2547dfc9e9667c08ebc05c98fbf +02e2e43bffc8a244136206f481f0d584fba9db1ba41ef8a2e4c10227633aadb0 +846c79c5d7049648f50528b5ad34e449540418ae28b53c3e34ae0d8867ac3902 +9746aca8629d847851a6a13b21e2cd95acac4abca1ccbf5f955e6749656314d4 +5bfa890e77a9fcee0d7d67b9a34cb2a140954678555ee64f95aecb843d32b4a2 +281ea103839fd3860ac5de0de726d02341bbec556d8626fe39e3df189c3269a6 +b73d27881d4bc81c125a1cc26b0c6f28811d4f74bc8a757785053162f64ec819 +4b9bb8300b7184699ac7edaeb491f1f7bf236ce695a5ff56bf5c1f4390fb3c68 +68fbe2d542005635927e401e338b6bf6bfc12702ff8fc951a22fdab1d720faab +e66f16d85889d6a15586b2f53edbc5f907179169c2a8a22e747a12d1bba358e0 +b0fc014a1c42990e01d76268d311e05e4ce5948c42bfba4ce63f0b86e0cfde4b +4be316bb2cebd0e73e26f446ca8478bebc132a064ed117f1a02affff29dafafa +c4ecd8e8e32bf8128a62aae5e7f2d84e6b63435cf6d2bfdb918a5d28ef147547 +f9e569b09b50dbee423c1a7ee40355a1cbece709a13273cba0da2e3825c8a970 +8037c94de0e67d5ada84c0bfbf5b96c0741fa043868c402079df2ffe8b8eb03e +2492ea5a6338a5deb290315e26eaf43086655014ba9ffe48f4d19e172f9bedd1 +218e1164730a81bbc1391615488c5b66d2f4c66bf1bfb54e226df3893a4b5a48 +2f540f19560d9f7d3b32757582782aeaf607567e8f4f0a0a30f976dca0ba5206 +02488b0b7f41861a28247eaa84af240a91ee8a4292454f7c3c05ead6f814bcb7 +84b96a394e834cf5ef4dbef50ca3d287409b060f767758d95114a26b1613266b +6debb528e85d77deb7f3bcb8a572ea917bf39aca584c4f841ca622e6e06ff8f9 +e8970dd1c9510c1618d01e1af0baec26c3882b6eb80a7e8f945ad9abd60911e2 +6bcb6aaa5f0ce78068400f9eea67fcaccc763770ccdcf7477f32dcc49abb5566 +4e75f91acaea2a9141436861ecbc358628590b2adc5ac76f1971818a49383737 +9fd6fe8d74e76a367abb6f7b624568fc7a4e2132513fdb1e66e06b9f81067e91 +3d6d1e5d95e052d569e75164830c1cad1bc168213da1cd06de144f4c714b0e42 +34ad2f8037115ec2c1a8fa611ee4094accd1ac585bf7235b1f07b6e2b14111a7 +409fe76c1abfaca8a35436eec605e4b43760883b31c6ef176342f834647de59b +b54c16ffe522bb5d71f432a253b966587dbc5bdf85472472d9111b8a23c49285 +391771f0e037bcb24a5803b323a27f6f0aa96b46f1c23dd91cf899bb59b2beaf +6ba551cacfed10663e3e7c6e7dd856ee8a3aef30b0dbbc22aecf3b3a8ee10fe9 +873892898ceab62300309a4cbe779873fb3bc7784a159e02ecb484f2016af7c6 +bff8798c7f00bdf847a6fe0e317465343b4c1585d03f83f2aa56904148de6d90 +65999bb74ec61877d74bb895b7dbb977d88e55fde157d4e0176416b03044e895 +655fcd0d98ea455342ce0e27a1c71c9178fbecd2eb6c35666763a6558d297fa9 +9983a24384848911542f0fb3956c7c6761b7e2b8588354eeaac4aa145203dbc6 +2d3b319538af1da0602ec260085ce3256b9a0ce6be0208920dc49eb2954ad6cc +912846d093aa398ae77075faf578d0c86650318fd8bfb82341281507691449d2 +b498947c9ac0c46f7676e0ec94a1a7aeab00dafbe8b1a464bdc9b41137e0219e +9eeb5a8c72795c7bc34600c7325efac4f2cbf55aa9b4a996c42dbbfc0329a694 +7f9dd261330856fbc0819043b357343eaa1d3fcf362fbd0af9a99ad57c5cc4fd +a10dd10097941bec739ba978da465599d16b6be018bf7fa1ee3ffff04d35db7c +a7f6acf148a663f999280b36e51bd77763d6a6ef6ff28950a8d4b04590d8b51a +dcb555cc47d92b21ad032d31cd54ff911516f356127e38f2fa9108aff32d2e5b +1f1452901c38cccfc8f23122f4680bc316785e012f61d2ddb468cfa55ac91998 +93a8ee273eec61e760ac5097167994cb9f52e62182fa0845b2fa6779c914047b +41d1a35ff4c499474ac5c277aedc0ee957400fb6643a0437f7f6eace0f512ed9 +3a33686f28bbc8ec68aca9a2bdeb407e975a8524ec3c068bc0a63ac6779cd84e +1d46c983fac8c89073669d02af734fbfddec35e195c1444c4ca678835a54b0f3 +f8a0aba3f3b5db7cefb364f491cd80110b6333f061613b5bcb834a3ceb20d95e +8119457df0838105bc9998b41067b9ce9612825cdf10a56c7b3af464fc4bd133 +a9d9b14bbad06ac3598419ce3537fcb383ce9f650bcec756592bee0205e0ab71 +77b172fc8c15425359e43af5aa75959561e3b0e6ed08ded9da737f3181218d1a +1be1044211e9d9fc86f23f48ea8dabeae2de9ee4ebca14a734dfffe643c55875 +e934dc377f170ef8fd4e83b1ea53026cf1343dfff18fdf667bfdcf21f82a5a3d +d40d34e7c3090e76c1dfc01aa0194721d9a0a3783dda58edcdd65a497718a66f +658a3c0dc104bc44b36a4372794702baadb0f7cb1594598414d5eaf0369405e8 +9726efdc14ce04bfea94bb1935c4d07587400eaa1d565714a33891f3e64c1d25 +fa527eea2ef14dad353c11733d6b0189dbf7c910601528d5bae1f98c01c6a347 +47b9c484e09e03e10e13b5be1d22ab7b8906c5e41a0b2ebacbf640e187468ce8 +af86b096de62d206bbc54492431b8728c55249aa887c01a82219e62e17b62eac +82a7e09b484eca291295f575593607af6373ad85c692e7130a4b652ae5a706f1 +2457875d6098e477354eb52010424e6ecb1b69447261fd1b1f93e72de04e3f31 +7dd7313d7bcd5afcfff4e0f02f7e2dafe2f476810450fa2cf4daae1f85150f6b +df4e5e7ca6533523dbe78054c7bdf73b04c4b562fc75fd6f6e2f9285410fb08c +7bade37df9910ded1d21f0543b24ccf0c1c984a4d7811b8dab97ea56a14e9028 +999c9f71c8ee8fbcf78da616194678da5311ad63acafee762fc268fc2bf79881 +60f1a3a61ec3467956f15085c1808c8187ac5c5cc91b9165bbd978dd45d2c100 +de3fd8533581beb1864ad04e7dd74a016dd77520d2739a1d3e9524c8498bdf6a +d7e9e0571c5108c7c7870dd240ca2a53e30353d7bf39bf075d3839681c1f8eb4 +b289720980a1d3ee6c5bc7349bfc37345b1ad0d770bb12819d72834cbe2670a2 +7129cb9f51973694153d80309e5a4f6f3a0476025074c15b091989d0976b5e15 +858a83818105b144f5097087f3219bcb26b446b033510a955c891a501983b25a +d72cbfe682ad3b64c90853163504c4d2872a88ff8db26c3a62ac564d49eaae00 +c7f92cba1712464281b4100725792f62d16981ec1b1ca7a7c82ae9687c326ee6 +36ff55fd3211461deaaff7dff6bc94b248ea50f86a39d5edc51572afecb891d4 +c893dfd74fa47ebbacfb0d4490b5a8c012db8a6aa5f4531250869150c1c25fd9 +2769ee82670d8ea963329d3119005d280dfae888d29494533edb026fe0f11018 +3bf246ec4bd9f5c0de7dd158895ff40b7c2fe9f8cc537d23771cddd1bfdc171b +72d58e2fe9de17cee61af288318932a6137f976d3804e2fbfcfdbf66bc31f435 +ee1e0dacc8599ef22ec48010d4c79707118da59588bd89557142af786ca66ed0 +a5a2bd6424d137c2352a0fe3ffca8db62656d143093f205c18e8dc761448fec5 +510fd026493991ee9ce12f4b2cecdc157f3bb6bf46509abbdabeaf66703a6a2e +616d5d15f1145ef8654f810b2e30158cc883f04d31798672421afe80979630da +fa9c444aa6e4b242c28df13c80d8799b8916c9dad6eeeca41ca24cbe3741de73 +193674f95269bfb2f832513d434c34704365a3aa76d3f6fae51b8d75f4460df2 +95b64bf0668fe311f78177bb0f560dab089ab5a6fd11ee9bd6faac3e6c5ee08f +79c94b34fe82b1a2561000fde54d3b8fc1fbc7d82392690b2216982e8d9b09cd +1151a8aae36231d9606f2d737dbf282f4f685698e48698815664d0a4eac63dea +f0d58ea4edc1ef27ee2f4995e0231c246aaa5e212bad9a4f133f1752140cd8bd +7e203b235b3f54a74a8c2d8a4106ce38d558d3e9061c34cbbcb5d133820cd5ec +fc7ad5c83bb1b22781bf049a9381bd3743c6ff79bf98a25fbd361dfb8a7facc1 +708d075739668598c9d0b597a9417849de1e8169df8ba2f2dc6fd57d7d07ed4c +bf6f64734a56795c6480216208026a24e0272e871a44752e850892e9fe72b22c +15d83271bc1613cccdf6616838668fa293c564f8dbfabfea0305b7497286fde3 +411e00adaf00fe89f1625c57ac1121927000bf28cf712e55b2a717a4f5d2db33 +c2921df3f6449bfea10d566ffc096450e78807f7611e281693e30463d32b2135 +4d94b8a6d32f158f1053513eea31213d73dedbd3db635e0497bf3ff4876049d2 +922e0bf8a8da35e25d19b6b0ce73eb7da1402b73627e90ba89877bfc16f3166c +5a458aca38c58e7c652926c6547d018e109c4fc5c9961aefb4607e48b0c89cc5 +b373ad46dacdea10a1d503a7496ada54d41c342c36dfeee1dbbe8e7fc3664460 +6860622ae1c90d5045e3a6eba40df23d4eb867693a5c3d25ea2e1c31d8d9e630 +b22140e1078d577df6cc81b92bebafd700562ed45772247a7edd7fb4b99db8df +6aa8ab82b059d995474744b7a7bc637a449cd4175d19116cd1e122beda56868b +f904ab38fe601ee18ac0d56afaca712d10c09763cd21df0b222405160cba40f7 +a1828fae4db2edd32a8e2c5c173434348271dce53562d1c7f96264023f4e54da +63035f84596d3a2a028b4692ef98b3362258c59996c07b04e83b66d7e5ce103d +2352d8404e32c8408a5b05cf150f151484d3cd493f2429ca170b555d7d2be9da +96212b3b60936fa14a71b72359b03bc93d72f9018aab793ea640582b24109e63 +5bae72061eb66bdc9f28a9c6ba27caf470e05e41dee81b43ef660d5baea7463b +d36c47bf900b78f8053cdc842fa4c642c5e313fefa82c1aed58038df06201027 +79450a5b69923a4057d090544c8b343d45be71ecb3564b5ae59e18685679c804 +3ca2680a60ffb8dea818085870c75b54014fb031764e95b666d6ed70b3711b9a +012479e72d988d5cd8f8a95c3d923b9ea9717eb15c47885c7cc5ce411d4adbf0 +8cd49e76553efefb04888f85f17e6000c0d1c3a875b54ff0aa1a85bf1ca4dedf +d0adf53da875eefa66319d47b8b7af2e641dafe9466a8a1ee3f81458359780f8 +4037e4c647a86cc2630a6cb49675ffc1dc97667a589df4e77e3cc5c41215c16d +43691a68f62e779eb70af689ba7770ce5c2f6e060b35c7289e3fe5369ea79179 +8bc466d7c415a0c68fdccdf5af35776cfc5074a92a8f131b5c2423cdd13315ad +a0e4969330ca8b505c0d86efcd3cadb7f5c77c2666dd9e89b9b03023e1db13b6 +34d442bcf0e3df94c239e06e9519c70632788c64bc9f4c0d92be238be009cd8f +c8765e62d5702bd31435c9eaf5f2a04d3e2cff1406337338821096da07740689 +68e4918bd0e5e26d0404e4a8b0169ab68b2980d2eb8a5c1ce0a8c751f5db447a +b0cb1f731aa4c912ed0e07c3fee570ccc6653b649e6ce447bf2fa355ac39f692 +b54d744d5a6c1c03249e03b298301941d89bf065a2b30a0c3aa993ad18eed0b9 +cd70955aa7aff8003711178da2eadac58cefc9c1e0e4fe7ec10ced8be8e1b40e +56effc97fcd8c1e68230a111da8d36806ff8c9bac32c879fc461c4cce809c49a +5c489b352f86456032a19b6bed07c13089bf948d32831f2ed25c587a477f21b8 +ff3bc437460438312fad6141cac9311bf29dd9f221b7a0cf442b48ef64c810db +82a097530a129f2e087cc45cb96d8e7a9b3e761d3f3ff61f8f84ae47d6a2407c +c653914a9c1dd0139f299c84f5f964e6266edfeeacabc4f5fb89b9189b119ce5 +7c8ba8709b3f3b73e9e152de57d9be8c3a339ee8ca40c1bedff6008c158d777a +611b1f2a7e8ab0b52d211d7a8998f6cf2e59d5b6ed0f0ba65985353d2734f025 +11d235720b0860e35cb63b65657f2c002fa54d6ba8054cd94cb450559bf18ff8 +41f886d991d1298cec09ab4bff98440cbc4977521f74c2c1024eb76c6c827b20 +64af83474d982ef71b5b4d10ff5e99f69943d9ac4cad444fe5aef239e51d0bd9 +2bf89b9aa0462413961b459b1d7fe25672cfba44da5d787590db7cf6f41bf8ff +f568147f252935fe642f45be670a1f5ae82a53d6e850e6a0d7a37efe8b6c3384 +7df10e6dad855b05d8cc56db3d5b457cb44ba2061ed18bcd714b6ae4cfeab6c1 +f44a983d3b09fdbdbcf49ab4d4328aa83bf6d35136cbfbd7d9efb9387bb43859 +82761e4dd9a2e8af77f8f975b08f158dcec98b861a7da0da7b72c54fc7f32ded +961d8a402150fa9936415195a5d45da466d90bcf96269b77a549c615291b4aa1 +9387d40c6fc1befd017e98de8f8353e8eedd53e13f858f5b428d8d481d43b23a +34cc07b024e84e56ba46df541baf7ae5444de3aa77a387d27d5149ba0d83a910 +44f1f3692324fb3a7cc2adb22d5063e5bda1979b7cf64e264da24a21c636699f +57b75385698366c7a44d025c4d96735ea99cc446bb20371b234bbe531aa36e4e +2d2aadb8e6282fbee95b8b4b71f90f2d7d6d38c9030428b0ff301c8e6620375c +13828b08801a6099924f114fd3fb26afdba9100caa7796f312e5b98b9057a932 +e5789fd8f710032d29b526c9df47af7023d4acaf512e4b7f4f2d13827e235821 +3c4a8e0224939013a38fc7d73fd599b1a7f2fc9e314118864621981243462328 +61e1c62f8ce1d4ce8473d8dff76600b670e7649fbf8422d09dd79b80526a6284 +e74b3d04f1ffcb2a31bca539a25b64754f893b9ad03d965b5fdab567cd967320 +8a1511b9442f896f0d5d5094649b6296279549ad3699f348796aed2316194404 +e0ddb0d0f89682de1648f4675c2d8db63b68cc653d390fe2333ea0829eedd9c1 +b6f6a945aeb5ae4d7973756eb8297231c9ce5213446345bc133ce5b1470c6b79 +063c8877442e16dbda8de7c5365a9c8a91a8c9c99767d15acbcc2b82e54c8784 +7c93f7a51f91c2dbaf550130ad4dad6896d9c1d905aa7746d7af81b7f22e4e9b +18db615cf7e7bc813159f5b125fea93787fa42db2b4602432c487bfb49f29d3a +71ce1ffd9c30206b294f8281f58fbd27218317587316c308ff6f719cc347dca6 +49536a86205c1273edfda12610b212f375b91a841657a3e9b9a359d398edaa43 +f21041a76f2b2249e0f07925a996b24d56bf902cd2e6a2ea2b21c1840c0c1a2f +85c98789b1438292bc27dca7dfe417258144d267c15b53532e49023d620b4471 +da5f47f99ba092cda984a7b9bd308b65fb0dda4c92cb84fca3e5086df0100ff0 +7a031a99e1b432fdecbdb2136e29faac53425c65cadb7ec198da5cb63f6e652e +c84866add1b4f754c639ed962928edbfeef1325fb2bd80f8624ebc1465fcd609 +0931ffbedbef0aab40593c54a51d44ad7491e07d443ee0ca86167233de12657a +34a84d7a96e9b73698356f5b7010eedfd0190287810dfe3bf4b75dd58e98ce98 +d10b180f754b686e8ab4c621e4684b34680d062bb6e93c5676f9637d72520771 +82e1f2d39e889b03785b28928291fb0997a2a859c7e732b27cd15ad1b70fd13f +9200246496651f4d5580c0372a946a6a272c7eae3b071afca478e5f23e95f950 +f58ac0bdf7dc5e4ef0616bfd8e2b51fd5d2ff5ac5a816c4f79efa4a4435ff54a +bc65250ec3ba0671ec26fd1179edcbf4198b5dc25434170efae9f03b5e6da69c +f9d7c08f7aecfb5da7e493708e51339a7ede11d3de96e97300f97b550f84fc78 +175fa0d6ec79c2b29cabba67356f91f43bbc1bb659dac336d54a39eacb36038e +29f8c412a4b8ba0272c2e0bda184577d41e3e257194925643c04ced8484e7f3a +899b12a5d50b058f62578cffb5fdd06eaeb05def00d246c2a7233629efe00e24 +1d5a9e8bdb053c506cf1ed8d8305d4ad7bc7575d84fa8cd1c135a6e69ac8da9d +09b0115a6110c6df36f7bd530e6f01beb2730acffa423c64537f419bfc76e56d +099a956ee260ec7848be76d4ee19d16eed24b8f0a3d8ce3df142125dd863d00d +8ec3a0b843378fb2c3ea865cae64914acc78f8951503547690233b4541f3f07f +a38bfb69c3747cec408346d846d9a94b5e259b51833e258f78b8d56562190a80 +1e649a8ba76fcb180b6c93925e26d258c7c407262739e0252e1c41f4404d4e85 +458d6c0c821b6b5f099628edd92ed5e49ec2e72c3429ab2f3e5745d42d2e2d5a +8f110fad66cdc39fa4a5cbf520130e2bdc9cae5b182e4d06d4e14caa48f035ea +f9661ce17cc29d4c91c57d757ee5586400ee768b901c4fa51ce00bcfcfcfc5ce +1b2c8a7dc2eaa4e4acce7692f00ee06e6f9ecc8be980cbedeeefa1de4571dbf0 +2ce7bd33eda192d31d31befeb2af77c43795fcc79b8d8f6cb0c693d3aa6cf49e +0f3925aaa9f1173ef04f03d98e712334039fdbdc37308ffce34b411448bdca7d +cbc32d6da5087c881d55e98f66f4679955b7a93c02f6b2960052319bb62c4063 +865b82366471478fd4f07b44d6443e308f8b2296068e4a32301cffa189a2a287 +74ee405234755f042addeee91b058edc49d37f438bb8693b5c8ec0dc84719b27 +c578b0586ee86290d38c1122da90e89102be47e53ac93f3be3fa55132dda885f +4bccd87bdc334c32bdeb08933d4a5e6d85fd678f3858cf91f2338207c490c475 +7ce9d56960d5043b8c6b373bee6c0e173e6b3af58578fe6b36679793f07aaf5b +388c7727d8e04a6f0076eaf9095a3ac2ca87eed2bd7a5c35fb9ef360158b0f64 +48ff114f281f2e8844d0ac1eaf0d3436c5310e6ae25b11e3740cd03ec49fdaab +a40732a5bbc101b84d70449cb1c8880b0723e07bb2ef63bcc66b95aaaa03ad7e +c163bb5e98ba3452d5373fc320fb774b13861b72624b46f92178c2d6212fb3e9 +abb7827037747261fbc93521cf1ba38a47a44efdbd6223a0f3f929309cd4e160 +83588b4ac6a9b874aea87a69a8081c5b6fc2f2f70a6b5a086493b644e5ab1d01 +31041fbd60c970f675b13a311e48b86425a83f68087dfe05a6aa22d6238e3e76 +d31d029915bd11d27dfaab5a3ae95e04ca156d2a600166616ebed20132690873 +8fd58eb219a91830624f6c1556436d82ceba3293b1c742f29fc5896fce7d9e54 +e1fa81bbe5b0ab391b73172c7ce9b1bee7b0784cf4495bc6fcb755092a5f2327 +c164e6d783be38ce46375f27afff4ed0878f8eb46634b8f0d84df58a54226d5e +e4d25edb042bf51bde2ab6c83852c628bc95fb10ffb4cba46678b30f7b108ff9 +3adffe98f6adc255bf4b0d323dbf68fd559caaa55166dfc4f1987508ec46d6c6 +f1db251152af4b9366b559382a3741e8fb0383eea8deeb6b4ee9ac5c9cdad65f +5996ed7dcc672c41852e9891d25ff257dd49989ed6eda6b3e5f762c930fe6d39 +75b412254c0279ddcd9fc664b9cfebbf06c884986340fdc76c8e4eb560300943 +3d2d96a10f09e80ae7b2eb1f74d82bcc9e16fd11617663768f5f51dc464355ce +f33d0c912abc567c2d327b0bf95aac49f503927236814663541abb7c689365ce +75587190537231e16c0d049332d3ce07562cea63b3dc191d68e86824b43887da +4dbeec79ea7b0089f9bf2e61248ad3d27bb881b704b827e303c21cab98d23447 +dc20818fe8a249bdc03d772aa548f6c75925c74287ca9100e91ac1693d029f7d +73027e8ae734e354f2828f18a8e87b13d803fa68e6d7c4a79333b21d177c61cc +6097ca7ccbf700a75ca3b340472daacac6e39be45dd201f4517b22fc0acfd06e +8920c858542ded1c95590a1b5814103c700c13ac904e7ca36aaea572110080e4 +0057ad118b690e48cb8545bd2eb99b06003c1387354fe3947eb5fbe0244e9350 +e7fa6e8da13b62b862b22fe5a28fb5f933d0d97d0e54d2ea8811762ad02488f6 +163c146a53f8ee78478ffab1b9e123872ee7f50e7f8b124765f3bad9c43b588e +27c75b8e7ac979e20edfdd2cf68b506baade781facd7c00fe6c967d84c2a8758 +3a44c786038aaac152a10f82d5fcad2fb609f62c24fad60bbe5e8e0d3c3396f6 +3b00be25467570f5595f6dc9e53bd5a437fb7388acef7cfcbc22689149c386e0 +97f429be6c7ba8d70d8548e796192921b764deed94f5d4de9365d3535901aa91 +6081b7b548c3b7555f8936e343eeb062a2596b3065ed42f1489fe03ed0441236 +eda3796353e768a256f7eb8f6f9c05d9f8449bbe0a1d7e99519b7e119ca452ef +46600b666c010d1f9a2eb21a66cff233852e8fcd21cd475423d32a5ed8f1df40 +e18b1290ffce0fb278066132598133f094b52988a9e3ceff74297f4bd6f8b8dd +cc069cc7ef14ba3033ac19413afb7676de9a07a2ba70df9c96bd135564e7ffdd +6ef470d939c5164eebd1d3824401c6e75b1b5695fbff0ecf5056142cc8afe527 +e260e93ce22b5e0098fb54ca8cb1ccb24ba0c4c8ed9ebc172dbb1b5755d34b29 +d175b739f71d3befbd43edd58f0b3b560466348628aeb205a6db30a05da09ed0 +a2a99eb5126257cd30c90758af231106871da538b340e7d6ce24fb0c43397f2c +9dbc10f18c1839cc15c0e331deec3fceb468a9c6f60c233df45b0c53840dc659 +6a776c43976449b2cbe76e0939f060263cd00b837d21c32e1dd78d1b974fce3b +e8df3ade9b4be5ee8c02bf10fc08f0148177e4b50bf6f1c98589092d8d9c52f8 +2ed71c6009abfefb3a2976e40e700a02b2d5ea69f59dc6598d46ff6b7e3050b2 +983a3e12acc618b4a2d369151b49cb89ca2bd0b150d6faa0ac681c932a7fef1b +e77349f948e67596893acf953df11844fa2b074fcc8ef0b37e5d43a9282f3f82 +92436c0508cadf1b59b4e03f778dec524fd6465467ebe7b064ab2ec7f1e24a7d +20ae5843b6919e1f4bd0215d91ab1ef346fd97fc9e4871ba30f83b06cdfd5180 +79d2926690101525f2361a54983ca427b4a7937b550aa9d3fa3409f6d4087cc3 +3507a7dcc6b5769a8023cc0b790e149494e0b4a62474fcf199f0522d0c0edfd2 +68a3b5b86d600177616323dec75753f4462239d88eb6c44827119de33665e57a +a7a1f133819dab77d51b264df8b9028651050598ee266a645cf34719989a059b +5493aa548ac308eb673f9c5edd38fac3997c4f7249f28883d763a6dbe8faaa9f +ba42981773763490fd6ea356aabc5178f8e97387390910b3310bf74d879a02df +15ce08929c489e7ab1b7fd5dba4b31f4d10a4d5d860b354549b948179339d08f +09459bf54e119824e5a856cd287ee1066a69f78e0846fef677dcbe223357861c +80e5b7f08bff3a08b1d3c18e0fbf66b43adbd1a91e0d609d92636ddc654afd83 +d490b7909b780c130d5ce89818169700a3ea8de81df1ace8a8443b4c365531e6 +ff35353f0923afa95c1c3fd19cdf0b9327ca8708ef9c891c5d5c96ea695d9047 +0ef9b222757d150824fe741bc0f9afa6ff11a882da853c1ef45a7f6936fbb2f6 +6efd8fcb33650ded480ee0d3857581fee0623dcd0207e6e708b19b0b93822994 +0151e373c3d60366d6a1b61f42ad9dafb751e557a7d4488ab09acda685610bdb +4122e2ae576196f50c38a26a757b2b6e6ebb332a62b98c801fb67bc10a97df07 +f5b6ee43ba7a1c4583439a69b90f160a46f3cd05ee9d58774ccb8f11f8a1bf9f +736579cf2d3b1ecde9546d86aac7e5a9602bc9cf2cb68dd3264a6b12f5d185bd +10d2cff08d2ee240c3b2d4ae0d5f93e2dac55b8d3adf1166473119c3ea90cc51 +bb7f28012b48a63ee7acab3e774f043a008666af6d0efe9460c40ad82ff85ab3 +cbc09e4cd5867a52e25b1a72e678ae7cc06f6d8f913ac783749f30dee5feb866 +5ee18012b1c596918a5869a2eca7539063f16bbc2631f4ea99f041fc64b0be69 +82d3761638d1dea2ef828388c0629e3d953ba41816bb171d65e4b99cdb003281 +cd6c9b350577d2a922144402e90d8b2ede231304f055f7db115536c6fccda5ca +a5f182bfbcb454c4d45dc9754d04a0e881fd03fed5383d8b30e8397fcef19169 +df94e71ba1689f4cf42e60fed255e8f49ab1c90a7148ac377807e088bf4a9110 +afb3a02181f44a7caa8fdc61d2fd78fc18883ef6bf006126737d5889dcba8e99 +7223053cf17a110798b1a1c5f319317ae63f9a6ad23eb6d47d61b34c596e37b9 +c1e107ba5eee08c98af96261458d758b9077c3874a4b7ad2cf2bf1d3a8f7abd2 +9533934e5f6adab0b87b68d953fb98e219f956ceb8f172f03286cb84384e9288 +6166b2b49da6e5696f042bb6006d942e34589984e970c2641b97fa88bc536d40 +5155f236de881c851a52ab869969a377433cafade08178b1d1133891e9df4b21 +f8348e0bba155ed17ed3c26fbbc282aa8c3f27192e1cba91e2c461dfb5a52977 +71874292019b743cbdbf11dd1a6bd6b7c1695f774a34f37748d49aa32b5ecf5a +8a1a30e329e2ea9eef8f90bfffa68641bd11d749f5ba343cfdb0181a92ac9702 +97725b3968c8cd20a0af360e9b740bcec8644e4e1bab4cd7a3dd1876f09b6af7 +a90fa670a465949784201096eea610fcf2d5c15f57d39642bf0d3b246da6fcf7 +d01da8ce59b4d349ee76e8ae72fe26a170b2b320eb5d0a7d816488e248cc016c +d9f4af759126fed20f54f6176b44203b3f1c248d9cc0e3c6ce05aeeb2d127183 +e1f89aad8ab25e5660ae88852b0465f2bf00f234aeff78a82abf21b3bd807172 +94760e71a0472d14f9d3445c24b38d72df442b8f78640c55412f21d6b42f7645 +277caed0dd19ffd5941e1a325aad194512d13e144259ae01fea735580c28c4c1 +48ce5ee289d8bc05bbe1323019076da77187d90a35fcc1d0b52e921ebef447c3 +fd0e445d5fc62c809df85bc141fe677098b65d78c29d9f279cab0e7b452d4490 +e93e6c3ce30c84ce73e2c419c91a304d0e265df004b549f73f69995347e3a654 +7e6a0ad2862de39e182bc4e880bf717643165a90b094ab19207369bd92fc3cab +e1b71c496698044f2f1d2d30248eb0de57281ada534155d6991921fc3442c8e9 +0c77c1b1811bb3ab2bf9045afa0ef9f74f8577e48580eb9840354602b222e9a6 +cc9dc2c70f7c7e7ff18687a420c3f2a46680007c14d75fb701e5b8981f4e4175 +fc81d4286920db1080ad6c8d066ed15881d710952e5bc28c444448aad1df885a +634ee6bc8ddb52470854ad55958e179f05e61f8151a6fc6311bba2419dd9a122 +93d6e5cf69411520f281b8ea2908ad8f4d774e777a633a8e9aafab363f426b65 +cd8889d109f0c0ef516da05063d1d3256250eed899d6ecbb587c7b2ea943127b +f76453e581002ac170d6764cf3ef98ca600f07c75e2d124e3faff95fb28e23b2 +3969ed2b48b2be9b9c388660cbef5dd96ca0249dd307bd2044a5acc598aa0bc5 +73a97be07ccf5b6bec78d99b0e97238e550e4c56da12ec2657b6dcc9d9687795 +8411cf3d159f8796f6e9b8ee98daef301c4cd44bdf9da4c6aa6e50ff517dbfc9 +7be31ee0955a1440fe1cf27b6a708022104a9131d6ad031f87143394c7d21655 +2a540ddd9eb2cc438c06c9e38caa404ae87726a1edd9aaefa7e6b269cc543224 +35319eb5556497653b293197f1a5fee96c0c8fd7cefab51a34022eb008dad5ef +e010fbea98e316dce7b94a9a766c121907be64f3759dee51413669aa882b454d +51fb13a4b428d61b3506c20d551a6e96c1b538d6f10098abdc6fb8dd739cfe69 +512dce4336bd31eb5a626457ff6c1495200056c716a10c4c8e6cbf24e5a89a91 +a78d31db4b1dd71d65bb978edae1b0821bd3ba879a646c4e41ace1fb44d08e61 +1a9d945397ac69d01e8eb8e75fd60ca662ae1649346031ac32c3cfb352d84419 +52190ff0f58283bbd1bf4cda15bbd219f22e738d2c0a114e3d50f66f9fa5214a +34dffca2cf6c88883b0e416196e49e45a513994ce8f1abe93591c2b6d67a151c +820f1c7f4ec6a0531d2d13056f35c2c625044abce5111e3f625c09fa566c52c3 +615e8f83b28506f21ec2a9f0d93fbcccd3a2362ca0612bb8ca2123300786581f +88f1632c5aa76dcaac69c8f0140b45bb46871caa9ff1c221dcebca18e506ea12 +c8ca217029dce549a4d34a58c3a5333e90286ce87919665657acec87d268c255 +36837e5b6cb6d46367faa2951dfdab709b2d2932f44561f73545c82e85599f5a +8cd72bad593341e0de99b41b34f3e5f8c1ae749cc7e551f465da293ba7af4973 +35bf4d08a68e7abb0bff04ce36b4571b4212e6b98539da495ed516f0438baf8a +ce13dcb57eeb473bec625cb3c5bc70ae22067e6f9a8b0f4b4fd231110aaf84c4 +a48559e8303e7016c0d02125d73c690abb75c178855eb2cfe2ededb11e76b06e +6942a101a031fc5b110576389fbade6619ab0e05e20b8d750af2241619ff8224 +fd1396f44683f3735c0b83f93da04d435aabba9073a7985040bbc0ce5094ab39 +7579d5bf618b518ca8b1c4f9a8856c711aec8ca0609d7d338fc6edeb27fbb400 +db045314795a74317812652d0c1ffb1fcf453d5d769df6b38831c3914aa0d5b9 +ad41e0b7b9da3074043926028a84d1b09f52b619703814911710cd915e3ba310 +d17cd6d1e5bd4b7a9e7e3fa2f9d0dd50f88b50c895f3c7cea1077242cae145b6 +b6311f96996d437e369ee8e46d6680affb65c151541ce5e2eab2c851b693cf8f +2b304d62d428fee0c99841d4518fe2f67ffd0a26934bc70b2d970e0dcc13892f +d3b725ef5a946c273da4714ad1b2f4f54f1c257511770cb2bd0c010c3c8b03f6 +3190f52f50bb4db5aa56eacbc174e40452fec845b974920633f2185bb09beb6f +f7f1be65ec2fef9d10313e6830db245c9c976784acd842f22c9a12d51fa47759 +d9c0db2858e0ac424e923a48e89eb55b4d8ec738caf394d3b4761a1370fa496b +6d318f951299eccfd3de0b94ac27a952911e165ef590fd2729cc2cd86e0362ff +f5b51dac1c08519ea8fd5cabcc45d1672f3f04d1e463acf0bf4125434e72cc76 +e900f78a48609069187cc80acb13d0f177b56280d468737cdfc77501bd9b4036 +fb146ec5319f7a3d828d5523ea007c9cd545ca043bc48f174f72bdbbc984b40f +f6d51401d414fea2bb1ed31761cd919dd49199c0e0d0f1ed1f00e8c3b59659ed +55a1bcbc97ad9195e1104af67d4ca355c0c37ee8fb6ed7be5f5ff6a68cc2ddec +49cbbb71871262c4a1a7cfaa39aa6c86002050d91f7cc507715fd6b2d3777d2a +3b9074928121dca38c6934019d4fb8401c4c2484dd0c0145950067025edaac4c +67a0d18a77005bf9c9f953e9e55344f449278cd75a65a3b79071f4c3f0431c82 +f9fc739fc4f3e54611bfb7fca635a02492dadaccd7c85d8a4465aeb5285620be +fc6180d39c44795748f3fa23b9de86a548feb40bd8658b4adaf79ba705edbe4d +1e5c36ec57d22a9c8d64bbc765b504658c167ca8829e60526239ca6af7624781 +2c3d3b0d06f4a51cc6d8c8edb841bc0a5ed2f1ac4b9fe64e09fa32417817304e +bc2ab036447956eaf189ec62f0e415f7020da9264ce26c5dbadb6dab9166fdcf +56e1e323947513da6e14e111996db6f92e93c429cc62d4744f9ea96cc7c55cc8 +f1859730327991842fcc7c2f2fc74895ec3974ae60a1b3345edd7929761b6338 +5450c2927d83993844e156ecf5266e8bc5613bae81fda0a628954e111db74915 +285e808bb8a4660c098b60f251ce38512910d17628131476de7f1ac985ae1fbc +a382688cad091dde470d6407a0967cdcd26328fa9a28952ba14fc49af8a908ef +82cd09ef940c6f66076bf67250e40b19a1e9e4f164246f6d1324c702a59c143f +53a829d967d83e905f49fa3a64a2b72689d35213f3ac78f80ae21fa415f2440c +4bcaceb6ba89836679103b22bc93a425606d83c43fef202e4d6f20530da1ce81 +2963064da571136d79edefe79ee876a4e01fd64a5466315ecb61832fddcff2c0 +73e6aaed9940bd8d28eb78f75a04dca7235f8794074ccb5b2b8e5099124b91c2 +047aeeb70e8fc5dc8bec6e18376fb7d5546edc7bf20671931dac014c6fdcdb35 +43d15211873ee65f793aeb3291f3e88a603367f5beaa7ee59e862f54add1a819 +1c4b38065adcf525170842879e91529f35bc5f7f78e58f17f870dde83938c149 +b9d15b3e8996fbc2429993e05683a4c7e64f7bbd5a7efc2c9ddee24ba3f329cb +0a7b32180e73cc1eb891104bc8b0a294816011bee7039c6fcec289e625c725c1 +546ac9b505162aa68156bfbf40720498408809e5312b4fcb1505e42effe3d3a5 +04d792517c2b85388280567a1554181855fa60e250dd91af20b44bc17931fc52 +a88f9a9eb5b8c1823ae73f4a7bffcdbef86288b38efb87dcd76ba02bacbc8349 +3613b0938cd5e98c4f3966339748854ee61bc5592ec209de1759a50663bb3360 +831bbcbe02f72cd061ad784137e2480fe026a9c1130a5a557062d72808530bd4 +0b470f97a025ec3b2789b6274ef44b92f5d7a7f138683cc6dfe03e0cd78f9df6 +5fc8eb68eec6f8528ae8a469cf0521062ab95a4c7997f38969541cdfecc7f89e +3263cd46c25cf6b7cc64fd20e741017b89d0298e2c55e9b582e6afcdfa1edc1d +fc65f458a91007254db8a33c38db16db0fb35352d54d9c88d602caca571af64c +b0ce3b21689d64fa4561dd65be69b6e8fb81d3b2e32f7aba81353cb0f583f90e +57df42cfe601d5c05df071b49d4bc7a45df5ca2eb8a1b547d8767a1c0263b93b +e41caa3561b425093e8c8a44034d9553d96fd11e72be93b81b975533b30530f6 +fb7c44a81fc33028d1474d6d04ea1e8863403a4f27da27dbdb37f2af7eaba079 +ac68f395e8237597cd822fed413d10e4bc700e8e3409729b51ec700b17732149 +742fc60c9f5b26b11aaf47d3e80d4c671e5bc0511f8bd6e7dbd28790e622a32d +15e9cfb4739f4c6d67c8dbee302232a3fc9cda721102dcdda24447202601daf9 +f6c374b9b5d687d06c0755df942e51d5522b896292211705cae907523b9e872a +04f49baf43d89c3a4a37cddba1d3f20301666f7bc970b72f5cba25029bcbda99 +9afcb5df7a9fca9e11239902bb4b2e4609fc6fed679f9324c16216e4fdce2f3a +50057b1e73344eb5a8b739788b30d3c4e3ed6336c95c84a2237525c33e59dcd8 +4a08ca60d031829e9bdf9a3ab6dfc6f8bec79e40cac1e69ff6d5d2ccc9c65a38 +bddcc8526320d847d7c6543f29f6f50959efaff66812939136bb69233f36d376 +c01c368e7fc20fe2afd1192229305000ab8c2068d8d2158878144b545c2ae572 +20700483bce6259efaf2cef4706059847bd721da53a0f842011e6ccf8c2c3ff8 +97a477bf6dc659a256cc73f4f3b02f541bffd23439b12520e45e1f731e06af12 +0c93c3b21993d1cfee5ca71eb495e705a830eaab201d4ed332d65661cd38e493 +039f250a3ddaf8c3a88231fb9a92c72e02d50159faeb9aea556c89017a8703f4 +f2bfc73d0a40182597a260cfb29c7cc946780548fa1fbf28d35a93a2393a0793 +1c789d864ef906249c1d36ee78a62512e29a9a3f970f7a1be3e7e566206d07b5 +15135f143706e0b713591524dd318f1b10210cda652d5a6cd43e4e4a1bb0e855 +26157e515df835a962e7fbebc7f51a74d5224d20b5e0472ffb65913d8da5900b +31d90ca409446da57450fafdda1b5975d898b4ad2cd43b9d0660aa81417d2847 +d4d0cf0c9d73ec645e61f16b80e1506a2d2ab8f87a1ae7617d7fe8e5caba611e +ba028b2036b33721f78dd420557254b02c071c99fe068be1430a1fc3a29ac15e +37097bfd6ba1d7f095e98874ba909a6a58a419f82545c65aa70f5f2418fea14b +1dc7efcb3144c4cf060e6bcf0bb68c3830e09d069e83f830e6e4cabda75e9cb8 +cdbe388b0a7c23f7e62a4990c705ef96fa6d95ecfd38b2575b0be70d0872509d +d66bf4e2951121cae49c0b21a13685782a2a83a1ec70bc987bb9a0fa8f41b273 +e071a94a9fa55c8cfce83d1c7d9b0549c6227b8f8c0ed03760f5ca091c29a663 +749627d4038021a7c90bedadb4fa40b8548126986369e04f62c1b9c31624ff89 +debef79c9ca9b8ee82c6db65d8a67fd9c6fb4463e956a1d7120a5bf735902327 +6cd611fae157909073a41db7f5586666efea0c0ee7216a8a5699102ecc251f18 +f26c6630cf5273bfc9c1a27e6abc5156231d8879c0d1d767f6c86e7bb09829fb +6b1434eef852c1c72751010e25f689adadc0e0ec47fb9e4515ee95bb75a77271 +0b13290ca72e10d1ee9ee35e9aecc6f32c83f2b2eb30aaf52d6948bbadef1b58 +7092fede63953a88925df565bbe37456e085bc3c22c2b340d07106ad7b699614 +f7e74dcf82bbba467ee87152378a4ffb6192fedbb103b9abe1d6af8e0b84143f +f2da81b8bd16f4b9c110602129530d051a23df6d993e5f0251429a9dd8bac65e +e13e0ad97335e389f3bfff17b562ed1526ed4ba8f1e52450de53dd275acfd050 +dfb13f167c1f18ca022c2b6a74cf496999b02ffc072a6aa998e386cb1418dbbd +c30ab9ee4cd0ee2f0b4eb816f7cfff1916d0cc8cf278cc8a1ff0501f48a46b6e +8dea7d7242efa272bc744d96dd89c2814c27417ab2d6ed7b765c02d8b9a1403e +3ec34f94e6c198994da83a17ebfaff5e310140b44f9496caffedb1640d85d8b5 +d3e2b2b5ce786f6d910da398db88738498eda315c4c84acd1e3534f6612b1c41 +a27fef1368c001a24ec8b5ee18a9e0d84c6d79671cc362b0c89217158b930cbc +c852b3ba003143a4a945aafa7d9c060c911722bf05018898840e8f72f459ed72 +13d17972624f593de7d4574a1a9c7e2590cf1d17c5e284021472e4c16fe656ff +e0cca210ea8ef7a64190c489ecc098c09ce5d0fc6700ab2b4ff0d6dab59f37aa +8962226106bcb7a416c48170e107f5bea3fc9fe680ad4a7858be6f1184bf8521 +4eb16a7549cabdd7fc6dc23c62f3164728dfbadeb65487fd0b979d3ddadfae17 +06cc49f9e781de915ff8d88ae280986549fd6e8e228940aff26e1263879af4d7 +228c6b84de15ce2b2a5ea3d3771bf8e95c04afa2e922582f3b7b4aae3bf322ff +30a6464cf8c3dbb95a21a4f724c4e59d581a01bd6be1ec8948f82365125cc16f +3caaecb92d36829d781ecb3b6cc69c70b28912a75010ef84402c6245a9013d0f +7f24bce18f8d73b5c2ac9e9d91337bdde61801fde21bc848876817d2cdbd500b +f745bdff95fe3e4e3751b157a590e88ca7cc089ef91d55757792019742bb9cf9 +000b47a1f0d14a1fbb71b8875f7069f246ce622727e771363475a132909f2723 +9d4782bf2bcb24db445a975d7b84c0c0668b0dd8dd990583788bfb5f6a4c853c +32bfe6ca6718801b712e3eadccbb086a9245fe255413893f64a6a4083586f476 +c66112c90d7f9572e2ad81853e8157af2bdeb4d0945c02c046a1f0309ca2c93c +fae5dde45a34e2d6e27f28af0a606c854eea86bc0ffdf96c77df1b89b39dcb75 +a49c09b7047689abe355ea5c2db4f5ec9c67451a4a3b7b92ba4a202b96b1f314 +ba8935ee7497f1d4375fe761841bbed442591f8154a5e9a62cc7091d594688f8 +70f11412ae503e594e26b3a55d6ec4f24b4c3697343f22ef816bd8fe8d13acc2 +c7544368358b2dc55ec9312ec58c536793ad6488e7a410427ea80bee493881e5 +273efb06078b999d66884513052db33f5304aa8a5e35f2881c3d7a3400fb6302 +9997a24ae45d0a092bc78d0d005da85969615da06213333c212cc42f4ac43902 +750caf338f4cb0c590c4d5fbc21d676c5b5c39e1cf9139ac9b66272abf97f0c5 +863f4a4be9c213b2b1bd67aa45b917d919ff99748ac72fa997a52d5b5958b38c +40b3b89322dacb31b2ff49b98c2c6a5bcc5d2e26ecd69659bdb88ffa1e226a74 +d4810d6f0a7602d79992067908c058016b9d0d71c6dbf7bd1d13a2cf2280b7d1 +c5e53ae86e6480fe7fb57efc26de2df4cfb7afbf0a0f6fa6060f0b2a3d1c64c3 +cb9367e1f54d49cb808c1adcfbef9b278095cbbd2d3720f5ded47187106ae1bf +becc86c6676c98a95eda58cad196e2da2bfbb8f11681ba95207df27dda96d8d4 +9943d4554ab623396c271b4a087a3693cae43f944a00bedc65e2c724cc3eef22 +0289695379b2bbfc594837e20963dfd0cf5dca06d8b2452be1fb37fdec2229bc +e6928948e26596437978defafaf1020386c1523f047ac699802cd674359b35fe +9bb4dcd3e2b60b54c70a28a5bb780baeb2a12c5e333fa7315b38eda4d03af438 +ed35fecb6f50f5cdd3b9fc770fb3bd6e3564b49737dfb730fce448a1ab008366 +2ed9113051be9589966ec890c750df83b89f07e95a8d34b9970503336941c35a +fe2f09432285cedc586d70ce35ef5b6b678c2f20b5011e92d285421272c052e5 +4bac78ffdbfa89d1407572c8595e274244973fc29f3c1e3a85fb63ac3ee099c1 +5cae84c945970fbe4f8513055d5803139b8207687d2aaf9eae9f87f459422bce +6fa9ac1b6b7cf09b8529b93b31abdd91a44278ee39faf29974f34ee4d787ecd0 +e689b5076c9113e4242c5e62c01a847825e402376465ba14d12477a241779bbe +659eea57ef267d35ca3c88d34326028bd24747ac2cb6fd04e556a99f0bc44d8c +35137b165465764bc92c9ccb13f77462fdae83fb68a2b36d70719346f56e79ce +5271fb10bddd68982938c5a4be1601b16b32af11586fac8299a76d37ed286643 +18c06a87721cbfa8c5507b6b40458afd111e0945077f145cbbd2137ceeeac951 +5295ee98c1747f3209f8ce643017911a30a0d184889104fbfb01f9f1062af6e4 +b05b489302bfb2c8ce55839f7d6186b081e9ace3799cb323894e9d9bb59aaa91 +a7d78afca8aa91952fa5cdd1c76f602c95c31d5f83470c62e4fd90fc59f72b92 +2fb22b1f4414753875674e00ec274551d88a5a15341a2f98ab8bd6555edac3fe +c5415609051a1c0174e69929fb164223b6cc9171758da0a676a5a95986229dd7 +bbc4f2e3685bad35de0cfe6e42dbc304bd763d8f1fb6557de226e00ce34b6f26 +2f7e621342a34409b3390c4b81c50d1de3ca485e1c56a61d6d13127be952cbb4 +617a079b3137af9e35bf8a65634b212199e232775d98f937d6a8bdf4c8aa233d +5e598dacab2e87363acf2748ca7670fedb4c7f5ce9dd007a0b786e4619a82cfd +350ba74410e49e93a15f1046b34c2014022ea2a44c31ca910e7105138c60a289 +a1327aef09a7e4dcd4b63ac29038cf2c57c5440a355446fbae9c90686493f055 +81a1fe20b5a1d9c657ed6c3a0ce0d363c86c5d9bf5a608e148d2e512b9234aad +295ee956dff7ba58bbb2e2b62bf4d86099c6daceed8859c8f666f758e5533dc9 +63a98e679be18626d5cd0e04f2d92922fd0b1657c57bdd39e85adf80019953f7 +bb5f5c4b7d7b3df072a764e6f1e41ad3ad10d23386ab594cfd17d330c9341e39 +e67ff6cfecd3d7e2d4ba48ffac38572b61bef1f6ee7d631967a357b6299159b9 +a20dfdd3aa5b2b7edb1e686fc8081106912a5524b234b740a627741751ccc556 +ddd0424f5491a7a9101cbb197b99e3e9833790f8a7e65b4086e3f6014f0aa6d1 +424e405a5f75a55bc7d55374fcb4c1f50153f6c3bbae87b0f3af8261bc42f7e2 +48ae94a660db17d3db51527264501e8a5ffd8ce7582c71a0c220573a86181d12 +7346b4c7218a87f9578fba642b365d57cda7aa59a770f402f0c8ee2334360193 +1d519df5ac2e9cba36be0cad1a3817ece63b75eec256d0678799ad0a56f3b56c +db021b6e8431f840e1a2aa9c898c5ee73cec569a8110878612c459e0356d51e5 +8d132726b2c4ca26209156b91950bd344628d7e6aeb7628ae4154ec8cd1cd6e8 +f77d9ae90930427d682fdf44239c52f43d93a5649ab1a94c8691622057946600 +23767f3b2ac73390eda83db23e6d1f0a3b58f09f7d82221d6ef5835a15644a5f +6359a98de0acf1b8c06ec0de6d3c91804bb86280e11a982f4f238651e1d42335 +eac6301249802389fd8b45c30056fc29add3c4ec7cb007097799549267a45495 +9b83099d6409ef78d725cff9e13a0d5b13b59cf4f6d6a3b2402a1f80c1e35c19 +c448bc004cdc88cb76867b97b0156b0988a152eecf47b30d473f731df755c8cd +8693cc86e9f0a1a0dd9dcfbbbc724f521dc300ac50bcd78e181113dcfeb74710 +a70d6e6c9920256d613c6b28b46ab08f82b5af67a4f216ccb31d3cda24d91782 +0e7f45b0a135c50e03fc75e622819aa54c02339474366c07129a5c42f4d8f2a0 +e23a38c34d47cddb09a417f2fb90923cbc508655de01235df27c7eb511aa56c2 +4fcd572512586843ac6a80816816e6dc852a36223bef2299c6a478155776e16b +90031f71d6b7ae2b7227c5d8bbe57d1af693ccdb8ff883730cade61fde996bc0 +6566259af76a91b9b123665686d660ad9de6b292c5bc47eea9d2ea19a2adb49a +7a1cb138d99e4473cf1a2c52579ddd41c04d302a9214c5ad7ac412be4794fef4 +15a5e11eeb5a84ec3a2e68811820e084a0256dd625e6f6a61241f8904bfefae0 +899891ffcc05cb11519da935e3b9e692ff22927da8c03efccd2aa9311e014ca7 +548db11e8e8c8c6aa5aa6507c70ffaf846a571e76fe421661dbd503141431262 +fd436c79108d8c7ca8c5eec44fd9eebf54181beed85aeff4e1b6ef6a9769e2f4 +ae97060298f4c7fede54865740cda6cbaf52ceb0c963e935fc894318b997add1 +977b0229fd0eb7d13ddabe457b7aa8a2d05b2b99421e01b4d775cdbcc820b1a8 +3ff39d8a7c4d6e4d96125ae2ad688f997e5f221b6ecc4134ce16f9613881f4d9 +049e171462845117cff0bb70669a62570e7361c5efb8aa5b6b858d8aed27c149 +70155e3406acdc035b1b9d1e49664a75c8d52b2e8777fe77aaa8ced567bbc904 +a44305a7b550 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/UTI_____.pfa b/ogclient/lib/fonts/UTI_____.pfa new file mode 100644 index 0000000..de07ce5 --- /dev/null +++ b/ogclient/lib/fonts/UTI_____.pfa @@ -0,0 +1,1165 @@ +%!PS-AdobeFont-1.0: Utopia-Italic 001.001 +%%CreationDate: Wed Oct 2 18:58:18 1991 +%%VMusage: 34122 41014 +%% Utopia is a registered trademark of Adobe Systems Incorporated. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def +/FullName (Utopia Italic) readonly def +/FamilyName (Utopia) readonly def +/Weight (Regular) readonly def +/ItalicAngle -13 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Utopia-Italic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 36549 def +/FontBBox{-166 -250 1205 890}readonly def +currentdict end +currentfile eexec +a9994c496574b9cb23f8cbcd64a4a16861c70f0f2da82f0c7b06ceacd6521bb0 +cc26f1cf47836cbab75757d7a81793f43e56cc8f22f926da04d715ab6ff2e257 +5a135dabbaaa58f31f548cbe8a76c69e2402589b9e5e46e757f06bf2eddbbe6e +e48a624cbe1c4840a338e90f7efbe9f2194aee1c869bc4cd76e2f1937d78e207 +d8149c05b50ef0bb361f5905977c40be7d4dad07b54e087896acda5aa70ab803 +9dfc55a73134c7f1c9be9028d3ec6ccb0fbb8fda52bba4d7551a8124e68481d0 +775ed7f8ec68d8073bfdd3b67f72ec68634ffc57727e16b9aba841546ae54d99 +b60e227682315510edda09bd6ead4d1652f449d737592c44bb178689a3840169 +53d899636686efc6f838b19f966be5f833f5e7d41af38a899df96fdce1ebc116 +9b0ec87c930d9fdcbab7e74880e9693a24de9c67dbb0dd75b3dbd113b079c490 +60018433ccc06ac1df33fc090c4642fd5225fa0a188c131974ca8820319704dd +14b1719b958779d1475d92e712322eb2e6a79d652c4e3f5833aca3091675fef3 +fde103446e565428267b009d87bb7d6bc40f46b498b19bf1223aba33079e41ba +a9561254a9df97a48d71015b6a24cf952539f664f172d565f39a55e063154d80 +a960cd56c34011fe26e8849c6677427b2c7e728cd16272363d76661b3ab8bb2c +85c20b747519a4431421d4c83783feb896c45688ff7f824381cff5654a1bfc68 +6f4894e1d265455fc00064d08c37dc3a47b59a5b2d14dd893a2b871492b07c4a +591695c8df012ef46a750d6cb7fd86696e7ead280648bd737e9ea490140f3b1b +1dffab2ff8e085a8b1c78e4b9ae9cee277a29233cec5ab2588d1cdaf4bbb6512 +e1b1476c68fd3db18ecc2536968ebebf4333c2c3709ca354f21fffc38c3858c0 +561378a701158ed0201a3b236ca9cb7f7528d1e5e07a9bfab04f8d0fa3d12405 +5ba2fa9dff76f41b980bfb36e8db1300f7172c902dcb9f5f0bba3cb9c212bf31 +76cb802ddebe556f4610021fa3700d476a2be2a66ae6c658fd0a95bc1b9629ad +03fe4e775ffdfa9f87a274fd904c0db5beae258f9af213f257db2be0265b964a +681fc4d2855f5356fc87576d847db274fed9ca5bb4961ffcf53f28b673f50e31 +c3c634604e70fd0895af711c9fa302572eede069f65502f68884a90d9f1ed7f1 +cdd95fc73ca6ae925cce4e01e49934539739f082f0ff1398deafda84c3d9b1e0 +cafdefe5bf321670bfa286078bc066bb1895b1a3f0253abc079b753c8f020fae +ceb70acca52c4fd011825ba3ab32ce9c7ec263b4828d979b57588c48de210085 +e56eeb002dcecc967c95f219728511ccc6c51817125e1afdd3e4a9b35c8e5551 +06a026900808425393fa10ea4b6f4513f0af047d326d80462d36c2c7d033125c +ab05bd0d3058b69f11a1d16f23345b3c97e444ffcfb4b3496743d9f6abca53e1 +b702a359cedda4d78e1a771989290f86ceee70502c574d6582a64045acbc33ed +436871e9beaaefb12174806003037e8616b5f12ff470cc6e08b0af6789b9614e +6ce98441b72e79b0c613e4a01835cb4d61c9cdecde9a66184af5876f0c6bea8d +8280472a4c6a2f38fa95b7c475ce75f8acd6850e8e82dcbbbb96e7b389612cfb +082c280fc4babf5da29e26f1f163d5ce353c9eb61122a10634ca3224261089f5 +e999b1d591d92216afe16a409f7735043885cd0218b4bb7289fb4547fdca93a1 +30280807d3c5fe5abf6d6ce88af04beb42ee031be89efad865f05daadc0ec4f7 +871c1a8d78e51a453a8c4b0ea780268639009c2ed6741fef8c598248ea9a2c5d +f3ab0401a05b0fc35f66bcd6c812087ac03be6cee22ff97df7152681279de3bc +be0a5c3574240a561f667c87a9fd065b788c9bf4e38dce8abc94f29acfef1933 +6568527336b48570be215a8ed6c54642ff28aa5edebe0228873c55a65430ff76 +8502e836e97ae8f2f6ac4dc5eee76beba71cb16389399a34535296a0175974a8 +c44918f7c668fcb07a72c0771fa8c49ab7d238611d8c2eb17a2a6f7bdce45b45 +2616dd51ec465225f83e886237b273488f4ec220d1837272df8a504273fdd95d +ad88d197a3a6e92519eef80d7c18b31df15b9530d96f9982c1f7f870a95272c1 +325b394ec41c9e7fd2f13ce4adda1cc0cca0ad9b068e4d1c92e17d1ebbd4e365 +f7f4a9c547a81470f3ea6386dae456937b302a2e6f9c4553a39ea280895ad232 +57b00bf0b1c9c38746dd5438067ea5ba365b1a4509a29bf938f3c028cd2d0dbe +441c1e881135b7abd353f1b14f225001812697df59ae92b11a92eb68b41a6e62 +637f097d4b079e266a81e6bc30a69d5741ebc518a6bab96ee0f79b9cdebb1d35 +04f88ac6a46db5e7be43a3c290399f00e2f78da44d348c66d7d12ce239b30dc0 +8f916c875e3e54cef7f5f1b966f606d8fa3e072d4a417b3cbd43bd3b644b2928 +626f29f4d369502b63ff43c7be25193bf11216db04ddc2f39faf825a559576be +427bdb147daa9d9dc8a9839daba32fbfbc8d9fe41bae9d7b15d8106ae01e2cf0 +d59c6f8c2cf498fe7518fa7b84f38c6f4be7cfcfd0e75908650f52a107ab7d7d +2bbb6361d5378232b80edb45dfc91750eadad74c9b42a19339d0227d83caaba1 +72a43d3e5c64129284a50ecbc669f29a4d4caf634369d069118fd7a3fe12bfdf +e202f3376727ae5f1a9340d824dd8b76a517da44eacd882063c8243e121769d2 +809ff04b1e23d34d9ce5f496c7f1926cf1b0930466df9076dcd5b82c97fe1b45 +d1579437aa0820561298a96e22c94befa09929f74c067706594eb37375c136e1 +a9491f80c7a0a0fd447f078898778428309ad92d89cae7f48727d8912deba5f0 +d7b49674111a6033b67c19bb92129b7127d4ce80bce642b1880628df772a87ee +5b48f395b55aee658c50ab2c81ab7de66eaa52382fadcc60957581a4e09ee989 +331ca245586217a7e6b0f746455c59552906d8a525f5ba5a07cc1df0c45b6ed0 +95230142ee05ec75e12531f65374f78173615c913532a330659b9beaa653eaed +c0895b65d1a44304e09765cc9e070f61820249b6236194d952103f17799b68e0 +8b447986aea15ecfb780f7717986537516a6ae928648b16a51895f33adc17310 +f0813e7c715368bce559bab6c2292b42198f7f28a2ef66661f70aaad4e5ff132 +07de7de9f1691d5d1235d1e77a71403c2ce61c8f8960c262ea5fdf4e93fe87e3 +b4d7a400080f90a71a8805257c24318563575bedff7ecf2ee53a6ca8a24f8ac6 +e26c70b028f87a1806e63784542067b3d9deb6c96122c644e4052624a9f5e2fd +c04d4c1d02d39b438097040027c0b7131dd5febaa0f09b767cce35c4e4447387 +567dc3887cbe792114a9a0bbcd01c3aeeb167b5ea4e08f2e04eeb67783669fc5 +16e91b1fd880efd3b1e9c1553a2900b5f1ef5f7b6ac7d3574456eb2fb6494511 +cdf324639998efce019716334e92407673b4ce1d19dd9ff89d301a7954e95b4b +11e33d64682ee3a8e215ecbb482532e9f0dfa9859b014711a1789d97b8aa0809 +a1338f2de4e58a9c3d727b6efb754806c2cb3698d01ffda6ff4baf277aa570d6 +524ddf0898a02c508bc6684ae45ced430993828c8193cdf0091b2dfd7d811424 +364490b8e607aa52cf695a4179703ca2ea9d0b595770729228f912fd9228360b +359e298a8845c00bb1fb2aca1abdfc1c570b044bcded5e35986c484f0c84cf37 +6fcccd6374804a3d380b48a6b50506b0f52c51dfa6d49c83c9a2a8bc366137cf +3840355310b16356606f84b5da7783d2f6d6f46284f63f1ca4bd7672e114eb49 +9a2d80bf132de70d992d326f70a272c64f6264b68aa7722e7a0e400eee21e634 +8fc2524eed6e4df4ae7da2667dca0cc4d79eb78dc7db496a7f54564931434aba +a06e085a1d1ecd916fca69e8cfbda338b6f873c90f3440ff8c442646dbf337dc +9631f88f60d4efe91d35df767fa8a0e3c1db3d0053cb419e78453c595d6cb05f +a4205d1b3334183c34b5bc80a898ed9ab1cc015c65189fd0efebe5aea9c71196 +ae040a0598a301c4aeeef4864e4789b1124dfe3f8e1aaf66a3a510705f6a21a0 +cf0de7e2f9a2b89179cdd4b009b33935b87765f3bab41ab667e39b74c3774edb +443c772d06d80f7248bb6366d64b1a408044b55f61f641793436d23b35fd55db +3a8f7d0e99953a6e74338c1d20083b579e534e887994c2080731ef4f9c6cba7d +5ed6975b583022715232c005033ffb24995ccdffcb1f8655de53044fc3a46950 +694b82f991cdacaef5879fbbbc1ba7de04cab076fdc76b7e75aeb177c61143f2 +4ea610269642f4b1c765063418ebdb6e0fd220f6005ce8223f956d6755b7d145 +e734a947ffebea2904bad11b0fe43beb9baaa38108e475ff79e8ac33bc9d7138 +3feb6e6e7083fed7a31f178ba5b930f47f4c197fe5217f9ae5b64c3ee13ce1ea +5db10538f5e54aff7b81aaeee741713bd60bffc2c8d3f7361ceacfdcca39882c +6b0e2217bfe1990908c1c79c59939a2344174f73d069d0bf1279aa30f722691d +faedace1bdbe056026c8c7970def57b68fb8fc30e7a86d461a2210998c103c6b +835238192c02ceb0144f2e035fc89f160fb9f14f3a6772b5dcf908244629ef82 +30fd14e830fec7280100b5eda94d83208463e7358028f83fe2605e7dedb85355 +50384276f3b72f5895a6bd4170abd2bf25d6a6d8c165b2ac5620a3417927744c +2a9798576343f472e6edd840b3082a22cc0efef8f53787167273e0cf926ebee7 +868803e55a266e761dc6ab8f7722efc301fa93ee781e081f4f58e6b6ebad140f +ab33411eca49b23928a425e4348cf705a1e0f4fdd320025f3c315cf0da1170fe +1a13ae53d45b712a3370f2e68051c1381311cd34da1096e7cc8d2c8e018bff87 +45621d8452fd40edaadb9e5d4f89d92b51f8ed170dbea911ecd14ac32be75dce +dac5e26c212d389c94cd67126b98cdfab76600fdd7f36fb51813987daa38bab0 +974d2ff8e114b529a87d187e5d6e782e8f4f5e01342a5d8c95131a799149e496 +9549a3cd70a85c5e69894ea8b544c3df17e4f25d704b96e1ab28aa76babe5b74 +e39b799c88ba47826dd52f55d7840a32481524a5067c247389bd392e80318ae6 +cca790fbfd0d7c6ed9ed7523b80390e2a67d5e11d03cede53ca91580a4f90e83 +17fe325ce9f63b99ba9874c84cf44fd1b87d593bea28b5b674a643753758f9fd +27aa8213e088f885272f0cdb0792cf315ba0b03ede938756d26a025ce9f682fe +2c6cfd369314eecb40063f24f365edbeee61d41370bbec9b08665e43857ec274 +6516dc151c4fb114da529efafe44ba73a2675d1d19b1dd9e696c380379df7682 +42de54a93033c757441b7fdfa404678109b0034c4b4777ff05f4badda38c5b88 +d6c1ce1d281521ed0077f1bafd0426e63b522c3ef1eeeec9df67f3bae4bc48e5 +15ba02efc3be471c0ddb42372553ebcb4863d6625245dbb6c0eebb15efdf7e37 +27335a4e3ad99e4f70e57e218e749f30bf9c9a20f172c40f0532dd17d93eaff0 +911ffbee62309b59cc549faf8048f56afbd6936cf686514b16bca3113d17671e +15731aa12b2ea9c46f887180c3885878a4b59f965f15e1af4cfa20f1d9fd84bf +7d21d8488356d638867f2ce794c2d1b836bd471bd561daf63e1b427ea3e3c371 +1acd9f55e8fd1d53c279f5c93a2da8a8aa80857f1312d2e9e418ae4440a7c4ad +6216861f66844f4ff36f5ccf37e96f76706f8dcf7d2a8b6e76a8bdd30d66abe8 +6846fa3b8d5e8c9b516457aec4036b402bffd6913d24cce8714449de2ba50848 +6d3f3fcfc5f81e9f85c99e20cd7551f1f0b63a04b5d8d9734fbbcaf55b44897d +621b90bb0f3039ef877c04ea5d7c747cdbc9c25b98df15c1ae3946453ba2b8ea +733dddb19f5a1f3ddcbd8d0c6bfa2e4b914249156d26e0e0bf16a088a9eaa107 +60fcbf45dd8e9d8bd7a837c3e4f840e1d747ec1bd31a82172152819011c53c1c +7f2ddeecfa67ae102bcd5b12532bf43d6e1b515b27918c89c32d4df49c3afb6e +3b719f37cf1cc9bd04c45129bde8b221f88e10cef81a75e890543f0a65afb387 +7df9dffbbc8a0bf424628a26a48448e17f180c4dca4c25daab5f4b5fecba8ec6 +24d80359767b2bb4dcc58163295031ff07ffe7b73bd22928f63c62c2e556c419 +c3aa968ba13b7bb559197339835490f2c15d7617578787ceb25e01cf3c7e031b +607a2397a682db4b4ae408247d00136abd2e631c85653f45c833948b48aac4b9 +ce421dfc528d49cfe98ad6f5bf332ea672288b85520b13efdd67bd326a10e118 +6b9e7026afe8f70aa21888e25b6e28ceea8dbca35e168f23aeb233a18d291a34 +05cf105b4bb6966acf3a2ea3395cf406dc6271a358c3cf51ee3f63949e738c69 +3a2622ee7dd92ed867a3c279aa260499e75ce46503f33c62a85404c6715ee35b +861357f1e5ad91e1779f474165b3c61b3f5cadb6e38af59fec5eb9fb81773bf9 +83e923c4a9d7aac4c64a4490d575030e5d1d2c788de808e626968374fddb4977 +954430d7513b84f74d7c16755027fe46e5b9ec95cc3913dcc28f8963e90cb00e +ed7d1af4c8c05c52f4f799aa42dff81ce677d750aeed905ddce7ed886f1e7ca7 +ad587245d7c74f4b9272860b36a76701b184705e7e0225ab64ccdf3aa20f102c +82ba6d86254808c33fd7205f340622360844e19a937645702c923faa2dbd1218 +ee5a8eafe6e66913d3a895ba65dd825c7dc1b579b0b8f6d4bd47de45e5f922a8 +25b20041f7b8a1a55281f0fc44b149f0e346e0f3e1e8fdf5634eed22537df9eb +40d8c8bd63d844ba24798ca2060786679aaaf1753f2350f12c3a984628362db7 +f4df3e4ff03f14be6ca123bf8d4bf43817df72c92dcbd6234c0fee3b8bae81b8 +5d7495a6acdff5033bbc102016c267ba56013a739c9ac62dfe9fdafe427d22a7 +1fa02c29744c713dce48b9e52be12797084cc12dc805dda41fd60578a10a9f2f +0a51b5efa3feb126888d0430649e858dcb9c59a17872602334edce0a92336f99 +250406dedea2e1b1d3f8031b2eca7ae2e96973b852c90b59878faf06286e8dba +f7b1ff75a5454235035d1d68158585cb5f08aa68b4c5971ff0499f0a3f491d41 +8e2ed07b0cdfba8001740ae437674704ab6378f650d84b6b562bf346d5b3a338 +e21fbe69d330a12d69703a6625fc77e4eeed50c3eed7db53553e1183258cb374 +25c209961144262d9145735df60c1e3cee6c21ea9667d328aa6424dc1d0d4c31 +bdfb91c001b3b9c30e6343bc3e6af5148ef219e48e9c49e2d9f8818b86e13ec1 +ef1ba0e04c9a93b509972038925babe2964cc034d5947c9f8232fa9a40999fbc +b26adb0ad1a69e25c896c97307ff214ff08b76427f982d0eb9eedd8cf2126219 +9758b2b07735c086e9a6dd43b4094d320379b3ef0c20bb9fcb691a6fb40b9c25 +9612905890f8fbbe837b1edac168764ae7721a97d9e0ef67424d2fd6166951f8 +00097747f5db43cd16c8f0a5e2041366bbfec05cf950876f7e4462c4231f83f4 +3f14e61553b99ebfa7ad033f51ecf10ad964d71c18b90e360e208ee79f86b722 +d6f062498e4294ec0991b318d18270374de5212418f54a5a1700a19b23a31dc7 +b1c4bf77bb4c4fb26d219d87c7c0ac10a88f65bf5cbb122cc250035499ebd3be +7b839f311cb67349e68cacdefcaf9970b1e22a120ba90bdec02374a7fb96b232 +08619b8a9cb59e86fffb65f1f0cb64579de0cc5b4a1d428c0c4f4b46ce3ea0c0 +3a4c815b2d210e3ee18f1c5cef74ec07c3415f2dee72c7511cb479e78d3a0d96 +aa7f15360ae7455210f4528a18d74863516b1c688ce1e539306e260fcc203e9b +5af0c06c3c04fade53ed1009672d75ddbf3358396868c2225e9460590590a37a +d9b361c5872562a91042a635d8531a62088d1341f9519903f98e339a196c4e2c +8e6ed843cd24fdbeb101f09bc4516a7cfc4554320a9318f10448fb9d10c45939 +050a55114e979f4cd9473af6254311e3f50d619d9f304df427ad53ffddfad0c2 +f849b4ea37eaf66005afa5269d435d1b3362553043e98eb631d8b4e820e9571f +88ac251d767e3e92666f3c0aad0f5a5901dd5f0a72a44ca5f957b40bc29541ef +5c28f10e36b8102e5038c96ca8a7cac9698d6f8fcbb82bc413d364e3bedde064 +a77e2347719c840ee53489d836646e8fd4ac6019d00a045157bf223f32f0e68d +379965445dc50bb7b2c223f2aa12fffb8858197093319a10d3203038f4e16c04 +c62294d51a206da6ce0ba74e5b204656bc172c22cc2404f882e91ad157bf4dcb +dd619aeb837e0bf53c4328e57e5be92943a9dc6f2c5664255d7872c976386c42 +5235e3ee2671789c3c32b7d5e7fee0262a43cde4d3bb98d2aab133429ae002f3 +b71c2b3688d9297cef802a2330b12b1e03989fc8b9d1dbc91a7bdaba94703525 +4efd991952a2be03e1147e9b5ca770638a5778a7a141a705ae4ce474000033f9 +e1ba21d948c4b016162cfff6bca97a7f8f81cc2c22f8011b0cb74e4c7c92ac80 +c7c53ee9c0520d2c7a5dc97a78fe15cee47994362c65210336de52f9841b8d09 +4be1aaa04e39d7f66d0c4d01eaf270e26eb38e09c8b303816c34ffb8cfda9f41 +c03d95d95688a154c087930ede2dfa63ed8f228e3917dcc8722d1f8636305073 +31d43ea9b53230b0d0797013e7604b528215f1a128cdbb26b0cc3fa43e3fe25c +b57c9bf8f8e290586e27924cd20025c54d6d8792b4fa52450684c8d0e131aa49 +2ab0a4fec2d0f91f4b81d74153b5e2e9bcca216c1b49bcff347c57a727202068 +0e040eb5d5e2479209d7e085760a7604544f0e1b541bbc73431ebd722806cc24 +505dbef65e4ca3457d0587c4d4fccaf7f14c31b5cf62ae5f0c08661c9f5cb386 +ec057c82dedeedd54c8f380320831f2d6d9094a5d0075a0c5c203be292231353 +3aab44061f0c75483c8c90ddfe2de61eebaa5c23f3c1e14bead51e741963e5c9 +393e8c906adce443244f5fd6ad7ab164ee9a217e609fcf90e5b8157d27623d62 +a803207d9839752a19da399e82082ded26d15088bc3623923fe5d5bcdc2bec1c +639e190dcf9181e90ddd7a07c773e6a0511f1e268acf8d1a0d985abab4c95363 +c88093bb9f111cd66e7b7d8cd8eca3407fdd45d01d566944abbfb99bbcd5602b +dc8e250247dd7a37f4389e94c1342b5e6ccd99ac4d62595b91b15462dbad20b6 +5bf5fd83a8d8864cc9e75f018caba8d7feb8dbe58766dc0a06405ba89e39a6dc +a302161f88b641a7427aa926d438cff5b5e463309a6cd2abfea827a512d03128 +ec1f323c8a92929a4a6f63c798fe0b73fe59ebcbb1e4614c2d3ea0ce81cf5cc8 +8a6d82334df23cc978d9a97930cee6f567067f7c3877cd46b672d116805b1543 +4a019e47fea549f9942732bd1537c24fdc2f1b0780f7c9b3ef7e846906abd277 +82e21a4a8456cd0a880174efbec65e6eb267a94a9e0bb6bdb6c1c4998d7523ff +eca5ed22cd608abad4f8570d80ff8cb65bca81b09536ae22a0925ec620cfb875 +70ac3a8e19abf258af93113ffc08aa07f0ef6d751440d874b3631f8a4bbd7721 +9a796911b9dbc0b2e1fc5768d40cb8dbcd38ee9f970c35bbef52deec4582d18e +17a184203a891ef39fc8d56c29ed3b9010bf9092c8afc63f072c6ae93eeb9342 +6647475cb38c7a634dae53b14995468e4e39464ad9829b48c97e78c580ac32ae +b2f5631d37bda7f69936d4cfe342279eddc7ce5262969c87e74ec6c4728c82bb +eff94703031bb14d7743d97690d7a2ff863904ebcd94d1a2fd7270343f38355b +ad318250da6b388c644a9f62bf59482d7a7161f5d3b65ad5b41005bcced2c16b +c60f81fb3b013544a32c81c2f455f34cdc12e195fb29631b613d0db8fe3b4957 +a49b3e0382b3ca954a0c135e19cb83b7e29c7904b5852641bb08cee1bdba5a09 +f1f03521a866d99a6b5e670351b73cfb453263adf92a8677de8067ff52ee5a63 +e9ba822e8a11dcbbfa745caf433ef673fbd0e6c7d28f9d3260e2b2d75b888181 +3662efea0548a4f4c2ea1031376182e12b36987f2afbdf205af3229b7e87b20b +6b334fe8615d13b3c640d25b5c822a2270111d964e4cff01f36d2df200f41872 +29389c1482c576422c158fbf2405e3dc0d87d76237f6666e6e89c46b83289a9a +718686fe767577688e8524474e522ba5fe3f6222ae659a12855b295d408b7da0 +042c02087ffab03b422ba9b4bac8c39d08605624026e355fe62328d4df8c5d9a +63e3118bdd69a142412d43f20d23d990ccb50ef669a76a9fc3924a64fbd9bb39 +fda7015bd5b56d3402151be6c4240dd647138bce226f7ebb9b723b3b3e6b3b27 +4da0d1245dfe453bd9ea5fcd36eed1c09e800b20eb206e3f1782d70c67a82d88 +10451c2cdf052ef603a41d50b90dfa15a5e967c6ae7b505b1136fabc9898c004 +5c1043754b8bd712703233855db0895697dbfcec02ef25092d073f37f8f86fd5 +e647c80b0af65453bdd645f92209412ffdf14cb48b7daa02781bc981d89e075b +39c7e8251d2d384835691f495b3d5a43557f1dff58b935246c2c0b715b40d4b7 +ed7386bcdf5be2beecdbb223dbf57c9a06864f399d4748c11b89760579f1e420 +a4e8c67241a8348ef3bd04634b9e69d5dc5015f89b10f7580a008e5dd424ffed +60f14a39a759a0c05e4bc3b1e344feaf613be4e1007f5535a7850832760b84d7 +3391a60001d472449b3e4920f46186d0fb8c8a1b96165e2f463e39e289274985 +e4062504ce4ce8b24764d050c371e6545c3aaad645242e39876fa2d8c8fa931f +73d56e5206d47649cbeae14ef3187d43f6a3bf48bad527f6c01c8b1287edefa1 +1016690d1f50d310d463f9636d6f8514a60337fce30e6d72ddd2f381bf2bbecd +d416f7ad7338fd928296aeb8c58c33e08737974840b690f1e8d6c46928fddf4d +65c07eb4cde5f6b5dedab807a67ee995fdef7e7fcb285ea981e0877da1b8bc42 +fc201fe269c44a48be11a5ee8a365b50760c477e51005db9fde781c080f8ab14 +44181e4a0bc80741530370fc987e7eed25cd1b2de3bd5c53e0cffd67f24f9e2a +82fc866abac0d9e690a0075cb623a625ec6154da7bc0c36431f20fe0a8df2fe0 +50cdb6c3d767b5f640833e7ff56016665ab4d42f28853f5bc2726de5a7372ed4 +8666c51df290f796fb129d441bff05f661a123dad14e5b8bd3839f0de22e44ad +77cc296603290f731b23a695b45f5b930a8d6d3c6783466226fa0a20ff0ac7c9 +f63eea109a17da0ddf5e1356e23c37528776ebda66b0a5ab37b7aaac291eae01 +aadf7c555a4fb77722c0a527b5a711188e28944494ac58f58c6dab6df90971f9 +9ed636c4eba0dbcad659aafc776c3efff28a7d28da972a8bc5d8eeef3b7bdcbb +8de66ae1d2fa6ec3eb33c37e632118bbc8dda3bfa80da3b7a2770908fc4575ff +de9b1db2fa31637a13f8b97e73a55f7a975fc836eead6dad2453aa31d00447d5 +6350145197d430f8e6af1246a7d605e7df7a5ff4fb58e8241469481bf48b8436 +31acf36fd14a7de24d3a90d681246d5bd65d31dcb7795f2c9f6dd3f04ad330ab +37636fb9da5f27693b7613cb6268d36cbe13f628cbbd5257f2644b9be91b69f7 +2403f914beb707992fcc653b96fe7b23eacc1f46c325bf02427894a28ea28e74 +482a2585f57f4cca2a49fc473b73b2cc47ebe014e78f9dd868dd4c63923f660a +0d465c1053e7a6dd9138ddead25cdfe5f3a211d6f06e2c19453b405173a814a7 +5017f34fb8504208864db35ea2406c19d989e65e5417105ddd09fe62ddce224a +daffb81a19999b0459da464d3d10492b62c12d085f4381fb91b597f218b7fc1e +c0418a9292c6d2fb2cca2786b1b9a5cbd5edef092b5a3afa05d09e6e59a70f02 +1346ef208122d8c8f6bd2da33609aee5917f0c92fbc0941dff2cb3df9feef235 +4efa7155231d3403ce8211ca2786915280811d9dc9275456e491331899265c69 +8b3698810effb9e6e6fc2f5b1daa88e0740f8195cc8de64711be512f43128d28 +58f130156cc2bf774075a2b0bd3a0fec0729494003d58fdde93a2fddb529803c +76834d20a2f0654a56d1cb58ec344aeac5bb976c694fbb328a3cf9c355a5ccfa +3de62645b792d17c86e64a14465c5d29686a03037abb8eddebf2c55c94e4d984 +713982f983d942b390674695a46485ee6eac26cf864348762b018ce478fcf5e1 +c434b8a26187f6707c6963a933c1e7e5addb9dca4d5e9f5ea43a40c43d068b87 +f3d8bd0324f2d10f52d92da826ad20917b039076bafd236881654a5abbae112c +7fcb2bd027c96d69fa1224a8108d1b7caa4d4b03f813d461157a7b5956be1296 +d929e3e3e5249cded2fe79950e619b47b99cfcf0ce26e6c5135ef0d5a05662d9 +24d57e0be99056aea4094b3894b644585ecc7a6f016df96ce3fc1ae75635ec2a +2761bf9402fa697a76e326afb8d7ae5f7d375d260ce60143a38913a4e085381f +ae19ced0d207c80cfd0da23b999fa947408f31c00ed5046f48187ffa4a9dc8ee +1e410719a9e1fa29f15ab776e8013158bef0615e6960273646af89da0fa935c1 +8a7a1b67df2b0fd72b42cf02c5e916b0761e89550303ff45560bcb350b7e9ac8 +0422c68d1e34211212999f5a99800c7b103afdd7c8c5e32ce86d906031418297 +415ecd921c44e3d65759bfbecdc688167896374b5cd91a64cf08e3c224b9f22b +06d26bd1bb52679fb75e2489027a7cf868ce7fec588def5493f6570d2340a2d7 +61a6272402e9d29d02546929d02ec741a4f54c94a25ac1dc87b8f2087e4d9275 +32d6afc9597fa33166e593112001404b15e1691f002afaa8a4fe0fd803adaab4 +ba64ffbefea2acdb3059dd040b2305997fe7a6fd78db6e47e385af2cfa834af9 +3cff1bd3773d6b6d2f303ef4950825d6c3768532ba44a111af37f8b632cca18e +7325171953b66ec7ad79eff3b69219cb31201f5bdd8da70a8bac1df11ca37519 +5658f07151fdecba4c1e14c375de60affcee4998a0a377587f54271bedd8b226 +ab3c9b3638b4e1f4b633120aef8e4a2989e2925cc84c7281674e7089b71bcd8f +da8d1a26cc2181ba716d80be532578d6798584c364f9220f1725670c78007454 +0ece6487869cecd8e66f8adfefcf23cfc5fb8f1ce23a5e1e7159493a78742f05 +660bb55526f65f17eb255e84cf0a5c0b6b98f1d54d7fd00c1f8236c60c596f6c +28c7adc584b38671839b5847e37a7017f4f7857e31c3108cac29640fe9cc2ddc +9165273404769a556bd04c3bf5f9d76627603543947cf885de71f44c65760076 +a889b5b2d3511219936476ffd38e2d5e86fdeafaa17dd36436ea3dd6914e812f +b1d5d0333a7ebbcf6e908d334ec8dd335357546e241e6f3064251323b2fd746e +54d67d5e2d5b425cbdf89105b0c19ab4cea931a557f2d7d488009fa8685a1c78 +57f58bf6f62a8c71eae1b8944d78df9897dde68b628df2706d7aadbeb2d4a4b7 +561810d4f7e1988262f7460684575b38f13c4680c3dc254c7ad5bf5bf200950d +857556ee412c33b42820f740ad368a8392ad0605f16692e2c06b78ed542729e6 +d399a052823686f83e8c3f0e0befd2e7405c52e1d083c13e9283b50b4a834249 +6214238f65e52491566c183d5ff36711e6a99eb49f5518efdae0743467dcc32e +4d4c92ff8de5f8c649152d48106228117f5c160fc8bd2c69b1dd365337722742 +2c59cd0589bf70287b487799df5e698698f4ff13bf4618c63c2b0e000e57aad3 +dae45bdae9bbb459fd55584839dd185f48a75687a8192f3a63d2280648e9322b +02b9625144e67c6080f0eebb7c741968736caaafc151c4a9a1c1395f31b61ca9 +004eb39a789a9ffc247a249991106df6e1c52e40e4533f0fb6087a59080bf55b +f197ae35804870900129d9a941004273ca0065c42ecec8cb517609d01405ef3d +b500f09d410e230f680e12e5cd607cc0d1edc63e1845fd1bf3d9ba07e1b7a5c2 +eb0accd178e1c0178ef55eceba43a30599a0477fa4f8ca397b69ae64f6b6310d +9fdb875a00545daa9f0dfc0ff9fa355a9ad4b08d08ca7bece29a5d3a325c1463 +8f38dfe12ccd5c942a5aca6414a7b04c698c9adae4d8d43732e41dc0f04da349 +8bdf6b9f3a58296957d88f217d5c46f45c7c3a433ff9c355a5ccfa3de6553bae +ddc411e40b9f5e95cd6e9f62dae79353c5e1b874f6677bc593d2a2a07b1c3b20 +9596abb07ee8f71212674a53b3a604f5af5449dbcef830433acdcf845e44d879 +fc619fe992d5f6ea9b0cddfc24fe223e7a357cb0d5771cbd12bf50851f400b49 +9e55a3efcdae3b6d6cfb72ca9e96f9355234ea284bf70abc81d29bfc928dac80 +5eaca5ca15e3b8303bd3710a1eba32e3c13ef7641c7637afb5cef5dc59902e6b +aff4c7ce9fae89977d96691d306dfb9a54bd8b9cb8484ae4b50f7e2ae5ade3a2 +9076c21e036a78c3d78918c529b3eafbcffa7c842dc917f162fe68179bb45b4a +75ccb684f7c4b5a6d5db3cc876537e4b643e447dc64bb76d9e74a3d378517880 +9896262b00893cd7474bb605994df0ee028f4a703b4ac00ec95dc3ccb3342835 +418a5a158b4e6072a657a7e3d2728c0f64242be6fbcdf27d5093139fd7bc95d9 +89320f2ac958c06cec8fdcf56596bbb45b18abf2c6b5b891236063441ba7331d +613c0f1de49f50a839bceeee1f2ea065fa879f50918c6a3280bd7bbf1e366e27 +4d5e9e0a6bda5a8768f72b811252f40704a1190b5887bc5c586b1704ff1f7d4b +a8ea68ab335a506771a681f80dde3b8aa04ee1bd6cf881217b829942d0282c3b +e262314736557d8a43e8686f3280d4c9aeb9fd78262834ea5569a233d459abf4 +5e50d17d666d3e9caefe4f8d74710aaf2497a405d73fca9e107a922d0a9eea59 +6de7f71ef541a0a5b141f786dfdd1861f81651f540f82505b3fe83aa32067db1 +13812fa761a7f3b28342bf1ef531746b033232fbd06a12a0b80a9e23571fc1d2 +184a850fcceb331ff7076d3a03e8ed50991837925efc91e1ca33491b36cb1aff +2c1c58338fccc4a9f0e298e781afb718990cb9eb141c6ebbebc79e437b52a17b +0b4a8cfd0da2f9401ce9370a1ef04986793a67fea0fc96d8eb325cf73ae51c14 +c5030d9a8340b8b33986ccc325f93903c0928af3fb3766c8428fa690cda94c97 +939fd8df41abc0652e0ca8e82e048b133aba600278e3a227c4eaf8b557856ff9 +e6d2fb6671ba75b779e90f2bee7e349ec394ac76e16c73509b5e99d44fa10636 +ac63f8d546d5eba3c6bca7b738d4338134d2b79dd8436932d6ee22e2183a5c07 +a72f4742edfc2ed11145fcf8a9bb54313894709b28d214fffcc4b917e0c389b2 +590ef307e3ebbf0e42570de893328dcfe81e7edebf72b88ff1a557e2f038ef1f +8c25c68dd7c037226f7dbab36cf73ee00b92ba6efdbf9a9e0f4a7a91853394b2 +a02077209350a2b61d4771f338e739c5382c07e18386e398b2946ade4c3f0a44 +ff6f333d550ea7db004654aad32542571febf3c31271cc5d167976c6407c7570 +115bfb3f838701b58b320496c39c59553b33fdd7fcf135bf4d849b130fa58739 +6a983a93344bfd37afdb01b18232af9f65d5e3f5131bdc40063d7916a2b67ade +09e2fed7968e96c6ffdb6b41b0a7bb6b8e93c2ac4f1b466f16e219321c9ad83a +8027101b3d007ed0e43594efafac9dc0e4764477f6328ef0936444bbb4fd20e4 +2ae35cc3090ea9ea8ffc5a85236a4597f661568964f6a839650470f79eac69ab +e1794cc369c4183f66715746b9abff4c151ab6f06be72ae63f41f5f806b3fa05 +eee4f22990464b7e4950f5654b36b7e3158a7b4ecd4fc7d5600c831ea7521df8 +e61c5f5a3942eeb82e06477461ddbbbc9551ed095d78309f0dc9465f88e70fdd +7cf599e493318efbb07aef45a81f2d36111838a736b422891c562c933005dc2f +99a44557c978e4d9da41d3e2c3820e4a40fe28a8c268cb593960058f0fec18bd +c23102a74807835b1244daf8bb9a7553961977ea5a7d0e8a59f58b868c9daf82 +5c4cca4d84f4f37484b6bf8c1da54c5e089d3cb47377a99eba19e3e81a13d2f0 +59c22952aad0fa4f3a4d82478a06a1913b8f2dd141e776fdd43d76fc9d28fb93 +d198f84310f271baaae7e44752a4f8fd1ab089d3555f9d7083999bdedafca730 +50598a2b85541f071716d335c793b55b007392a1f757469aae1436de65d00f07 +66e196c47010731b77aa457876cb8994b97e20991af4e7b47bdf752f59c7e6c1 +27f3043e2b06dead3d6fd024aeb2413d1dc2ac897aec8c2a97c848d09b102982 +06f2dc08f0f0ea755c68a0aa8062521d34f16beaf87d359db9cc79faabc3d256 +3cae31022f3d4ae7dbda58194866a7a29dd34f17a4d9b7f7987e01a6db74bf0c +5e0c53bd07af310a2756f22c1cb9bf2a0e1a57aba6753d037887c4b65a661f70 +b2d10fad50c5ffd365d3778295d880f498ff4950257e5ce855161796989611b3 +e793c99f4e12e947b51643fa80b129c6664b283c100b5694d2d8bf60a3213157 +a17b72080842b4ee055d0860a801d930d63e5354f599854b5a142f11f6b78717 +8897d66f3f6a3ff20029ed1870d538076c1d4fa4ece214b0075ada5cbd5f4087 +8975b21a79d8a67be6d73f8777ba26c18ae3b8613387b25f43beda7a2c9f6692 +667015b80847d0759ccf2ef45aeb00a02d63f630dc6823d5f61e91b410fcbba3 +677470b440063d43bf734b16ab45a42b698037ca3cc5b460b563467d9b6f9453 +d31b47822f6fc7fa1604e77d00ab1f172bf8f4cd9bde3635703a4166293494b4 +37f032570a165604cf5b8b153da54077095196e55252dfccd90a8ebc09bb7f45 +ada3560fd014a844b2d9bae654a533733ca8ae359bd7537c60b52997e10ef2e6 +f9a2210dc484431af83a956af66f06646d918d2832ecd425ff9cd8e9268557c9 +efc84868728aff4d8174e6f85135c11a6968b13f7d8346334dba97a1a3f0990c +d1d2bac3aa8a5c294e4d0d67e893a609189383a24cd3bf86c22720d320d59a6b +5e543b799bb5d45fa9826b832a809026d104293f363200780278d973c9c63492 +8576754d19d28c0e4058684cd1a71a919e5814346bd40fc15eeca1591e0a709f +f083b86841f04cdf8aadaedd95f26fb807bd09886a011443d410466fc6bbc56f +95468646ababaf39887f25e485776892c89a6cb7bf5d20b6c4e8a0bd65c5de90 +7a988a3e2e39aa721dd03ca69608d59cc1e8a1d2ea706b0426622e4dc6c94013 +3f979e5d141f06fd2051a54d84fdd4c7170a44f81ac786d258f98893bb4559c6 +ac59332f599dbf644367e28fcf01da3e8f33b14f8f83052d9c0af2061465b059 +5a923f4567274cefb60341ba793ec77e5d8c7f96bb88b63591d8cbeda48642dd +c631a115cba7694f64506c787271a8c9cee064d9af1ab39cd121f7a1ff1c812c +903aed1a0d13791c051ae21ba92b5db47e72e7d6001fb31535a385202edd815a +40bcb9937ef719f7cd20e30fda23fd356476d22ed6c206f15cb2a78fdb45389b +6cfa3cc388cddb82886b8eedbd9447a48844921a51d4cb19921c3d42e58c0173 +5189ba388aa32ac9b75b5ab43e428b20957bf253a117efbdc6d9dc0931099af7 +eb10790dbb14844be86d80c5e1ae17d0fa0f73703f180effa98dc52c5a8a9740 +869fa97d0bce9fb59b36a960315cc1d7264f5fe730a397c6ee121021a3c82cf4 +bcd40e844b78f99ac28c27d9c4f4c90cfe0062736be1bd39d45592020daf0b9d +91efd616232a6aed299c9a01388e0460b46ec288d4e1cc5b08769ac88002094c +9b680abb4d3e0823b0832d0d60d08dd7e1a27531803b26f74966f6f4fa2f4117 +2048782c3e3ea7744dc52e7113d3e290d309881514fb40773b1ec9bd7932f7b7 +42c3a3dd44ad5207b89125d7a11aed1a249863a6e537c887b00161ffae6817d6 +269d93d4752375c48ad0a598d2486f1a173bc55562bc889eee0afac3a4b12fd5 +cc2a57080eb6e3880e1e2930fbbf7e6629c428a1025966b47ddba3d48874e8b4 +ac01d33158f31760d82a88ee60be24a62fb5ad9f24254e2198d968255d79e4df +206d37d52891300c669855a59e666dbb4676c4ec6fa988d6378ce4d00892c711 +3fec62c89dac139cc2b77a954f6fe953064c52a9345df309d8baabbeb1cb7910 +5aecc2f99b451c1b028a81d62927e2c932805d38cc8ab7aff70fc84f944d3fe5 +12694fe2dc46e548177bb78e4a51ad574c30f29145be59a24faadf91d34e9750 +1b1bba9cd1563e7e339e9d8795a3cf887053f1ee7062fe98bbc2257e8a6a964c +d8542df1129217515f38beee762ca45f9ac85c4497afc6b7200c540287d85c40 +7dd6cac0ae86a4d324d1b3fd2f249d3613772ab3362840a78ee8633b3f89b46e +b6749c008a46eca09c3ac738011772215d2e61e59e2b35b0d9bd012378c2e8f9 +7a58b7febc683901bf086f32282a9e539f2816acd16d5b5a0d7c26372e1b7ecd +d64464cbc518da0ab436329afd5f6e12d0ada7cb9bd84cd2b6eeadc4b966e2d1 +33dbfa0ebef84b45019f47c668325dd037f85dbca5fbcc54ef9aa710d998f3cc +df1e64c0809bcf0386de718201cb3c474fb5ce9cb8054ad3394bb6626f7eef64 +f60626142f6939666fcefbc920932d389770acb70180dae25a1e06fd6be4f45a +07e382d0c055447a99dd7e0952f24e89401a1c15a277d02dfb6d31f41ebcb754 +2f4f608640ef289ce4147dc1cab77ce02b1823a87bd46f0c00cefe0191d68573 +6af019569e89ab388d3d770af3f61546fe350adac3337713bbc091318cf92de1 +7b61ccda6e28c314cd2d6a27e758e48dd6038fb55c6841dcede725a1a30d5fda +87a37ce7461be94135e94dc72c976fc326a32194046979c351a53fb544d1ea5c +dc87382f3e020e019e03ab3ae26eaa4e64256cd32aa1eac38539d04ae425e1cd +e4548d0c352b680b4922b6b407856f1ebf6f3ea6ae68eb941d914d50642dbf74 +fa2a8df6b682e0d53f3b21ffa7225b105e359f49488183dc94cdaf1d7aa849d8 +88849fbd3bf680dd02198a557e768668eb2fbbfa23cf3af7bcd76940e1329b04 +bea1e1da8d71850e11eed811616410e2f7db0557aad2d531e1d3af851329a38e +96b192d5ab246fb72788f99e07d22f9bf6c35bd15036db0fe66364654ca2c34d +4aa14542eab8d979311725ae045f9af9790b26f13d0e447b3f58a8b817eaf26e +f9ac8938054c130583237c616a5f3be196c9252a0621cd35183ffa748b0c4e23 +869a58dc345282066b213b441823389934fea2e40aba453edbb936ef4695b6ca +5734f49bf4c21f0c66287df7cd723cd1d0e6d1ef02514a89a0360d6630f41781 +e06d5d12f793d64c257de894f58a074c06e4e18a5991b46af372e7c1065a9132 +f88a83fdb08a4a54b50d4218785e15b6a86d90b7ed621302558b510c0c205100 +44c2ff47efed6ff373b46f1b1188f96da0b38b0a9430e571d4dad21eae98dcd2 +8d36affac5ee640128374d182d451b3aed3f2e2080a1531a2723ef40b496ae2d +f0ba56582870fe7ddd397548d59042d981da2c5b15c2d3cf8ac934d91679067f +e601409c220b8a6647414d0b73afe5e96fd5106f9e5c9883132953083730f75e +2947bb0a0ad58d73cf0b0ff80481d2a152262e1b024df4ee74d22e9933f1f222 +f389b8367ec1d5200c70f7f48079fc559a6610e483fd55df95a8621c4e42774a +0e978ad53ca8466cdfc66e1eae6ea5df41dce8369b40c6aebe585f4e9b3b23eb +19139f371c9565ee85a2d8eec6e0c48ac857ee2660ce13eb5cb81616649953e5 +53e23fc2fcfbf98a83cf202cf6ec7f3816e9d70a4f86391e51327e047315f653 +906b49384b9c069fbdb27c84521aaaee74e53055897cdbd167a7b5d33b8feb24 +aff3e22b5d9da4966788ced11943e209ddd32f3085aa28f2b631e56693a390a1 +74b5cc902bd67a2c3959dcd84a08f8ff2dcfbfff5f75e2ef01c9fb619117fd97 +f8682a84f0e718362659df2d082fa8d9428010a76268380f525c4a3292cdaa9c +475554ed161cd2c43355af9350c3fbc654993a3f8901391308af9bbb1fce0813 +7592a1a4b271cd98d094d77ba038314ea68a4e64d68b0165bb593b873b24fe3b +8a59f22ea3714023825140e0658fb050e8c4e32d85e92cc0d2eeeeaff00c353c +c00483ad71627438a50b4dade6b0aa1caac73ce846581b858910486820ad2190 +33a9a108a502fa6ea60b8c85d1ec5c816a325dc802f213ba6bfcbfc65306d07c +3202f0d42fdbb7b62fc6eeace31837cc024965695c529e274ea638ea2a24847a +db9eabb31283bb13944309c17e3615256c7b95d8f99f86feddc2c7a566e4dc87 +bb060d88c661f589080fae039f4fa4b5b611caa6c65455dcd4bff9ff89b63f60 +5dbbdb21c07404e02688b7f92a8373ee1a6a891bf6c315b793a9fe81079c1ef2 +804238c72039924ea63039020363282f24f969f6a1aa10ef2d9e7cbcaf53c9cc +1f0925637190af45c7aa731e7dac0f091dd22e5ddab9a8dea87a0269d5343ef9 +f8297d133a037679c6834beb8741396754f2dc5a89a1621c13722289eded1880 +c9859ce2a9739d003bb874f747abe3ab28d79930680ca53ceba6db84aa3eb869 +0830eff19972d32f37eb6eab0723478f881127a84536374025a782a7cb24f90e +892bf7b8b9a44a237779c4cdbe5325d3e67cd11ff1a58b9d69ce962a659486ba +6649708daa2f7a0cb144f6b11161501464b7c7b20659f6e5ab21231aceb813fb +b30f9d6c6afd24d638ece5dac5259af8eeaa46abfc1d6f29383188b4ef4d8e08 +fc13a8cb07f61f55727619cde4f86944b879e23dda590ecc57f312c9d6d6fbc6 +8c875291b617f8040f4494323cb93e84f2100092b5a0527dbf02fe55175a1b8f +7b8b130de1ee8d39589b7489f2d087e6f865cb536b595c552534475f1bae5981 +807cfd89532d91a6316154dedc1b8fb3f8fa0270651107c5ab24ad8310303d98 +39b801b2f0158aca98833b79846369993bb4a3a715afb6eba5a2237652b17d60 +2dbc21281bbecab7df65812e9ba59b78f6e3f6248d5cbebfedde90149d823635 +0ad0a8cda735b701534eb682dd2261883e19355d6e31d980265351f1895cd212 +a8a006a6953dff2ff7ba40d5263b6547b6cd5a5317bd77c08364987424033bf5 +bd9dd20c0ba69bb3d25df2ef5fc06092981c2f57ac3d38b93976eced658544a7 +942cb27ef9cc649835863b2e14a4390fc3e5bc2c0be8fe2a67f1ecb3d4734636 +6b29b60d7261a743583915fba3c8f832c4c41bc1dff13178f2d61832fdd13853 +db2135b4d92b1628b80f3baca26481a48a9e0d0847e4c53427e5066816b474f1 +052fdbf71f550738c13f1c3ab27d1fa12a11194c145d90f61e4ef2a1fae0d25e +6974f191d3e1106c406ce4fba266c952faa505954f6ddf00068422eb0cd4baa5 +34b06c1805468d7fc0b88a491b48a393c55726d4941ea7d869b239a69565a892 +82e020721bc7ed828c88681584e0c49452fa8f2bb88914491074cf0ffcb5fdb3 +628b292a0f2fbb488e96767aeeb4b5b738ddd65d50e143aeb6e37fd6110e0dda +5e2120fbd267c00b1b90626ede7eb1fd37636e7f3b01ffc6f7216b396bc1a5a6 +04db15b065c9a030d08127a538f69779a5bd73a6d6f55d2da851afb9da60bbba +d782ffc339762792fbf66b2d139b11e76a28e8b483aa5d858ad779e905456574 +8c2f59a94010ed153e90a961b45a225cd9a131315d2691f6fcce8b321078deea +6582997e824705703029a8aecbfce61d427d476b559145f5ee40364c49ae13ee +bd940e7104a70a5501f5c0a632ca1902b75598d3ae606319d0ff4f0bdae32c70 +b1e4d5065157499c15fae5349fd68e77acedeb296cda2c912562546b9d1a966b +e7959a20045af835d9e7348b5b33614005f05fa26f45c3de3397e5ef9cf02036 +37b89a5085099eedcc025785eb5fc2130988a19570a1661772be2497d4c8ebdb +fde6619b3af0fb42f4d4c3516db21d44941a62f62f087ae3731735beab50f7c5 +27856884c3c4c01b83a40af32613638be95390c4c66f71672651df6bb4c4a0bc +a9533884c477f6ae268cf7c21fb12678c54e4b3fd8ef032d3e3c2d3651bd905c +562e643f42d81fbbdf819a28c81c9874100a65e70466226d90662ade31127e95 +c7f5052cf24df0a04d14d1d8a5d5d9b89d212272860db459e07731b3a6537c6a +83c352d2d1f09389fd4da36da0cc25a57f402976cf3a473ff27b6554faf254c2 +ec8e52fe59d346baf8b1fa0afb13289b6ab06c8d25afaf4f218ba88565cd3acd +f1fbe77f5209e6d5dc361c18d9152ea6a5267116769c987b89dece4fabec70de +3adbac8e5e7cffa82f4b7e2ac41696dfe89443c64d8fc50c5699117d094ce852 +c2d7dc91ca9f1e764bd117ea7cdcf98ecb87648e82c64d93f58daee619f531c3 +615ce9df8abd7a63b2957eaa3cdb10e48c379a96334f8510a1f04a7c433f3756 +81c565d30f7c7d9e05f4d6f249d203b286c45eaf851190ac74822c5a6caf4f04 +94520c329c09cc8e0f5ac803219b76c8be672d5eeb878eee0c1116ca9942b133 +0734efd931c8e5d54bf9f22d194475e14eb923a453c9b7f4ebba83c80b4d36e0 +617ba6de745ac02953a63a9d73bc2e07c52a6fb3182e001c021916ca4993647f +8be57505636b75e2013b781c2ee65591694009f1aecc0195349d48d780db2da2 +dc8c60410235e5c3c7b4542873c609f921a62953760759d81b718500fa45b09c +504f9cff973ce3e32a35b426c6f3fb2cbc366d980e133fee86f961dff6a21602 +d8e14529e91e10105afe9f88c9f65052db9b32cc2d88c7bbd1248d4448706d3a +defe4dd13ed573d1e8d31bfaa9fdec9fb1dd2ecba1ec8cffb0601523d86b8187 +e1a1526c20166314bb65cfc266d01bbd562c79f00c390ff40c42e424976ba541 +ee3860910e852c72b4c8de0cbc50679ea9434f4f21940480f148365bcb9f8889 +9c6e39c309a84f63a0b01896d4165395618198fc9ce773a874074a2667120e7f +3bd73ba915a657c161c04ed2ad2a25d81c286f5ef0e0fdf91f6c0a1da5da4d13 +56a4df2f14c4cc408165ad0fe1c60373909ce04828b2c333569b78f35c6594cf +11becc7df1fe0d9980cbfc9b083e6ff52fdc26cd74e64b22196586f4b21768d5 +2fa9107d541384b53737b872b0d7b0f931eb1525e118a45764bb1945fa8b91cd +944fbf3b63be737baad604e8e93d08521e00f8cc93052e4692f1de842505c39f +054d49d7bc49a836c724d887c0905d218fec71b710fb0a5fd2dd736354c6b43a +4bf4cca989e6deb360b45e8a353b712c2745da57934d5629923523686d471c60 +6e09b539c13f1c803dd11cdc41a41e8427a513e4808dd4f787114870b3bf8ece +f68fcdc6820e82b4d537534cb2a7c81f4e6878bd0cf435cf5845fb8402aeb47a +8be7f8658575e7fbcce387587b6563eac02d806aae5a83c185627d9e8857edea +2fa37ab90a1aa2cacdacdcca8a23a2be13b1016b2716ff29c2a660d49d4d2400 +dbd73edf65aa2981dd46641d15f2b5bfd40768309c570d5b5bad657915ae022f +7fd0805df33437b8ed5d961a0c65b33a6ac36a9ddbfe78169d4a6d2cfaa5672d +9354964e4c756a20b65f1550064e435dc5b0b8a53732a97ae91c337bbfba8e1e +87d2ce72b4577c8474a0ef36cd33a3dde20e650eba05a242065b8d1fe3c702df +ce2f7ed86080bf5e0efd27e162ebc4471770197c13ab838945cc2df10daee14d +901fe063ba909462ade61c130d7911c73be3d448f36455ed30c21bbc2527d0f2 +5bacfb066c0c45300752906845190fb3e76db5fa537fde62a1e7dea1af35898c +3edf2d9e6bc359439e38d363fbc37f89001e3dec0a7b6a4a7b112cd687e7c5e8 +4b0fa42d52b534b2d16ee3ac26b4dc3fec6272d1867a390ff9fe074d449b6cfc +93129a45a6624d91800c7e638c32c057c99673e7b57c5fa81e60e1b7a0604424 +458e1bdf2f7f77d1fd1275512e3f6d5411cfc20cb8571ef52c16adc6073a9542 +da94754c931e74704ac639fb69b227ec66d4446231bb566792321da24cc3510d +89b59bff3d647ef55be28555e93318d9eb888e32abfb2b0276ad9483ae8bd4b6 +5f2a3876c094f8e22056b9a26dbda1b09b0ce8cdfa085c8803151de9187d5c63 +406d87c00f3ce085b9bec794b99b2365504e7274aff81c5032db910e31c8f2f7 +c647a598171a4e8b19d05b5a77f1073ca0d5f58ebef2be11c6f390af9c835f90 +9b726589c9e75687dd9ba33beb8a42b5bb63076a5cd2cbfbbd43498934b67f6d +35556aaf2341c4d3121ace6338238cf67a76ad99ce7be30040484133b44d08f6 +e0d6acf93cbb3d7b3b860e620efafbb0c644fbf90228a339e9a5e99632238e99 +b1644b65c08859787d58988cb9b6b792aa43981c2eba7136fe17c9fa4a671864 +d39bc4ce208357e4e178a4c0ece034f01955199d38dad2b9e9f3c47ce7c652a1 +29476742bb9219514553a1bf9aba5af84a3530746f5d24795f7d79a1927f1266 +4e9e31e2d86be65a64463db3077fbb4d8ba24f577ad99d58220c09d15d7478ae +7360e3f048ce8bc4e7c171f86d2055c61cb4e32c8e28e52d3e8a87109f5b9c43 +b3948f9e62356c4f55797f5c349ee40bdd6e6d98406e361af69bca61870057a6 +63c08cd95a45c1d49e5ded4ca719b675f8fecbbf6cae5bf666352afee85c48da +e728a4672cfd6a669015d51c96e74ef3d42233fa3e5271134aac9354d289e7e6 +4d5d7be4433a62bbe54900fea32c6bb7863dde80c914a4d50e11db676af24cbc +6161712ed2e4ae8f0d7407c83889a3e52486a3d7b1e4ff2676a80039d4217eae +febc054ff700f06cbc565353cb08267b50276528e5da421aca6d458c8d381645 +3d524f1b7d143791c3939bb177dedd8000a364a4fcf6d27912cd57f8b1aae2e1 +2f012bd0049675d4b47fab974f28d57b151bb0cf1290aff5fa25e4219aa3e1d0 +e6007552aa41b3446b5624135d748405749cc1db00a6575685b8f78856607a3d +db56c0232cec6d31608342c785fcf455898832088ae4e608d6fb63c57ef4b2c1 +055ba60b0945c580292adeb56bded15de6311695fc74c35f311ebf99702b54d8 +77a677ac6df01ce3fdc54c527c543d3bfd19265fc579c4fb688ba9f1b7233e29 +ae0355e5a94f2a25fffb4a8fbd74f6798c863a2f318b4ce0c826f738614f5726 +2a2dccf3d5b00fc8140b153f360dfcadc36873b124a035781afb7ed41fd3d546 +79598d5030a8661603465eb2ac7a615c3537ff96556dde086f16040935e04a1d +32fca9256ce570eaa1ba42b53032bea880447949fe73fe1633a552346c930fea +020e94d8f22f115b195d0d8ebab7a07cda81497b824bd9961b660836709e0c9a +a7e61662b0684e925e4dd74fc97b675b79674aa3f6d16e96a1c86fdd2c6cc712 +1b00906b4d70c2b27390ad840962c2aea555822be94c6a46dd5a09d0ef16d346 +32e6e2d9563d10762b2606ed532d652b7949ab11efe383cd0afd2a92804998e0 +7559a8140c01ae4b4fb4eae2c147464cc71403bbfb42cf1bfb2e009327d29ed8 +65feaf33fe93c081568949c382806f465e178142d956b250a827bfa2c39f462f +5fa069853ba2e2d18ef99bb53878c78ae61d3ca268e5123ce3706d0aa11c336e +f5d8cc7036c9ff0e73c16bf7fba5d692847cf0016535be27b2119efef09c8890 +ea845adc88dae8bc41a11a861d31e86ffc64ea135aa53c1823a4e1d4aa8ba507 +9e5df4efce318b6d3f486b385377ebe65bc916f13609cea424f9c42e8921f757 +50a6c10c6c13ac5f8a5b629fdb16ce10200ea8f825280a115dd641cdf1763f47 +acad9790c90657ef835ee1d02f3d2e241b7d6749c9e4371216931887778de4b4 +60d0ce386aa03cad70c7e8a133ac4ed3ccf31d91dd0986caa5962c6312679d01 +359dff0b5a357fee803d61922367be5e97abb50f4048aaf6c76b6c65410a57eb +77bbdaaa596833dabaedf537786063320d766fc6e6826be6fed511babaaee583 +7b0643306d7cdd12f02e183d46350bb7c25b94b7d4166666c556d2f3adaed6af +fb36837cd861192b7a36e91b295cd832a67094197972348f44d0ce3870a0891e +0ec2fdd4413f67060f412a3cd31a509028d6361353a5e50058fe4ea46a6732c9 +98900dec7fd4b20e6d6fec5a30fe1f4d743d0deca667b5fe871a7c68143acc21 +ed2512990fd94b7ae6fe738dd326258f6cd6060f243df995a3af97687a78eed4 +271f3dc4f79ed18dea9a84694cb969ef7221be2485c8ce9101e9b1dc59af6222 +02a8ff7225ea661d01d5370b535c33ea4202b6f1a3ec6525a56e1ea71611491f +47bd21ca86ce6d8c924f28c8d5e5f66b9222827382dad72df22ea440726154c4 +19aa0517d06423294bcbc7c6f64940c999d9fe1c6f514c73cdf05acc4105bd2a +764b69f7d17204e9291a1d13be111261c53b5aa1fc255a44acfbd6a3e27d20ba +0c2d9fc7cb0fd2bf3a9cbfbb53eb0b03c6ab2cd636bac90076e486ce9ee10b8f +e69b03cf6aff7b5a3fec75294bdf32f198d65680f6779a9c6ef6b8edd936ce66 +e9cca6bbdcf4cd0808f33175d40c3f2ab76a02d0051ab512e32adbc595014767 +1ff6c57a77b8303e50e7bf024c8af22a2c7d5adcb9ba42ee6565ffff73212f22 +5f69eec749413749bd663976da9e39c7f2120fc475427a64d578e332cc5d2ec2 +84307c30b92e8ec05500c8635a069294902bf4f2969dad5068bac49cac00a307 +0e5203b294f7a42c2db51b4bf3e80bbecb780b0adac425db4e167f893ef4d257 +8aca20afe2773ef6fdc6e07c20ed0b0b4620ff0d5dc28edb59f39ed3e976c510 +e339c4a0fc9f56524df0aaebc9d985fb6781da97e651df018635096cac944d58 +ab8634a3b02cf1376b1c5fad86ab57c5ce85435ace10216a9eb3bd3deb8ee5b9 +acd93838e9c5b26f6f02f5541ecf8e94ff33839b93e16b740beba88c19410250 +301614938b4a69ba7b9cd47d79d9f58649225ec073b8c86503ef606afcbcc79c +287c9315cad03844d0a465ace3e83ed75182fa6de0166ed492659d8e872e5f32 +c3043b055e44b91ee3bee18777b28169dadc7375fd25ea67288c8a7919fb6b90 +e5a805a38a40f1ebd4bebbf6e26b5d5ef18e381970be0753c35de24b6253f9d2 +4a77ed4532f5eb2f464e946babea6cfb2450543655fdd5ba1d46894538dcaf49 +d824b3dcf5484ca5098cdcd138997398a60b711568f26ad6eb964de44038fc32 +07c85ae853ccf6406906bd00b9af16f3eb2246d3ae95f6944ff39b64453b5a99 +5592ab75507ebdd4a7f5ed567eef5aa2697e973e95b512549da9190dafa3f3bd +abb118f5a81cda2103aac289be4ad5dcfa566bc51d8ba2d5b19b7bb31a484cd1 +8a84c5dce3c7e50429d637c22b29d8f750b60e65e2fe3a7316d458557c1e87c9 +c6f8105537aa3b5bc789cd7c370b741477d21af453ea2781d5ce29d20f2176c9 +9418ea8db195cdc57bc982e91ef665411741fda4f9fbfe4bb3966ac00b76e517 +c7c0988339bb8848e616a134f95078a0a5c1a295bee68499d1428ada2d995633 +39d92748fe4016a88f9d534b35c766c9f970903c0b466bf4867cf914c570ee9d +f4ebc45e058759a851b8aa472d14c305f6410fc4d05acc1b11b431fa438490e1 +816475c1a6316c7635226b49399563b3dda5efa5b38d1a32efde767ba4a0fb3f +3d93da113a8e3e32a33b5fabf64917251122ec6dc8165f26af07005b2da6aacb +b7c8e299cd7cac6e3251bb812a600ffb1a028d36ce351b3216a7d23a195a9afe +e3461a40159201f1a89b8ad3da7fccf08906310fd84eab1ae0a76589d69e13be +ee3ba496b5c3f34757363c4f5623f975ec58c115901ddd9cf4b8e135f1d996e9 +1a438123b50d453656a44088b62fa37f575da53a2a42bc659540bc759ca7f24b +d7290430dbd53edd3c602f2decc5d5c2e305e8c9ce56626fe5591ae3f6fc9b50 +62fb69b77e75d7e0808f984b7a062383d2514b0d682ee525b39fbad9b84663fc +3b74f5ff1adee4775b8060b227c1df3c3b2fba8bd36cb216a5717ae6d6629a06 +c099300377b741877ef1db03047a531dffbf8dc6aca4ce0097b9e623717eef1f +b40465ba5b56d6d618aa3e837cb2791736223243621b3c0f36e8cf3c5fa3b815 +36815d1a277411b9026a9eb2b1d1591aacbfc92b49babeb49269eecdc24efcbc +7b0871150cb009a229b3d1665d05a796f84dea63d9c2e23af3a999f11f53aede +953dedb336ff92e7839bc7023f8f4b868b5171e03857ac0ad870c8dc42c6ebdb +cc7d51d1484f93106fbc79a677e97db44190ca4478f1c6e3ed2dd57eb8098798 +f3f163280a6ed0a87e57581fd663917674328cd2d1c6f720ba8c01f8ab79d4fa +7c08f1417a9a9eedfdbc6d7c84bb796f3be629e476565a34885dfb7c4164e821 +529be9d79022b6e1268cf6517a0fc2864e4b718f4018744984a2376a822dff4c +0344668df1caf06b38c229dabc5a8f51ba120b53ff9291b99340e46786c809f1 +912c2d910700252081efab3d5e1d96d8933b6709ec5198b27fe6c511209d84e3 +cb1aeaf13f364a8dc62bc37803dd71c663f7cceaee35e5b39f87bc7affc1dc97 +16f93f931ccb3164490787b1432be66246f8e8d2d01232ad3ecb7962b9ff256b +886ca9f86af2956dd082491d015635e02d867a199c481d51f8751c6c9a3efc2c +7de4970992cb00d45e1d71522ae651b177c2a5afa2ea22a1c083eec3fa104296 +b5b9b74464f293e394fe8ec2d4bb82b7a27b7b4878eb9ca6d8fda476b76c872f +5f030a803c7b1f1c0483a96c6fbd43a97302e17b5e0e28eacca87be1015d91f7 +0ebb16c26c51a8d7efcf50cdaa4d7c3449b1134c30d181932ccd93ec16b44993 +329b44a6c3638b23521eefdd79e7200228425465b0c3df07868818cdf53d9945 +a740ccd2413b8d53b52f3f6b435f960173b0b4cff2e52cea7bf54e5002d254ed +c7ed8f69fbe4fa8de61973454ca0a0c9ab2c2a9882f346d5ae456b074f367547 +54e4995e568d48065f9421f039c6b36d2b4baee80bec636374611123995da79d +54a8e318f034d9245cc5f2fcb4096743366a1b6ea840461f45a74129ef2be0d1 +ab028681ab144f68f02aa84cd5bf824f06d7ebe88d55ce185e9defa29b55592f +3896f917281ff282a252bc9e725ffafe2db8374c7c34820944991671ebc16393 +cdf712bb663640cfe1e700bed129c5b3b37cdc5b725396e471534e75acc23657 +12cb452bb410347fa3de8f13d2ae52de9e4a0291cff3f45bd1387e0b0717b0ab +c7998d15558b3c80adc7f8d1dc3d3565a506050f3bb187f49ee8019da0b49917 +124e925bc05e633da732acaf407477b47dd9329dcaae0c3af728c577b5402521 +887d20bfefa2028e1ee7ebe6f5092cbf0493e4256dfb59d62b9f26ebbf5e3b96 +5be553da8a9e3ffa7ce4de7e428d8e02795ff5d7fe6dc2ccfde9c708233201cc +b433e0fabcbc498b649af575066ec7a198ebd6d6bde12a1a5fba108bb34d316c +03ff8b0368fef25689c95d3f1a1dbfdc891cedd92dbe22a037a2f3054897eeb4 +ddf01d1bda48d1eba76f5441354c342963da0b9b3f86b0738a8c58f4e798fdcd +04882c1a3f18075e31b33c78529f4ee2fa66f09ff4c3975df960c6ba32ae0532 +3719cbbb5702844f3a84478c7e234341a02d44cc60e4390f335629b692832ffc +ea98f9ccfcad11ea232a22998660ffd04320d94dc276af68dda0050406307287 +5e1af46fcc2859f6e91190b15e68e7aa56cf02593dc4e76631c3dcb7fc9ddd64 +6c7ab907941ec4348ff95fe5dba5d6233696b3ed777eaab40c4eaea7766f4856 +3679565c66ca57b9bf714be5504191337b4c9ac40f87b0255e22d24e4adce456 +3502c29ac30988ded18faafc96bd0ff8a268b0bf5830a6ff11cddda5929659fc +ed4cee41b07eee3229d1241f8b0a3b9b1757e1a6cd2b53b29d245c0409321e53 +7f2c66df8356115857782d74dccbd69190852001b7bd6612511ca1c458c0459b +1b1afc2dea548cd9984cb34af196b08d5147ab49aba60c0014077442e5b39170 +2c6c265b25a215fc6bb84931dc00156975908b76cf1fb54996cd798ea06d1840 +937c7e1caf0f5c595bc038d3689e7d4af6c15a3943bd3d5fa645bdc0fe0c7fa4 +a100b71d2b60cfe9ffc65d2503372bd5d7713cbbb0dd9481c19e5b24f987ab34 +861beac180f61c7e8ee68846db98c9c88aad992d8875d7b44b5de8e8c780722f +4849ebaf90244b14d141264fceb58ea3ecffd9ca893f44a1d5104c6c9c4e63b1 +ced9e015b9f415690d526fff0be7ed7a93535c5f823ac753dc074d9cacd4a3fd +c03879f8216a892924cc696b1d256f0d7f8f24850db602ddb9591126aa067343 +d61163475489a8ce2a4643c5e3db6a9608c1c506cfa2439991d807b8a3d89a5e +711969217daca3bbee9289e474a0de12e6ccff0984f10aa965e6a38725f99f0d +881053165dfe7f8a1bab8b24b9bfb7a382298cb7e9b625b78e53b731de5e5938 +24f1d53d970622a380d913c0db2b4f156033aa2c3a4423c5ba3be0261808c000 +a42bda95a6768ada32b929234e4c3a9d0c212f0b197615695f84c9a12cf77a02 +d446971dc5ffd7cbe68775d948fd9c9aca5d93438b7b2f77e83cca3d3c3cf885 +badbc9166d3eeff0473edbef598a9ddc5e5d50637fe9cec73e695d38e413fae5 +7f11aa2c1453c9c56d3a92fc33ad60e0f79e3da79b49c8cc77c40e4c82f2e9e9 +3f7eed0a0b488dcec44f8846f8a58a970dd88c12114ea58e1cdd105c656c4c34 +3d01f7bb5a35e18d730c3967c5b0e711009f14574d947ef626b4ed333baa9537 +ad0ad7d4bb5daed5af9903990bef203a529e310e5fee72aa629cfbaede5bde1b +7a53c7cbf91a177fd3a40fff8a1eb215aa5ac9ecba228b853d55d54e5205d0d3 +2d68813164ff61cb3ed67387de44ee9d93ab2a082b50aa39050f11cb7c894914 +3850b334dc7db907ad6b5e7f3f89bacad3771604f0f1eb2843a1a5df85dc6d23 +bdfbaf5665edf79e652006a822f6b9dc0692af54a51860be74678b1c57f16240 +8c18a8efb515987fc1ef7522224dcd42450dd4a195c43117885d66850aa1f701 +54af834ee208ff22b3d49667cd64b18aab0c528ddb3363c1fc375f1f6c133f1a +5e5ca1e83aa6cde513b11d0d80ce36bf7562a35643266996e4502fdc85ba05d3 +c1a7e39f62276ff85deaa199c3e357757f547d77467886ef66af72968e363221 +25b228b05df472afdf38d64dd4b846df73cbbf2ce1030d8ae964b330e8d7a3ce +52eb0aa4f164d44d8683a6270e952f984dfc78a720775be462cbd41bc8d56ccb +383daf0007b58e6fde73ad44e701c23750fb4a2afc174905b2554d8d95aff499 +713856cbb4cbd369455ba97b123ecde74a928afc03e2e11235b0c7373293bcbe +6193a86693f5db6c6aa905dd539c19a5e953222e1c68007068f5d6b7e232fec9 +4ba203a44ec7318ef6a0db9d255585b7589f0d3e08e420f8ef7b612637a8ef0a +2692f52d9b094d32e8c197d8c3aa8c671529a4012453bf23e7ae1def8600f056 +e715dbebf72bb7eeaee282c926f4ae871c495282c6dc98f191d03380337c8881 +07e6113ff0fbf360a225f354f0ed4ddf9c97d30fe5d4dd03dd929ee799714ce7 +6182e399f53969cf4c8cc2df7332a9de56dbd19a8704661d842997f06f3589ba +f63999f94b4c00cf23d1b540818fe68ffe739b1773d8ac1746e51d8606e06400 +4eaed25d729b5168e8f4bef2c59eb953fcb9956d3f3e733591a3978700510553 +8f9c1721aa7cf7552188c2ee521116b1cdf4852ef70b0d2066a2b2e5dc194fe4 +c14503d57f7d7802014079f915f3af34d0fa4b3fd4a0be01952933c8e939eb95 +dba63306dfa0f2ecefa6f8a868e9b513f5ae04d8fa9715e04daef3225ff5dc69 +b6e455f4c8e8670f7b4c27f62f0c9c3083945d538b46edd1c20cca764e370178 +fd0e0753664691abf1be81c197fc26aef772e4cd6e3b3c08b092e84b80946788 +1a00df4bc03890f5464d453a683d59eef81734570e635e4c2ddfa34b41a6736c +b740641e676556182d98b7e50c56f8bd57020f515d73867fe1a24e098a656833 +38039c76da859391f701e404a0218adb77abb649687e685821f0f32691a82b07 +15ab96d0bdb3baab325089911ea11f6112b69c1e877cd8f2b8dcfe55108f0fd2 +12efbd4f7954149e64e1aa1bd0d0b709f13d032d1ffd5c68bd4fb14fbd7721d7 +a9f9355767875dd2dbf55d85ff6f0378d60e81b3e37ff6bcb6031668ffaa0ecc +cf414fe67e9261eb0f791a092f7c97dc98f9fdfd212a363bf7473fc107ee5fac +0790704f6fb87246143e0a53472593157180617772180173d0b0ea6949dcc49a +3f8ffc3f033bd306ef4b6a9001d34d05e7a8a200016afaaf6a69b5a10e6fc316 +5d9341b62bbc709ab8424b84d25965834f27750afae63468b791cba8dfcc32b4 +158cec29e8112e70bd237c1a180d078070c6feaabb7d35f5167447e54ce4c6f6 +0f55d9f97ce8f1a157af6b49567a16bbe23233e68bfadba699b69b22d70b94b3 +bb551113de57d25e2cc22a3096eae40bea7e353034231ec33554fba3920e3f80 +3611e4dc2d2bb7580869d0bf7cd3a0b24ba6a2cee9210164bf0e14e76642cea9 +bed0b279b01007826296ff79b3fdc11c24beac7857667139a80f0243b16b153d +a927925575ae6315fba5e54d5f9958004e31a4acdb315b78d08188accf9a0099 +e8e706553f926d14afbd8c39cd805eff90b3993c96405990aa9d189fd66acbd3 +123e94f66d3d1a5f4061b0ae1a032ed9eb5010307a368c1c6104767bab95bc46 +86ddea0248d2eb0a886115e22304e81deafce6e1dfca09a8a8c93e7a44b6baee +d222d3cdcc5a8b1661b9a874c1bd871a4cce7f9666d0ae94735fa3535a44920d +6740d5e6dd0372733bebbc603d89cac8450df40be169d9bb90e3480f3659f28f +5b2de56f7c596b3d3c2b80dd82c1f01196c301855d6217b99bfffa93b9d40e43 +1a22f7a9ab31462d3f14b5dfb0795ca0675cceddb8e7eb010b1521406689b491 +9d264bc1f084564e6a564a76437c6bd4317fcfedb47653f191d6c6b649270aaf +d083771031afca63850e7a552dc8cde90b1c6556d49c09bcd3284956ff555e57 +77365a2ab6d7e265a1a4f29de8203a2a15756ae595a48e11b958c6ebc478ecec +29e0ba3a7cdba448c7abc3bb6e21d21bedc9e49e730a5872082e9b2ce588956d +b35eacbc2f3f41485b0b0403029b7a5405ed1a40d6d0a7a802c0bc4a0b1fa6c3 +32450dc5b1cc97378a2edba812918155e84e78267ec5e73f2c0bbdc96604294b +3f840dd3d7159999fe24b2c6f297adff2074ae10a9087e2222af7bfa938a2058 +4dce0e6185a493b9c177b8238af099bd737ee30fc40381833e6a08176f3cb0a0 +504270ae6e7701a47a721d70ca5099a2c55e9558320285e4584e64d639560d37 +50993e0757a1419eeeee61f8186f8493034da3997e6000354bf0e07d948afd88 +ed9fb679b76b39b0b4b444bca762ffe47103bf812b63a2b7c26e56ae4b8c73c5 +58d0f7d6971cde60c257de6688d38bcda59d35ccda430df05fb25f2a3c75d377 +d88b1f22eb46731b7b36f8d9ecfdacd3f11f9fbbc1b4587141c4b3b9b0d0a9d9 +bac41cf6c67a995491d52d695aa14aedbbe48d49126e55b2ae43d0545d031e05 +1d52602401c68d41fd21e4faef1cc86a15dcd17c1975b2d841556017a8f39f26 +b6c0c9cf80e7b5d9488f9d4b08564c8ff25c52c16c3d11ee55e18dd3462f9436 +ce1e4bb7eb090929b4816aea6150fea2659389445800576aac75dd801524bc6b +3f8852f9a999c05c7b29820afd544071e9432ef5cdea3610acb574cca130ddff +aca7b6ac5a6d86758edcc686be2a61b6f5f2a3405faf7a9b06edc40df07b74b7 +409e2a172430b1d504b041a5c7b0a4107bf60581e1fd5e43a5732ad62a2301d0 +07c3a3489e8ed7c963cb5ea2bb5f4befeddce251c8fa914c424764311d16c7d4 +1e855f4b2fc2d4237ab0457b3a1752971bccd0e321dea65684d0e44a73023a19 +4a9823950a620ea838eb5d98f9959992f48d5ad23be313438385a6ffb29362ea +a69f16b642066ffabd919bbccf49db54550299476a7143d3d89a6c1a18e94db0 +656a51dc9d77dbb58568b3365ccdd85d0e98097342559bace953b33cde10d826 +8a3839a28d7c218bb4b0a31d105c5d5464c2fa0ae31f69994057717892369191 +3b67d16584ae555dfe1aa32d4b40d144cdb9584cc5777d1e30429f09e0fc25ad +c87af39d21328dca6c31be361d2382b2c20435e255c6f3014f052e8f4d305a06 +7b3866bfed5eb9b9434909f117bb602c1b743496c9ea13dfe4558b443c347a96 +6665d7e5c06125a8aa4e906f7cc0bc04118a26e9129fc23a63fb0eaa010deb73 +76fcce5d4a3d4ae626517d2d77550c50f7a45b4ade74018b746f5aed001cef52 +fec5e73534a2de1256ada58aa26e5bc0d9d848c8d0a7f42dbd7ecab47d6be1df +71b7632ba5fdfc28fad09fab97fcdf3ba729973d39a5cffdcec0d1173be7e7d0 +85a59a4504617981421dc9600b2b65fc122d34ee2fab5640893e34ed50f53037 +102330d718f7c2bb7b9f50d18643e04af5c860215f7211271fb2075e0152d85e +c440a933a87d20a0677ea2717baec45e8578a077805615c7d492db713259949f +0392cd91480059059dff830b24e2e6e5c715efb4aced3dc637f88cf3ce57ca45 +2e96edc986edce66a831ee92e6e284c72b1307ce4ac479e57014d5114a9054f9 +cf9fba1ae66b0f83e173f31378fa74e8b087490bca05f77da7842d7167d8964d +c59089eb222f1a33963622a9a17c3542d9940baf4d1b8d68cd4d51f16acf31f2 +91570def9261b67da9222acbeba21a6f3fa905e081be29befe3152b326902afb +bc6a57c110bdfda8a5c4ce8e272eabdca671be16f4eb7953d1df46e250acc0b0 +674deed452de3b04f258e081110c5ba20a934fa9180abc09806e257abb22041b +836ab3b73f5ea8dd1dd8cd56216d1bfee9a8ba78d83e2cf0935586c0cd7340cc +5980e5ca4989174cd46fdadb86398bbcca75c9580310422f692812bbd8a91602 +4f28a49d35ca1c80d5c6c7b879f14d037ce98c0be18eefbca8acccec2fb01923 +69154709b772b7a13d2a9737652a1bea28da5be3815867a952fbdbdb8c45c347 +afb7d7de74620d97b52a6bb27d2b25fc3d0515129eb92be62f7efcadaeba61ef +88d82df3daf2d1b0a117493075b501ad84ff1650bd7196a1e481c393de324dcc +c50ed36647ad32f2c8c1820aee9190126c1e622d1f686c71855f8a50062abab5 +54fbc041de1cb0f6163df274e0b148cc24ff66aa16590447b5018474e5bc20eb +77a870366b3ba577a6f484ef97c606cf71f15470905be27bac6fa4375629f80c +b8aef8957b856abe4f885c47acd94a7a32b2d81cb5ccea65a52328820404f5bb +512ae315f257f6196effbbb484ae7c877ca278a1f086e771092915d375667811 +f874c618cc6a117310287382fecd5fad1bf3656f9d41c6b798cc1f6e6f7f789c +8eab2b1634cc255f999a72ea0e3e201a4335558e1dfc26a8b02a8a1fa55cfbca +d1bc49f81b8f7837a29d7af533d9fdca050cbc2809ad4cb54699131364977a03 +775148adc0957ecf2d7317ee6b582592baea2f25d926a1738df65b37a519ab95 +a99bab4dc07e56df6e4ebfa0a8e4d8f90693f8de9d1cba77b3f11dbf7b1eb907 +a381fa256e2e943d68e773459c7ae4e7ff969b43d5693b5b612fbbcccc4c5411 +49a3dd6f01ba7bb3d11a331cfe3734ba2b9e1f8a353be0f7a6a0567e1f0acccc +0e5f27eb18fd60d809ddea01e8d6d1e8c5f59b9554910206ec9c56e7c483478a +1e4a4cbe7bfc97c7c96f119726e45d23b337e547667281022269e8b66dbf241b +d74d3cb856da025944794c90cd5196bc8f3a57869c9f9647a0faf133263e96d1 +78ee01be0f6b67db214b2e9c3f10aefa22e7e0dc1ff6d463a2cf77d66218fc1d +9a0f754c3681591d66f8c455a85e3e7d396fa1cecc04b218a892da24ea8dedf6 +2084965bb34be5e897a6a6c7818f0cc42be52edd5cd7c45cbcfaf89c94569343 +de0c4bfff1f6120684fed8652a071b6587f37aa970b5be3e8574918b97cba372 +81ec8e16a93fd111d796dc5833b76f3f3254a1c126fe28e103ce61a0eb89ef8c +9202f06e04949602431a5cf57a940c059876b3724e461b7cba19a398427e0d07 +8a88c2eb0f9d12b608d777cc1558522e5f0e96362ee59cf1ee03b1ba9b864bc1 +d186152f24e7e28b92e3a799b23c2416afc0820ecb57a0fc36f44b73aaf6ea3e +3b952de790af21f21a273a5c0f86ea671ed2ab467469a0ebba738b6257ad34ff +499b8e21a77a5685dc1de5f21f8ae20d85c6c921f1ca434b67e876e9d3bc0136 +dce9e8d97c769e07e7535ede8bcc169bd38b5f3881f94fc7526ffa91b7870255 +f62e423e2ea2946faa96353152b56ae03010a42f15cea95dd27c89a4614605d3 +636f44785350a920f63f0cbc5566aa9fdfdaf29c109dc83169b3a64ffb0a7c58 +084a88d385ade5c3273c02f809e3dac76dbad71e76462d909348c609dc0bc7f5 +0cbe05994df34bd38feb8b5876cf5a50989a44792c36f0a989084acd73cb700b +64103a290df126dadf1449a45c713a71353969d41bdda892871644f895fef631 +15b63299dc61de72c7201d8392dd3f10b819b792ef91f1bcddf9f04bf3b94c25 +ce81c6edced5ac26c9cc0e304683656c9ef456b1b666bedb3fac1c597bff1d9e +932d05de433889db501bfa1abf7158b428b24a0d49b467b3a38f916601c9d36e +22374c7c96dbb04a5de8ee1013ec7d8515a9eba05c41def2b8af7bae6691abad +51b58b489b3b20f3276878bd520e6e70a9005ee6cd9651199e71269a9dc9e1b4 +cd24d01d37448b25ea34d6e0ec921c4c1904b7c4deb93a5c6a0c736a501ce7b3 +5e386a065c1f5df136c8bb89103febc7b9b3de8f74e0504fbd7ff702c5c7250b +881e83499ecb6d80b3f9d9d17aed8414a6e723603c8762a3409f6766be726bc2 +79f70435a56a0e096209231f5b0c134bdb7aa6cb3db9895720cd02b9dc0476ca +90c7a9ed37ff0b380348f66d85037e9abc95499cf6a3006a40c3874fbbc4efbc +93b261cde619c9f86a4203dcb642e59c59709dfcad0d15235264fc7923227094 +ca105019b1bd20e4bfe5f3ea8edbc33a7bcb6ebc523533228ff682e8a1150aca +fbee38b10517877329be50b45bd87df864b02c6c8cb5125b01e79c64048ddd3b +7bc817f3998adc78819febb2d81c7cbfd179908cd36b7e5169218b449cfd1a1d +d0979eee4aa2c2f664b9532775113f6d528c0e7c1ddf7f92738b1ec1c903710f +9543712c0133b208a9bbafaca0a5ec4a087a1e5de118fda50b4b79a658e73a04 +ea556ee2b9891278e414984da3dc6d739ce951cf058e2bd79d671877c4d5680c +2a757744cfe0cf31bf587043af1acf031fe82e85f1199c1e606232edd4501949 +dc70516a3c30b356f35c2b4e14fdc62abc3cef6b7703937a1c5561694b2e2022 +457603ec1210cfe44401a8ef8e43ab2c2244428c4f8138828f2a7646a8482b49 +00a7fca8dbfc30cf7dacbcb003d06c36644d61e901114cc5348ebf805af2f70f +84398891f59cc49846e23463d89ba78dcadb3efe0f1f00f4b45c40bc0d2f3cd7 +63c231487557e68ebbb01cc9f96f246e9c2634cecff4a381dd27814e07cf1eef +75a68378e92e56ff486dafb1bba124ccb1f2e9dfdf43c5fabc0336d8f237f9c8 +c0a656c7691c674c0031ec4531b6e7adffa69d634c9af413fe014cb6464b4ba8 +649cf7bf0b6ef90126d312c361fbf4618957798879d967496ae34ecdd53985be +1bcea07ff99f19a7bf3dad5bc31e1941161e60b98a7f78316b95db862315bd25 +c46474a7e5cbe24c54f54fa23b299901cc2488480d258db25713dc97ab0e4b5a +d66bc1131efb7296f2edbf6d27734cd45603cf5c1e0915dee25996df850dfa31 +13e23c722aef49ad2be71db794c86926c13ad66f17d8b8de2a4b66d9191afc44 +2b4e95d2cd04cf23374f172a183ba3d6adf8b2f919f14b4ab794f53531aa0da7 +fa0d5ea6f4c30e24db53640d51248cf1001e7330286c1668a7250d3a0d34f84a +7acecf297caec2198b56eb1b9263ba531658d06a3d9902c3c96034cf79f4038a +2859c9e47088ed6025d59a69abe6c86ffb467b4d8b44028fcd099729e37bf8f9 +5584763055731e7d7ac8b76765955c5c73c00bdbd426950f69ac97f55f9f9f2f +bc217e166c442e627ee893965fbc7200396403b1f52693f6079886eac12d3553 +a02944981ead829e3bef62ce5d9274e039e305c48b23c604a86e6d816b649faa +ecdff4777472f32094796aae48960b0f3d74e40fd1e4e72bb37e54322c126341 +039c3b3fc15a137fbee162877a2b1a27dbc2cb91b9b8cecad345cb00d519c051 +f46df1f96224e95646e02d4af7739638c5a261e36e46be731e3425d8f62d25ce +5a7f1e72abf75237bc7109d0f6503b684c728a888ce8a67d622a298fc09d08a0 +39b7508db67d1fad998be17d49438696e9c402bf6ca7e5ad7ca7a1450e04d17c +2b0fa2feb0b9d5af5dfa5367faab7b3e2f104dffb5da896d00b890764b83543f +70d04bf1fb56fdf0a5873edc4124e42b1546dcd43f4896a2b313617c5675e84c +1fb558d1b944084e431c29a8b1b1ea67f22bca2ea0e503c422f13d3d18c16dc2 +2f8215c71346762875d4864e20c107f50d9b42963aa2185db553e60af6c6a6a9 +886ed38b48052b0cce1e5b3f2f5d96975849eef01399553443d2722f1fbe8266 +aab7b8c1d69ee6926c1f916c62dce7a293589e10141173e30b5790f18763f1d8 +e1168cac05882de798bf361b1ec201c9f5fc970e5bba72515ecf3ddfcb14a6d6 +2f38cec6004fca8ec75d0b2ae1fc8bc94d4bac124c97b770759987d4322ae181 +55c7a1d7c0d3005385eeae58b8a07c556dd439b676b496682931327031d68f43 +daa631dff340b8531a8f1cddc1f7061dafd88109b78958d52acbf458dd3ee2a1 +fce78a3e5a8ad9a5314464a53699701ce17dfba2e176e9ac0f34e1692224926b +61782f6ffad4c6278a32b1bdb73cf6b8b2f5646dbea6de31b2078cad5a87dcd9 +04ea4e60601f7547c1544b863ba383ee95ceb4a42ce89e815740e0abf8d3087c +637a29e0645de6f2edd027cdd56e8b558dbd26e9582186bd5b4792500926f8b2 +5d0dd38c7af1ce0e2d99942b0099757140f9dfbd514c38e3d15e502dbbc34c0f +61e3262e48f80bc3b6f93ac5aaab909cac3b776094c2a101b0ef5c891e28ce69 +9ecbbb70fa9a71bab19a9a4ae49f9316b7dbdfd63b43db9aa064df4092cee544 +7507275807a430358ff0df98f2fbaf716785742ba18888994a8e2b54aa0f6fdc +07feee88c4c98951495943bd42b395b92b545cce05be3db4a0ffc43ca064ac4a +9baad9d402c97fb79b8f70184e011f78d8e96538f4ef66d45950a80d186f3b96 +56ce530f019a1269ecd2249f6514a6b77e486198ed8e4c28760a6482b1d3bd8e +8104a8c964154d8d23fb33f0028960d92c5bd3dfa6bb390f6dc708a9f4fec7a3 +7327a97723acf7b62070cd7dffb6aaa77505a05fb292c54baaf428f9b81e5ded +8c92353e46081e4fc0edf39c53ad0e64a29e34aed73d18e25d0fb73134ca03fb +382c1f2d703e241986e9bcb36f4a9a45bf183e5898364d95369febc1c8867d7a +77b76f92c3668ace60e180b685698d403b86e27cb9725405955fecf496aaf327 +e4f5e75ff5123402b23b0e8c5f7cf7ccf1364fbc8d9bcb94f0f3f018a2902f61 +ce2e4992a5dd21e2432a6f412e77b13cc968355f9298c0fda7bef338086560a6 +7c774e05aa3e6d1f0a3b61bc1ea89cbe39423ab0c3bccf10e091a76563ff8b09 +c509f9f69409b7bbe8ccfb574ea7a80cb1ff7502388b4969f91f319e0c609bb5 +c3ab477330dc67d7d900f2cae9890caf14312ba25c8722f73ab0d9b0c884aafb +b548a565b92af0ff6940d36d40442671cd9513f93d19107cca2462d5432696d0 +97f56f580721b0cc583aee69922f3d0209989ed6e6bf55e70e293c0c3e89f0a7 +caa0d50b519ffe06b5e86068deb84ae448d5041d20e03955b5bbf0d78ae45bbe +2e548c64687229f1033fe264d1eddd5437e2519aaf8d1f7f2b8acff36cd650a6 +3cac39cb7c215c7b34e29b58fbf5d8493cc1bbc9e4dc92d8df9cbc28cb3884a9 +b5031e13c12ea77e63e74504fb6609b446ea85900cd8351853e71bbaad97ef8c +14c8691ea4a1b39c94b7ffd97605796e7125ea5a6ef7cb631ed1d7805155f6dc +d64e6773ab236b4c9eeabdae300229d4710af35c88f3a61fb3934dfcf4756533 +bf1a27c68f82bba998f2abd86aab3b741fa09837a3f32cfb5f0a35732c7df553 +1277c984e1c32777107cfbe7962971b6bc352ef17179d94a3accaa0730f3d360 +ccc9e41a9d019759443990c8ad253b2726872bb53a3e6217b3ecc57242068b70 +1116465f90b58a16e703ad75c3da86b2ca6f6e2f88ce00a60175843321e6e6d1 +8e1fb76455d729634c196a8048ba1d7e399b7e5529e312610cd6e38e11de0500 +47bf6d8e7fc899e90a40f639ab3ed83e4f8614245ae7929da6a8872a15b3b6d8 +c0769d8468fa9911fda9fe875c7f4532d2cd641d8024b1b43de1d9fc0cf0dd55 +0337769be1a0da6afa42b12c8b3d21ea450df447196ed23071ecc65385cf7111 +d025b3d4d396fc2ff5f814fc7b249b88c012765d66402a3cf926e3769522c650 +62336560b22fd0865350c75541ddece29da646b137d467aea2b14e0c8a9d004d +c914e1e36247f010d5acdfc06a5a86477392e6b5df8bfa0201bd160c16edd42a +1611d8569db8d294d64cd76f9132970e961a57cbc9478fa37507f44197d73490 +3a6aa1706d0e0b4115e3c6bddbd4cf4be087fe8cdde3a8d764b299fcaefbf13a +2f480e9385aa9db1d4358cecb9958ef760f6dd14459f2a93bd2d49e354b7a672 +8e6bd45f17e2c6d86512f24234f1e8df4e5ebfab6c094504041adaaea0139028 +5b4223e9cefe6e67c7a055c9b56402202fc3964989ae3d435ab73b071c022aa4 +6c2226809e1c38f8436f42d3ac3a262c94cd71383b50dca30ca2d275ec463405 +e7de48bbfcf53a152083382b8426ce804c958b9aae95a13f2575658991c91988 +e3af9fc6d24986700798775ed0edfe717510f248d3fd68a5e229c9862f7e5850 +1527886041988bcb5fb8e76b80a5292e982f25d51a97a594c4bc30a0cf3739e5 +6381ee320c7a2908da6732b29184ba5312b24e0935fdea476a5aeaa75df407fa +4ebf181d5a15a5ad7d0561ebf0a4e55c220a9beccae6fd830c0fda764583cc5f +f59dd84c9c2486afd7039eb22a657ebcb48c5ca9053f9c6671cc6cb448897f01 +a33036fc2438c9afec583261506e1ce938894644af8d14b5af8b020f0061502c +685d2919d5babfcbb1658002a2b5b6f5fe8636f4addbf97dc7c28eb93dde4f93 +831cb9aec8d2d3f6173f16d4c31ae3871e4bfad4b652c0f5e11af2270c983cf7 +47e3d8ef4619c2d76db67ffac11988cf3e7f6a2976305532a2a2174656a926fc +1e9dbc981c19937c1fbfd11871ab3b96599182227ba0f840f29bf8533d33e4c0 +052e60cc0a266a97857f7c6bdb412ea779b4094a5ca237960957dd0fa2a37c66 +97db26e03b892bbf9ea9b6e39d131f8ceeaced68e12b7f2ce9ac64dfc61009a6 +a4959924651f7158dc9c25f3e603629c979aac5c308fb57a460f4229ec663d88 +51e6947cc40678dfc56e8472f021d3264c06a3b76cf1f77f4b4d0b1886039d3f +e166d739bafe7cbfd72331c343fdd7395cb8cda3a85c735bb35a286090b6055b +62808bd999289763d9e433d22573fa3f069f40aa45df44cd9e17e843e9841828 +d18b10f2325aafb6c872e26486f9c059476a50a4a3654ea8ae9e7f6fb7496a4a +887054819293cfe78eb82ce32bdaf4c291faee9b01a04ca557cb09e614d0568b +4fd1eb0cadaa3014aeb0325eb68606f07885a5234e54e76ef6d9769b80e640c1 +8b21a8f0d80f7029228c704ac5d747edc455493f33e844a3b450f36141417a52 +0677fad5d7812b65640113f8daf1c45aac012f587719d26e84e8f98cdbc9e3cd +a9e148ec08d03ebbc9e875b21ae8a3456a032d39fb1e726effa0b5039871cd72 +6faf210bc4927de53fffa0d987c2232bf27dcecda650bb7d7ebadaa7036079c8 +0f067aa09ade73b0f22f92ca57ab4a1873ed901c7eb934fef1524824604092ff +6f255608a2ad18636b7f69d842764c672d3392b35b7e12ddc355aaec9023f8c2 +730ddc4e7b49e754e7550c70a21b5bdd7acd0bde562b34faa2ecbbded4956cc6 +45747aaf479ddf5269180428781e96f3589ab47bf5d772b0a6a01eda4dbf27f1 +49cc8d9fc57e95245f9da122f1e3b6a31ca21d7bce9e846b3484bc32310902ff +acbc3b5e1191ce9a65878695678a3ea186d03fa6cd13b1743f327ab65a848d30 +1dd0abd9aac5b38e9f727365120dd5024f3da20c5cd4f6105490e3e45df85ac1 +300a041e5a5ea1d8d882bbb1afd4cd7156f19a48f43ac58cbab60674b4daaf45 +7528e5c201d32ca7e06ff8719b79b94d6c571a99221e5ef00c8bcd7d82ce818a +e2c4f8b426438788ba84c02e7c9395b00f9780b7770facde25094236e106c405 +14913fcd39c2d2b0d084931cb5b4ebdda3d91d8a25ecdef23154779b30a277c9 +509902c229d32557328bfb32b20561dc38e88fa16a9ebcd74377ee96dae69167 +87481289a5d322e9c34dce09c833d7e479200afdd9998669b16a30264e72ca70 +f34e79f2c544ab96c323dadda4c9900737121d68aef6978feac182fe1214b1e5 +e2f3321680eb5f0e6fa1f2bee600b07db3d9546954fb6137443956de879d58ad +cb7d8a870f12a58c5475ab59790565de421f59b39e643ab54f38a94336cc0f6e +c5c54c6fe6f61d6c6121aad3b9b1d66350061d1679e795c252dc429647c83d29 +c684a07d0b41c72a62be91564cccf41edc5b079b2f06e6a9236addad84d0fc4a +b5d3403b42c9dbe80d119de3855e1b17498a9c2e827f4a8b85736371e39bc01f +7d7d14421219d136d182783f5d6f8aadad83109f5bbe65ce504735367ca9b26c +40e10288fbdea5d46532331eeaabcdd5ea937f1537796f43c7a3ff713ea2c86a +2f325acf06ef921222eaaa928a4dbc95a9a720bdcab273737e7753294e42a8ab +3a27daddd130ef705f2702702f39c84de8e5de998f507bc54a69de88621f1968 +bc135bd14c3ce226befa65d8e117c7dad682ce6dd839c443e5368b1dfcbb8cb1 +7357d126b021a47bc4b3eb4967183f4a5ad66bb4ced909993a13f365604432ab +42bbda92d93d132d4194a64717c65d6bdfad697e3e2c1b2962382d43cfdb20c5 +ed6a61484b3322140ae300953acaff45077505701f7c161f108b902734803f93 +b6e89a2cb7640388248e2c263135f0dcf9d6945f8b648c89ffa5d39911bf196d +24dd049e561cf823988605fb0b3b2b960be8448dafe7cb335dfd8870f2fed3a5 +ad8784ec4c5835f2aaac6a5f7fdf8f15e1bb5f28296f6af7f8fece5ba290030b +885e30d245ed99db82c0d669ac135390af59032d6b44b34cf43df8b7e3434bec +eb8794acf138dbe43d028c6bfb9b27f2690324f201352eaa4f3ae5601cfd4802 +81180cb05c6bb3a90948f261ae1e31edd7b34dd8f1dd2451eff15bc7b881e47e +98183454b03554d5aaf541f087bf56ad3087681521bf3c7b84c8047d3c23b02f +b80a55f6a26ea426feb545f7075a84d903e1ee6386e8bf13deef625de5ebef1e +5d693c8fde15c264113394b035931bfd00308cb7fe9b84d4b18df639a65f454a +9136598ad3f5fe4a71e2d7ee28ac54ab4735957cd1aeaf5b91247426a706415b +1f974db500682c188fecb8ec291a81647d09c3326e05a671e6f406140d94a86c +edccd20538009a2867c3fd9d8b8a703de2f9e2dda4a495f6c8adf2d8da8e06ef +9f21cc11807dfa35a9732f9fe8bdb8f2406552ab3d67621d23bf5f425b4dbdca +79a2796dd74cab6305c5a8459e54f5cd6d8ed1768676386d19e483f257b9fcee +1c8d9a0ad09997343314ad22fd713a49b8a7da1e2302ab57360ac15abf917f4a +930dece02b588a0564271e207746e4e7c330889a3f272e85120c7d1348379a95 +80f40a595b1a0f939aa46b7eb17d07981136851acc677e78e8715639357668fe +fb162d0bf9e7b58eb0a0a8e3040de3cc5d6ba9236cfe5a921dc2342167ec9d9b +1a6ed1b7da0da8474ffed17740221cfeb7de9aad199e58bbddce88ba826a14aa +9b11abcc6f897453ddca5565a096a79125a192cfebe71ed37b5810f13fa07e1b +286bca46d8f8c1e76c7ea100c2dcc5501653c7cf156582152bb6aa34ae041580 +6292f09c7c3ccf7581a1d1828a99866f5148de42ab060932d1366c2bd8104053 +f5d3744c9d825171812dbce8ef600b937ec0430f4a6129d69fefbefbd94aeaa5 +12673d7ab07f05528c529d4552ed20f00e8bfe54721cd959ccbca7f5c1850168 +5d5ab669a3aabbf6d431a429696274df399f3cf3760a4ac9453d407b211b2bd1 +b8416c1c23b3e68343ec28cc5e520fc2dacff7d41274aeb8f77beb6174560e35 +fcbf7fc20042393bf52b5278402ac5cd9f2e1ecd5a9dba963b9acf08d78cc5ec +33bf5c620b6f5520cb781a48f247158899cb347b977cd62c54cad66c7e6cfade +433e5be9ff8af602bdccec15daaa4316c8289921d19f809c20e68fca2b71db82 +df2bf6f0ab9d90b9830d399d838547fecad841b07fc429abdf02d544b41d5e31 +7655829d65c3c4eceb08dedbc1b2db023ad5e524ac9cfba00bbfc2bb2df14d60 +954d55560fa6e2ff31786acf9277e5e2018ea2f839873e3a4cff611d83a1cf8b +7ea655c6bd34c7904818fd857cfcf4a9b39e5fd5cc551655dd75602a432a077e +653d3096ebdfe93e0c7c7fdb0e52ac0145a5857d5bc46daccc9d9bc048cd6e56 +1ac2f5cac16d537abcf20dfe3c6aba54f400573da27a781dcbcee2bae55db664 +18f8f003aba535662a2c891070ae99839b4e0fcdf5ff9b7201ff83bbc9a5d39e +bb61de440b63d08fe86bbb51e251a65501f8ace59ec1907c1268c639012974f0 +d8c09babdaad610d2c065174687fa1d783dad6567f1bc9056b4e7f90796ae034 +529735bb2c26f89166b67385c0b3ea8befaf0d3c5d2021c5e95f332659f57c20 +7b74c058fe712f9f6f7bba2afa24d922819590e2fdaa7b44e2b7a401fad4d28f +05ab33026864f395ec60b658d42784533883b1cf6d5c32baf24262d835be78f1 +eb7b30ab043abc420085fc13622e1eea3438d9736c4ea328912fe1f587d4252d +bac29ae8f47e156b7183c1b79034bbda31e08619fc106ff4ab743bf8b9d8bfcf +a8ab6b810c1e1f862201010a3e3da3ebb9457071f5bfc811869fdfa0ea873a0f +fc47d86b663bb3309bce467a81d6f757f62a195f7c6962a729794666635c8703 +db1e2d71ae67d5dcbae3cbf5b948eaae1e7e7ee478a0e4584ed70a019449b463 +9f812dea0ca7e191c9698c48defd784c76b4692337749365039b13055ad9114b +1a456477c879893ec3bdd4d34184ae5f3e7bbd8b8ac1abeb315540673a792b21 +6473e225bf2b925d77276d0741cc50fb9ffdd34459642d337c044cb4d58c123d +652dffe4dc9fb7df87bef364cd7d62d8fe7046cdcf4b387798754c409fea2867 +c3c3e9603e79d53c02465ed8b57b752f76477dbbd1c8945522901478aacf4871 +c3dc4aa90b10c08351d608a02d168a5978fba8eebb48ec93653a8e178d44daba +e42ec334aea08544a01dd57943e050e87fdf8200d2cc475c02dff5ab8f90e58b +d3efce06d49ea472df3f149b629059dd9e839536fe014503ebd1e6acc1c35637 +bee2f01138614af7521c7a9b0ad46187f168e387a095d795c067660f71b43521 +7132c561f442b12f84e183d1f5dc887b3e38f904dfa73777e7bd7d3ab6e91fe8 +fed58db8f42e4b65856d633c75e5c9f27fa20a7c352f30d2ceda868f61fc0548 +f2ef8ebcaa18fcbb4439ad597a2f2d89ecba33181e770d5e8b89d95ac0c9b137 +a8cabedafbb3a2071a0484c54dc24ba3b00314555dd3268690308c839cb0f0e0 +410116d5bdea76dc4e37d89e5262df1a2d5214bdc3287a67e7657cf5b5f66892 +0e5b549eb0929093bc809afe32a60894d7d5dbcc546b0664cdea07442c75ad9d +8bcd96bc17af39925125ccad1a305829e9054454ae7db205fdb3c459836ae540 +ce773785b55b103bbb400a6472c14b125d85426138c06d67c5944cd0cb27b224 +e1dba5ac9631e37b2a3ef25adfb0271f729f6c4b9402771e0dac6068e12a0df7 +7dfe8ff7eabc22211bdc35062527e1ef26da58a905331a5062c66abafb46feb5 +05aa06ae1a4d7e88143666dc8a7add3f049fdede30f7785f968dbb0ea2de8bf0 +a08da2f0c9473885963b710f96fed7751c4ce01b4f954e486325488951d4bf83 +01662f9bb15f48623f8b61c7bf7dd47fc35e73669f03286ac8b1d714dfb24415 +7083b0340c5535e329f6a114070d01df96675ca34d6a0280ae26e81a64ce055a +8261cf5db776cfae5cf1fdc3f8bee14efdd08b832ac93ed7094b7e57a02b86c1 +574ed345d13e9f9ee91bc99fff620fba401de9c6265a1ab696a581e15a3e5d56 +dc74fc5c276b7d1136c94e1816aa95c0f3207ee25769b17948d9a4aa60f7968b +e033c5e124780bc4f532ec96f64e542a0851a75664b073dd16034e76adc06931 +5f5f2492fb97859d59cf2f6fa3a6053caf4013c4f47469b9bb1636e7017a0c3f +5d90c8d94894613b51895a11f37e9f31fd98a37bbf4cc1e01e5420556160dcc1 +25bd769c66ebe645bfdd4eaa9c53d414ab9757c860861eac507a612a9309e5fe +e75c85868fc360a41846a8fc79b60a175606bce995b584b5d645f9223b7b3a3c +e4e249600921f783ec8f13abf5aaa3b5008389c46da5721dc304f56d7ed99f40 +264d7c378d96a6d1a960cc2e412a85fc3a2c47c6f70edf2cedede7cf39d8512b +9679bb345fbc28716239bd95246b59d21a9d8378897e9c7607af76ce59e66ca9 +d07928d73ca7744dc5cddfbdac11468497cfc89dfa1a24b120753229598af48d +0d2e6332a73189656cd1f584496e6f3b1552b04cdd6e51a8388dcaee3dcf8c88 +072651ee9cd44e3cf938172570ebb994bb821bc04e1a7723e16ea720bd8cceb8 +af7ddbb6ac14a58e144ebc37819ce9f2e78c0b8e5f68ed48a5529e47b2d9a7d5 +b381bbbf863a318d719ac4e678cc1092f721b5ca28430dd1b597004390ca2a34 +a54e73d1d8a556c14c4f04eddb0adfa43ce6ec57c8fd98ef7abc2cefbe991786 +a58ff65ee2bcc0ac940a0f07e367c032f0a306375948b54546c7379053ce25a5 +707d9c54aaeabe39fadadd74e1710f617d751f7751d396c5d054d28f93314ea1 +0e6803b627f3e1a1b2a2c4f14a8e9f9da3a032f7bfd872f86470b2f50e7247f8 +97ac03b1a4fc9ae5fe6dd088171746706b39432cacff853edf1b2fe87208a44b +c1304b88b88f70b2c7596cf5ea33d9d11317da7dd2b8497aac6100ca08551dd2 +a57ce4efd1522a62f292caf6e273878073c82f48a6c9f10c42be92c439cf49aa +8d4302a85a9f6f313ffeeef59e54aac64b7dbaa8265613f46e62d9a93b3e5740 +9eed68eea907fc84a6ad170b8e1ca16b62e46b1067f28eb6b35756c71443e0e7 +f0ea70df14dba384368a68baef33b7b2105085d179980d6622db47c1dd4f027c +0fb25e8b1ed04be113f6961107c235eec39afa4db672fccd5c11737b22ca2a50 +af750d838462311c1111d31211fc41b76a96197ed5f62505bd627efc44c98cbb +12d82f9969735d8f4f36e097ef1cc66629b901cd7d530d74521decc86ccc0707 +07e8a5208fd26e0fca9dc03e4b5b5bb6ee8d899d439457f139f7d2eaa4dc6676 +a411a40412cf8808cd1e9ece8df377dd30af8dcb28e8635c0596c9f68728a877 +671ff5872c81635145e98e055dbf7eff602a4cd98986e49a26c3754b8a264b99 +b53dde3ac4448ba76a550df75661094484ae263c8bc0613152890d17b1a09774 +a16fec15c779257a9038a6b81ce29162050e1fcdfb9aa0c88dad199a74470938 +21b4585d40e628823c42a45bad0c67427ae3dea6367b69d76820550cf3b9820b +043f6c646cf42d20f1241d0ce8196b2c652e9e10278545cd289bcf37c813fe83 +1a437c6e4991750aa4c7970e200b86ec8e26657deaf058e633011946e8569c27 +fa7da592b78df95c94607eb1779393c5c2b4de50c425384431505a93cef43c13 +e042c12a57eeaa2c48d002369aceedda1b7866c865c8f043bc4e50d824d2e312 +04bd8c1a4d01a688bb2133a4ef37b858fe1de27fdf8e5382e4a3f323e016e151 +8b1da5df2706b1d76b72db59fd5753e23b41306070650d6990cc2e7ba3014d2f +fde0d8e36ddc3de6917bf3ef03c84f8eafdbfa7dce1c3007bb57c3860f65e991 +13cbca57852b97ed21a7a55ea9f0803d13accab45fac1e4009be81d3da217dae +45b421d6a76150d7997de83c0aec3d7c09d5e0cacc5678f2834e21c22aeb8ab7 +aa20ed2112bf7d3583cb287740f2e6f828f9d07385eafed61527d19055cdb129 +e1e5f1326edb56d107250346184e4580fe83bf44e2343cac0f366e04dc9aba72 +0261224f33ea17f779ca8532400edad7ac6a5868a0251b030360b1ec93aad4dd +04caa52edd01246e2e275f007849b317394f9ef09064dfa18fd3c0b32ab4073c +855cd08ffd407d937292f54b0857c281b0d7dc4ded8070d8616e92faac8fdecc +710a60c61f88319733d888795c8b45ed895fd29863943b6632336aa49c2fe365 +752b6463cefbc1fcec8e8ace944ba4d35a4dbd87a519eb5ce02348e106c3eb9f +a57577ba58e7d357e55259f182f72c426eb9e12daa1cee7210f75cd7519fa1bf +80b5b2f3bb7eef8348e39c270336f4c96a4e458f71699be5eb94f26d0c7ae5a1 +b815789c4c038cdc8285c6394b442ae05dd2322f5aa943badddad4449606020b +f0f63647645d0c1cefe0a0e4964c2f2c9df5754c5d671182d8e15774752e06e4 +f9bc5cb91fc5d31fe4fe2f9bfcb53b920c22ce8d0c244851c9433f2d8f9d00be +47a03a8d4246ed7a9a9bf27235f7537d071a6208b6eaca1b2b6c7c43e4354a23 +b97ba4ecaa7d93fbb73a4bda88c406a9a1fbd9861252f03b2385c3517c321411 +2f968c018db6e3e3de8246c05da9f4dfa2b5d0f2cd2fc3ccc8005486b9c1d1be +e1e8c14ffa77b18c024a98dc5a38b6b0e057d80111e7d2296414e87276c13da0 +e550c489381ec3da91eb4dcca6affcec210ecee0c8911fd338b9dc590d17896c +9f96dd780503bb15e0638db81ce3f26b1857c3705fed78959c83ba079e49fd0e +08b3a60d8641ff061398f779498633441313aaad5d54e4b3fdef4e0ce6013b20 +f17c6b7b1bcf14289c52cd55b0c456a69960f32fc06077819f32bade75c69b23 +bc97b0dc78532580f9fcb1a7d13b2dca90785a7e958b579d397a5df187d4b0b5 +f76282b4b00e94c92cc3653a047ea5a003a72f2fa4053e3e9098f82944131394 +8c471657767911fafb254abb22cb50693c8c644096a922069e2e2498d230bd19 +4d2cfb8086eff1761fa2b13a0ea61d6ee0923c7c4d31897eebeb1d73982e21d9 +66f303ae3ec4dc108f8ff4da3bb381be3f4050d101d37042b11b314535a1c370 +1b3dd8305868241efaeb394ea2d3efbfbbf3cadaad79416bcd47f8c19cec479d +19bc73567bfe6d55713ad85a42337200752777a1af0bdfe46bd53534c4fee290 +c23aa58863bc3d0f1afc9622c886244c3da73f429f8a130510505b554f1688b7 +709b0282c94e36468a0af39d04fe42825369197784a82d13011cb3d193bc40d5 +5ca5393d2b32c57abbed3a0bdcf6f5dc0bf26c97aa46daa4269d6e2e104a78a5 +c96a39b4b121958a0e643244f646480b348563e417335e5703c368081c178054 +293bd69b1d6de52d140ac2dba03cf45c83dcadcddc046526b004373d8aa9d2fc +bd3b354ea1136b0161a7de8ba06051f3cc22b028a2f76b6780f74c5509c49268 +0ac5e71a1578e344dfa147d4136d57a579bbae76a482d742b44ca381a96ee349 +613690f1a6f8bb1e8af1df6b2555681485122512162894c2e85b2b9a3bf5628c +2a7d925e263edcf66eda45022c012d0ae52faced11324543ce842b5c6349a832 +d91999d162fdeea3451b87671f83bfe321726a6244d6f948088c0392d140d0d5 +5931ea72d9f6ef32bfbddc2fc6ed0c50decba208beefbe2da0f1b6d918f55ecd +be29f3017d358dcc4a3daad96fbd6edce1a0144dcd3bac07d163935f8580040b +426a9434da7a234354e273f62500f88237cba7771d4ca0f50a506f07b7eced7a +6704154a7eb342bf879fc79f7bc6c488a155fadb56df553ac0b5546cdf3a167c +528b6ea5f65f0e02c863a738ffba4c4a0fb67a788609bcea6e504547c6e66cd4 +45ac2c76dcde706679ef2d509f7f45624afc984e0a3f2bb2e1d1364b038d214c +11260ea09afb681a4fdea1df8aa130bfe08ecb071e7fdc72c90dc1b114d81935 +92e0b7a609fe06b2c805730195748a02b1879ee6e350c7837c109063628d1f76 +e39e0b4fd212b2da075c82e052a9f66be9446c306a956f412a39fa903e430eba +d831d86c7f66765f92137a8cf309cefde84580726dd922a4defc48604b992684 +a793c7a25a21438dc7eed60e0a0c82007888457ff63cbab3184d5009ebc30428 +b5c1359c3fd71ae27bccf2be4eeabd9ad709ac34bc6afeb60c3afecc39358bdc +5b56f65b2768111635621d7797882dd1db755d26bb2e0f03b1a8d80f902c3960 +396dfc9aeca6ff7d42e7f6b4f83d1f217a68f3affb54e7e9aa1d0524e1bab538 +3843852ddf61b2ad706af3d609a8d1f841f9e9d12b1b0f92f3b47b0dd0bc5f04 +866528c0f63db3feab76645cde31f0283fb8c711fc34504697fa0cfb8cd7b150 +172cfc93d64ab6a1da1bc96d501d49ac87cc6a04db1635c167a1fdb58eb9e3cb +94c90d2f9046890700513232d5bf1678651012e2f817114f46a1019e72220d7e +d216d12712bb8ae73140aeeb48a3339dc1d5a6efac1e8f50c92b58e32725424e +ba86033bb1bba686695cedd75be66d54275c8ddecbdcbbdda44f595e6b686af6 +f6117bcef51df5e3c98e90171952a23f445c2bca9b8626400905fdce9e0464b1 +c1d241ae619844513e9cc3a58a6f978089d209bd775438d7b87108a342c76b62 +8c3a6a28b9d0c42e696f3d5908cb2c70d8d3ead811ef4dd19023faf86ee053c3 +014ff20983774efe8e26646abda4954ead06c80c7670 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/UTRG____.pfa b/ogclient/lib/fonts/UTRG____.pfa new file mode 100644 index 0000000..d9fa0e7 --- /dev/null +++ b/ogclient/lib/fonts/UTRG____.pfa @@ -0,0 +1,1126 @@ +%!PS-AdobeFont-1.0: Utopia-Regular 001.001 +%%CreationDate: Wed Oct 2 19:10:38 1991 +%%VMusage: 32987 39879 +%% Utopia is a registered trademark of Adobe Systems Incorporated. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def +/FullName (Utopia Regular) readonly def +/FamilyName (Utopia) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Utopia-Regular def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 36552 def +/FontBBox{-158 -250 1158 890}readonly def +currentdict end +currentfile eexec +fa444f2716d92b815f58ca9049c815358e22e32e73a3e6a653c538ee56873363 +67713b8cab082730570f5b5efcf34c2cdfb6f8dd2b7905a37c1924a2424c16e8 +711db76501f564506b0f45fef10d83c3e3c6df2dc0af7802e7f42c81b4243697 +ca09088b868d983e79e4b2c3e17321993cc8837921fd4ff7b92a1294c5ba33e6 +8fd40e63df624b51865721e034f71bf57bee0e0c2a9c169c7a626496540d45db +585d2bc93f83e6829eacb859a194d7a57904cfae75e6188c7121003ae40153f0 +0fe6fb52f339e72d4aef38469328465a3bf0ca1ef58dfb447612eef4ada248e3 +ca525b0884971b85099d73538152affcad51d03eb4060a5c580f453ee78e5c4b +991f77c6e9600c135395d56335a7c3a75c0341979d6b404ee496214a5d20ae06 +e17d80d37bd3540b8fe913bae1674afe37d0c41e3d9836a7b5147be32f9ba01a +df1a73b89d30bb595a4b279032e37c8230b6d4933065947c3e9150d2c7c4d439 +d60197eb69991ef059edf886ec0bdd28158a71a2df96dcb67fc0bf81c34cf27e +12d6ec950a75993af99fbb040af595134198151e7361672d8538cfadb4716785 +dbd48da442ccc911ae9157b14e433559dba1a1c5619e99b57274d6998eeca3a4 +7e804d8fe3a664f39f33237831385949a230a21e52a2dda733f2f89b02ef4ce2 +5d603c9bd2f8e4c0443070940f0380dd1ac60ff462a9a71965a79d787e0711df +0a69bd86a4846965ac6c77f2e1699c4620c1bd9f5b2263e13a2213631c55f7ab +cf60d2e63a7830d5011d9b9934bcee2103f4a5d56942ce0f590a15dab480e5e5 +723afc8e1d8d96f3e0d8629b88ee477ea6cb8121b0adddf20405f8a32756004a +8a59b2cf922a6dc0747bc15e99079aa12ac0d9fabf8b47c5a61ca5268e01317e +1f0a38c468ffea597a392ae3399daf7c03126987750258b5e077d703cdbe05b9 +a5fc4d80e8551c2c06a2c579272877fd462fac6569a7a9f964797df79628ba7f +f77447fc2aefb25089ce946e0aa5c5ff21370f0cf84d8e2affa8b30891081b16 +6fb86fdfe65e7e02ee551c6b3e2e324cf7e18664883dc538018ec8cadf7093f4 +a13708013d6ca2afdf644c0155342917c2725598fcafddaf8807200682fcf04a +4efd5919c21ed2ec2f7951c2db953ed292a54783f5c541bca68d305b05df5c5c +f17b9af31035dd8a77ed8b54d4de7d684f54c58a28f0dc55e7c692cfe444216b +18751c24ec1c8a00a5cbd458a0ad54e7c13f26b4c4257fd992fbd1338845fc69 +6b97a2ee6a4d4f03fd387e745eeb8e97eb67e40bacbdf1d6c08e9fa2e317d30a +c4234559096affd5b2e65602ad9c4868e24d7f1d35e8b6679e436a010be5ebd1 +52666a26ba7f7b68a693add1d21138ad64425e9202a043cec98ebc182c152b93 +9f88cb8c89069b72f3c264e2bea7cea9aedf1a8736beb55cc77b02e3989e7013 +b4fdec2767194fa85b1aba185aa01fc8902209068fadfd1d282a59f8b1d7e30e +3829383779fb9a28404759c595b986deb7c59d315023e542b461327e8645f440 +3d1b571403e30d988d5d17b09590d644cdaa885cf36881602f220a7891130e31 +2ed47ee703368c5beb240427e1b30446dae522143ffeac91f3bd6a3ea5c57a63 +f81919870daf71d9b522529438d5e51173973f612b3afa5e4c5c042c8a8a4ed8 +27d00b1f5a102ba8a11ee7d942e1954cf35b875abb184df026b1f600b27aca0e +4dfea33866de9d8b6b8829c128876a2b882b1aa1518285d87de3c39bd74863aa +229a0108f3070908664f4f77a62f0e67923d844c9ef91a6affb8a72606f5085d +88c35fb9e8eeeb663742369e6b0ab87c82e3eec3dec4adb2098cb25a35d543a9 +70025ebe038e7057a8d0e8f7b2eb86418dc39b494884bee8c92c87f1af4cfc44 +c14a177f200389c0a23c24ef1c59e9a143756c1ac0ae50a12a82228faecf86c3 +4f7ba61f010a0d285063676097c7c3fad3b19479c8c50d712b48ab99e4858096 +a1799936df4bfc4169e5544adddf343c7fcb63e83e2b2b6eb68c8a33edf201c6 +5d89e5b0c3d21d1aad02bb07fd463f763c09dcbbf7c216b1554a9402a8eeb5cc +9de4edf0753d8882ad183a9d14e2de51fd81daee2ddf53745a076dbbb790cdda +4b25bcea0f98d832886f26bc15fdae9ebfe42f0a95b7d02c0f65ebb1fa0d730d +a1f6d63c3da03f9ee0961f5e93cf943915e0dae3147e4c100fc97859f1db0e39 +a85a06f140305e9cad70247718385e9151a091aa9a09552c199e3ab164f28270 +fc60a08b30ce11e5d115577e54b57c73b2008fe0f9679cb7d60c3c80b8e63cc1 +046a093b0838c832125c9084c9d3691fdf6236f1e4b2cbbb4ce8d898d4c27a97 +5f4eb9ee7e3c2d1a694465a632356ac7c06abb42f89eb2791ecd146d29fae767 +2f132e065ae5f5432a5705414049f68b871b55c409ac3f02cddb56deb21c8d4b +202b93e8a5f22d09b287fde695e9beab9fb790fadf1250dedfc8188b0a3975be +db8973fd1ee42841b2bf6ae539bd46d0339dee6804a92a0c32ca204ec9897f76 +95d04cd16c3e09f37306109da8b55b5c69660682e8328724655f88a08f11f9b0 +6d3f1629240662f0a0ca024f16265503390d9adf8b521d971d419a4cbc15d322 +1eaa0b79e4a45d2f0bfc9bcbf135e44b937e4bed0a4ea896da90e40bd793ff7a +d0bf85fed6224690f801cd8c0100c4a79be124833774b86ead4d58bfd2598e52 +6bb5d08264df1c4ccd29a918bb27d7c75d0fea288e066a74236de1828a0c9fe9 +6b1de344a4f57ff0997707f9e83c25cc5639ffcf2cd01152d9f676a80c637a69 +5cba153263f8c1d93bfc03642796263c3b460b1fb22fd4f63e742064a337d1cb +c12ad7b5c36cfb0a62341c849e97ed8a6b5e3e93911dfbe3795f9debeb3cf7bd +6311ccabcd1d80c76d608e0366e23725b4c27210c788f25726bcb13149c781b1 +3e77341630a99a22cd95717254844bfd4221df25ab740978011a301861c4f0cd +cbf77e1b69b90ecd4aba88d2c0298bf525c4f6f0be9d34d74371517e485eda6b +d38374ebc2ec4abd9b7969b426b40c356982b735289f80583b377ebca2c14068 +77d7a6516135878a18deefa530a88685cf0bb9ba03c45d283510a68b17853cbf +c1c16428a598e078564a8d50bb1171771ff483ee395ed074d7f524eb8af23061 +5b30a01122d440365c7787ff477ce068ad1c8e4f9a409199138cf49a435326f3 +645d5e093179b96831b7dfc926ad11a2b9bf2ed3a5f4ad135278dceabe5f8aaf +298bcf406c9c11cfb55400fcae95910ea7c09e607a1c2447ee82ce7e3faedbdc +2b1827ec539eae6ae25927a35be1aa6b7951073746e5f684f758fcabea3cac25 +f608e033b3c92cb05b7c9738d3a6d2cd5e0c2d29b968ed7c7bb43d7fe734a959 +7636ca80ee97f6d88550c39d36db458997a98e8bef087c1000add77f8c6d24dd +2e0f6f4772ef61c5bd5148c3d67dbe77df27a300e5d8c9e4b325a6d8cbbe8675 +15ad15966b130bf4499ea1923bef7a9047eb1b0d35acbf0b8303fa08b26c706b +7368332adefb42b66dd9ccf61fdfba00b5aee231c2232e8d752703b0af6ae850 +ab8274563f8fead4bbe9fe860dfd95a6a7e0cfa3d8f6ebd0e066cdfd396d8c57 +f8f17bce0c5678649034a62418dd2463b8f963b43ca02d011a9a1ac4aef9c9fe +151ef8c726e376158dacf1131f0ee855156d95730d3626003e51983624b417ad +c258164ed5b2bd3d4e562f16da8a0b69871787cd9142d297ea3fadad3c2c6dfe +3491c8313c2608cfb1d6a6b21d9569049031b0cfc1d9e96a7186164e04d713a3 +2f1350ab08811688619335e7f331cbf390039502cfa7f68ebcbd75937862add8 +f0c7f498d6695e9d48c4d3e07753062a992675f1eea3cbae77c7bf35433bf424 +45aeaae7876749942982520abcbe95a7ceeaff412a02f6922a1e6c05e9a94d82 +11db8144984dcec1d1fd6418934a57338e070b19ce6d45c0f861e429b3828c9a +c98821dc4ec4d5b7f64cfef16380c478bc5a0ea0c4b82d94e3e01067b3027c73 +e93899ee5f37db55e0be88844dc7c5a538e43510a65716320dac3e01e164fe26 +3406de45c19c250cd2a9c3bb3bb7cd5fafe16d9eb7e00d012b65668104a68eff +bd0c11b55497378896ac50abb47a6daa32f7c21cd34b19f3f797d883fc8745c7 +db21a910abd7e9733239c6751f71b126bd8e26f7cb16bcbe5a066cda9fce63e0 +a9d40a9527bdca47211648ec231d0aad9f4659cad640181b76d6b02309365348 +4e7e328bb1f7280ed4f8fb571d05a7a55842ad1dd294cc46cda410160f2f7c09 +4a34dbb0aca809a6271c8fc97f4103bd83b701f2f474e0bd1e7f37fb7d898e16 +6612f9b03e25bffde2a8d6ae1dac8b7c28b67c371ceaf8020ffc9e1e35973dee +63cfb07a6e3eee03799b4841d195eba565c03e10998fb80fb279fa123c2e8dae +94644927b473c414c1fd0fa0b359a279310e23fe44104f0988de3345d9aab3e1 +e64dd94ec8a6c20556d785e7e4f4bec46c0de73185fdf9a84c6f46ffe7c52c1d +c7d62ad792987dccc225abddbb6fed504864476f1e8d0e2ae009de5f4c50bc6d +8d3902c6c169cc0c2008dafeade6308daa473bc4f8af398ad4a8300f6b989271 +dd59f6d52ee210bab4028b4160979401ed9f626526e43b2362ff92b208a29b04 +8110c2801db3a59f1cbb89139c80bf025d45d61b2bbb6fed4456089976a94d82 +a094aa8201027413899a402050ddc0421afe5d357a8d8e0ab398e01da601a0e5 +1c6bdb86ca2d064b2d8af3ab7a8d39a564d2c2cfbb74f62aebe4c9cdb668909f +2d83bf84894edf23a3db2d3b4ed77d091f21ff313c67a0abab68e57a541942f8 +58ebe5334687a8dfa0bc1eccfcb1b793d5aff3d7479a72ef70b3490f7ef3dbcc +1beef6d171dc7cf8acb25d04181009407b2d61dfb7de55cc433272a46e86a74f +a8a5bc69419e54c39220b7b3b716c5c4cac5313e4d8e1389a2217de9ebc0a4eb +f72dd28b7b2e7481457123167f2a138a2a9ab099706c81b83e3a02a9f9e2e321 +c9658c611fba436a649d72ab9be1707e3711d20e15d778bfeeba66b09286be38 +2f903ec637a8ea274ef8a8c488c5cfeaaf616fa0e090ca2c7a767048b6086dc0 +ea0e3bbc8ef9d01a74cb264b3ca824f0d6ad786127c61d0d8ad13c31e5a25555 +ef5e64e1d19d150d24d1459e8da3ad799fa554dc7877a417f51dd1a3a02e7341 +51b6cd7a2c6915127017f748942865f30fe048b7e749bcba0e015761c0a9e1cd +e1cbae4bb1807245d7547f062a05c1f13a753eb6fc3473caf620347338bae987 +1d2bf08764c309b32b0c915b4735481e25259f53c53c144b8ea3e8c2a4dc2725 +85e197f684936c0690e497653a46a7b86c7e57b8f4c890319279034cedc18bfc +ebe1828d23cae6d1fa854149d1cde376470869f9383e83ccab2af11c2d35eb8f +1bc9273cd399c7e8478ecf742c2db209479460e310f8013f1a64a385209d2e30 +000d71f5fcf62f251989a3d852b9c36e57273a60d565aa387236f61162e46821 +9f755ec5501247ae6bd14644106c04f36662afe7c3cf741664c6a4789f3f8ce5 +baf6e347f6564be8d6fd92ba9bf04ef31c9fd60a2650b1086f9a244a113d85e9 +405dcf23e29d7b46281baf01728b7355b8a1e50febf4443c2d1a2560cd47d652 +cfec6f5cbe060f8c1b20fd4720ed00186609c40771ec8db4e7e4434eff8aec89 +007816aa98863f8f8fd3ca454bc228bcf4d2522d948ab346b5137f1cb52b5a52 +3877acaca92215b9fba427112786c2fac9e5b57879d28249d2d71040aba21fc0 +f73498c856cbc6c5a5f25bbcf19ec97768b8ee9aad3436536a9ff8f22ff72206 +8555d0356ab16b1fce02b79220323bfee1ebbf156308bed2d91febd3f3a13927 +be4d619c75ed738dc1913971fab9a76bf697c6ce9db692d0495abb1034fe31c7 +23eea2feaee80aa07117c16008a7b5e00a13fe2dba4c4e3174762c28da98a191 +0d15eeef183cb994c829de35324614301a6e98311d9f5f282d28da1b485997ec +41eab629352822a5583d307d6d417b869f6dfeb158523a581557f6acf91c4f28 +ba0af9e428099b152946769932a190410319fa3cf1274c6745ab16df56afc3eb +4e67f521dd52f3e3b38e41d0055a8bb6f957817850d693f76c2237f78ef9e660 +9ba5ec79bb0cbb08f461991a7baf70e3f8c8d619c0ec7d3d7aeb964f2e8b7113 +8e9868c98d8fa3a5769147fb72bb82ae844c1331ab285dda9df924cf36f2200c +b0c4b28f19aca7c4591413c8e89ce410d469a7844af4ad00b6089d1efa64de2d +49069a4094f2af0552b68fbe03655686cd845e46a319cebb984fa717b7fc2565 +4cc9843d079512d8ad6d58d55332a962c7b20514d1b53818b47d028b59ec1176 +43d3571e690531d6980c0bbf2150f5afadf3198dfc48995afc745a8fd0b40b7b +d48c00010ebce60dcf13ad056bb53ad3e7a3d0984dc28b8b4aa109ed4d62bbf9 +9f7be92fccdaab5c52cda9fdc972e55a933b2c4c1d2c54ed5d88ec8132d0241a +91fda05af2a736547dbc1da85588b04ac56602cd9335d9a31bcbc50a5e13626f +f86b9cf6bf32d2a5b6c4a3754f9447e2eefdb2207e1c277794bfa5defc88cc63 +1ff2093a0100c2db33baeb231846754a10eafd8640674dc03d737446a345eda9 +fa03143bcd01de7aa1486de001ff31f1f7e67681017a32dc46f8a9aec6cc0573 +4a0253dab3476519de29344ad7b0eee93d0e4438bc852f4ff4d018a690781924 +1730a369bd2312732816efa8000f0b30e8d19b8551857eba645f76f38257d96e +4088b20e11f5485dafce80ab03820127a291acd4ddfadd039c03962078aee0fa +6429e748bd3ea0290ac67f1c14eb8f63cd5b7f4a3e61b91f3428a73509151784 +3ec501946e468e8b68374ff8b0560cdd38f2eeb263106ddedaf7d54ff1ed7c65 +c9910de2993171eb6f5d9a4f0fc3368d6f6b5e57e280fd9c5c1969cc814d46ae +81c2ab001f03e1aaff8017b6d7e84cdf0e3a747daa3d2e1d674cc49c8049e8f5 +8914f54313f1084396beb5defd89dfd0d73ff6ba76ece9939b988bc5353f221b +e4bb40b79c19612319d196938935747e96030a5df12caadc7afe24878a2d6e82 +5230548f931259546b44b4460eded3188fd76d06a2d0392e2371036401e9ba72 +a14e50d6aac474d148a40872f222d3d3ea322c37aed0d04cbe2551e513e40943 +04b30dfb33710c66f3df8e24296604bb84e3e498200d942bf52c452f79b855f7 +bfc47420a44f80ea16be3f8e0716695d20ba1d28739ae88c04ed2848b70d7369 +46734ecac041a14ce87397706f1ddc57144b7a61231a1d0e458d3d6d014ce66a +b6e37b46774a7a9c74d6a5b636303d3002151be679abfbb7399a0dcae5bcb5d8 +7c84bbc66fa03df92d4f5ae78e85313acd62522caf4fafd187c553302e692133 +f7971b24b92b9e0321f93e7b747bd6ae5f51cdbb247d36255740752549bcf8a0 +09e774a01bead6ad931c11453a179e0ae2d23c09acb7b2bdcb16fbecf07515da +0ac8a4b2728b3d5c8945aaf10fcf770008a0aafd33c402b7304f6b203d0d6a7a +be7a27608b10f9d67c39f5fa2c09ba5900f0a6e6c6bcea1a0ca14411ada0a36c +d19c25ddd2d29ab25d4cb7dc3afaa0f5aad7e22761863cfb427fc4fb8c991251 +31cd3376c227747a6d3afedd341a4e6474ba273e687640eec85bae3bc83d762c +3380159c2af1dc118fa1bd2382d339c5d213bcb89e89fc8241707e9bff40ec4f +85a889421643ce7a87953bab67fda678da5111da8a95f29290ef70d672f0ef5d +ce90ee85275392766ca752cb7a2bb9eb416ffce5166a955bcd54fa2082d942c2 +89a0fbac57b9cde759be0b98d0e6f5b51c7dbd6331730a15635edf1a3287c679 +61c0a248578b53559a3d040f8847813ad1d76480c43f4b674bc0659bebf9f1f7 +e8cd4acdc0e0fc27104601abbf25304f8d5aa221e02e73c37868baea6106e069 +88a7b580b091e6c4ef56e0b52bf9055039d2c3de83c3a6d4f8186646a6e1ec4b +5ee53764f122509d63e339c51b15fdfdade4cba2880c66bd607977684ad01aa6 +d405553066de3d2bde7eb27b332d5bd0371881eb0a9d2c2b7728f827444a13d5 +758591eacaee4121c2a00c05b58357d8053d2223490b5124fa646965a0ddfcde +0f99b41916f8f80d81970753daa6079aa0014e800c54052e01d0861a7d3add7c +2b542695ad2a3d6c56190a170d23bb34829b049e2c02c69e79d597fb5d2f9ce2 +713d681f072435c8e3740fb61127f5d3bf4cf1adae5e99e66a0c472076f476c6 +171660a613a35eae2d353cf78a06dbe7dc227dff30a501a547241c6cfe8123ae +053293e9ed0c1bca42ceddc775a9200420a37ef81552b721c077c005afcee2fd +fb2e9088451e0260fef0be7dcaf9d0e4eeb3557241bbe429583e4fb813fe1992 +1ffec808630e4b3e64cdf9d2e664802f3f0846f0216b8422245a0363a2a6ccc7 +3f7d8b39438246611428c6c32584976b10375003469fe0efd968e21319e382f7 +50c386b57d7b7e8e4b5dd8dbdb8d816ce712bb7ec4d3a2ccb6fc5784c066f79d +f9fab8f575b42bb18f22a7f2919364c61e81cd47d0b121bc0352247ad8d83ec9 +36891e106f85e8fe25efaf00582095dc7f16dc48b3cfbc34234aedfdd357643f +79cea8fb1fa81b91b49f8c063fecaf8b8bf0fddd8f2063eaf6464de3e963acb4 +33a3afa3944fdcdf61597fc7d6caa8e7538a784024ed4cfd497ac35c6796fb14 +65aefd0498b994fca5c74c003c6ea1d6c8f935df6ef5cebc5ae7024986be09a1 +3a368d9da9061aa8ed1015a60778e63640addc44dcf2e32bb1d017f10a319f44 +fc8aaad5cb149ebfafc0dfcd665b07f6387f4e3fa9273815a7c0e87390b89964 +18fe077d8330190a04f348648e1eb790cc3cdb5005afa7dbeda6e102d848e725 +ce4d4a9a9e7dc16a9035892a73bfbbe130b8d059e0282693ba7f062ee031cd38 +edbf41556bdc7c34c6f2547797f2b4b202fcea7d6c1f6d6a890dc850549e2d9f +d4fed66e6a66f93ac27cfbfe938832d17c171729fb0eedb5befd2d07fee6db06 +ee7d2e5302904d0ca4b21b40e3ed346e6976024f6ddf05ab1b7a339c42d2989b +8afb7447b2b772f3cae03abfd55b1d14f412109e7e99057c66ed1fc1c842e336 +8f8ad95e67626219b6d538fa55e6146f7c4d2819b6ab69628d3f918d5c21ba65 +6101700f2f9b5d5399a1209e0fe5cf62cd4dd8b065abbb2024b7766478b78d89 +3ea80e633d445a240e27c7671018dbb01e4b38beb85ff02de34a4c06a092467b +2409c7a6f7d94461d55073a87ced3a6048ee3b688042bcdaf6d4ddbde6edced1 +7c0b7a2317e60410453cba8646e00976bbf1542aa0614f93a6a323de99774176 +bb2babb068c8c29bd4e4cb7f8b3646ceaddcdb611215a5ee9e61bad78d8bd5ff +f66177e2069d7b4f87c6fb13a61f2772e8632f158b4f1cadb8e3daf55e5df78e +9d50a27bdece942f579490f570d3eb34cb69203627abe7bbb6c5b2323fd8fa7c +1a9271f36f727ae3bd9bf660514a052c86625b1245e190fc91df37b7e6960fb5 +1396405a4f2de27f7146ad45f9e5e14755985c189cda794fa21d336354bedd98 +14ccc92cdecbef77ee962b78d053752a22f5ef66879af4d77cc798b2d6579d54 +9077dafbf4dcbe07c70ff56070ffcd869bbf2d96271e461c5432aacb7935ac07 +fd239929e5d27e34c91a785fdcc479b84a99dd3db6711f1026a613d24a6f5de9 +00e4a410ea22a81b1106f6e11edcf83a3a9f3adba5b22b129e3d8f30807303ed +fe50943d68951bc743e7391d7aa1672fe0dda7fc8a6c2e87aec891a6d8ecc050 +03fbb9bc38114416c4e330c5b7b43ace475f0c8edc9abdf5fc137c9e07f1f8ea +bb13365b3f7e3dbce2afc9388e9279136ec6e0edb289beeaed74370bcb453884 +3ce1b3afed75a47bfb50b7bf4d267b014f2480cff2d9e21685a64b5a6fad8963 +1d5ccae56079f4871aa6b9b6a7ec8982f266b6eadc060087f2f7af187dadf05f +c31a47b30f2a250fb501f4faf7e18c3aebff55fa08c74ef27d96aae869a26b2c +45ba8c84b958db1a7679ad0e6bd09c498543e6d20691b072d84c6760c70e8e90 +ec179e6d00f684e6c2d070f894b98d495cf2d2978b96ea13cebf5c8b9ccfbf05 +72a00358a8faa812b00c06f2ad40237839f0e2ecff57d359a2c2055a1361768e +f816ffec8254c512e3d57ebb23da610fdfd5e1e16b97e1fe97e10a279a203e6b +b52f0be0ae9742d1a7faf2a0d5d6e1560d6a3e8e1596fc57a3288fac6a541646 +5ad8c50485e42cb5214d4dcbb82a16c2a15d406698ddefbb5fa3dab291c4020d +52b76c9f0c91b5516143d99d82611eeded385015cb53e07a30bab7f27f22ac73 +95210586bd245bc0d2366952c1d85ecea90e68e189fc313823433321d6ff1785 +0d8eb6f1e4f2f6153d84b4b0bf198ecca9c87a80dfc33977a9b06e994bd86800 +4ab2f317727243b9c9704fbd88a0e6fb5ab8c94f38c7e20daa078edaa9878c8f +3509b2c135e9801c79500327adc9537318d0f6b700fe99166d4e7c8f6a41bd45 +6bda6719e0ea158b8aa25e73731e02d215294d91f44985ba21d4045b1f8dcd99 +69a0b36e07b3c7534e9401960683ac1696459b2a45e0a4133d630e5bc81024f0 +b1ed05e19a6991bcab03482ad446a1d542249cc9e1f13e091508eeab9f744a67 +85e3d64fa0c7c79275292a4284f62754d46c0835e432c3a1776396feab389c20 +775f2f94aaec26813eaffc4d1e6b4df16f7b25ad9cd3e8645dff53a354718283 +e6da4a788dca6de2521295f51bd4b41d7b1f06c02f9cf60ad1136425c7996c55 +a00798c6f180ee8bdf52c71c01b48b3798eff89600b2281d68fb2e8567d61d22 +9b31ddd64b49fd662131d12bb500ba609e2f298c237b90c17c4a29e1c4e75ad5 +c1631c7058f7aa486b9c19c760b2bbae67167472490d537d14c9c70437d8a964 +fa40effa6af2862db37b5ba62da47685971093e11103228b85a6a0acc3168486 +cb4d94f0b1b01bb35ff617b5b36a120f82f783752079b66cfbfe2088290ba9c0 +cf8255443a6230274299b82c7e0078a9435c2a48ab298954043521391cdb627a +efc038208a97a62fefbc2284290e83c78fce56f1f6aa31428092800897d6adc8 +ba2c0bdb767e9b684dd51cb44dafbdd3f084b3ded0fa1af187bedd1e7271ba2d +9b040ce2d98fd7a56f82191756bb8f582cb83ff0188350d8d5451671a2bb3478 +97ee71a4621d366d810945c790ec3bf4126eee53265a2ddf2bfdb8cb8d78352d +8032e0b87fb87323d4defe5c5c974db8cf06203d0cfd1470aeb474dc0fa2d32d +e1ac57cf43f5dc2d2751c84e10a5055ce00c594a0dea8c1f65268de077f06ff5 +c8e083d70fac84a5605eb80c81bdeb92a65fcda58979a93566b29c935b3ad83c +a1303afe4eef046c2ed3646c0ced2e1066d4eb7f5db11f171b2440a0ca362253 +20098d9388aac930db7be1cffe5d6eb05dca2a6355df026393b99ef5e3cd70c7 +c82ee1fe5cd113766bf011bba63e78b2ddf4d86519aa68bd991d782713ccd2c1 +3f2eea70dc273576aafa2a0d2ed22e35f246e92d88c907425ad6843abbfd75e5 +78e1cbd1e59969cddfd6d26f89e617005718492b51442c55fe617da67d8ebe5f +bef9bf22357a125d611e04d9e5e28d5178c83e2c3b073c205d7e3a792d4d0232 +c70e596680b5947e6504a7aa48c67795a15160d49d40174fea72dcce9f97edc4 +75d030d02347961b7d725b78c7024f98aa0d4fe953807b39632f0d4531c6c1f3 +7062320fb655447c355e55dac7faed0643d33f14cced8ff7398ec85fd93bef6d +e6032c7689658a96cb9ddd856fb6c0a4be0fb15bb46c068673374bae1fa73bbc +20dcaa9398b526128991d68eadf0b90bdfcfd097b2f858363d819fc6ca7fbb47 +6aa237cf38daa9653b5877aa322e3039f86bf54ca078c55a35301fdcad322d14 +8e65067a0e48cd62cecb0d7f50faf272b51c6d0a22c402f0df1373ddef2d3c2f +25f3c636f9f5f8710bdb1f5998f2040b7bc4bf6dee428357a695e5f177feedc2 +be6ca3d7456f4fb7b97803df6de76aa4bd622cf080800628d35841a838371511 +04623706136658fa3cfacfc116a30542f8825d80532454675cd5c9ef6640dc79 +aeb9c37a0691d14bd260f58995b7ef2cbb236da7a93c042450d940df347494ca +6d5df95bd04d3077b47926e34610583984253fa1cbaf4b0d544e71d5f7405e49 +41445c23b0a1c3c6882254602d0ae6582f64dddd079f2d112b0dbd31ca685bf3 +dfea6d3f310bea2b2f4cf4154cd37fb19016f703a1f9a045c7e21cc994c0f23c +5e4a49d0ff47deee398d478302cd0c90380885ab4a59b6f3d50bfaf00d9e7f3f +0b97562161091b4eb201c7bcd4d1cd239b00df09d03836a63e8a9419cc9dae0b +493aca2a7fdafe0ff81b6a9896c7e57faf1355fce5f3d54afe62c018a5211fae +935f1f9795d1606cf77673b699829c9a136c6534438ff817759f8684d5345417 +70f6554539184ad886156fd610f331532d0ed22685d56ed02fa51e265ff34a1e +fc8cb40b749148ef80016f71cb0647e1232b7450237f686828c36dffba04aa6b +46a526e693da4fc9e2c84d7245b76ee7dbeb360b2f92b112de8e5feb3e433321 +eb67e59f3a41c7c91e5fc51e811b2ea7a70a9562bcd8fd854d761ef290ca50c8 +16f3c58d8e48d13edc3ba242c35ca241fa15e6243aab8f4b5441cc0cffc1c9e2 +7729da8ba3fe1837504d73bb13ba53ee7029aa5a1b137244be2d16ff3ae6cd71 +8151c53d223def6463c124acf3c37bd5a42e4ccfe3db5d3a22f249d0a5cf59ed +ab67a3a6cee4f7838314e9e167d3ac722539c6a60e5961cca947c8b9d818802e +54162eed974283ead7dd09fc33bcefe33a78ae540a98fc6710011f0cd96300bf +e5b9acc91af99c6b38d005481771655d1b89bf8fc5fa8d682ac36a54753a106d +6cee95baa71b131786a76f6ca7cd143270f679c91635822a4a2285d6aa44699f +38603c3af88b82d5658531bf36ff97bb959c44345f51ad2c990347d7f803c2d8 +3345ba5554ec0af247e7ff00f483ea94a3a6407a2d0ccc9fe5a530139336190a +166575049e84f3964141e64f9f9fbe2feff15930340b49adc782b7ec9c2c24c7 +816b7cf5e7aa3c194b3f50af218aa2b1a69e9772a74cc661a96100f9607fec9f +0e6a34b6d3b9b6df0d0cdef014c6e3ac43491883a33304b464c3219b883a1f2c +9a1f882449ce7c0814be53e0a26aedb003f25f8ed3f9506efadba4b8133db373 +d66c0fb02ea5d1db6484418398a374bc43f624dc1dbcb70f9b6b97691d297b4f +50b0b7aec4de5732ac5db32e488e8131d763ea2234a8b6ba67acc6ba688c3f09 +b1da0f7074b2ec71ef2778dc1dfdfa2b27d74756a43fdf2fb8be3fdc9189166f +5747a30bfdd73b8507e6d41bff9607a770cd6d30a8b476cb972c896b90f15057 +f3b5095adf44ef4347da078dce7b6a41f01c29abb94e2c70e3b3a24f4169f80a +7eff7a9b53909f97160964eedcc0862697c872a164be415d28661702c33f4edf +bc8c172fdcd3e70d3db0341ef1ff453232617b89935a9249bef30cfb7115addc +c06bac8b37d4363710731a69e3975c983b96bc5b8033cf0c17c4a6dee8e45f61 +53c1683d296a937f733c332fa08bc9f4c5455e308733567fb7b51300c3dd4665 +15a2d90c58d2155270e64f2a555f45084bc75cc2fcc2dd5ed0582943a7a5359a +4fab1a5310c083343ccab56c224f114e46c8e6f8233e9fb01a352048144592ee +fbffbe37b26c257f91220d792dd0f08da33f10baa54d92044f24646f9b998283 +1bb052d3873debe609ab925b8cab12a80067e52adaa1bc0f469b0406c975a17a +c99594a7a8c7ff29754319338e16508989ecf307e9ea3680ee18cee760a02b76 +90e09970a402bf91895df85dde19f9f125c75558ec5002cabc1d4ff0ca1dd979 +ac53b2d742f45d787eebe0c983e12740ac3b74eaeb8ddb0a058030e2b5aaabe7 +3acc75052330fdce054d0df654b4dc7cce4b07b9e48abaa918a2c45b0675a360 +8f9aa1f307b1d93c13075a57903935978e764ef45628f219ea21740a2c720dc1 +4037ee1edec2082462f882bba13fe63a335eb8c18d95c420da75b152b5791200 +2dea7d6f2eae40f84a622f33376da36234c4baec46bcddc2a7874ba2f1f57b19 +b47a7f3a4f834b5780eefc08516d223b42a4e201194f03cc94aad45cc49cb238 +2f6af71dfd8abee459fe9f9e19f1d52659d6dd9d378c4f06c39552012e17e541 +f40704a1190b5887bd0cb07fdf4a3a3adf04639c237242cba12758e371dfb2f5 +5871567815806e74fe8cafda5031354aeecf88feaa172bf8f4cd9bde36362120 +2938fff3f84180ab0d5e2ca492631ff71835add3434bc1aca1589cf50ba27fee +f0d86e6de410c00c5a40188a91c01d944d3b941ab249ce3de0dc988482ac835e +ba5e0a045a6dee34f7c92ea4a1dba8c403d614dfdf3bbecafc61ee5762ae4f3e +11511eaf682fbd245d75530476c2151c4ff6aa7959c5dd0c2f54c483ea556c95 +8774853ea5f841577eb57e89aeab3ed00e79902cf36fba0a18e460c849f4e5b3 +db02888493dc249f1c1f44bc7d7011ae65184280f5f4cb19793b3bb002a439a6 +5518fae1d5848e10ccc01e75a77fb1db966111754111044e6bd282ebf00b3731 +7227ee6f76a51e1921b2ba047a5f1f09f21f13e1cf44b3582af9c2d26df159b5 +04738c1d27acd2c898ef8148f9058dcdd4ce885927ef51c36b43fafdb08dc186 +180df681f94cb9b84c298bf7804280162f58f62fedfd7bc0e9b8214992f4063f +7685d655f248ba694252e5ca13623f12062c4872b5989e13d9c162773f976144 +cc8fcc96013595b498562ae4261e7a1efede4b79efbe7ed5e4398d1d9e66b253 +a0f99f969c15fbdac089a5ccabbbad21402852801736f0dcc64b0d4d7cfcad33 +ee75b328427178082a96435c3c9f40e9cad04d223ab295eda1ffb193abb5718b +f5efa9db4ae428bcfb422ef2ecb16225c67def9ef76ad21cf8626f46854ccedf +885709053e56e6e758824ee80b0c8e4d67cab4e5d6d9e92fdd9b99912c709ff4 +57d0ae3c258229551c93fbd68e47b00bd643872e5ae53f292866e566f2f9787c +1edd81b005745b10fafc9911644c5fee21e092fde448155c9f69ee2f55c023b1 +2eff9b86a86f8786b26069ff3f2a5f7112070db4f4bf93f40ce24d1a5c4bc5a2 +b577d39f069f506f197be8c590c73bb5f44ffd6994e2eb11786004c71d349521 +2efcba99561ba4cfd479ffe07ae4c45f5ec38c164db89b192d0dd7c07228bf2c +0ca8374f377c4b8ae58a265cee76e71e952accb01a9cf1676faa4f49dc456c9d +c020521a2e88d2e5c3904157d3e68158ca53371c73be43bfbe2cb78e3e1a9a15 +f29359be03fe111b87b252b060c453fe8bb0ce288a37907e7648352fbe66792e +e4060dca4506ad6a7a8806951df8d3d29d0347fc5f4f408472edf2c4abdb7418 +28dd1afa26e6e8f84e09308bb68de881a61d106757c09840e49993551dae5915 +a28a25ee7949c3a00b7f33d3b2ac252f1b8d0896d3116396e2a7fe57c028308d +d7864d81cabe4824bf15cb5778b941a6b5e9e46539a8206f8bdab18e92bc0aff +2f7640dcdbc2b04f7cf5781345ea8513d00c7a22dd5f1e43b60ba05acfe45572 +76ff2374e36f5132b884ed8dacaf72d5926bdaf62a16715486bfcbe4758ae053 +687031d0fdba9199fb4221ffc9b12844c4d2e94e393f6f4ff2d6842abea45372 +12128d3234738783ae23850090718bef9adb55d26bf606dc4736e8be6ab5c079 +d5a6dcf0a6f1b1df6f33ea9c1cb5e916aac2b80395522382a1801e15b44e97bf +c32017aa2eb223c188e63a7f5e093b7354bb25071eee2c3a545763dc93e44e35 +96b9dbd7c4b4818fe8237ee258a2032153fbae62f5dc4afc16bcad79d2550a1e +2221482e072b9ff488bee9730aec44740b55a35d9454a4afd2542ca9e992d781 +6fb6ab598ec696cd7d58db737ea1e72cc4e4ee39e1d50cf8af3d94636239bb87 +2d4532e783ea90cb1c8278a9541e90aa0b6cb5a6522617b406b495cd2f9af263 +6d9e9453174251786b4c449aa9ae25f9f48d6eb00234003a421570f08b3081cd +62e4de0418033395b45f559ade69a75075f363a13add803d20d13f54f0f6fa6e +4061f653d4021f3eab7808ef212a5565de8ff35e46e8bb02660326fe6bf92cda +02f4990e9c9653d2ec5687662b965468505f26d772499e649c3a0d69e118247a +72077084bbf6828daca78ac4524c599df56a05ffcf11d073465fff2c52b8200f +2ab7de3212d573455e4be882a31e3f3b92b79a9fd621c5dce0c70f09df800df4 +8a594435652f454905ac19fc7aa3d43a5a5f360778e85e0b6b82d126136f4858 +3796833f454bee0f16c40dd79fe440b263d9a354ce8e7dda6947ac89828f0a0b +4ea40d62a651421c15fbc2d271cc47116df9ffb388093efe6a3bd4a6d21150b4 +286cb50aee34371b13083fc5cb8ce57ade9ddef9bc4a77f5ba71e9c71d159199 +b29203c64c53041e38b413b901e90bbc9c67378734c049e497cc67bff03fcac3 +684c5f18857fb8a0d941660e9b04b55209241226cab4684ed71dc9a212d2a7d8 +75d0090ebc27e3ea81cfe4daa0c3277f91544d134cec4b5da927a8b9c0727ffa +9db44a2d6d9e34a8673903879b041462708af18ec1c658f83d4f65d3df623fc5 +db60e9ca57db545ba05c10a9a68e94f85b4c2a42a686de90a50f482cf150ca6b +f1758078bf655b04bb9cb71336c96ed9b1a217d9a0619a747cbf82c4421f5520 +3ccb5cac0067f83d17b6e57264856491bc1220aa9b628ce4252a9932aaf5fd6a +cba6cbc11a5cf2d34bd21c77f3963a49ca746d4f1661cbdf2803ecab28f50aae +66d2c2dfb81f0aea5fc3ff710a5e35edadc08792b69c4af174fed9cdfb2e0c43 +b5cc87adf3fc71121b1cdfed660ae99d8d036c4896362463da11a7d7ca08c7c3 +49ca8733021acad25f152e797a946d1b4010deb8c6dbb9432979556e0cb80a89 +493d58cc933e173cbd48118605bf7de3e8a909519b1f7d58c4b9811e7d3b50c7 +297270d1c1edbcbe0f4c3e93143ca44dc128eb5b17d1cdb1cd8b8233387b6270 +d2a8215407cc1df046713aed6d1495150bbea29bebfd0c08fc1124a4624b7cd1 +fec7f156f95321825fdee4c0ea668e2fe1b0d92d6aced305ff511f13ca92afd2 +e99535de55a09a3b3e0355645df6b4547a50c2c29a2536cba3909bca6b761b91 +caf5d4ab8e9eb5cadf71eee71f0433b9b9d9ce0394b5c87d38193498f3961673 +7a748fdea2248f936dadf0d8952c33a4ce3eda258cb902f87e4f623c77151eb9 +18e6e4fdc9537fbf03b743693187dae6c9a749b5c7c07c325b9b27b025c38b48 +c5ece2d82a1b982b9d058dc49b33aa425e7eb79827b5a62a4bd7c5bd4488099f +f7c8d9aa169ad961e17a946b4e65599e268a2a96d53a9c0147da713517f0bffd +cd992a1ab06f6057e17eede9c7f9077fa60bf4f11e885810564c0f40b29ffd2f +b6e9a8051c661dfa341ef0ca3c630e4df019eb057bce4c1407f9185a8ab4f882 +81d175eedd45086905342282d26ae4df524b713ef2088451f1073a59acc3a1f2 +4004418469561682e72d20f59cb9ad4ee5232aeefc996ccb77fb3beb9a635900 +06fe6d2bb606293d40410919e31db52063c87c17584854d108f711af8112eefb +890429a772e77bd03e50db3a2a1ef371268ea9cac1bf7bb15a7746790d67cc0d +a592fec74f0000f2d1073985fd1053537a455548d43a12bd556063a6fafb0127 +e8c1190f11b992a0fd26a3ca823cce5fcfd5742afcdc02a790a25fa57dc9359d +ff8fb3550da075e3eb3582ef454c92493e1578788f966db39d0038d2cd7811ff +da49bfeba9cfe0654b68fc512616439226b08264533f295ae94108168eaf284f +290d61a62e8c8247b66a64289303ac847dee0f651c1b4575115d79a9abb9e71f +8cf7dc4b3db7c835f2abb42c37456fe3202ed6ce061841723bb2cb759bfc78c9 +07c51737b52469f1f2dafa7ece85cc798050dc1bb63436c94ed1af3a0e6628f9 +dbb10bc24d2a6d94000b2d142f654a924911de0779ee7ca12d82e04bca01b3f0 +bf6d1679d8a4210bd58933be71e5bdd9e22ae192637c90e7b8905586d8312945 +4d68274af56c5d9636dd4976c0c8574e7804bd8fac44fef418eaa7f5a0410be5 +a4c592bf762ef8e66132f71378c37ce7c1fb485d5be0a27628125cd768ca1427 +790fb8c160a7f94b80188dbb55184ea6d657178f30c055596a370c9f40dd64c4 +f7246bba74679a347e03d7037a4994f348c8c4874df31358f02157132f98ddd2 +322231a9271018a49672897625fa0041550c99ca2cac35cee4281ed9db5cbb0a +229fecf98aa5facfb951a1b116ed5c58cf4015a9bf03a0b1505132a46ca6b3cc +02002c40f040e0b97303ed8c42d9f62a95610de3506c7a628546f9e4d6e9973f +2a77cff929c7a41603a99363dd7f87f3c076990546e7814ba3150d70ce635943 +88152a0bb6d23bb4b0ad0c7edda0e5fd83842a6c2db044330119c3557ece70ef +8297d1d86334958ed8037d6fb57ef20bcdfaefa66d2f02cf9a074dac8097469a +b35a644035a7a0f91a813aedb3d9ec6fe2ded7c9d5a414cf394dc646df0510ba +f27f501fb2627834376f9776d4f00869bc8b0189ce88008503bb16bbc588eaa1 +edbedee5e41b81774054df5b31c4323c4f2d2289f018a3d07dee4397b69470b8 +b1d64a694f1333130b5310763054870b88d2d017fbd62f3a2d042ddbc4cf68f8 +e1aa1f790bf2c7f598ddf275f11899e46d18d9ce4645671b14617cbee762a485 +95bf927abd6aa985c1bf117d82727432b8cc573197cd87a096daf130de5c101b +ded264c14969b04f8f55299ff35cb77b033a1752ff04c96a4dd43e9e66fba118 +9dad547bf90c89bdbd77200042172c6243d1c465751dc96f5101eee86c76e4d5 +435d1f1fa667e7b575760681d8ef3b97f01f58e2406d3aa084552ebcf985ebed +06baf00f2098f01976db0d4a36f39221b08c00b680ee425a9fa22b5baeb571d9 +31c9009a03a88501ca1cc8da7a3afaaceb87a92835161c3f4c84970ee219dab7 +ee9f5542d108b9326d5fc58cadc39d10527d481d303cc11cc424398756932aaa +b06d5600e4d24a0d7dc36da7e8b32871fe36e59e1049cb9ae8c361c3c3ebb365 +5ee4a2facda18377394b68f046655d679ff8122da647ca64df6a7b99a3bae5b9 +da56fbfdce787f9f8263eae5e16f348c22aecb06398d714a69dce1a932f2b50d +4964641ded3143548e33c879b8c03206f6feb025268f61f9cae4642e6009c804 +3adf0e4a1b5ce27a812559bbbecb7402ac2a580c6d8471dcdb02e6960fb51396 +4058ead51e6b121158c9e3d0dda75439e6eb47293c642c60a70bd9307ef337f5 +ef4601dc0eddaf6d675d17e37350ac6bf3cffb442a602054b52a5ec600f883d4 +cce1ff0d70304522df3d2cacb5bcb2cb37d453b76f7d4d915663e19c6e1335ef +6fad8e7b76fab514abe26d837565908135cf8518819916bc9f0db07fe3b6439d +c42de0dec1f5110b8fa5ef40289834953438a7bf83a6261dc80cfef8405eac76 +32815aef696c5b86d2cdec5d3588bb8fc5e9dc61d97d2a5869115c8260f31f06 +986110dfe2c477f80bbf6b3d9f59a6dd573eff782887c9b84bed766b63fdaf13 +dc4ac55b7a127be7c2555bfdfb63ddae8346cd6ccb6c77ac057bdb1c51372603 +8cbb594119970a50f42acae2b9d69784c5f621f53292fac082bf8a78c197af6a +8b56466e9b14f825e45a9d8f554db27cafcae033831219f6bfb6e3568c7532c0 +ddb22ed77cfd1f46bb98480d1cea4800e3d2b8f623051da01bde6c8bfd1aac33 +240f6f89d49c824e4b5d8bfed9b536fd1773a3ea254d2e56725861a1289de1f7 +8960dd096d6ba285716881f26795345504bf0685127d91c893b57122f858e1f1 +93ce8270796fb9b0fd7246445d484005689948c40376a8e612fb8827965ba50b +565748c8afb55247f32feb36a4245f136d6cabd1f491b753eca2104199bb3f1f +461d1be91c8ebbe6379b2ff0eef8a6fdb5fa98029d7cf458e17e15631c2b63d1 +72264f66e45a8c108460e3e353997d9ee098f83537a22b5cef20fde0ee260b85 +c98befd03e86abce66eb6551625f8dfe379a07f53c32888e9e4c04817d6d5abc +f02ca074a8d11754f4c6fafd3c0751886de2fac502bd1d3d9ec6b56b4d5d5c01 +90aef863969d280220e45f9bc52a18784cafa7e9bd0aba47832cd22e6c0cedb6 +28cf6a1eea4e519495c60be2f0657a43f311cf331e83e9e8109b6ca5235097e6 +d116373c76e9dce208bbd9573c7b815e33e3e39f8eda3d1d07be9ade9f74181d +c5b9214372c93275865d0d4f3902c5dafd4fb246808dc253d15626549fd97102 +1be3384bdbeb3e70f5b846a85088dc8c4a9a411ef04cb3ee0399e2f92e889ec2 +800faedbebe32208a0f81f4fb33b97bbc9daa92a3b3a53d1f7a1a957cfcda2ba +76ec22331c2ded3de9ccb0f51e7ca924ff8d4f0f541bba1a62da701fd2a05c02 +204ea9debffce3adeb99995087932d5963d2a6c39f715225d7662873624158b0 +a3fb470af5036028a3f04600f9e86ad203fe14dcb5360aa9cfe4e225b5abee97 +e21237ae6d76aecc97470950ee7a2d6b2c5d6ec7a88578ccd349aab544d151c9 +67d693f7de7005e4d92c5dc7b14b6979b1636092fd75b52ab6e83d7de079b2e3 +f5187467a0a6b3fb4e001ac42c3ca4ba743536d9e9a8f0a37b23a5509fd88ef8 +bbeda576aa8440eb7c76ed2c1b2309120478e5a35e071d75c16ef0086eb07ce0 +4e7242a68c801dc3c68663444db00efd46649bd00616b5a346955ba95b881e7d +82733c8f7b563ef8a124d7312fcd0ce0dd57a26e6e104a080ae51b9b80b48960 +f1ac9f15f7ad23fdae73b7e93edb14823fadf09afe275d1503a0bbbbd57efc66 +e7b4f6468369718601a36e3b163be29fbefda393416a86f976d631b80ec34755 +9a0b2e328ffdb6a1ed1ede49ea6749d7d55b04342e40804f030b04daca04b43f +f04d2e71c3686d9a3509086cc247524725cd7ac89fba7bd37212754fa0afa635 +317f846959f2a4ddd0dcfd1b1e5cb66bad528e47f850941d7ce69a967118f490 +95a8f8978254def9e7c5e91d736a70cc3ac70d1aad33d1195256020a9ccada88 +76c0ea39dabeebf3182b0fd89fe5be65661cdc62afd9a3ced45628adc41a1a3b +d681dbb4c941020ce8b8478cacb0e4fceb5b6c16ed9ba14f1c3704c89114c5b0 +80d1a7115d69e6f932096eb9059a6252cd63531e9a72a36bab438a17686c41b1 +5a7616d857eebeb60c66d3b2a991fc2eb3f0b93df445b370cbfbc1754051d1bb +b2997b93b66ecf29d6e7d3c552e0538fa41e0896d05c10684e280d683e48379e +164b356e916afb48f42fb90acb10223b54e74a2a821787322e628f6eb02be9d0 +55f46574342907e69038ed2258dd96cfe873c6fd5ecc7d460252762e7fc4af9a +608b65b1abd49db62324c1efb0742c2ac7453012840729e4798fb62bf15a2db5 +13fa7ddf79c204efe0d4b7cb7978aa3eb36a2c53c8d2c913ebf3debb9df9c52d +c5ec37eed5d8924adee4ab8313467f3f0afb3bf9b424749f73715cabd5b86ec8 +7264cdcbb8c111a4bab2fbc568b65a081a8e7e18fa0d04462720baac968cb6a9 +445cdf029ab4adb8786f35a8d2e02459401b5be2ba6522a7a90b46d8333c35ba +38437539b4b994e1c1ac8f6ec84a301b764b284ceff5ffa842f298d9c2f3c197 +54809e99550cec6ec73cc66b94d6e2980c54f17506e7c67902631704f51252cc +1596405bf72ec7243687fc7a0de9b8c2f4b311dc8ec7fee6bc31645e4322efb2 +a59483c1734df0ab32ee58b6a156ca6b9507797706894aa412b9903203fb506f +345be538c0e253dedcbef172cb9365f99e55b740b45a091848f8ce635f54f499 +43afe4697285361f718b6de2b79f98e0e3adae0509bf571370c425d1aa795cb4 +a1b10ced0d43b59bea690990313afe7ba7eba130f7e5639bf12c6b7dbbc1a17b +4e0fdd4b02e7fe481ea5ca3cf45337d47488bfc09a0312b0258596771ec1e26b +c7803227bd4a5bdfa0495c227a454a579dcab23fd4ae8034458fb61b7d89de7d +4524d7bbdfb4e00a6b4275691be8f77a490e768309d6174379f52ddce411b55d +80843074dc394e4e88b7311918985a58e5012c6eb8007f22903f3ee0cfa1aa61 +3128fd7b6dda6e93a6cafbc6a7f3f277868dc34939542072fa746c228745319e +c0aeb14792d9d266b2d58c804d7f4094d5cae77bfe150debdc47f2f23b0b37c3 +b19e19cf0ebaaf50d64df8f624048c3cae65e0c5770792d6a6cb97202174b003 +a4deb8a3758a83283dc162cc88526a3d037d8ab1f823eff5115da7d2373d1d11 +56b883d419931f7956024a22312130659a8d2a946dc9cb721599fe7d5d28dd66 +12977032a94bf26215af645d8659ce53528b367e30368fe0db4b194487a4890c +26230fd2bce623a12bc09b437df3a3faeee49571df114d6492b0c1e3ef4adb7f +8ec807c39c3ac56aa82b2a8e7b4bce3777ce3104d3a62e8bba72608649f12b04 +e5908b5f9d167d865c9cbdc94e3e8c99e06693fd43283c58cde48e5295b327dc +176b0ca861033c1f183a41a7002e9ebecced00584c5c1fccfeb630c20666d91f +0eda19c9a59ef508260f6bea436b351af6518cb4e009865fea06d4fd3b2ba970 +c3632c4556861e54a6441f7398d420a99624fe52cbfb68b8c1ce2a27038809c0 +424bcb7e54c5781be2be39e52bcc1df2b74ce7828056cf8e3f5a56df1e54e7db +d281570e270dc818aae4581789c7494baf7b1ac9cf3dcb9cbae77da67c39c6ba +db606df4098d341e81cd5a24d1abe2dea05ea064cda4017526b956cdb79540bf +7f1324f9e256d555ba4945767f2c72db5597abcabdc81e3015660232c67e0949 +0ba4b7a04074154e8083a8c883c8b884a1681cc2525f6cf45330d8818cf92906 +049da3a2455d2041a0cf9aeaa2ca7fd0f4e5d15580e5bae137d39baab9c400be +0ff27d17d87970db423398e931f58afbc415758b1b1a8312facde8c4451dc91a +09cdfa481770f0e445d35b98460b6a7b3e93f2b3d5f0b49b967a3819c13ff6b0 +4b3e665d95d8760fc380ba7f7d400154684e081ce7e2000c6e3a02322d3f3835 +4e49daf3c8bbb58422d64e73e0a491d3edfdb599614ef55b603b00d8e1aa200a +225f39bc76f58506ee900c2db1d8fd16872998017927c4a561b83b6167a34ca9 +4407b21a2607d96846a9bb7b543382980e39fc1a9dd9f47c562de35e18a341b0 +63878dc89f993080a1d995ef07991d52ea00c6372863b56b744344541feddbf2 +75b432e36368e85161e1ad0ceeb772939ace8a7db790c66d5b821a90d1cccf7d +ec5b2970a04efcc3060b0c163594d7b4f0215cc30b01e71b97f382e11f27b871 +922ce013ba8fc3bb678bd64630936f29f853e1379760bde9562f8708f8905a59 +6df302ff8f289896a7a38809246e2ece8e99e96b6b471916c883bb7c948e8fac +6588e2b30bfed55f074fdb0989b85fdfd023f15f1ff89c2f29f4f5381c5ef9ff +8e702aa40c1c6dc7aa48430c564ed5712ebb99af607df5860af30e1b4ec1a492 +6b9ddf2aac1352f4b15613cf6e86708c73bf73728f3bba7eb6b0d30c427454b3 +c8e882eeeaa998e9f02d10a787f6017a5c0a55027d2ea1da1485ab60a397f449 +4f2fab1106c23e3ed97dd268a6f5a9abb2f0cb470e1ee6411b27708b1f2cc7f6 +9efde016cf7c122903ac89dc47aa11d0c45414b8264bebce5850b39884195860 +39a7cb52c877e5ea6a0bbcbfbf3a104c0a66af928f6aaaf062b8da0fdb290f51 +9b26b6b2cf2fa49ff36e7435b86f720c06036f2a322c3fd0fb37ea7b850ea80c +6cd6b4224e8eddd5adcf97f69d9c80102ae4f6f6e5663d0e47ccf992e11233db +5f37e9efeb51f8cb754b919a80c0f0999311d1784221347d746be1590d077f8f +c8a98ec3ba007a04866bf3e1e24bbdbe7839bb7adedb55c3584ce2e2b85a631a +5bee6015589a877604e67121ede937afca89af6e186d10d3fa057c9703b17f26 +30025f6332087e97b1ce60c7e26e48d546ae484dbc604a1b33528b5dc41bc2b1 +1b9d717dcef2d469f7b5f0b3047876c578f3dcb15425678136229a7387966c00 +593c6e96e603f222d4bf10880978e1d0f2e246176e6daed0ecf75e30430ed2a1 +8907963577026bf6689b4a4c420c5a622602f2390ef9fbd5f6c716c8550acf50 +3180e80c95e8d4db4a8fa3eaccd85672b2fb2c0f7b0f8deb4955bd625f131904 +289166003bb3451c1d82b19c461b21f9523681468ea247f28d6e8eae788cf06f +3148ea2d53810077c14b98b5aa1bb2294b202885808854bc6107f4667ebaec53 +6dca8dac30a933b183f5465bdb24ac02a6fe61d7c440e068d5c1b2511599971d +09ca25be37e1baa6580850a7656ef4875ac5dca306ae04090496932140464a48 +2b60cf202b4e308a97d4f75123e655e4d210b6f2f285ff921a9906028e331aba +6542a742fd93bbb77167d04267e3b7fa862437c37c2a8cbb1e4085ce24887ad9 +b00155d04414e5e8d35903c4b2f842b43a333442d17a0545681a20188e6f58ea +bee8d954f42963533dead29cfeb41dc6cb8e70c122948be88afec65d315d3a1e +8440ec98d8191c891affca48a8fcb5feba24cdb0716466840bdcec527520aa6e +2fc538993766cd018effd726855a2759a0b90c12995b475d6e4703a8fb39a59f +1499ca0079d2a25ab06e0c8772889354840c25e10cc6706e9108b62ae8e545dd +1be37905f8adb05fa0265b736c55ffd4ccfd8b0e4ae6b558c1debdf02a836d0a +bee910df3e245d668cd878f528b6d9d16f4a0fa5540623182028ca199a0a8386 +ae47cda55b8c71081a78efdda2d709d973d69ef1b8f27db52ebb298bdf2fb718 +afff5377c78edbc3a58fa3d56a3b811bf5873a8f787897c62ce1a281141df5af +be323c10e74c8ce430dd192dccde81adc639fef9e5fbfecee5be9d0da1547211 +6d6961617b07b6d8a8e184969da1cecc18745012ced3834fa40dce5a0e93a673 +8f51f43afb5ad5ae0939f4d3cae2b1e386fbefd8c840e2685b156c4d2f2cb563 +511bfd502ea44f80eab5a58ea38a682e863e13b07a442864c1d8215db4e824c5 +bd5abb55ed959042b65bb7d1272c0e4d429024cb101d8d340e3c9b918661a55a +d29cbd42b25000959044f9d5f9256410d5dbdc9619a54229a1ca1a96f939cd04 +7fb87288db04a3a105e61b967467123d186ace108abef8ea741a4f3aa45738cd +37b9af8a997c9f6a4cf1b335e3248000dcad05d7565aa99dc144076bb70721b9 +eafa34f716ca82830e8981c4368559f859ebe5a89ef467193a08a3ce62822321 +4637619f8ec9595107d156be7153b6433bedf24d330968dd9153bb90a09f0a91 +43c851d4a5de88c60b0a5d8e3fd2ce90617d14c2ad91a3b9e54b5447bc0fc905 +d27e961b1888ae18d5455fd5878cd43849dcbc2b01a1cfd2543ef89aa4ac0a07 +e4b3bc437520361daada75f76668e37daf5c2f21133653ea1855851a3fac8a3c +a8bcfc449febdcb4566b0ade704fb68e8715eb37461750897b802d099af47ba5 +3efd1f74f9d13ee62aa163174cf38d8e75f793f763f9ab03fafd8d52bef23f5f +86f4da2b1cfbea8233805b9d9e47e7c4232631a56360dea075491e410ce10b33 +8e9bb61387fda4dee805d038c67ef2c9cf36ef4f2d7705ec90002afa3ee52059 +d4412a1ace2939ec8753653aab214344cc65b2c2e2a0fca95fe6144953c4b2f0 +8dd8b6d0bb097ee5d333e4f9c0c7a54687c3f2745a5ca79dc3238ab554ced0f6 +29707805440078bbbaedc13a2ebf81fe9d5686b9ea7aff8d6d98cefb0f453fbc +441e9d82023541d3dcdb8d255e16a7b48832bfbabf7802161c7b164bd7fa7035 +8cb6f75c1dd4838277a5baabb00276394b7d3af5dd1ec4db34c33e73c6be810e +d1e1c0f07b397c466ca035edadc839ccc6c3b7b07ec1f669ed0798d1296b191e +31551b05356c2fed9fe7680e0b5e1ebc1dd117730554c57fa82854729f3e4c6b +2428a8de3d3555ffe2220259ba377772616f367966c983a3ac18b04471506e6d +07fce9847e39bd3a845bb894f7b0e04daea1f10f8a23d030a0054659db2b8949 +a79ff3d3df5e76e7bc5a0163e1d108e30d47c01a0d17780736a36b664372f6fd +71f65fda05da8fa900c3f9e6f78c2e3a83e97cbf56aba6e4d6be0faa5ec5d7e0 +bb97e659c6c1a778354907ed74bd12d79d7a0b4fa78b2a157c3fafb6814b4759 +3db04c2a8b16f3635efb2d03525be6d6372560bc4c96e489e971559e49960bfa +a5be48071bc009df1482b6c9b452dd558cf537ed3263a10b278ec050492728d0 +4f335c50b2ff81c70a78f8d8d3f2e3f9efe9efcc2c5f4e52e00b97ead7d11295 +912b35bd0dab31c9c3e661db42eb98b86e090e55db806b16035848de4b60bc07 +f6b7d9ba8841a73471692dcaf020cda34343fb71a18910aa400927d4359c535d +773d3e4b7b95fc2b10292a38660f0aeee380148ab062142399c767c4add99367 +f28c35d5b8aea728aded4ae367b41d43b6adb2032410d70dd875828fdcc5c976 +e221f05c764c5042d2a7ab671a234a4baaef58054064a3265d6e5c92dc532663 +87c81c142f1b94ed0f5a16eb83fa9811c475aa0dc93f9ccf237970904d983cae +a7914a8e481400e58f431701bf0cb884c1e5c1f52d592ad3caa7d8a37d1c9568 +acc90fde3c96fca19bede3d8d92114d4702e1d38e9526fb918c2b8b8a80fe52e +5545fdc287108a435029613684952b6d9f5b14ecd5b02d607a311b90b84d68df +ef5dc37f2c55ac5aba975bbe16f1f18b2f17b4a9fb96754fa1228a848fbc6fb1 +c874307680c9c58f46e69bd27ca7e55e7cdd7cff4271341dcb34ee5b300e8dd4 +bdec4fee74bc74cdbbd0ecacfc1a4ac7f4714b4bc308ce6d88438920fca53ece +8367968559eaf9df11a0d3bb80e650e4d836ca854dc1556b5ef36b9e64bf60fe +650125a292b63ef6982b7fc80de9903cfc18ad9a1a14dc03d32e9ee15adcacc5 +a9b11139757d948bf23e547769f4d9e897ba15ef4a495735af47de7bdaa63765 +40d035a6ae198f03ef371a49fa624478fee97359bdbab730e4750a79e4ecaa3d +182c6bcf9af7f132392b5e0940c10d8cbb27a58f84001a951c356706ad2463b7 +24baaf3a13bb4aabd80f4c1d32d48a0a5a5be34b03fb140c638de3cfb14c4c1b +ca45d82c270692d193f0aa4286cfa414beaa7be6908e4d1208b5c2ed29407091 +c6fd5e78400d148a9ae24dc6589dca89ada0ddf0126203229b33de78f409c247 +90ec215d8889e450b6041406aeb5732dea90891059e6f03edba61e003ef6eac6 +925e213b1b4cb51fec8578d36527de080e9b6a2f2a8cc08dd888b705e580f4a0 +5dfac8b6c05b297368fe786caf8730fb703b28ff3fb63c5183f4f8f97719e4ee +d65d13043f1b28b01a2b555ce07acaaf98e47d034e6a3e271122935f6224a167 +5b4cd9fa85ee51deb3b132b36fccd473d1ec278c87a6e4c2976ea93c5348cd6b +9eb4dddf8f3c9fd6d5b7a746756762f641adc4e1bce84423d589cd4d66d521b4 +a99ea4c0766e9de460ba8f32d580383884a9c5e4907d7469752ee7d68d04372e +db9579b6b20fdc55c9bc29b227248252f595272fd12639d0f2179f27754adc25 +334f39f6205ba259f5544c39dada5d7ff050d80afeac0c552fd467b10023e530 +f791ad4b12d04665a9f9e04f7fa19f74c73890f6bffd42a7da2947ae70dd13d5 +8ab82e2c44a7bf38c6bce43d7026441418f12fa7a2a7cb81b7e4d4d0652d13b2 +2d6b130dbf0b6433db47ebd76cf0ee4f2aca9a4d8c9b3339c03087f871793105 +d25f5f4591a8c6af03c42ad8bc129437b5698a6c67fb36ef68ca0e9291a3eedd +1e5fbe6e97a8a56482c0c2f99919648a24e4067c6180a35f37e066af4134abd4 +e366adf29467371a14c80002b5afc5003db922fa92af13306de6ad27edc0ff47 +ad4da4af9771c76ef2c77b54fe2a67719478718989abf9beefbd962b449ad634 +9ae7fce4e6f425e752460dbad42163fe5e9f8eeb93375fb3f46990445ef2e59b +de0045c70a03300752482f1ddc1755806babc181224471af546b31584d50ab56 +9ff247586ef4e52363df927b8810a5975152d92915572e13c92a65e5444a8ca0 +46fcd260cc88761a3ec8834e169af050408655605c793f9298edb5f657fd9e0e +0142cbcc53e74a5b00c3d0c77222b4b5df610ece643275968122e36135d86ada +7fbea4d22e1b51017274365069d75851b50e8401c1c34a228c23c10cbe330dc6 +4ed9b9aca8f3069f636e286bba6cad0159321d5c27718f410b39f99f4724aaec +1afc7f6ff415a8fc73d5e26be4cd6e93b5464b764b7cac70827d48a3fa61c7a0 +f1943551599bb6216bb70b19a1a0b763e2f6b1c4babd95094bb87c222fdaf5cf +9eb0467a5c93a6c42f4ad9be37d0137a057aeee887f9ced56ee8ccd85bb8c5c7 +7de9bcbcb7200c063735150ae6f2fa20cf3cd920d5198483ecb81c0eda832843 +27e0c1828a244ff1106323d4ddef2c71430b4c4de536abbb28f87e5ff93c3a23 +7697a73cd0653bca405e167aa727b132e98092629971184405e342bd802d5b72 +f1a61d42152936472892786973ef23a6f4254b3c3a42531fe34af9569c466373 +8bb88d96f27a8478a732fe405840e685aa416052a8a86beb62fad458e6b90c17 +a45b1ded2eb9a31e2c2f7ae2832c34326dba870eb3fe7439fc69d6f26d5572c6 +ce9b77a07d977392f52594c4610d5c1974378d2626a79d7f084ece540d32ed18 +5ef252ad0b4be2fc499cc708cccb88a80ae59a31e3038fef230dd0c101781d95 +b754338c0286917d565feda78b54e9a46f929fe351c74b649d05e014f4b9f941 +14d84223a0f3b11f6985fac073e2e6a3124b664883a92a0efb9b1d017f823525 +fac9bc150808a58caad6b7c0f4892e0285d86e79d587686d0a52284572ccde01 +7a9eb12d4559e1793e09f92a84e99a0ca40e00024a9d80ecfafe6a4a0afd607b +ef3c195148ca0699a363057b98be0ff2981bb9413fae9891d8ce9fa723c278f8 +828be8479cc8f1a792d5cc074bb7ec4c3e65c1e2ef34c14241fd0b6c097ad945 +479e7a932aa4654f34705cabc11d8fae6f4aebed345c325f907bfb04b41b35f2 +4d261885880bfb5b1f98b138ef31e3a7b96e439232e4d0d9bb84139f41f48561 +d828648a60ed3ae4f092b86bcd6789015b085506fe1f266cc02ff5c5f3ad7280 +4456b4ef8ad3c1eb2f4fb956f726dcfe2d49a73d7e9f7abca13cde848550cde8 +7e083b85084000f39d390d707a017c63b44a9563547648c48f3d3e5c577a9e15 +a7e663c19b7d82aaa700229bb541d7dc95d83c3a953670c6aa4ba8a95e2119f8 +ed8b056d8dc936c4fea8e8b298819a56cf089c0be99820bf2eb51455e3482f57 +62acb88c1baa53ac2dbae3030043e8992ebe1a7863e47d9e106a60fbb83355f3 +b98fb2744652df95ce801cc169936cb12c211aff9d77ae43dc7fbef2112e2d44 +a3ecd9a8c2cd6fc94b4ecc6d1f5b2fdacdfd153e11d8c936d822306ce7cd6d7a +2172d8f72ecff7f8a4d1eab8247c1261f8df09ad23e5893f900e1e414d13c25a +1f235af5fff7743baac23af56c8d8baa12e095ace339a4541e87eed758ae490d +04da6c27bdfae6c59e263c3143caf2febad0f61a618a372052f3f550e80f6a25 +3109a9d2cd667ba408e019fb67f8360d5590850e1ac72160f57ff00cb8e766c1 +dfd23f82fb24b407dbe5cd232641880da9054ce3934475db0ecbfca3cf56eb3b +5d5f9d5b69a847eb7bae3f80f5d96e49cc11251cd4e3ec235b211a75551d3df6 +8c9bf13c5cb2191f42a92d9ef1419a0b31996a53a1b13235b6dedf6719ae00af +af731d1bdeb99eafdb8ac4007e4a689aaffe5afa456ef93cb02b4a6842d60ce1 +cd0b0d9ec8c90fc47779fc2494dbc683b6db5360887f367ad6f5cc2986d21cff +622f47f4dd116d5e0300b0d1d5ac15ff4162435c7a10ed614359d63d230132c7 +bab8dbc07d28aa915a91c5bee6f3073f6de313d561c0ef9c8746ce87cee5d42b +74a9bb276cb8797f1715136b8a181a7ce12c85f5b9e288ca852617add6b72ab6 +07eace83bf400342f5273f2670212358c22192bd0ad7a5905074e42081df0fe4 +de698f14471fb3162a847f5dfb83a84f93f8ee6b6519ea588e0d4baff3953bf8 +81b78049dcbd4b84ce45bdc45499e3a5776b8e4e9063137d4e2556aa2e62b2a9 +eb5ce11735ed65ed5cd49135bba4b6d5f184eed7933f698157525da9793c8b10 +41d1bdf92d244fe701d30ace06cc28dc4afbc99ac05f2b8ece0bd19771c7337d +d7470206c9e4f9ce5241ba4f038c02a8db27f75218875cf8334ed4bdb739a13c +9d1469d58033f821c98b3684b51731451d3b05dcb1a7a691d3f0e2fe44a82688 +cc91e3711114d2997e159c81408665b2050c89e10a045ebbec019bb9e7567d95 +9176ee0cd69104974a26c6c7da1f690b6503a75cfaeed44e9e37be1a9454b7bb +921f7922c213b175abd329b680f5def8130c911c25f4ba34fb2bf49c65ce74bb +223904c11d7860ee74ce7aa113fc40a64fa702db89517b0fd444d0166cff31f7 +da476a7415e5c308ed98b09cb41adad1807694c1a39a20d3ffe0f33211e36d54 +395061b0df33dda283e1d7f5a9399bc144ccb6863611e7aac1817fd2b95182dc +92755c6bac1b4074dcf43e556641616541284d5eb13fb49a4b375c31df13db9f +ed989c06f374582862caad3b745fec8145649dcc6b23adf6b4852b6021394dd6 +a19ce0cbfe5b041afdad277df48db2955de8cda9a54379ed246370442196dd80 +0875fb8a65e3300e3e4b97ee6cb4134aaa59ee3517e285982a4e65ce966836f3 +0465e0a7d4bd636870dab95869fbe7b7b9cf28db23839a964612322be21c4f0c +3cab665c4dd6f40150542c3ac64d147c09e5cc969642154a35edcae9c119bdac +2b82e582e2ff515e1c88f91f474e03381368417b4084f6788a8e19519c9f771d +92133700a7ffbf3e82ae50fb19f59a7a385d169d1393c150b88e5156c41e28fd +055eeeac7fee07c6a3be5a8587be73b77826274bd3d35574e2ad12bd1551be0d +d4ff959077cdff691b265cb353ade31f77ecf60057c0eba5c51a7bdd69739633 +b45c312f9b77b0d87ec77fdac0049645c979663dc0314c8f101681e0e47aeeff +fc8f7d39a57009ae49735d6c386262bd09cad0f52d862b60832ead3b3cbd3efc +bb992f901443f78f45f9112a8b79d83888b412803e5621e70dc7b2eb475a7a3e +0d07c36ab6dd2eb352738536c879ca83b31906ebc89c7304dd1cf95559cf7bae +eecc29a5d0f839b64c0a24b6b9135dd0fef4bbfa01b7d6a86d407abeda8775a2 +6e20bdc6d2189cd7055b39d30315b9ba68f717840c10f27b88e22075a7288c8c +3db83c27b55d6032a2b71f326469af86bc7342f43c4c95c8b13bf295ad130cb7 +421ce98e16cb34afd5342289819a8927447c0df7c98e9a965ee83269056a7c91 +961efa627927d007bf3836ff5eab5b6241ec8debc29dba3055d38101d1032307 +86644c8ae82f2c516028f780853be93fb7a220d71e60dafc26e582065444bda3 +5afe0470dfc2f2faa9d2af52eb11f048b16ebc88f23f33944085e1d9b1e85870 +18029b166b6a6eaf36f2507415fc1a58ad4b403c89994910896bd32acb360703 +17534352e8b001ea7a79e81c07e740c3dfae6f247579f957fac2c71cc792f7f0 +1c5d51b81f5029866f454fefc4c15fbc369d0b5f45633fe46a0fb141ad869770 +91af47762fb7c2291a413e51f9d697864c8a7018818a03203bda7d356382fe40 +b271118745973af3455e9021cffffc9c429273404e0813699841332ae86aa519 +608e948ba76806963b3656c44263a1c5df864e8634cecc6f8dc053ffedfcf030 +fb3c759daf5376152d39ad6e724f2a09a06e77bc1eb78fac830149954261f8cb +765d2aaef1847073e6a5ed1d965ee9d3ef47650fc131a229bd68a22aa3bab374 +b0ca5b3ae476fd880957cc7c08f8729185aed5de06dc4ac1727ca7942ca50e7d +8bd0c697d43c70cc1992205c9b914312b4a91344d47be4a9ba955da671977af9 +a92f0102e56705575bbb13106995f75de702f0eef35474ac55608c72bd513cb6 +e6ad69f1dd84869c03cf13d22550471c04cc72a5664d3154d56886fca7cd18fb +e7e172dd975923c6e6a34dd59653260a28d90bd16e5ef7ed6a76a55345b08015 +b5e1e209e9db3471b9d0008174922d1e120f00620519d526e85a80fbdd658357 +56428f1549147e1adcf069508723625f929ceacdcfbcb0eac8337b3de3276894 +1298a952cc3fb5f55589aca8bb44111dd1023305f8a1d2b70d1da6fd510efddf +a55a18dfb4cc9a1b4378f9dba73e29d16daed328d3b915821159b0bfb6872240 +acd1a3fbda983af9d64188be5412b15a03b52982bb60a7748f06897c63d97775 +3e60bda00e6cb10c4fd1c14a49a9ba5383f025393f79efffe774ad9cb66bdb11 +e3feae202ac9ab6dc25eb347b967b9a9af308368cd0702dbdd5f8ca2744eaad8 +0f0a9093c127b1b01bc718e7979c40d2c3c130dc3e9eaeed82e44f12872ff753 +ab30138a8b8ffa23123abf35e67a20a44fce65e6f7d20abaf919f8e1dae23d04 +5e3c5ff827a3ae677e0ec586f828a0f2a60e61eb82019ac0e1798af174de34f4 +d65c27344cd9f575de52695e1564d76b3bcd81d02fcb1ad4b12499fdd6ebfba7 +c1c55c98c7418936fcab4606dc7203dbca8471df5828ba2a8d6ca99d4aeaeb7c +bef1d59a6daa5d0e7ec0a82fd392790b8e17d25f51cdf802784931d9f10b824d +ab7026fe65d2832d166cfb9b108a75b02ac5b74c7726cb5f178784f68d478ca7 +e29097b39014e81f10828dd37e22889551489ba2f6a2f53c72e831c75d2c36fc +e19cbb452652673c10a79b0eb2cd2bc4360a464a8bed2e369cf49660c9ece723 +7d8cbec3c3d7fe2b223b469a0feaccea1451d1cb931ecc6c307132d89a281fa5 +85626cd2ab00279137c326061a1f3165b68d04ce49bf0d308a21168d54f4a3f0 +7d8b8984b41248a4b5ba90c1b88403e69c920179c41c83a5e2dca301dc67bc54 +7171f622980e28f452568ea30e9dfb145d06afff9e28f43b04535ac63250cd37 +22ffda3ddc5049cc71ff4592766a786190c7fe9c7e87331b3bf1c8c25e289e00 +e9aa9e8ac24a978998366cb808f1dd3bf204af1adf8b6c3fcc93482510c720af +03e18d7f6820935881c4732bc2bd68b1663260581ac200be9b0dacb1e6a910ee +d5186437c5bdb966b939edaacabc104c3db19553117de2371839e6034f0f9f9b +878626fb6de546c64224475d416418a1fffd40341edf45f4d91df8571000b6c4 +e7e890ee4ca95e65f18bd0ac230b98d2487a59af084feb16e4aa48cdcd150549 +f93a03156ff8b76913decf03fb5ca3213b14686b664daab69d9d6f056cc6d372 +31122a599b78080a0ef40e75b9d61b17612c0982690bab7a8dff6265189ea5cb +4d8607b8a3447e2de6463f97e35c40efd806d021d47f01568ad586ea33fcdd4b +37680417b08ed5fd7bb1cf72b3751fd861e0f5170d6cb02a803c908420482226 +e009240ba80b0275b1402f6536da71325bd6c88e2d0642d60f964ed85acfc28d +d0fbcc7ebc3d462cb97fc41b8c4bf8352a09d71ccf318db3f2ef5e16d6711c37 +93bd1ab7f7c73db89c93b7843c2c2f2deb720a2e840fda79d3220ac62c280628 +0062d213b27010e5332a1bfff9ae17063c4aac27a190a5559933cffe1fb01db3 +b048fbb50add93b115ff5370ca33678389a703bb381841ef19d8cd1b930c2c3e +0f1211744ea18b15e6b29d8fb3fee9f5416718e1da724b7b3a1e82a28ee059fe +463640a5fa80025208ecdd98c0bab3ba2cbbcd80b730686ca27b14240fb1e9a5 +c751f88f42687a2901c489c8e7e428616ae0553d503d093729b64edf3937434a +390e6c6e1094848d10511feedeaf239a1afeecb5981ff1f6d042914f02f17847 +4ceb12269438aa42a0f9bde00db8783c01383be5c3a45941f8afd0177055870f +484eca20fe4288a96ba1d7a341b3c48cd24ba4dcb14e703db1389a5659e86ee6 +e4884fa3363238f8532d950d5b1566dc7f68eb0a31a0aa314deefdec9a87a7a6 +e7fbdf52e14cf413fd6029a77aeb5f0806ba51f9e63063185c926ad04df113e9 +265be0f9fc4e71d2b18680bbd314dae429c9eb2d84789bb85064468c26c04215 +321132cd4eac9046092f1979e2833d2d5d1a724d10629a0d4e9c7e03a9d3b2b6 +3c07d9f4cfed06a476ccd1941a071679df08f38154c2936fa47177986edac8a7 +925814c83814c705994bb0c9546a1fbce22111adaad613960c0a95d98d9452b8 +7441c3666b539950a27ce6d892c2d65b412fc58547ab21a6d02f1209cd304235 +ec32f4349fda2d1a6d9299c9ad560781dcd011e1d2d7cf91ecb6f5193bf9a33e +9f73a66b5184f9266afc4183131e7854f949d4114c48cc079cb892e8cae078c9 +c88223e65723bbdd78e23843515712bff13f4544d43a144fd180639c00e0f6e3 +9f871f8c056d8e774fd3d05175e8b411038483f333e18f169048ff21000fe84b +2541309205f6635a05de58dd71efacb7182f3972ea4aa2c5a6483ac9e38ddb1d +008e5a2f4940fcf820987e2bb7b73fa38f8441806ac0de93736109af54048a1d +e95cab99b1f3c5e104af17c67f0e0a99a0dd9c7cac7d917a8a0032abae8c577b +f6a647f505fca2e854998057387da13f8189a3f9bde597d66a1d87388d840f09 +8a9e712c6e3485eb1b8005e3e3224d959b925a237e167e10965f6aed03941a4f +90354b6bc6dcab1a2079d0fec8afb174b57d339252bc36a554682cf59773fca0 +36230a8bfe5538f7770e126ebd9dd87d800663c14f5f8a4d4bb935fe7d05d2e2 +11b720bfb754d323a8a252919a048db606eac7c590ad68115d052a78d8f0f7b4 +89e048372b293ae6a44169ea795cf46d25637c7252bc7a0062896f546624e151 +891ca2e70dac19e06a3fd3c67de2ff19c3d3838413f82a38369c5f2166ccd869 +5d4dbd9856755ab9f7c94810488bbc713b1aba7f66c07155138ce859a79f023e +8954decac00adaa02e38cdfb927460cf42cd34caaaa62acb7ad369f917bdabef +9e2103e0117f6f99b1e9dd73edae4b8c353f6961c8f078327d7256b5ca6a5996 +bcaf0cf21718f574f6f2b501dc8a3b115d4af7af8062e17a9f43ef05c1103ed1 +b406b350ad72f31ed50de231536a0ca1db4373b3641b39471774426a87d5731b +7aebab1f6a9cc832f7a8e542abe1b8815d20addf94c143f4824ad09d702acca5 +f80bc581e0c848248613f5d86a006ed509a5a55591852200aa9a3534e90ae0fe +95098ccb45bc63a4d86e2e1883db0bd1e293360158a5403467b96c1b9e11f082 +ac3d3a5ca47a04b7605ba54c8f9b34abe2fbeade06c3f3d32d667b6a0074eeb8 +84a40571a4e5f2c31483accf78230043c5a17f8da13b1bc9fa92d1db17724bac +73e48427410b582352164389f95357f53902454e167ab86c5a5c404b648c4c37 +aaced6c49af4479405fb9d32f6cd78e2114b820cc03877c29cf4707642c942c7 +3874aa52f3f2955ca7832a12545f745cfb8768b1d24354f9bf721d55bd9d0722 +acd1fbbea4b1f26128902892bfafc8c9b1c5860f33321edc5afe7009f6ee10e8 +d5cd98fa521b3f45869b41f8ca4032e8f814ed3eb0dac7828893cc1ef2649390 +e70cef649f6c469c830a2820ac2b19bce71b76e2c7fb653093b9fcf65477ea03 +0e09e3de1306a2131a1792a616755b670e91a002166433e03a221310b633f96f +7c4671b45b9e5933f67019ce6992ce8575efb90d4691680a02a4acb8978ce207 +817505cd7f01e027a965f79e6d698d6de13f56ce427a7ff627ed78237f99a702 +efb328304bfb288641d8685cbf43e96e85e2d6aedfe97e8bec0bd5f9622b98aa +316450a090f406879c74985decdc96962a50b5de3a5848f92492037011d0f4e7 +dd0fdc25d578a0f86f80a8ae25b9975fbac71fbef5c04810ea0a19b89facc0cc +aa73cd34b809854296cbdf532f9593332114e100ee289cd181bd3b3aa05c4fe7 +b3f323638087a2b97157b23505f9a653cee29017a39666e3680df121aaf641e5 +f971007acf53e8065a0fe536bb72e2fddb8bc51701f5d069faabd6c101e786c8 +ef8d299eee8fc6f7f97c1d9c09bc82f8204c9231083394ce840312344d592d98 +f652724515c99539d2c463fabd42c8360e0f0f5aa9739e3d2e484d3d39f2ce73 +f522a79dbc46266aa36518f0278432bb380904ebb6f30ea6edc835e33b81be18 +21b6e0d803f31e8be97a261b3b1426281b00b8b6baa6ddb76ced67d802415006 +1dbb011d04048481d815ea0db0dbccb20044fec53da88ec8cadc39bd57a2dcd0 +fd36197e8075729a1bd4517751dbae89bd44e2ca7cbed060e3e6e6b124b88ae3 +02f90a2388bce72b3ce9ef9e1bc8392246271d4cd5fa6067ce5eb426b2692836 +6f00ffbd94493239104a7d71adb54f3f1d74447676511fdcb82674cc89ed6b67 +7e6a24a5dd5d29f76eff3bcfbed6b5e81ff42a04b42b9c30763e501b1bd830e4 +4c9890fbe3b039eed303f064e63b7bf7291c58f2b45aa511b6e6fd2b169d6ce5 +3c9d4331ba7029bb94b7b5265da7c0cbab1afeeb6368ad410552a8b23c4838f5 +eb07bdafc3d60458649ac2c8fc787bbafb1b17128e82359c89a20075bfdb63e6 +d9be78d619689ca0f8c2e9c38a5e8b5eb42b4d07a9a3542cf835a423cb65bedb +ba210e7b2073919ef7d76471d17b165d6aedef70651f46d22bb1b6d3a8b3898d +e9370aaa67830689c4773e20e0264978655ee01d30e42f8a6ea3ce955c657970 +23129accb969cf84005341b24f92e23b4b3962834ed91ed40c6866f6aae07219 +f49f0d260d329c287d4bf91c504dbb44d13da65a96b522673b7912dde6fe5e76 +2ee0d89ed7fd96886e761c4f262c88db3e212c603e8981298e4520428c058480 +2f5fe0fb223f697f946330d97f6275c100e5d15f36867a7e9de9338d654cf267 +5bb52e5ee6c925faa522780519c15b655ae54ff19203a3465582e7b40e904716 +45152728ad912b05d25eff9cdf03b762507d6980908e22ba5399b2fc2cdddb10 +47d8d3b6d502ae49527a62ca8968a2c8b6c814ee0cf1a7618a8ea8d7e7c5f61a +50515dba6ed6187394d8051121b685be8d029d97449c85c95b4d68da2a31278c +dc7f39c44039a3a363d243910bd26c882ba1ef5be080d0f8b8eef954d9b7c186 +ea5e664aa4141f9ffea443d59124e25899d0d18dced06702499ab54e72894285 +fa1ce9a831ab914be5711a225ced342a9de51a7178a4e5c4491a3aff1a606aea +4b91188a20a63747374aeb9014cb11cd6f52bbf906af5aa6b5ac2cfe27e75efb +c554648f01f12eccccd3d94ad3b3271ec690e9a874284fd22587a58a4d78680f +20bdaa27a59c0fe1eda28b86834234d291682efce38bcc93bf85ebb7b493066a +40ecb74eb37dd1d018d3af16977ca7b539e5d9e68312d255b930cf1a859625f9 +bf81aec791a6fa63f578a4ecf972e1f61ef9258eff34f91ad002ea7a5c3b29ee +2ab6d77ac6c14c71ad07895206b0a68ed4c21e197851ad6944d4f61f3d089c06 +d0589e1dc7494f3e4ebab1f56666b2290679a7656cf84ffa3f1a58c1fed9a62f +3c1b0de1496a711f5b8e074712c3b44f49bffe341ed6e5926368388d0ff7882f +ff24a63273155908d94e78ed8252603dd8eebe7d19e588b029e5136840a26664 +9918867370b5f8d3942127044ec81cc46d1e88fe88e47b8af625b6826f2c9ee3 +5f8a6afd319d66812d80a171a13316c2a4c73900686d4616126aa83d635c4f9d +27fae14feef992bddddc1bd7c890e67cc544c31ac9d05541d7af116724081cb3 +8517dca6cc490a02295fbeed7e147b1e45033c70afbfd711a2d41248cba6b56c +94e1b2c1a12409ca6e529f82e0f23bd91da21fbba01f22968a8cac2a231362e3 +61523dd5ebee42c524cfdf2eaf818650db8da4e382cc519214a7b4fb3f90e82b +315db75c77b7ca98f2f21258a68417326cdb55cf6c2b31f197872a8d9d65e17c +dd64e130ae2d6d2a16a717de89257bca08f5bca777b3021ce17d5b1a07aef098 +88fc1e420c9e08ae3ebd4ecd38d4417191658035a623a3dcc20257c0e1c4d1d7 +d7e0e54defa4d27fb4f815ddb2604103030e95f27871c7b0e9a4c4610948fa16 +012c4b30cc2e6c03a7ccad7f0643b9a1cc1eec9c7a2681ed802ddbe7d8eb18f0 +2770b022d4f2aba40045ffd23a888e04b800735f917f0abea17b934e4a7e4d06 +aaad3add44cca6826070ec12bc89e716dc416bcefe0725c086e7804ab8b7fd91 +6b1e1e3b289afbcb202d7074de5c61f2819f13735639aaeb50e7dc9aef89209a +eca7316bb46f7f03ee99f56817d385102faaee63ca8eda61bc7b905ee48a9625 +69dc8122ebd8bfabcb8de515b7dae09542db46e0e6036611762442e8d3943d90 +a89024e8cf46bab577380287f30284717c433f304119762b276fe84fb0d0f075 +3d6591879886da5fc0e179a7fef454699e159e8a2d35dd1f678c8a5825febc07 +6b2d56fc48370317c9fd3cc71a4cf3772bc6a9f202a736e863ddb4cebe059958 +1ee4c17ea43b964cbc2add4d2e2ac013b43d11d1c1471565b90d1bb0da9b914c +44810b030e137b37ef8942dbf6b041d9f7f90305afa411ad92527177f894c2ce +835b8942eed694b6e7503851d5dc49bd40e05056841fdd21d6c29012161cff37 +8e213657bb2db9f3655cc1d18b8c6a4d31b2d37036b1be5f51d1277cee26c758 +685b9b2bb9b9f9e88f9146ba4ab794f535358fb49fc0d40ffa41ad402644120d +0ea676f3d5588683683b79520de05a35c0f394f0f5ec6d13ac6b1df71e030dc6 +9d51c242324df025c96c5429f19c7190c77666731a46f8143c37252db87120e7 +8bf1c9f22b7a80dc4b999baa805d9f1eb5ac4e28a70d0fbd6c7dfdd7c1fbb560 +26073cc5cae5a1cdf5f8471585165ee0191d353ccdcd05f2117cdae9cce71d72 +9d0f61304f1d29eb2c5b6ec18290a9b27baceae80a405afb5664ba513ab26596 +bbaf87266ef51dbd35112eac5576b04b650031528738edfb937dec3f9b0caedf +2447aeeffec2129814289b09842d3dd90b86300f1a035849b87fc2dc2e4292eb +568ecf43a518512f9dd5287988e688c5f040a442150d447196bc5216df070c0a +551928a0629cf3c7e430baab504b2315156cc367f55f090dc1f6ad0214353780 +f1cc7f4a9b262debe551a5de29cf1cdf08117de2df62f164fa91d166eaa72758 +9b862a3dfdbff31b404c11e411f0c642ca06962c18304403db2eb93cfadd392a +c7a030971f2f897017317054572a4b5fe8fda9dfbad4c079b0c9c3e3336aae94 +b11baa3d0257a88a1919be409db0e1ea7f2f55fbafd3b4a8b5f55581aab8fb31 +a233d2081374327616cfc745b3c7039dd295a0b5068560fb68eb67c567c589f6 +08a45a312ca25accb1775badfd7b2eb0f4bc948b62362b3bcf40766b987622b7 +da7d9b68a7909104056fd5e0709a5928a0c314d407745c9b5f4c9a65483a7bd2 +3f550b7030671bba32d959442573fe4e6cbeb995b2fbc273b6894f70701fd2fc +3f6ed6fe95cd521e83862350df167894510c93b44032187f171773b42f483e61 +2048daacd1f4be69c9ef5e6c1f63c72b759651047cd9ce71199dcbab1c36c1e7 +da6dd872b1a4c03d7145e4dca72064e2ffca5e43fd66a7c532feda1000904032 +843fcb1e24d99146dd27fc507cfba1a63b0843af0ebc0a336aafee4eb27d8796 +c0c1298a23874928f35c7cdd27145835742eab898c2d04e7ebd5c0fabf4806c4 +d44ba374cb1ff5052be5066d3a52e1f2ba4841fe35ae6c097cdd1c8b04883764 +efb0f51f646cccd0321ecab07647066dcff2bae0916983248b080730e45b8aaa +df9fc1805e6c5fb1b536c598ad35c0f69f561dd949ed142ba7fde6778620e8d6 +ac443fdfdde254bf1475ef95bbd54d1ec0d9b531d1cf690cfea6ea9dd4d732e3 +e5bcdec23e92eeefd411298360effa920d3ceefe61858b9a356023766a181bf2 +aedd269b7d4c610fcc03cd8fda705186b3c842bc6d7299abf6f704b419bd2b2a +a3f75c8b0ebdeab45eff8f1b9bbb9b187b03a0735b28813860d2916f7279fc8b +e6df8e6f5155c3dba782aecff52b1be8710747c51e9a76d2574fcca699b9fdc5 +48043c2fb363a596f6b3b371657bdc2be900c9707a78fbfcbd1c0bf881468e2d +f7adefd8bf30dee1b2347aecde496c012f0cbfe3816068ff31f3b3adf56b612a +632703d469de017d29769ed5d55aa1f37651c11f0739ebb4c3af0a3c62c4523f +05081ee09ae3076d361ca40f8b13d4a631b9f24a5366f4e678481abe3993ce9b +ab8813c00b4b95be15086c69a55e65ae908fc071f0b3c59daa9719321edff148 +62fa6efdd42bd192d0138f6bbf5890f78a9c38d147ae00157f4307dc3095432f +5bbe889da9a5bee8669c6651e758ed5ad38856433fb9702d70c12aa29cea4424 +8e50e17ce514b8ef3131a972b8db0b0be78c93831806e98916572e7959b8317c +54149e5372718963eb74983316ba7a0418a921433d759e73cdacb1bb6ac69df6 +7961040ac80e5459f3120ca3c8eaea02497b64ef871030f1501ad79dc405019a +00e355ae3b7c48ed22873196a98637ba2b25bf8b946ce509da8bd25456373c29 +dbf08751baf2bbb23ed57b32d3abe306c29eba95e3a404c3a15b172a8313932a +c5ae1588a0227de80156713ea8239110c31e0452a2e2cf376cfcf90a41f68bdf +c08018786b166a5e9326b1beff6a4ed7fa44f523911d1819cb6aa1ea58fc52cb +51a74b886466964dba973726352554470d5c35353b60b68830bfcc8f14cbdf00 +f8974ab1914694025375901d71324ba933b2ba61204c4ba5f6429077f429f17e +8f1f95c2308b2900bca909945f96f33d73a7a2186e28d4132db91aa6d8751e47 +fc1665361bbeaebdcf6bae29423c6fadb892bab7cc872ee4cf3490d2956907ff +baeb199c2ccde45a2649aa2e4d8dc65142df9b332691d9b154dc072ea33d1710 +e64eea0969e54a54fcc812d6c8ce00c790d71ddd67c6b8d4ca7baa6575cfcee5 +8af7c205f455c24ede135b653875780f54c98e3159ed284139f4fb00f64ec8c1 +1191c0b484b9fd15fa6f0fb5b6999de6358741a0a48abeee116a44cbc015c0b4 +5584b76b7e73d6d3148bcd17cdfecbefd83aa402162367bc40e7835fb64a4b04 +dc4827158e4b8f193bc470c9bc0c46047b4cc4d797ea9ed7f35868331517fc43 +15b9a080d5171104dce9c6b8d9105b0031f4b1f9ce7d8e2b7d08c5d633290fa8 +8356b073770339203622f09407cd263412ecec6c7f58f8d8f5be935ccdebc64d +5f0a0287fdcabae9ffd00c24e7cfaeddf9fae5f60d4864e8268885f71a8a941e +facc6eca987d76f1ca3ff9795045b4b9057a7ecee50a04d09b859207ee869750 +282bc24be3dd0d84e33963c4c1a484de057541399cfe79a5bded1bb90833d8ef +4bb6f36b7b9f236ff00bcf441ea1e1ea04bec9f3402e7993be2d024a5d06c653 +6c2c090d51187ad3eafd64bb0389da839cde99222868ce4ad6e03d6fad5411b0 +9826c410db9179d22db159ff72b0c9246c690b527bbaae566d145284f3e7bf24 +20c2a7bc2ee6607ced1e89c558f3a4bf132f23ddf53b240284de7c4839ef3b53 +6532a60c9df1cbd3470d44c7c0d26136cf4955951fdc3f0b85ff4d4057f47a6b +8648c3640059f4543316ba9007c0e784f79c79156b04f60b030cb98b4fd47577 +dccc5c223e0f1211744ea18b7c0e676bfc5ca9592a7d9e7c13b93bbe2bc62251 +71d0a4c44950754ddc2ccd486d2b702f4188987595bf8988130b0c059b279418 +ee3d0e21a1a8e2b1852ba7e01e9cf19746131e126bf5eedb08e6c635d700b0b8 +caaf2de2c01f82ed911278abf80a8a47aebe6330e0d1bc308f00a9fb8944052b +4cf11ec1f73f3dbac7a9124c6fd2009944732d672c3d4cd2d387b4235fec275b +907d25342890dc44dd670020814e4155463f6bc4804f68efab0501388a3ef816 +e2ed8b83840782e22be4a0b562a6b0361b8129872c5ca1c0055940378bae85f8 +2a39e182e758f970c22aaead53ee5f934dfe39abfd55bdd3275b65b0b71eca9e +467dd786fba4f8c7084db6069703dd97b05f80013cd99dea6698ad3ab5f09f11 +5a00e47fbfcd13caaa7e82191d1881b3992b69c6cfa15307d6ae8370252145b0 +97709d56b69ecb253757ae7b1a11cd9a8c2210af5c91fe93bc2147681b19c75e +a360636446935d85470b0c28d927b07afcf63809a53c0a8baee76632982e9fa3 +1cd9b8f117a7b41689c83a23043550a3f165bfe81f0e0e224a6568e60e28c466 +28b633d66fc7370f65fd2ac5694e7c9a616bb88298cc7a7bdf9a39f1ffc1aefb +16de11a575a58fb8f65c47aaab60b465d3e8eef5240a9773874bb658d7356723 +f449270f0eaa74cda1a6d5f732bffebf4415e77d3a566d48e47d7629fa6b8a21 +6e8032e7ceedbd8ead4e922685d6be6448a14fc839ae4a74f6a5a59c01375a4f +d57555f569d036d0337351c7305c49217103adfe4b6ddc8376f134eeb11ca705 +92d1e2e80c423ae05a0822375e0d3f059cbe839b07a290a6b421c7d513f1961b +27c632269a8c35eed49010c561b580412b9363aa0e9c76e210b6a86a55016da9 +e04e8f7a5c525ad3ef4edd7550b6e2f6669508051973e36e435579c178d2d39f +3e27bde7de754bbc68da87698aada323575cca997a1cc75f706634834d1dac10 +7103b40c71a1e59358ede2d1ee87082235e808481f456968bd649a268e566680 +3a8471be291dea8358c52ad22508da5762fb1e1f6128b34e32bb68039237a400 +c1afe9e07c69d8b486281a9ec09067d09b0c8bc16c0960771066aca2f4c18907 +4e2ab98be4da38b2ef92f3a922a1fa3afa66ccb7dc5c59cd06f7b6dfe00eb86b +8abc28551decbfcab8ae483839cbedd2cfd6e7c8f6348444ee0e67e943e88444 +f9f871e9291a5eae7d63522caf0396c4cb477d2df5377c39c46b14125e100ad2 +4f15e1aa3dc33b356f6a6d9e1404efa7f05b6208948b01acbfb8a1079181872b +f06cdcd561a855b1884008e605d67e653ef3357b9c6d5af90228c6b4676644fc +cabbab905c7e9164a901ba7fd1c4742d454784887907b7e1a9b2d1c844ca2f03 +3991fd9fdd19fb4af35738bb380bb940b03e9fddaac1f64afc6e3c99ee1d7dc5 +5ce48afb651c9595e41c894a8d75af382c709720a2e94f03fa45ec2cfbf7d3e7 +6fc0dba65ae93bad352e1b14aa0f3c39cb8766c106a1fc656401e4ff5c4584ab +974e93b2bc7f16209d80bb566ed5b67acbc84635bfea38f1e87c39027a0d1ccb +1a93049e936116e1847fb3123585096edccbfd0aa63e623b8503a0d4760aae40 +0a88a7e87400875eac6f14fb7a7a8682560de6cbb43fcdf303758e182c4d12d3 +87ed4533d7c9f2b8e13489130d6ae5fe066f4ad856b167725e4ca2e7b842dd7f +599de83285aa617d5ead39c7ac6ab77e42f5e1153250803103f7769cf35430f4 +fc5b91642a1b798ef39d359f7196d3f7b0f864e016da2e43ea1a2b8e8334e8ba +c0af735eeec83a2e344ac6a62461cc1dbfacfafe1cc1db2ab1655ba0a7d64eb2 +4f165b64608fb31dddf15f708f052adcb6ce974d807e6ad8f7b94979ac09fd65 +163a3699cb80a8a32d49efcafad68856da3be30b616873ee511e361963983106 +f700c080555e719697b0de489286e397f5f81af94632216e357f1020dacd270e +c7d9bb4235aa738a8dca7f23680c377a643b0b59e6a7fb83507c8cfbd1df3758 +3a565760689d25526f064e961d0c3d2071054eed80850bb10ee9e73f27654d20 +32bc2a750714ece1a4ede7b7c4be79f4e0c3d7a6b433f44774d6cc6a93f6dd1a +29b855b805788ff4436794d2aa348da5ab69ce698e7d5b1956d1a7888607d7bb +a6b59226b144dc8589e4787c8ab0342c8a085e12fe9ddad5fe1c185099e207ac +f4308371fa4afbdf90eb5d08a0076d70615a4d17264baa2e712063032c188877 +fcec4971f2c7f4a9012fbf3fe15b76adf4f35e5c0f337862584b12d04bfbf85e +8b3e8eeb64bc0fea31faa7a697b34be4a8c3fcae69ebd8c25fba58f3d101c9cc +7d6cb4a6835a5262a28f9304dae690bfaf6eaeef09d44a0418b78e2a4d381047 +35a4523e8341a74509eef699744865f10168cbe739d4eed29e6542cb0dbad470 +d9dd0ddfb8164959ec59a632863920e18ab5c001845ece330868dff7b7ed51a8 +c50a11861df524d4dd80c7b370886921b9f6b28015a83412cdc4fab786791bd6 +37081dff54753214e35477c847ea13286c28fdefe690fef446f4cad67ac3ba20 +958743af664767e8d8ef8a389ec1c138128aaff1b7557b52eb59dee75db67cbb +60d9b08b3a443b10bc84417aac4aa89973c8d8932af5b91b82b7569cac09d69c +0cae12b7411269a1c550c94dce68d60ef418f21ab29ab552eca48a4ee94a4b27 +5d174ae06ce469bd5110d23678269b244cd596650ab74f024460c84b564cfc31 +f10b7d0a15166acbc8e9a70668aecd4fda96ec72af4d438f3e9c42e068bb2504 +66e725c097f17e533d6ddb0223a8c018e6445a468e5afed7d7d93ca5e8807f6b +cabc59e9d7eb20de335ee9328a6726bab86e2bbcb847e18e2be079bda3c1a380 +2d338cc33a35b0bb17b37188cbcd54c760cfb17d5da0c66197da9123942a8789 +6bf0e622dc9e93457e1b73b7f5b96c894eb76af290e1f9dc439e36e972b3f865 +187781130941b3596aa9dc699a6a586c1acfba7e1d7b340312856ba9caf63662 +02f6f303f92f15726dd083b1555263d2e3bd50baaf7c0bcca4ca774f5e35cd0c +85caca2366e06fb942b482bbfb1926fe47b1d95a83a5143ba801efbc7d62c003 +2f915672ee8ae1b235096c8f62635bc5c42a03d6be518e9c4a68ee0d8e48d1e2 +2de2828cfc76efb4a12ba5c3a3a08175545256dfdf53edf0c91bdff981f5b9b3 +fb8b9ffabb007646755e76a278cb1752b8081ebe91dc77177aeca8ca90ce2077 +f90d35e6f7aa90b1505e472ae5f09bb05f2a37b5e2cea2e1a3e5fe0e367a07c0 +f31f855d7f1c7b4272ea37398bec83f7b79fbf86129799e2ca9e07b2a01213aa +2d73499beb7ff978dafb22518227532efae2a60cae34347ad352a00c0adfea43 +e3f95208c6f5c21e1fb3c0b07a1d143d5a8b55cac717fda2b72ff0c3fdbabf56 +34cf4c2051dbc59ec4c00b6e1cfe454cdbd9fda033cda90a2b66fad3e8271e17 +fafa42139467358062f2a1c244c48d52a9fbf5c1f360bfa45d0b03ec7ec4805f +3e7f67e258936a690090abd309b2b93424efeb8d5d7deabee5eaf0db5d56c33b +3a728c08624ea5d0c85f77beac600c5fb8c184ac63b3fcc5344f22dd878abe96 +4320ad7ad8803c28b4753b071213851247f35a2f90a59072312059373cad6276 +2a17bb449602f8424ac583843810a1c6db922a87bbddf800bea24f6ebb071d2f +3a82053bc5ddf3eb11c3c32f551a81deb3000e57282552fc0b8ee17ad909bb2d +b851793f65123af449d07279de0999aa5208cc293593eb9ef607c7e20e873e64 +6097ff18507152a8d111e24e419c148a5a1fbd339428f184bb3c5ce3a36af6a6 +9b211cee9150c40506c1e990d19ba8b4f0b5c01e7c19a05904cb63d127118908 +5ab937a91b2dc3b59ac6bd1971c084e2c156c10661b2c7a3d170bde0fa3e682b +abbbf187ff39304d6e5ae80eabce1c54a0bfe09f22d97133e94afa9981e837cc +0a80b34b29899474b65ebc6df73e5abc2f2300226c4e96e7c32b3f80a26fadc1 +e503fed433b7cfaf681e6cb33057a915ec53112e76cd9602ff64a75543eeb82d +e6f45aecf9620a5a3bae1f4459b9ae6162e472e93eb2e0daceec8f0608721072 +e456972d5fa6bc4a45afe5a8a5694e538e659107ff4cd6a8ee3d38544e397ffc +26a98e8771a5e07c99402b1722b09cc959f9d25126a82c7820de21a9855eda2a +1b7e4d0145ec7017caa0349bd13177070509276241a0aa7dfae14f1e2d1805ee +58714e9f2a647fcede216c7b3297910df45f91d8e0c9ec279f16a744930f3b77 +0b80d299b44b478377ef237341ecc5d9a59b333cfbbc229be944d368559988c4 +940209b2a4fe6d55713acce94181339a1d70589e96a54a952163b072e116f5ae +4e672556501ac126d0dc91531894b69d5c8c6bc531db69a961cd517d4bc07375 +5683fa7cd9a77fc56c6ae62cdf6bb0857e8906f835035e78d3f7ad14375b6f21 +fd0436e6c914c3b8d6e543df1ee4b992c024e9d9fd316dfba3ba9809a089cc99 +8f34466ac94d689350a5075998d7240efcda132f3b8f2ccc0fc78f5d77a313e4 +09d5ae9f2839b9ba67cb79e1a0e7ff8f77e766aae4e1931a51890b3f0e3b39bd +5412ab04baeeae007ef88984afdd56b7f81f403fc6eae6993367ac9071b396b7 +f690f613193c638b9c6b10350d0170696db08055fc583cb04c3c66cb71d354a6 +6c02a9c33e312dd36d23c37836795088375e42241d176d2168dcea614a14850f +d283c962ddd274d58fcbba7668fc6987cb0d204cc4db70ad44c53ab5da5e15fb +55c5c53b85d0468b1798bffc105d55973d081db5cf801d98525597cfab8be326 +f6723c6c5060c6001ff9da8d01855933f68d88ea8c403e6dc8aa446e5eabd57a +4d8c080ab4c164e3a97c1c6e87b3e279b97e99127fbbf1126099928ea8c0af7f +3e592175164f46dd15ce60c6087d1893dd388b7a8eb65d0c38c56fa3fbbf88cf +314e3ca2b710ff61f610ba945f7405c373c2b4147713206be618b238ba3e367b +9d158dbbbe4dfc0aaede3f9457893910f3a83bf6baa3688fb1176c93132e24a9 +bdbecae4b53fd2cd971091dc99359d11af0aa3e94264538203459faf0cc36410 +def19e919a2714e2ce1895ceeb1f26ce613e5f1bee352ef3a63f94fc343fe7c3 +4f831ab892db8e438144821d5a701cb71d36526ac44a9354f3440f74e9e1fda7 +723f0120f75059513bd52cb2781a08b52142e53d0a4a23d7d003cae26b838552 +a1376832da4a1b8cc20cfa9f72fe3a9380a282bbb73a9ac07972677045589c0f +e08cd002c80e0064a732a3dbb6dc83393d470f826fecdba4f1d2e4be76a5a433 +9a5e25b1f2b734d4f1469b84d977e3ccbe5951c768c9274d0423fe5d740ac8a4 +e3affe4fa68dd8cab058ebb21962d72dcfeaaa47e541a2ff3e6ecdacf0484ec3 +7151b6b1fa6109a0113e3bef3145b53d05c62e0391e266393ba1a4b39a806a12 +f2fe6562dff2fc97eff531ded8dc6e0ed359b2bf16d00031e9e0753bb32c156e +ea81b7db813752506558d39f967450fa05390368950c456f106211dfc0621e52 +66c14e1ebc6a9f3de3165500218fd683fa0dd2b4fcb937f14f7d3fb85faf556e +3f53ad74a4bcd96872b46716e0bd737dbf5d3115ce382ffb8243c499503283c4 +274a0e51c9d41b302fd57c648a4e1769dcab4668ee624f3b9c84f296ba9ca925 +056358d1e7f5a56ce13333e53b5676d5e9ccfa4cf68f18f28aee890b1bfad737 +03b64dcd7c5f34387f4522f421045adb7cb8b552d5145b83e24667d4f80cf636 +45f80b863f0293b1d494ed65532c3963b69fe1a858850799155ed2450d836d30 +d28dbfc50c7a58fd713346961d7f0e5513394b29c06c52b786b48a2f13b95b9d +56d6aca8250f3b716f055275af003304d36713f14228b5ec40de7c3ba9ae32cd +eb91f8110bafcf7c92ea383bd9ca4d4fd0f6ccb0902b07841a4cbee2cbe21c4a +8124a11ef70c32d89e4b86d0e84294412f305ec186afd600ef7d72634e931f60 +a75a22b03abbb87b4a163044b96d43cb1a8eac9484df8955edd18bb298612f6d +a9ab0fe3153be8def9616e883e5ca081c79f607d7439ce5a28ceb6b17f51f0f0 +9affc2a8a766dcbc19e1dafdb34bab555934bc8b3bf2255e4aab837de34079d7 +3b310d8d82d2abe249a28e1fc6f65e529c301933849883e86fd7b7b44271da63 +15913982ad40ffb9c796f3b519f84d15ba2fb42fdd632e042b7d9f94b28f5b81 +5139956c9d4e3521d59777d3c34a07e4ab2d92ce1e64c02c612023bd84153d02 +ac1b86b34937b82522277d5c11a7a3daa95e63e4d122e626d9167a5a17b4d041 +8d5aaf88b8a59de837362e48c9fd7123c3c30d906cc081ff9a0a1ce3b168b9e1 +ce50fb45fcaa3061d7dd0fce1c7051ea3c032fa52fa63442629461bbf742df11 +e6a548e7f73cd0441032ffb059fb81b468380c5eafb679d5ae2f384fca2236da +5d5d878a6e29e282d045a419488daa5d3500bab9ddbb6123112949548b37cd85 +46e466baf1c18d05475029cf8b06206338df4d287541137ee8d509ae9e3716df +32627c0e28eb8edcc62bcc37536bf8a36b8a545d539f2754fc39eb8da84fef99 +02a3733603379181d07b780b1f0dab6b69ab3268adeba5cac438510e80b96eb0 +79ccdf7e76b2f88a37beb1b83e4b3529ab0b6b1a35d5b7add114578ce3783582 +fc23f6c5df43330e9397c71e984817b908dddb6a02e6da93c87f623b3dcacbb7 +5c7b032d24a5e516bfe910b1569ef48975b8b7448f2469a41b4ab69f419f9f39 +2d3ca7b9bc768151274aaf55b06c3e399cb19b6e0f15ec8868c6e668e524aed3 +ec176ffb6a8accdc068a22eff5d79498a00a99562e490c7cff7e59e7d3b3b1f5 +8e48e1ef5e08391391c7e9ccebcce6376480909156717c07de203306e8c7c7db +0b8737da43a6a8e9218133af777bcc505e5f5375a3fe8411cb5a317619e9d259 +07cbec0088f2610250754acf52e22dfd59a160aace94a7392f2f3a578980b1bd +6d1dedb930b6948583f7d978fbde76276822ffa4014cfae2ac22913621b0f778 +d50edfe8517092759af5bdd038316d1b08f2b31550d1fe1fab8b62e79419010d +6a59355a2e73cb08443700ceab7ee437401683f20cc5e9a21f056866f2b67dfb +4e1e8df8ddcf2c5823e7fef6f91ebd1fa571ce77ba080c0f604a263379ec4e2f +f5694975fa6adb5a646ad327db787c204f9b5ff9f9228a3337c111d32cbd6f8b +1da885425af61709e40d4352a1be6d8e2775372a3f7717e9aa9b951f79d2bfb8 +399d1f915e26836d454d286655657b72378551cf133bfcaaaa2a45e98f840bca +522311100c7c92f46661aa1a75fb44cb28a1a7f0cbeebc2008c5fe882108e2ee +1e0c683320c084d1e5ff7c0657de7942b0daad28494b24649b271d82c10b7373 +f02be60741104e31bc70a2fc2ceb7db132f272caaf093993de5cc3d139d559b8 +ddfd287fb1705ca461eb03a4e039428ad0ea3baf3b29f824fc8c8edfffed4803 +e5d0af7bef8aac625a184911bb28809661eb2631a078fb9a244f043adb379476 +d0dcdabb21be4f1cee1b21d775a53dc6a1bfc4a8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/Vera.ttf b/ogclient/lib/fonts/Vera.ttf new file mode 100644 index 0000000..58cd6b5 Binary files /dev/null and b/ogclient/lib/fonts/Vera.ttf differ diff --git a/ogclient/lib/fonts/VeraBI.ttf b/ogclient/lib/fonts/VeraBI.ttf new file mode 100644 index 0000000..b55eee3 Binary files /dev/null and b/ogclient/lib/fonts/VeraBI.ttf differ diff --git a/ogclient/lib/fonts/VeraBd.ttf b/ogclient/lib/fonts/VeraBd.ttf new file mode 100644 index 0000000..51d6111 Binary files /dev/null and b/ogclient/lib/fonts/VeraBd.ttf differ diff --git a/ogclient/lib/fonts/VeraIt.ttf b/ogclient/lib/fonts/VeraIt.ttf new file mode 100644 index 0000000..cc23c9e Binary files /dev/null and b/ogclient/lib/fonts/VeraIt.ttf differ diff --git a/ogclient/lib/fonts/VeraMoBI.ttf b/ogclient/lib/fonts/VeraMoBI.ttf new file mode 100644 index 0000000..8624542 Binary files /dev/null and b/ogclient/lib/fonts/VeraMoBI.ttf differ diff --git a/ogclient/lib/fonts/VeraMoBd.ttf b/ogclient/lib/fonts/VeraMoBd.ttf new file mode 100644 index 0000000..9be6547 Binary files /dev/null and b/ogclient/lib/fonts/VeraMoBd.ttf differ diff --git a/ogclient/lib/fonts/VeraMoIt.ttf b/ogclient/lib/fonts/VeraMoIt.ttf new file mode 100644 index 0000000..2404924 Binary files /dev/null and b/ogclient/lib/fonts/VeraMoIt.ttf differ diff --git a/ogclient/lib/fonts/VeraMono.ttf b/ogclient/lib/fonts/VeraMono.ttf new file mode 100644 index 0000000..139f0b4 Binary files /dev/null and b/ogclient/lib/fonts/VeraMono.ttf differ diff --git a/ogclient/lib/fonts/VeraSe.ttf b/ogclient/lib/fonts/VeraSe.ttf new file mode 100644 index 0000000..4b4ecc6 Binary files /dev/null and b/ogclient/lib/fonts/VeraSe.ttf differ diff --git a/ogclient/lib/fonts/VeraSeBd.ttf b/ogclient/lib/fonts/VeraSeBd.ttf new file mode 100644 index 0000000..672bf76 Binary files /dev/null and b/ogclient/lib/fonts/VeraSeBd.ttf differ diff --git a/ogclient/lib/fonts/c0419bt_.pfb b/ogclient/lib/fonts/c0419bt_.pfb new file mode 100644 index 0000000..4a49dd5 Binary files /dev/null and b/ogclient/lib/fonts/c0419bt_.pfb differ diff --git a/ogclient/lib/fonts/c0582bt_.pfb b/ogclient/lib/fonts/c0582bt_.pfb new file mode 100644 index 0000000..9baa1da Binary files /dev/null and b/ogclient/lib/fonts/c0582bt_.pfb differ diff --git a/ogclient/lib/fonts/c0583bt_.pfb b/ogclient/lib/fonts/c0583bt_.pfb new file mode 100644 index 0000000..08f6871 Binary files /dev/null and b/ogclient/lib/fonts/c0583bt_.pfb differ diff --git a/ogclient/lib/fonts/c0611bt_.pfb b/ogclient/lib/fonts/c0611bt_.pfb new file mode 100644 index 0000000..ec6ed06 Binary files /dev/null and b/ogclient/lib/fonts/c0611bt_.pfb differ diff --git a/ogclient/lib/fonts/c0632bt_.pfb b/ogclient/lib/fonts/c0632bt_.pfb new file mode 100644 index 0000000..0701172 Binary files /dev/null and b/ogclient/lib/fonts/c0632bt_.pfb differ diff --git a/ogclient/lib/fonts/c0633bt_.pfb b/ogclient/lib/fonts/c0633bt_.pfb new file mode 100644 index 0000000..d68f639 Binary files /dev/null and b/ogclient/lib/fonts/c0633bt_.pfb differ diff --git a/ogclient/lib/fonts/c0648bt_.pfb b/ogclient/lib/fonts/c0648bt_.pfb new file mode 100644 index 0000000..72a1606 Binary files /dev/null and b/ogclient/lib/fonts/c0648bt_.pfb differ diff --git a/ogclient/lib/fonts/c0649bt_.pfb b/ogclient/lib/fonts/c0649bt_.pfb new file mode 100644 index 0000000..b5d4ded Binary files /dev/null and b/ogclient/lib/fonts/c0649bt_.pfb differ diff --git a/ogclient/lib/fonts/cour.pfa b/ogclient/lib/fonts/cour.pfa new file mode 100644 index 0000000..b8c097b --- /dev/null +++ b/ogclient/lib/fonts/cour.pfa @@ -0,0 +1,1954 @@ +%!PS-AdobeFont-1.0: Courier 001.003 +%%CreationDate: Tue Sep 17 16:16:38 1991 +%%VMusage: 57844 76768 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier) readonly def +/FamilyName (Courier) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263786 def +/FontBBox{-48 -288 684 841}readonly def +currentdict end +currentfile eexec +b2de7b9b2a2783a9a81f7a04e7605e0bcc84ad7a981f9d6b201c5fc6acdad3ec +d09a8a1907296b7bf5510822bd65c174d41912f5e2bdc23ec621dd28cb4f8b62 +5882cca862ca3c8bbed56696f8e17809439151596792163977eddcdae7b5c346 +e93a0756e7da36a403e30b34b70eb809ec5a5e6dd43dfc5d482e2424a93fd4d2 +d0e648621eb8f9339f10ba2db9312ae5c071e20946278b5d54f7858a41f0a1b6 +b2cecd201fe0cc773a733fd892bc4352fd2c68554ad49658bfececa5de0a4178 +07560879485b17f950018e00fb441ca6e0face6fa6acc95daea5b530a954419f +a15ff97de6a7ab23540344e0193d5356ebdb99f60fce74a4c1828a36b3de4ec4 +92551fa4f0cc7ed791d897ed75bc5d034f85f7326b59e16a9e9d20d7c7072a4d +311fff4cd4635852ab3e098236a1eb05be8e5d3e4ced8ea930076fb27ae7b5f3 +a135b8e3cfa19b4144c0672503b51641ecdb779eaaaaec164216beb4de034575 +66b93918a02aea1730b7f138623f2df763d6ccadea312d4059487851ad39fa5d +6ae273d56563eb3788c4d9aefb2bd85feff2c8f6a0c383f653ddca8d4072a397 +26bc47616d936e336d1502b65cec60baa4f7c423c290d9a8e067b433ad52790a +b3de64436aeb25a5b8e18a91e616b9c310d8bda5546cb5f46e8d74adb8f970d4 +88a1602e8ed3390cbb9f1e4564f70b2141cb8262cf4dfefbbeff3d15f49afa29 +da9deb04f1e004399a20f57f770b838059aa75ffb5da99581f2fc90dd7b7f4bc +3d3d32a8b2df7a3b9ca0311f5a555e6f05babae4c577b02379370e5a364dcbb3 +1962317eded89394dd26e5e37e5f776a9ce97ffef9429f9e89773a6db3d642cf +319957b03a0434f4f81e782121d8fccd08de4e54e29b1a25b1436d859db45cd3 +c254fb02b22288d080139bf20c4fa130f98e83fde39963c3068c7aafa1c6afb8 +2ff6753842d6dab630e63fd8f7853e9358bc6c074f0acbfe9d56d3b93eb7eb9a +901ed2bbed92737fcae60b95e7186ca800ae2db1570ca4b0ed9ea9fed82ad73d +ed3977472c257b253773de2ca37eccce4faf68f1eb5cdc827dd5bc8e3c03bbfa +e9bd30bcb3cc1d35660637a882f0f4a037bd07fba1c6f5c0e8a88088ecf853dc +b2dc41ee4ed1f75640a93e9208fe5cdc7366cf3b738cf4177df4f922d8081006 +8f8f2b0143a44caed520141238781111a1331e7a6afaedb2019cf0eb438177ba +68fb0d443989e67d21f49cb8a52711507792c45bbf0c25f634cf7c1323d6146f +7c778eff204c71778e5e9723e662106caeccb514b9be0936aa409567ea40b9af +b5852cf3c9cce25acbfdee0097f828d90d21cfcfd46ea083ead540877e565883 +3234b8609a3f376ad94098ec1a1685323be81a64a6174851b6e8e80d3d8cd6f2 +41e2492bc07c052dfd66c7fa12ea0ca90a15f49194b0dbbd6f80aa49cc52e0ab +134571c2883f5adf6b57a036dcadd18f7e397b87fa80be532ac7aac3673796f6 +f20f5341984695dc99359d6e923a79441b64b85d405d53f89edf79d76278604a +4001ccbcf3e10ca83f71202d6f0a2f26db5114515f8eb58a2eedfc6c9f1f9a3f +c40205c32ca33771d7497307b4f67618bf46d3ecadd0d5b6f21d298784f9e22f +e8a97443e951a141e79a2cd6e500653fbb8e34613e57c270301dbad7b89d35b6 +b7f6cfc81e5e9f58508bfdd6c50c8b4d9114f9d9d0764232abf8c84b8c8d5284 +f78138778565991ffefaa9b63d205e74146229c2656d126e3664870c9800b9cf +ee76f078dbb1064aa5609c6c553b2c660a4054e46fffd645e8eb8864d1e15c33 +e20d690b90b6a5b9a7213bdde4856236d9f00d882d8d8cff4b27fbad85503029 +b9a4a75da575bcf29ae444f0714b5580aca0bad9460fbe2c847cd770825c8b0d +72fc684ae45ced430997d41467889fc1969702a44fb77e8de557851d4eb34433 +631c225a516281ac5e0ee6c0dafbc40855c315fd60559e53b5f33d9ef0fd1d04 +31be569d13f6dbd52bed9eff8e7eb514fb469daf3f9f31c7b8d31411692a72f8 +fc3907df11992b3aa76ca73c82710c4901b4eed793d4909a451f5f09f73db0e2 +0c32146422d4d5f83a4e2e92cbd9297944c8bb7205aa2adfc88dc6dcb4e82ff6 +07e4278885300463775ad999e2393ac0f67cd635d955f4ca5a9f57662c7e76a7 +26e7c4256827f0c03cec6855174fff2b78f1870ec2366a59a4e9983ce00941bf +17dc97b59104d05746ffcc1f7bbfd007fbb0eeb36d42f959c90382e49737352a +f582a0c76c1d86a1323af83fdfd653373a3c3b7460c839858f6fcc885f3d47d1 +902001ff877043ce9d13b1f8d1e819320f6374975e740aa77886063741e378c0 +ea28694a1bdcb89c1e2d5e8cb9fd5ab6d20be8cb0a2a74ee73d5f4c32b26c067 +0e7608a372b6e0cdc1819879ca3eb1870c22ee21b8d42780d9ca1489a4abaec2 +7dcc2fe096c55b528baf52e468bac2ee1db1c6e1609740828ad1f4faac82b9da +066b8472b15faaab3109dfbb85667a7def1794ff158cbd6fdaf9987567d8a6c6 +f86ce77b9aa3fed671f7c74a345812c978fead18ac776f7cc2957540a1720941 +5b9cc4bbd5d8aef5997110b41daf2c3d41adf834aa24862f052446ff8a1747f6 +5dadef8451aa72f9c367f21a98e1cb18b2010fc17637a673959e5790df9abb82 +9314ba4785b7bbb5e68cc6da2e021cc4345f4e6f5c6488d481947454148db9f7 +c289ce25764ab1d810268a6db157520ce871f1dff95396f03780bba8202d430b +f76046c04e1f0ef462afbf3650327876b5ce19d87ff9a6ec2e3c294976778c66 +9bf548ec241a295db3cf4139936b6127009f9807f48f09cd54e920474fc1ee65 +8dc69c4afb90f7a737df582b406c98801e77b02a02212a0d924ed58ead539b7d +18f4940a717b46ad908d521b7d07237aa25b4969239fc4968f5cd9827ab24272 +3d29ffec1926011161405f8a9a5c9e1bdc9a9152af563fbeb44d5e4ae05405bc +6a92b23e71cbb866366389fe0d91bcacd5b98a2ed4dcb9976ef9eb6c7cf06d9c +185ef69af37163d441b756f08060fa733b3ebff43160d0ccf5befefeeae06468 +0d18f7c38748d1cec437e170ef4bb6d85eead3105b2a354de80a6396c185caa9 +1d57966cc000bff2880e068d61f2ba670f7f9a2fad0ac5d1f205c1e1fa0a1d3c +110e184837018af730878a978ab3d08581e8b222307d00f86909c39c12d40bd6 +c7299dec0867f7417de60edd1897bd627767b29cea62593542c642f1089242d8 +53f2db5f45b7b21fa906851b2f28437933bd4229e32d093eda4d448641380da1 +9696d7a77fda761865d9a4a8ff48de5aa6550b2f80c7e7fef54f5dc709a9b2fc +120b03223ad9ae5d06298699ff21ea2f71bd34afb79799e67cd496a57e417f1d +87bcf2bb0c5f9fe9067af267e5740c26d6f3a256330d68f138c81883d7c07eb4 +cde5f6b5d82cbf5dd32e0c27c393cbb77cad6dbb058fb1c6653a5cd1a78f0577 +87c9dd5b1a5f83a13226571d38d367f2a4e369b4651a77789aa785f4a6561c92 +e0e82f217b2597d8a180ebe4547aa1500b0f814d309b5b1fe9dc53282c914407 +0fc79d82b5d5ae8bd272b022b35e66cd260c046d102eea1a1a4c0d376daa9b2f +e0dcb3a7254130d5787191998d88d4872834f331c75485d09799d467bfb62465 +5ea38fd84edff90fbcae880820fda0f2a3bd5cab972b4d22f1c649f970e05549 +f33e95a6d0af69653ae918872958bf100a04a7c61b8fe7433697a92b451ea444 +4670e38e33893e59ecb4a621ecd68e76308ec0eb2716fc7427ffd64fe309a635 +71c7b86839add49634114c0aeed57a2afb2a46afb303fed2ca4a7b3cce180595 +49bccef00e92339805dbe1b0c05ace5cd5a9c6d8931cdf62ce4f5406f8ceba6b +29b696b0e0ccbe8b9f9e1afdcec58064e3daa54676f493af1ebc8a2c26ccca62 +9418f0015d84e5931f620207d2c8b193113c8e6af5a0738f7085930e735227e3 +7bf703da80016e492cdffedd077be121b35093b031c35d369298f78134093147 +363062d031233a26726d549b16ccafe56eb0324ddeeb4ca8904da4fb9016fb5c +46b60e873074c2e0c78364bdbd05e0246fb44e77dffbed7fb94364a0ec0970d3 +29ac31712d356bdaaefa99865561391247a78c8ff19f6086b4d8cc464d0b3b41 +7fbe5f6b3e68de6ece2242224dba66940dd25a412c337e4c19c3305e4e1699e4 +53bfa096d66bae0ddf3a3f6d84cbc7478a00f2ff606f86913b768a18f5adafbc +8b18e653351cf8d251ecd0f0d3002862223e3488701c0a5647bfa63b55b5e162 +335533f701659833fed17ee4ef0281032344faf499ae8e33a25f97d5839fe077 +1ad9bfd9e2c1a863e0eb7ce72cc615f4ff19a8ebfe2f44aa6a636bf3197ec107 +37b3ab19482250c61d1a1bf7fc4f325056fc30554f92b88e6c8bc8ea8e5954dd +e367a169447091d9d01b79265cb1054ff7000df3b659208c6166cae1973f3559 +6f4f9645361ecdb125b87b6b9096b8c1894e5e1cbada10134d54ece4bc0a73d0 +7a93de3a3b943697cd3be33ddfa0696663524a7b6e246984620dd268ff65291d +e84855ec9192f88540c57826f6e6f25fbcb4c4e39f6b7fa2a3defd578c08c8ad +f66fe2cc07a3317b3697ac9e5ee19a9e225edd3d52323982d83d4cfa156eb858 +681dca6e77ad60dd946c8a1be74a8bb83fedf6dab14f5a2a5d1cb08ad95f2a93 +c16c39cf8672fc59bf40400920265c7e06ed02b2a788aa23425b45dba3b35a53 +098d3ca23c0bb5a9e16ffd99cb4846121c6f5656bcb8d34d29e3eb078bb39fce +be3b98fd375ba941c515c88cca36f7c55d325d3ff0932244f9c8359831981a10 +67c57e4b0ca5e2db14a9c2e24b10fddf7e037d4cddabae2e5b0443c3387eece2 +04af27ae3befdda5e88267ddcd3eebd90560de14c8f2817b6e6055e53e40b35b +93d64234e4e749cc875d9cfd48032e1059f2d2ea0e7861f3f525c81fe1863640 +c851079cd35118f98d53ecf08b86add9fa65016797fb13f20fa4f9fa0c5644e2 +86e4f6427a278a0715ad34c88b103c6fb8c09d6500886c93f399d56dc0444a53 +f64649f39e423e9b8c5bd7e8711a4455b9bc82282ac372524bcab6140921f9b7 +10f75c662901c3ae885424b03f12a4c9f589ac693c7df6e188913b64a7b1f70f +0c315dbef339b801d0f228c5d82d08c00a9c9b1d825559b47b00e98e58204a11 +257dfd1e7cfb5db205b0dc4c3211374459a58a3d23713068bff43c8b73fa51ce +bf259e69f45b37f30869f44bf3898ef27d9f3b4710b28579538ead0240f72be6 +15eeef499d8d2f0a7aa72a6fffc68a0947dafa98f52e94aa14da157cc2c71aed +17f3c2661ed84e058555d0354770c155c54a03186b815440cf8c7e37f9117e94 +67a5d50281ecea2188537254696c4b50c3aedbd3eba04b543dac970a7193bc79 +bc707725c13b8a747ad5df929cc8365da27c028745fcc82dde3b297258ee413c +d84d17166ae6dad65489dc8d98a4c760c08dd0de05754b408a39434b17773f32 +a3519b27d51781c807a352880f5d667dc8cbe54f2132200db7971b0be03eb42f +aea467cc7a1bdef783ce5d710772da9b71db45c7ba4f3c22ae9a9bdf1f26c29d +811037a170868a8f6644b0092e7cc538fd5c13568ca262ba0fe244f7307727d9 +318a281f38b607c172e64134edb76d6535abbeb9689840a297accf5c15150f2b +29e8cfee85d099297d0c6d50720d686cdd849751966c88e3aa8998c0c5c17665 +69029750afce844147abc710780af405d2a4163d272186ac4d486fc32c1770c8 +37a0656b6a0563e5b38a080f614ae9d49bafb92c96e2bfd140a88c4989952edf +2c835503abd01565e2cafa4373b790376483d4762a99adabdfa0d7a7eaf9da29 +530f626e330c8cc65113b1b7ddf5b01249b9651ce4c47111a5c6590755ff0744 +5ea2a3afa851de664cae6706bf0b640f80ec4a178e518bf6b41c793995934999 +0ccc3cb8f1864b6f20b1160c9ea3f1f8e658e88c81fcb7a28280fb37acfc06d4 +5d5c93509db13e88349ccb959dd1f23c6d5a574b9489fefbca90f8c24982bd5f +8fcc0ee7e13ec573153b51a760f47811a50c1b1e981ed0007e952d15de9fc00a +64966a945ab7cbe49e6bf90062cd8f6fd438428b14612085dd18ecd59924242e +e5c9038abee84cd94acba6c96e805305bacde3a0390a456e19dacc83f8767c5e +a9fef61dc22613e3048cac14ed6a75fa28c06d348e240019aa36faae66d21853 +b43a4c05372b0a958d3d26cd22186f95057ee646602ba13e1974758307085b23 +6ff8b0f2194a00258a76b18dfda0d5049bc9780289dd54194800554a086b80ea +65d97b1d6d03ef0ad22356fd31c90485c34a1cd00837c419c7295b712a9a9258 +b7f0452165473af73b7e21cef53ce54be278298053937f89d0d3bc15657fcc9f +3246261de1a1443c26cca0bf28d291f451d3ce279eec77ab32d5463f7f5ccc69 +5f6fc60739a5ff55dee8232b2b868fbf60a2137d8371422c1fd08fc21468bb4e +6addec19fb2def9aed1599fedacc1e5a38670011bd19ca8415af3d94010a50ac +69e8d2f36cbad97548090d37e081824c5bff928e0a767e0947c8c4f00388e4a9 +5e992a705ca0e7037000e4c191a898b40a74808db0c15c9669d2009ea5c7a391 +dec4f2f4685dfc63fd94703f948d758f11efdd2e0a634e2d4274da9bd84ccea5 +8fb6f41e617ba30fa2114deb639b7b579e2ba187bec24145664921599b6b0559 +d742b3ddaaa4f91ef05cd15db7cb7fa2400f66fd9db3d207cc5728d65b866295 +10b2b6a1cd2a33424a9006a26e8bfa8b3571a59e5cee066cc10bf301269621d7 +4f1c492a02220c551560eab04213b3e8be62fbe2d7af013072ef82f1dbba5b3c +be1974b35ad6e92e6d15c2609c17706422beb22f12d3c4c0a748426dbe65cea3 +a0ff0b208a66460ce8d359b09333e208ef39fc7fefa453cdcb028b195e70c577 +260962e2e8900a286e628bc5b0eac0328c2c6f64f0229ad0fc7872f48fed6d1b +bc490da985c19f622bc07b388a4e70e79bbe40e75d928670eecf2911075dcd05 +6f0010a492dba50abc966411d49f39515b27aa1e16e7b6104b16c6b52b428ab4 +9a6e98ecdb65aca5377819de9d99db481a2d0ccb90a1663cfa6eb6456d101609 +a1958aee3c8f2fa4396038dc4aec5dfd472273900e50bcf3cf5e5711055b90a9 +dd6845b57fcb0d9c6cae3ed0180c7a4c554a1b05298518f4d7de4107993f2715 +4b90a115a8d1a3f074a4f34b67ca5d733d59630a5b0ed10fd6459f4f9e3d17e5 +352ef13aed05ed7a17a44068884977c653628d8bb5d185f5783d041db9644d0d +69bff8433e2d00c9f6a8837a414270c66d0249e414ce0e56d5051ed7aff463c0 +5d6cd8ea3b09e1a3fa4c1a866ef3238fda1b43606f29cffafd8f91ae673bcc38 +804f91178c0d596e109b65d5a462a103a4a29d995567ec16f0263a03bac4132d +e2573eab9dc7349b6b1fdce50dc21125e38d17a3f6ef66b3212de5e0b74c3dd3 +7541e341be122bbedb6ebc2db96dd991f71011aa719c1784e24479deb65f5d05 +3bc429785d4aad99de7b5b5c03e5ce4443dbc7bf483ef1be808c8e508e6000f5 +1dd9d907b07db3d9f6566e5023a8ab0eed23857b30a6ffda86dd1aa3b98eb1b7 +bca8ce298ec3cbe5049272ea33fdca7a8a5e701e27e07cb3da0d395d258a1dbb +8714d83f3ccbbdaa9fe08900475ea6ec759f425bde968014214728d08ddd7358 +1408d3974773001d9bf782dc9cbb5209a5d3027aca7bc277b5dde20b991e8535 +1889d8d498d5e8ad712cd499727f61aa3953be4eb62133bcc578381ba3acddbd +bbd5de324e4195cdc594baa48782031b9df8aad86ebd62218b119123e213615c +cd6894853bfd77d26740d044f58e602733ee307442ab929222edb68527550414 +9ca05eced3d317f03715b8799ad1ef2ede2e3e0fb5aaa71931e70c33f7557128 +cdf1022264f9c9b5dd2d9b548a76ec92ecf9ec2029158b376c89a27c4f738009 +b555618b66865c2f98af0733208d65b1822c734d3a5a2a0d359a32dd566648db +eee996fc085b7025b47b0f8f4df03a5f9a3168b722351088a1eadecb90456a05 +ba74d908d4804034a3b9a915cff7a3b2d467f9a6adbf12c2995b75c03db7b23e +b224cdd2b64a0ea942ee4c07af8eea6587a8d3781ad7a6528d821bfd7028a2fc +5478b6460aa696ee868319dec5e1bcaea69f007b1dc80c47701adacf722b5458 +60158e090398d30a9f049adf3274a492fe891fb7b2bf76b78bad2fb05bf43bf6 +b14095b00eadf94491eb50d75fcdd95025dd329127e4746c2b433cd4793deffe +5015755a330b821f93f96ab10b508e71363ddb55cf4c6f9092201715cf26d859 +784c49b636c639caf84e044dbe3c14bf6d64e9c259af1f24ec73c9d30fc0fac3 +1f9eaf2ca8f49d0d5c18e6a12dc8acdb9f3d8ed49f607258c94967989cc31a21 +5020a9fc65815c230e8da7751552a895b0064c2a1cff3f18f9ceb908540a92a1 +06c7d46c596ecda2e25d331ab85f534313b214ed307dea03d4113ed6fa2ef1e1 +db3adb7861fa48ced61f10ab89faeb82caceda7fb1e9ca240e38611acb421be1 +119683647413c0c063c1468f1376a099f08351bffdfabdfce352ca87c125c021 +2301c6793146014d87d22727aa014d56c375945f7539863eff029d046197d65c +6a7474feaf44f7c07b0ba500752ba29f5f165d4abef0ec13c625ecf722fc9ee4 +6958a291ca5b1f385c6a5c6ed4fb0036cfa6fbfc46f1622a59f019983d1a2f2b +6662970ba2ffa63322b5bac4d58adac06e2ac789e0deda106a28a860e87ccf66 +39ed41fd29be8e218733d486633b763d0c226c18f264a632767957662400393f +4ccbfeec54acd358dbd43e71fd59096150e9db5a2aa6b01bdf8549dc0c9170a0 +05a2e18275d6d74b6815f0205a6990862a083edf44b4052f83ead884c2d891a0 +698a2cdda09d43d67fef477eb0181246a8ea49d8407ca5e24691dc83c45bafb4 +4e555c33e59bb6a17f2bc3501217502c545082e1de1e43a3fbea39ef67644fec +e36492edde144cd3aab6778cc0a4be0fb15bb46f95e86f7b4de290e66cc69f66 +5b20522987d2d0ed0ace9e250ec6c0c4793a2eab0f8f9a00d76d624cfed7399e +d1e766b6c2dac1c46c6a8c3f291ffc03eb71dc220eba0573225e74c9df93e3c3 +d31f4bf8b79a0eae363eebc0d4547d61d0d54c42dd66fabc8befeead4fdc6bb2 +0586a0a47f373849b0b6ddf42a21c6be6e1c9ddb2f78c71a334f855173f681d7 +253a9084447b363872c750476365ac690bb27460e4bbf22ecf0e4d2481bf3b0b +afa54d4295efa2d38cc6490324b12dc991060dede02e8e29156ffe3f9116067f +0478f9b5928e44075e847e0864e06191c88f6ef0408124499b970c5c5acc28f0 +6f15eb4fcda631fbbeb199ec847fed052710c5d3e1f1598f7a279110dfb67e87 +8a0caa27ab4efcc03a6953e28aa9d660999624cb29ab8904942b5df81d67a462 +615111d743ca174075f3cfa6d239741a4e6bddf182de776addf3810047c24c44 +e453a67241e96bb3ed0ca17cd928b8f67585a228176d85ef4b7fc0374123987d +2bc1a0fcb9c5a5be1749e684270f9b77c5cf4ae8d360c14ca596efe21302d343 +3f7881e8a25a88ca999a9f31a2467fb739511a42913b98d56671c74683f2b8de +6cb20b8b9fb3d1b51b9a9a43b8afcee655a3f7217f5a952093f7a7ad84593aab +fe0767f6879cc2ec7e9ab5b59bd82f48d06c9adc0fa218bcf9e1f63e9000eedf +ed014a091dc952e3e0f07eb8e7dd1dfe0cc0e6af9072a53fc95199f9233a66f2 +d04c65bad02d00c3c5ba1f5af4d33a94e8eb5ef8b21ed1637b1c3e3522cff141 +77cbf28628d468249a154e900a9deac70f0be7b7d7efe43b9243eeeea068b03d +0122feac859438fe96eba107d3ebaa99817816652b53944df5bde7b78eae04dc +d2a179fa5c3002457ccce48def5739cd02a8bebc5d65a626bb50e4857a592d46 +52d7696129b176e5ca95c9c3491858d341deb70a0e2d57b811eaef78e52ca362 +9e9dee7e39259100ea60488aabcc05ae2c6f751f41bcb2c690161e8813fb4e7f +d734f2c6fdb37ceee6f7bcbc29b2819e904e61f892fbaee59c4581e2f171f9f3 +60452fa11a872267d49f62df732dee74c8074370bb37d33d939e4a933758487b +280b1d83cb23df036ea8304a2531465a647f81e63dde4734c49a51ad26401384 +0793737f31f69413e5f5152e30309701ea8e96357cbc6bd39053135647519300 +70836262da78a79f8ef1d9a17458e02d8040629b6dc7a7dc114d05a4bb01f90e +01480ca86f291747c4c1b226b2ea6c15a38b6d7078f2f51b264eb125891db1bf +a669525940531976089a9a63fda1c89fbbcf9e5a8ef413f837bb541b1fd6f825 +b7db4d1c1f3fa3eef70eb4df0e962393060034581ae4609479013a72d16803fc +a455f9722c2bba278a1ba5bcf1b8d1a5139f5ae71ff532481524acef4fdee7ef +14d343a1f0e3fe847d9c9e5878bf1e5530820de3e6d438e1e66f20baec033b4f +92d055105ed98345bde4fbb5612dc76b7f51cb9d66150d153a10427c027ee838 +38faa910e77fcd45a41bdc6081b0826206b56c08232984a85a5251a8a8362cc0 +c4b4f4dce651519c55777e6ca349bc060f9523c421b264d1b30895da4abfc4ab +9ecc4fe0b4a1ca8310f453de21a1e73e8bb587ebefa3f4555b5a332499cb2f1f +49b7d122ed4f470711f436d05695fc1f275b93ceade6d04fb2108517d670949a +4bdba8b6cddb62b1c9cc92ed63a8890d1e287e0051e7c8bc47b4a7fec9c7c33b +f668abf07c2ce4e080c8c4e9503b61940db11c5f17c54d09b8b8c5ce3985b422 +1ed39a00c39e87166c7ba0ef441d352259022b609513a2b134e13f48065c7acb +4b101230ba98195e8b49d570347fb95443269e9fcf9fd03c7aba76e7a1b13e18 +7d344d41907fcbdf19f616daa51df3b1b1be673f95c4ef1a271a908548cffd0c +5f70521eec3119ca5588b4b7e04954df14b0589f1448eaa347734e92128f4d51 +28243b9e8d1d64fa12f0c89c604ef7ec03587ba0858739ff07b07dda99390b74 +a1ff879e4219a459c6ecca54896449c3bdf93582f0890bdd0bd6cf8d5168053b +9a33cb7746f62a84af705b6135ad2bf04803e34abb34185acfde007901cfaa43 +64c992303e28a71bdda153858d252d7fd2da0d8dc618fda68f3d26c03641019d +7dd2050beecbf38dd29039ef1923fdb29576b7e3f10671d1cfd93a2e5dbff204 +effcdf0035eea6912163e8a3d995ef07170e0d74f88762a3cdd080d6cb7cbb60 +3adf3cf1e8079a2642cf23f40277b1d0fa687adc1ce2e22ca28d2715d58cf727 +a9bc686734ec03602ac69fe7ee9c08a1a38ce9871e9038cc624c1e423f34539e +4c1dd622e6a2d30e06e2095e30b6c545dfba323e78413ac65afc1be958369d64 +f21405f98fe5b5e58e9ee85dac85dc318349e91e64c839e9c94ce019c32c6cb8 +5ed016f2e6069a4b374e37155400beb75dc3fbdfa829980698b9d725996db955 +e4702b4ab9c406991b30154e150ad128f2bcc1d6aac5383acd6a9ce148ef92c8 +70931f701e867f254c7c82aa34f8d55b28f546e9b7f80437e5a258f22d55ff60 +916a502103299649fa9b14e5dcb9d2beea401e2a3a12bec2315fd88f23fa8a9d +f60511057ad5ab55a602688c5d9b215355bd24cfa4dcbc9959d1facadd693a32 +0bd8737235896ff92faef4135e208e0b52fee9ff7f101a4957c241cb836ef31a +4368603d687ebc95ed844fce7c18983c888ef7309fa051593913ad1d767e142a +d6e6993375d0abce782bd9a6ce804fbf4634a65c063344c1d8469684c09a9d41 +d64736dd3c7dac43b546866d7182336b6a73a4335b8696a43116f9d4a83518ff +1ef7be60d5a243461737ccdf00093ebc76627a1e24d3ac2a60cc8eb39b7ddd3c +205d80bfdc89dc0571abc93def1998bf1c9c4128be86b52c362446f2ac2695d8 +8ad1626b27d6110b8d130fc7189266c5bb05f193e826a98e86374c57ee9af55a +2ebcccf8497a068d6f60769d2c6a22bfb9685fe12e239b4b7c70f13d3ceb0dd5 +9eb53809883cffd0d5ec27e0b66b7a41e642ec1d989ce0ced2f386ee381ea1ef +0c659556abc7dac2d458f816f04e0fcceec190d561c0683f4d579807554ef59d +71762374f6bde146e18ed9944e053f99688ec4d84cb8ed2cff8f7aa3a9b624bc +0bfcb231c35f93dff1382e9568db2499df08dd1f8f8b49ebadbbc2df3943d11f +3a18992b25c7562a7f1faf0e6e653a678942ef689200eaada357e28f2610f9d2 +0f5fa45e81142d264e1e1a54a327ad4ed915749e9f27dd8a36af0b61c4440c6d +9703e5d375f449d352148cfa26c266ef7afb0c3b598e6458d82780dc8d262fb4 +57a136e4107749b0efce94a6ac6c9d49d725d3ae79a217a38b238e4b766edaee +64d0d9dd1e571f16ba46307838319adf6a0d1e7495cc545b7f1ea4911c21c8fc +b88075446a45baa28a9ef33e0b3f3b8db25c57c3a85e34ab0c0fb1b18e7be01b +cc2629fdc69e64825a845fdd7bae1cca2666dcd8a7f846521f4eaa2ab5eb1b51 +af7002dccab0a9a7389c2d3129175d8ce87cc4d73c6d46fcbc10018ea1538fae +45d1b02efd79b908cea0b20d186dfbd0ab05ae06084c5b338d1f60111f5dcdc9 +e2818773fe82b7e0a621678987b93e37946bb24b181a4fb4cba56e3ef726c158 +b0e878ab6469ea8fc0de95a17742141c1ac2b765be853343cf3c935be5b14b37 +203788f32c418aa6206e80edc58a9af1b9547a5bbbce6cc95b56bca4994b32e7 +6bb19593d6da2bb4db58c0b0d1bd0f94149aad4b85a30131f56931a145a65f1c +ccab13dd4b4f3f233d6eab4daf44f42b89da53d2df61dd7e1fa0575f27504b1b +74f843847454fca0e5264fc642a28541d6f1d1caedf7db860ed45d9965121b53 +5611a3fdc881cd1366ebdfb490085ccf11f94905ede6442391bcd93b1d44bcd4 +a7b2f17c7b0ab3bf04d07787451e43b3f25d5e864fc6abbcee5297a293c02937 +b374d8578b71b911556f9c0e71dee07042bb46706f5523f72dda2156e364dce9 +644756987a5dac995c0c86c4df48c1cca629126a0b67b59d50c4e34635c04cdd +165d5607a353568ead3949838d4e5ca7a8e7a9f88540508a122ecd371a77cddb +588e6392fc187c1a210dc63e42491795c21f9f50421bcbb5f2b58fe1db5be2e9 +bb7938f70f3f12aabdb6cd26559d18fd1e7e6757c5470fc2dc7f8fcc6564fe95 +c2164fac044b3243c72f3fd8ca843f111df1a51672447e49070f6ee4c3adc8e2 +5754e8fac50535bd2b164987dc02452a9de63973203ede40ebdc6d0cee93160c +05aa3aca73dc14bb9b8b01b94e8dbace5e937e7f0f09834f266d71d71bc4e06e +885356033cee9a7f346c8609fabffebe003a54704a4035abd55b26fe6819805a +cd33b6425a3b61dd8f3db2b7b9551318d8048b24ffa4b40861614765716d5e67 +a9b1799a48b69864e90476f693cbd8ec106c20e94502ea2ee452c200dfbf45ad +273ced950370c316ecac58f3dd67b523261a30fbcef78d51d427d414619e812e +72afbdfe5946e0e5ff7029808e6fbeb849fbd716ca435bcecfaedfffb8a2c48d +3bf406a132e7a3fc2a9f52c28763e7575bbc2f22f4029bd90c19d9c816205b48 +2b03f88fa36332d72e5f0df82134760d26ffbc3c5867556120f26d10bf19a25f +b52baf6a8f98f0a6322b2735e9c7cf5e152d0b7b01d97c5ee45438a287ff2172 +b164791b1b60b29e88f3b4eb5fcaf195f5d53910c8f00517a82c650621a83ea9 +94cc63f4788c98d56676ae219fef3e446356fba4b49a24c3e0a8c7413c8ac1be +4d0a063d6dee027e9fc4ca54943cefbc760615b6ab16091114003b158b019e10 +5f8c488dba09b70db0ab77ea949f889c1498faf8883d63c36caaf1d3a198e2c7 +6a2c97a0a14e5c3dcfb7034ad7357b3be8cbf95d93131d778758c29887f5cf4b +493044e28e29903a3763fd76b3d69aeb4ae6f95b160fd9519af1a8c90aeb2977 +6f438f1313feab076ccd14323a237ba5bf76faeb29d0ecef23adb8cbefcd6df7 +6741644d51076cf66f92b52d852c8994b9c763dd08099897b11adcf00e9dfcfe +fb6c876b4f076f7923fc3975af92e9606475c78b98d53f60f656b5ff23fc4b60 +32de05f8077319f6b35e97c43dfa17b4de3cf2a3cc799f8bce3aa8c9d1b83a4a +bc42a89abd121d46c1a0235aa761af492e2e2136221ac34039136c291e877912 +d3946118d5afb7f44a7bc0abb2b066606c7d4cb5fc0c8133a84721d8cc7ecafb +fb6b15b6ad5adac50a7c3a3b8beaf70054601140cb8cc08b6372ff8fafb5bd0d +f04364633edc41fa1c4522402313b35550fd3515b9feb6a17c4a5b197e694a07 +477cbd4a46999edf0f0a500ee4c701f55f00d5751c65d08a621cb3f41c298c6e +4ddfe05703b6ec04c25de3e0e7ad4f11dc918e011c5fbb236e5bef784b2ffeb8 +d79be24f9c1c394d5bb839142c1193bb7f224acd259d1a90d2d237addfcec05e +fa0c387d984ce73e67169dc36eebcf137fc9829e4bbddbcbd5f61c2f3155b72e +8f427a15b099c2561ce8b9871feb7c1cfcc24a639e0f2d051ecfab89797d1b1c +0bbb7b374df1d3df75e16998dd4198358e2829f7bd40f50a449b968813949115 +db90a7c403a2832454be362c71875df7476c7651f3414c0d4f497ad1b67b2952 +d41641c740028167677c48374b3151a9021fd3b9c21ca8a8efbd86b11d998813 +f01c3fcc990c60fba08f67d3ab4a302b62ec0f04b9063e01a8c6178f3806935f +638c972686fef41baa1cf372b735fb19bc389af9d7ddbc7d31acb7e915d4b418 +d7a5ab181ce663314278cf8881ac4430ebd3ee131a7a2aade1de7731da96303d +ff212e8fa851cefeafa4969d11b0c4a74e23654821ba2458961cc2b1361bad81 +a8fcbb99475b003c29f738ef40e4f9b1d89cadcef391db7cd117be434d085636 +3af49df9d46a0cfbff5af6e5e4d192a4d13050f5ce3e30471e489d57330853d2 +728007ffe1b7ce41375dbc823b84812a6794b58e38de43b2e22d0d059db64238 +5d32f79fe0d2b8482f61a0e1c2155dd69d2dbd2636bc0f07efb9f6f13c4e61ad +16bc525b35930de9dd5ef4e5e91146acc78987a2e9578475522b3c87d2f5c5ec +ac8e55de0399eb852551148047019fa08fcae9bb7831454ee0d5c36e3744d7a3 +4eed0cb0cc8e82810a673c1098986b7d3ca984597f37f695df8aa168a70d0ae9 +6f526f09ec75fd2c0d2fa0055c519459adc3e7c61816d57ca3bd36f78a06dbe7 +dc22505a4ca8af1b284d887b12b7f161fe27b6f1ed063fb4f7a37b5af0d1231e +9ed802879896ecfad70260c1065ae88e593c75b6d0ce546440c482f5503467c8 +54758fdc1c95cdcb7d5663a0e1ac98d0a518894aa3c6f4e4adeaa8ac81d8952d +585c2b70d5ad861b13f6b48616332c765d1fdd8a97e8b15d38097afa88cd7bb6 +b7c82dc031da0e5e919b3a8cce89da12b8548a7c45fe1ac418eeb8b2318c9516 +59a30e56f4f166a6fcf2473c213449f46cfb906df3ff8ac703020e8cbc71bf21 +6518a3c76265e644f62be4b2c17ce1c8fee549fd14d1cb94b646ecb1d14cfdb5 +cc422d8dae5a86550d4862acca62644fece36492edde670bc9ce80b0ffdaeff6 +82bde3dbf0c403b882882af7572a42b4f49f6bdb5a8aef91159546d90238ec37 +0ba7e2b0cf8bc7505d8a2936e88836d097f48d57aff9b04d08e9fe8f3f35d046 +47d6ae41ab09af7bc1335369407a9558436be878be6e8b7f4cf88cf09a6792af +911ffc61653653d1c6c8da705377941c7d4c1a6cfa6f47c2984436ef697052f8 +8dc07c91414283515bec6bf581c046306800b755c301e5c5e2509c8717d7a450 +1666d78c7a63c74279dd218840526d5c64da4cd356d24ee7382a471e511aa7fb +94dcc208f1d79e5b878bb110d5df78d7a25facd252ba729213bc5b60093c115f +61d72b91eba38d54600893f12f41c59b26752d3efec1336d8a1bdc0e9a33b9c9 +cfb1946d4a60836b1dddddcab7c18a1db24bffe3df0aafce0c145f5c27b8bfef +908fbff18d2f398b914a5803d2337b95bc7d0520bcd60d3730189af04c8417d6 +e12c20626580881bcbf4c7f6a6a5f43e7792de58f7ada1d8784f6a7b4e6f96ce +73c7629a1b3f78b821629b8027e85eb5241d8723f1632145263b0457985be78a +4709401ecb03f96444d94f3369b30b41ae1a16a7671d2a6ab6ecbdad3753fcbb +0edb46887cca933f5909694344f7282cc7bfeff1c3e19e7668db02447082f8d1 +72111d8526c17a4458326bccf6aac24088a3f6dcdc42d5c5587e05ddc8ccfd07 +38e7f9185281192a15d248f7a7c7f013508024e4f2386df48f076b2674e5a720 +c8e5d5db8b7ea56c349a963ed8441501c23b7334c245069978b1d13aae19581a +c8d6bd5bfd27b3083652678c15ea96ac0a901508d2dd0d4d89a772c740ac408b +b9b61c28d5fd3f46463888a3ff49ee43721a0d03907f2d20f9c953c6c1db8bd4 +32afa377913b374443bd560f68d11611b017c876d7cd1a2bed5789a0e5bb2756 +60a68957b69249f0fa1822e3deb8c8c879287fb81344aa625a772093c6ba1517 +11232715b0d53725ab50343c5b1917e2d2575340d003db8adf03b3835475f098 +25e541e87a326369ac59d4b9a71b2d5485f01cfd40313d14492e828a47fef188 +57aad991e624ab1d3d8d696a55d34e3a3689dfb64c5c33fed34fb0c8293da01c +83c58943509507870979b2c51f74ef700bc52509da2802c0f0c1f4516807c3dc +fdcb32c4b5ed6a87231e58f5896c85687edc3e7872206b3c19be99a863a40ff1 +5776e396918ae1ddae9acd9a3c654133aa17294a9e57ba5287db3c71dc1c0d12 +d9d6a6b85f5d1cb487b51e8c1329204815962b6937a22375d5db47c4bde26ed9 +3ea18c82839f55a28f62a508958bc7fdffdfabad5757e5a4e891efdfe9421686 +7dfd4e36a3a394fc1451e38907b58d16fb110d8b18e99945c9d1a215f6c906dc +5c2a8b98ba49c225c437068ed7120c3e591f754bbeb880fa51868ebe4735b7d5 +7c1107652525b3b844183f4cf351ba35d655bd5e66527cdc311a4f0db5412956 +9dabd87a4e45081b4cf219a75432c6c628b596afd87b39b68f600611b3ab3d83 +61b8b056e3aa2b403f6550b72019be02a27b7cd023c45f72ebafca0315f4fea9 +d490254d0adfd8702b6ee29af2e47be8350196e470d622bfd3febf223d7358a6 +a00f042f7d168507d7e69adaca8cdd219cca5ac0a1d28ec684467d9a16152c9c +a31478464b5a35cbb18f064af9de5a5044ae920b9897d6eda7bdad45a2ce8196 +d918a6c98eafdb088df5e11e3eca1b860fee77e4a7a68e21edf484532e24246f +345bc0136909dcdeb2d637b215f1087a3b14a74ce614e00dd9b52795f32dc03d +f2b5fe1c2b19d76b3ec5bb517b0623faa536c0752c796b2179ca76a40c0171fa +99c78e06bf1151c9384a0ecf7e384bc11248d954b21c9de2bf6df4229df208fe +a16848c893f1f25b80020ea691d92d47d82504eebbab22c4fabb9aa29ebc2aab +197d861b9a7949fd86f201a90ee2a453bfa2f49be46e87935cf365b21f946b88 +a3e8647fb2330928c1e5fde0a807c23fcb55b4e2008d5e3add8df3a74e5239b7 +aaec108ea92033cc581aebcf23116ae19f25b8d31eba90ce20388fe73b79cc93 +3fdd183ae909e3122384f79d2fe53cc07cea9151bb3ec076de154e672b580ae3 +42763452c9fd521e7be2ebd9f2a410e989ff4c5beb38346e37d6bc91108939f4 +3edba27cc6d69a60eca3cb41ddec11536719e3cadbfbbbfc877d39021aaaf578 +7b986a01db572a62b492c38466110e1f484fabf38054d0fd6acecc367fcda35c +f928707a3e15a0cbd3f0a6d555e1625582dcf088b8fa6859b01357a3fa460e7e +5cc1a3330318b3fada86b2c55f904d77675ef57f137e8d3852e1cf505029dd33 +153640e04fec2575888cae0258b22f309c93e9042d567ba4a0ffc57cb9e9caa5 +14ecba866518648f968390586f1cb0ac986ddddcdaab912a09c397d12a9973dd +c5abc02b82c7b3c1caac0f1da96154677b7112bfdd1c349dfdb5c4bce5d7146c +8475e3cf71ab9034abacae8182826bcc8836a6c0cbef7b64b67f874a11535956 +2c9a996748958e7238777f23511b0f2c18848599beb4979e22b98eb5d579611c +86d917d84c50b23d55e5975a2cc934a1265c0731c9510c003930cd829e40a4b5 +7690c4b63595f1735d8c2ea162db038f58bf18f3155d0d6c5982d43e0bbcb187 +2eff929a6e4788611c2527175460fc9a8a8bc2b2b3acbeebd6c53779a1156257 +0f53eee2be859bdd702d4e983b2877f1f3ae6e4893cab50d607c42cc9dbd13fa +64f20956338528553e7f0fd6db1fe98257c7acece718e79e6c3ea3588fac6ef5 +a280f937f89e570796220fc2b939832fbb6f34a9cff554269121ef6aa6c3b331 +4f2e22f5e597a4ff253fca5f757fe152e4fb5e6019766336e6288c352042fc2b +e780c7e555f03b991bc44a7456762fd05c9c2e997c626379d447dc056d66332f +fc2a137fc9c2dfa584b127429914c40bc3a8a0ea5e7d6cd3a86844cb8f1ed4b7 +63af17e80a0b808dcc5c70b38c1378c9cbf77601879d0019a8b2ad2d458c17da +932639d69cef730623acd1243b062ccddb62116655812d396686ddc1c8938edb +bafbfe0ccd33221070a60888c8397ca3924e55c5820f4eb29ff35bc501347a74 +6e3704fd2051a50c4c4c1c09c74c9e6ceecad42d37ddbc410485f90a0fea0752 +1d6508208d4d86ae19e2446d21902441b44739849abcbb2adcfa2fb353e6838a +0444fc13839ca5edad7b5638d76537257187eb5dc89a1f412c35ee4d8bc661bc +e25d809bf5e3b082051090b20b6b83225581b547421138abe92a2c3c554651c2 +604f7e79b48a1fe0e630a4caf13fc15fca552dc094be6f359736a68fb4791db2 +9b16edb6e06d3ddfd451b111a06bce53b70b7ef5858905663629e780d0a79fb8 +6c239fd3da4d2fc79a2b7619a3612490f147a44fb5a9a5a8826c7e6f70d9ac90 +41e33c39108c8b963f692c8719187246e9d34f34d5d6053ef759da18ee8251b4 +df0bbca723f7ad791c3dfb0f1db37b01cddda2ce698b3bf679d2cc1ce8685ce0 +c872c2f89c6a6897f8c203ed61aad3f8cc5e0371710f5c4c86343ac388770c56 +f7d1c14b15ca0434218f86befc24136ec73cca2ab768faa087ef70b3d5fb7f20 +0a68082ff38e522eab0ac5c74309807eb4597d8ede958790885aa18c792e6953 +74dd77595a94f74fb896587c5caf286f43223bbfdda9e89be778dffabde05823 +909db8ed5b5310ade1e80da1ef16805f5f8aa900be2ae91c54aa61d40a0cbf91 +4dcec7a0dfb650d6323855a5eb0adf481a2189f7b2736106c56e30a50c27578b +b7b21db20bf5496e50df4e50c834624fc1275dc25375db000aed74ec1a1a6445 +4f041db66cba8a7c7455b4b55eef149414ee08bfad9bab1693f197efd3bd22fc +8368d39b706cc7982ce7179cb85b9eb073fade8bacbb9af70f7101eb114a773b +f5fb3b4231bb9f5e439bffc1464f50ee94b499b3d84d879fac0012433cd406bf +b7420354879ea2220ef28c07df24dcb079fd0dc2a63f9cc9c709dd122b658f95 +e5211c61795a791544e9c21ffdab0acf64bd60644146153f02822f1518d0f6c7 +e3ca9a4096ff4c424516835c7f6607dafe23c0b70c8f8990eff7b8ae724a07b7 +13297d9d7c83d87a6b19eb98c48c6e9422dada99113c8540f48c1ca03058f052 +712c1a46f17a23b45135c443c1128563fd6a66fe9e3c07ba27511b4cf0ff68d7 +792f6fb1589fd22a2cf5051ed798976fb83d3b23b6981f169b44a3e3cc47af92 +9ba4716c51ef979a3ff7e4266899a457a875c0bb296ebeb8384586aa380f9eef +9d52ef6c952e848923ab3f564e776dce58f21b6ded7960f326f4e925ab2cbdfa +863e9c79453e338d7d61b387c193a862fa9e6c456b7652a791a91b0bf01a799d +cbade03850b816ea002185f7740c8e5b7c32b003ff7a8c78911be015f2996455 +586fba449ae8f9b27940cc97d25d77d60b0aa847f586dc6672e0c0f6d2cb636b +51aa401ba97d84da2774cb84912e47c9dade61de470b61994b83b75207af9abe +5e10e5e8cfa8fdb8131bbc68a63886e7fdeed53ad867b6d3284f4e957322274a +3b7b1846d860c446b0c5bbcc3c6241a56d2de295173c3d64103955b1bb8716ff +c0dc492fd348cdd46707637eba91fa455d53b9f528d2245682997bb43cbcbc5e +8ea3e9e2a2bd19202f67d7c16a42c602efe8254c3b2fe935c1f5bdd67d21d270 +35814763f60ab26fc8966849352d3fbdb628486cf74c5224f5d8965c5932f80e +0d8be4b9716e5747ebd84bf452312042fe88d07e57a42a8049fff714e690ae0f +5f7d54fde33112198294c3c6f546b09c76ecb3c414a5ed2a2f93e94c895a6010 +e6bcd4e883d2c7d7e826c14c9ee12f474948664138963a96f83ba7906736e893 +118be766df46767c4464623be7c3697be8fbfd662ef959e03b688d73d2a2d1f7 +4e9982faf31d21830d338bd8bcd83ac92127f9d48bd2660432e97bb6887e869a +9e1871fa2c1eb361bf3916f571d9c7ff2b864658ac152431b931ec6c4f1d48f0 +665a90054febb824b428c2a997b404813e861723fb6c9e2c4bfcd04e8a4d2b26 +2cdce120e24912d32fc6cdd7d7235ac5f3d7840eaff18bd818b715afc03eba17 +7a8c3c3066e95c8840f291521c8429841e8b39d7dec80c3eb56b49a21a02ac90 +0e7a2b67e67732298f4e324825f7c823b7611fad2a8b7eb6bc44c3dc0705b4d2 +58fc26fab5d9c20a786188f593d010a843a9b6fd47f5a71cfd728c48279abd0e +0a26dedb870faa7e19fffb970bcbfc6a61a487a19c56bc4e8d2e3ef093df0b55 +5a928a3b8f8f26c3e8cd4e1fbdb913d3235dabe2fa3b66c832bc9533c12fe5a5 +d6a004efde58f949bfc8bd48c44f8dc5f55d94ce79aa7d71ad14a4f7517ad7c1 +f17cab05e7a745220c32913f3c8f06cf02bacf882d8c293c8290740eb05c22ff +c32c4cb2012c3d7dbd643ef84cd928ef8aaee42797d010e0fca4ed02a1edbe1e +1d7861eb0a741cf976ca07bc02c22930776cb0a36b46b1a4aca00fd2d77f685d +8ba3c1e24c522e43f198fed209ed810b0a7214faf8d583ea9146b26e9ebd52fe +30826222af5fe432bd82d840d0a22b8ba2a7635de4c7fea5aacd8f946df99c0f +cbb84e5194aeb9fbba94a33ccdb34b44a309954dfe2decc1c3f5056bda9456ec +5a6e0bd801218083ac309c737f10e9a42e69b5bf74d0278fba6a691b934d748c +ed7644dfd2f5c5ecac8e55df3b5a225e3d5ba7706fe4e50b7d9d53df98880cff +01aa1a5936513db38de449dd1b1bcb6cf199752df7e2161857fa86cab9d1b645 +95da5a17bc0f305f9023bd265e341558f73a22bd4a01fed1867179986ed99822 +f6eb5eae2fcb74be99f34604fb47cba6c3a0f0cd388ed13dd07337175ffc9fb3 +3befc49a742d6f667af2a4476d6e8e0bb61a002b29ba069a4a78ee1bbd00fda9 +ac18a33cde76217e48b0444e7c90788e60ff3c820ffceda02891d12333d6788c +8028507fa8b9c59d6d6d476c349c1e3646640fe504893b23587c0fef7c278fd7 +e1fc0c12de081c4bc55ee7bf65c9be4c6168abc5281429f3d39bd0bbf771d574 +8b321d993df752b5fecc462ff8306ff73ced8c946f61087ae9606699c2e85261 +c50715085f967542e98f92d89bd22d1b96c1bbf45e11958ce4f31ea3bc994ea8 +e9d0b7cf4ba9ef66b8b6005d6b2960e68dd0c0af4dd9957a253e2d4c47d46a09 +cec1580c02d05bd3720daf7e8fd3d2144b8e5b3414fe89b2b95f8cd153b326e4 +25b4733ddb2b4e1f02000dcc806252311c1e313a1ebbb4a9c445350609cb8bd7 +25e67f6fb760765b01ac474780faa7078d0d0a0973cf6a475087b720de8c5200 +e953eee885e5510b83a16014a6a255bd8273610fd698b773a0e2911690b1d5e0 +517fa1e2909905419d539b7d91f06fcfbe4c05041a06cb8a35bbb51b563e425d +0e65eb7b086acab5475bfe889397b2326cde5d4f7b30da851c55c630805a0548 +eacaec8b20bc10ba9925d13990ffcdb569782c39032bc5c6834eefc519747cef +23e1413ba5c6a03a399e7adc118dab0e5a1a8ddfeb5888a6855ad7ca9b8c5c96 +b33538ca373d4934a879387f55ce65390d313d93e4cc7ec7e0f67c483c3cba57 +f5625699cedee9da8622f0553d19231f626404329268f440398ac131190cb74e +4cecd5be8cdb1a01bc980b993cd8b3ea77eca9642da8e185a363e7df2441b2b8 +d991a14e5a5fea3014aa375197fdbc0b1472b321d5b0d8a543cd958ac036208d +6b33858d4f5a454fda0443a5976a1008da84749552fed657df42290ea9e0bf14 +49b2f609c3b69b8b2618a73e5839fa69cdac52a68932ffd4b9eac9a96aefd44f +d7475a9cdcaf91cbf86e81758426068aad6dccbe6e874248d86bf55aca000641 +4e21877854e95f7b76b3994424bd597f3fbfe58461dc5eb0c03df892baaf83b7 +e5b743b0fec309198e019cb64047d127e47ecda08a6398a46621ee521d05ce94 +be413888a3ffbf5039563b15d39659a57a9044e6caac763d25aefa6ae3315fe2 +a2ee1f6fa44554bddd7150b8d852515988753ea49ead18885ae5d2c876335be4 +c4e022ab6fd7ccf70ebd8afb12c741f8a6b559aca8b7c8c71f2c7c2b046f5922 +4d15b2a85fb38fb2c15623bd669b4da58c1862a69e3d01dd5098887472bddb34 +8f37053c8a9022d23cceb6106487e1d9b3128ac1dc75cff1cbbeb778ecded89d +47e4e96d97b8df40e2b1b21fc062a353ccda5e734d9ed9b1800a27f3f100764c +5f568fa7668cbd8c9cec6ad262c36cac701239b6f462ac4936ba7593ce53e49b +ff228411d4f133a019c029ccb7b973c8ed2239e18c207bfbf148019d088d2dee +c58a1c243f368d42a7123f976cdd4bb47a754e112a27939bbae57c1335f365f3 +20d1e89079e71d3b8f7c2a4a4cda6961489a6f884d75d7493296e2dda3ee5bda +4ec01a82354be5ca793904fa722bf37d85e7fec21b4e98c225fd66e819ff11df +368257087feb4355932627f3f6b9c288afd80ce4533967f42b89da53d2df67f5 +77a03ad16d54cafcbb249565325b7609e419bce2f136756adb46f2bb37010fa4 +211f58e74d0931c6ce66474089df52b9401ea0e26c19714dbfec4f138d6a0acc +f4cab67c1aac582a768819f6eb7f1591bb471640e8a262d8d6be3f935229a8fd +e0c762f89935c88b847d7e7e6b15b2956ac4bc9095edf740c615c9018579fb81 +064a1d68f6982c0cbb0a33cf9a8bfc6e094c3f87bde2ac70fe526cbc63672520 +e6b35070550449599914f3be35eaa1e326bb251d9c9ef42a9244ca8ee79fab1a +dae983f83af2a712f9bf9a2ef74b288a23ca7e958ce8c24ba0c4ad0683306da9 +51071e3ee96c25cd8123e87ecb93cf760360ca98727a7ca23f1273ef4a26eb14 +8e00c231bf56a66f74feafe07322ee921c5de6979821441201c46d7e6cfcbc31 +3edaabe7adaaef5f7f2d7d297de18b504ccb3c0b0d77f03bc9fe79394441267e +5418523ae7f91bfd7389d20f77115a4a9129c33531cfd99a2ca3f7d3f39635cd +0ec256f7bb65b980a9353e9692bc936d8ab18bea370933ff01e8eac03bc98f76 +87e754593e3e06bee184bec18b126f7bf3fd083f87cdfc2c1074ed007432a6d7 +97182114ab1c8e763f8f37c705584da16b4bee27a6b9b24746df9e9b71729bda +630abb697f3348adac537b97ae350f64c8c8b05c82a49f8bdf4a2843c33be4f1 +3a201c7ca5b41823923c9d510ad2741b171e8506b0b79d3f18c8c363f3f04384 +1940e1be692b06b13774d4405ac2ff62876fdbf10d1a87456293c7f4cbbf8a7d +8a0c5ad8da6698efd998f58929c2919d2f8b4c52a904b618a61d4a3936ceeecc +fd97cecd156c2a5979b7321cc4f1b8cb84b00bfd6eb32e12febc812f0115b57e +b60b4cb41d6c109d9d4c4684cc2e46f7a8012aeaa0d7effccf5057cd4efffb16 +79f3b1e8bcab177a67427e3643105ddd8a6d292681cc9114c008febdc659ee93 +70aa08e8bafd8607a45721df8f66d072ba67b863797c96053df935e1950a7ccb +e9f22ee34e2e3607f1cf4bba18eb34480ee49898f7dfe120a3523646c7693b6e +809eeb360ff12283e6c67f84517cc4794c580810df85b855e394d7f1a35c8905 +d61252c16ed95e1b8b64062d122ea621777678d13d7924cd71666c191599921d +f18bbf96addce54db9ee2dd1d4083eb31593b706542e8cfd5438668747dd9234 +afee940b0c9ea6cf1470a700aaff7c1ef56751ba9b10fc5772dfa61f471890c6 +911d9b68bca77b2fc6021d86d68b032f1ba6774830f123e21b4656380efe06e7 +0a6755d5b599dd09e4b1e45c1dd74f7523f447c5fb468a871db7fd074305fde5 +ec49a348a02da990b1fc5cb991a715fa79f49b4d32f601f102618731d98a10b3 +05625db0c0e0eeb02a4fb69a39e4b716993caf7222e329d83cb7e60ea78ced15 +844f3079f7821a44c27c237873b9729c0d690c31e52f3b93349522c6a1da789c +75cc0d1059a2d1339a463acb7da3399414b623751485e9ccb0523a5d0d42ddf2 +e89dfcae5e6a7b743f7e247d171deed57bd133eee43dcf5c95eeffe36b3440fa +2276ec0e4f99715067736ff688c881396724214099c6e2f821721ebdfc68f16f +936a7ca1cc3745ee9b127fca1d9a338cb602b03655e8de2111ea1371808381dd +3190a5ab16fa563e4a71d2499e095eec2749e67e532583d7bb28c595bc45c665 +f14d206480ac3d562c7db8f3314cf070eb696fc952dd964704f7705c58351736 +2364b2b1017c71623027fa35e90a24d7f5172b16fe9a88bf97e05576e582edb0 +8893b5e2465c61ca3157432a1ffee7512e94e63060b4a5c43d8205da43c6f75c +065dbdbfefcadf13177c2b77011e121c1f5d19b6bf1fa1de2a141c4b6210ec1f +05dc8f30bb9feb6d9c22d6aef88aef4ce2c3c9563f0b0eb391cfe00df55e2e68 +1ea1707b2f0371d7095f718ae3bca6c483598937251cc43209701e55a0fec0ca +2a84abe42e58b16b19a8cc1875463649b037bd08e0f3af1dd70348450784e46e +23aed8305e833a81740513e494ec2f1083038404b3a79b679e530d8e1cc833f8 +4fd29391aea36d2b37d2ffeea00e90d50d52fa2d9cbe5224bd19a4bfebfd6d36 +04c250544cc529026dd473b7e906cac0bfd8b106953e4801768dd2f21a12b674 +3dc8e9ea6e662ef88cf8bce0e34f7a88d2401a80ce26d44b0897339dac523c85 +3953cb6a3794963e5cdf296b979a20fb69a20884894c05e38da4d3097da18417 +8185f72ca9e34e0b842662d9f51c59c0d61579414e44f294be31831e7f806b48 +a9c60ccd6ee051d4d29e406c6092f867ea3563fdcdbde1925fecc354ce0ec01e +281d1b4360f3ebdbcdafd217081557869c8618ce923ded375425b9ce0a1f4a33 +eaee378ad6a1177df9432a2f140d5131bf576271a0db8d1e74ebdb78cde4c193 +a7f2fd5e1783013db6401acb51b108f4a71b16c9cf57ef903998163e5201a02a +137992528337a595d9c17828074609b7380f9ea731edb55d4f31c542b522b6c6 +ea2e25c8c562d392317318150d4869c0417be8f5ee48600dee3bad8076d86109 +8a2a3b62bd512b4bcd48916497dbb3c90935321ffc39b457220cc32348a2d2a8 +02547d1f4b4d4bafa402b8a7a7afafbfbd3207b046a576e3f039643b325d8474 +1d1d156f026f664f2cad54fc268f41fb9ded61b9ab9dcda646b42c9070f40635 +a46dfe209b72eadd40049867e8b15bb0a927b1c51c31ea74ca99c4b06322dbc7 +1da693dde3e686c7494d7b49701e8f2b8cd754c30476cf9bd5e0d5af5c6d99a4 +bd87f1b73c25858ede3d1d82710e3bce544fc397a91cda4604e5db7ad2d6460a +31bb35c9ba6df033a70ec0c6f601873d4c6a3d14ea9fc616786920f468c2cd0e +ec9d63e8d085d0be593d8344d989bcaecd6f770f7763e0f8f8938a1a26afda38 +a79a1a0780ca251ab2d9b11e33e394e4ab7bb1f459e9695ad88ad71331277094 +5d3d6bbf673d418761ac787ef5159f9fed9103b28f0d5d86c4aaf4ee462228aa +24bd59026dba7831062dfbc34276c5bde5eed1f7091a216d155ea9f4d9e1e4fc +850ef02f31cf85eb5c9eb8d4f5c55ff4147242cce03827a0c60abf2a727981b9 +9891e361364bbe822a4a5a88f52328ab182a459e5856ef9edf6c835111e2b91a +04d83ea913210e40015d3be601c0b43e2e677d5c9cda5a3d2c405b67095f3fdc +f973bdbb333d13693924369c36f5ae1117bc90d9624016b22a3d6f23a80577b7 +5562f3d48655db8a537bf3409b92d2bd3b02b1aea544636a6b2856d0a1a8debc +43bcf2023a54a3cd885fd9ee3fda7f3435a911c9103f101a39b5a3b5166eaa66 +6a348648ccdc9116fd0167dfa044e6f3f73539fa3444faea7a34b37e49c34ccb +3851f03148c78ce454712f42044b159167701fddd5b664196666bfcbcb7b0b26 +1fdd85134d0a46fe319cf381a545b577d523894b7492f632c944848ea6901adf +9deff2feacd94bc30f6db00a591cefe205390e32974b78f82a6ffa0c1e746ed0 +430f333fb242cc438e0e107faa0ca1a4073224fbdb3af21f6926b6c327f14bb3 +680282dd37e809b2180b112a1d686ed5beadcb5a230b890a30ba2832c1d08aa5 +9a6e9321c362edd0042c1483bdba5ff764a474e6254c16904f76642009c316a1 +41e3c824949a766c5e7067f9eb168a2f152bed22acc112bfdb3162a697698f8d +7eebdf52bcbb14ff206de000beb437783d141f93daf468b1a6a62ca6422e0d3f +c51fe03209132e719c3a7dc6a1aa36aade44c9f9b867afa34f3c26129cb619b5 +01ba4224c7ff90ef8b69650045c57d58d37ab9268abe8bb62459917aad27d939 +69e9c089cc4f417a679bdd99de84a400fcd4e388f4f156fefb6466039fbe72bb +3d05549bcb90a7ec0c2c3565801b3a7a437615337c8dca761d83a7644b04d4da +e67e00edbf2b3139c40dc3d470f8d476728119e9ab31d46b3ff3d6e34bbf6532 +62ecd23a9ecb93ac3d2498f63193ef72d192f98b05aa779b5015b6cad18fd29b +421a17e01cb394d588e37ab7f986e20e204a0f5fe06224f53accc121f112d58a +79f25c60a550a1b325bf33f568d69ca9a4cfb249096b8efe3b43cd703db80fa2 +0bfdfd3e01433f2f69913d13c1d14031545db4877ac7fe4f562322dbd2572cf9 +94b7eb300f26c3b53e75b02b5889cb0420f378a55c9a9b6bba64ce698ceef061 +349f8eee5b3a486870c6a11e9e3ff3fa00e3480610a449c9ea48bee511dda6cd +9ea3e4653dbefb8224bc55a02f77bf16e7b9879bd9ac48788e2fb2e237dba707 +fa90cdb918e02cb6c3e49925b60e2a05a71546d49d1bb161ea5ce6d303fc1876 +dc17e24f47344fdf6029f63d8fe1cc789a7753e492f5421c8b7ec7b777ec3497 +4575b63e74fc255ec95f3a1e93c4d752b42fbc1b1b7dc52b3bd4e33102046fc1 +e16b7ee6fd0411727965c75de86e547608807e51cdc1e51b76b8f9ae0484488a +7d21cf0f3b7ee73f691fa048309c990db12036ec5c299a4eae7411759dfc574a +c321c443af71421b7ec71550348ea60512975b17d6ad6a22463aabdd94befd38 +88ccf264e94a723bad53e4ee0a32245aea16837b570ba36eb70a0414695eed42 +e02948c308e22fcc6d2e1bf714ca662f615aa7cf0b71941fe08fd416db23e1a2 +307575f66fb214814bdf38383587cb14f5096241a544edd522f12bfb4864f0bd +989068be6e80b36c06d4a3609f45a3f249353225d7b0360c438ff0e862a2f29f +77842f954c289477f1654aa13250611733e6c7c531ac69fcedbf29c1e6de2d5c +edebb77f51a6ea25a3fea286986232a2410240b9b7f31ba31a59c40a5882f794 +832097dc9cb0e806db71677341efd5244c8c23a520c8267213204ff5f13e4bd9 +ce3e44c9387c17161ecc5d9c9f40b8dc4e6a16d93f833f07277e976ffb09be89 +d1fe74c1c6e1cf5e21724f8b83e70fd0d4ae72eb2bcd30eacb81710ac3a308f7 +e138c921577a06c8ec7293ac443fad6fd7a6a1873c09011b29e0469e411358e7 +f5d274a072ab9f84f3c5c74c7dd8121084019d89479d44bf25b47c248d4859e9 +c46d6f0acc65a9e1403ae66e84ef3141d688fcf71290cfc65eadab3f43474c2c +c8ae995be0f19d7c0f8a3e2d3e40e2ecdba5efdd8f07981db3fdc34b3d014039 +3d2cb0bfb72e821d01bb22f461cd8f0ca7254cb8937f9f228f1b356c0eb3f522 +8a9337aa9e0b24d3bcdf37b2e2255a8df12b1b343f8df33908e6bed58d5ff638 +584c0c4bfe04e43a4237cefa6cdfaee5507428543ff220a987e68c769d0440a9 +d4a33739e9072bcdd885c601dd30771d731a7c57713bd4b8ccc0c3c188edd8ac +1145ceaee80b1bd2ca85d582f05799bccd97b8547cccd71d10892b1409f2d672 +dabd6f0be7864de89fc66f758f120ca8a7983688e0b05283b5371ef01f2a68b2 +68d9fb855d7d7238b971371a8ab5f9d80e151c132a377d48704342146f9744ec +d7ab4453d258a8719b8455ebe73d35a9f70dab2fdd5d41d2fae8cf56146215ba +3fba4abf8f98765c6ed70b6ca8ab6e28c61611741eceb33e6c2958db40202f25 +8d78853a789ff3ec7afc19e5348d8422f6a28d65f2566d046d7b74973685473e +5cc0ebeba1c944630042e7296d81ac8caa96238bbc09f3067a7d3bbc45b27431 +1abb8e4c580de95be79dd7cda3903094a88fde6a8cfe77633e0481b2e67ca61e +2dcf7872318e63a4134c0f98a472813d4fcf98dffd30736ecbb4facb9c6fd915 +2461f90b736211e0ab68d5cb662be0b511a1e60132f7969dda9b229091286f87 +ec576661a94f818b99dd27ff65a4c2a3c500ff9cdb4b7df109db016ecb5a239a +4cbef1d443c48703f62905ea599b82f76be0fcb01263eef1ef411c72875dd0a7 +a5157265ca3cad3d27f9f9c20577a552e59910187a9d04f4002e07e92d8f5929 +fff98442ffd6d3f8eed65f2c2be666aa6220ec4e18ffe0d2f3daa680d4f27044 +0c3ec7971da783bf7928f77cd7dd11ab8528a390318fc0572f13a5a2b20e5ebb +1daa9df821c0cf3a34258dc56f872175f1d5d8bdf14478a19b53e278cb4fe83c +527bf56a42eacdf193c6ee25337cc2215016a7014f1532df6711d9b637a3d500 +3849a0881c778c74e8e5a47204bae5374afcd1bb8e901bf2a703c5cda6df6915 +c9a93eb94d553d50d3f178eab2f8d6338416539f225964b688bb649f4f148737 +410ff38f25e56ecf583f62f09985f94ec048b8b460de00e58f4f238570b689a7 +ab307b7113814d5f3ff6cf280262acdf7b46aafbc234ec32a931399bab9f2ab8 +b6c05b23fa2152c10888ea6d4e44b44e65721ca646ecae52a79a532565371f14 +1940d81923ad84adc5c6a9f2d1d1efce1e53b5907122edf3df1b69e2d9a87acb +303667cebf95dac21b053fbd39511df938b33032db098fa64fc7bc6407d11be9 +8402713b6bbd9027ba62baa364ea172aba41d3cdb8c6ffafc5468f51644b1576 +84bb51f49fb04a8a56a6cdff871b78b413d8b7bc595bc8e81e453c36087db7c0 +92ccee99d0d3f8ead6877edc5e28210a35dcf3cd49c594171e2531da1536f451 +0e0d51ef1760ec7b1fe195bcb5785c3f26d3c3cac4989c66f6f75a675ed97990 +5621f8b814be502c4c8a940bb6d825e27ca6633eecdc0f1bf725448950a37bef +6abbe0bcd5620ef0a66a736b7eddfaffdf62796577a1f482ec4bdab07024afe3 +18e92459fd61a4277b5e885c50a825e94ec3e8aaf4292ae4bc9499a00ff14c6d +4f742615f0f63a62f273218da051f35a1a429e1b79be5926c10c5a2ac38ea8a8 +6b055407faf2cd0fd6a6b16f847d9ec7e911e436d1d597e012cec5a08d98056d +63ff4d16365a9033251e8dba1ee34f7359fb1115ee681f78a0d9840fd88cde7e +e4791044bc3618b646af915e316d64bfbeac1f6c50cdbed248261813749e1c0c +f998383bc6454d6b384ad69f9a8833860df4d66f750fd45e36f9aa1da976e55b +0b06477f3bafe5feca828fde3a373dae7c2c029f2b2c4992d71ae4fc1804301b +35ca5e73dd0a354b53d1c74531a4c860ca8946c9c05c93483c0f315caa8d791a +afa03fcae03ee7f6378c9ae14cdaf68f002c3f306682777ffc83abccf992c787 +425f604253359ccc2d30361ced2137d2f825eab125a9f4411453292afa0a5228 +e5b6b4b6cdded786c3623f8d02bae3733a72bc1d1c5d8e6ad59a371a1769512e +c26ebbb115291652182bc46ab673d016ec0f25487607fc04adfc072cd084e66a +2d4ef87343c42a4d94cb9bef449af70bac826c0688e26fb2978bc71dcd25fae8 +c3e2d96e8812f882fbe9e0962e1bca90ce38a0da87c42579b1cc21c117ae7533 +1016b8827a466609f215fd6b6b4217beca5e741118e7f77600e1ec593fb3ce2f +cd61c7083a4c5c9b4dc9babc7e573710341d678c527068533bd6d38d9d9c17c6 +51ab8db46418ab6a794d330c7d0c2c5f4d8e6e198b47ad4410fe1e3dbf9ce038 +0d82be729e3cbe262d2bb7f05f269022fcf6c89b204288de95aeb246bdecb355 +341eb2e622215e967abe6b6814e4f76f6dbe972688d7c2ceedbe858b96742122 +8cf1718747cc0b5ace901b98f4a99d7fbc8e5c675d78f0e822fea12e8100b88d +5f8d86c5e048d4d33942bfe125d27f2a4cf26ade4b16d4986ce4e8464f7fd90a +20a162991146ec48522d334120d140e31bc5dbc0c038f3ecb63ff9a2ed0efc3d +a2d7c96b19d6ed49cc04a54f33d365737297ba328e3d646cd0390ec55747bba5 +248d44e594fa8389c72aa738a99dc4dde351d381d010a0f5fe48aade17f62958 +773d1d8500819db54d5f7a21a507f767f2ca63c5ac7c08fdf71e65aea255b971 +f5c2d65dd53d9f62d85be99c8ee05bd698cc7abb7e596ff0d11c51d0534dbb49 +2b219763fc99ba557da54c10bef24935e45364d8cb1ca2471bacacd1d67a77ac +ea885796af2cad89cc2075f3b8bed21f9b56d11d21561e5752289352227e944a +76f5fd44513b79a03f3639bbf8d2c7f4b8fef335a20482b0a3b401923458a4f9 +63f1e52f94ead00d13a5f0fbeaab7826cc8408635b28378899a05e4e390490f8 +d92a93eb8a105a4116a86611ac89f27d946e52ce39eaf255fce513d2b2042e66 +618cc2bc91e8c0128e8315624acb66f2d48cfe637bbf27cee5d0fbaa4b9f99a0 +ebb9f9d8093c08bd4e067abed9308ae286ecc5b0cedd695bb863da43eef448ad +6ab3c9278955e9c1be2a059ba2524352a720c49e5db9eb8d06a09af38b957f78 +c686bfef9f881d906e5caa32e496939359397693aed22c868b2a0872ffd968f9 +53b7c508ae04f706876bc1e165c26abf7ad0cdbb6a0176df1564d7f7cff2359b +cc151a058c48d429db6bd161b8410082d3ac53331c4b57a527d18847ef744ab8 +af983f3d22e35b8724dc460d0484f6e7470316dc9554906769faf9e1e070ea2c +816a9c681e3e00be2a1ab9cbddc6a43a96aca4f4e7359c1535e1e88e4f360569 +13d587efe19e00d48137804dcf153719e8b7b80ff47c0c007d80a1c6a1327d17 +bdf5d8c0c72626ac7e5f569e12ef87a2e142ee2261634e8210f72d92f64e34a2 +c15f7f588e78865b3d6a62b0c3f5a3be15c0754e400d62e7e2618ec5a93417b9 +1a079de49906243fde354491603335b4bf6daa0798b51ca307e41f41baf0bf79 +490f892cf47f2fc51560023dd15049526e134d67f48181f3751305c34ee200db +772cc0dd679264b45a99f5d30c7e893faeb3906d243a037e9baeea613596f222 +172033b01edd18c94df6641f049102ced150c535c70d1c4c66805c5626b52bf0 +9a97e5b539778a096b79166a592e0d5bb8950f7d28ff143f99495cc7c0778405 +fc7fdd349cf53686572f89219faddd5de8f3ddfd828f333edc15f3614f326975 +c9fe749a6a2730670919b4276eaf9b482ca96a0ca64af391696a78a377fd1010 +74a90f73d9895c89d4008683f0759813a61714269f67b10c082843a92fa97b55 +d2f9a40b8e4156f3aebc7fcba0773e00e781b80b07004e5b20f8c9fe14e7df67 +12a64ba22cb262799c84746e45f3f41c4776314c3f4a0b9d7eb83feffbeef166 +0d4590a43a9373c08942f46daaae287a420749f7046742e7b6e15ab3a04d2b97 +2ae73510f57de8d24e555c438d0953e1c41db9d6f6c12d2ae784af55f696efa0 +24b5aaf5b3e20cd6aeabb356f33b6b93ba8cdf2537f4570332c0dd0fce1cf8e2 +ff3cc038ff272b1df339cafe3659ac4541f2204e934a555ad9f1e9ba83148113 +8a8947bc49b9062e71c202631cd8c856e87cf08278f9fd047325dc4be74ede82 +42f483fed616aae2d6a5dad1e1e83f124dec374d57b81da43a0983daa34af7ec +ddec60dbed7ecac68409956a0eaecc110145ceb8d99bda1a766c2ade43326b29 +cd6bfa4416d9e0f2153f4f9a969b033087e152ad9bb85a40479fbac509196c99 +a4f0841449eca6dcac1b9f9d7b26fdd6f7fbcb3cdd32b75091c5f96b3bf114f9 +610343ed284f5658752aac710270945c0a41bc3ddf3bb0b21448311e9331cd27 +06364e3090a1265a17b1b424d03b1e950c824645e11ab766503b0ce70415d410 +afaa5b33eba7b498d80302fe982d9778e4845f3659254ea382964e395d4d0341 +a9feeda8f963739e10ccc58baef8dd49a1361a0cf95083559ba32a8e5426c981 +42ec2e925e4b382d5a531912627eb2a0d98a25fcd540cd5fc6df156d4a5eb1e4 +14dd84c16fb9c6945e7920179130036b5f05f6e283ed715306cea7ecea13e281 +fd69e9a93b2bdac310088ca3153323138d52bb2db9d272b6ff67eb59f3db66f0 +8d1f6ce77c4519977721aa8f532006be856b00b33369fba6b980c420e34ad5b7 +810122ec90aad038dacd3db88ce061e05d12ffe44066c1671738aa913836edc9 +3ab7e596024fb3498a29e5bb543a67ed3e14b9eb13dba247325e70cb0e1fdc5e +b3784da0415cff2b1a089779fab42debd53920ae48556e4f906f92abdcb35cf8 +d53e938b1ad434904aaaccc9463d608bd4dddcbb781f44b864e1703813fae91c +c0b148445b88e4749cb9f52e8a6b8f598d754be58c22aa33d00597d22502a71d +c207d7ebc4efab16f0a9c3bcf6f888698b443779236c33358ac4fc59c2f5ecab +3ed32277fd98ba68be767aacc6abaddc7755b15c62b458a66086dfb464f6c7cd +adad1017b7f4f14d98ef09f0c709ab6c529d19afbbac325ccd80d57ddc19ac69 +57f50212f6500e4adddb800bff909d6117961e6a1bd8580fae0e33103618d4d0 +ed7af5d04ebc3388821c121ba2067e10816fd1dc7a75dfc98106c6e9105f01b5 +99e845e0236258628b904df5441abd12772594645537c75b20460c48b5f21fd0 +2f73460068ec2574fe6829d86d6958a91a588ff609f3c9bcc2bfd3d2220e4550 +3d0e5a0fc0a837f73351be9752a659fee027ebcb926f5ede378f0bd10cc567da +8a829b235b48eb7735919563136fa1a79f99591d431c768b5867a8d2e69e05ad +4f5ff1e34e6971eb4413328c45f3267cfff49e498c870cdb50680ab42bcbc34f +c836c1efcc10e50a43b648c88a7cc7d703389dae2b835cbd5510e1b26d4d436e +5f5ff8f7527c1519bcdc7bd5fe20a390f484db9ed9b91ae7c4f03dfb68b1f204 +5118f5e814af4ae832444f60827aab48a9dd05ecd39dfc943775463889604a74 +58c324cd27782d8bf4b3017821759d70a344eb605bba453527aa7de48be86d71 +c3477d99f41360c647d103666648a5ca008af3e1d5cfa3b40ac10dd1e79b302b +eff96c18bf92a086103a9aaa81e55d1af9fc36931952a736bdf7dc57354afcd6 +a964933bdb66423ea58edbf68618cd5ae35ec562f343c5915df0551e54888e29 +5c86cf31506cd44e8b3224db4aa472bd23bf94e1384078713baf280093460a52 +fd49cec5c2c29d91bf98064e53137575260c5867e73dd117e814a1b2aff8c497 +406a5dc5ded79cbe50fd30846c34d7841a850bd3fe132bebd9852d9b2f1d7726 +559e1cdd292bdac58eed6ae15d3f17b4ad0cdde87b584b190675d27b5fe5d0d4 +71f3040390f6d65937c6d83dc34ada9dcb8b2b401cb1e5396505d0af8c33f113 +518912b0b959f3c2e8d208e1ff28951f403400ad78ac0e4e1456fe9af63303da +adb9fbc8e99ed0a02d960e54c39b3c27e58198d01e358b2336a4be0eb99ec566 +73d45d79e6706c7304c6982d64c00432335da50233fdd28d4dd03851cb8aee4f +523bc43b61f26affdac9bbd7305d389f508b35072c30be43147727dad9199881 +c7044b0abecc5c64d7d3f13aad67177d34237ab9f8cd77893758e13619efbb0b +67315237f63312eab8e1ee1e5a594ed963326bd2c6d54c50b8ee10538b4fec25 +16d138109d2d48849e015934d7e32a192ce4abe5156402c3ee8a3a5d502ce829 +d40b9c801b78c024fae15b5fb88c7ac33028235330da644482c0a22ad5444ed1 +0f69b227de49da59eac7aefcb4ee7dc0b5d1d1aeb6394ae1e0d9e130c1b1cafc +10787eb5aeebc4e7235e6f5b1a991ee9a4cf0c0439025eafb59959c32604a640 +e9007f46f9136026d058b594b796e6747ac3cb6b14eb61a1d03dcf87f05f4edf +e1c6c0dbf6c0618f2ba9d1a690cc811c28033815c699441ac4055e7cdd9d2b91 +b631f7c3ef32648d2ca927186872cf2fa646630d4eca09162ae9fbb00d1ce3c6 +585e4cdaa971d4b7d4ae0d5f8db5da74ad58fcc9e3378e7b2d4ca0036fb50611 +c98fcd020027cbe5faf311ac7a05af6039843af9fc3b830e0a2cea945eea5396 +a5dc74a465a0b6560b6663ac69e867925fb1a69cb553aef3dbc53d8a631e87b0 +0d48619e77de39aaed7dcb68a7a4108ce2225010964fc08660d54d73064d7cc9 +c7c6a2d12d7f5898280324a90128e4d0730ff35e7b93bbd350669297a6214df5 +6a775a5b7e73be6a972896e05d423f9e9798622b632d215812e911a93bdb0ad1 +3c5f628c4ac5704cddf78d3272fb1225bd4e12713557a403da937ea52d193726 +dc8178766f4e739d2e95f14939270b6507f35d83e1fad6c821ea1dcb5eb2a3cd +be3870ece243b7f406cd6b5cb1caddb1b98c32ecdaabe8672dabb042cdecc286 +9e895eb6fe13df2abd25e66acdf07d402998dc54815386a3956cf36458234147 +c90a39e7101e4bf2186153c63ce96f3f34499ae1e1c234a3357ca2ce163106d7 +94083eb36aaa93e85e1676cd94259e173fb6ac65d133b16bd1314b259315c462 +56f294e37c763c5f16af239738efcedc3a6bdf8dd79b34775709ba54296899fb +e9a316485274ed8363da0329ad0f41c62cdf48d7a25ed45ac95b5e6a4e1bbac5 +6da304edcf14c008e3f0d306c7f845b87ba80db258ba7881695209352f41d78d +316017371a32fcd84bf788b511afe571f71e217c0dce3e04ab749d4596d0d340 +87540d4730c013796215caa073a1b99733cb7121a44e22e4fc2b1c052798acae +0f086dba8eae791662949a26eb35613cba94ac58e47f4b7b953ef9913dd2c535 +37da9c1cce1474632288903c95bf7bab47f056b62d11401abc85b20b66d0ce72 +545566f9bf44f5cfa099b66ca02a728afb9877021ddf05c1245849dc6b6816ea +b3cce3e604f604cc7cad40b2c919df5c92b356e0b81f6738a8dd7469a1015a4d +6c5c6decb0c3eae39b7b3fcfd482d53ce5c171c73e23aa44ad41c062e8c7857d +e8b56561cdcad550c6453c755e3e081273763f4e68233213a4059f6363f55741 +973356725ead4dc6398d1d6409ca8d49cc901f6e9958974a7ee5c02f9c426f11 +f29b54c316daa3f1d66e0c9ef73624aa70d23c0f15448cd295589bc2915a6a6d +616d77134382687be88b7c1b9c63c0e695de5487a5a5162411b8218b1174f035 +216716b67f01661902287ae5b384b916d2c1682e2a0664600ce5e494f13ee820 +4b267bf8e863072bc11bb5e4506167ede7aba31f58e468d3f60cf5bd5a2a8721 +018ff213e5c84f672f6f2e651c4708a4f24c0302dcce4614233ac6f540ead177 +7a1155534ea0b6acf7dfebc0c6dc49fc9692951f587cb8c1cf3293328df7655a +d82a144d193cf8b9a274d27c22dde2358ddaf79400a7977a1917fa10f445eaa6 +260ea56720e322abeeb790731031a345c323b9e2e220e9e9fd0d121475c6a7f2 +464252ed44f00d02181f1a5814d682f28c692f969db1d834227cd4b539539ffa +46be32ad1ca3c9b4b337c64d3e61fa5a6d7dc29345a44d0470e564ad61cece8b +37595d7eb3c0933457be8f73758d8d6f38b3e843c8d049103f5193b0e855d5c2 +df1092085c80154c50fa825254dc1b8a895e0bf3f681c2575bbb2b49e64a3c3e +77794024051769ca5903cbb11fd3333656c4eb07d1d366d656467df392bdb9b9 +373e38deb2d83a9eddcb2699116e15b9d0da679aae82655eb917986e768788c6 +279d5559bb5b104b829164cce27896027913105aedc252cd0bc68032feb026c4 +1792df669bdb1d4bd94aea620cfef970e8756b258fa82a9eb86af25b6de4e5e4 +8b0bab5d552326d8c0e6c57783935d7f0cd66c078722682bde80af3645d4a9a7 +ef9aab474929c1749186c309347db0a5020865337542550397b2020dc666b333 +9ba495f358ab8d0adafcc5a3cf7014ac94b635e2ba1779bd0c44aac60cf3fa4f +ecafdc876bbb528cafaf4f577266ed00509dfdc52aef8ece25912c04b8283f6d +a8cbf712d5df4bed83702a76ab73d0adc789924a600c1b00761b986bd668b6db +3de4008316053ec633300ee2e3ef9d0ccd3e2e5ed6a829ca814c8d127dc6f618 +d6165639c5ceadc8ff161f081a019def0f888ec6ccf12b69502a4ac2e802546e +52600c91d51e70bd891c5ba957ed3951d84aa76f6d2a1a7198965409f1ee699c +08694d9852f4a97839956d8060dd6004b0df827d6daf19325ffacf8773f5a14d +b92eeb033282a681b443b54f242016dac22ca7388fb8d00dead2af7f39fd58b6 +f109bcbf96c58e46982148c86ca3bdbf8b61e8164b08f992744c67c636164fd6 +2d68c25016e9c672edbd444e058d3cd9154ae39993f1d5f319d58991f9bcb03b +34910a12bbb597c3f871244561495f5d94b92f3c6b5e1ea0254c7f989e033eb0 +de0beae9676efb0d75ca0ec0fd07757bae8caff29bf2e1c0098e6d0843a2bfa3 +1031b383ebf4d12c07f1e3caee0397f7528ce5eb04c595358875d2872f19cd45 +7b41ac5dafcaecf120b2b11c0f3e927366e7a73bb033845eddabc9c62e373117 +de6a7e7d6895b6e6972d6c36634d46d55e0070e82f96ec375ffebce8a4e09818 +11328206eb0f4b66e0a8087d0145c1d10c49710c3fce4a5239df90d0ac21a0b1 +04d2505f7b5243dc96d4912c9dee3be9dcbfd9f7c2a9c8886dee4c41c58e9ad4 +71836d2e48f5ea7b0fb04ff6d2ba7b8e78ae70c765b11939aab939ec9b9a025c +f27923c7bd0455bb858ac6f74baae573b066943598c3eeafc7f1bfa1b0e5fdad +cc763c0badde7dd314d186b413216fc35ace73311dcf84d0faec0dfb9483eec8 +895fb678dd36d56618c3b125f7ff3b20f7bb8dbd86f52ebb08bad2a73ed6c940 +44706ff7ff263b0dae915e78cb36345989ccf84063ce6047e93a2acbaa983182 +db3ba114d80fecaabd2816ebefcaf0dc6eb42fb47b3d2318fd557cf96eb5201b +b0b265bbb77da6922fbf9184afe896b88738ab3f9ec78e711e418275b101f8da +be795d094d3b2c5f1c5e01da37b4e5976cdfb56fb459c8611ab2cc9081863e48 +eb4515035709f715f99fd62abc2e495cc8d4f8a1becb35d2126ffb08594ff4af +bb82f793854d96a50ff37c24d198f533c348f657ec4726ffb648522893cc36df +d25665df44ff0d6465ab46691fd9445cd3290cf2455618cc3a52d8056f179be5 +649a1b17bf25108f9b5b5a3eeeb22d970d968e25e20c5d4e503ece7bebbbe696 +465191dac3046b7dcd8c3824836bc6ace208dd60982451731e82aa0e85b2c6b0 +af9b9b14848146b09c64abbd9625f7a3bd7b5ee015c8f5edb3755b6356c37301 +18bd9f49bf060984259ae5d7fc6f3ba6f3ca2223e0782444bcbf911885a0dc77 +65d705146b91ebbe0cab032ca8336ce9133136ebe740d0a126f12f43b76fbd35 +4c09f5a66e3bd1c295a6034187e0ba7f916670b840f146d4681d43e9ce18387d +70f44aee7ae7bfebcf588759213263a8a7c4c3fb7c31e890f285f502c5e88963 +964556caeac1f31b8975a9537e40c010380042359200b4a951a9effbaf6fcb28 +1fedcd940e10ceee8f3428f1e00eb8b1626ddc9c6554a8a7ef2e87319f3c532e +afba30b322cc358c2ede14a5aff1ff1f835963929a3f396361b714f352133a81 +406515004549a91a192127406bb9f7a61536f16b6e2b51dfddcf0f31ea338259 +a0ba5126d1459dab06c8ea7d88816b2a750b4e4c6c45109cc8f0944f4a42371f +383a585be96f72ad5884e8337582329971407ac1e6fa94d7faf980550004be9d +a86af226e74b6b87ce02bc9949e3edddcfe0eaaedf502e649122829a4b5a0a96 +baf1aeecb528b092ba289cbe641e2775bd74434cd3915082c4a36a898d2a0347 +6a639cb3665b8621c9ca4b633e7b5e7fb699c39d2fa9583aaa000b1b3520661f +398e43ff8ac75221bb92a5a19ba43def0c89b9ac73f936babf0c930cf3f22eae +373a4c86e6356973490e17ce7163ae33583588d7b7d7e9d3ce84d68ef9c0b524 +8f14be69001dbf85b887e902b37813eaed85fd1b8610e2e964455bd3525f1e99 +c8bec17ae486775dcc124b4a3f2acbf05d6a73146ff4bd922a07022d09cbde83 +5c4dc2588db5720f6d73829b6fe92e592679efd487ec842be2a87a503d88d397 +36bef70dab7684f29558b85bc5ec75db196967063d4ea3942d18b6bb4842202e +2ec18bff6a32a85a82f16342f1c8c2ad3e0cb12d4e61c7ac250f481725256c8c +c7b29e35caabe5a130fe0c917b568453805ce48c7822f8323b7b6bde5450065e +a4a1a6c2c11adc940d1dd15fbadab619b677fa1710eb86cf4d7d7b0c543bd182 +5cf7a30310c18c874c8040e10addd57de7c326253c2a9f550bce08565de02526 +e0f014a504529dec9086aa674b94c1e0786982849905fda956a2f85fe487163c +c68a363c2d44a3300c0364d66824f31dd0f11ef7fa7553cc42fd8961baeecaa0 +edbd70d3f34363147328b558f8247baad15c994d33fa696af72ac2a0c8347179 +b041645dc46262a64d3983c46a3b460295b6afd8bb2de931bdb27a2e94f23553 +f1f87c2d47b88755575e09f50499d1cd6387c16c11399a6b4bac761e80b97370 +0d4d8e3d599119446c9de410e33aa6d5925e8c4947533bb2709b9b1d4d0b96e7 +4012b9cb27a8e1391ef72870058850227748afbbc55a03a79390b98aafc2869b +fbc9ad0d171ab701befe311c559b3865fc0c1055b3e8e881a69fa630efc7a431 +75af2b55c9dee9bff2beae961861e45773e9e37735859983b9603008de8d569f +a9a19016c9d9f101f64c345a4ed17113dc187584c1ac1cb7577927847793c8f7 +0c544d329a753aaf47aaeb5e6550777080224c57fa44a44ce4b16f7ab6a3fe74 +368f6c2d0f8df4f3ce6b762e43645ab0996894b358861c4927c45fc1cfffb7a7 +52cf9ba3966f53f00a3b26a394bf92094d579552f79ef2531e375876e52a88dd +8222317318357ffe48d43a58229a93e7d6113dd47043efb48c85714ac19da484 +08000c866b7675813786229a16e5789f73c1c16b876a790913dd2cfcf92f9c5c +31a33eaad8f368d6531c06ce189e07e9f1cd61aaaa3f8291a61311481e5ebf9b +a45feebff7bd242fe2f018aafb62a4188435c46fe68a7ab09aa8c16b2fca9892 +0b9a2d7148603cb336fbd6b08eaaddb6eeeaf325d25c50f726379d9de1618c36 +d2a1034a29fa981b94220d711e6ba5dcb5ce7ea16d7ea03cbeefba5dc585e5f8 +bc032ff17febb2879e61c079f9b90d0a0b6eb537480000352a63ed828370467a +c526f861c5cfc6e53e9a83077509573239c1d5a349fd53638689132f831ba29d +9963a7497c2bbe933fb653110aabad3629e31a7cb3d6d3875b45b7bb8f62d740 +5a6ecde413d365ed05e7de1d2c95d46783a8be9d1b61f24191a1119078283800 +deb44a0cd447d47581972001497fd5d9972541b6ba2ca719a8177feef3a19097 +20f082c42a5de8a071e16e1bc181e34ad5018131127fbbcda2a9ce8b9f5eb83c +c59c96bf0562e6916be9d99779d8d5294a04aa19d8dc839caa42f48f770f60e9 +18c593242436bd1dceebcd354f77e462fc249037b0fff2ee093a799010800ea4 +8da10c23b02dc20f3c3682b32bce8d7073c13f20ac232a6a42a4a0b5e995b197 +1fdf05dbe37aacc0ef62364c466817274496cbc8686650d480054a10c8105ee4 +47e2347c5cca657dc944fecdec1616cfb16ba4442d08d7f6b8cc69b38fa05211 +3213e8ba2990bbe7e3836c167d2c8fb126fb7cfbbbb28d33058c595cc6a16d6f +e84babe05ccb4bce0b62193e337e8da5320f29f752f03a92cd843a99bc7a1e8e +b449b0c95dca19b9ed1861812c7ed1f2ac7294d227358a5da798d7dd314a601a +3bbed33797c6d571e9cef4a29fc421d2b7db70a7e92ebf91ee50f0ecf2ff63c7 +38a713d1b6d1c542d5c6d95fa4e9fd16f4d219ca943317baab091d2021ebff72 +0a5a81cdcbf5f3bfa3a633d16f4560cd3cf9bc1df7ea6504a3e3b9377e9869e3 +e149ab6fea0f80287c4fb26cc5ca6927f5219a8379c58450b7525bf017d72f4c +b5611169c7d001fb816109b334060b0f2913bdeaea69ff36286c8fee4bf2cc7c +83505fc4b7dcb29ac97b3682c48525e038e5d1274a069858e5505dc932c5634e +fd115e02d0343b75907fe80d7d8d421ce40ca292140e0c0f3d79161c618981cb +ccc0f9c4545942dfa182bdd45dbc71b8ea1d79f1ef51fa88d64247d4d2d3fb02 +f4d908ffd1a763d1383f7f54606269c4a0a6c8c82a01f8a40951dd141e4833d9 +7142aaa9b0a7e1c28dc578faaf9926cefdafaf084d50573395633ee6097b2c8a +e70a16f3191405adb7cda9ab344d0872482f6db9969cda14b7e70821b16b0393 +a0431332b925e11f44882286eead545c0854cd41be75391e2a537f12c1826bee +fb1e13a9e40995e2c20c3e330c993fc40df42e4c8d9f09dbe4f5f4476bc6addd +0377ff3cd6a5f1fd26b5c23744555720cd7902f34407fc6f57fb83cb095a8703 +c9d70c96c50fb522affda15ac3ed668a70be3e1038125f57edb83c4a8e520747 +370b6131f6446eed8f68177b4d3a06333544969d04bc2ef75b891b943a89e011 +e078d01940caa9e1d4010670dfb80b1847bcf9578a6b6bfad675b65b31f8b075 +08ae31e6d3a26680b9cf228bf61514496fc2c7a2cf0a635be96383466226faf7 +a8c3570b3c55a009aa091fa99f71f8a4e82833428ae5cf0c5a585da9dac86a3e +faf1c6c31fc7fbe4395a58b193311f67bbe598f88ad884a5381f82498aa3a2f9 +448f50a604d9db2c1f88b47aa783a82d6d0d45b2334b4ff48c8dc810751fe68d +b2f04324562caa35c19a80ff56911399f5abeb971b982745efbd7b10edce63b5 +e490925781673def91f3329107936028e85f1f633791181217e239a2d4dfca97 +171812d2614131d19115eaac6550184f973d439d723f2c6b80a5678efd9fe5fb +2526505ae8968700b352599b1bd964ef8391b3380e90e8febad06e4545c01017 +14bb2784abd7bd7ed8fff02a028767a781a57e1ff6543e996da730610fd00026 +3ea263f3c46d9844f4ea67c39701fc39e54b9f7316af609b22171c743e7e2fd2 +aac70ffaf84692b1d25735e95e45699a5e15a86a7ce7bfb7c51468c09d239a51 +45802559023de368135b52f4f299a4a3272c3969de888202bc1e99d1990d2aa3 +96a0e2230c6d2494e02ad04e8697e61e0b9420cc90bc0fb687aa27f85929fbcc +f6484d047c785284c777bc07f1c7f558fdc170fb0495d1fc65a50a33a06a061d +718391e14deb33fd37e7d27e47b8f3c9dde4bfe43866450e86105746d10cdfb1 +1e1714a0b78158517aad1eaa5847b37208dff3bf319d87184b82a18ed20d07b0 +ec25a1d278bc3840614953c1219add7c21998a6be45126eb61d87bfd5d1aef28 +7ff4b2724025db64ab552c28f0cddd89a04beb667988cfd5adc8f7b1ee091086 +c2b31a30a9bf56b671c81fe10db4214fe93f3d80bc6b0e90410e123b17fa0d41 +e5cbd5355c41bb9579e1ec93177d3f6ae798df9f70f9dcc6b541d5f4b3c6bd69 +83cc692c4448f91a730bae1f278d700c45a5ac32c6d5bda96aea73c95ba417a5 +5ad76fbb2c2a47c9896efd54cb4f178fda187dffaf47c89d5541c6ec74bb505c +38c34cfe95faafb26eb9d1bcfcda8fc0617da52939ed4dc5b7616691a7188585 +8de6b6cb6f6f742b4a61836d6ccf60775aa0c5ef3bbf7b007f4e2053b4cab7f2 +23c96418426367fc5a833fd2b1a388f3352c8b390ce596b9caa79b9d77ca2020 +41550303c76625b527b29f0446e1e18b93abd527d537d927b9eb1f403c306b9c +c3003ce36eca033b7655eac10b1c2ac5fe0774574d3bb4718039e498dfb06e92 +2e3ca571282388bade3e55cbd711c20a93fe24bfb1ebe38f0cf7e1627cf8fd3c +d0be08d8cb4ad52bdc53587bbdb53362d31e8b0cec96c7f0bada54a0bee96c1c +40b1d8506913e7edc80983683481e8a3e7b049fd9549f422945ccd41b63953c0 +6702215dd8a1e466ff3e2e9b97f7a96df89d3078d5ad49af9480fc84bafd02d0 +6b61dd88963e9ac75b42dc9b255a1c20594ce1265ad4df4c485b3f73cc59a4ca +767b5f026acb27a0c71bb2e92e1761744882dc892d4e53297921a27510f23873 +91bbc37710eb2589dd6ca1784043f4e5dc2f08a3e1b9dff5747f69b3a6bc2e14 +2257f3de54ef93c57001539dd6779fb97029e17b9ed9672ccdd7b0286a3339f4 +30b78bd1de5730f6c46faa5b7b4b6213c3bc8671839ba50da8ad0e47890ec3ba +78d1bc128cfdbfd11d59d3292b277e65ff1bfb343f84becf9130107326e4043e +514a01e05be59423c44cd4366268650173cf594316bd18f0081f10f72a665f6e +0020b773a90493b5ddaca8adbfb488d5854d1591170347cb16eb4a426dbb7cac +8576f074017d3d34d98c5d82e84d52071c910929e417412dc64d0f5ce06535fc +94c62b61337c5b27f4ca50b4f516775ed8ccada4c3203917af8014d0e01f9f5c +568fa7668c26ea9e085fbc736b2e7c607db5c0e983107283fcd701d025d4eb2e +1efef45b9d2cf08827d53568598104724fd6f025c50c97d182218e939b92fbc9 +42fe6460ab63ce07f43189dd38745a93a9179dba460173bb3715b145b74680a9 +aaf104ab04b6b8c8f5803bc03458fbc3ac036bf4f48894248048f6a81dbd403f +12c31ea4736d0dbca37d0f45a264af161accaa64e645d20fd10856b063f83b8d +079863f4984840b937efacb021d47bc94b1cfb9dc183247d25397ce41fb861e0 +0c95fc77407d98932d08c42f2393c8b37ef6357fefd4d196c4bd6fbc414e18c4 +aaaf1e54feb3d81f6d5644eb5759ef5440207410464efabf54645132e798dc10 +b068258a3be66fdebf1c1d428d3381aea736336fec6e86b56f5a6143f74e8bdb +62e0f9dc7b80323b3eabbec05d1bbd6676de2e2543cd37d6055e88074c4bebbe +53ce30241b46f82f635a1833f41888af3771414bb943353ff865da76e25be7ec +2bcea61a15f180552f98af07333fc03749598ae8f3d37916c33deb106a2c15f2 +1989350f1dc372c831fdd25d104e82f05b7a102256d9f8008e23942e3f9aabf8 +9d723bb624d0f60cf559cef6379e552911ba014f422801b50b15ab9fdf4b3311 +a2d79df0a820e262ee4140bef47ed964b1dc7fd55b81e00368fffbc63814e3c1 +46cf77833cce07d69c7f1dc7189171484ce5051817ae7bc7b980eae9a2b05022 +60b19176564e2d1ceb79cee1666ee85f29331554d11037c8a79a7d53948a300e +b7344a824338cfe73480989a0318ff63a0428c8134a2c754e1f5394ec300bc62 +989d2c9fd52e76124ebbaa3576a735ea45a87d8442782a617e765ec3d3b48076 +a97a3127effd10e46accd9947728a362fb83f8718b98331f9b84df8c270f7efd +f2758c8660c1c0f7c570d86fe15bdec1d91cf8c1a417c9386e09c548bb401ec4 +db99ef40ca62cfd7a0e09fe111c4c72674254b5ae6e778dea51ac7e298ed7072 +7d0b85c0fe154538a90c7ecb7e1bebcae32f2db9016a00a6e3bf5a103efdb3fe +8b0212049f9d79f95ed645ad3d53658f1e0ad84237d3fef48579cd86a76bae26 +eedc5dfdc3ed94c434903a6aa1706dc18b91e782b0f31dbd64358d6ae7edb7e8 +39dc973ca173c564c92ff13e56dc206415198dea13dcf9cb8a67af542efac923 +369061a76351da95da7e2e95fe0e245ad0671dbda13efca30a654c37320b4d2e +7cc9699c634d129622df340923b7eca09e7b5961bb33ecb62c85591365a70b93 +ceaed2c7cc0339799783c1047df648349d9c800bae1443589f423ea385798b3c +7bcc72cebcfd2bf1731a488365e50280ed9603b4c51931f91920df1a96bf62c4 +8282e4046baeced383604f06e310d9cea008ad5765d374f854fb5fc4ba116d73 +2439b37d8e391db3f4cfb4980fd6747d3e86aa425a5b4ede03674f404026a74b +61940470546d80f7aefa98482cac4d8880aaa329129aae1831c26f91989901f6 +72b414ea6dc7d8468d112521f57ca320dc8cd56c9023c496cfef9588778d66b3 +79c1ae217e9b4706be2c7bc85ce7e98c7c58189f994450ac8ed2d2b153aec4ec +ef5e8c68866d27e2e77b7760c8911753cbce4994eb7ce82e6b73e3e3567e2ca4 +4fe75a109a4276a6e7abb0dbd00b48318bbbdca6a7d7dea749995868aba5a1fe +50ba244cd047fab144d67378e0b21a5f39231e7cc4ab9cf010432ac20ee61599 +34fa8142a2166266d0d192a502790ae0af11ecf3c94c17ecd26182d6a2a45bf7 +85e3abc677487bc20d52eaa378ac3088706d9b19d7a52efb495e34e605c00597 +faa503dabff584127c2a479075f89497cd7a2d54d02329b81d01c900d18f80ba +46d4f7e8a464cbe141ad02a64951a2927c8fe8f155cd6fa4ff3a44412a59db72 +b74499d0b52486f55672f075ca1944073cff76df0ea2bf64f534bd3ea581e956 +e102bca1029ea246b1f08731ec931f1c0737cb931279bd51e31f83094d47ac55 +d969f50def8c9a2bdb3e340710c2c1337986beb1e032fb9bebf692a5a42dec22 +24befc772b8641e0de28e4fd6271decdb95156908b4a53e92f732888ccca9650 +a5496641ba0673f9a10c2e8c544e76d33e84d1d2cdcaa23fd55bcc7e2969ec01 +c009f0f7f834796bccd863b7f1528c13ff1c499e6dd8bb4ba671dec515fc9ec0 +81bdfd97a96311893af9e102a1ae63a96bc22a2e8a2acdcf082bcba6482285e0 +bb744c99a227a18179e661f63be26e242b3e0b0fd2ffa982a1c4e7f051a66204 +c13a59e66833ce590439c9f26356c74765bc0cf209c1d89e2893f017bae39ff7 +f01d79ed9a99a43a3f6259abc9822bb01ba93eaf77d03cbdc5075860ed4bcea4 +378285716de824c71cbf033015522ab3e741aec821747bd635bada9dc243e58c +f4d8010383774f9f3a8d75bd5b9b8adb3ba2ae89772743fbb4713c46c30168bd +aecbeff476e0c2e6ba174f9301df9b295bb213d3a733e4b5d82d24fe579dd73d +87d647aa7cc0bb6ad46e4ff01d1bd6b8a8eaa59855e73a6e6a0a9a800842f7fd +86748489e1b52a597f23220e6b1da30a92df4eeeed744f56b5ed811292d9c831 +1863ccccd7672ccf160851630b01f805c77893ddd70307d3cadf4e259d25dc37 +5c0f89cb28b082f9ed1b8d61e52f01b7f66e401d318db7a93943c78e47886af2 +56611c91c11e628f9aa71f7553370a97d2766baad7f9e74a1457fba25b6a2ed0 +750694da50f77e4b3dfbf38af5983499046732bce1cb3f435626de6a7b8e46b5 +04a80d1ef0ebd4ed0780b0ebfd8c792cea07d2f1b7e2a63a104088b87da1e620 +29c2741c5de63cfd9d12b4c5212ed7022b5eccb7df7faf85e1d5c4b82ec55795 +de8fa1e4654b594b83069e0692fc4954e6d0d3fe94cb574fac65ce4ed497386b +16304392ea2defd78c6a96bb53bbac50ef7ac097ac45a902b39cc3be09d98f61 +2897ad7d1325af2ae4cc80716ba062243ac48dd0d90d86de3c88b16b4281d009 +08be72525f69b7b286fe28253c4be746976cec1de175b3aae41f3e56af915a04 +7dd0cdc064623e453db8123d652ceee41b60ee7db30d96ed641ccbdd70570c54 +82a169f1b9eac1e410b693301c0dd765afce2af327825cac271aeb79a9ff4691 +830517e26d4682dc30b60ab2555b39471ccb6f38ae631e7e1ef89fcd1847a242 +06592ff50bfc47c434142997a4b682da77300bd19d65af7d2b83dbda5b95903f +220d1a2d90a19819607c481fecb5921de9099a60150a1ceb1a7723ce8b182897 +14c1c181343ec220b929336bb2f35056706dc481164f581bfb8b9492b4a93a76 +f4227de34613379b40d8682d58f56419b7b4fcebb75e58d4d17bc1bdcc114b9e +9aa0ce37136b2d92312a40643559a8c8a2de53af09cf1bf9f978aea6ca80547e +dc97a08a8677bdb27a599dc6027bcb2060274f5034af37c15d737307bed56099 +8df21be030b0e57c4d03e2cb2e3de42daa26ba760ea7279815e6175a6e98e496 +618cb4bcc6c071dc2cd94774b5dbc0f912a7aa808e8f4e92585d0a1bebf22596 +82257ec17a792283dfaafe2e93bd4bdd75c1bc2190454b2da333a335cdd0dcec +6561b83cf0ccc9ac09e3b0b1e2e108f14b500358f8fba4a4c3fc05deeffdd4f8 +bf2d0cadd592f37933aeefb253c717ede98b3c870464382f1d97043a039e6202 +4ceb9e25a50834e1134b4c553442b5d4e763b2f833d494ff6f4f5fedd022066a +c62c41d32bac09cc0faa9f00cea1ad21ffd7b62580d6e4973ef82a0a88a94ba3 +481cfc5541b1ac68e633e53823abe38df4bc11da9e41b6bfa4671082cd0fa20d +d5aea26151a947f7345c69bdad50c344ebd7d52c13f0abb42669724bd7dcace8 +01a3727f02b2a9c7452c890425f74ec7a473b2f6cddb89fc02063349096616f0 +975b3f1360ffa5162b577d556c21c1465b997795313db5ad01a059d074d5186e +5a039181aeb9281717d9fc71f2ae7c423303317f66d2c145a432d40ea79b0cb5 +eb426a4dbc2548439630bd49c09c3ac56aa8c857658bbe3c345cdbe60786dc1b +aaeea1e8134c053bff0239c3b22d9f9811f0f986d34b10ebad0603b099e61a27 +f5da9d88b88c435ed87c4906de206849f5b4427ee0439ce2c99b3e52eb634ab5 +287abb15154d08932c6c360d85030a92bf8dcecad523c123c7d992f742823af4 +95a83c4fb38407e87946bedfc719cc3998d3487589d773ac6da3078b06cd5ecf +77ffb84a96cd2cca241b84a0d35b0b340dff221b9190c1aa2d6ada767a0cfe14 +7e3428cad1c93da6f3a01f821c6a410cf69fd03a2e46f17a31df33af3fe25492 +c6ee8dfe79ffb29561f92f50c69b6fb2ee2841ff6e3723e18f86fa65ceb3bc0d +61e2f19e9962320aa05e82ba9ec7fa6dda9edb2eadee478c2da6951a226ebef7 +b2fdfdea854e541a449db75700f057179623c32027ca181b1c8dd6d83ebb8bda +521d637b32d7bb0900135f61d72bfc97aad5cd3a2aff218547cb96386023d3fb +9a0b86d9ab93acdae4f4eb855735357b77a24ec5ed31811feaaa2f93d6e4ce51 +2c9fe4830743bd3082f52ba17e2a4cceb5bfd2c31099d852bc1d1d1d4ce92c95 +b1868a8fd559e2950a55a8dd30adb1f0aa7b40c900642e56c958764b81334ad2 +5386c2b94732865805b994b5e9949b7b59fa4e9e27cde175106e944d0466fdb0 +85a73fc4d329efc235f368515bf6a5e9460c9e997ccde7bb4691aa903911e9a4 +14fc8fea294185f8d8d80a2a1359f9707121661201a72e571810f9cdcf792c05 +ab01ae9c0916be2070c264b0baf34f63d78df7cefd0abefca77639bf25c32fbc +143a000e2cb1fba326deca8b32671af989df004e1f355b4faf7323da6cdedd69 +1c73f44cd381644c8d6987161b3a5ed5a36cb698f94970a472a32da1ebc8074d +e29a2d9967f7f3e656db600eb06daa0778478ab53b653d19cbc096e39945331e +0d325d2667226e85f7d5e3442e70ab51c294b8eb95edb631cccf964fb8fdb8f2 +83d6dc2150b8c1c31f7a6b2990cff2dad2cce88d8982c4f01da6f41b271f4d43 +4ecea79d6a7c3408d986dad00d2173d387277e35095513a67dff237c7d92b745 +f0ecf708b72515cb9b695e73b321247a08834d084600b3eb7707b9f42cff1205 +814c1d788e3ba40d49b97f15df97173f17918d3e4da33485081791990389e2ee +7350ec14e7d2311d7eaa03718035babf963053ec12e427a0e503f8d0aaef29af +ab22a7ba4410cd40626c21d29eee1b4c5b632d68859d314670891f87f097e293 +80a0a248dd3c0d940f119bab3a42a4d5d62990a03d2dee622e14de8ed1939658 +4db30c49e896782cf4e451269bfcc00f5525b1ad733c068798f41579ca6a6ccd +3aebe7de7bbc0739b45cd693227933d8f36ffdebb558894780fdd8c2f58dec0a +d78ed417b05e089bf1c3c9fc389787a1f510b7c8f103b2ff8fcfa06aaa41cb22 +68939a1649976475b1b3c90d2a69d30ef7d1b800c8fe250fb605f04fba577776 +0cdff81066d7a7703574b0407eb78953dc8a21ea0864324e65c75060fc889f0a +a8d26a6342364972e530cb822ab91393e298075263a6f2f31c2cced33c217aa4 +1b15e0acab0f88706b40b1bc490d9304f588c2df3331b47af241d0136216a1fd +8869ee2ca67aa0b9f3e0920f815ed5f91bfb5b3701402ccdf990d0111254cd40 +00edc94f1960d511583f82f28f71c30eb44e1366f83f98b8ce38bc0a620b07b4 +9a0776d358f6e3d3ef6f145dff0158fd839583401753fff11cc7752ca1813ce2 +8d9266aa71bc27a6cdb2c3ea9bf486e4ce62a112c65f44649d7bd68d8b1d182b +1b7d25cbee30bb6c56bf8fe290fb44946c5c7c5561d6c24e97137e915449ca81 +ade634ff781cb95ac4c43ee88c6c8bb0a5fdff6d0bbbfcd5801885b1bb4f4276 +1b6f2c117bb90058466bebc36ba78a4d229352347715965ade47fdc175bdacf3 +1de2d37ea1106e0ef279da2d566e42f98fe6e5fde8e3a292da9b327541b7cfd5 +d60538874042da03b15ce640ee2d940ddfff12ef13580efd2efcac2e779b9eac +3964ba7e6ca66e05cf3673c49a18e35df6c69f9c4ce16ead461bc5b09e9fc35d +0d66dd4fb6d33066c8b15d6704a9890435742271ea33fb6ac8e5261c2d3db0d8 +84d4ed885d5d4635a4e4898be0eeffebfc0ba8a90bd92bee924078802ff82ff9 +afee85f3a4676be2300906b95000516056165942ccda64e891325dacd9b73750 +5039d2520897cc43d9d404c299a9ee3884704408417d64512d9a6a2afdabacf5 +6ba334c51a72fc247dc3a079e3133517055b607adc13703fee0dca0f3f8ddd59 +8656337980bf58f3ae667b81458d7d539bbea00ee1f0fbe756a22cf51817e7b0 +8a7e28d2acd83b912365aa69ec031c135a5160fcc55a5f9ef4d023c92c2f4598 +8899b1abbc1c8e957c2a416b1be6eb1bedc273b3cc91b1a220bc40b96463def9 +58bbe5b6e685b472e81a125263816fe2e4165960b7851ea8f65cf61aaaf130c1 +04ab6c86ef0493d806386e889630fbf6ad9614041d92d35b5f788b63ee458ee2 +c6e3c06c60cd1f884ad3b1455043757e32e0a35d910c2fa33ac3abefeab3616c +3023179fd264c8d3155dc6c73901a109abc353d664fc19a09ba716398118c94b +5cbdc6c23364cbfeec6410ad2712edaa9932769f4c369877a832359d078559d1 +be39204ad8b6324806ae945e18fe20f6a757a0470a2667bb7284a9fbf1b343e7 +26df689bf6d69574c6e63572e9532fb1e38bd046936d340c55eb8e14fe2e80b3 +a06d4b911c6b3e8333c36b676ae8986469295cde55929a1d1d767476cd47557e +d438bec525de2d4b3f55ae52a6ff18d00d5a1e1abca167a7d8b6dd2c6bf23fb4 +ca20701c9869cb5e930156da33d3b2fcb70404c0df725d664deb78814e175035 +02639a8935dfe80b8809086195a7cc4c354bfcddf7798edab74522bf447f2d47 +52532fe58da8b5aa1c4484b50ce37678f001a6aa77edbc7f0e2ab2b65e9a4635 +92dddbf932a5141e9ca9f108abd76de7c6f73269fd00eb8211f3ce32b92b788c +85933381308f912476ab352462ce1e1d98fb6eea4f690e0e036f3deca9cf1435 +1e24a41320b229df0600c764b7e09984e96501c18eeb9d8b9b6636bf3b6e7068 +581bcdd1def63429afb5aed8edd44646a6dfc56b4f82f49d5819cdef9a6f08c0 +6c559f07d3f09c2b5956acc01544800a24d0c22b00cbb1c06b119521b967cb62 +2981313c666afab4c96817c230807850620fe00bf98be25defb29670cbc61440 +90be418d8263c478d879bb5ef72eede7207cc7b2dea21957e9c476608abcbdee +d50e7d58160952ebd4e840d604d28d68292c556dd79340bae75c318a9f0b2f64 +f3616c680235bd7d4470b7e440bc8b37f351780aac3d311ba51d56cb5267fa2c +0c45354d73fd084635552bf78898e2be90f5d7daaf9353f58920a0fe0de56eed +fdea94349d207f4a5fff48c14c6bfe03eb9b051d28bc950574fde10e2e5e7cc7 +b4d9282e005a2174c09c62adda2e15f87360d8c02030de0b16af093feed4c409 +b908426705ddae110aa3ed8b1093702d8a50c08c2358b932e9b98b0b6e7cbd13 +7b6b2aa51ca68df71980ef797fd483f8dea3e44357451e2b834dd0df380ad9eb +e1a974f1dafde3620fffed6385b1132df572cb35c705614556bd07129c02909c +2bcc8c5aa450e94eef375efd8f77c0a8750c45f45379af43a12f288ede4a0935 +8c67eccb2733446f2a7cd0adbc989b21d5afb11fccb57bb350a39c13b3970e90 +17ec4f1e0c2ab7fe6310a4345d1934fca54b386305f015ec87cc15910c323450 +e1cb60b5a8e0dab68412dafc511811d7fb2ca08d9338a85bfc050e171dda308d +4e58c9695cc8cd6ae5b14e1e5c47fc30e2f38d11c6f4964fd16934a8ffea5726 +8e489a334d073fac76196db7b3c8c6d4eb1b21171ba9d711433dfeef3b7bc0a9 +a50751154d77ef7f6c6be0e35fd0d983a5c03bbb35b7afdf952a9a883500a80b +da5f65cd7aaa71e5abef7260a089bb730a5dbdde0a86c1e1a8acaf76f998eb17 +55a0edfe1207c5692c992741e653480788accb3d8fea8ffafb73650ac8a8c349 +664e92a2a8de84125c75d6155bb6165aee20a0a8ac09ede3a1fb800f6fdf0b4b +4214fa222a5cc6c41f7f7763891f5d578b6d989ee6fa56d8e0f77fb09acf241a +88f5a24d4c08f569c4a305162247216455c4bf6e529128081b10f5cb09f748b8 +e264ed4adc3a950c5ffac368799c4c031ca888d31ce9386986222dc3688f1c22 +82dd221f7463ec3cfdde846512774cc9ee1b1a6a2091355b09a33d4ca8538237 +8e5babc5eb20b1883bbb71a6987aa178aa4dc2378a344b5c6c3e214314c9ff3b +dad4563fbe133fd2faadc70b5e36ec6de0f2d757d49b51c623d42f148f31d730 +a0cf5953840e388b8c6f750e3dae0677a00f78cd81ec1a76dcf0833dab08f3f0 +17b60777617649f85149c20fd9b13dae3efe3e8f1c7b801c5ec0a4e2ece7cc00 +9453c80674657d535bf0dbd60e31a2e9361671ebbd8591034fc5d77951ca9abd +342d1b3ef381ccd243f083b3ca5cd79053a4b1efe8a668b73e9295cb78a9ca0b +6e90f22fdf826ed2561f5b4bd0e6d1acb2fccddbde5db08e82d9113eacb6260c +fbe7af67407eb89e4f29b5669f0172c6e4b1cfb81fd7d28ff5167111b16ee4a3 +49d5ab9408be98a51aa4d17412f0d23f7678238bee914506ae72b470fb581a89 +8969eb6bb0137f9b38873cb5ecb0501e49dd3704719743a5ba4ec9bf5c7d3973 +557888428d30d2fd228127ed32b484096edb0c8adfcf6ffe8cd030f3d5410e62 +2fe54d615272a7bf503ac89d0ef3ace83754978673f9db3e005807e470ea5b55 +3649f61148d42e9e6fd19e4145980c7ecff2bbd8ef84b435e6562a920e88698f +7d1105af11926cd6180d6179eeb68823d99392dc95a948e48f3533ff1c4b2026 +b5ea505db22a265d56441ab455024f4263c9ad36c3e25ce067a1937303f9f216 +186ac443d0909a4ae76915584bbef1f884c321fb823b724c58757e619ffaf201 +17e5d826afb62d2fb7a1e115429191c80aedecf84cc71ac9e7eceed3aaa33838 +861d5699440962f38db466528bcd883ad8385e5b8b9ae1fc891152ffede5c2b1 +39b1445e0da532a4c9d19662c7b9af3a158ed868f5b11d284d19c850ad79bfdc +fc4b44ba68537b205420140e803a16eb78111fdbf1d89cd1efd2663e3e306245 +84a5e70d413f73cc1f9392610d0c4a9a0a3e4e32906a058d8bba062c94fcf4e1 +e402024efb1b7ff8379500d16fdd85b556002de62f78c827de10fc2550bf000d +fe81b29747882b8cab4cd04acbd92f009ae3f79956996cdd6cf5006e200caf32 +e014fa4b4e67ec87f6b76741006fa43e17f11e0aba57592f481bfb8655bc3499 +2e8bc3d57ad02b4744e1cdbfa0a76c543bf214cb6c637eaf4a958b337665baf1 +b286b40fafd6d833d45b4feddf163bea2716d90ddb483f8978b5d92d8f78d13e +9c24b1044543b289efe180f0dc7fffb90cb99f928458d36dfcaa18145b130d7b +6b57be3f81244f6064b61f630af5e876c8847ac278dc25aa942b9b90b25916a2 +ce48a2f2546056f7d3c9e0f637b52eac424c3c7b838b279e9cd310a520be41ab +8c7bde64af685340f44d0d5e4bf793da6d7fa368e9ccec9c933251e56bbecd77 +b0a3a4566dc074e2bd55ec1adead11e4ec91937c8924b7fa593b24ef32db66fe +8b27d795c12db95404b2c66945a9c3124cacb24311fca2567b10ceec21e22667 +8925a85067442df6e02e21e10d6ac641da354c318ab4f244c1c2dee6af49732d +3f390fe6ba7c84e415b35e390ee2037026c01e2fa69d1348871b867a37ac2bcb +df84ebed1024ee8fed087491c8978051c47fc1ab12a4deacfa17797ded28d929 +e212172d3d8efc3b04f5d074ca57271e604ef5d0b9893a6dadf516fd75cb84f1 +237ec510567264b2f20ac77c21e0a623ca2e05f50bdc856d7352bb03dfde6a0d +b16e1afe6d3b6cee4e695d985b7fba36d64365c231ffcbb8be40948810e8147d +591bcf096bbf5d2b545c9945612f60869abcafb92fde6616b5f863e55568c7de +c6b413edc7473bb35c6907607ab5fbc91ad25f4c38707f57d22902f2519f9a76 +338a0c3630d101e49f14089aefb0e8d6c735493560900542402938b467e8437a +1089d9460027ca5851a788767167589784e55718d98528883657b4fa709f5451 +00d0cb2ea4213a44a337afd552b19c10e3f6dbd866444735570db480f037ef4d +18edcefd8f6b14cdba58e3fbf75b469364d0e69c92b8ba3895207d8217c72fb2 +6238e3c231451712babcf6e08c08c637d319867554b4426341e315217fb93c65 +bac24552f95e6890b9dbe1bf7530d720e48e1df460eed718b0fadd1960eec4f2 +f72742a1b8fa8846c10f1201b22c0d79b8c77350226476d4ced87e7b67649c9e +661066879ab9dea79eed6bb0fe1300a73fb3578c0628255273ae4cd379231e9c +aef0f8b72bf778bf14731c68ee50c2a2f31e848447190c3e42b5889f1623e196 +bffc1d8dd1323067e075fe70b4c762ce5fd8aff0e4013f47c2e2ddfd06ad78f1 +63da5f4065a272d91f296e2665b219d6e88c094523116ac9440ec2f9b25ade7c +5852659ddb699fd030656733c6d232a49e75d776a235c1a56ee2f8901707a40f +5b36ac3c98fe021bd1f28dfa10327cdefa5f06b471e8967eac5172dbeff6ef9e +bfe7d129e8f99830e4a12c100d6c5bef79114757ce26d8f0d67b95d9865c7a5d +c91c7d542a2a908b2227ef0b78c7a2bd562a8d73f9c20728917082a2c8dcb321 +de1c8f89588908cfe1a5833bf444f8944088e8742635774796d8d4a0040bcd9c +64ddab4db438402813b59edfa79dfe26afdc6a87093baeabae0c10305f70cea6 +5803702798df945f6f45ed221fc9c2537151d086e2df720b8c689c4df331edc3 +2abf9d322cad08e3c2c06921f3a2c9f7a13a4f51b184cb77a4e7aef35613740b +2bff9401d1488fc671828fef4ee8ac4fdd247d6b778e5df06179b5bbb462f2a2 +e2976cb8794041897a65bc5a9e1c561dcc34c98db07947a416c302b8f20a8614 +572639459e1ea1e510a8f8432b78bc5d1e294d8f57dfc956ef227584d236d0f0 +70a2aea00d94e48110decd629db3727e5015bb0c99a794106d1145fd9fa8f407 +bf279f7b1762421b1f3a1437018efc9704121176e2185065901df20159eece5b +808b749e7847b6ae9ea268f561b90f8f47abdb6528a21a714b749377a3350761 +08e9506decc618e42dfa4ee0abe77d1f771cdde50143913f0407023e19fa0cc7 +464e53218da799ffe7a232241f3debfc6f68bcdc45a73e264b675e3af587042e +1e35b346de4c76875c656aafe366c9097edd12df958335cedf7e25a72755a888 +78fb21bde7a863797c2f0adf73d3dcd928971e1543c594cb1a3a5c364840f0b5 +780b764655fcf831285671b076f7eee0f1c6245e47917124a832ac008ef60825 +0c5220af5e833b6aae1038e9f7dc3c793c7c1aceca66b3c6b0377a4acf9e5aa9 +8fd729ae8ee375e831f507cee9975b130402b78d84a9d685625ad309d078bc2b +645c48ec8503b02569bccf978689a6ad2e2e06c1978f10bdb20d2f828237df91 +cdce385991a328c94e0b556f4cb8987de3a2698c78eb2f2fef4e047292fe9832 +dfc6252ef732568e87aca6b40f113e45852b213bf6e3d1e822b61a34344b65b9 +c68246f682588eaa0dce7c1d1e6a3d3491c34f7df5b0a55da9a33f4d59b5ee49 +beae9267a4542c4bcf7d650e0b533db67074f7a889568dc8d55da631cfe65d1c +305c2c49574e2358bbab65e298b46eecac4caf9c79c918ae18626cb6ea3ea5ab +afd51c88faf8309e2cc5ea3bf72fa7931475882da87a9249cb713bd25ddd0f66 +c98e58dc0eece6bfc1d537f887887e3bf5f52aaa42254ceb85481732f4f22ad0 +c326321139e35d2066b859faf9179d497da1bccc88614d1482cbf349474dd848 +7cfa8ae04a47cc440f9c08b7916727fb9a48325d84de181acd84db1f8450c727 +92f4d2472826883094a0bd330e79d8e79aa7f0fb363d6f6432cf6b191877315f +13b0bd9c5e0dac052685f04b7314f1578e14042e777ef6c7e49b4b1c4510d8a1 +e97ca72c77a81b757ad555437123f371534851fb922fb8ae6eb861d4cd4f14a0 +7cd933d97c711e58704ed2cc1313f4a899b401d7354709fcb8c5204a5144e100 +fd49513bc03eb616b83fcb488905bcfc751efe672ce1911cd55c48dc34e5922c +1e300e2be75c97aafb6d2c7d8b2a27dfcbb59a512e6498af827fdcb3a7a3b572 +2ffd35467d2f4e23a1bc2af72efc4ed8d0e86e983e5e822f5d7479203e7032bd +1ae7a3a7930850325a42b803552a3b00753eb9031c57185c5ee5b8a2c448555a +91cb4522b8688d2a42c15eb2e1931fd963b2e10d09cbef03e4ebf90ff61976be +720e07614b853195dee2ededf3f30c750deaeeebdaf86cdc35cf6bc8f05d7e9f +35eef1e212b9c6ed696bb4673cd837a8fe736c883f042b0dd9f14beca6a1128b +204c2b57cd58e90f046d8ce6ea694e1b71ba8baf7cf6c3346cf0dd5642676b4f +f8b45cacdb4975d45edeade19a7d1970ad567e03cd0fa17222f638b873f60c0c +085b714c18c6ec4ac1213946824452fca1d2e85febb6c071bc80cd3728cbd8b3 +8a85376914273c134b8b8327fd591c5960a0ccf823512e936452df7302d19275 +fd19ee696eac93d10b3bcfec333e1fdb77439eee7f7ba673be0edfa26c52b258 +4f6a61bd87fc89f3cf7b662fa8760e30a800aa7d85e94e57749dc6ed26927ae5 +4e1f84ede593601063711a345afc9ad2daefb924ad66c9cf7ef4d7613cffb79d +e86fc6b5e378a0eea2c69df8bd80d3b34f5e126dafbc5030bf408fd0963e0949 +a537002f59dbc2180085f46bcf7fca9356dd630328b7eef27b7577ce3c168281 +3c4df17f86a68ca27e8309ecc6e6d580df9d6073704008714381148da19acb91 +ce6fd2afa781a092b881b1e75c4525e668ac8450949eb5b4e49ff38806574657 +d45062a294972c441f8c354413102002790c9d27fcccd3f98503d6cac0f9a41c +4966a3899636a40dc223f07568ec42822a05afd80e10795b86b05529faca9c05 +f956766457dfaf48992084889d76195cf5e72e3f689a85fadede52d52fde8385 +0ded200b05377ff550e9a26ee3e976d275c25b536bf429efbbe8084c8908ced2 +7091434606e6f8f76b7407bebadb2bfeb03bbac919875c308ea1c32bd56c30a1 +f61bbd705a87d63f4709d39100257c05a0fe66cdfdd0234cfcb67fd999f88f87 +c13dabfe1e7e91db67b83a4a7f5033bcca4d9e3ad4979b1091ba749e595729ae +ad79ccbe02adef217c049c29e05508a09cc4eefcc004610acd3f45849c631697 +68253242095addad40ec80726101b6d25a4e52e746a9f956906c32f2cb316777 +bfdf3a470df987b5228620332983f68625e7e32a9ca809f61e3c25983fe95987 +a2b032cba145d2a9a31236d26e4bd86d71ea16a0fd85b393f7e3e1ff5b6e418a +25b54766aee0d8272bb2d3c85401e788cb75bd8d676acb121198afc3179dbcdc +8281c914295fc4dee61d150bd8623011b495ab2350e0047dcbdf9a9db40a87c1 +fe9464ff6e95562572c61346b1a00f37c3f0333c81753cf4c5911e5e370c70ed +bbb4626b53f9716a3b83d201957059546ed22831f5ba5ddf5eda421b3167e5c5 +8e4a5ab8437540334a3b3285c1a94a5e2c87fce09d00ef5db6ee78400f1f9c4f +4cdaf7bb85e56677c02dd2b46281c64522aeb1bb1fc83907b4fedd6678ec11ee +46dacfa31b048910cc6c9463bbcebf80ae98304ff2ee9d5c05418c667ce54354 +d66d0c61ad5c8825941523ce6800c2fd3cc05a9bab764f79369599d055085e00 +8d36906da59a1fe6d137605dd7707ad144285bcf31a6047978146b61a4dfdd01 +ed38e1888896f8b02f0bd89a57402a92107e626383323a5fb2e943316575bbfe +b707007cecb0edf4afc52419fa8ac4f6076e1dea9cce97c3f1e60b2212c239de +b4e71711ce691ad89c42074ad4c9b9917b40119dac1f9fbd5cb3e241e5aaa2cb +ba248028a4ab8389fecf0ecbbbd9d0ab8450535f2f7c85c02db8c287f24ec8ee +f67baa4a0eb50a8bbbaf0841f4a24558044a0e41b7fb390b6512aef6d7795222 +5f7bc00e6a6b3e5314fac779a9eb11b38d36facb40ec14e0d875640c90d9e856 +a5a88a273886288f14d44d0d9a8d4144827d587ee2cefed089d6979793051660 +c322890d382117f38e35e643808fd66e48b521a6eacc926b748c7070b6f3cbad +f2a3dfe4e2706dbca9439ffaebf1522e180bc2876cf7f736698fa955fe1f036d +145e3216487fb904045d5533e1b2c3be21e1a64e96bb132581bf0180b8e370ff +a32192305d1075352f404f4e8e338ef2926e71118383a9b328f8e55a5a938c73 +7b7b771d6ef4f4d62d96d5bd1c64190fc6932ac6a91c92f267c502d3c1539b48 +c6e0c511e83b687c80a8d290702c26ed02a355ec420667a8f1ab2e201b814b51 +da7700c5fcbbf06c1de4b4feea2562d1cbaf47c4015b72aa22a9b6490e775d60 +f7b5fe4e7362c765a398b0c39b047cfc5ada1d8abd3efd2894221d1676f04e24 +fd10f66a7a185403caae0a233896a2ae721c0c74798ea526db2a13a419f60883 +d4524d068379bfa6effa715d8907e4729a99acf06d7e2348ec9277c295dcbf30 +879c2a7e7aed3bf984bd8a3b73cd518f8a4f612a179ad16b5c8e6fb0c8f21692 +c764a39fbe7421d2584c7542f9f3e2e76b1a8d81f57df2276e098df6f9a2bcaa +f783708d5d966883d2bafd88416177a159c304091202f2518f31e512e24f467c +67bc619bcfd5b889b0d83229b76ccc9db033745ca4aa2b7fa65e12421c95364b +bec1082d2828ac196ed6340d9c90bb5f102678640d3481397c077ea83cdc3ee0 +927dc768113d2f4deafc9a6a982e129c5000ee2f5051829969719fbe96bb73ea +c332ac4c81c52ba840c1be9cbe9c735639bd9cde6da5f0cc484b20ab18cd8235 +fd2d8eab0cd5a9fe4c276ad9af585aa519de92be8aaec2c7ba6185d7703c02c8 +2a829b02d2cfa16188f5e3ab80aaa4526dc74bf173abafd7104c6c8351f5f362 +84a3db9c28acd707fca8a97979607f4d6dae5b23e111639271f8ea152a6d56db +dd6a6c33c962020393e13a23101899e3d2d3b1be77f23dfe1bc8bb2c56fe0f8a +4ca063369a0efc593be649feeb516b5bfc6994ab38a75beab00afa4c406c2ef9 +a7f2533b5f766bf115a05ae0dd8bd4a0436cf2abb04354d54c82e3e706587cc9 +32f95a254041b036b14d249d49d7390593231facb2c2d80848e94b7700b06527 +4b833e2a22722ff90731aa0f47166fd4fd286d5315e01cbedef249c9b740278d +2a4e183d1148433cc20cd3479d7ee981b0bde4f7f46470d9ee2b6cedc48b0d15 +81849271ebb8536f55b6712a7bed80f2550298b1f81f3aa70d39261a187d7e6f +2097660de875cea28e5583f475fa4e26950853bf6fd5e9b9cee59c1371780054 +b2238f9e6c3c9f3b4a1411fbb89fa1fbcd3052d1893332063add912ca1489077 +9b988149bb9d4da1436a18891fc7f229c2f900fb6b272d55ba55e581f8d0630d +8bb6c022d366dbe8b4238058873514e0df31d73920a720f6dca145fbef4d15c9 +411f5e0322cc61990a48f98a63f23793318c22d178734fbeacc04988901481e1 +ff62d5a8c7aec831ab49c4b5721f68f693e442cbb62d13017ded5011eaa71f41 +7707b7915b92e280d0a7fa0063d90ced947c82ffb0a01b962d2b1aecdfb1839d +d0e8335124fe352593c9938b4f4ec21a4d04bba3a46826df0972c5d8401f6871 +5c7b4906a37608dbd3f630d8f3bb64247d8e198cdf8ab8f891e00aeddbd48263 +17227225811fe52a9de08976cefdb7d5e76db46941b9576e87dd6b400c64a256 +a134755011e3d4d27cb90eded548f91e1acd8ce08b7adc929c1a02b22d65f10b +bed695d8fb1337f715c792b04d103632223040eecf2703e597fdf30a8c42d448 +82e73b2a1c0a73919df7a5cddf25b32afb51f2d24dc4dac2a747cba641fc6fe7 +ec4ecfdfe98bca936ec2819ff6016a17bdfb1c91d893ff861a67fb1ba168c5ef +59f774d859741c6606d680b68b67563b965ef7cb98e162f307504fb77ba9b3c3 +4eba8e45e161f8977fcc6fc2f4c2a677d8caef269e49c9f2f9ff6a309b2c21e5 +c810df536db392cd1b7018dca670f0d484cb7b6ee50ea1bd158af5547dd96166 +da10d10acadeaa04eb9d144a0d13d7a8f80b3e505177b3cf9893396cab022350 +bc705ba65811a2c60fc9f0e6f044206dcf524323b5cbf547d13d54ee0e87f00a +d5a4f507757cef3b458e792cdfbcc25339d8bf388ca94bfc341d76ab42cad16c +3f37cb51c85fe91e387f8c1d84a03da897a699fb80b5de32c0573014ea558d71 +a0eb713c0499438120b4702176b39a69bbf930309a555173d8558e7df642a40d +d506f2498136a5cb19bbdec74d7b436af3ae2fef171244fef9711a9ae983e452 +20f3154be125816f948bb0d93b9853ae68c77ab71a8df0d5df10e4d6b7cdff22 +c3be071f0e5dc4b82293025a27c4ff3cb5209ced6295fa9303b624737e0f3e8c +b8ef7e39762c82c89627cf2e430aa0c339eee58b684ca7fa818dd90aeda2f85e +0844963d933da431ff54348d7d9bd3159549650fa956e1395abd116aeed54518 +649290b0b1f54950529f83b0d8d9620176d7a91b803edc637642c83a761cfc82 +1b21787f83920decfb906a5260def040e62e38135944df33f2c4ad7eab631f22 +6afcf035ff68b4b709311d9d713ac6cad9e7fceec73ae0abeb5fbeafce209148 +1a0e537bd666719b41028283cb1658f4aa7f4512fc61c7631fc4eda8d678e7fd +e9db0fe0f89cf941fe65c32fc88f490226acbcbc93e5ba23dfc83ac4a289870e +5ed31f2b5cf50a93525f381bd56d01bf11299258dc387694fc0cfd877eae3247 +8d6933340343ae8d2fd1740beb0eee04c44614f9c1d45beea74fd4c2d3f49d62 +4388241c96bb392add3896e74b93f670dd8a5c415631b2834b3b8135b49caaca +007feaeca5fb75d9c4423f2f04ef576eaa87b69ff1033a70409cd5ecc93155c2 +18d154bb152491f87a8a49a77c1b6b6bd09982a55c33601547db6c8344c0ba64 +007c9487105cfd10a7bc342309d1aeba097d21d9c1da6e1ad1b1f05b2364678c +e5e496c2e2056dcac7b5c90bc5dd0b0853e30d01800f91597206dc2a1bb5f0fa +d8735dae0e61eb82138284fc4174b009d8dcb57c96b2897dce69785a571549d6 +67f539640bb0092d7d130ce57428b10a985a48576d7f6ea6c4207a53bb62c485 +5275cc7334b6fcb89bb496f3889377c1b0b5719254c3b9b19d041fad4a399e67 +1ba4b04b4a62b1879dd7b04f3b93fe31a3c544eaf70855d695eb3112a05b0537 +4c2196780e52fb906deab5add98ad9a075a1dc44a5e6b5ba6ca0f8d2a634491d +eaca8a763311e9544556b65082f93074e5e4457956783c11dd6b1be5749fe952 +d2f642e8bf267e5426a0ec324af7d2e990254de48c505b1fb742652ac86f38bc +cc59509737401620910489d3a4aae6e84f7b7001bcd617b0f09b5002ad00122f +b1dc4c7db88585c31e637095d3d0dc7fac2337eb79f02fa62d13af0d4b76d43e +69179bca2b3685d635c6f2e1e26bf1a9a609853d1510fa03f78f0b7fb384586f +3e9c1ee38da709fd02ea0ff4d5ce512f8352aa15b232cb91411d1e95965f485d +7ab5421d700af653b90839773fab6d37538ae3d61d9cdef3bd4ff94ec113e9da +9a65f75abcdfac298717436af9c1a1667e7fe80339e1383bd3d45b94f76dd91e +f1ba70a8bc50b51d6b51766722802205c0fc5e8ea0514fdfa5d5b18482694e65 +6ff5d21dc785b278f11b386e5812d42f0b4505f896d7f22b4ba42f4cff11dbe5 +07a53031462b3e29263851e0c91ceaa0573b49a2a6cbcc3c3c1a9c59c556dc2b +12d1a9f6bcc751151ce62c3f30a0ef50eae7a56ab9eb35f93975fd3ad2e21459 +52d709f052197a64afbee9fa03ea2bb9201506c0b6441c9ef7250d73444e01d8 +7ee3dd07ca8cdd5549f62d1726c8d69833e0c9d2ff5af11b1fee0596853fb75b +1387bfe18c4c747f83619a6096371fc6f444877ffaaff4a8f412847409be666d +6f96f3a2a6bdfd20f0bd08afdd3506facd35e4b62c58b4a4645e732a9b1acd6a +cc71f018c9e0622a1705ca635f96c7315f9d876afb459641315bf4ca0c4f7930 +1c0e30a8eeb441218c91d12647d5bdfe2512f2321bc51968c257fd339a24b1b4 +203ba90691564a9c83aae4ff68664d03b1a95da707bfb90033444ecf3deb43e6 +412fdea0ae772206a398de11c52b652ac04499968e2cdd4345fee97a40b86567 +2ed4711234d27ccae5f151d1825af76e8624c0ebe4a5bec34b6998040c3b8292 +76200fc70a6bff7a15cebb81e8b52221a45196fda4087bb32d5a260d077677b6 +6e070d33ad1868a51f7201924825b04335bc192bfefb74e496dab3d54ac4553c +f959ec0dbfdee94289a4a2c166909c26c130ac3ad182057644c8c2dca84a3044 +4e86e891fe1b07729531642e7374c9a272cec66bc04a36db2d0b74a622028adc +d6702773d0c9b6750c28a08902fcdc9f8a290c80c0360ba8019799d33fa42361 +c66575ac108946c97f3aa027ff95d2a6753f9dcf5949df046cbaea6333f19716 +9c0593db17459534deda9863a74b496a837c1d667df9afdaf54320664d0319bb +3bd41ef9a54b4594e6be5dc416c275a73a26af17e493f77ca7ffbeb2f7abb317 +035c249b4b5a33757bf9601b4def56a6207ebfce6e073fc9427f95e4cc3799e5 +5eee6d0422a26449f713a74f0c114d3ea2e9b2e183dd857cf21bb3a53480b0a6 +9c7d8fde6da71863f2b21eb407345e4d72c5667137f83610cd2c391218478c14 +1f1f34be21dd6fdd444ab1c4b0a59439617cd0d04ed9fc568b0c70ab8222f17e +e10c0934f9b567dbb26ee612929ef36036727e4b787015c76e78bef4aee02049 +4896893ffa23af70b4c6363f7b20db155f496ed5a8609be1e5173ce968cdff5b +2fc5a3bc23894ec6f26b71a2ac555a5cac33aa9f71c184b8f9569d286978c586 +0c4d0be59e267ad86edac17b787cbb93dafab3ab4406d83af0fdc7a29b0a0b8b +478d2717fbbc87b305b3f3020c69c358232b5b052d4376db297eef247ed2dd25 +6437c1139017556f879427b786a15bda065a1c70c6dc959f8e0cf727bd50924a +b82a8c56c225fb35f49c6937495f2b6c7a80d6ecd28b0088b52558cb45b238a7 +dd65fc5f16ea69febdb60167d4de4785b1ed69c9f40495cf1aca058ae2795fee +4812b5ae9a88ec6f37f8fc2a964e0170025fc558a7d5e093a498b018390064da +45f6d3c9abcc3af22fb37946cc10ae42bd651e213d7e26570b1eed493c374260 +6e3861f1fa365824d012b5ba6b6bde3d198e0fe078c7c17b045109f6fa5700f4 +86e7fa8b9c1a5aa9a14955877f9c7ce8997cf709ce97211dae33e406979e83e6 +6ed2386c06b400c36404ac371ec3bf27dea61b15d3db5a2eaf68b5e5366112d6 +a18aeb880bf2df3f4c151cb23ed00afd1f41edb073022ea746336ccc2eeff94b +0c896643f9d44d67ca2600eaba8db2a75a18edfdbeef3e55aae36d93c115835a +a41cdcb41d00721efa83cf094a623c356cd01f9f3e61b52336e039f3ecccbcbb +c3db862117281a50bdecc0057520b748a4beabb24b8a5f2d915eae78b359c012 +43b351570dae60fe822219d20aa73d0d2eebfd64a13fb0f05512f1c25eb8cfdb +1f85aefe9cdbc6d213db2396580aee22e7f39ce8fcdd343c9a65f86263613ef5 +c8b1d3d2ce31961170db7f3a930aacc827643fddfebbf77d5a402be5d1000db4 +c80c05b38cb971bb260fb31f8a42750519ff7ca45076a75d3490b51cbcf8b47e +9c43f349db24dedd1c41e013de99f4a02d7afbe73517241dd78d1bb77fb815e0 +23ec47e41c4f1f8cc34b6fa12cfb9837e7428a0eaa9769e786818556955407ba +5079607225977b9d1329e9837fa6ade7df59a7a5c3c6a9de0791655b3a9c88a4 +b9d643f79acbc20eb60019d7afc63f30c5430f0dfdb0750a899347eb1d9cf604 +7bdb596275613295aea793d76f6c1c012385a29721cca1d4a49c666cd91e578b +4cb177c7f24bb53b2a096e7abfd475d8fdbd0bad06ac17be32807dbef46afef6 +743bfe9c65d9f41691f698027dade394fb03a862d3c8aadd957f2e3d22af692e +fa918ace6fce92a690b5481d88638747ebefaa504873781d51bbe392c8de01b5 +ae4efd418cddfb846ae695ca0c4f4bb18da6b54ac6deaf533c552d8dc157a233 +6382159f28a121c9f2f486f9ad00d487fdcee4459470a5f8e3d3ee056b7cf51c +860ee6e54886aeac337f26d1ffc297b6903ef5756f964318d3aeaf9bab264111 +ef2ad05e4666ca98a320e0c30bdecb5d0bb00447c26e72a74cb5067c4734854e +f85a9efea96a40705a62b9fe6ce93fdc47df59fde42c957fc276c86696a70d3f +3503a4ce8c480c2f8abb6b86d4c0b689db26d606dbbfb1ba22960631d355bd6d +f77ba316866036141960bea735580e6b306b30232485f662b05284775da99aac +580a53dc696dcc027a4b008c7f55c8224e7c59eb86227bd3ab0f45f4080f2728 +3721ce2c92b117ef4ec8540bf86ab9aac4d142c87c483764691656f7b95d4c49 +69eb8403eb6e52effc8ce15cb9826fa477dabe136c2915d5f9e03b80e83b7158 +013b8ef2817b1020dacd0b8f8c80e00450cdb8e1d794cbf23596d25116a6eb71 +6186870e761f3b024ef87136d248af0077422381ddc0d997c10677e5c51c87c5 +873b5354c2f429661b9adb4b9c7ca76ccc878daa248857ea3746db53b3a5cb7e +9b239744383e4652d32b75b75a4d678a4adbabe8e640f4e0a80fab602e09c81b +4c563db440fc714dcd23d3a7e4aafa655d569b7f6e4a3e02233027d740b6950f +349d0caf99ad47e7b40f3f9b88e1e6b32dce22027029ef7a470678ccb8651509 +bd9278055958c6c8802ace0c1655fe5e52a9840513b7925150d092a1f7ced5cc +9938244b0bd766dec4954ac6cdd1db1304ae781383d253f65bd24ed05875eb50 +ad99d1bce15be48a6a363ce8f7d1d89b37ca7bc55dd84fb7a925ddacb6134a13 +13ec21412cf11b1182c1e88be892863fb487c57918a111d4857d3a4740603097 +8456c2ad7efd34d949111de4a616362f218528474dacc220f86814f2543f5038 +5f80cb9d39fbc70ae1f66855dcc1ef7982b3488f719683aa5296e955d72a3ed5 +6259fc3f9bc41b0e42514740d750a7c2987ac132eef1f7546a7ee8b073dcb7cb +3077493e4cc2d0b8313968730bd2b0ab3d94258a840e25a52b96025704462c9f +93c3cd3c2f3c66fc7e954dbcd5ffcffa622c797544121f91db0cb7793112dc48 +6996c71221bd8318a1439007735826533bdcf1fac581e5b3b8dd3356e4a578c8 +7d73026ef076fcec3124917ccafe0bf56f934dd8b57e2dbda712020b1c4a7b79 +19d9d7bcb7d5f850104e668f597d1c6945aba72f2ac3fdd00fcfd4f3aa871eda +fa706e53c1fa0d376d1985655cf33ed3dc1791517e9414860e0ea2505d280db0 +864b7b02b80f72f10b5e92a7b79c71c656a14ce57f096ee937fbc8ccae999900 +bf31a9eecf2689584976cc5d9d20f84c3796a4c9c200775c03da8fd51644f372 +0ef4a6354fda3c562a001a95217b009a6b6f1adf1eda0ba99a5ae28faf22594f +d80d09ea4bc02bd5d63f4e0116ad29ceba0b961f2d0530ddaafe3d3b3df8ffab +804c7b7855117d0c0cd591b0828539c954e7b6c05bee6e8002f9453caec5cd25 +ab4397c807b2af43c2b2a883d87fddaf6051f8b2bd6d8c9beb43ea821e48de0d +83ce6e93ac6959d8c7e4088b12240ecfd6a02e0a8a452161f878f024dc8a0786 +35ec88e6a33dc633147b9a2a1ef575e86048b9471713e0c8cc202d56c7ba584b +9edcbfd980a069a994084180291a695144ca4e0ad3ca947180f6fbe8a709a3e5 +401e96b74f2009344d43723b1215d2a145d0e1e91985375efd8e340f01f825a5 +a0d457eb5c5b7da3551bd7edafedc14c3b6b9bfe7eabcb38bcec9f1f94439145 +a32ffc10032228b5d1154d2e22d2efed471a0651c3b9fb04c1910052d08649c6 +3d5b987ef316a90b2c1bdbcca3cbb12f1f426bdeedc8107c9f2538bb506c7524 +983e3147012dd9dbc0dafc96c65478bcf8eed378fee8a20dc9dcb0f229088a1a +67336bbbb67e68efa61fc6a5750c7b29b868eb5c050c493b97ad7dfaef8f75c2 +8a8092c5be3c1fe73d519c1625670c78c373765b2803b932dab26c54664699ae +d14e20aeed56b0a70516517a62473369e6541d759522598a0be737cfc0f4b74b +17d63a72fa6798b867a1cb133cbe5ea48401fd4646773d5c377628a2560dd870 +283ecba942f65f660a909811a5332596b84ac3e6b583a24c7c5ce30ed978ebd6 +e0ea5b8f534d586b97b3d8f3d9511cf39b0ac45a21cb831c81e8b78b7824b0d9 +211b916b64a0efd2fb710b6777a93874dd625311bbb74a04c734bc3c8298b660 +9cf371f8a04b6e13bb4c5cf308a042e4346959cc5e7209f5d7e2ac25911f4f2b +b14eb97582f80998b77714e872260ca785293e0f67aba0a232d677515c3e5611 +3bf6cc8c1b0d13219db4ec3d600392cfba7c3c7602d29ee0583baa53c1601433 +76d3f84601e562b73e389ec97a1863bd0063c5b2edbb5dbf35208a9a19291f25 +3913cc05c4ea5fe74c591893b53bd8bebbed59f13bbeada69cb75d3b8fa31afe +3172b85cc8863f52b594621f80eb005e0d038adb6802e1ad80492867eaf8ea04 +6b391ac713a3fc24c0e036066c8c1143491e8854a4e8d3a6eac1c063bf1cc60c +3333732f67b43bf55b43631eb2931a9519af5b44127b432871b99b3621236172 +d0ec4edcc0be44702893c0e749d7ffd81ae042be89442ed0d0f45fdfd2a34cff +d26e692dac3f81ccfb7a7676444b48a5ee7df7b37da76b1c7c50654cf9df7f47 +da61082b64748c038e8b6fb6dcc2d82446064d826fc2406c3398b5d24fc41ef1 +ea4b833f9c9818a78864daafff9bfeac577964ea167734f4a4e4fd85516a68dc +bc0a64b1d406651c9ec70e97bc15f4d0fc43e96bd31174dd4d0d228897a01bad +1530f486e86bde3b7fe8203fe79f3904cc70f3fe5b70a52cdc3ac40812974ee4 +3ee335e05a5aad251c22b83bb027f8fd6a695a85eed610205c395f7ebba3a6cf +27dec1048355636242f23e74b70640c1affa52309879376c911b07074bf35f5d +d74e2a963209ef85f1902784898da3d4f43af02744afe6679890b7ac96f3176f +e1cebe8d534617401e5342ecc07e115fa5cd1d77998d30c28da15b763f1e9412 +d314c535a574d0584a257487052c4f088066ed99e434bc8cc0f975436473f9c4 +17588ecc0c37bf0901211aeb658dd4d1b30a8155ec7ce8940f059935cf6ddb00 +e47d4da7428dce12920cdd864ed00fed8a18c39d32556a2a1befece0443beb0f +690fc9552f851aba3862083d820da90009c546c0f8d974644c3f2033a81bc38e +9432837e0469329715ad7c6d910a8506a4135fb4fd6951dedc46231de609f65d +c86d66af10eeff7a899f92ef897410d56ab4193039c558325c7240ffe9172847 +42076b218220db2011c9dc6938f41d08634c9e07a81e91753f595a2fbb72752e +0e2eb941101c30a26cb976cdd181a4d8fb0187092773e56b47acb7d6bc7c878a +00bf69eafe8c2fd1665c3fe1b6358e3b6fc761bb19d8fdb16b77272f28c0ddcf +db4c7afd48f12daf1ccee639e8cce5234f7e60905f7ef178b39cd17a5f5819af +bd6523b008e1e3fcb7ebf0a85e328b9845788b9743ba205ff3809cdff74c8f83 +ac937ab9b041f32e9ce0209b62d8021c5d05809fe51d277a31f531f8e62d2e0d +143125b599d06c714b6220981f5e8b20e64bfc4be032393b308cd99d1cda5433 +aee558820c95db7f5ed52e60baf77cd27a60db1d6ff7c907280b024e3c1d6726 +3f3eba29035bb5d70090c199ec5682ef5fd7ce0563c453eca594ab0349fa32a9 +707df207e19461c79c33b3e6ff2dc5700cba1b297d9d215dbc3647f7920b82b3 +1e7d22319352e83376b373197e03c4c42137754961ec274a241c492daafb078d +8f0b2c1127e57f13de96d2bc9be9b5120e063757fe6b05d4e5bd7566b22d79cb +78c01deeacd07d86e961d0cb9db376d61d1beada56b1a629a93f83405c7c10c1 +eca67a71aa87d7c0d28e295a01fddf038bad9b0de720718eae09d7edbf128a7d +da8d786ee0b16d4d21b3564133476ff42ae7d8a5347749ec2a2a4642e87e7b64 +e6166032aacb00247f1ed8f552c94f3506f9939418ea62ff14d3ff98158eee04 +24bd5e3fa77c2562cd5bc6c7f0ffa1838653713e87b1da2e1a4d202f04e60dd2 +66d6d48653caea42cfc43d05894d1173cee0ff773fcf9803c2e5c150385f0c8d +b67532b4012fd89c5558b045c3026017fa4cb17cece11712ab0d617631b1a509 +6677062be9a1289736fb1abfd9630274e40393cc9988d2589f22612bcba6b339 +c961e5a4e1fbf411a7e719959a322dbb622c8a9cf51d6f405ebebac19e6051ca +5b750d7506ec8a03cdcc8e62c6d7af9f6a32b0b585f66b26ca61e290e39e341f +0b2d3784d104f82872ba0e1ed967a064f708aacfe052002972006fe14cd4963e +1b34ef38b99be8a7a83ede48c85d5c71d69e0e4ae72d7b6b1a46bd26cc636dae +815786e9e0eee89493bfebb89037f3bac832781c8b1630e31542ef7cd6a483c9 +004ab161038ac6aeb38b48b8293ad11bf441db1fef2a168b77d69c4a79f921d7 +ab9f1cba257605d81928fc46c43a4f93d39b01b07ffd0006d38366393cc64b18 +d8b18fa2899b9178c40f008044fa0d1a41e879573171478c147cf71731075421 +650fbb856eca3b36a741e2077245845e074dbdd2fcfbbc4581a2766f1830fcf3 +3255695d54307eac8196cbb693d536795388233829cb670ea78b793c4c9aeb73 +f7e7de4860712a5fbc17ce5ad07ca98d70eb3c94a79383338199a56951a45a76 +6fee0d58788e22740f2568e515aa495edc80da6a84a2797c198cc1f3d6fbb2eb +893f79f9f54ac81b39b6dac070a763cc81959bab607569423d423fc8fe5f98e1 +4bcf769ea77c0d11e5dbe2fb539ce15e09b68349a925949afcbe381192be5146 +d28382fed48e03ee3221bec2aa8c7270f43c948320a3cd0b831e529aa585a7c8 +66f2edbc5b569d4d95e3ec52c8a7d35381cafac5c301508672352d9b0f582a73 +9564b6cca37b517019c7633561f33198dd54a886408080671e1e77c0d2e5023f +489305ca314ef082008d37da60896f6c4094451ccc52f7ac0d72286febd7c852 +5ed8f36974b846d64bdad643db37d8ea837387e100432131b11d5c42e5ec117a +d17b2bcceb463d68ae7aad5b877b076f34609146884f216716186f4cdf7134c0 +f72d36ef9696d2b53ec3a3149a5b17f45bad371cbd72f2699cd52636151546e3 +d22c085349f42ba0c21d90524a94b37168ff489efe6de3ce97679298b18eca37 +bee071ba1f93d7d2fb811987973864dfad11bb5c645ce0a435f1db7bf20671b3 +caaa89df0478215fb76ea26f00682f4656e63c358f3b0bc84c64c17c3471dee3 +c97400d051617c205d5815ba63ff38bf46f06a8fbac182a4ca27038b0c8ee103 +6a9a449cc5a9ac774dcb04bc9f48503a3f4a085114e2f190e57859724a8f1e36 +cf97cfcc15d196ef82aa6d2964dbd886c39c4e72e15d869df1dbce4169171f27 +68cac43be9c95e344bcf7f0af27b45d386ab6248608416be5f432d582338d3fa +c77b80e9874d5b65658698e21bd2d4ba153f97d21223e488d4c5c2c8a7520e95 +f6ff8b1a19d4cc920de4621166a4eaea5774219ab3efd4dc9202c5225d4e6505 +91c475337f68a2d870375bb8def9f4319aaec852b76049401c121568f16b9be4 +ed27ff64c810b325bca29b5642438e259135f361419e8b5b23f6aab03ac0b22a +348478b32e93fc448502b81b0626489f4a358702e7067b1bbde9448c4af59d24 +a72c83e0042ac510c6a91e5a9ae0a69d2be865505238e396006527756734e924 +4e883e05abfe0dc62f9bfd0e8025172704111627916379044c3cfe0bd1d7e2c1 +05adfc871ff2db60351210af676444b37ce21aa14f1879ae06efe7b4338eb55f +0aa768ac12df6bd8b87feac0f48fdd26f6d2de4ad88e898499608cb770f754d5 +3571822bdb5de28107b378f4b1bc67c0106a24e9d1785336bc80d1da9636a5f6 +d25dc355a88023f7189533e4a2416755821a03a069681f4b0554ab826d2819f2 +a4cc0726412e1d2a0001a3ca49709dc21e7032eccab2f58d80a8163cc8129684 +b4277d3ad896600f610b1883cc973f8a975e328cf4b069b44e4d5207ce889bcc +49684bb2f1eebd711c8adfd4607abced0fba91b6958bcd5874b01e8370c7264b +9cfe66d1298374288f3d3f399700fda41a7b193411d1873d321e846b089a2e51 +0426782a79990da94d6182c912fe9752a93d6de0d37eee602f0907b8cd2f46dc +ed1179536bf9a3b74c0fbfe8974173a2c630c7360bd90f9c697b1d5068478814 +7806f05c70da8a11ef065cea507de043415f855f595aebd10ad001a0b68cd5a2 +ea7858041a9f40f05485b0385bdf08007f4213ab76c70b463e7427b79f826ea7 +ebf94bc420f700a50a2bbf291c867d5b181b8738738bbb76d93503e7c603a7f8 +354772c516443fbd33382b7913840785e5ae794fe571eb3fc65070eac273f00f +d12bc28451ff8be0dde26dc63bedb66acc6570fb166a583d796fe9493793baf9 +6a13bce0e7952fee6c6700a9180f5ba2d0cfb2963e0cc8606d48b9be7bc99c9b +efb1a2dea357ba87d790c52f7a90a2db476bdfb93f48910ae8cb5e91d1d146fc +04736b13a017ee2216f286ed57965d2017adea323978d3fdaecf864b51fc9aff +cc24902e266b084d518f1f063a2d0bc625ad9b108e322019d1ffe9a26aea6423 +69edd0537d1097bbd66dad8d859e7f02bfb3a77762907f989cb8579a352a0719 +969abd926a2caaeb9db6852b1494277fcfef88795af85f0750856b9a764f94a6 +5a120b04e33aab0d36907b89bee7586021221b27ca23559ae68a208fca16703a +2fd2f1d8ceff5274e64c441befc0ef7901e5ec1be2faabb271b3801c485713bb +8846c95c6ac596046cb941fe5a5ef828ead0808f0dbe808e96b5c48253cdc9ec +a0f946a3877a9a0d61c0ad150f50b186f841125a311d606cde70d36f7c03ae8d +027f88c6b92fa0f2d2b69f15a1563d5c76a3db13f43eeff40c9da317e8e0c93f +ead28d0fefb5a253a9e998ae1cff676dfd88f6d005b148948b7407cb24285302 +35313ae2eb809b59813c15ddc621a69cb03e022a71dc1212627141a77c2441c4 +39202c7f4b0937828648544b05288337535cd3d4d2b80a0b3241169c8898e4a5 +db36b8230e8e56e3d0cdb214df9ab611003063037bace671454a70c801aba2af +35048afeb620dc4fea9975bba58857ce16d2439633989d9306914bb002b376cf +00be076bead119370763b131621c4daccf9ee58226a014d05c428c70e28bfc1c +e9fbe10d94828d9510c22a7155bd28d6abdfb16e486322236b678978bc49eb1e +8572abc47de533c8cb98d80b4a529b7d05fff2302fa2b099efbe64f56186f14d +56771ff9802f23c1302732931a28bbccf8016aa68241da46b03c352237bf0182 +90f3afae514d05552932233857697a0aa8fe291d8ccfb8d85c5790157afce28c +a0d50875e4107cdc0179afe2290120c6ef96ee34bebfccfdc2d47de8cc301c14 +959a4f14717e9bd54454f382394d0c9d653357c683d65857be45c662e8468bb4 +8f916c8baf08d028e339e64803d910196d19335a65f83230a9e6c2be9baeb01f +9776b81d665f0bddd9a1a0ca31a0fb126b1aed8ffcc297786bd29cca18794fb7 +04231664a4cbedb3b41ec2d9066e6ca9d1b694a8d7be8973e9ccb799f79ed2fb +e63e114daf8c937e361d4b7e0fc4caac2b87f0c9406820e9448ea9ff98d053ce +9d5a7db9118707bfdda8f701bf6bae1021ca34b924185aab0526b046ea4fa65c +d4412f43cfcda0628f0f5790976cd501621f5ba7937e6c04dd6700f9b35f3a52 +62640ee4be7db358b971c2aa5df1dd7d090195fb4fe96c8908d24529228e7f7f +bfbe6138f00143a76b3c09e29f8eda3d5c630aed311c3fc3c9c57b48bd070b18 +b44aa15009176d0ce7ec488c945c51b26950d522bf80226251fde456d1c8399d +7fb77759130de5e1620a47f6e8eabbc2ad48129f32e97974657c8aa6cb2e7ee0 +959ff4d70bb8b307d2b6fabbc887c04a6e95a986ce189927fc97d8ca7db8febe +e699d3d193545b1937082373e930af3db6ec7e4eb8c8e1d6e5615b93177b9a2b +ce0d7616642da91de69b7ddb922a4f47eda748a71eb4662d7476ac5b15184acc +7bd92e2542f853d72f1259020f66b782f83727224470405099fdd181dd4210f9 +6e8e28b257b8444fc35053a7da19361b01bbc3bfe0f8600e582620d1afbc3803 +56359cf6e9f1964635e0e734d7bb9a1e4c7d704426b8d2a0700411c226e13818 +f739cfc023921809d6b1c8639eae19f014a519d6b71133c3e12451d21aa36cae +16f002286b5aee0bc46d5dc92ae3779d957212fb276d86cd0c6cec26c2bc2dfd +cc2c9fac9ebd5b4c7324352806a0d9894a1e809d8c9c2b1a4b56780cdcb7a548 +fbc3faa955088fa50746598b134f64f4d88e8599cc48a5d5f86f05f898f5c270 +18d50d256d761964c12aaab06befc98a84307547b80839f8fb1b7e6553d7e522 +c641db4ebd8faba0f24af058c6de88f1ddf478641c513423513002bfcba37ff8 +2336a6ab4ce3d926ca060a4084f3beb0073bce8b91271a3b2614bc0aa19013ec +694afdeca7eead2a6527acd348d00458649ac2e475e8349d186ffaa64f2f058f +a8c94e7202a8141f64ca347dfc8a7ce7ce3c9402072e188c77290563b766223f +deebc865fd7ffd4507e74a972bdc5ba05f1595c4603627e07871268392522a65 +93d3035b5f05e8cac3d90e3b6a8c8563baa8f13d4d8a878445d230f71c257ca4 +90d72b7697719b66b62055fb8581037905a422baa45aaf39efd0c40fbcc7109f +dc2eb4bd0f4ac59bedd12f12deb947f2008088321be00902d555e22391a9921d +eda8691ddaecb8be07ce75f459c1a5e9ce7c57386e8629bcfbbccc796d3b0551 +e207f6e0fa063e926f6c663d576b8d6069c022a51f9f9c21147c7afbaae7f697 +762db69c73cfc80afa498024870e3b7af96203caddb5520bc20db4b7da0f3624 +4b20a8110e753d6129c9dbba86fb5581dd9be7a021fb027f5f0ddb40bb111af0 +a019900edecabaf3d5cdf84981fe2a659cf9f95a7f1d5146a566cff83ec3523e +919d4a6ae54ac444e1e7f0a56746850186d8461721656b54bb784960b5251702 +33d92e8c89680f0c71ecdcba4b15152f2c933908449052c4b4ce617fea02a74b +b715828d499d2208d85ef7e45c08858bb344144802c885d102364e217253a739 +2f6442170b29f8e70b4b24bfa97c434038364a0c52084c204a09ea5d48873d0c +dbdc712312c582f9a8cb516a5aad8e30b591566389be57d444ee22bf80a06f76 +8530bb9cff7cba7b8374f091fa17ff0c1755d6917b073a2e167a82e381793592 +cfebf89561f0fdb63044f7636424bd0e406d622f957c740e6f0d3884702badd1 +2cfbb07a20558193c10e5cf372010a7955adf5d7e16e66c732ba52e3983026f0 +002b39b62b628dbbd44d467904e8726e79d79987812f07ef14465cbedaa19476 +5692fa39d503daf1f3f0a3ae881cfbf7c6a0e4ec54d7d0572d810f8861dcac41 +e4efe176c5219721911c8ad2b3985328d49e4cc4380892a6f108c62d711a8d9a +c44c46936b90e4d1e6fc9cb7d01a6812d11a5bb0eabf497d0d3b1eb09c2cbe15 +823ed1791d2199481c08c1f284bf72d428650319b881fcf79934c5ee86885b40 +cc6240cb1f8d80b0c8f221d8ca58c228d6da93de005b11c15fecd9450293e3cd +5005cf191803a161dca15fc2d187f22ecee8335d58f21f69d15fbbe3c1aa3d59 +5a142f8c3dcb7fa934830423f072b0d7d5613c148a28806085bb7c18a8c53c6e +43821aa5cff8497822b48cb09ab2eca0fff054299726499124f7b25973cb9c80 +936aece707b66985d7bc56f2980444cf3b1ce6a462a5b78ec05a036ba12e479b +cfad5953786ced3f29d5f6e5b33ed9d46901de314e87b831c376a21ff4c8385d +175aa0568b1ebc5f890a213483cd218194e15bdc61d51feac0401432859b5dcd +253395df487a1ffaa708a64ce045ebf6c6dbb4c9acc91db63a3bc1680a697538 +f342ae8b6e022b1a4d77293f596365503d5aa34712345d613e92a3b214cccec2 +a40d0e3a80e85caea6fa0145a6489e65a252ce407fb0a3e1f6ce12d4ff4737ab +514065a7a791f8d33df8d52849ff5d97bfc8dba6568fb51667cd3f0179ec89c1 +0d656aa50b2ff5305168af18f77a28ac8573d8cbd277f8bc08482cc0f23bbfc3 +c62c400c5f064143fc73b04fe2ea7d48f823dd9631968048820d81e97f2d6046 +992d89770073b795682fe2fa6a9356ef89cddbd94e66c7a61bc6d3a3fc629643 +2d576a90d30cd1fbcf3d511e03374ca758a245fb43ef5dd1dba49072a627e35c +10f831569b3b1d57f8857aa5c7eb7c0a9767bdc44d734d3f0794716b23f64831 +0af49c83e5aeb12dedf627af214c7c48f325f1102545981025d38fa0bb579388 +cc5c94144f5643dcb8986714082941d358d35d2c8d8b3e5f731a9c7940e81a03 +e3407b740234a2e20f1a7ce7f32b57d5f25b1788bc242f732540f0344950a6bb +6bd5bfe7d1d62b1596c7ac5796ad727a47864aa730e4fe4b0b36154badca57a8 +3651d37f4344a6520c67b41b3ef31444399933ef13f053627d361d7b3e5bd1d4 +b94fee21034ca389bb4a6cd73c26021b23784bfa0bb621a17a13217d3cda2b68 +284f41b869b70ee24a3acf909a67686eb95805c8e7ef912d0dbd5c3eafd377f6 +7f94b76bd18f35684f9c4fefaef7829534900b301a0eb3557a73fac07a977f81 +b55ac50a1386c7d6a4019a8c3bec9bac1d1d54e68e53e15bc58348207fa58bd9 +89a20e2f3396354723aa3c823a957a133286080fbc124a11a42f416207ae673c +0773c54007f9420f92c6bce228f5c93248e4bf7bcb85bb79fc6694ed1bb7e43e +219b996905f6501948d0575358667e52445ee9665035904804d45cf926d91828 +8f1398b668941950ac0bb6fe53bcfc9fda2945245aedcbd07cf07f85a7981b4c +e9e84139a46ddac48b8421fe99aeb64ea97f954b758175433e584d60cffacafc +915b856e26dd41e000c1162f76d185f469d3271887505811e12e1558d1ecc456 +2de5bf7aa4c26cab047001afae3c5d3ec9cee9dd0b5edebeacc765924ba00624 +ec49223ca7be92cac4583509aff3016bcc446e14b5dd7d9a39007b5d222f70b0 +a977e0192e6080160412b520a8e72f7bc93737e344f1c99acb3630aeac72d60d +344d5ca010e962de47cda71d704587d266d0e584e17917cf528623677da03619 +813bcbd6d360d945068e74f8eedb6aebf69c6e2d2158b050dc402d55fddf451a +d0c1a407154b04a5904b6987662af27231cf49118603a4e5de4d0b5ab40c7ccc +71847ea1f330b2a54ce9cf1abdd13208a6494d36c3fad5cbedf46d423bb07e72 +8188f9bf937e0db8d8566efd8e056acdc3f5689c8e19a27be166a0edb07bba64 +3ea6b53c4632ae33e0616222a54391b8cca32d7889f95f0039152b8dcce8ffaf +c0ccd4310fc6dca19b0bb994ee62e8085f3989737619c8c516f7a6a25f9e9887 +fd60a30ccea017e50ebd5a2c32c553d0188cfa26796ab530acbb3eb090f88401 +12f6a52f0ca684d55ca2d414a36228d88a20b2eec02d182392f0924987cf72ac +92897708af33bdcdb18c7437d103fe4a96dceef7788284878b4876333de5af76 +4617fcdd491c5c8095d19cd920dd3ad8b5b71a375f49520bbb6355eac3a188d4 +fbdcd55619ec3b6305f50d818f6ee5b5ae92dfe5a7f4f209e9f3ccbedcdeb78a +e0d055c3729429e9ed3787b52545d480b5380e839374983b6224dfc56bc8bed1 +47c1a8e7dfcb285aa1db7716164cb63bdab011797c1a9bc76e73ab86958f325a +7b7e15e987e90622824f2a12a220893f47737fe5b5496696e7772e50a8cada3b +8c826724115a236c082389390fbd27b6c3bb10684cc720dcd875595b39a47196 +058b06758e80443175359c3402e4e84ab850e42415516a19f6d10ba52369884b +e3fa91eb9a38d3aa07b0aa9294b7301faca79b4a601e92428026c70a7c6300d3 +ec7256768b257ffebb593eb497cde45d9acb4b44cfdc6452ac1f9f612af2c5c0 +be0952971025e5919fe3836a145be9e264a8c7c36c658f2ccd1acc9bb96a87f3 +a84acaad0a05f932907451ef8d050bef2f693726396152031b1f796103ee26c7 +0551f75a9334d8fcad954997d05e932c9f1f3a96e74c44e04fd18714a03d486f +1cf8ba0688599fc8e6524e4d9beb6816a4e2030d8ea06a3fc50183abad196668 +f15bfa80281fdcca6436b04ca4312e7feee8ce08ccbf90b1638b9fb57db07975 +5115f9fbc599449bb101a7709fdfba691318060f52ba610b818a849d50d2b11f +bb0d8b5f859ec9ed3ece36411d3d58d58f14827b14cd5c2a0ec4dce72a73c452 +0e1dab33aa33ca4cd3dfdb103c5579bdf0506853a7d08821ce69d4614d1a7c67 +9e9e9294526b50cc284adf3eb0cac4f6df491756f1216105e5c25d898c70edac +dfe0ade3d98daa6c07f6b2f04d3cb19d108d63b432ba6db41e68121250e5ebea +3d85b413afc8d87b934d14a663a62b4b18841b78f5965eb483631b4232cdf87f +c3159b354b6f70c2b595f46f43fca2a19667b0f91f5ec7a31972b10462a6e83d +5affa53f7c8e4b30436f7da31b6c41b831b30f9d98034708f1c5c3e34c451bc3 +9aaff97ae2c477748c7f96afdca8655c9dbd84f30bc1b568c3f9b6f495f17e18 +8ce2286696cce2367abcdb42e4000dbae8bed2d6d187b7e9fd616a17df7bb16d +ddad03b29d51489c5092e032b6ec2f365774810771e2b03ce94f5b97cec5a896 +086909f0dd481c8028a720977fc8fbf5aa62f6cfd91a798210fdf28b3df8f4f3 +937e7306048dda7c69aa5f4912e7c6192e72b1e9700a3fe380b3c9b63fb3153d +48787b1da476fd22e986874e123e30e532167bb3f17323094fc84143ccb8d7c8 +b5ef54126bd9d5e3eac00459b3636803a6dd2b3673ee865b1fc2828ae38b74fd +8c0e3fdac44f7c5111d6ba2661dbc47a0d13e751b10de1e1346633efa2607a7a +d1db1a062202c4facd05e829e37661014675f2df3775d88fe44e7ddbb3aea3ec +27d7b4bf413d54ddbe1957cff63a267bcb8ef99c27280879f5aed3b55c288e31 +2d3bf0c631894b30e0c3c8179f277cc63a395d98b66f99a87351550545dfa98c +ae027ee68d26c098d586537a2b3f0ae3de112aad1ea133adb4bbf5fec1f1472a +b941aa2db1318cf1dabfa8ee0a184398f9dbb7e6d29229830fe091b487f04d8f +f7d1daee5253cb84fbe492a4d1e117bbd9107f9ec521d924f115441f3abe6644 +6a1d4ced84caffd29e221c1e42c7379ff700abe131de0f363226a90abfb0401e +970dd4a2727eadb374f5e933ee1a11e9e85a9740e0b9a850f3eda6e904770f69 +bc3edbd52ffacc16513d4eeaaa948e533a8d693d184660dd89ff3f945ccd2d5f +602cc243ab739b4d488e2577e58648d78716fad157fbb814e0c7991764a3e0bf +9d6da3925e634a1fb3d6de50b563d90dc8ae3be33c6369a1a96ba6fb8c16f2a0 +db154373adff4e920c0b32ec6aee55887d4670a2c2340a12556e5b9d688fc299 +283e19469a14a8068efa9b489522e2f44c293278d138c732129aa7d97a8ee41c +30d2f40e8a7e241ce4d1596e6a1cd065e90167a52aedd2635e7465144df866e9 +9dac70f78425c9e68340ea5d19ad3d0fa0f944d2ad489911eb5abebd7b48bb95 +6e8ac0948aa564552395de41aa2a72646fb369ae9d08958f759afc10185bab4b +34349c12294abc6802bb1ebe3357f3b0c0ca227067f3768e57dbca68c2d1955f +5d18a7be0b9805fc2bc4b3287ef1a9d16350e5997f642ed6a9bbf46a68aa0ba0 +80102f020e5a331fdf8217fc1bf0da21ea7f20e9be95c1b59fbb458e4a5cb47d +b38fb3a3c0ceac39788794e47ecdd42b81c5f8dc6b6e9af7349babc8fa79fc77 +df3b5b303aa5dd5a2949ceac2fd202423a918f8355253f20cd86d49d8ac956b0 +2993c270fe41c6c7c4fba75b10a777191f33618e4158dd046c5ba0b145a0b04e +18a5f4ca5a7662bf6b913975d6fa9b4d1e6b71f0eca1029ed9440c91edb1d246 +7657d9ecfd8981eacd537757a8baa5318631c688d1d865d9645b4e52ccb9db3d +6549a792a1f207df608b6278dec2956a2b00aa3783630f6c516d448daccf72c5 +3557436ae09b66e0ef1f1156945afa125eae9ced158b8301f19efb2daa86a71a +fce1b319f87f0955fb113973adeb7f175590020beaa16db43bb361fec1dcf3c4 +d21a58d9d01f40b86f5059c437ecf83367ea8acb91baf187e03fc51cbf4c07a6 +74c5f63e7c7f8400c171f93ac7d3de26d141938cfbd6163240565995f44a6254 +c840c1b4bd66f05c2c08b55747540d267deeb6673f1ed54ac99ba83d15d6354b +1df05680bb93b9237883261a3a475b138373c573efef4011f042102289a50dc3 +1eac543df910695b1971d03c256f258ca48878e6c1f3170017e3ee97b9b705ad +2241ac927a86b4a44f05f37d260f451c0fb10daed031d67872764fa273a95c18 +3e9be8497c3f68236f32027f8c01fd707d2cbdd339b07dfaef35f9efa1d43a24 +5aba59558c3c0b172e30c3a64ed18c9eb7141a00f8862583cc9ab16b9184e099 +10ff30eaf0638988cf54d6e40e2a0ff8e5832cef7dc239ee90fd1eb079d0345d +cdce0a6d9ec621dc6ea7aec3eee09eaa05cb6505865b90274fa890bb64d19d74 +a618a951e3b6e74ae3c65c84cb5d48ffe4ecb86c859cce068c1665c7aa9d982b +951b95e10c6ec1dff747ebb981b380056d9ec5125ce14266bf81036a581aa8f2 +3d76432c7e846bc7d737ef0f3b91262e7cbba277966545940c67cf4feb14682b +f557e45e6f44b120c90862f3f1da74e9b0b35571cca2c2860168821289d2f836 +897569d072774cecefb2ceb1f55460ea5aeb252a2a9f653c8b646dabb7d1dd53 +1e1da1c098cc5e5e41893944ebc6da81ce44d8096813f4323e97badbf6c2a118 +942e44874e63004f7b925d6f5b3a15a42c6808062eed0880a8893c816dedf674 +96f49c25ca5f2bb1f1f49b178490c1ec6aec6bb3590005f40f339c7efaac56a8 +8f132f9943edabb2fd1f3b8b1ca97c90d376f5f62c5ec6b3aa6c88ea7bb28eb8 +687e8d24498ce4c7cc7c2dc4c60beadab36d50f0705606c4777be8f391b78560 +56c87740ed507a3c4aec3c115f837de4a620b2b8a028e9ce52213f3e7c425e0c +a2756efdfd243e55e094020fc74b820530051c414a32129cea783402238efa46 +b98348ad5cbf27b1137ba5d7ac1ea2d6e8df85908325f75bfc130bbf0b1056f0 +f1815bda877bf922f7f71488cd63f22107ab224da5af9f0bd07526df7b78ea18 +223eea608cb614bd38228782a8f6dd42d559a894b814f08f9120ba314fc85d80 +0b6909c98735b0bea839012811ecda1b5ac66974262a232eb06daf952b70e07b +b417767fd420961262fc68c7f9c4084fc324d1b7c9550db0c3aa665cccdf684e +f077cf33dc707a148e325dd3fcefb13b3d531849202f83a7909406c1f2190623 +658c0f9e483b8ec4379f43360f31c1c259f4a8dd369405affa2fd4ff1fc6bf7c +57be200df6f16d82fe62f9daa00d10bfb79fe0351c7d5044bb6e6ef64914651e +c046e9a6e9544e7fb5a983007a59dc78efacd8bac06dc49148d0df947b24db81 +551c6e8d05a75dbad023f1c600f6455eb1783aee8e2841b63659c57bc309605f +e21524b5b59865ec7eaf6df1cac0032b10b9736da197620b86125db8a97f6d7e +8e305f92b4912641b692bfd1b98193967d2847edf3c7e1efcee96b1239cdd35f +f4c843564827f9f5adc858ba2b911637205a9fa8312675d021b259f56342e9b3 +95d3ebf837e945c7f08494fc2960b92f7f6bba9bc2f5455b5582fd670e6500dd +ce38653d5dec5497726c15f3ddf885302a430f9b7946bb9ab2d9efb3c3f81ad0 +2394aa54141e3849b5ed816a717044bab44eac003a8095bc03e6b6b11cdec77e +979fecf2e780afa121e03278fc99d25c0bd241c657558ad88128f0ba7fa7482e +e6f643bceee670e0bdd932290624086df2198ca3bcdbb976379edc7204607f8d +b0f6457b3bcac7eba6513e9b8dcf6a47c075e7418b0cade13c43180970d4ba6e +fcf574c4f9da83b289a7a6d2a495b6ff32316b905f878579ed5565f7509437fa +02a28c87083fda09105649beeee44fd1a80b0092f064f7600d3bea4c549e914a +d8d595d8a278aeb78b5751eb2feb3b8099ae0495eceedbd747361df15659a9c6 +4718304f7780a881472317605a38a9c3f7a39e03fb7169390a5282acdac387d8 +88fa9ac46d3885e65be61519c131016d65f85bd2d1d6b321ed9bdb5f7210c4f3 +62254ceb44ce75e79d8aebb96654a28e96be766c19439e26ffef7f185bf62856 +b0fde276533cc68618b17221426f86406a5b0c999f7468d764dd92a632bc5998 +ce34724e7ddebb53e9c125a2be5b2712d029afdba0ff9826583fd261c85a7951 +7e0c89058d87e2105ddd8ba7e277e9bcb1cea56d64f2ddb3a3e92751d718e18a +e8eb8d55d1a35edaff938c5f6d95ec089c727953c3ff6de24f7fcdb38cf73ab4 +1ebe06a67ad901ba536ee1d5b208b86e692498215075abc3af597dbf93aa87b5 +84876a167d593c5fc0c487235b6cd349d3edaab4265da66f7c4ee4967768fd89 +c7c28a64c97e20c3a34973b9142314a1511a6fc6deb13dd451ef69710513f18d +d1c960e712d73b1db1e8e534096c255c63987ab4d32e1a8bfe145777fd1ca548 +762f7b4f7447d03a61e770c12ace3860c6189b3d0e41f0551cf722cb3dc09073 +f0567d0be9f39e8bfb0f338d6efd8e1279cbd43f6c4a063819aca553c54aa234 +6eb9d433c5426bcb9b81ce88b557a2d59bc7863397a9994dd6bfd6c7c7faac38 +0b128642a86241bbf8a4ffe9887758f94a153d6b2c138442c5ae670fb50218d1 +fd57d841af8f328b33173e4b8ac9b6db3006741eb323a502045702eede107dfc +bd4081770e3d07dcf9cfccb7e56e3f0c7da3767ac373a12f3164f81b493f12d5 +49ac50605430dafcbd4a9f49edca82b594ff829ed3bae596a825a618d49a96a1 +6b61f8e8b0e5b3fa032561747b96fa1935d74d0130ae01accb3da668a887f6d0 +9741836de17dabb950d84738dc5ff722838b507dfa7f4a88de4d9aab12ff9a34 +1db27abb24fb8686161443341a975cc810ad1a7e352037dafc33682a5556e6fe +46bcd08277461c74caf2ec1ca2db253d82dc72ffcf5cd471900b7c0f2390aaa4 +eb6196020e305edce04643a2faaa4fa9df91d3e21121da099ce25975d4c950df +f59f5e4ca3f426af7b33b958ed1ff3e1d1970eea0b97da7212e8a42124372638 +cffdb6c5dac17629c3d04ff2344df5cb39f6f156b6b8a4bf38c77d421a26ed40 +eb2e4e1d274ce7b5934c69506c1705ad076c58ccc5e27c580ec2dd978dd1074d +286163d79baf91e3ff30a507cf1c1691f60e28c780b8f2b2cd7a66e18413094d +d4381a15cc3a2b8ca189320df07dd3a25580dcdf91a2b33b3d8fc89ce71cc087 +8c0d5d4fd12545bdc7fe4af1b9cba1652dc8c076df6dd029ad8b09d75631b4de +63b3ee38b3d133d0d3b7d6c991cbae09a8aca77ad4e0351ad54d2a4a1a2c84b6 +2a8dc9646ea4cfd1b66af0707eb5fcffa78223898c0f377ad55e5657661bc1de +e331cbd9fec4677181d3577978ec08dbda4c684cd0266ce6d1e487cfac64ef84 +62873d034ad7d22518a7e767ba80e8514317710a71a228f76a66ad59b345c4db +f03e056eb6c9b2c444f2199c8488c037c37934d449f0049e14c588523d9acc78 +50538da9ea98e537418f811afb492818c285bdb80a31987b41a1671a77ab530e +be57d8b71b6f9c95f7474faec60705c2132010887ad668b1d7d53e26b480590c +28367553ef4cd87ee973a99346fbd55a2ab67635dbf2df12d4ced638b733a921 +4da2b898cbd41632807b34fafda648b3c1f53d0e5c835b0cd3803ccb34a447b7 +6a5bca240cb0b1db849d40dce5fc8f2e3f711ff47e7b0e1a71cabbcb4c42e265 +1f482c194c301b4ffde9f787f9ac37c620ad634e7d1bee6bf1dc92acb38c1e6f +fc4f531f5e8959e55c5d6a97daf9b11841ee4b14c4ba58e7f0dc9aff440e2a5e +61b046b0d47d4ed606b4055077bfc0d7c033b3e4fb817a02be0891fa360b6205 +8cfabfa60198f426bb7ca31877e4273912547e1738446c2816ccc6b796898310 +ce86f1f01654cf02b7e6f647e9a884041655a76d9d646e2e0098b15123de9ece +8580c5e8b36946f2aecbd1922d21d15092617486d2a7da0419c430ff83a76428 +d183c15d0520b821c22e0aa806eaedd6df9392b6dd93db8f22072044883f7102 +dc2abf3ab094b1cff83bfafdbc0f115d1ca965885356039bd90c76a78bff2b7f +931ec1a762b750146183f4080b7161d9e313c90a3d0ba031dca89f5155ef2c77 +d1e9949d07a2a318ed5bb9f43ea2df854dd15c45c09595450b0cc355db139f6a +15792d516ffbf05d2ffde2ccb492bc5f8582c88695eb42ff075f1393d04e19e0 +5bbb51e286f578ee126792068106db3960ca7e7da8838c52381d1853e731f46a +fc759825cdfd1c50cca5e63e1a24a9d3eb21a032cd4333648ab4b6725ef7ee64 +4bc1c07206312e241ae8c4206f8d211752ac7cb76f2569e2213c113a3d4f2277 +2fb6c2df9461da1b36a0860cf2dd52ceba0cb8fa5134d94438458dc4ef566166 +0931f0a13a88452fabba8805471b38d776fcfc616c602f91ad0072b92a13da58 +08f716287712de4f6acc57630b3c4343c37c5156fb610f2455795cc9e6804de0 +c7b6b16da5b274460bdfaa1a5249a3219caa1dbda045ce35c3b34d628d0a6e04 +3935f09635d6063592dfee4e8713fb04a74e0bbf8bdd6efddd86d6eab693df65 +d7e71b96d3ab69d78763f6c06b6ee1fc2b8bfc274d33e58f7c13e46f884f64cd +2ff2091d63d8d0d2305704d42a18c353b55956f11057a920dc00a5c78ee5c61e +0ab73272866a3b5c6a46683cd4f761f267fc8e98a5ee0e55a9d8cba48cde5215 +c96d0fb18f757705697c13055d7f2af893a097b594fc5200a1fff0d231487f94 +c6217ad21609874754afb8de70a84f92eb3999ad348ee6baefb476097ff1cb8b +dafce224290bfaa04d3184d02ea2c8525232b1f62d8a3ebc5ed8d2aa1f7b009c +83d427e281551583ff6d1690692648d7e65e7c98b67c8d181ce0736f1518f150 +9c2b13ef0135118fadb78e58fb01f90fd846fd9e7fdea4a8cc481333305b1e95 +4d0037fdfb31d34bdaff1e1c0ad0f30683bfcb8510c30eca21008147a17589e7 +2a8b2971c2c6e8d45259be84e4884fa79791f7bc3abfd138b8b4556bb75e4f68 +bb934676f740e015396c5ddcd224834f53dcc17fb33bc79e15374249c1d06a1b +f20f3b29858ddb1cfd470449e098195aa1a64c187fbfe6488b89db49851bab87 +c77b617543570e105c27e7ac73583f02d0541afd6139ae5ebd8382464456731b +6779788412dfc026575e27a197c5295e3a261864c9aa91442ed12d3024db79cd +1025564f9cbf5686244000bf2caa92df14db97bd2a10535891ff3a84008209d9 +cad7566b8800ee7287ede867d79ecada749aa5e7ad22b01a9f211ab18e5f755e +6736bb2fdb47e4152aaf887aff350a7a74eb69430287afc58d46e2c171aba4cc +a01792b0dd4b0a67624d82b71b19c331e355a909eac5bb94802233e6e3310f97 +da3c5d40ea74ed3ce0d283233d1c5907fe29dad678a9c3309402167881d3daa7 +4e3fe4255ac1a73f15f90ddb601d827332115538f1bf93811a35b441e4442327 +d7fa2dd901f3d66b7e79e09f83f9bef5f5fe1c01fee76381ad3394861155cd08 +fdf2ec5778e4cba57acdefe6a35191c613cf12c946ad8b2b40b6026b5bd4b9cd +909d1779782f4af32d295b2e8f881a18d2cb0570104768449ee2e960f082921b +e9ad82731065b3c3ef18aba3f9beee050545d766b4bb012cb05e36c98916000b +22f7dd0d60090fd5812d9c7e0b7f109eeb4c225c9b6260f687a39429e4ee4dcb +2b1c5f8cfae108e005887b30a949df06bcfc34700b69a5103330e400e4666a1d +5c758b6d5c2ad8a733882ac3cf1e6a1395534c3a9300371d3992436227635313 +531d453ae6142bc47f086f805faae0543b21d52962343b25f64bd46ca8f63f25 +bec767324d38576447056a6f508efb68e491af661b46f7ba81da215fe797a16e +f03cfa53db0b51e39a7c71897ac5ba31d902964aaf3b148e7ada10fb7603d4c9 +b1585312db95625d45a286228dbe2217d6bba65c9a7dcbbdb7bacb5beefa3c8a +43f848f473d9bf37abe92a2ca91d26707ac230f577f7a1618a02d2dca08bb84b +3343f9175ebb3e89b36a46eb75b83b62df50b0108d6118f790dabbde765d53b2 +7cac6abe7b5440325adee21be51b9367eb9cdf8fed87a081679e7ae6aefbb6e6 +589cc42556fd865f312b54cff53284cdf8b442c4b3326eeb8d39abb1e0d2e95b +316e87b7615b0c37e908d4391f1ad9d2715e94bf8de57a1c624512c23fba4d51 +9150b26a4f13be2e9ced538d80ef807612d561dc8d3f5b602f4886b8c9f2466c +5c948ec6dae5b87d00c03caff6c7c241f4b965a6c6368a30013ee2ad5e1e5000 +94308aecc238f659e736965842b290ade6f05b5152a27fbde7a90fd97cd59509 +f5f05fab13461bd7374399bc6da554acd718e4f67d8696718facf56d5ac10468 +cac7833ba92c74bf186ec50fdbb043223974986e2012c1d18df40f5a9c52fd39 +97df5f9e5f3a827d50b6ebd6909e7a0de29fb97920a03e32422cd71d66bf5c52 +357a8d8eb241c6c8be42b67cfac2c3777a0fa43d2838db8250e2b5b8efd3c367 +80b19339332f67d477cd3600b04c05b87b7a41d0def6bf82fada771804a5a756 +bec34265b6fc9e11790f8d1306d36c0514f6bcc76e93b584bdf86384ac22a96e +31549eec68909fd34bfcc467cc742dfa628b15abb7aa6a181dc3ac0fd08a2097 +9480abc06fcfbd81e7d4ea358839db58c30c3a7eb5d698cca371f7630939149e +b897b24f6d957c084cf0e2932331fb5c0b501068b4551812a9b9abd4ec27df7c +e824d672ffe6e5971ecf816f447482130819902d26039390f84fb513d2d89662 +defd5725eb153a074c84dab1d4d666d6e1a4ae2b078ac16f80caa6314a1f63fb +6d7eb530ccd833ee1f4946790344ca86668cb3de69c3013c73c971d7bf583095 +539dbe02e8f18e2da3bf9fde9cc5a5e859f9e5bac8721e36a1d50192140ed21f +a6fcc212ed167a50e940b38a0ab78d3053507500d768d1ea9c7bcc7b3100a05d +1db9350ee33c7a492f4543b45e25740aa99a76a1dc7940b8b52883974b07a407 +df7560cdf1b103c75746fcfc418580816597424c0aa36e0dd38eaf524e593512 +174a0ebcac0488958b01c1199d786f93ccefc14d219b2dbabd5b50c57ac6c195 +fe51a6fac81db1fae5052f21b3af4ce8280bdeb5f27e15f069ece57b0b628858 +947ebcf41c69d0c023d67cd21b9e0db1366ba5abebfb9c98752a6c63cf1c8333 +d7185403199b82e9e5fa15d33e646e63459352f829fc039ef185e004cc63fe21 +bfbeee4c8102cef70f56aab4e35c4a7ad51c85d985f42d54e4cf5678ba7ef4bb +3c768056fd223fbd6ae0a390e0e7489f5582d4ad805a6ed2e5cc0502be6f58ce +b1e3de8cd4425a053f84ff85ca7a1b9c679b9b57457f91c441d9289469255452 +34c45d58ae796a7f21b960c8dd3195854ff59e6914dcca262af6e5db7f150976 +b91527a1f0f00caa0953e082f5dfea46c0029bed4eff22be6a32a9bb591334b1 +68da599128f4b31034e20c0efd5e532b9ded85e5633ae8631e83ec1d6069ff76 +aa302b99f88e0e4070e4b93e1cfe528123928ae67733bf6fe6068c22328f16ae +3fa5b130d9651b531ea4e197ae3d3c16948503f1842d967eb3c5504e13986933 +cc0a3228269139d68aaf3480875149e25acd6aa8e14f5c21fd12096e274a1cb1 +223159ae0b531804c1a8f8dbb9101d3d0e435292f0452990ac4a646058651025 +3ed58cc6fc71eea6ea99c6f96f029b65f1c24cf911a35076564cef64dbbf82f8 +7de0c4f2faf3e56a1659d2b56dda42a3f63e277645b9bcd5c92c05c8b05adf75 +35b3aa4c341358c7c7927b8e9937c087e5e142b14dbe5e5f709634ae97bc9f2a +a82a2f3c3dc16b1abbd1e3f33559f8670e1dc70a9e3b0b717ea458518357740b +75a9b2b9cb076e81bb95d786d4720dd59120200dfe860b6e40f2c723dadb84ba +e83a80a7c874b9d36a1843d3ab1dc330eb986d25d6e036940f89670cd41d7ff2 +0a9e19ee36a1c334c779093950bea2854369f4ef24dde7b17e4581c9c2f5e5d7 +49bfc7a6a9433ef9dc465362bb2b252d7505369b40ab4ed1280c690599765d3f +6c395d4f3955dc9e7adcacd0f85b34e33c1d5b0da79e54132e115002728fbcc9 +def9ad99c3c72ef5fb77d883f47e417bd26cc8a13824297bbe6102cf7f60013b +3410e61d06f4d9afe6d9eafc92b97459a0433a8928fd24240f6f3e388373efac +1bedcb5dad56b55d248dfa546329ce77f4f94c388362e836195638066d636a1e +9de34a86088831a498a52821e2843d704bc01d386e7f268855af107ab35982b5 +9a474a271c205b19ef717c66cdcfff8e53e207c2c1fbfb8129f045f0c150a053 +33787d5dd2d7322b3ec6f9193a891c3c1b414f27fea3635a1c1d88c21c18cdc9 +1805f3214e8536500b67ac22ee4fc1aaf6a12be4f8fe82e021a734937f0a05eb +3de81d728121fa862a4993320c1fafb719ef1851929ac2efbe7c1e8d2a3e35b2 +5dbe28dac5ddce834663b196e17be78fef40be1ff3885293dc9b6db2a7973408 +0730556c0b64d66176078983b062cb073d32000e12e8cce47ff23f877078b5a4 +2207a050c62e39733bcdf87f6b71e39758f531cf55a874fe76548ccf8ecd227d +9c0d76da8f0ea5b1971e71559203f2c731bf31f9563a58d6d110ea507bb7734d +3baa443805c67207f3337ffe88e0a052eab7b73296e7011fbebc3984abf53382 +1f38a1483b88eed29606b25619acf5e21e6764dfac4559e8ab2e8b987c05cb3f +23f7a9b18fc54c10e59b1dce3e3bee7299f9e98cb58df0fb48aa79c6b87476e4 +bcb73de1eb9603cef10b6ff191174e23741cfc9711ee68311a8e739dc52a1b69 +b6bd1afd81df4f6b1ae5df916faf6c6fa778f9330059fb88b5e97ba8b864e485 +b2747a1a7cf32e259ab7737530e55b2fe980ccc088c3f5e2815e960beaa9ecad +530436a2c0b86f3c3aef098a8dd927ad13f9ff34b87a1a9f07f455b913cf1147 +270acc6db471e53dc3715cff25ac42d6786c3e9d90ea77873b301cab084b1472 +71c0cdd6e088bf710114ac00e1d6d215e5445605034b771390d0ff76d2f7dc34 +1a065f905f258d223b +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/courb.pfa b/ogclient/lib/fonts/courb.pfa new file mode 100644 index 0000000..795ec5c --- /dev/null +++ b/ogclient/lib/fonts/courb.pfa @@ -0,0 +1,1966 @@ +%!PS-AdobeFont-1.0: Courier-Bold 001.003 +%%CreationDate: Tue Sep 17 16:48:30 1991 +%%VMusage: 58156 77080 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Bold) readonly def +/FamilyName (Courier) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-Bold def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263788 def +/FontBBox{-48 -288 746 847}readonly def +currentdict end +currentfile eexec +f0e992e2abe69f26883d6a2f691cc4ffeaadae4ed96950027b000a0e04f88bf3 +07a055997fc4400b46368da1c0f572a6e1e58371f4770d8e09ba6f39d5948f18 +de1038883553c352f8e6add2a9df060927fcda05454a5bce5badc6153a92a950 +b91e671de818c860c77eb6b93cabe55b175ae8265971df2c78d5dc3bb7a23a3b +5eb80699e4f540d2aa0774262097e2f171f03b3f8143143f7f192c7c3ea4b3b0 +d0bfe6893744a6ef8f3fe2071efdd77eb2ed6a1f8365d33ea9a2e3baccbf0886 +890dbe8fd6ec2d9db9b8a11d6f0c2a5ee4b84b2ed02498706a8c6fda02e1ac8a +e43fe22852111c257d9da8a8d69c9fa405341c435bb91cf627e7ced2e96614bc +ff826d0ceae4942a5c8ca794b11bd2bd48dea7cea631afa4f7c52cc775c70f17 +4c36dd977c5cf62ef80ae874fe87bf798674a7b32d84da7c9557f87c4c8b7b6a +a061b8d1f83190fb4df552d2742fd99986e3e33a9a4c578d90637f42d84cd9ff +0e866d419216ac5de7308e8b98bf17ff95383454d45ccf07e90cb1a0ce3b51a9 +dd88c2e2b3dd662cc745bb5b4ec33418a1e4cf6c9a528e6c283c34b24da3eb52 +4431c4da3cb34a43339c606956778e666815be262bd069b1b5103abcb91f1524 +5bf33428d6cc1d3e146f0c711336b471bbfaaddb4e1951c8325801c2898c6dbe +b5d96418513226315c9c8bcee2f3ebc1117d5e136d8119839aefb2c76d8c8a37 +cea1d23467717a8398f2437f1e61a2dde224f07e835e67950bab0542fa635ca9 +9c457e420ecfd17797a5ac7d63b003e4bf6851400b5a9431d9e4746525107c4e +4529224ad6f666c7b4e8419a3630ffddc5eabfc0e3f1c089004b79b6ffc45d19 +7087ce92f5691dcaae4223416a9bb4836b5e4d3963dba28445d81ffa93d59c14 +96a8bebb0dd93230a8fe36bd1a4e31d3be4818c99815e7ae26023e5c68fbd21b +334b178ad4989c333c37de8f821bfbbacabeaaf49a38e875a6fd13ea6fe45235 +c96be719db5725ec6e507e1a64daa56bafd017460730b9befe29bb27115968b7 +241f56bbe5e1c787f3ffb590da9c3965c184cc5f94aeff1ea7b0a013caab3bd1 +c4d41e2f61ab5e2eaf1e9c075ca3dc040f988ffcb815622c7e0c31ed670a9aff +3833cc7707c2887f0de43a590344a70e014cc67dee79bedee7ae796448e61c74 +02f2f7e72f5db644c2fbc093f5ff5d6a787194de10423849768a48d56103bddc +598699a43094dabd1934e8ddeb284b9651b9ed215c9e3b5a63ac766e29e7f0cd +2a4f010df4b1114115ce819af6706107be602a21d002e1c45cfcdb568a1c617a +68c25f2e3e0781192c7ed85f449b56caee4ba991e1376ab43c1c556708e65797 +ad13dadd61ebfcdc57dbb59771fb0c8f0b4b829b6b4a575f17da658fdc2a261b +87fa8d8f39540f3b9a0cf46b59341ad320f37d71a8a9811f5f24b307ca32ff6d +e80b35ac8262334afed2567d691d0ffd933b26b977ab624d2757ef20e9ecc3f6 +8b0bb17594fad3c27fadd8487b441fd520c8feae3b22646d71073bf43ce3597e +6063e073db9ab0ab98128b97a84482edff091bc809452f0b2a37b26e5f9963f7 +118dd4f78d097efb864a5495f0104674564227145d923fbf39d1e85c78c8f92a +e316bd6b70231733d39c10590c070d173c7a4d10e08e63303a77206dcf01746b +1f78cdc44e06a26191024686d64436e519ad103349fa496e4159b3a436bde5e4 +20bcfde3d3cf24f50a1a625ee6274576104a3ec62c0abfbb14bf6dd280559160 +887cda1b88edb9dc2496813cc21e7e26fd42fb6770df364096d34cb66ccf8a40 +af4530facc5dfc5a672f5c893ee33e85a88113f2f19d1a40dfdbd2c1f7e132ed +3a2607569db81e7558b536d131dbc71f55cfcecb31137b0d807cb90b2df7eea7 +6e7790d59d7ea4fddd66247058ace1d33f6d8cbdff99be2840fca3727307ef96 +3e19cf0f08e953c85c4141bfdd8b6f6d942389ca120969c69f35c10738f5bda9 +b872253532604e5058fecc5ac4b911b3602546ea3a3b5f84dde99316fff9c1d6 +08b59bad54015883cf8cfc01f9828b9ce335aa26dcb5c6f445770d0fde2df51b +83a128c79d7a1351e6da950c256bf97c69f73e7161692c192778d3d361149c40 +9c27e97562b7e2ca2f0a498818571fc7eb9552542bf56c93862aa9e06839d169 +ad983d0a370b0655d45260568ebd3cc272c344a3d0697e05e27641fffbcb13e1 +aabdd1cf7f24a5d550700c9129b392746103afb0ab72e0f0305ee21eec6d54ca +bb0e5d92b7493719bce7ec85b3f683ceccee4fcfffc7d127ee6e8f76e7ab578f +80933ae97405f4e25b793eeac86057448882c70e3497d430f8e6af1246a38a42 +0231a4f8bc095b87ebdbf6b6e5f0e9e824595835e06224fd549b55dab5d72511 +a8829822fbe050dc7b9d952a1a8274eeec665a7cd924718bdc21747e43ae8cd0 +acccb305a78f6c201916d5db4efd23a890826b74b9402f141de37d254d7656e1 +093cdce592272ab46e2c9dee9c100e7fd1f3a558ab7eae233b167b447bfb56d4 +becc14a403850a481eb75b554adddc89e1e2d0c1a5ecca30f7c2183cebae411a +28ddbe48777e38e16bb02e1f62d1f9a090427f47a5da5bf867c04ae679617439 +b4674e92d80f659734b10d62ac5fcf1d0aec16297c11ba085eeab1c4a7017cb3 +d9653f6e8f77056074e3933e65ffa2b08acfc8b90599ed85f5d91818b80bba55 +6c05cd944be5e6d76e00f6df048992c4b293b83fe275cf4231cf0648f26a0d28 +0593ccb41a92b97c24a39de7886ba7f53924743fb66baa4c01ee21a16c66561d +4fd8cfd7a7e7f4386cb6d818277efb779b2b219adbebdae898083d26d561e797 +14553ff7b1df6523f5c50c8d7d4bde22a4c220f77d9c3416709dd5c4c6a2baef +71c8a7f65eec53d15ce0112e745418467e49172fc5cb0d5df2c000b3da184ddc +9a3b24e4e4c919717c9e348a1a5665d06ee268303c11ddc16078fa8424796663 +eaa26915db69cc77126df2d80dde5beeb879b9c23ff1acea4dd0584f45ddb29f +bca6f48dcd420b2fa5e81dfb3be958c18bccfe7c6a61016614017745a0f10a03 +ad4f56e670ce0a98a227feb9fb28b1b952c4b86bafbd9210ab745828533741b8 +4efed05f94d0aab602b37d7e9ea944138c541463621ce3ddf0ff99ae36f8b9e0 +c14ee7820eee3a45b8d69e8f65fd2288e6f1b7eec5c2a45822ef46148db12390 +e87c7a2708cf346e04f0bf81cb5623a92d17405cd0430df9d3b7cab3eb6115b1 +d18a1e8f3b56f1b93322cb091f1ad75e1e12b36f052592e6a0def7f5dd9e18fd +2f52ec209488ca7a954a04eaf4c6c50d2175657755512d43734ffd5a545cfbc6 +f9b1e740cc0d3a171f46d0bfa29a55287aef25886ff435f9921b714c0553f566 +fb8dcf761180c167b014b57ae4428ba4ca642c0a88226aaa4dd86f822e93f19d +3ddfa9f26b2a1079d87cd7b3c571f989b92ea58fd6661200664b36fdfb4afa4b +5169c09ff2182a2c973b8fd3db31d1eb306957cfc99b6ffc9c060cc2c77308ba +7f09373339b2a28eca14f263f91be194705f9b23915e2f6d68ffebdeb9b2da73 +ce80d19411dca457ca50870929f48c8d72badaf27fd8d64cbe2c1ce900cdbc35 +cab95fef9628f6c87fdb6c45e61e3c6b5bc15fb2583dcbce919786278ce3b691 +c0934f10c953d259848784fb9f325ee140f1c421d6d8a63ca4096c9c1ea6a5f8 +0476a9c4505129fde53639673371e803e60e3d337de079b2377d0bc9677734b1 +1188a98bf1d009d0e82d8e3d8817d465d568011a7c59fd2ffaae8d93379d124e +91b182018b5e50b8b7cb0cf1f914edc6b44b38419caf14bff525a4a5790e85d0 +0b7741cab4dc8711985ae161a253f878e51a453a8c4b0a6c84f533affdd0aac4 +3e6744f1e43904c009f4bf3d8a677d66659108b526ecdc0ad8a51d16de6f8001 +4efb474aaefc49626bf733937c1d25f17f3d30abd35e074527e26056b3b4e0d1 +d1787939b0c8e14edcb4061ea004993463249de82d73912bc435c4d792fae794 +7b99b3e1ab7e5e1018fbbf1003b9fa965d43593fd0aa1b568b593d9dae2f6acc +4a8b8d6d8b6b5d5fd2aecc392c7cb83588d250050dbed3b32df79de71ec1984c +e841adc77597be223a79a37ec8f5ac91b45f40943932bf30b77a82a2c62d874a +da8b86f910f1269ad594d5ff033724d3101098630d3728baf72fc281d13cde34 +fbdb8087c23d86fd0cce3ac530c5ebc086062ec32adc8fc2e5ed66f38d3b5a07 +d1f41fe240b3065bbd5f848d6c97f8b2ae149d07502166425d9285f9b9929100 +cc3b8c824c5ae124157f21d63c17d75990740c8e083540c0fdf55ab6a6128123 +894e6846d8f7098bc76ca1f696ecb31cfe5496ce20ee4859dac102bee4e9285b +2ee0d97409fe5fd5f7dab76118d8394d3c4e91fbc3a0bbbbf314d91671ea9206 +598129e121977b36e97a9e7cc3949bd6aa7e92e58ffdbecc7bfa8712277d2b8f +8e0f6e402e5e05b70db4d4d18b82a92dab7e712749b5632e62aaf26988f4ec20 +9755e47826073aa09c410741a8cae9ac19f0695f61db9552db60bd1d8dac78a5 +4a649f77461f7546fd35e33ae5c918d65418aca54cffedab20a86545a7d7970e +1ab75c12d09714a37fd516613f1e9ad1887aa3566000bf8a7c9751ae22ec3be5 +5f7e8c58229da2944051ad23625ec7b1c26e65d30de52ab5fee7a5d3184cdf0d +4acb0dd78ad3f79e2d6eecf19d8d45a18848611913336d25267ead7b1fae93a0 +c123c0dbc44f0178a8a1c31b8ca54827b34925b7b1432a029380e9571442a77a +aed4dd342f6bd1f1b773a4f1ad1c0d4c955a1faa001e2ffdeeadc86282e09c8a +ac6b9d886ffc443ed05966952482a7ef206e891c90b9dff910884ffee5c78de4 +ca40f6ce31bf465859c27c7b942246c43ca286dffcbb08ce12842f32175bfcb9 +21d324e0746ede76064849874534bdee62e99b2812d07314e76ea833e491b01b +7dc009f842e10b4876bae3f132f8ae3ac04304dbfdcb2785557e7b48c45d940a +45db8cdb374097a8c745ec7951e6e12ff3c51f0e0c8e7a82d3f77e90baa09658 +311167e0a688701bd62c3a598772e12c107deab4fc6ae3ce2b81659593e63734 +2bce989299c0cf8b815ec475e6b281e5d93725ab50f2881cd14588ba1cf800c1 +4656537f35711c98bd0d0fffd6fb6a1dbb5b8e3f3047d0ec60b902a64589594c +904f9e4ba36837f774951fafd3b9c99b0a7e643350fa50fe0d69723493507b57 +6dfb9c9befd7dad68d2a094abb1a7c19d8b89d6b5290af2f774dec10699beb25 +9fa0bfa8d76cffe9ccdd9a56e20dbd043bebcd61b4f8d795d6f273705ef0f664 +02ca640413e2b97f721d16ffcf103a49ca746d4f166b3a241a9d35edeff5fbb0 +19af2ea1e4ac319ed01a39ebfb2623dc69470d2c7bc38e876daecda4888ae494 +28e94d9377c2634402dc988423358bc949db18d55388126c982b5965a9ad5648 +c12f46f6e5e6518e323d685011fbb99c0456c4566ba542929d767c7bd154454d +75ddfa96c0e5a79c6bad3d0020556bda8b74e6199f327b0e17e5c3706c2adf05 +2007f91040a0f256b4d9748754638ff019afc766b12d937551b1814f28de13b9 +78344ae18668bd5f2792f7f12617043e40603d7474677f0b05967cc58a0ce610 +4c7e806f0646e6a631595384aba225d071848b176eba2a4232a2af75faef21b8 +cde74831d96c4682bc4c285ec5d4e1433b2750de64a9f42d0ee379908bccf699 +6baff1d5e115eb31e88aa4f123f4a9ab2ec71f3458001e53549a5bd512f27d50 +2f75d33db2732674738e98fd5562107aa071edf740e6fe4c3581f7f1a6bdea71 +11878ee1514d2a764770bca4a1db912ff98d26b7540915b03811844bb606fe66 +3d5de9f1b8ac6a46cb328b66151d5a7aafc5dbbef4931a94409ca6fa9b26c970 +f275431fbb91a35622d948fd939e56efb989f007b0d68b012a045ff725cde14f +9acc5df8b491f21ea3fc8b2b435eaee1ad74572cf52f1e913d44f4aef6df048c +00375d6734d0e829c0fed80358866c1988e3c09c7ef36f5ecfc0ed411e0b746f +6b04d7cb5f7134921969a2751074a3e33e9a7e2e68f501e66b71d3f68f7d736f +7c4cf241a6494045d87f7011a4a67279ac40d5ebd644e9fc56a97d5cdb31dc2f +f047589909a0a4517d6057e668f3594fef45bcdf30c854eaba5c1baad26e647a +097b4a0ab8538459ac97d822dda5827d96f29387b40f4b673bf3dff58b6845cd +3fa300b8cf4acd3e6301f5a47f1370c8bfb8bc8b3a961204e2fd696fda87c16e +30ac81f9d77634c5e8b19eeeaf9ecf43637aca16051acc7b63cf5b4fc157554d +e510d2a8f1c65369ce48c3233c445a0e4a81df26d68a2dcbdeee609e81affc6d +632d584b2d1e5939fb0eb3c6a7880ca593e99bb4d530445bf552e9f7fb0bb25b +b13a151832acb776c7768ee9bfb2d320c90d746df806bd755cf8604b2b0b8786 +052c5e8d2cb2f96c7876dff63f5ed31634ced7a1098d754895ac6f7e8f5f6a01 +494770c3a22cda0fad4411cd76fbc92b0c76335a9bb5b3818259e62383f6a1e8 +df4b1ce43717a343df9f91a5d2df077af4fade7cb9af6608804c08808ee2ac9e +dc25407c6e3ca02462b5d16e705f90b8fc64b7d8679f7d0de875b72f7c9c6a3d +b45e96e0ee3ee6f8cbf4c85f09746745ecbcf39ac3b7d6e52f3c5e79af0962f9 +91935435880d10ff0f00dcd7cf994af8c776700df9a07b6161f44d9d803300c0 +8fc227bad040c6658beb8bc4a51bb0adf41beb908d39a7d60137a43de5f1d97e +fa530897e71be24647b015cd2c76c0b0d1bd0f941499fe00ea4e09dd82910861 +e671f2f0c56f5d4a7f6f19999b4ed50426ce7085ff5ec9716f7393d604fb7387 +fe09bb5346a8cf2d054a7fd817e075e61961cdfcc9ff71d4651822ddc1fd05d0 +7d8a9d8d76da5391bd75ac047af65a351681baa87c9a6de0f1027cdf5266e68f +48a290aa2197ba3c66c575082319700a8527fe308c78cbb4d1e3a2543f9796dc +7105763fe7e57106179e22bf52aa25d472d6bffb0b906d24e788685b93211546 +0b97acf5adade19cd7cb6d9a5e7fe5012a3fa15e6e1b85648da877c1e3eadc9b +630d2b92f60189c1fc93a8d49b13c1b97714052b1976599f98dd697b9dd91a0a +06510ff600658fa9979cd633296db2a67a5d2d9c42fc530689167b7dce26ced0 +4d8a509f04a9cf65eba06ceac4c5e3644ca3280038626245666a2e0c19532c8c +720afd6d43b436a7ba1181ea34b3ac852481809ecebb4ded573b688e896ba021 +8a08eedf873e331fb7d57c2fb132c53f1fe70356eb0e8bc41368f966b3cb9272 +fb1f8e44c76f0b12c3bc79d848fbf93e55cd36eed1c09e800b2b8f53ab92d8d5 +2c6ef3fcdb64195f74eb7b8e7f2052affc111c48818d1e69fbbf38aad47e59e5 +45dbecd57c7c9a42007888fddd7dc740742d3ce06aa6370d8427a3924731ceb0 +6330390afe0853ab4646e48ccb5d49286ded1b38188a881c8af0808db19d39a4 +b3525226b5cdf3aa901217bef8a5392651e4fb4e8c1ef6dcb8faa406d7ba1d77 +4d13f87ff0c0064ff0fe0e3dcca2e79c124ec86ec13762b49208fc35bc0ffb92 +9b8a38465533f260166c6f488eddfa0be4b6d15b8b1b59acb4e8827655eccb02 +559e8b90b384d0f0115f7f44c7a6247f246500aad2fe475a6aba511a10d70650 +7e8035d4f83e33adac6e14fe40ecec89b632c06996f1d68e7a1655d69ac4f6fc +227aa5966547791a16d4416d785836b5a3724146a34324ec12a09cfd7519c05f +d395699da7086d56e701539e0363d71fd9b279027252c8ccfa7a3d25a41a9644 +7d4d92b7fad210143afb526389342e18b790671676367c6cb41c3417d75522f7 +2187d83b605bb6db3a695d6cca090cd353e23d0512c06e8810f0fbda1b19ea83 +ebbc1ffc7f90fdfd8ef644874a7468f121564c9b259ebc94ad0b69c83cca6e20 +11f4a698aa690893a2116e502e847f9b9990b5a4d3f533bfe5ee1b5436b2f692 +f6b5f6b779b4e59697ccd5c04e8c0464009c48bd105482773f873902bed5ca6c +b13a0d90c4ddb6ccc416b349ce7e2c8f91dc5219011ea6df871029ff22c7d10a +fc890880b9f13669c7a6a60da0f66e5474cc30ff1e12ab765aaed416318a8405 +15ac5c30d883903bc5c04fd20ed977e22482591a46c63ff11ccf18756c080377 +b4f72c4fd3b127700dfe7353adb29431a50ba9d0ccf764a450a9a57668095392 +d9f924832309bf16b8d17c0fe2e147b9afd086c605ed6998f9873b9136575722 +ea03bfe76571ddfe0c86a1b5ee8b3c0712a81b397b5e0e6068810b0ee52bc0cf +1ff6df62eafaca67e1f553316a7bcfeae787ac7bea86056fad39696b222e887c +b1aee0acb9e4093068661a6564292808535ca4c7b9271165c73eb89757db9438 +47e609ef5766f00c21cc5696a5872cf39ae59e79ae9b0854dd3b6ea7763f59ab +b4443fd1998d1c784d815b4c067c844d942f935123a0ccb76532f18572405458 +6eb065f20ca9f301fb04a0f05bbfdb167ed497dd191a06fd43c060fee5be2ffb +b804236bfcb6c81abfb5ddd864a61dca262b97c5db8332d049287c39e0fc8532 +91bd8e2731532d461bd22f4fe65603efbbd39715f38fd06fce91a0014e80e7dd +f80fb0f27dc96c6df12881a7c4f1c47b2c7b2cb7224960c44dc616fd8322efdf +1905121f598b6e0aef30353763662ea6687ba0414cdb45384a729d1e903c51cc +da599e566012592aa78c55e45808cbd9952c8c3b2f21d098370af67c2270f32e +1dfbea8d7fc0b88a491b4a0101ce1d74a10e27c2eebe19f361b2fa384fe946b7 +c9720e9ed02b59cbe30062e902fbd01930e66400d69c274ca8ea0ff6f7580cb4 +54d3c3206477f7b0dc20cb80055d470383d137d226be0f9a15374e0a0112b04e +f25db5ca9ee78fdf7fa7a8b3867f599a61e010d6ed3ec8b13e1439d3a231a099 +2179d4deaa4eefdbe467dd077fa49fc330f9e06a6aee7d102a3b55890e0aaad7 +e2276183ac7cd1259350ac2277e89bf452858d9418ed01a22919c9012daddc3f +ce9bd052032c7fd79148000277ec903093c227e52f19b959a99c7edf0689f4a1 +9d004980edd98997da23cc1ed63c1cc0f1e46340d3cfac421df31a95f032f297 +0c397915c5dbb92a8596896d1d114a0964926be4dc940e857c5a53cf8fdec3da +e2958089db083fcfcd3eb090282a7c978f3f58e93544c9173382031797bc2a44 +b5aa61adec96086af8ba5fca90dffc8d0f4d5a8a22013b2ea06675eed2641fc6 +03400edba05abcbf6a8afbd3c6319f23bde069c6721e7679610367ce47d40ff6 +9c018e23a85e2971e7136280bf42064fc33502e6c7375e328c32f03f05e1e3a7 +d35816e5862966a1efeae1eeac4a4c1a24cd89467bea5e9670da181fe333f795 +b6176f94702a496f8c4da01916dd5859f41fdca457ca50870929f49341d06392 +715d71e508f55416a59ebe5ba3c093fdadba2ac413b6238314e8eed5c7b353b8 +b09492a35309b3da82a8af47a2378c2e4ae452b5ba4d706ac27ca5107f98d4e9 +64300bcab484fdc8c9c967aedd2f351b54ae0ba150334ef42fe7d57eafbf1074 +cdafea5358e2239cfbe0abf635778065e433b9f1c17357e67f692f5e98641723 +24aa6a462c0334f2ef7bb30fef10929224ae0578fc49d68f7f48c91655371e99 +751c18e5f4c375a734404e533dff279c9a2692956957b07d11a72ce6c7ca64dc +8c90eca4cd037dbad39a5e6393ed0ff2855711dc7bd1f33f122eaac8fb2cd4af +ab6a00132c1300f152554b81a5e33e864f7baf93c2ae5d9feb5e2bca4f4b48f8 +c813c42accb8a9b1eea5a14f5f9795257d70d0910cb738a9d8d47146cdb5c837 +a74c0402493a3b3a849306cd997659088c8efeb0050758e1c2d8742f34350304 +8f80ca8cc9a9aedf8008579dd936b29e3f8495b61f0e416f7111124e95e9b0b4 +9c69063f46a9ef1f2ae58c57392ef498b1e0b9980f274d5d4504b47f03261e57 +2ce746715dd521d6d2d9ba1b570ec8de309778955e06f065a3d82ca42d0b8ccd +5e635b1165478acb9ba24f02e429731c315ef0a2cdaf185a142654aa9dcb56c5 +c82e44a81a57ba271000597a99f7111e25f7a4247d40287bb78478b07f2c220b +a4c43a1f1a87cefdd179447e9ea9cfa41aff4ad8d03eccda89819f0039637e64 +2a8f3de1b7182f4237c27429114ce1dd195f546b57ac964d59cb821b2261552b +c8498cdc5a76879dc4de1dfaf3dc15505c0d3b4cda3ccfdc1049a9a5c48fbcd8 +8b74208e6c99826053abf4c2b0973277ddfe6505bb9f77e8a84957e144516600 +73a0e3fcad8c597bde3faa249d2511f545c051ce6461e3c01411ce7945ea829f +d7f4ffd30ccdf757e7039df7deee4ef47a38b6f6f9f7af190b038e464ad3863d +20c2a06954a7f29a61cb9b7daa437bf06f8b6a34426e85c94c93b037098b9aec +5ffa37fbc51d19ecca38b26adce6704cffe57973a0090951da23385cbfcfee4e +4c1f040273247c1f9ef76d20381ef92c9f7bfe723e90e176a34990c19df2ba53 +b2d0a21f64d48d0f2198444c945084f568a04155292361de380eb864f8e5e452 +b37db08686546417a3b87dfd34686c1dba5aeb055d5841c30b1c8c1a182eccdb +876ec9c6a49e02e7b249d3da4061fb63a0342729a26838be79d6939fd0460f37 +fbf36c6a6a76c6a99478551b095c34df7d754a414ed5f0dd28a99519226be1b0 +da01e883e0d5b34e0f2a1a0d23ecac458f135173b7ab3f3c1d9441f8dcfb2c8a +bffbe97cca66b4a1a3924333ab8c79151393a21fa0a215577b808f76b31f5065 +43af482160fa036f80f8ac65fe25d9cd2963ca14ab51718caf8ae7d636fb442e +2e414ac7193fd67e408e86a034036f4a7d1a61557c11ecb9466a403e5b744427 +cf75d3be6081ad827b6db779da50626390603ca0f3adc54afac1febbdb78d6db +776a4fc4bf7e1d0edc29b39fd107dc5974d03fb34a84403ce3b2f603fd30703f +4d0e6c4fe5607dc36c530c88f6424c5ad080ed6b949e968be2b3d3cd9e719e62 +cce1dd547d54e39521e1028ee429689ea3bbab05e117fecdcb93ad8dcd04eddf +f5de8dbecdfbbba43a6f66cdbf3c81f572bb1d4568311224685e691cf31d5961 +768dd919a400b000e74bbefddbc6c9b83ea18c82839f55a3bd3d8b6b900460cb +b62526b4980837609d173a5870465d334de87bd11eedbc2f400c687e2003d74e +605733410e790c0fb5a28c57325916a11f92ee2b9c4124001af738fcb6e6c588 +d75fd336e5b30da46d805767468fcec686284c953049f3d83dfc986fab43eb93 +bccb55c9c0304300f81602a9b9d8c2233baf519c7d72d11a55a2b7260f763437 +cdccdea198ca7cecfd9b5eb79da4772e711c74138a778d6a120fc530fa5ad085 +387a944223ad6cf9a621052e33fa3b64f60871dab95423565d806a64c00b6ed7 +375ef1aeaa10ba8f0843020e3fccdd5a830d79039544981d55b59fc6f2a799ee +124640d4195d9db251984dcd0a0343c52f78904b9c688d2dad4260e7d4967517 +194c29b9313ee2c54939c329da64d5920d26a0c9718de120e577d92af78b8a71 +32180c1acb34d07b0846a34fd494078c06f3911a0bb4348825c3b5a0ea559449 +7ca555e36caea15dd36f778d8bace7f154f8a73535a845a9b3c97ab136eb96fc +276bcb17ee7f191e8441dc025b272c59d4f454278a75f64925e441e40ff9435d +a012b8f2a7686f6128346a5dda941dc2c5b7e8792ea8379aa91c38babc76bab7 +397661c8bc3162de6290736ba23fce40cb1c3827d0c65b19a9a23ce1b5b9cdfa +60a7f0742a4ed69ee7e8d2dc8857cea1af870f7998e6fabedd3cf197130cad2e +7c6d6bd75c1d24aede7d6e0160c67e138770e8ad4ee8822a8782cdf9e5e45424 +7ba28985a01dce99818c05f187e431d62e107b61543a83ee1f040d6e46b36a5f +223a0a35418c9d328c5ce67bfdde69edc88c13995d52c93483abea8c80e083d5 +a384b35c8d2f87deef4048290b34bf3dec299d16f37e1baf0b620a72acaa04d5 +fe4731f88411c7bb53c4768f85ddfdfed7e7696ab17922606163852d79e8bcea +e6c9d902108c24b4d83b5f325eef14c818bab38587b75532b9d38edee82204e8 +20f956e4f87cc7d033d68cb0017a79638e2360c4ff07a81706109beca9258c7c +a60d52f07d102fdaf3cffb1ad14b999234d302fbbe7d3af784bd5fd9d1dacf05 +5b192654b7febf7f71d88277b3990af63a98520f27f65758bd9b2e5c1fb4f940 +b87ad3da4c96f4e1d38e5a7ace307c73e82d7b17c878fc55c33a3699fad5f841 +f9e9d17d92a4216543db45e9f92ac8f36cf01f220e295e1dae16cb50986ab0df +cf7c6785742bc5e04086de192efe19fbb871932c8d992b763b226bf4f054ea42 +8ed3f6a580bb12a1a93e367a505ebad742ed63d4a9ef7c4da3a8f6eb55eb8cbe +dd59afaad1e24a8b87c17f3a9c245dc4a30dfd8b0eb424d94266d61e2f47addc +0a52fa4db7bdb7431e5f80604e95e4091aacc7bcea215e75a7eea59642ac0495 +6c08128c27c59089db3fd75f1fc8043d9636f4c0e3a29e2aa5f726d37876e6e9 +de7e578926359f3cb67ebc2e678267799cfd41f29de2cacca067715e79415fb5 +a5c06eaec36e4cd8d5c818312ffac88ccccad7fe46dafc3270ffcdd78c52f205 +04368ac9f622c1cb7ba8fc968378cf54cb42ebc9330062a9e9dcc466b674a9f7 +c455f575c1840535782c9f4106a47d5695a13f6fce147dae42e1b05784d0b66a +a0c3a36afb3b58469be79bf5887c606490c7f9bc66aa9eb06aae67bc3f6b2c6e +b1abafb3e128ddbd0985505adf6fdb4f85c84c6a2177e9871488885682125b3f +d7ec6d50dc6886a867e87122502d7a5ec8101d81150b7a7c7836ebedde05b5e3 +a2b6afec021c3edbe2911bc8ec445638bae593b0443e3407e3218d59eb85a34a +aa02d5b860324f28b7e8461cbb576fa71515af67c0f061ea0426f9b055f87066 +cfc94c2594cc55caf2be5dde04c6f36cf3261a6f9ab826134c9c56e6c9f76a9a +c88734a060a0ea4463ac6ceb6a1c782dcc199be95860539cbb7b2ce5fc5503d7 +51f0a495337b94fc7118f7101b837651776ec0d40f1c61b57d7e7e16a0e410cf +da4b0dff5728fee5922640e5faeed1e0d6b1e8b87c87e72feb3bd2a7ab8beef2 +c6ede873609fac5274bc1620fef65c7a9b52f8ed233fcea62d37f606d79699d5 +81bd29d2401feb3a9c32a34f15d0ff1ab299abeb05fd27cd6d26d8dbfd91fe3d +dc8dfb290df7a58b72dacb7c24b4067dca4197f298c43ee8f9cea520c2055cd6 +0bcc95e3feabe7e6aa0abbd41dbf4a26c69bfd5c7926c5d4ce1e3c30b3165514 +5258db44055b68401326873a05ab30f645417706cc3fa6522098cf253a851e93 +92574758249035e3ec5e7b3a03f81532d871cbdf738e66261f51b094c5e3e8f9 +480f68e8f26f68348ab9afbd19a49653cce7ffffe8911ad8eb2761696a0c4eab +39e268e261003e4cd0cb15fb36375ff4b2c39bd45710ed4396c1d89563ef8b6a +4e86a73b8d36465b37cd5a50af5f8cf613e7c5fb9db895c6c9827a6e2b1e681f +461dd52b5719b4d048dc63e47fa3aca8c8441376318be1358250f676bb9c4f8a +982d971649a6e687c43b3861050bf5d846c24ce2fdda4917077b1cc4109bd764 +c650199f51dbd309877c268e750230d507e1140caeb2cdfbe1a03ee1d0f4906a +645c9a378691eadadf8b1f291e32448f930e74133183379208b442988ae5da75 +22cfd3cc728a5dfa50dc4a708f25cb851fc94f5d82ebb37b08ea28b43a882d85 +b4d454ed11ab74d0ed50536577807e736fc6cb07a890537ca45e15b3beaf1c98 +07941b3a172e85c4fd7dc90195200036d413cd408eaaa640659e9826d9ba553e +215ecaf8680b04cefe02fb8c0642c028f530815b2d2e4dfbc600852a7412b963 +bcfa31432a96e066ed29ff731b75dbbc801442f521ea3f4306cfe0333b4efb06 +840a81f213bc075b113050e6ecf2c18163f3329898e167e36729340f0cf89d20 +b34019ad3e8183ea5f666cb5387ec8ca8a6ad62b93f3554fd43b6b1a21dac8c1 +75299570f4aeb3c51b6bc7cc3cb80d0d2789e99625a37396aeef59bb3c661761 +47e02c3fb22c4199da98552807fc8ab9457ce81ff4ea010a36b0e319f1e98bbe +a63056668a65b1822cb57a82551b1ab33fce67bc20cbd56e559bce3c2bdbdde3 +ef5d1f232eca045018b639b7378fa773c7486db53e1947bbd02f827a7e19883c +078778e5bc7697a9e474804eb33c2af722dcaed37cd14e8ce92d093b83335eb1 +a25a6d99c7e286941d682ab64f098e93a252f959ba4e9c3ae26dfe3ff8a1a3e9 +b78e85efab7f67e5eb32d1f517d62d35563092598b0748b26c9567801223e93f +adad3cc790b8029939db16ced7889de68a1767f700be22433b7494a079d6c85d +b3816641d6ff42b5a99e575161254ce929120b78f489a76ca4f3b2f1ff4eae62 +16c08518955fe8e4e8efa4cf3dcbdbf512fc6be7329bc046d61acbc6b19540b2 +52ad79177053337ec4fc094c977cfc6eb036b5059e14b7f92782299a40c88209 +f7021f3d155b2fc306e7edcc98f9e93a6593caf8b4e5561af4088ac9c2ece955 +1b15f8b538d7f41731dc09acc707f08bd8a59d92d7d7eaf5764bdb7c5e85547a +32743157dfeeaf3f7df8192a0da2cef45e1ff911d66cbfe005170cfb933d8bb5 +85d93708c87e51efb522944e2df9fcfac13ec7079e1af32d03e233af8ea6604d +4d906af71dfd8abee459fdeef767a385b15d0e677b5034c1bc91f047b46f300b +db6092c34dbff505b0897ca086377772ecb27b9ac70019cac5333d10b67b5b71 +482f241a91fda05af2a4abdb351c42672b580a25f01b79b8fede4c01051eb115 +c64485e3ba4fd9478f9172d6cd73198c318c9db59f71ad709b9d567b4e31e2c2 +8d0b93a1d24c82b50f01a070a952a079e1e7f9c2eb4bac979388d99a25577f93 +57d9179078aa0d2f7a8a65d58b8741244e3684285dda86cf3808e68b48accaa9 +5b3a91fa39542cd3c80bc5fb5d636ca5ecf506fe1e4e645705bdb10f9fc67a56 +7597dc5c9a1adc7b47c404c06ef16daa37d8fe6c952e06d056dd15008ad2e796 +15858275270c5804432e91c7adb467102e1e7ed962f04f3f6d39c6fbfcd93f21 +d11016f5e65e9945c1442ac63b535196d65cd3990d94128f3701fc32d1079668 +12749bfd5c15d965c3174221882914a1fab5495b5fd0d7a7fe3b11935c3aa6fc +470ab52a32c9a9fd1ddbe800b60f3f24d9d9147fa86d0a0925d7140b5a04a493 +f3ad02d6c352a1f6ebf7ae326f6ee88d7701ee907c88728150e0a2c214b13f12 +e7d5d83efd62cfaabe68f02fc23332703c02daf224cab53c624dba61b5ebf164 +0205dec482b3a52443d207a11d4b4ecbef3dbcf17d48759e7e1d69108b4cd456 +d263d15d719f5230cdcabe96dc49df253b44aa047fcef75ddf931cbd6f3a2a52 +c23eeef852c1729e23e3bee93b0a5085913f64b7c3dc650432ef005301062a5c +90c400852a7412b963bcd035e6942cc8ebba9a1e3d3353b26769ada213428979 +78a9f549a86210d53598cc1da57b8a7490ed6b8368cfff93578f979d16c8819c +80dd050fc4aa8ccb4f7b2681245451d0d13403841da091442013a6c5609c7d68 +da409a41e4d90f36d0acd74368bdaa75e618883eac528cd6cafd20754cea601b +33b0a58b33669ef561745830793f5a06e72c0c8718d24de9f64af17c50beb1f8 +cde6ed0ddc136eac0fa98d9f0ab9bab94d18d86a7907c2bbc50d69d07e3fa905 +68145b3c0acf303db053c8a0cf1d7619a215f6753f804c6739ca8c1017f553f6 +48d857f926d74d15812215b7fd87333b8f00e65c81fdbc856f1323a342bd0507 +be91b5c365d7f895e9c374a9b8e0d1413220403e4b5bcbfe5a5977640249a233 +fea8f1d22ac9f6e506801c4a68e9f8108af7ec2aec0ebefda8d1ea7851c0b226 +b3b8a76d93736c746a351ac265d9de903de0028a2013af8aafeafbaa8c2d1d54 +523925d4d606b13bd04f0e41fbeffae0f00d89c83366a1ee1e5bc0c18ddd134a +ad7c32a0a25b921b33d91846fe945d785888091c558e3cbdeb761922386ca63a +3ad37a2fae3f575e40d1223b416c798bc3732c6dff964b29a02714911858f156 +9c87d427f5087455da19f24eb75712692f3693f1d2ea5b3f40e9f9eeb0f0f8a3 +d00a0959ca4e3bfe8c4804a429ddee8d842c8de8312610e2cca9cd33c51a5145 +e7f8c8b97df06a0a023a43db46268c5bb2247df3993dd4536837eabd9c0d381d +da84bc4ee58e730442cbd7966e070d8be71a0b24b871027bb3d586d8cc2d6fdc +917ffb3e85d5f32acebd3093e53c83bfe41242307d774cb3ebad79ceacefd887 +57a0ed1ec8adf7cf1952411601ed59f4c4be8ddec78dd26a10c083f6f04fd83c +705ed42a0891a5398169c528f7911cfc467cc6df8bd5c835494aa1a7c5bcb836 +40e6c78e60c19dfce997ed6e0dfc88fc01b0349e0455d4f22c06c16f7b9ed61d +9ab3d5a4f6e2fa2ef4628431cedf579db02dcc30a54d6c10392ee4480af0998a +b823cd0f9484c3579e90dc412967faecfa026bf654602f3bf6b7a6ec54350be1 +c836493fc0ded9384aa53b770cc0f008329765ab5bbb896c3bc12d21f37733e8 +7c7258778a68ae72133f40defc3a817a72c8cdfb2c2614bb84fdd568d51066b5 +5d9b4dfaeab9dc73b2d489cc1cd29461be050cc6e72b15bc7fdabae2b7792d34 +427ac97a386e31161bed431328c0ff34725192b95bf911814a98e09faa5620a4 +0af40530e9aa937d32facab765ab6efbded9066b7c6a031db5b0f34826719622 +ce9203e7396fea2e7d5cb567236ba11607ec8579e01d0741a5dafc86a49a3ff2 +c1898d961bedbabc3bfec4a4dc1ff565ab27805c0f27dbd4db1184ac8d13a66a +03f3477e9303aabbe2e8f009506fa8e03e14c9cddac07b991db50356f7fb7a09 +86fa0dba919eecb006dbf46b9770c52bf38c992c1cfdf487bee675464fb41020 +70cbcd98348f290bc9f8064271899314f5d53cef33351b85a9b2782d891f4fe4 +f0dae67dd58fd46c7d2e3451ef0e7ff93c38e92685ef30660a8140aed73a239f +1adb9547e33369457d849e1417363508961ff097241ceeb0bea7a1b8e350f680 +f5194175b51793efe0ae38a9b930473ec836c99e8c9fc220700f0f6577b77fc4 +5d69bcf32455d506629cf1b15af57f244eef2bb5b824957ced172fd621618fe4 +394a3b3f1a72836c4dceabae9190c3de48bcc34945bf21c468308590e4912896 +4f331cf48a1764a4f828cdb11fd36fbd2cf546afd8cb3ecedd7c0b9ea5bb0d82 +8bf269ecc868a9dbae49cd5173b30d568ded26e6c229b09868ccca377bb5878a +390e48cb3d4d596e167fb5af544d01a429280fbce6caeed0df852406611e3f67 +b1e07a92c58e9887f39aa3b65df90f27a2f9ad203ef4923009a69cca234dd41a +abaf30cca6b13d77e38626a228b59dee4c20279ddd3fb7e47f3630c69ce918eb +0af51da83358654b2b28c0bef8ddd7a22261f873010e35adb40f63bd5f6febd3 +50e44cea34928aab9cbae1e6ef35e713eef769ea2e06f1005235b567cff130d0 +8b6dc201eb476bad95426e3c9a7df4a803ae01b5ba4a764dac131bd273f17e48 +c1b0bb228d5c9ad4c39262c4ff6d98547fecafdae4ec0cfb0c04dfe7982490ee +82ebe0e712cac8b2ad4161c88602e87c68c7254fc019cbd98d1deeb991962910 +d44a6e8d11c2afdf94f140f4a94958b0189dec2fb7dfd7ce510210cd76a88254 +b832de6879983ebbdad0220c8c4d5f7c37a55a125ee681abae550575100e3cff +f5ffb4e64a8d0b2e7bcd2d6d016c598c6baed2951e4e5110be8b5f4c95ec5583 +44cdbfe4d78f21b0bbf5562a9325fc8c75dda43d30c33c3902821b9a6041483d +3f4346ab4b036e583674418db32c71d2a511103c105490b6fa774b61b7e03216 +a466960ac2db48d0826034e4eb74f2a95e735d9a2a048e4eb159e7d6702c28dd +3a1d5a390e4d69e0da121673719173ffb31fbca5b59b86f9d65edaacd36d5e30 +bf872cb7977a3894802498d20d656d9d9ba7c997450b2a3f0ea6017ffb5c2a9e +dd4a6a415c6c6bea9497313478da8630a9417a3a77ef6d1df9aa2ca014eaef96 +8ee377fc0b90c42a64486c4145044c72082e76fd9620d2335c27f87e169f7f9f +b4962e06d98165ab1017436ccc68830ef42c904ff8d738ee2793526d476dcf19 +b51db620fafb84cc7b2188a293f0f7669f48e1d6ae0d12997432f67580c4e36e +5ebd336638c50ec777965083dd485be6f550f9392441e53a78068e7057a8495f +25406380eec1548fdbcc215d2417ed3a1a2db029f9ced3c0497c042921c72b8c +566fb204a2f3adc54a88957260553c33301bdcec98b8797e1ed36d21a22686de +2bde225886c16ec5d132ac0e543093e66568332aef3bb15f85cd442a8245bab7 +681458364ebeac7758c2c4b1e0f6c9e10e5c1149cbe99651944c29f042483440 +af0f3c88e181722940dc1a8a772d99f2dc495c97367126b14053de51a03a7907 +a725b1dec299588f81bb1992ebd9db972aac396c47fd229fac4becd1707ddf8e +8733e447b03c1a671dc33557daef6c83be6fab0cccdc1eea095e9996131eae50 +cc9831922dec49ceac282b5e1c0542a01a71bfc28e91bbfbb3198d33901162d0 +4285a62e07f82b95d0e0db1cd8bd664f1a6603687705936a87269ed00616b505 +dfaa558c8be45f0425469904d42239b24d4ecba5efe9b29998a30ffa6722fa47 +5c5c63027d3349ff581f3cd71c9e948b419489485639c46ee6a62eecd082d89d +639ca2a26d58fb3789e2dc853c4b6adaee2a45eda123a1620204ea143d2926e7 +049dfe2de7e1b4d14dcd6ad90dcf1fe26413ecda2008dea0d7b7409b5aab672c +40c71aaf8536602406bbdf5ba17970341c90e60db0f8239f5190f0a46ba0993f +f0ba8eaf9c45f1ceda81d521fd353072b694334473fcf3982b147d22911a76a1 +162fee53f301906e20938bf6f38e0886b9d340fd23497c52edd2b9319e9b40ce +1e87a94353d01be656952db686e4fd9d22c0583d7c6569e46445c01d06ea3cc2 +6a564f0abaad453d006cf3e868e2bb4e23aa6a93542b0c4e06d839bccbb64470 +e689f85aae9034fe57c583a30090535a89c22fa8336ce9cae3855b6f3c80f1ca +67db3c3d9193747dd24fe745496c12d951180e7a24bec0cf5a5ffba06b925895 +e2463e2046eafa6986b7299507002ce55df328059434a08817f76e1c0c6fe864 +c5d39048e042b01e35a86b322ccb2656474f2a0afbc1aae14543e72548dc927b +d1fb32f689da15497868e14ab927ee6efbf2c1c16bfcf698b77b190b57ad5f48 +8734baad1e836f0348458139a4fffc8f9334552de099ee80c11e84697389c795 +93177a0e179949738c19d83b36986a769ce821736a3f2f69ec82b7e19c2f25db +aa99e888592bd478b2cda54403af0786702badd1cb8e7af2cf44d98d142fa824 +9364b1e82c0bdfe255739c7aa1486de001ff336bd84d58d845dc77e573092b54 +9b2eb4d4309d113be1cc36c3e3a1a8fe6ba813e147c0ff6be1358865383a3b4e +e242bdcdd2c4916d1eb595b6a6ffcc1532a60463f8e0670b96dedb7540a0233f +a05467deac20d5544fc026e83c80fcd3b4a227598a2b320418cb2b37f132f68c +048cc26f58904d1f6d0bcc4c668843a86e81fee25383a35514c6b18a0ecb0b81 +514d937fd90e3b70f3cb83a8d06a9bdeadad9763a34098a306a7d38da2e2a32f +fc202db1b3cecd7a99d4d778287d34a1e5ddd3f6aeca5ddd730facc26899f838 +06dec4d2a4db94abdbdf46b10b4f2d11b3c94a8686d210c350759d479d995a9d +33fd660b16c4ab555dbc247cb559d6072f44491b32423ae4eeb761e271f304b4 +dfcbaa03cbb1833c822085dc6d6aeeb436e24bc0639e5cd4de306a7301f3c077 +2dbd3289cc3fb7822f52b450641a345750ebbad08437bf23331bbd6ea4e210bf +b81fefd3d410330fa1d2ce93a534b3772f4bce4bf5335881371940a8bb302e89 +6d5043f5c69babca785c3984ce2ae8128d861ad78270ff78b7dd3678f4a9ddb4 +c6d4442d0780dabd78e652c2f30bb993f28c669fe05b9eae576c44d9a17ddec5 +6f49682da228f917c955fd75194d0361a30549f677c8d4df6c215281218227dd +b5893844ded6a908dfefa52d3c80a46f92701b8e41ccf0ce82195cb1584dfe0f +ae4f282c2f0702f93f9f73bad96b899ab06604d48fecb0f4c7436dabd184d62f +f3f35cea68bbaebaa8473f6278321982e1bccca10dc064c463e02a4529d9047d +da5b65ad3fc13009db932c0ccabf8318e4309516c19375ba41440c70028f1773 +f4aec7ccfa41b60db4a624a735d27977642fd8a9061195104d8ec81f0c2a5534 +45b3775e1fe556db12e0b2785f3e55ca8b8f8bf47bbfb555d0cc2c4d2ed879f5 +4f4efff486b3f21a12f89228b2254c937a7f6b4cf97452063194ff23485bd3f4 +c106a3bcba156b42e806e6238c39a0ae0d06557ef260df0dd1bd149caa76fc4f +b12b7f2188e627afe0890f16d8a5685d5feb9ae8f0031f165f63b5df63f65aeb +2ef56f80362ca765f6e24056b6f0f93491f6d8dd1d90d7d4237158ce11fa3102 +b40fe936dd641afc1d60891acc80967b02ed9d83a464be8e07b2f80d65e3926b +ed7a2075d5140f321b8dfebcc4d808d09f80311996e7822483ad59a870bf8f17 +9b376d66cb785fb5135dc1351432370fa4060345ad5b69c7ffda0f2497c8c12c +e10396ac141575a04a9a409d4903cf36cbf6602e09d0823f9498d19fea36330e +bfa209fb096c09b1e2fc8491c0124246be6e1d4ad452e43e91b30d938b6e7e49 +9439ae5c62f36ebae128821bb90753000bc9db92ea04ff6c7e34343348a57af7 +90fcdb72efb25a14a687df7dc3b76eef16f96c649611b79d640516a2f9e81874 +c539df496f9a9c14c1ee4012f41c37c3a3f2189d91ff8570899c8c2e07017bef +8d2ee37c6588f896914bcfb8d551bb15fda56c856e08b830956a01a444a8d2f6 +72b6f8ebee46542bf7a9f5a6c9c84418f840a01acc612c65231ae2f4794ff8d3 +c97c4cf224c3d0c26355a424cac0f2d17a056d203b523e03c60c4ef8a715a3f9 +5d879a4f344e371af8c675ccf394957fac75e2c039ce7708a6c7f5b46ce6e34f +4df11daafa6491a63a46b495805896acfe5034d037152c41d9997a02ba58010d +c338b23f185b3e4e3ba1fd1c8284f904a112475a08d3b23a92213e7ce51efec6 +297850850c99b5aa0bb31c15c7fdc4aaa7564c0dd664d334a17fad333927a616 +21bd7ba42819171e14abe2410455ae42b2a0fe9db7693ed36ebdb6305da51a5c +7cab74a7d6669bbb23da061c5d641997b3d0e55d06ac1a41d17ac326b874b450 +88881784220f0829ac2077e09bfe9579b078f08c250f94931824ad8157402a49 +45847593275ff352dbe59296c2b0fc96a2ed97dc6f79b23e3796dbb309145e1a +aadcbe232de323bc2a55b7af043c39dd4113d560558677e8a202229b3ced466d +e37abdb7473b21261cf96e2a2affbf7c6dbb3622de6661a90bad85825009ef2c +ca808bddceda30a3ca8aec87f960fa7c85f215b393e11e09b48db55f01cd0a9a +aa33a40ec2dcd70df052bba543d2c22c9e93b384bff9055b426b1cecd5f90ac9 +574dbef0f9f43d7005b2a9be95113db7b12520811d99df5e4e979a5adf762bfc +5d0d4c3c8150715b7f319d35875a7adeb182c37521ee80d994054e902cad0489 +9176a8953d4b6e28f541d608ce5e3bde32099520fe617e9bc9496df113a43d90 +7e1b212d24535290ef66c9833a23fa7a66e7fa11462bd210456b6edbc16ccfc1 +70c322b65330f4251d6bdeea11a8a0e58b2d438d7f844b2216aa53354464eeb0 +77a06fbfb0b72f8ee1f0bab6d0c6b27f94965bbd6260c70dff6c08d4edbbc4cd +5a8adc974b690fdb53b51ce295e6b2b40c784651c0e78ea6b33c567568d1ab87 +193d2feb76ec18f4f6394fa5508ec4d6f871101e26c122b7fe132cff7f115e1e +22b3eabff49bd9deec3fe09317e00639fcf82f835e6ce7ca9a65e294e869e700 +1c85a71e1b3cc1a4b9716a4a2dfab2986cac085e176dcb45091a01ce61dac2ca +b5306da956147fac8a3bc131f0d8f31953813f52748e70b4c8d94a82c17d83d1 +a8046f80956defe12693eda56512d6d29095bb1d42e36466f6fd2b7ba7c70bbf +123d753593f2b6373bd74d40e00d59b2be8ea60438e42818821515c417e69bbe +c457abc9204f0a8ddebb88c44be364b358e2dfd117072f125c71bee9801801e8 +ff5ba5b44b0115ffa676f3bb99aaec050641fd9f5b6bb095a682b52c64ce6a75 +bca3587e2ee13f2ee022fc905b3babe03f154684ff226990c2ca27ec57100cb7 +dfed37c5f5d52882eeaa64357be3c9ed5605380445bdf2bbe0dc4fd5af17a3ed +784a20539621e6e1b889e75aaedcec08db740396cb01aa753130f4b0118e50a9 +dc10da6a1059f331df49a25e98103e09473304e099d8578f2387098e380ae9fc +f91f9ea36c0d900aacf7fa9dc3ce29b984e1fab13532aa4cf1e19a37c6b4f78e +da75b81069ba80e1ed4ef2b9b5084e5e1dcb8f01e7da8ebf491ec5924a51294b +81019480bafb622cfe2e500739bf8f4754e7e3e85e04d4932a71cfddb8d3b6cd +0bc90bb7b839be6d8c052d1f0d93c833811b452403874b2a5ee226631207b6e6 +6492248559db1ce609e516e659d6107378a2e6d51021473fca2f1b87dab66d98 +39f607dc5eb0c03df892baaed0345514570988eb4895e7765c5bc42d1e76fee6 +b05bf0c77abaa0d7c5d6dbf2f7e039f04f9bf3b9a71ec0ed91e3a00f725bb1f0 +c74deed454f903d2c96cf70a92a048b05bbb624c091e3181c607ddc2477ea47f +e76824c0af0092a62aa367448a10fbb6355354c5ac0737c69a4d641fb3f2d80f +11f64eb4366df7060b4e849261faec37ff325e7f583ba04ad4fb37d6cdfa99b3 +0d73c662d1ebb1af64a2ed168dfaf80fdc284dde297efef48134cd6483dc1bc8 +e46b1c3c45fd5d4bcef85d9772000144ec49dedb9cf161792333104e50a27b2f +1add3398c121814015c92096fd6d3b1352cd41d2eda7f3729d45c1d288b0f560 +17059816840217f1ffeef482ae49ca6b376a5548b0edc9018cae5eb6b1c33c41 +03642f744cffbce7898e525b1e8ebdf8cdc7645516fdb1eba4cef73d18fbf4af +3517a140b206119a0d1dcac28577aa115ac29be7de2f9ed1f679034929c48870 +a6d50c8fa1779560b1f5b760450db3b8b350ca3b2890d04d3b33f19aecedf0d1 +ac01c613d992b423891f9ed878c8840937ede7d8a1d62fee5f92826620d801ec +3c3edfba8445cc52e5f83e01ad27abf5c205eb022ae6833c2aae6dd550da4a97 +f10a7e363afc6d53a274c0fe41b83c171785880b637434b2c8c4348615bc9259 +8d8508c412d17099971aab2bf372b96b0b14ad90670ad976714d000373380258 +4b6462644a34bfa6f5b746fc0db76690d52b2229f7c79172184fadf2b5a9983c +573dc0f5c11aa85ba845f6e4f5836e95636c8cadafa8671b2632c84e3d94ef2b +ac6565267518e2f747127c6f7b13b4aa888a5ee3869119ece0b2b447a5343edb +f0996b80d9437e62546b137e22735347a684af93cfe80ec102a50516092cbc03 +b0e52d5e10b06e447c118fe2bcafd3ba6babed083ab7d423e7bc5c862cc06dde +56801534f09260d1f246d070f094f57219407e92769952925bbd0cfa29a523b8 +fd3ab5b278b2a2f12c89e6ed1dc2bcc4ba69e6452869b246596f71a310af0867 +c9aafc6af2c88f1edea2ac2dea51e8fbd72eeb0893a18706e16ce17a8ac44545 +ac68951c0f284b0149b71d924330201362ebbf72dd8e5a8a986fbeed97e5ad11 +cc913858ede949d8f732f742b0d73ce9c8239c077ac9d24a80c03c0a7daae558 +f17d2310822d33918f75aa835b5b4f9fb61730fba8c55441218fec3c4d1f54ef +708a05f6fcd38a51d287cfbc58d92e5f3793da39c0f55eb9fc03b658567e7474 +557de727bde7afeacb94c90d0b38b5e9f9b19a14d7c73e066eb556eb6ce393d8 +fa956f4b75f6aa4701d03360f1f354e1bcee9b167cace1605718f337dccf8cb4 +57c3ac8e3b5b730c60aee2e685a80ff8ecffbc005dfc5f11c5e338fa20ca3a43 +9154621626157e9efbc0b390b143ae736dba62723c99f5efaaa02a090b8aba16 +1b712e55d50a2a6bfc06b5eb32ddee1ddea7bda2f176f0f1c533810137262a59 +f8b14ec3b0349ec36bd0b8bae99368d21c4dc0c902e92dd73231b03a91275edd +9250f14fff4457350c747938f2cd6170e6b8713f439ac4e116e70f00bdf5555a +99a7162b703b45e92f8e77b50e85373f073b6907f95839c6f6dd306aede407d8 +642113e1bf2be60a5ec8a64431cb46f882d2df7eaed39c326c26327513b3a647 +9ce800635106cd90cd7f0083d2de423a5b9e5d63c49643d3e220aefb899f491d +28a30c49abdd19ec4bf66677e8bde6e43e222a097398ed2a9e9933a1d5ca87e9 +cc6cffda1deb6d13806c2fc82c4b32dca80dda4e3945c6589e9110ac91681603 +c4bf11c9d5510fb8d4de96ce3177297b692464776d9c07a1116b6369204df7ec +4592550563d3212b50bafad065887b3c369a7810f98bd521be06a3b4b997a6d5 +e0c5ad7ad8aae5275f400d86a6f09f1bff38d9d7220fcf688212eeebb8712f1d +74ce4985615a59c89354c1fc0975caaff671151a561edcc2017b0de504974190 +49c53f1f17162afacce065f1300cc2571a0f9dba7d21d8488372d386c41a9fec +bd1c7def33329827cc99c7eeb7e5b91607849173f68ce09a2aff09c94145aaa2 +76cce38832aed1a437e8206426ca41f49c9e45b6f581faa8afc3b47869d5762b +793b8d5fb6f0ac9c391d49424528ea39f635185bb7192f87b72acad339471ebb +decd039457a71837c2f543652284f1f40f82c38740c2ee36b45d620f004246e6 +d73f8777ba26c7a7e3a2413fae9b7dd37553169c7209790f14cc03c08d0bfa05 +6e72e0184d32cf070f685ee4507b79b21b353c6f228aa087ff469b69b1171567 +88fc37c39977e09d1c46456f1568628844a542736eb0ddf3fe3d134b7e78e87d +b126702e8ec60839b53c363090f698c5c11643a1bb63ef2d2f159872efc68ae9 +a96666fc8ce25cc0e2b47fc82f5f25f7b6a732901cc6d4295bec66132cb3f175 +42cbb4d4ffed7156beef36446452cf2992e8d9ba3735269ed51ff32f8c915b8a +f0050d9a1136e352d4eca8ef9ea6c1978fe689c8c563b8faaa1128625d9e91fa +d173c8e2b7f94f520098dddf4483b12abad73e2303098ec46b603b08f34f2bc0 +8ad44e897c2ab11148728f4de8f0390ffd947bc424f0f0f1ba80a107ad2e00d0 +ff4e76ed5b305b72b72a07e43f98093e032088c52c07e3f77d4a2d417f141512 +43d996cb0867a056befb66f052e1b65b37d2eec54a802e570c8b32554b794392 +3280107fb91a91d5adb4adeaac86a422717603de317a563251073bc740f10928 +1df7669744f5fb89e3f460bf820cf006c75231e979fe162fee64786c144a19fa +7ceb1da2096076fa0dadc7bd1522014288aa2fc96baab5078db3de94807f3af7 +854cc320e9f70da4efa02d38fa65c15801475207a09d254a1bba489b78a8214d +cfd4da769a8ae060fb4eda4b51d780928bd6315bd293f6c6b0f3e4a593464f0c +55ce0c1120b2099da0250d04f792b2270db2d7c606bf80e7a56062181f7da864 +a42e97863ec70187b6620559b29207c549366172c55d7f665952c8057a4f2152 +a69f772b065d414e65f57719a99cdbb57872a86de9fcca4dc7aa32b666d474e3 +d20508d06f0cf028521ad7d46e9c25a40d1390ee271d2ba5ddbaf7bf64585c3b +a859a2f3ab88e58f72a1485a33c419187fde432b697809da526477341d7433ed +f38e1ff4fe51920404138ec6403df7562e4443ea091c620a13603ed0388b88e3 +671f7436193eaad4cf55ace6d04b79f0389ce28a1eb223b24a9f8c92b4f5ca3c +0bea3ec00a555756676d77de2a38e35375b82c5192001446c8517818f18be439 +6c900f7e1587969d9bf8a9fb5595bf055222951c2b0392fc387c258c8cef50be +7696d9360b0f2d4095e52388b395a10096769586c03fc96a69615b92b9e4d3bc +275229ea8df5c72ba0fcc67bf8c1b2708bbe298cf75d1a97d452d51743d457ad +7d25ea5484500f4b086bdd81351f71885845fdf5e9129e8b0833259146dcd34a +3547c21e093a4fae7469620a88a126e0d025d3e50103f66357e2e05985feeb5d +4a9adb2db82460076845e54c083a2874aa56c5b95253a1e8cf8f1e35448577fb +8147f62f33c968151352488feb6fa978676c9f274d6b11f7fb65fd39bcd7dcce +7846008370dbc907341269f7d1c355d087fb176fe06836511cd9b01addccf580 +f68010958b8196f50277dd16f3039a9aa70411fd94d1b145b3ae34d5304e6c4b +02fa4b80f3693cb6b16a70dfe06c132438e0e56c4fe504e1923196a58e04034d +6cb67335f4218b857cdcdc928f3cc436c63f10ae872b93788b9a84b546c3f504 +7bbb0d419d7882dd1f7bfa5fe8a1d1c671ff3f56b50160cf4c23e8bd55111d03 +eaa7ff86ce5762687b6136f5728db1b9a1b914c7e2fce70c2da513594a989437 +ca8eb6792445ff806e502d238984d278a81d89b22864ddb0da2e49658657cfdc +6214a570113a00e55812ccba870feb01f397f010a0377a34fbc8b052084e3d75 +5e0bdcffcb26045c428d8de34af04aa8b7a5031892935c16918f0ab2db811533 +545d35799195310e5b109688830bda180f096fc5dd2f2cd98801466cd44a2b50 +68e54fc80d1d80c9f875b7e75860cb406e83132f5cd0813757d75b5bca06c62a +fdb7f0d55e94cc9a223c0f9eaa30c0a5c13ea0fb857fa703f2844d829418ae2b +968dee2aa785c07ddf773e30bd42ee89df6618796171c58ef11f6570d21b89ad +55e4ba58fffd7f112dbde6afb5c5cbe7d73b69b5a25003394ab6e0d5302ba575 +51ec63112e038b79f6b9632012ab775ae978f4d94ffa70e5d095a8fa0fcaae76 +18fa4fa41df5e34e7483c278d4470abafca5c110f1cbdc1e9e10fe169342a2e3 +6ea635ecf0f5ba7ac1fe1d11f661e825191ada43218eee5f5aadc42436c98789 +e7692be875ce211a94409ca6fa9b2bc1d67ee0e375b83b62feb2671b75566620 +47c9ba88ebd7f795c9c02e63cbfef0515a62db218f4e5a0c81b00bfd6ef12e8b +7bbb8e9ab5a1be0c2773c7b5244d7a815d95644a188ce66280637dc8cbe5fb16 +f2ac4a45a8a8a3e13bce53c345f35b3ff85373a8733aa6777008ae9329c7e54b +9fb18b1e137e253c72128820e04c7bf47189c1d1836f6df447ff9efc0adf7b0f +09c1032853c67fe92d961a91e70add002c0b8f56a07c3423cefa2e5f65b028fa +ddf99e24090b56e5be0173e8778b5c45fed11fc0c0ae64a824bbf77f1150b9b6 +cb4f96ba0413fc37f7590955d075120862015df7171ea3b49fe6b0f261db75e8 +5bb33fe6043a19688ce286573be42c114a0495cb2cf6f642e83674b5ab17c7a6 +191c140c1ffcc54d70e2b4d1b82fd0aa1e61583564753cd6c5c0d6d7743cfca1 +f6fecc0f51f247b081cd7fcdd498da22d5a2c8dec0b7a9f92e252f63644c50d0 +874617703ecdebf7ba8933041793391f67ef138fe0e4efdbad4fa6d7b01c1f01 +b9eb2868632c20ec8f3e34055f6793054bbc31c111686ebade4b4d44a9b69021 +54cc2fba1fcebfc1943433fb56b10b60f5edb160df0e33e7e98ff752060140c7 +8511c870920c2369a0d6d4dfb687c30541e014bf4443f665a24a5f05d5a21acf +f99d9131495b773e42e3f1333866f45dc35ef9231a00129564d194006c447bb1 +5f341631210376632d90120ccfdaf8eb6df5e2cb1b9046cad64e34bf4e524c3a +f786121f9136672b6bdc99baa00d412db7d5155c94796da2f490cb441786569e +769561942b30cd8b72d01c11434b9a64a82f73be48821291df689324a361fb54 +c1760ba86b250c9a6a2c855eaf318703d4b6c23f67931b376f48dd3d87250ce5 +7614efcabb4a6b8fb9d332f121aa8e83edb6897987ee25bbf692d1c243e6b592 +1954fa91ab728b5844f0501a63abfb7f6c8a018e0f5cd409139ecda8b427754b +089e9f71a74c55b8a0c7d3dc7ffc478e693ca78280c9b33193e82383627bdf30 +771103c535dcc00c7d9ca352f135de010a9dc95780046bf75b36e0a284d8c2a7 +f3b6096d905dac2abb33764249b1bd61e3994e96d0f3c1e8cc9959a404dce763 +31b01ba083a82d6d0d9cf9b163bbe2e84e01a9eb07bfa80ac69babca7e725fda +43b67bedd3a23fa3926300349021c2337a5dbffa2021e05d26207958bef87ba7 +eba130cdbf56be5516c5ae4441390e999822089200aafecdccadd69169a27414 +1c0bf4ff1be4221b4e6465da6e5ed755568f79762a660653e10ae8d098471457 +9c6a90dde454ca311947f0d48749b14e04aa65a9d8c62097998b4d78e171f166 +40bfe92170c33de5ce03dee2bb50a656c2748ee8eaa15951da01771acb0a7c97 +25eb74788e6c283c6cde569ce52beaefcdb29f91dd345ec41b585f1e2dda5b29 +1e85d3a50e93ca8caa6fec04df003df18120152d0540efdc4020dd6475233f7a +1bb0cd65e6e389a3d714455aa5341872a48c01f9f3451f0a41051340a9276afa +50473824ebc231402f4ad6e35ee9d50cd89d2dde31cb5cb47c72cf47ad6e8538 +e1d41960475db823b56c20845107d5f2ebd3515ba63c00b73f9f069a7b2d8cd1 +862b61a9481a437aa4efa394315eff55fbd6ffcb26ed9010daf763a3806da8a7 +14a1e943547d733eaff9b1c8ff5d7ede9573851877756c99adac534773a87ba7 +e3e320ed16d4c383bb75fae51a0bdc694cf4b945a389878d38662a3d3b6287ed +d505ff4d7947250e56c501f630ba5066f343e550de87b42ad8eeba15ac21de34 +ca8b18eed081283179a71ddd916c4efaac62f0603685530d08d499918b726311 +ebb642eae0db7fc91554fe6e77580244e6f3dc871f6bde18a80d732fa6f2f04e +108029179f799d54c7eebbbcf6c013641657c98fc17d652a9b48d15204936752 +89f4312216dcd0605be6fac8c1994dfc7488f89fb2e777297b16c95c66e4b7c8 +5b30681029156954c59c7f4009e6e51e5a218de4722daac7b24176c9184f8da8 +150df8d26760dea0757344050a36ee320d1e71dafe9fef9bee08c93a2ec25d86 +310ccaa2c2b42c87298b238b449b8e9abbc89b9751cb1b2d86051baf9d84ed66 +e4123cc33e02b6c95f60d72dff4ec2e59c0e85370ee21c6ce7d2f2633c69f037 +00608a7d4c67e14d6eb9782762c193ce09d9700ed2207df978ac96d967f64d7c +d1890a7992c7b1f0a6240d53bdc279a1e9809963532108114482b30325585466 +050647c568823771ea8e227bcf931321bdc7699707ce84721f3a8d9247ab7428 +2eed6d1f734244c0006db24d909c39575f3c31d67c4b06100dd37c12637e23be +103d0fc36c3db59bdbe5c86474269c394b0d910ea9bfb4f321724e0b73ef96e7 +542bdd57d34c91b319d8ba7c692608a0c0db47d5c8164782c5f5d9a438c15afb +80c7545832948717eeb7f6b646c59cd2d44be1fb792e9edf4a938f887304314e +b064e64acee79563271364ccd68552bb354d1b868bb91aa38345a1f712bb191a +44267a300c19d3ecb9c756879351f430eabfc5b596f63a6860dfc94cc6ad909f +9815bf7d7d885b62d3aafd9624ed5eabe77acc50b5c8aeeadd4ad79e01f4fcf0 +c0bf6c0124da07e12348419aa115c90fad1d3a6b8d12a9d65cf3c7e8059eea56 +29a9a09e7d2df23e180c19734acc46356455886bd9e1981ad86ab2be96eeda66 +87654f6ea6e20c95aa61c9a50117db0a647ebc8c34c55f158ac2085ca23de1ca +02b4ded478ca08c4686527cff76d641e0097f3cda433911682b399604ef61c89 +901c7da40dfc094df7025b1a692c159ba0a743b1550f3c548b2c5f7b33016a29 +a370407acf516e13a466e03a8a71ae6ccfa498d6ee19f53e258c3644a6e86852 +7f76d2d673ac3b07e3e23554886243d94d7712d778839a0c754a8a1217162b8d +a3ec1006d9d36dee27d54e4c6e256f9a06db8a5a752a1f56766f0c6982df002e +4201c9988b769c64aad5446a8190a5b5b3c1f9bc8cb6ad24c9beaab17c17441c +4a9a8391950fcaba005782678466b3659c7eef7ade032612a9a2e238f59278da +1deaa6dbc1a007c6fdd494eaa997ee56bbed5f797df482213f03b75da3a05a0b +30b3d63c75b125b8ba5129e298c45d958a3c69067af3313cad7db36d928d8ec3 +dceec61f0f7ee22622434248cdd8696c5b54c8911b9d90714347f7f6b11c0bfd +908e7f9cd6f98b97a3b8fccef61e6234332a1094b3c968eea224574947de42d7 +f8d5de799f40caeba36b4fc4bf430bb380dd217366446482f94d207c58a25e76 +2cda6f2af982916b182b477772674283254ae75a8d8d4cf121a73b3a2592ba76 +1d6d914992090c438c4a68018d474b7147beb38ae35b8d8e9229490655900c3d +e615951797650c229683c3def25be277af6385b4f0ed240f86547a1a3742aaac +a0d28fd8de4fbdeaaffc37a669bf709f0dcc13fe003c96e44a9d33ad16217675 +04e1f237dec054223a0a35a4ada96b0a683ea1e016c6fdde948e0a7a20f8e8a4 +a6d3bb3c09636e0373dca7746eb163f43810e2eebe8a50adb76468b8a779c371 +6c61b780626c027be20eddcaf408dcfe07cb044aa03f7805290d252ed3f30016 +9ddaac33d863e1ebcde7b8f3e0be3f906c3375e4242f64c7ea6f0f662bd9b776 +6702737841953a725113b45ab4eb8548a1c1479695ff4ff9eb8d474ff66c869b +196aaff62849081a98ee963bd74da69ffa1dd8519b106ab22b4778cf97f1aec2 +d9b68354aab2fc0a8fd3516e2d2cf08c22ab093ba89434c57874f4f87831062f +213a7fd7a5572d8088eea1cbf77b21ab4de8f4c7a1fa8312484dbaab9ab2a923 +d87b1fe0ba3183ab27d00fc13c624efe6ee45e62d2d328aaf9f501e64765b946 +f21d5f77d5b5436a6ccaeea7002b0fb24bae81ac550a731505287f37dc04af2d +a4cfee3b3a1ab21781afb9222da39f72f2dcace99dab50d82bc73e73125279ff +431a5a2bef0b78abf0bfb1b3140698456beb47261801937d55e1dcbe40403dcf +2495b10dfa47211d9342f7676cbb498ecc5316b1dd64a74fa22cc977176d03c3 +f3b0760ec63393d846ea11b9c2aea75c5b7224dfa193a2534f0436cc90d9fe88 +1f56441906e4d5644fc33b472c28646ddbace7d8ee8fd8c78e5879e638b41b14 +eabb5715c81ab6cd2fb872370888be6f6aced19820394a42bb286adf8dc2a82b +18b166efcf0c5c7626aebdd3abd5fda35cfd70887f695fdf82337b821c510005 +90c6f06a4e88ed6d4d0e5f2c3ae5e4865d67e144bba6f6f3ddf309c049772e56 +0d865223cd88963c6fdb573d56b8fbf67255f94c1c4e264a8a13810162f1ad7e +b141f69b353c7a9737aa9d919d1bfdda75910dc5e841f4d52a5f58a3ebaf305a +9075edc50f9fe0cce188ff64e09cf1769949589b221b451c0e7f2b6176f6ca5d +680b1b4bfae4b7ae87c03049fcedfc09a33a680f96d96c1d09fb0921f3d4bbe1 +9655fd72398d8b66287357626d90d44b9f0e2973942dc06de660f7278cd0749d +27abe4645698676a1ec645169bbf1134a573ed63fbddcf8e690fd66f943eb675 +2552768f52cdd9b8c4938e1d583cd6576611b1495b4339c86021ce6661175e68 +873991ac3c93a55d9430d510bb2d6c91dde275732c87275d2dfa3a0124b3da1e +1fd7bed9edf509a3afe352813a8726522244d32c8bc31d01cba0e1248ae5c75d +d25bcc26826fc61c172b5ed70c869894bf1a37369bf1b98f353caae79bc05fb9 +8c9d59c91e67e9040642e7b4c54912f603bc8f8696ac9d667c557c0e0b90679d +9c809c82701fd2725752ffe02d243baa5d340a59d26935d520b3f0a7eed8fc8e +fc352542627f167062b1d2657f36e518ac54d03df9a51e857a3ad589f7986513 +914d6b735e08c0f0e9925a49e08921da73050d323ef835f24565fe5b34aa55ec +b8c41e873d766d66230b8156f06580034d61e5060f2b6c8b7bbacc2875c26c07 +ddadc43a8d13860888dd97accc083e597c99cd92180582ba9fbd03d6339efb43 +27af006d0784c3f661ba85086486f91df5dff5985c111dbd19c17b357bbee805 +6ee8afe1802988c49999f36a176aa339676f67b3a99638d6a9db1c8219636720 +a64fe07e8968c0e2d013aa3583095c15b4f6cd716dc4cf833d4595a5db580082 +66c95090df00addd1a266558da09328570fd3ebaed85e853b0c38fa90ce59417 +da533b879bba9813544f8768cd27b91275d44b3876c187c7b1866b943d01cf14 +3dc10332256dd9d603641390e9c4a5d69a2e3a5a64cf5f25f3c97fd69673cd04 +af830aac66c8c58c7d6ca5c9491776b6e0ff293a7340f55702448d1c13ced978 +a5925f0aa260461ee1c304caaf92b12f5e268ebfa0ded8cc0262bfaf51f5edca +c304414a151d57c00c8d81018ba41f72e9f6b0ede165a4902be08de6796520f4 +84e03e723fc8fbdd5c708283d410bff715bcbb78184c9825bb93b13ff067b8b3 +8f13ee2781128cbace25fd8dc9b6cdf0094639797eedaf5cb118a2de7d53d66b +aff54b243047c35c1fcd4adc5942757cc55792f3370059fffeb95ffa99f10e98 +adb201b57efc5ede4e03dafed763d81cd47b4c575435eb7bec1193ff84329a23 +8cf67d8414e8d1a57e41f3ed0ed3b46f1dd2edf8ef198cd857c05dbc65350dba +a939e74d0394effef3780ac622549b301ae4539534ce23da4757a7205ca6dee2 +fdfc6608444093c046976b919204c92d985f4ee2db74678725c56348c40cc447 +8770ad251b6442630dfe076de75dd57da6a453e8ba58d0016aae4dbe05591e80 +fa2c2df3aca1de4f21d86c560a9d25280fee16d5844a5308d7922d9bc40201c1 +c648e37d929853249e572f88b21ec024bd07a8cf3dc4fce45df469c94192563e +a695b6fed264c72b66256a3e9b0ebbba06d36a9dc18dadb4ac7bb9c33918a106 +ae23bdc5326af0b6ef663b6ed2894bdd80d334a084bd692ccc42fccc033ccb29 +5c7bd33199403d488c61a9e0c619a8e501a4f5c8034df1d2782d8286ef950513 +be7391b1543e36fc886672a4556c66c4a92c40ff9abde49024eba8e041236d3c +f68125512f1803b8cadbdaa0926906c6a33ed1a52c75e5589dda5537ed70572b +6f94756f25eb171372f4513377760fab4bda57d5badf1c2f81cc68f4189cf499 +bfc5002e5791bfd84a40a69983dac1b26cff33475913e7d410d65d228c695ed7 +6e896482179611844eb586a8023e6e03af4c787d991d361be5aec58fd67222bd +a3a63f3785abfff3e90eda8f151bce01026a425587da9d8001e532fefb75db48 +ef723bb5ff12398ad736c4f329fa941b1951e171732ce74b2f569570ef9c11fe +8e15a4746bd8c4dc3828e431329fe205584b946ac06beb7efdcc77d5bb6f299b +265a56ea29b78903c605c1ef909dd25abe6562103084f9eccc550698ee2ba7c1 +ce69e49a7a3dafb88a155d7b6922c9efb5e1f8364728cad0b8b4761a1370f06a +aad0d9467fe10f58cafeebeb187be257859be4d730f33c8d4dd5e1b0dffceca3 +b23434c2a25bb9cdd8c553ae92093b594ac139fe70fe9f4a607ed7d4f44fbfe7 +0abd31a1d27f550acbb627ed100b06b0a90af2c1aa9e334b54b23863693bcce4 +bc517db889fc3d8d179d670b1e282c6479d4f278a620bc61a5e3977458da98b6 +dc4ef9062ce128fc59a595f9741a7ab354a086bd1b0cfbc8830f19a0a5b7a278 +1ba1afac9e8f805f5563a954cbc48e85565b0acd3930dac4f1f4d0c0eb8b833e +4ef339d3f5ad304e59f0958aef225767f1f992dca2d9279ed920e6b1f1d6ca66 +3814264a4455e999bde37475f3bc5ecff3622581ea9145dab6acdf95c22fe293 +272d2875a939ec35af73933e9acb08e419dde1c8296e1a5ac1006dad3bd4ff51 +f278103d486128712f55c34f4e1da744350965f2692d8d6690b67445b8d0a2d2 +6b1a18c1cac898071b9371cf39ce17153fa963d83e646486d9449d434200b912 +5bef39637f3e298c5dd1f0e817f523d68a994b3b05c8d4dab4700632f39f6410 +3417a3c7562cd8c399ab5d9b9efe99688b832d5a2dbcacb4ad5d4024ddb302f3 +38a6eb2e23e47702660dfb5327bb33347c833ac8c9ac158d2e676589def43d5d +9bd741ff2d68859e6974891121a14afa2c9a0b591db56404b19f08adc039a6da +0f5477677ba691e27d680068f832603cfaa10b27315e4ca8d8fb63b6a3c755a0 +aed3f49af639ca8735928670f37018e48bf3d9ccd8203017f5c52d4dcaaaeaf6 +d91371e52550e6e0bc72995965cc5a9f987e2099bb915bfa28fc0f57cbd740b2 +6630b3c1fe2f7314f66c36f3014d8940a6b99e20c2bbf66147ca17cd9d52e2dd +3edb04670d745d9a2b33ab65cc16a68fcaf84e360ae1477d357afa62df1374f6 +1219e7ff000117ebe8dc15d58a4d2d44102d235d9788d897667cb686a61e9519 +8ffe8a7958659c0ee5e1289c8c1676ebbe71b61b20e4eb930d14927e2647ee60 +92b3a7fe0c8c02b760f75b85bbe0a429d98f021d0f4d9ae2219efd4dc06f3a44 +a1718101659bba461a904c2560f5d3e14a0b14992b489b2b524cace637aae881 +030ca980db54d8f1dd988ed0fe2da5f799c393d8d12582dd218710e0a171da2c +25f637290d2296bcd20c593c0f4c3b05635d04b4504725442a5c038d3c3d4ca1 +9e121199a4517edfd81f9e50b9cc6a88c8c49e048a7de4dde8c77c9eb4aa36e5 +5b26a061ed03eec44693b9f5a7ef0bb70a26a147bda86981e93ded72f12a918f +133e63ad8507daad920be5531d03b75b491f95b76e874180b434ac0795f961b0 +aed9e078966edf01ecd449afb7944080f6f09260e767f3a388c481df67d4d6a6 +3d5949ea21d07bafd52c2bb664295bacee81ad5a2b16e4e560be69e9f19fc9f0 +d5e0772784a6917d2bba7ccc8455f1572a716f1e032f5f244dd26e5e77bd6894 +829620277dee975d609c3a8d13c5dee7d05bc9842af7a84e9753420591d0f6e0 +e457111aad08fd5818b23baecaef43d6c42c423f37cde8ed09cadde44ee7e8b5 +c5699e82dd3b7d5f268907d978b58fa774dfaf90ebcc85ff390c78056806f6c8 +9ae7aae8295bfe14c499513fd2438fec5f13a9299500b0abbc17df9c39a44098 +1784299d7229e0f36748d957e5cfea65d8d2c940720ef6adafb4b40ea38bef22 +a997657aac9473469b33f7b35cf12f92a8906149fc17fd56febb5e8d728671e0 +0df089cb79e80e41de415f9e7d1b5b93a7355d9eb79bc74026afcfd0e82b53ed +20715a06fad8a586bd1961b0cdaf91af18045107311f73f8f9fa185271ca70a9 +6242825133c68e6e480a9d96ced60694cb24a3127357b9ddbaaacb314bc76870 +8cc7dff7c1d96ec22e39930613b154a2d52f6d0ea5eaadd5429c2738b27bea90 +d05e15b53c2481406e56bd2fbcfd9c73b9bbf9ff905fa83f6359ccd92f2f6494 +69927e744de743f579b7d3c0221c8f1e644a49d33e86208d9f3940e313abf42f +7820c38957f38908db156a4820cee64ffe0ed3637a26ae347df177abd9ea683e +91b15018fed6071ac92cf31ed64e5152636a01ad869b09afc76a753620901110 +f317eae8a99e5bc888bfad1e435302146323d0b752d0347c9b5c40fca5393ee5 +ad16201bc6aa52b4700d790af61387f16f0ab6977291dfb25ba200ba5248bd25 +4850cd1197e0a7b289439b0442fba60a1896d5d8eccdad1f16e5824e665a249a +2982bc9cbea19dc6a0429e192f005474e775d5dff231d5b3855a2da7040c1058 +5490126dc9c2e409bc8f4eab60b75db09b08c94c8a675efc22a0a8931c790cad +ff09b39407c33cee4253e5c5f9e806b5bc5fa785fbfc6db334a484e8e0f023c9 +9094b1cff83bfb775af6751a4d1010416b4886b3a40213297340212604d556a6 +2c56be99d04ee8c1c0772783df3bfd97a9600c3336302155a019579b1c753b81 +93b5712637288c4c657d66aa21aad4ad0660f160c5c61c2ad73a1e1ce7518c31 +2df63067457a38a37f27e3e4224ae637c2a977a5ccae87292abb73a29b019bab +91c4ad20b02dcb57774225183f9d386136ad0547e86b64cf5337d42efaca336c +7bbc10cf8163aa44fee56370a74d47b6620c9c70f822b69d292e3a2379fd776c +7540c44c8ba1f0f072336630d77e45a96b232897d32f726bc579fee33e2548f6 +3ea6c07e6b7c8a39d82905ec789c2ed837a380d354e93064a516605bcbe587e9 +99f69b562805b54604a6ed75d84f7cf08bf33bfde2cdef33efaa1a4e417d2640 +a05bb5f57cb7f96dec69cd6bd3cb909cfbd3088f60d4caea3373f31a684797cf +0b1cdeafb76cace154d45bf7775f6441acddaceb8332ebbbf148395e08073da3 +f54f6d1a525217d554f294d9665fd12766de19fc11e23a1483cb0abc75b21bba +9f7c2f5e21a0eb5b79585b9935b7d7f2254c4f7311d6367a6cf51fae5b228648 +8173d553701cccce508b5623bf23bb59a66356800f2513725046f115d10f3a68 +4d5aad7551797c563a6a5934cfac1c95216db928d08a8adcc4d12d855c142f41 +b663ab4755813cc4bc432147c5b9e4949d56a07c084be5bb14b74ff3a9ca0fa1 +708e861d3133c5caaa90213ac1042dca3febdc4431fe092c35cc2d60fe92eebd +c96157af469b6e3bd124a183947cf960aa29504dd4eb9fc9c10d1bc77363644b +6c452a8824b48ea64a3084f6219c65cdf36a1f8a4d7da515ead6f0e03d0bc2c1 +69ad00aaf8a2b1782c990f7ff40fb9bf2c00aee85eea074f4568760d8c78529f +835e6ace945521a39af3bfe33b73b62a9c755921b29c0167190c6fc2133645d7 +6cd319525acaa82fd7727b055e212c7db32b5efda34de81160378efae97fcb51 +8fc021af9ec77692c0bff6e8ac0de9f938ad65c48d56322c5719767da14789a6 +06dd5ae421aeda6de57c968c883ae17712aade14da281fd823c99561b2c7895c +c0ae4cd1a94e689bb579d3978ea9b2bd70bcd167f15508d1d820c8f54683cb3d +8b302e2af9fc2474245fa9c3fcd50f57699ddbfe78c83b417f2ab301cf335284 +c7cca7e8d5225e036591bebcabec13262d1a7782f1e53e2a1d75c152c0ea6d18 +04cd294417f9cd90912181518915e6d81def1ac5957a7d59b62c5766e8ef3554 +43938d39498456ba87c424013135609c6437aa6346e59b385992b196e5bd7f8a +0b44804854f29e194b6c2959ad55c5bc94cbc0f41f837d72c1e91e795e4d98af +976eb1b55e01ab71a0a786032fb6a62fc6201db7c67f2340a5c504b9a9a9abb7 +3df1694ef6c098769477cefdd3b4b77ab716d240ff9fc0a1ac737877658df26a +b6e7688c7382d170e1218cfc3be31a193f26e9a029c74da3ba2661014b58f58b +2cc7719be663206c3cb3f8993a3400c149326651751e8e9d7902346660c4f845 +c7b0bb144ffee8e1187efc1a5e9e44fb277876d17221287c87ee6351a5c887b2 +72e0c04d45d060190dbe5b1bd8afb1de6c6d984b65362bfb0f9a4aec15979b4e +e94307f351f30f02d8656f24a4885a5fe3bab465b7a0421f240edd8dbfd8f4a1 +fb2af2f4fdcd000d0aff4b5ad85b54b98a83c59654705ca2df9ef54b742bb3c0 +577f7f422cc7cc380e5dbdf0d4b1fcbcd418a219b88279fbbc8b5397744ff5df +1d795570adffdf79a38a6ce62456c2601b8f09bbf18287bbc7ffec9d1b164856 +77b6f176286998b7e76698945e70510ee09966817854263354a751cb09afe9a0 +76b86ed14a837dc7c4c15ffe7a448056908deb055a02558aacbb6465481b81d1 +f42fac1b857a516852b3e7db8425d23dd0e2e80c423abcb3a5b95f1d34f28e76 +74c3e3a77431cf1f75ffc9f61efd8c9a09fe9d74681e541e4435d8443fbdd7b5 +4975b26b3c69d2e2283b0ffd5e934a480c4ee656e068aed4fd180fe5f6ef4af5 +1fc86e6f9271d0b07bc9805cfb43f06add9ec5e410a7bffaa925d84a26965fb7 +6942fec6318bc03627e112f16fa00f56ef464096aa0fb4298a98b3010c404009 +d16c2c133878b6f2988107a01cce2c7a3db4cbbaa7adc2d45083903a357d4911 +3775dbcaef8f814be6d600cb277b9af93d8ab005fef834ad50d8ce9d1dc09f95 +5b7fb930cce65c43d9cceaaf4517b8f1ad764b1c256280f19cb69373805ac79e +a4cdefaaf9064efa1247ba74bacb09fd16122646d36980eee215f83dc9293193 +02789698f6fe0c5a0539fd7ff2b8a28746d92354bcff6d6c056171bda61e9ad1 +bad7f68caa7c81dd31d3effcd9074caa07943ccc3fa68438e9712002d7b7d5a5 +2ed1fb85a70e55a15ffd0fc5bbb64265a048ba668f0e8513f733ce257473c517 +0315715e26e0676819f8a16c22d8eb39d07846efeb177c488957a5237fd3d592 +3d10c2e5e1e6b50992649bc18fcc70c396312b350b9cad02e0af2146d9894f50 +20eb54df3eac30225deed70dfc42784e3da822f380f46b4b3036261b2e19e933 +675dc99e5bcb66381136877f0e9cb2ddf01522a66b33d559160d2f184a7ab052 +e5129afd8225900893ebd39e92830ed4da59e777ff5b0a298a2e3bcb2897a6ce +8bec15a6522071afa21cc13ef47179c8877e6b3722180f9ce4ea63302640798b +af1d2fc6e0132b3505d3b0e949d6fc4d9f744436c619fb0611b13a6b0a4e2372 +a21d4b034d9b4e0fcdf5f25c41e8ce94c8e417088db74d2d82a618c18111d385 +c4c66d1f37f6e64b8dfde45ad805c374cb8030fd3db32e8489ee7243c78ee4b4 +3f58f68c2f77d0917aa51ea69481d98cad76a2e6a2833f2b1cde6d15be2188e2 +40f304e95494f838630665b8c8330ea641683eb4aedef08ad22b5870e8508f4a +098fb39f4dc7ec87bc0eb35ae1e97c29026d6c800deba720641445df76d42a8e +6470dad8a60aebac364f773ab9e7f2a8b31af927190c4baf7f7b3d2da3becaec +06162e878fa179de59cf84e37f0e56764963eabaf87b1fbe061917749ea18ac2 +1794eedf33f62c32de4f3db287d51373384a2cfe30bb5daf59aedf26fb1fab59 +5e8897f2328f9233d396e692cca1ba9cc4e6246968ae05fee297a5cbe1dec18c +59d1618cce3b4bf40d4e07de3cff3b20f7bb88e7f1323f64bb8ea416700c3703 +52a06a717e69ceed80be16007079ee6d7ad3a87012eb2929312c2b68aa785214 +6a5760590785548490ee4b55bd78f179671e74268c670dc71971773683014080 +b742cdfa5f5c58173cac5dd60832c9b6ef16b85c4280472c96e264b54f158989 +386bb30d4336cc099887921049db56a41d2a6f57028a7cde2ea150e9bdc16d8e +e0f42177a9fb423f2245a34dc8808ecad15ed373a368dce05930e4ad627da6ec +30c03a2b9f4368ce8bea2a19405a5dfe6745c90ad99baec67cef778651e4ddcc +e469d3978733fab41a687f7edb977653d119a9c8d33f299836f12759bd4f5abf +ab5b1679c61b46854d8c9345a33d3338c813f5f8d0947abe01fb4846afee616b +84f713090a8b665320c9b3be3baa1c7d1923804bb5ac590dd2f7d1cca105e7ae +a1b880890497bdc0c965e6c355463f8a5c481fa144dedeba2b5d6e1c805096d9 +f343738b9bf2571b3675a19a2f919ad7da95cc16bfb4d7e83bbff08c5bfd5b51 +b3ac712724e9d031ec14e05979f79e2db6d1b85755c327ffe124bbfb62c93f0a +28e5a60ca370948a3a2fbe3224849120cd74ae75aad8e4d110ea8cd3f7983cae +e269bab03078c3ec14d9169b2ccd4c5a3173d63c7332b2ed58b622c8bdae6c31 +bbb347a18271f610c1192085b933051bf4dc83f627002b9654092bbb48a0c6d0 +e280db40562724e3284aa644e399062787a2b58e850adb5c1c3300c2731b53f0 +ea5e3d8c37ca795bfc171259877c8c3735a46beecb8e8cf9bf7a3ebf60d90a5a +b228dea11f5b847663d97e8d43416cdab60be9641282027a152f39e953cc263a +34e070785904b1cdc78998d53ea6a44b2edae5be3a22aef96970ced5b1a8fff7 +20e39b7214ade784dfb059d1b9ff5e8a0a1c910e0d6dd399055d7f91bd13d9ae +2b6a651d1ac110d1bf8e2e43f1b4d98b3bf62b7aff5e7744eaa994d96d6a05c3 +cc66b18ef140d07551f83bfc4fb770f8674a6f9e844879f3f8b7bc956cfce62b +c658bade1f84701103df87cf8ee9e5d33690839e8fb6e3fa7ede4fa9e093da77 +81d379d9b12bf2a56f968d0849311e81a72c96a421b6cbd58ebbe138ae58623f +2208930037c3cf001134035d7e47cdf849004522de61c27263c515655618d1f8 +69784ab3f742689ee655228e1672ac9ca1806b76232fc9eb85f69b110ad6caf4 +2a054adf4e2767a95f5534c5525a5a6ac6008a10a59cb28bb70e1a41fab590b7 +3fcf80f3a989e905d344ce643aff41a74275905e9235cd33818c5bcee1994c33 +77938f2c4fd08fd052f6f59a9460d7897c139729e768cfa384df59bec67dc82f +5cf8e2638bbd8dc769ce87857ff6e7c4580ed80e630815057a0e381a91321af2 +aaf3710f92d3bea496587cc1baf8e76a90d8406716ad85e8bb3067ee410e32cf +9dbf16a6ba4a6993a1454a393aa1c6a4f5b85bd71dea9d09e16a82a2e64b5c98 +8d2f05107b11cce59735219b104815e38219b1dcc2a8fac862cdaed85b4e7f3a +3f8de686cbe956d7b11ca62dd89c68754e56caa56ce6f523579e725213913d16 +987674baf3e75b9e1176845eb69121707b6d061fbf86a28ed7e3cde2c0ad5fff +3200813651016bd240ea190b9240e682df8104baaea088c868e83924bfab865a +99831038e67d113489df5abf11f7cf0c1ea9c24ff19a56faeeedb1b2e103e0ae +b28b73d58224f590be7c0a7548caba79e8a312f758e48c9eeef76a012383e31c +4f457d451bb1c3d9bbfa9dc84c016f6a34a40a5a7f61d5312abcf985a5b56bd1 +de2bfb6427053f4f73b04f545d2e7941d6aa8a465719bc818b14f388161419d6 +9a965691fb68b9a8a0d78f89ced539556ed137321ef6c35884e9485070d884da +b5875d08200a593ae7f9398f4684d19a3a0b621496f032fb8d17a5735dd5a288 +0058b60770ef1136d78fc9dec10e5d78a7dcb4e804d199b659030aab2eff0a07 +c64aeb7b5bb2181d8a80f3c9c5bc1eaacccdef478777567c2f03d9706b4dce68 +2ee5f872e112f7a952101d859246bddac59acf9339b546fe213cfb6230bf2862 +3f0a53b0439839fdac6950f1d1ec14121a8762c94a928473e76e767931fdad0e +c399a7b27203d2198ea577f2a518fa57c75188fbab9de2e7fae055afe6f3c7be +80ae91ee04de86ed38fbd90fe76160e9eb222cc28c11ba39c3ec6155233f4313 +5478ddc2fcf853822921c9a5dacc1bd8a11858ce9af112e05ea6923d4f3af379 +26359d6f9fcad59dd887a7c302e868cf806c3804a997810b16d66ec54bd8993e +ded40daf9c1326d48d649390652bc12f8df57db93013a53a340d060f8f0ea208 +51ba4eac5c3d3afce0dbdecf1b6284c3c16c5529bca906a4cbc295fbaa9b2588 +7d5c2c70f6d7e0e0b52c4c4f8fb406e03ab88787ed35f9c5d95f6abc995be12e +9e51fd4f7771512064a1b2ecd96e89151cd5e135ed5f5ba07a16bcd4e51a1622 +75d9009dfdc4ece7a5bd9561a46099f05a8dc8f350069aad74aed48f7ccb4b96 +4cd0366b94ee152fbd623983a5fc38b9a68cc3d08914d2822e78da693b850b07 +b85a17793750802f661978504694e3eb4b5b2fea34b48eca0a8c24ef81d29ba7 +f6622d6be3305d90cb2af2d67a665c9acb1159a5b34353b0bdb0626a71efd2f2 +56188f41f6c85800ffd51866fa082561b6f19153b8afe445f88b4b7f15f8eb6f +757743d88a687e44ede5135356e211c8b155f12ee7aab0f9abb94dbc3c4a5367 +737468e6a095481a76d16bbbf8ecf6ba56f710b1d18af7ffb4eeb8275e095d76 +743da78c7e97bb5531a71f00ae8e8f5dabe1bbfb651b076aa72fda2d8bd0a645 +b4862be4c0d789d645234b46286cfb807982101600186720180ccbf34d64b0d6 +232be45545cf2f4bf0d23dee4548208296064165c34a52e734155f56cde02134 +60c4aad2e5d9ed3b44a42dc897482d4a1f0780210decaa5fb38ee0cd00a8254d +239b98ee8d82091f45afd8b2c825af54d78e1dafa382275da5fc8d345f643df4 +e4822123f04d053b026bbb686066674630165f5f0ac094d184cef0152242fed2 +fa7b4bde415c3f9ed71d34f37f59a132f8255706a3a4777d7af1fbd4321c86d5 +bc0fc80f4ab662c0f1e59689b6ffc36d81e9349ed7b762e10d85d7294e7d394c +616f67dc9624951164f310307ef5c69db573794a6c0c67dfa180a6bf62df1194 +63029907d339f69af39663e8346d43ceb7433770a42c00c7ac49ae623f4773b4 +20205ef154d2bf9053a159c374021a8202b246e434164c4353e96c3055a70a08 +b890bb0bbdc381da324c1f443157880753f7dbe688640f35d012d011fdc3b84b +530ed296eed8c3ba88ac312a5e94d23c4a6bf5639fd103c14db6fd71b6751d57 +92069f67cc142c1533e54fcd76109046f1acb94d66d3ead2ad35fb9e3e8e349e +dea50fc8fc4506446a8ee556f8c6f3bda2bd502518bf237a7623bca8e81655a2 +22aaa7d829acdd789664f32ba972b6dda0b6d69340ac6a4840352ce04049b134 +e34187426220067f15168f593bad76800e3687a9ea99d5d79a544adf232bd90f +205865688bcc84739eeb804f99f354dc932bedda4a54b0ccea94d3f129bb5978 +60a8d881a7b017c3ffae7c8b5ee76d09c8ab8572c81b994d49c2efaa80a5f2af +299945e831d2335d669c596b4af8e9f5083f90d7846b9be991430e7d396efc33 +c232634fe93d5bde557879b106ac4c7a124d5cfa47250a666c2cc9ce0a158d37 +63dec10be1648ffe60b51e94e8317c71c0553ec74889f87b71c7920fd676e09f +5f21a1fb909ac44dba922b62597681f9e9323e3599473f39e52b1348bf585cf4 +2029944d229073babc0536e8f4d73c8cb49264e660f0df5f606af0543a1137cb +5c5d008b019d542bdfcdbb3761d8dc373a20b76ae2b4885189edfe5bfa1e0599 +8fc793a9804ec309b0024a04a3c24a1efa61b87d1bd95dfb688a6cba47fbfb94 +5ec8770e1ab19a879891ec6318981d6bb73234675a44966630f34efbea0fe1b5 +a585e5ffe8f6d58ffd7abb3a7a13b0d532fcd8cf878e57cc0dcb761f291c5536 +dd8222e8777f112bd7c5d9d16e7ea46b00bebba2fd8870fd94282339f7298c1a +cf2f3c0eb7c203181b55043be782b79c1e33a178c53a7d09dc2ebbc3b338e5c0 +2dd813e2a456d88f4b658bb35c6ccfb1d51f83073cc5643fc3f98a6b712dab8a +a41ee7183668913669d13c9b0cd981f1b6fae03f47961a49e349bbb0bd62f47d +5a0d4c35a9bd80945177b33bb07ec5c92d03364649fc8683d1fc202c5ef8ffc0 +d7cf9ccb7589ebcb56f2ecbfe6a46a028b65889014748d56968746e37e9b4310 +7eaf668a9a949c851870dd5564e29be355b75f93496d997929888f451f4ff7b8 +3ec717df9865ac5769e8078669da3063645a9ae0576b5576bcfa3c1cecd8e82b +6a6727448ab8e6d5f8a06b08c885f59fcb66e918521c32d006aac974c10323e7 +a1f97b9cf30c825c35483db7b5196744be5f286fb9814c7789ad4b1b397e00dd +366b5b80a7e5aa28cad3856fba593cfefcbfb19bc6227b79c252936fb8f2d49a +2315ac036c6e08766aa2b287b6e0a5d851cc66afddf1e577793209d2dc75f2b5 +d8050b0cc54efc673ee8e42a0d305812a5f89979478de4c24896489ee3df4328 +a585536232e065fde26e460fc9435bc02445058d56ba2bee0a7b54e359867ea0 +5955aabdfdac296c39ba589f11b3d2d9c5e3b7508fe43bf63fccddb5ba21bbee +4269b218d978b5818751b2ac06871753c511d36f82557f561eb95c3b70f712dd +fd84fb5230b503222cf3a17fe8fe2666d1485419f4ad7bcb32ff66396d929d3b +207df2d811ee6fb1b4392f8b1a993dff3c254ac865a5217a459b24158269a889 +2a868c6c4fa9811e356371695713123d01a261af4eea0a72061137a17a93fbb2 +151979e29a11ca6914e3c6ba7990bd0ce58cac96c2e84927d1de1754a9d56ddd +a0984576475946f63c2c454bace266de5a6f4487a03ebcd1fb0df6fb22af5434 +6938dc41bf1517b3fa99fdc97a8d09c320388fe718a843fc3d7ea5b5ecd27985 +74b38fd9f1d21f2d4a25d0688b7d311ac747b12066a7866204b91c648d51a9d1 +b67e7cdcbe4e4489948f9f70f6866be1a92b4f7931a12d134cc82fdc4782e8b0 +d42822d2fa5df15b349f8f8bb4f56125e5a578b7afa2f409565afb59cecb9952 +aa42a7bd56fc954052fd6706caa5fe3ecd54035f2dd9e10336543f4eb99e3177 +c0d3b65b64252b132e23df390875a3a612823d62959128b25e688fefd781df4c +11a205fb7337c83b3191d7e38bcce10ccfa3c411bf6384c456e7d78bded31f8b +eee65bf5dd748fbe4f70fea9a542f894616252d9d809deb49a9775542e613919 +fb07e86d16b3f51736e82d27dfbfed036782ee3739871239e34dd7fba8deccdc +78aba8245f945c5b2dc53e2cd2f1354a5495d4a002878dbc7ab9ff6384d9d9e9 +131b73814ea9e5fd0b57889496763d073fdc1c5433be30acc62f3fca83326384 +5bf724e35bd947a611a7bcae04648298dc434e415b8c1236aa8bcca1be497a05 +8a0bbf35d224c77ebd7ce63a69b21163534c00499f312de6cd1d63112fad9c4b +86d437a975b0854e35c68a0259e0f9aaff4ccaf3938a2e7711d6545d75f264d9 +a1a00d8407b8d2107183c2cade139485cc681b1127304fa3c40d377dcad69884 +86593525bab6ecb33e02c7203e75255b7e778583cad2c2bf8d5da414b37d87ce +2c230c28ba4761ffe92ce3219d5168e54fc89ae3f1ad70cbc9b956b09ba6e3ee +58e57de7b56d02a9cf7cb8da0d6ca2c3076cb9130165a2b65bdbcbd47c31ac3c +382e0227ea54e52070ac8f126867360726e1124415c83ff1e64eefcdcefc0ce9 +54ff72e9a015e02e4bb8b9ca0e04592c833cb2cffa03eb0447c1cde397b2ef92 +2c95430ed3e54046921ba40bccde14d4ce5a0fbfacf25b2c7d7024545c4b51b7 +d03f662a87740abfe9248449753a9007deebb387d7e7ab76631aa062f79a434b +35e38c577bac6a5efc56772255ac92326adf9023aebb17d8e073ed683a029ca7 +8da3d55197392554af500283b0e47611a3e2b68c852c349996113e47742ac3fa +20e61b641e29eaadb4c90076d2734ecb674e64d25e859f6a085bccdc22d35885 +ba0960eb7bf1072bbe291f9b1d1ecd7935cb7656ec6bc15d64975b1c506180eb +0dbb33dbb74551622ea37f0d813c71416051d0ca33dfbbd0d552863afb7061da +a359160a493ef304656fba57239ab154af8727eebdca342b288bc07ebed351bc +f276f5e6c1dc9cbdaa91451106df45822393a8eafaf03c3f024b20dc0bd5e4df +43f3c6687f2019d642fa79e8ff88a42506d1d7d6b9be7feeda8e21315efe471d +59bffa506786dbdbcace04a8fe8ae423a27b4b9c0c1b8dad3600f5bad7bf1780 +759d7cec3cba13cbf618a53df36c5c2702a38c3af55bff63829ad7f7ee534144 +13f4d5614c05b140de29a9db8135aa108757505841f855c24761c2ed71f89642 +041c855fe532013d0febf7a861bd8b019980fdebea9b245fc3059a8112559970 +a62fa095a55c638bd7a2f28fa2da186d62f130791e8c34e8d7dddd1e9cb6319b +cf6ec3e238f5c1312e92b5dee3dac520eecf315610fc65f458f9f48b0dbc9e93 +b1343008995ac25955fbb881b051114ea5ec4a45a729fcbccee8da29c4798237 +5db572fb7eccb0ba2b41371686c237234a8866be9f1017ff5d151b931248b9a9 +d279e6faad1cee0e2c94b424be49aed7288311ea1ae5f9612bccce83e65ee68d +00b3aa5358cd9fc62688a7694a0e4de3135cecd48721bbc4a686bde074832dce +0f0c31099b35cfdbae50071d2f4c26b55ae51b919c4c1100a02927ca59cef516 +ab603d631abb6ac0a5bc4788bf8e53f22f83dc621cb82372ed4329f60e180c17 +e27e822de8a5ea5d3fb9e0ea0b2b96f1fa398392ac2e001721ddd7423f19b967 +4053cc18287e2ba5a3e2d0a0e80d93ab99b0b3ecb3afe71f6a384f62b938c818 +17462294d1c9b17ab3988e7ae73f3efac6ae24b3ff82df6eaa285f3ffb3248d4 +fadaa73b7217b0c1faf8f4dde2c53fe9ece617950bca9b3d66f0251536963e58 +15c6dff60754eda6427e43b0285643c0a619b14acf45da5dccf94a2332f99752 +dab07d1417ee757010e091cce4143b2053fbb276f5e1675006f3198d865b483f +f4f9225dc95b47690742826aa2c0798e8adb97bcf983cacb4c3037d82a0afc4f +5596547ffee1dc83e7fb94d3d14aa19e70c4d9bbe9f0cd519cfa91ab345f0e6f +ef54525efc326d87993e8e51c9472be3b346b06d6a05b93b07e04c45779914c5 +66ae97cc9286e7218b9dcae206c48f73de2df368912f7a45602cc3071170b502 +93d8a6adc85da881ac3eca963b02849ae9889eacd3129678dba7d032d465fcf1 +bb50627f25cc2f290e35ae4897cbc9ee040e66db1cbd80025ca4188fc2d22d30 +38f7cc8e488b0a769599372fd924ae386c18bb6313b6dd7841302b8bf688ee31 +4477d11eb74b2402dd2a4dc51a6e795c141eb38a0920d6fb582abb07aba1efa7 +d28c7e6a7b0952e1ae2ed26de402f712c27a96c1c51abfb1f5d56c0b67e65cfb +08adbb2c7f725dfc14c054c84e875746a704ef41122f0e9d496dc36d38c80861 +17341595c9c1097bd547bb1f25a5a64627def63820479beb5780cce34dc7dccd +1d5bb7718177f49c6858c94178ab5dfe5a973f4fd9b621220c13f78aa5d2258d +25cd8deafad8fd1dbc6778ff902e36a3c190d60547fa62f0341250ccbefe8647 +5e4b22828804d03f17f54549a66514f6458694b884a8a733ae55975249810acc +354cc875ec55260386693c8ae60160d7af456e43e8b7a3cea517dc502a42803a +73da983f7a78d086652d3e0add8fbdc7c9c2cea754a8305b9b79e103e65b1832 +a6a024a5b8fa8c77edcddccb5beefa3c9d1d01c37a74a08953642083851fcbe9 +4d8bce1f34b7c71b68f3247eb463e7a2fed1bda308c877e91a86d6052ef9d55d +06d6b83b9af7600d61c36a6c460cb43af1cd5bf65113115de83bfc6081d1c0bd +d88f19949680caaa9f48a608fc67deb98ce9577f24f1c2184530f78f788e19a1 +5f17836d2522fc9859b80d7a3c032f533bba7210e9fc43740dabd27fca4c0a84 +fb0b1849a93c4a09c58c553d0e910df0b2c5ba53e8290a3fe05680cd7c611bac +2a82297a1d42e400df434b476be5a2f92aff2db009d26dc81043bbff997ba7be +eebe8ebd761d56ec4e45328dc273f86f13bfc0f5139d908145acf933632b4f78 +aaf3d1917ff63904f2ec971b5b2f4ee6251c0e6500fadc45fd9aaca127967082 +a61ca2891a40763f1fa17f5c6ad3cd1643be1c088eaf4d91e328ebd670768dec +dc895dfc6a554f7428b5423a86858aacadbc8819c0caf25ce204f98976c7f18b +071b79f03d9be136d36b51fbab43d7b7e4a6b3792e3a0c39794c46eb4f4e27f5 +e805923bd6c4c5ea9612fac86f7ffd3b8ad343d2492b8d9f052baf864747fcb1 +b6465f1b1b7e020684c863ea38668c55ce6958eb6bdf0509834ee6fe50864116 +e3160227aa042e26fbd6629cae19d0435b19dfbc92058f319de60913fa956fd3 +26e76b5635b9f4d6adeaa45f31a32c99be06343571e5176e8a89c544f6ea4572 +964f1787df93981b88f68b4999768d382128d5316e83e74643d70a2ae288291e +806d19b180582e19eebf8d295ed214d966b5282e93c32452d58805829d69add2 +4d9ea97d33da81df65a4fe30ebb6b5b8c9b5102ba616bc2da448eeb0f0a93762 +a40521b52f7387c535e17069ffbaf80f0dbf57b296043367237fa4229ffe30ca +938265084c735ceb1fcaee87ee82a2aadf9efbbb4cd80168a0f975b913a236f7 +22fc543668e57e0b0cd201b099834b660b49673d12ecba4f123be5545bdd0df8 +4f1f0e00c46c679b915684b51995d80629cd4485a67fc28a18416a3639b11e34 +b40f292a620fafff9e21b31c85779e885f07fd8a400f84235b585634d233834c +d20801ed4b4973f1e91379e451cd8d29cff2b9989ced4fc976536446fe2bbe7f +f446c5f791ee401cc5dc916d94a2631396634be1a2bbc944da4017ebc4e3965c +e780b758000c9928962f667300812363c761d33f868b1b8753adfc3e77666e04 +c1e468c04da304f2876d1afde4441719c3687c19e75dfaa44bfaa64bfae835cf +501d71ff247d1dd18953e980c8c3701e1215c588ab78b27c41c35c265063c5de +6fed78259cff1d0c848272b4991c414e94fb052043e0a7fd59df65fa27941e06 +9f1ffa2c5f0c32d0ce639ee9c4a5ffb288b749094c464c679ba3e39a11a19cad +1f5192376ecdc9a9afabba7f4b036edcc94e472ae1d1aa64197eff0c87dc4d97 +5fc283cf7dc4944ebc13bd1e937c97e59f053633c52afdfe1495953740578168 +5d137087920373603688a3dc4ad18137b7dc38d8f94bccd6419d9d356d7596f2 +e027ff487fe91e74139ed748df7de8c3db5fbbe0e724bded756113bab6047ab1 +574e67413fd8aa1aa851d1841d7188685f0413ce23140d869c822e22ea13aced +4ba4acbf0d9b65be4227d95e84944ff8de263775659eb52615d6ab62319d75bf +805a6abd316794954d029491f9fb47110ed48760f7b39a8ac5b24841536c2a02 +2555eb6dc69324f9d735e5f2421c2271e6b2619d2515e035203778cf0233bf7f +e98f23bd109cfc4ec0d01e3db3620b1b9846670bf1a8b2cbafdf7731f50601a0 +214619f59f389d6b1e0e0f5660292dbdc7f2a31a3370d54ad4b02d13f81a2f4d +18b6487425ac00228266f1027a26e4903147213a7a5c29ba1bc748da6385d919 +dce09b00fc655251eae84d6f56ffdcadc25d8c22d5171f8c00ba8b61f151b985 +6d55137cb7008061645e8e4f2315c1553381147cbf7901c4207acf851ee2d34f +ac0bbd28528525aa65c6321cbd68bc64694838fd81b20845de3088ec9e13a886 +801a40c656766860361e04ca6483aba7fb9ce30339df27fdfc44b34fc3db554b +4e4ef91c3b7ba7484cdc036fbae749376229a608d1e00913c03018e247cd6346 +9769dfdf3012c2f562905d9da397bd007b2c81c47b8dd3ae61362fc8661dc620 +bcf9ef2561e3c342ad2f3962ccffe8e98e6d62c65fd9ab872783dcfa035ef347 +a2d0d61bc2ab27e4f96f609b91ca099895354ea9aa11881944c99ae187fb591c +01cccfaae4247c6143689dc9da0224a43c2ce43b97d49c0caaa14b838bebc579 +37fe3a2aea774f1b1cb928d69b3cb31f937ce83097b12d6f76eba9be803c0a31 +b0bd8de2b22489e3da1b833bbf7524252d51ccf76088fc4125e1d0e6d6815468 +547b248d16317095d732d1e9276d063ab7665d2e684ba272af6351a737cb8751 +9c74e5c624c79a852a39bc22446a87c09bf4ca365b1d134c7d6ab23fb5069d83 +be00745f0672fee615dd8071b8ccb31a4866853d7805ba92c618d2b849ffc498 +6fdf4abc9711617d498fe7013936a85d12da318bd0b4d2a2dd715749747cad04 +ed570e583b2f33855af8a8d1437d389d6e9b3e47f9de9de4481c492a05ac49a3 +457307dde03b8a30ef2edebd60a5c556db43bff4854b255c716cce2eb9559a95 +5dfb185e18a341b0776d6c782c98675aff75d2fca752e915f58e5c9d0f192914 +88e46db6a51bae30403328930f5639ed29396895778431543578109c917e5730 +9c5cccdb2b6de16a8cbccd1bcc97556e666701659a43c5af8848fa4318cedb25 +67050ee249eb8a7fb5c210eef38be485c82d69ff77d68982222387a04b2d08e4 +48aa0d2dd0201a1d06b8bfc14169ba52d34bbe65a03715df03259656760f90d1 +043474c465b5c900b86461c5e33a5f93210871d0979fdb5b26ca1b2409c8b5a2 +9ac23b4a69053f7c63efd9c9d904472e1c387f97669a830f482bf3658403d095 +9795695185c1a677fd24f146a4c01821377e35373c2f29252f2d33bdb4c2e65b +54f6fb2a74f4f69c8099cae259e3dda70f680d76027e951c523b33adfbae41bc +33940df06666a88153f983ffcf016ad439a84cdbcb32117e5e597c541e7192b2 +11177afe54f0ccacd3b67c10d44ddad93e604585a513831c8ba986971b189295 +843caa12d4c3066951a9f5cb6fcaa07444e4be618b3d6de06fb7754823e62fc8 +a87aef5f867e80fd2bd0c699240cd59203136efc3a94eb3259f68a81e923a78c +8c30c38150bc808b7a0aec0e254e623474456084331837bc16ef060780df87f2 +f74fcf280ff478a04add5a41aac7dd136afb9a4721cb04f1a54e8ad7c886cef7 +33d14d742c292a307b8c50ed8c16756a336c45e6843342a15ab362170975b429 +3986013ca616f6728ec65e0b4ef1f4b648db8f12c74e38b2164ff0a056b53aba +a218e7ec36425b4e8dff37e420ca3e1ba16c5bf6adea301e6039b596f3ea7b29 +df568fe8c742d0bcafb24e7f561c73aeca87ae7cdf7ba2c4173a5fd76f941586 +48144781457282078513542a6ab75d2dc6976f185604e4ffc7480015d9feb000 +46bf9f6650d702058dda7e4f410de647e3ab2ac42561e4c73f96a22fea4a31d8 +f36da788f42ccd7ad66668fddac36c37b800b19bbb32721c40fdf1a523a06750 +86de6580a675fc5e254d782daf7c903bf2640aed85198ffd17f19d91ae85b526 +448d14aed5cc66dbef9b510c9edae9210dee8f44670b4ba2945dd98a92d49fdf +b884118efc1263ba6fd2712047df194e12e107b793287007b57145b54056cde2 +e8310ccb234ea73ed35cd7a060b6088fddea99c4d93827a0adbce5d927faf657 +d3a7f8a49626f9ed40e1e3aaae8650268c4aa85e8b51f63ebe592e773306deb7 +c78f80d5c96968264d0001bda325f560e664f9be197ebc3bbcffcd0ae6fba5d2 +fa83b6da0f8a6278c84530e657e59ecdd591660a6607eae2191a0fcee0e8b8f7 +de61cc07fa55dc1b9bbb98930f93b1d9419b84e6e7b8ef2595442dc264c65746 +1bc7a160af243059e0030a31740a012b783247420967746903bbf44ff2b33aae +487fce9e1b54b1e67fa272e64463a796201b20b6f123bdacc9f04ef881b16ff0 +b60c151419f090edc5d95ccae9773dd1909a37fee6bf39f2fa658c1da7a3ec5b +290f183b4ea95fc6edeabb46b5f518a63d7b8a1e2e0b8c1eb35c95963ab65e55 +9720282fa5e4989ad605ddf5543f50382f539642340c26e379b5325a1262fc57 +532fc4e6a315aff2d4159a0eac7fd498e09ba2e64dde029f33402a21f54efc92 +609fbb36907d798a34c86644264e0ca3da53639e262b49be5f3d212d36086fd1 +5b68624476c0ab1f715d35907fb19dc62625f59b5e9e63cf8fcf3c3c68a6e480 +2d927018240a8fe4230922bd0a431d67664753d51d4f5ee894b5ecf678f342b8 +05b201c2d4540e452a1be93da7c0137a3852709a8362355935494b1401ab73d6 +0c4fe07b2314e63db3005a40f4b36dabd0db3eff936b0a1cc643227ca4fb7e0f +a29ec03ab4610337bbcb63d72f42716fab0a3058dd961b2f291293beb9126000 +a8009a5ab98b0c7529c0e2c4ae27acb684bc3c07817a2d13c672dfc6cd448f2d +9c8cd5a1f597039ff2601d88f2b3dee5980956fada5599c5c968c5cd2db83a9a +e24e2a9eff9d3a0a488f3d7a68cd056a6f8502d6e5a61c305fb99416001a691e +fa95afc08246bf070268f62f8ee9e4ac8b2d812a728db372c62209fb6b5f6789 +7bb1443ad5241a004b3cee1b9e1671d5de56ad5491e42ea7325cd718578a44ff +fc73f544a6b0b1df27c39e213379a1017d60c11a5f8769022bc8fbec7405f4e2 +bef06c1962e4b4c45a1e080ae095ce911736f220831a2bc4c958a607b9c88a05 +96beb76fffcf4e469e2dcc09857bc9ea5687be77e1e392f416f681dbbd8da68b +f378547ecf9648c1b95005bcfa1872dd1e72c5510bec48b0e411ca163c8214dc +0efdfc1f08e925a5bfda8e6ad2f9ee106ab0a053fab30677c6ed7992899d3d1c +30f11e59bccb1e0b329dbe5415fad4b7e420cf9c2caa8f7a032d5e9f9558c2b6 +80f5e6af2158a8ef1fb1e36554ffcff934bda7039ad926ab6e12555d30f76f0b +e98e2e19f12d4f4e8e5ce72e4b2928c396b2e9debd44b9bf80e1df5acb4b9097 +f6fcb00e1ccedcc72e494e68d55151764795949847b513c4cf8694a759f1c5d3 +c6884ed10626bc8eef3097934426e7d45b919ec141b9ab389746b6c277469d33 +b82da2ef40123707646ca62adfeb5828706b571e160efc63d98e8e30af9a7c6a +4046777b2a7c17d08e0cd5e1b79c261b60cd86fee6668f6a3812c6d1bbe85d1b +53a79f0ff4e19c0bb6b2b07c3bc145727d25f9adf2f6ffa14e74e33f21827092 +1ff9d9227d08e044cc750d532bebf0962b6f65aa2d50fb238ad84646d16fa466 +3e592b1e3c21b07daa5e8978793436c50b30f31b17f3b8c3a8a9c98bebecd6b9 +2ad5f9a99cb4649d799dfcaf8860759ac26182ed3eb6a82a980232a426fb7934 +7869b8b24c966de308f669ee47f623b95abbd9f7d81e5d0e81714b6f328599f7 +5e7f9a85f92f76e3df446a7130fbd7652d17abdc021fcdc761f300cde20bb116 +e36484ea2f2ff9032bee64fffe992b4c437845edfa194bfa3388a22ce241fbd8 +fe8d0549d2bf43f0ddc6b0606e976dc36ec055c3722d7fe96a7339d15f93befc +74b063908a089d9684f93364476f9694a9a4a4e46100a6d5d2f3ad34702ec2cb +e64cf76d70e70fe725eb25780a3dcc619c3d3d1fab7d93ffdf695c9d2d86a007 +ac11eb3d551592ae551cda8f78ce2f4a06c798b6bce573d35f9c01a775fd3e6b +9d6f2eca089b11c38b812b9fc497c58d96797744d9a433f0f0f545bd7b4b6ca8 +ba8011c1ecbf6ef91b1ff7d016865871a12eb9ff3f55e4052c152de96bef6d1d +698b9918a8a68202378374097d8ee27f153aa3eff3c6d49b67d8e09cb51b9bb8 +d18eb43dfbd8647e4d2b3992810e46ac719cbff5a28be6532b39c2b462620109 +f42cf1cde4aed3b9f78ba888824dd0d32778be34ef4a7a84a785ad7920621a25 +74376e0faaa0fec39bdc769f5526fbb3f620b3926f6bc749df679115610bd29a +fbefa357d082db7719a75b6396a01b775bfde12394c4ec0a0f75ccd92de8803f +ec9f408861ab730860e0309b3f799eb7d99fae4989c83e46639d08a662e71ede +60aceb5280b19a7ded32438cc1ce140487e52db031e53ffdf299d552b7f9556d +438171ee4787bc6b445dd2bc23da420747f6e81046e715dd6f5cbd9a97f08deb +a742feadcf5d93c7c2557e69b45a505b91ac6799e37f40a2a70f3d0c0885f85e +cad7f5d5498c18d496f84010cc0da7fc91c4d1eca61ce021b3f204ccac60423c +269631a05d330c8b4574754aa6019885866e0245eb7efcbd747dda328525cf9a +3b13b29b8752df2c8c30c0bc3207b37948c30a2d037a29d1ce075b778db6ce18 +551facc66a4032c9479e5122ef759d8c58601a572b0a02d8c606e0f4df80f411 +ff5c60c06c5f263375fa7fb67b6f670a453bbda2f41e71c7da09770162f636b0 +108680424e1d6ed498acf2b997dfec6d8079b2d26103c67543fd0bfeabeb027f +dea56c640827bcf1d5c9e353e30b46ee9d3495c9af5a6cac79703aedfce3a0c1 +d4ce1b20275ed9de111473494bec7da5d579ac5260aebe9a0cfb7c6730bd51ef +c8b8343166a6ea72e0c25fc745b2c425d852b6cd9e8e2c0cfb16be2257bf6933 +86693e380a7eb1c9c24f193620d886921945e5043fd6b8798c1105ec40d4fb82 +56cc8ed9699a1f84d7438eb7447ff6112686403c97385442c3d34a9187eacd1d +dcb4b5fcf4a11e90baaa10fbd457053f5270e4cab233f41f56cea906103c5b3b +0e7e5f9b8abaf1d66572ff8b15e0979926dadd51de964dbbac8abc813c28ad71 +4b14bcc1690838b6a2a33a4045e7ae481d679178ff87b65d5e7bdab7bd59b536 +331c132115020fd681ae7705d805023ef790e163ec92f41035e28c6edebd276c +d4de63de8141cdb8d77b6a657713bd1c38f02ef1d97dc791883e15d96b7b701a +2f124ebb9aa3a2d90dc825470852ae8a959e10375ee5abfe70aa5a1cc6cb58cc +df3ccec83216907b8b80ff54f35d53a2d9c679e61c2cc9d8b3271c597d1cf153 +f5dda0a71eb2d2ed289a5b0d8eba301e7a4fe05e649d53cf3c6275c802b88fd6 +5508933966a5f261c898f755a60d7d3c95223e470b0af6ca4b2a57615c3e2465 +f535753c0c3d21f6cbefc29036d3e925a4b6216290abf8ddc86ec955157ae441 +6772fb59eb3b6280a78f9183bfdca096d5b46f938058c03b38adeb1b4f4fe848 +ff24ffbbab3077bf50b1fc474688bcb05d9e07294f3871bb2c0dbd266866cda9 +a22b2f3638e7b93d6eece65df65835d6c8396e5a109bb65d9f23619ba85ca9a4 +34564b9f706f2b0b7b68518f6e0962e101d6a2a83565cb1bc4342fcedb6e7394 +4d303d4ed4f792238531bd105fff9aa61c29bccd5d6c6ee399b48ebbb5bf3932 +63de8e873dd0775fda5861d1a9c547c01fc3cbdb7f9574f14bdb1e97280c024a +63a922657125be2d5f975e86c0e4b9b6174157126a9a06839530543f1fefb261 +143c666c42615933aace075512a988c9f2a46a449ec3b13fd118b4626e2a047e +fc90a20772c4ebe9b23eb733fd45dcd20289ab7d801aaaf5fce13807ebc84420 +fcf927bc88e48903f17bad04fdeccb76c7e2ab93e008321fd5a83a39b8325343 +59d4cba664629d807b624ec727850bcb92043788a855a28e86aeed0fddc4f6f1 +fd11b6f00224dc2d88248abb9245112914e92c933800336c75e10550610c7569 +e09c8a3389f88d25cb30f7be1a6accc5dd17b02f141f729f1b36d32fe93b4ce9 +75865054e448fcf1ca846bf004c1c67fb3c48a4ad2bd9f1d594e4646eac106b6 +7e747f2e64fddd88d076c03b8d7fae26b53dcb1027f92fe769a8385e7cbdfff2 +e569a107b76e592fa59f8d92e9f009ebbd872a09f3fd3d9746e8a8955634858b +4d4d967be07f8999d7fdc0ffed37e83f865469901ea075fc27e9a759a50dbf02 +a7a1d7031c78c9cd66e359459469e2896d6d4fff36b7b2b510d66761fe133053 +b2d64c8199558288054b842da2816588a898e05f2db1a5e11813ad89f1660910 +410c531faf42f728cc1b34188084de2578dd0f5458bab3c17da610b7d6afb635 +8ee66f8094436d0c4896550753f4a06cb566188ef59b536ba03ec04ee8650a3e +3f3a932b61c940bb0eeef0ef7c1301ba52e59a904542ca2a9bb82e1e03500a04 +f818f8f747d3c431686d543e47b14b37cd1e44f021a5da657aab08bd56cbdd7f +453c331b7041958d618d4b007f5798cb49260ab59801977df6eb49d3f1e609a9 +c862cb2a297a2acab8d2ff5263f40fffc73078e777863f7947b0419b6026b7a9 +f1c14bd344902c8837f5a5c6a7002984f40607f8dbf01e9caa04aacab39ee10c +0509c706a04db09e08ecff57cce67da05ac8dc14f700b2ff731d0799236646ba +68f305cf7f79020dee5c99511a37b63a693339706560635dcc6bc14d5d12ab98 +4ec26e657619d2c6d8f6490e55d3219ea28c69cc92c3f67bdc437a77fb9b320b +ac18393b3fb793c308e92a336b174f7355710966c2cd8f1f8ee6f081f0c3031c +58149c41849c763fc6395658dc43c86f5488404778235d7f066b3654b9e04d36 +786c1a766e2a2e10f870246bdc94e9241267d7b71c0f4acf0365d8f8dd3c1c1b +178734bf1ccb8d202929f2e956b4f27809fb2e2677162c978fc098584f510765 +415d6254734a525d73c92050c3a2dac12e1c037eb2c1f1ea479cdb9a2da0e899 +05b9eb18eda7a314654f7ecf608531be3cc30bb8abfa03102a670b87b61eaac4 +5af4d898243ac70207fd1d5803138a78744528a47e9e371817674f2ca6b97a59 +f19fe641e8e121340daf52a2ed995658806777619a6b6dee640a04b63ea9f446 +f4dbfb071cb6f6b4d82e85b4be34c39a4d2dd417aa93e07fe3b3ee3b53644510 +4ecfef4e1caf7b89c0ec5c3ae61ba1e958f114aace905f7cafe7a2fb2cd17e91 +20275a058ac69193c471ef47490d21770792563a63d87e23d8e1e6158fee9510 +eea1d2bbccd5f8e28d63c04bcdb78b3a49d640825559634dc9e5625db3b72011 +85de810c60eea94efd5e25a04de8cef3566c0f4b6a92ed6e58700b5598fcd65d +42c4ea8efeaed8168f36893aa2465f7f6d5d3087763b4f2a53b38ec3a61173e0 +48a4864ae6a6f6ecbfa1e92f15de678eea897b0776c7fd7ba192c7da0277699c +a1ba6c9516f89ad044c418c24f8af15fdd129f2db45cefe186a20c6abc895c94 +241a19145c7f8652439fc92f8ee142abd14bdb4f80bd43c3a3aae6cc8c77b759 +21b42047c0e374c123d3f631e25bbf1ab42115927ff52af0c3c8a31cca288d72 +126fa5bfc2d54aec8d05488348b72e80b08cdbf483d994cee779296b9357fd9b +addd288dc5a8ae95467e485a92409afbf3497aad25a097ef8165c40d802bf74e +79f08b2320aa4b110076d4ebe15d073d0ee1107ed6e9d58c05286c62f4136b40 +4a89129c66c1d1726c99b8cb4ba8bbcb6b3b4e73a11cbf11354284f23a76e0f8 +aee94bbf4d661739b81e3b47d5b4ace66f695001fa09a18a9960d741a8cdcd4c +4dc1c68c0fcc38416fa6f7877befef5aba8968621ff6653653b3c21c8bdd0c3f +07b8eede44036cf8a0aaba353e2eb14cdc1341687bbf0ed1d1f910c6ee563179 +95bd02430a3eda60eee5d36abea5ec10e2de1dbd9e3cf96c0366b602ff976873 +3a49d5019640163949e41eb4073fee6681d61698932a4d8c613b686bee37bad6 +ee7f19ad012634c3b6aea6a4d44d1bcc018f57a72cd1b078ed3fefea13f991ae +e6619bb1136bb64b271c96ac8b4290a34040c3d56638227676d75655abed1eb6 +d709082d70698cbd5940cde861d6dae8a7656d6772b89202d376076e6d530a2c +c1ffca88e2aefd6c4ba2f3dea6881d835bba8d433e18a067bdb7dde867edce0e +48d9854f21126726dfcf64cc97831883e35fc429be7c8ed512b3049b40af8114 +35477c782c676d374dd41673af8e4d3d929054f1cb3aae92a20469fcf2b0ebf3 +55e18aa050c89b1f35c8dd7ce1f26dd542d6c70af4501c7486a72cbaacf5624d +66dda7607fe961681476fd54154705c0b0a2fb1f8adb4d50dcef80ea10b341ff +d276e9e12bf4a41aaf9efff1b98a4223221a58eeb2c094972c4c61aa9d6b16f9 +a36fc6af6f121158c9e3d3fc47b8b716c785c0699703c91b80a0478a391ecd41 +ae7d56b313ecf34774933493d949346ed190a7a4ccb7e7fddc8da3c77324e9ae +70af63b469cc3e8838d61784dabede694c35cfa46f1396296424ce3ad1dc7d05 +e6e94624065717493ed3dcf92620e88472118ed0981ffbaabef21fa5c708e3c0 +349c89b88fc10cba39a1807c8c74aa70829126ce906a351203e1542d43a45779 +59e9e65bfb567e9bb7929077a0a1dd08b089ab35fcccc96d3a6d5ebbe4860fd4 +3c936648b92b2d455f979d985bb1af8dca29859224b2f1e411c2cf9489d41dfb +75dbc22658a45c16da828652dece832db5dd454783bac82eb4a33a4d3b82f62e +a36ef09beb6683689077c8fd089efb46549515ffc875cc48aaf4152fc484782a +4bfb4b2f38ed7ab8600d0066e27b03b7c4c21643f3e977d1a9a830e714d54b05 +04e2b7f883e9ff51f49621e53edac289052e44dc1099aba1717391973f827b08 +8b2c076e40abbc61fb9ed2582ef2484e7e07a7341defd54da7e21f16c071fa3a +51aae26760029cb64ee948c4a54725890907e94804fd221be309b33ec2901dcb +95be395576cee7f702a03901044054423e3aa0c508cba6f545d1faa5eeced999 +f0f9d4bfc5495c8fa65a1f18aa190bc11ea45ab16140f8ec88d309648c64eaa6 +57210b86df19d8d9ae5b98a2b74ea37b88cea4e11c44f879cab4e7510ce79079 +bf63192ad4904b92b6f622e535b538f246d802e089ef1c8b78666ac83d20f864 +681183aeeb6b4043afef1ad4cb4d5ed2d0bf8fcc4f1ee159c1291050da9a52ea +fdbeef2e5d5b2579967b4f33aa310f8c726aab7b9a0a07523a3c17174ed67a37 +bea1fa202f75ef9dfd3c597f3d983bfb53ec3d5c0170cf5405ad3be2634315b7 +f823b857f8854bd67da9ff0a01e9950bb0699bc2a4c0fc0387f336ba33d7ed71 +84d531f2b0bf886b562c2ed2dd6fae78762d409ce0cddc96a7161b5b597fc154 +1a1abeb0954146fcd3e44c93295c709e30cfd0b7ed5eac7cc4eeb0e99dc8fb07 +9649645b8c590850ad20bc44eb2c4025a0a568ddeb503ac1c21da965ecf9fc0c +5631cc74b3b0ef2b9826e2b4103ba3e0011ebfc2f0430afeff63ada1a3bb5568 +55bccd1ebab67ea9a04bc971ec6a055563a71e362ad3cb79d4c1ee5337ce5f87 +098a0ddada02c19cacb1002146bb3631beb166500d1fc9ae7b88949e36183f9d +86a17a36b0acf3421162cf120180d3a436ee5f6bc937ae7cf18ffeb652c48633 +20ec0d42bf09c22daeafcc2bd681f19bae1f8ef7e15f5e09c4beb446d7578b0f +49f2042482b785e8543acf5159a40e847b078629e632c5620b86e0e539b6b4cc +f78da4d96f465ffe472fac5ebf8ea6e68b2310a558b9ce3ae2d16f0bd1a1caec +e3e7ff8ef1ae81ec8fe81c6c5bb7315165e89d753987eed98ae9f2d89e3336a3 +0fc24c0f8c3f2ea135f6c306816470fdce5d48a229783f3d1f332b6f4ac565a4 +0b1ed85630e64a1ff78ca6b92d47d317064c88124331b78cd6caa7c93f5272a5 +123db565c6b798967e149307118178b1d4a0417c95b2df7d2867e15e7d5574a1 +4f2146a5377247336c09f3e4e5b45db385d7cc90a17543b86d7c1f77bf1c5182 +ef3d26e6e95b7365d12d5845301ee48f90391a8075a80306348637b56f25fb0b +5ca4f6b8c2041a5697a182773b30208c5afcf5c9acb8902dfeadff795d998cf9 +b3a8abb77f90c91542ba110ef727c7d9a13696d858bcd567ef5d64ac43d26c20 +a9aa27606e9f5770c3cad5f8a9a527de7403ea118c8e43ea064e6a1da9af3382 +38591437dda2a87e80a9028459eb1ec3411b3f24f27630eb7e356ae3548570a5 +8bb9463d1abf3b3608ceb02aacc7c9c06ce283355e5073b2b445bd815d27708b +4020e90cdef6bf39de645736d0730278dcb3fafd44ce088ab70287d9c767d49c +8ad8117251fb55718cce2cbaa17d8494369b3ab37ccc50484fe7bf2d305210d7 +e011d36728405d1ef1a73f9e53e33ddc8fd38569ab2bf28cc07d0799772ab6c9 +6b8e28f396e0938dc86b896bd668768493ac290cca566e84a0aa432832df3b10 +8525cb08ca50ea7d71eb8d64e5ceff15da8a9c89849e85269cfce2e09fbcc42c +28a3d675d9f75d7d63778deb63893b1e7676ab4408719ed6e3410b4e2b783013 +de27eaa26e7318c372ec61282404e7cb9f7b79d2a65f8077f0a7a1733538fa78 +66b32437cb5fc67eae875dd77374d3f2c3c082f2eccbb5d7887e49ae1adc0d84 +0f5171d843ea609516da88bbd906a8dbfa77cf4e68e76aeaf960cef82d8e8f9f +7d03eea0c16aabe9501fb6c1993fe240b8b4804d92bbab0bfd58b8497e45d410 +033735eabeb4c92d17af8b9c5dd7bbf93ca4ef8010407d69c35a2b5897ca56ec +920980a1c8f159520e6dc28f3a62d6e7d995df93447fc8e9c19215cef25dcd62 +c9a19e12862f8e3bf347561addfa34c9e85598b68490553cadff9ebebe1ebf9d +954bb6d27608acf46322ef67b6537ee8ebf6c16b97b694641e9f2858fb9dcac6 +311e198ed43c34aa0a023c1008449186f2659beb9bf7085cf7a7ff5dd048c910 +66e704075bc9d5da90c2d26b14d7ef8e3d54fc72703186a8453b83a7bb4fb5ba +d3f796de88910b843c9be15ef354d26bd39e1d1503385a169f3f92b16f3f20f3 +1ea9cf4642d5977fd23aa0e13ca82377ec95fa4b908eb0524e2c573e42ecf2bc +90c51054a9a2e0cc8e93924a3f71edf177cbc656ae838f0542833b6deff1f990 +7d34eecb257585fea135ec1081a97818479c80215e8d5c4fc9ee6e9f68781682 +85e8873da0a1d6e44b3187df9a0e9cf69372d9fabbb11c9cb68b4bfeda609682 +dac5b5e18f004096c42ed39016ccbf4008fbbbb32ffbd970888247bd7d57b1d7 +11d4b5d76fd339fb769254a0833157eacf95703abbaa0936bb10a59e9149f070 +f82daa134f97f0e48f8cf9d508523e98d1e331e159a0c422866620aa859a30c3 +ea9ba48d4553ba65dd3f316bf64c103ca11839f2ace974e4e26221ad9f6741a4 +5004d4e3cd24bb296f1c58061f245792a5999a8053b246568c8c0dce7a030d95 +77824a46638ab0e07dd74ba20e76e28ddbfcfc27240998d418e9ec12cafb7dc1 +7e5916bdc46a59f31b3dca99263bc1c785aad33ac1aa0c57dbfe09d7757867a5 +67b47395f5d148c9ffdf1bb401e216c79f5ea233cd2a5a82c94e24f778c25353 +145ea4fc505c32c168cec430b3fae9e69a921daf0d5b2afbed1575fa115aaf2a +61f1be743ecd301e63db4996958698cd1f27aaf66adfc853cbba31e0f98d8e15 +d2d643c8a3cae4d421a52adc0cd80d2ec4ec9e9de7bdb1315b52ec72d437746c +5c91204e96e3bc839aab8833a766a7b05a223436e3a3cfb5c689425360fb7fd6 +508f6993fd4fa79dc4612ff9faaac79eddf47e0da29d6426508ec4271f1b87ac +446f79d28e672c5c04c6b46e0d1b102cff6b9700ba8fb08b3139d9ff06fdbaf6 +a55128ea0ce3adb73fa00fbfe0450156e9183f6b91889d8e4ad6415f8438952b +de7ebb125e4ff9c2e357a32d3707cad278b9aacc542aa83898e6a26e7f8719d2 +6088f6be110f7000a3a4b48ab264f84d1d7778629c41e0a2fc2d34e22382e1ef +e688ca04d31119c4c120da10b9dba2708bf54e3ac3eb183d7f3b5cb8087249d5 +d4fcdfa9c4b71b036f46f720ebc0563f45199eea4cca13a5b95963a677a5b6f3 +3be08c9275fa8e66823fc04c151ae6793919c89185f65140d8d1f6772927b88c +42c0d16d08d563f5b93e05689e7bb8ea958f90d4e5eff9bfdc7a5acbc29a4672 +f532776c79f34339983ccbaecd33a9daf6fc1672229c0022fbb13ae37f6fc27f +1107593d8d88aa67c1a76495f5f2e08fe8d1013bad99b694c1762ee5e1bc100e +9bb119a159392c286fc689dfc0693fb911d42d47a0e3ac59b516115b12884ce6 +6473c70272420338d03d2ccbe9f96e4fd12416939e92e52e3eddfbad15206bc7 +9fd633cff17ef63826879fd701f275b5fa06c48f462f4f5f9ff98046827c37fd +91e254f95a14b354a0b5759d90a75eed92f126191d6437a81d538c7b55986e2e +18523bf547845d77a3ded6c69ec5bf558094ddc40a6505c938ef395d008ef1de +1296388919a9ce63ff38f476d01bc30445338735c7fda0359d03d58f748f4a28 +ccac2ba01879bc05a44fc21835e4aab1204b1c6b05ecf32c8247a63fb685a523 +35505e2be2b0000c7fdcb1604a6d480a1a5827919bbeb66faae78ed7d27fa8a6 +436af96fbefec3ee6e8f80cdc4ba28a65138b6b18671839bd96138795bf389bf +2298b851db853c7906178a994223f533cf3b00680dde84aba13ef69f8191b7ca +02f5de337081df829efd5f3f6a435d6d805272afd5b2af3eff829b14cdaacb31 +c179bbf59a3b10454d0b81e0382fdee3cd5c941a2c6e6b446cc7b08358ef4409 +c2a4e6ca109c9b3dfedae8728f60b560ed3ea8252d150e11db2b7fe19c8d5233 +1e8385afa0f792ead4c2ed5d3b0044dae4e732801724de12d360f0f47bf6d7fa +aeddd62fc5b21f4dbea6ef739d1a005b141d4ba3ad34b9c34257ba5eed4b2e85 +4f5d8d07e0ebb4bc6b70d5a5260c7c0b4cc7bc1044c77e8703d0d59c9408f103 +6737c15b3ad668dc22066a6198967fd8653ba004737f5394445da06fb344a4b7 +43a1debd846c52687e9eefe5e06ddbe8c8126a87971a80d67f4600f442220b6f +4c41f388645a6fc978c6dea9b31e09732f050e19ffa4b112771741c025d610b0 +6e1f8543890cd4cd2125d9238d008091ffc2e78ed57b9a6ec5113cc8044c9372 +f305f5ec1a992907464e22188c13ea10b1ac76196336222c0e052ef963a1c6ae +df38e2fc92abc00d5a8b6d8cc608d670636a15cd41da8161e03d8361c09fe713 +dd60041cfe0c82f9df04625f3a8c01f1ff3f9f2d571e406a5775626e3dbb7d8c +1e4aaf46df0b42e8b8f9c2abcdc7ccd0b6b6eda2fcc1602f0b777a8e494a892f +d3cb1521199cadb66fcf60e6d9163a2ab0c2cfdb20e897a1f16555d97c2c91eb +946d05f5905982ba85b77ff081d1c69f73d9014423795c4001af6f9bd2e484d6 +91fdc2a911be3c9185b28f89fae11ed94de19cab9b52e0f52493707e73de0e31 +f9d558e75bea05a5b02f5918e7139ab065affe31956ad54865d0097c9582514d +99ad462d1a4de2ab2bac081e92ccead8c03318b8ea7f6d6077a779f74173794a +59982dfb57998a0e64cb6413d774120fa51c165210b3c63678b0204d326db945 +678869868bf4abbc060d9961c03586e3603d01bcb12ecbeee7ef95e89429a2e9 +980c4c2d6165cb22670efdeeab861b9bbea1b10ab948c9e99eaaa7f0c6603c29 +c67bf2d42ea6e029bbe2ee4f48634d7c60cfac1cdab4daec98705fc8397fc656 +af7cfa465ed1f7ea9c0d1c5a86c5a33601d75c0293f9ec0b448fec40e348bfee +4aa7a6d1293650c7773562b31cb8181535b3e5462b6b9acf3f74fbe01944512c +feba186065cf34877600426abccae5ce76bff790dc03bf0758b64e5c95010a10 +ac1197e84514cd9df7ca150d0585a09bdbd3dfa86b6c8d328f4dc8ceae0122ea +d7833cc21d6628c16003f7fa5e28b392d80a246483856c63dd35233cc7308ace +0bea9a4f2c4e06e544bb2d5e412bfac62ec648f9fbbc488d65ccdb2fb7a6a3f5 +c682b805a16c6be9d03f4551387d3b19ec6f2ad0d2969041b18c0ed96ba90d74 +cf0c9e4c0812f2d98e761afc63a71e58e0eb5f4097bd7e72e7d650dc3a2b012c +9329124c1ba2f4816275aab0d145103887770bfc9e488ab635245a5c8ac03cb7 +90aeb5eafc4e99e70e37190bb5012a6987ecc403b2b54b0a3a0bb30587e99fe7 +dd6beb3a3c8df7a50b4d5c350d7182e4497354eb5538061458af62d5a111ce95 +08a94bae4a4b9abb53f2d4395bd6fa4c1da13e97e4db15c598468d238b81a78b +2a24530b43d81dba1f265581be36f4a19b5c51d7aeb0b4e017608656c6ce7cb4 +adcb33a8ff7cc76f7ce54354aa76fafd4958b9e1ec9936e587ecd4fa75e3dc0c +d25ea85d744d52c8a6228bc4c9718ec43d056412b513e141a139f5c118a44060 +9827bc275c901b5ae9b6179a04513b6c4d039edf8cdb3f2c95b43316ada44146 +f9e7fa093fb2acf38891492cf93e407ca813da0ba34a3da595c346d3354c1f81 +2972d78b5fb3d09e413adcceea264a12da69451a786db4c4ee8f7ee2ebdf0854 +70f04388848dc5c782f7a91e070e1b79776b9254e27f0a0b3110c431f8fb3848 +294e724802de1e27ff3cadb8fcbeb920e7967be152c10e299eb30d632f54fe57 +823245fd26dfca5036c4cbebe443e8a4a21d1e6ef3f1dc6860613d908187ba56 +dd64f85dad9db1504e7f858cb388bdbe829e067c8dec2125c764b79607cc822c +fabb2b2cc93b4d5dca0568057febf7cd86c72762955f2c9d7e1d734da77b0862 +60915afd088ac2b113aaf06be481ca2174fb224746e26b93175da43dbb72f4d9 +68a85dbfaa81b6802c130ae529ffdaf3dbafb39b4c55317825b3c687738f4370 +621a2e720ca0d5710f3a1d963c424a73eb88af68c3dc7ec0996a11babf14c823 +a3d52369c42e84301b47c9ebf16e33cf02d1cb1c872b0ac7ae59361d330f5fc6 +31f104cf221a3c6d23b9314dbf3190edf21331787a0ca1d55507eb76fcfcb8d6 +da4e2ba9d793d158998c06733cb34dc891a8e296a48bd0c0c4dcdf4fa27dcbc9 +0d7d1ead5f56a22336bdf4818f4f8ee4df9b82223389507725837abbb193854f +fb0ae2c55d8259aebbabd35a4dbd3433430618462e9f23f91885d0f3ac99bcd4 +9d1424f9aeaa09887c06c6f62e07339b3e4424fc920b11bd0dd53b200c896ae0 +ede4931f85766645f04c94877b0364e6e7e2a0ace71347b8ab0323fdecf82003 +ad75a9390ae1d10ab82363ba83bbedfaf24225141a6033bca3f59d065926de8c +efcb260f5e394ffab5e182473154b81ea98e5cbec099eff84d53b9348f4b081b +9f120e5275d4e9490044fbc2a9d275b84a9a40b8451522e79c2fd383d5866c96 +84db0c0552cbb14e67ff321ca84793e8ab95cac35e71ae4e20958a5b274be4a3 +641cf01e9b50487a9263f4e60a7ecf6a80d4e2269303bcf8589bbc7d9306411d +1f95e0b59d232b303dc030863cd6a5f25c769dbd49e150f56c4b0efee4c096e2 +130321e1dceac61b3f45a808fed8ea47e0354eae9578991d88c58526ba635f93 +591b3f8debb90e2c5a73050766868ab418e6bc1246f9a200c9010de827147f47 +4a9a35b39947767a2cf12774083708e7e7d1f25f75f1c27806a7e40c5f4f8456 +8bd43aefc069d7d862b78bdc488717928c0a283cbd5e57ca76efbadac172a6e6 +28009c10d8047648c549de7f26070eadecffad1e954185ccf9acf02ea2ba7bb6 +0730a1a46969fe637617e9283cf68ba3400fbc0bd9e24dd4ae4f33241451c4e4 +0f8b996eb76d3b47f0dd0ad64ac75b6e12c516f843578290079aefa03c6ab66b +8063bfac6b2b07d8a94f636626b7803ff277e963222d738a6c4cca04592c9687 +8a9c74a4c528baafa16a2d87e6182b7a6836e901b558d4b9ac7c4258c2ef1dd4 +e70dc0e985661cae6535af3fa04de9be151d75502a65b9ce9ca88351728cddfe +25bcd365d219ef27b7986cbef39cb7450ae28826530e0413108d08ce5c624dae +b1906f7fcf4d83c91dc89a1165a1ea5470ea14a91634540d7e37379d358ffdb9 +38d3c40cb195be0259757ad84e0bff7271d666c62bc9d07dbdc2f463f0cdba3f +fd33bc0b7b566934159b77ce59a431e837c913cb8a3159b4b665e0f0cf237dcd +69c056d03b39db46d40ad75d31a1f27e28af37c0a3d95a6bb89844cdc60939a8 +a2827f7e9d64fad39befbea536b519ee61d1db59cccd0c1c62975c34fbdc4fdf +a2c85d3122b83d27a81ee97c81d8c1e280d67fda2c89bb8ad5f9e34c4408278a +20ce29f25391b4aebaca2bfa94855b58e53180cacd548d084cccdfe203399397 +3b34eb9758acf3335999069b05ca7784fbb467619bd48008c129ce80598cf595 +2d2263a36ba5a5b61d4ce7faf05e651d26d9a96ddf4d6e164a76caaffc7b7439 +37c2c332e496cbbe3a15e3f07c8211c9cb6f745c0b95a5bf36c55b37056f5159 +56a87691c070a5bc22adcb697165b17de566c6ae87473faa4329f9d34b84a448 +a93b1ae3c3b05dbafc8f0a9b246ab12fb5c5f21544d790a03b0772c6c07fe41e +561c04d25290ad18bd24674c5d557dd73a1c022c4a0c3345c4e97ab872cfcd23 +93926ce1f80402e6f1e32a069e26388f85f58a6c2f8d37185f51325fbbcce7c0 +0ea9ce821951358816a3c35d9a3ae47c15a429feeb24ee9c6e91e7e4f4e4bd5e +8e9020451b587aff54a9733beb5ddc14d478ec52011d172e308149f6f68ef4a3 +af9f56f2734989eaebb7b1bb96153429d9bcbf3ee0a6c2acca62f586b506368e +21494002e1c972624da592c5e0e9a316482ef500dcdbded7f4d7331f7bfbcb0e +1ecfe5e9991d59301b062abf6cd8e3543c24e948bfc730d8344e0a323efc5e4d +b1c037b366de5ee1eaa0a0e74f39c7b1af40de37b4327e620df1bf7eed4dd9aa +fd15a96128d8f37f1ae60b6aaffd96e806e2c0b29dd43c7c3ccd00d936f76924 +54e3234ec6529a77332b11a25c2242c53aee5e5d128f5805fa007d972eea2d9e +fa55bb624acd378707405ab37a49e129d003fc9d561ba621eb71f2d1f0342f68 +fa3fc028a7f3ece1d94acf6c4e91eab1656cdedb6ecf4925207b9e547cab62e4 +af9cc1bb900b02d55a89ef5bfce1a8f121d0c80276d61e41bfca88674c65b4ad +2d66dadb8223e8386d40b775d1195b6bc6207b439b2c5615bac548dcc041b7f2 +2f84d9c3d57bd7d58d95c455d74cdba0dafdf5333988d94aea34d01d93a6fa1a +a034f7cdc3a486f0eb051a55a39379b78ea908a450c286b6f7902c1542b7054a +be2449ecf445f56a5a4c2ef2f0994fb3b3adaa35987cbbc0c64ebccd1aa110fe +379f36b8e590195f4409426ddc515ac37be56a6314537d839e77dca4190dcadb +e423cc230dc717b9e7ca35647c3113fa2e27270079736680b0abd1905125275d +18a3ca6ec043b23ba6d9f90b88a6cf51bf8aefe90c25b5c211940058962ec96a +c03c144f18a1e1b13d5c871c8c5c7ad18b0c3045c7db5e77d6f5ed211bea4b00 +0b8bffd69c668c98bb08f4207a80247a80483fc8fe2484483177d6547bf66595 +4d7afc64a6bdefa6d8c12d8ca7a3acf95d56e6f6098345d3772369955e3ce2f0 +affea8a2475757361e2001976de029bf745d701cf0433997ca78c8cc1d6d130c +692474ea0a9114359f645f722da96dedfb0bf6d94529326493b6b18d6abc70d0 +c7ab6f8b68a9ce6538a1d9ff6e41a151f37e96f6735d0fb76cee4d502d13e4bf +4db0ad2c84d44596a66ab1fde477bf14cc7e673d598cffa89e8e8fcb1575890b +4969a53570793d3cbbcb693b09bce2ea64c33f446f3f6b71a976ec1f960060d5 +b80631526110b7aa266b23eb27b1e565b8f0d9b44f4a90c57cfda6fc917f6efb +f05630b00eda90f568c583cbe506b9b91314e31b1738cfafce12f8a17a7bb096 +631effaed2543a732fcb2e5d81689982399e1048ff6199ee677e859f36cb6070 +10ea3ab6faeb30973dfbd8b405134c96a6d40d5e278d76916ef4b66d3bfdb15b +f0dc3f8cc169ca142ae73e778ac690e1038e8b5898f6101ce4d57faac936de06 +890b32c3768394e0d94829f51ff9bd315fc44e33a58394bd5a996ab52b1dad68 +d010935f5a0e7f118aaf9fb42dbac4e642d5b7ef61e43ec2a5b68a3584965c23 +f842dc4cab186b39650edc77dbf52068153c875bd28e4bc30f554b88436b40f3 +1500199d497958c28391846a00f83287fb4e14e508f8954b6ac61c572e634f09 +fde116d3cfb40b73573a969774883c5501d738fc67e3f31cece099996950efc8 +e431c63ff4eed98ab8caa0ed1996ac8530f315b2b62b882a6dae49e46c834b09 +c3c0d35f27be4aaf09e0abd445844c40754ad0c29dc4fc8a3569b182003b24b9 +cd79db88db16272238f9ae5f0a5f0823bd0b174bc25448d9ab253654781a2e4a +51a23e73e22d714e45ae27dd5e8cfdd9dfbe032530765c0751ea3395fb0c1380 +414ef2cce4944f56a2a14a564e41d9409e1929956625b87a17f64ab0131e55b9 +cc1822d73b578854e8c26ae0d560d405dc8a72ff40b240ce00d52c3d8e74e30b +57dd3f7686f6ce18805b2b7757853e49f956abce93dce1d2700915c5b2250ab3 +7ee35b1606aad163d121c4eafc2ff9d7648494db513af8aad8a3fd1ad32291eb +901f9afbe0494a64a99230731841c455d82db72b9e577e17676f53d5f1f3a98d +ef88460a898d5b5184e9e1f65ad43c108f679945bd7d6c777e131fb79d99c74b +e3cafba83814d984752e99e7f86d1dce93d00615d064427f28148b37a2c49668 +974f6a2f5de659b42d04e73d0e5137204b5e68288029327ba9ad8d9124ed4560 +1344da203d7cc8a26af36454a392193657cde0fcac0ba0fd379b74481fc56c39 +63abbe29416be7ced922f0ff6ee6c2bcb032d83bc4fc0002578dc1943549ef81 +4b26f5938980e2b607ab290de624b06c31ca4eaef275212faeda9bd87aaa1b27 +3e8fc6882f298c8e503f59279f66b7b6ea576458b979ae92f3b6172a8f6b9f31 +a7fcb1a241891f044e20a29cd948ca8be18059e01381f445b75316f8fbc77b07 +cd8558b13dedf690eac3715afe7b45421f857d7df4df4229e9a5d5f81ee905e9 +6c63a6b1ea510d0a5fc7223ca5e14bc2475952beec5de9542c692f720e33b41f +d7d1a649d788964430b605a6092fd5653edd47967fd72f8251bd9ba5b5347d25 +3f4b2329fabd0082b71b517d69afa5ae4c6a02983d07b905d4bccb1c0a249fdf +8c6a8b12a7728270b4e90c05c1f6ff3a962ee8f67fde611fc39d95a2ca550290 +8157f91dd7a967b7b7068d1570885f763ff2ab8d57221e4780c5e8e981ea1d8d +b703653412e13b2e99b9c6fa232077894aae6afe819068a141b876b20534d7f8 +d7e2b169dd5720f0170d3b801741797b7c775838b4b36842de3e3fe231ff2a5a +57421433ed3bef75a860343dd31092f0bdebe47cd6a9881a63b55e675db769fe +182a8967fc6829a1fe49d1b25bab86c04befca59b7fb9458863d779ad8df7b42 +835ac1c5a6d16c4479ca09eadc16742be17c1e59ef1ca1fb725db9e871b64db7 +8ef30f0e954be11aff43b674a527f5de267f2b52fee2e51a6681d5ad10e1d822 +c15ab0ca73f25e228f390c450621340f99c4870829a7e223b5bea167c7f6b968 +e2f7f7d3a5c3cb9bcbc45795e98aa6013bf142e2410107a410c3072b96d24e15 +4270a10457d03e9ee7425a416958e991806b139f36d2bc9971efd6bf29e06e92 +713344c9b1a6bd6ba6bd28b6404a4c4649589cc6bc917ba6af0ac4e3ee359cd4 +48a9f74b9601dabec713b8e795e942f0fb90f15f27a8491689c14a5e71e56e14 +022233bd3591a1c7aa417b22f0fa2a7b02e30fdfd56011c508513c8b4385f210 +9b0f01a69b45ad5c701436fdd05d780672ef30122e6b33aea4164664667cf0c7 +3d3bea1a4778b3d35db869c12cba4fb99c066159bb50518bfa211096ec448228 +039f96dadc9b9600ec5e60b70c475bfb024f6d7687c156aeadde8e48b0625c3c +0aeca4fe017d4a18cfd1bbdc370ef6b1c7fe7c6463a961dd06b4329210eec8f6 +a172284470b0d933a2bf0fe7e54ae607f5fd17bf7e62be47db76210295e70f48 +3ee8d4c7f4350cac22004b68af0a1b0105efd86c72c1e6615c3d36e182cffe87 +6d4b4b2fc066d8b6de0283e1b64964cb0cf06a2bf9115d4a0451557602e9ed87 +fde4351940b3dca78d5d66db800efa7b9f0d6f4862323e541cbe078d9404696c +42c62de5fd2fde68deaaab671313f371c2aff793fe6caf4d3529450a9310d4b2 +df00029c115ff3ac4969f454c8dd4cde13ac7f8da419fc22e985063ff6429211 +9a751f54f6402b43d01fcfb86d7ce8c18a69993d40313b419e75a419f88ab41a +40a0052509401fb48777817a764192e55e2df39ea866b150339681a2c894106d +daca983773e1a280a661663f5d192674d0288a303da868f93aee92743504f6e0 +271430d963093ff7172d748b14c917a99896e0b71866050aa97e8d969d111de9 +02874fa90cdee0dee39bb6fc0cce58558bbbab4a4d024157546a57eba7c1315c +9a1c051c287b6e43b0b4195c1cfb7845df3ddac7005e22a861e82b1bdd1dcfe3 +ac9519c77e2a88b302beca597ca0cd3bcad5afd4080d38fa1155080570dab5f9 +f7f8ce9eebe14ab702d19ef0137c615f72b1b3509d3108bf7d6d0f5c7fa5a301 +42a45c30ebfd452e67b294d8ff9388aaaf3ec0572c26034b60ae088ff19e72c3 +ba186180d6f93c64202bc9591b441e303d5550c251d75ab94305979c9942b82e +3bc053641641077a0d203d5d6036f1c918173309f04d27845249d2b92911affa +84dcbec3baf6c61623f8a73002f9afd287dc162762a91f6698aac67bfcae3404 +db70f32c9d81e76f4145d8aae76c8a2b42557e79a3c658cb5ca8eb844cb780bb +dec028775a380862b6d5ee1d5195dc507ce3ced0aeb8938660b4c727d40c6e89 +e60ab163b14cc1f713999906fa5fc58b8b1d10044c17c4e32fca78d99d33cd3b +af638d37c1f396b898bd47776cebbd71fae4162012767362f833dd3f620cf5e2 +49d584ebe4eb183a253d5d4a85a65acc7ee764589234fa74a25849584bc6f9e7 +6da6323675bb14334c7d23db9f8da42d689c14691875712ac8f4263662ba9953 +76a972fa405c90a574ff35afb29038c4048085d6a61ebde090381207ee9dbb1c +f2dccf97635796111a8886662d39d7e3b2b79c9ce048f6d769f36fc80348eed3 +f4d5999faed84c8f4e37271b29d0adeb25c980a8c388afd6fc015b7c5d182f57 +78e9317db58e2efe61a6c3a63a2a0ef9a3c6152b2dfcb81e3c0d00c6520d1a14 +2dd8d314384fa63fb33c47b3bb3e2624fb1ffeb31f673df5105e024ac697fa70 +051aacb07e671787f6f76741c69ea9204ee1216f75491e1e1011512656f48b40 +2272666adcb4fe07be5b79e39ba3aa85774dd992589aacfa7b080fc4b94d855e +e9fa0afc3273d1ae161563c33740c5e2519ef806b6f3a4c7d832c46fa8f86f35 +8aa32b9b0c6e464e41797312d93fd25264b85fb996cce679586077df7e5fceea +9852d4012959de6a9002b4e67317b4f87e2229c9bf89096c32b8ddb3c14855ad +f5fffddbb24a63da28ad2b6028184a4c083f090976bda8fb60bc51d4c590dc97 +b80cce59290aff40472ee22afce117737dd804fbd43de024399081076cb701df +bae537473ab542a08b6a5964ad5a5026f68dded04855c34144cedcf8380d4a89 +a744823b4ecec5f225d26f128912c3f3822e51b37b7e5b6b29e9f1f43fa7ce48 +9ccb6b309bbb9f879527660a6fbef9d7f11fa0104f6d27e32292ff2247668b1b +352a4c244b53141263bf6f6842ae64f198266388aff922adf272ca3b360d8f89 +27f2aa449a42ad993382efa008c700fc74bc6c61a5348c052f247df465f63060 +49531b80c92753ae16a817af2e28182ed43f8a050ff90fd45cdd314b568b61ac +45f575948f2da79a035ada12e83c50c24f09cfb5ce9bcc15bd9c34479ed4ea59 +21960243fa433442b345cf568d78e314b2054e2c146c7c9a8e938b9ce3c7ab4a +2a2aba81a72caed7874134d4126ee3a3096282aa87b29949fbfdcc173e1df4d6 +a5957cec97a798e61ff9ed2d620f4e229041ddb5e9c0a787916374bdeb03d0ad +1dbe01778b2b86c36818e89839e761b0098a7d8db58ccb0e4d67ceb9cbc04e6d +c232c9fab1b2a63a24886b060a78e221fc964eba7f190f5c8d02e0e4711c4a46 +f6611940a8782fd1606a5975dc787fac23f15ca5bc3529af7695abd9b259484e +90512c6667d85d78862e548984e8443511abe283b7714abf122110eb21747422 +c4fde0949df2811451d4bdafce1846156ea531a15a7f8f54b7a117f28885ef86 +5209ac012c0ec7641444fc4032e48c16d2dfbfa3bc12961d5d1ecf95cef74456 +df2efb574e4c42c80a65bb008defdea2e732b101ad7bbb9646874d2e799130b7 +208e1e174cb552d9fca89794f010525898a096c97f0cd41eb911c313efbaf01f +8bf26d7d2820ae5937abc3994e0129d15838bb65a43203901fb3f2375231d818 +08c5ca211909db4cbeaccc21107181a5a3fd93ad6398734f86eab4bbbb5e929e +b4062eee1cd6e18ef5a94b088cf6740b60b08ac496c6781e35d4be3c9c6c6150 +e25ffc859a51489798fa3037d7e2cd96399f663a9c3537649a88297effda3e77 +d98941953f41ee2973e7d80be32ee2d48d5c7d183f4608067c4a72f5067160ae +aecc4b68596b7f80222771698584b1e34ca77c54a0426fa5d3e009350f0e71f1 +bcc6eccaf7001e7fa8b23c321b0335c87397d1a375d467f1783d9488dec2f269 +89590d3a23b21539cfe64752e51ad95c351033a1fa807fffeec3589efc1e8b76 +f81de863071160931055a01d94dc2b8fad30d5bccb926a1d4a9ff858d98d9178 +8c60932d50307b5993fbdd530a5e25fe381959b01e5ce66f8ba694c95b4d578f +3c56d5cd9be8553cefe694b396407f46531c333f1dee44e8d1679133ae7163b9 +c9dcdb20ae4d2c87c7f37087e78570ff608effd4202caf7c2c64887e47617892 +de8f0b4006972fc32628aa340c05e7aba10d892a1d2523fd216534a0dfdd11d9 +db9157bf1febc5877179bd4d8c272a598b016468bb31908e1fdea32906963927 +18a303429a7e1b4240c382f2a02bc8ac9d28bd2181b576c09097c1a76866b5bc +2af2ba8a15427f9827036d5d85d76e0a9fcffbc331d769378b610264c5a4d953 +7b44cff644c1dc209da02b6134622f26014e847e3efc68c1403447e7b3f59271 +2dfd293e0d4b86007a8d9071958d979bd36a47c9e709a0252d61a1e7ecb119f5 +5302f9ce3accafe7dfd8bb2e1708c775143f373ca805a442bef5523e82ffa034 +9f2530b9aed89a8e5c81e013a7edcab6a906173cb0cd48434ad711e89d970762 +3afe152cb282db3fe2e105575ab5b75c00c3b1ecded579cfa23e97c964bb3e9d +48ec0ef42e4761f01ec5c12cd1411c9eba7ed00e85fd770a82266c71c841392e +8c8f2724203b9a44f09005b3173d95a5de83f54bddf23fec70058564161da59d +02121c675380fb0f0f7e0bdce96f656e46f15e2382f316c039826f091cc03e6b +ac9969207117681e0f472ca8b5885355020e1848d66fd99b378542c811f63f5a +bc79477067649055735f2d5a46a35c4133ca4191e6a75f798d6ddd8f72cdbd4e +75de4762d2bae425796b19a65647a3971abbfb29132f35e9accae847962c218b +4973888e3ac04631a358b57d1347e2a74544a70e219b2e6c4c0e4b9f3af2b872 +22f27ab269f3248935cc65135699eed4c1b85769da13cd156108a7d1cd894b46 +fa7e2884d180bf6962240b20812a6b89a49ea08ec6b5a5e8766adceb78cca7b5 +8b89a9c7299801939004db901e195ad16199998c821bdbfb7dabcf1a80081de4 +aa30d5653740803ec63c0f377eff0377d44e8aac6aa289b144acdd5207996dce +96359a17dd3f6ca398b91e86af024f0533ac70b186a940f96d7464fffe38e22d +f8e83d34c8011351ce7dac20a9e35c2460701eb62ed3c815d43dbef99828c025 +21dd0f3680e4505a5a166696d16187d6e85363023823e70f41e4fa7b796e8608 +493a3b3a53d575880f09fa117117d6c946fd8782637bf122d9a8421807105b35 +792dbe884b02a344bd235328c139bc91aa524a107197539fdb2abdc99a7113f6 +176ea649a61e4968187bc7a97475b063d4a52d085ecd3191137c4ea1579691b3 +8fe05a2d3d223c7e5a23526699054f254236b96bb3f799ae176fa86859acc325 +44e0adf45ade76a9d635ed8739c55defd14aa6b3aa86f3504e71176ca2fb51e4 +08f7a7b97ddbd73cd848390757f830abbd1e5437ccbdfe9117d73875c7241f52 +c4d8854a3ae81ac2646700268c5fbbcd03a9e6772dcb7d5b7f2e925a944f89c9 +0e7ad30925a1737a44bf80a83b5a68733ca7f30bc6f47150d337d13f8a9a33d4 +b94fe1cfd05cf1714d6e0496e21b4e6aa498cf59f4dfcb30625cba83a53f524e +e90455af7c17310107b2abb1a287fd1c8489a6ba6195a0f4a18378392e860976 +cef9a48f00b7fbb6c04afbe796a3af0b3a7ff9ad53c448011709d4239ac523d4 +7286b3440f7f9abdf19e4062c415b5cf1e5b1c2ec79eff451643517a7cee43c5 +56f2d68440f64a2eb7f5861dd3de1175ea67b022a137bbe8d3ea80775898100b +f29cb8e25c2f816bac1cef6d3ce5c15cbc3f449f6b5db7c901a4e0953b38f1ed +ceedab0acb10df42e2cd6b4d231ccd752b69fe0627098a3f1bc3b547488bb1fc +03e0e97103cec3d60635a27b41826283796db8bc2d72e0b3b8ec3285f3ef5a75 +5f69a2be9f0e0733bc32ca037df0af3c5f29af5772cf1bce273cb1dbc2143d0e +0a0598cff5d570ed5f1821811e6c7aa8d9ca18593d178d55e45ebc2cb32a2adb +c29f52bf976c98491a5d0a6300922a3031095820cab7baf7344541e08740df1c +a6e661ff99a9011e6fecf6ffcdd8235824ed8f86e02be31440d93f7b65ced2d6 +d2381e370df510ed09b424193dd4202b8277c586e7398ce8e43dd2016f7e550e +644dea807151d35e8d3b3fb66949c92191a86bb236aacb255ff8fd410ec4d884 +e41d54d1eeb2e724ce43d96aa249aee87a9c2637c8fa4b8c4f9e28c23c4af501 +f93d7120ed9b1167983c3c87c44823697113d6614ed80eeced54e2d0f3fb44f3 +4974e6135949b26f352acd7cfb4ec79e30dff73b8d75a6ee74a55e427980f946 +87aebd0edfef0769e12d199b2dbef64565a30a698c30ab05ffd06d68310e55ea +93ccac06a08a530a7440d36f2a736af590a682a13b5a73689b8d8c00c5fb635a +71bea3db8b8a1e5006f1f72e38ecc48e40f73c39d473b92048419be4e5825bfc +2eb3a3130d47e541b5c714d5971497cd23d8a5abb6a93e2da1087bd4b2b0d841 +fdfdf7c17b92e47c9093ebafbaf1b9429958f74e79deef860b65c287370b4502 +26d5fdabc24c04b34f07a048db884927ed1dfbd19f5b45276b2f56ad0a5a51bd +9578d53562766255256c985891b2fb3d1150fe772faa9537315b199788b4a596 +39572838b9deead32f579f9ec94da84971c35149fcd7780a34497879a5422546 +74172a429a6b85da115f966c34de2c00cb11a1fffa16d8cc84b86b9ea31d9af7 +9cc851fd0bb6e2397db8ef7d0f1e98edc5f302f0c9a5b33950990d4019293801 +1e06cfad4653e1a4f5ee4be3a959cffc2231be88055c6d724b9d83f5f8f5ed01 +f4863e329d3c757cac3ed3d9aa3bcfc812407c8b10a78f629d8f660b42423754 +ed23a022797e478f8b25f6a3346374b8e285986aa1e19a19c3af7a81f14e6b0e +a595ec48a0c6a6e016c629c3f1a91043c0eab6ce5401267d5091dcc0c8e14b4a +7062627a065c66fe9fe068267b8c434410774a97d28b76024e171deb2306eb01 +84854194c373ef3659b489e337134e5763d16d00d6a4e66afe3dbd30e0b808c2 +cf044b277485fb807d66b6d0033d0157c5aa1dca6ee774406a7d4acdbb06104d +e582402782f0d19920b7c4c66a65a10703f07d30e5663b37688a090e7db49783 +b5b31e9478e1491c5b40325d6eaa41e35bafd45bc85c8f1be10463cd5534f110 +8369f8ea5a4895428c1dca59bde35cfead2dabb44bcabe96b27156abe4dd9a18 +cbb4dc7b5908715faf5db93a206a4f40a19060ad1c33474226482e8fa3cadd37 +197f9f8bbcf204e76e6e411e56c7b33664ffa0125cb0e8f7ff3a55647a841a28 +9589124c91519db94723a77ae008a7657949e8bf80388b5cc51585fad67bf242 +f5a081ff56ca0870dc9799fd03b5291474c63b83b771b8bee604a11a70e21d55 +3709247b92f5d26049cb3d2963ec785b68455bb485f30af7426cfd02faf10934 +d32c8d7b0909f993724bb7da23b7bc690754384fbdd366b14417e6bb59c8362b +11b7aa76af2a21b0dba56d8c04f14cc768220acb8dc4d7c60646c85cf11eac9b +710e60d1e02c4b9a078ee52c154abc7bbb5ed801087eaa68298014023f93af89 +bb257e37bb4ee55bdcc563b5f28959187135aeb95ee333196f6c0ad8e2fa493b +c819e39856397cd076f6ec77c2de08517b15cd6404306bc45963aaaa8adcd1ad +0c78bc5a53c2370870ccb3d5b781b811ddeed772b2b21d6cc2b8aefa894a8350 +48dba6afdef72f44d779dd9dc6ca91da09a9a825a12322a2bebc69cab203954d +1fa1cd86adbc7810620475e8dd1ce2210cbc056d586e4d203ede41398ef9f106 +b58e657f3ea69f719e7ae006cc1347a31b573857446cb3fdf83afd5991993c94 +95e8fd62929149e5d83b852423a0a92d3799484464bfaddda2e3182c087cd330 +e7c077f7b37b1938e3ab954edb0b98b8f25ab428b313047b6e66e6f6ec940d2a +8f9989ef2553993877bac51edf043efd752a82ea0a21a80f514b1ec69265d777 +e0e6f7b71bc23f53681ef43809a277799c930a1189ae11a7d30fe14c5df3dc8f +86cf3e329c494ed6cf0f08b5ac828d16f522985effbbba364440e78c27535b77 +517b9bcf39f6a038593c6b5fa7a7df8144df223272188c8e5b672f55d3f862c5 +6747225c9f48b995c9f416d519ce7e302c22a8c568e53fca67692d0485d9c34b +936b69c65919e2a1ebac36520c3dacd0fd0a837a8ab82964cca79590fa568eec +936b0df2123977d9b0f4604ac160ece39eb624d285e930cd59b30e26dab47ddc +bf1e601b39d3081be32eb3cf521ba730fbb52298732f17752d36758c331ddac9 +66478be91854a54e9b101a52f94b13f94a80e3dd73a077684192f88927224bfd +35339070cbbcfe6e51bc583b1d6d1179edc0409c56190e3f08a67e4c59fddf24 +9f0a430f6a2093bb7a9e32eaff050ea21201febcad5514f5ea4e1c790437a3ff +1722fbc4a51f4fd4e48653e6764bdb83195233206c6db692056e93eaad28fa16 +332517c4e2259bb6cf36fc5d9c923ccc69047f10e8bfe2f088b3e95077f4a312 +508ab431048bc2344a31a4583718c0b9e0ad8ab0ca97dd51debe6c3dde8a51ab +01b9ed04a58e7a2e73f34f7e2e8e9ddd7b99949b5f0eda2cb61ddab64fd0dd5a +344a20f03b6f9b3fed433329b8372eef9612608380f4916acc5292b7f5fda274 +e1b296f142ac27ac06a3bc96d5f4cd9d317a5318e69dbfba646074f2304849ea +3c813981fc03fea55a109aa1e174556401bf37aa870778a73eca9d2c60eec4cd +b88662527f7dde83a248475b5476dd935833d6ea8ce5cc912ca5897168bfed0b +177d4fe4c328f55625f35d11f85ae70e360c68b5601dd64681d557ce51e724ed +6e5cb05523f3860698b38910ef6348c9abeb14c645b34d08e42d84928a36e91e +999d15841c9ace2276b65dd78ee6e4253c27376ff691a11e640fea8573509b70 +9b0fcf1fd6c4acbada4957ddc2e9b4bd7444cf0a658f56878da729cd2e6c340a +3a3bf51132ceacf89a3bfbda4be6a18b0c5be6021076fbf6d2c5ffd4d35b8855 +d69f62c22621414d6dba9140f9fc62919d1f0c4b2d725cbb895bf04b874b8e42 +2619d4653d065b77f02148cf29931f52f94f0f21320e541cfa9b03612d76eaad +48d1c2ed840c390363994f75fcbfeddb48dea5af3d5e869206f42cd37428844b +e69d57813618c3cc6e4dfc270bad5a74023f38a379d101adc41f62173a19156c +580d2c9870014a090bbdca4ea89aa7c0406e8f73bbfb90808956903b4908fd9f +e439a4a7dfa4bf0cc31d89bd88c5470940a1a4dbd871b9c23518e5694950eb07 +79afe884b71caccb2f350154fd6b1f90482e2d9268fe383666365fc41c5b0c04 +6fcdaa0cc65e320103ef976f4aca093a5b41d47bb55bf58fab366d3c9088297d +49c88fdf7eff4920faeae791887cde9a1c9b2f2fbc2e23f7bb5438f9a5c91790 +5d9666ed9a3a780a02dce5386f1af23bbed00c476cafc4734015e367cf600916 +4654d10bfc6d06af5316c45c8cc0a5f92cb4016a2b351d6484705e9f1f9056ee +c530943ca1c9fc321a838fb02857f0709aac2009eb3cc38f81145d6ce6d44524 +da3e21e5701f972cb836afe077e6376875a953ba427b2b2483330dcfba0783df +c371f9cc79cbde94fc5e6f968b14c56f0f7690965058f6ac266a8baf2f545336 +1b99a92db5f63cb16cf850f13e0c18a779679b03ab74f886b2357c612c0e2f38 +2c72cf7e4b979f888d772eeb5d5dd2b1d837f03f7f9ebd613663fcb8b2f7fdf8 +c761a958b41cffc4b2e2a48fb62ce80b10261b96a23b00f6084819d088cfb019 +84fbae235b2cf56b391a1973bb09fdaf180f6ba062bac913bfe0762f196d1680 +f7de26c276ecc19f6f8c84c580b8a007319ee045a04aa6e492b347004a26dd27 +fcb2590c4ac89041c481f8cce7043c2e84033e9ca3810a63e5b272e1b716993c +48da6bd8aab1c70e28f2da5636a7757448608a7d36be50ac184c3e4a58d108aa +e1aabad61f8773a698546f22f22df892a2ed287cdadf8858c86eece0bb566af9 +a0e48c19ae49dd2389fd38f2937ad3e02c8a8b281088affa0e1c7f7829d1b191 +9c5ef6f3ced2dd0c51f6e18de1602df35f588503b25039b79c371d4ef75e6ce6 +7514d977dec3af3de9f7dc7ab9064cb21d8b35b4a7efe21b6f4681c090c55aea +1fd129f665053887abb1b5fcb09296c6226ceb394dee57664ca483e9d7496dbf +10a480d97ff4af0ce136c51d90c3d8c3734536e69d0bb4c066d1bb05184fd7a2 +374328b352f4cbc93c613309d0f83387e565c8114e38677ec5972a64f701a1ae +8ea54f1293f413123df659adc7d8e9eb0aad32ace9f2ab0f69a989b3bc58d13e +8dae3890c928697a353da54311cf1e98719a82ff91754ca207409b6c10428228 +f78907e8e9e21f1cce47eedf402444344751d49afbfcb460b6d233ac8bc7a569 +32a3362bb06a575f686c1b68716ff9c8c93020fb6e5ac189834021d09d12d136 +529c6b5e28390a877a3daf3392e50dc60c4653f33abf9cd550371d6af3bc340c +b5c34ef3d2ed6bda5e8e2b4e97a865525d21d43ccb1412f545e3f1a84168afb3 +378248f719bf8dee72e408caf3eee889129d389cbbd62fa285ec9eefefcdfe44 +5fc87a84d103b3fc8c349f162ed5d830b5e7ab99cb2f82cfc2a83ed146999a56 +11873298b1c8e983c539ab6acffb13be2dcde7816a7015c72ff2097de9334e76 +4fe9359d3b3f1b5dd5ae02ccb7b1175e5e5b2a5d4414af3376fb605d805446e7 +e131cfee56d1c41dfe690113b891a4950d57975b1d608a19cbd10d4d53ebd4db +c6d78c9cf7c06be5fd47433aa18250fb896f3db663deff28f1976e93e7a36b4f +50830f7b0b5b47e2c0ca4a08482290aaa77582887fbbd330ad0c0c412ecd3fc6 +534baf96f8739a4df7860f73b8abf2e97d3567c09c616b432235e0ea8505cefc +26c4d7dc44f7789c338c8561a9742cf177620bdf68209254c1b6c83f26ff44e2 +74d98f45a913751919506bc3720cac860c01ced3f825d357afb098a5ae5db776 +63911f63a83b586e839d08a94715de06dc3765bcc949539394d75b0c6930eae1 +9c8772443ef8f8f1403c2a803100acd0305359b7544681097dadf07259fd7c09 +e80b28c4e0e75ed038feae6e0b3ba5d311d21f716d90fbd1aef28a60f84f8e87 +0a4d395cdc956ad485934ca58f11cf9ed829c4ecdd984dec9525a736cabd684d +db24ab8b679218c355faa975d48e837066f017fe39cd135199616461b9c7c77a +f3a986c56243594ab113115385bd8de3e560eaa3e468ee419f9b97d3b20dcbe8 +1a64942075d88d48a2b28c39328ad74e2b02b011331f655066b7790d1e2e68d0 +ed7298fc1040fdd407acb03e6dbf680651a9068082db7d43d1c85b56bbdf299c +5a9b88b8608d2a21d7a9267d952d71b786f7cdcd4f63c13fce13c6dfd88f20cc +874e1a42fe2430c0c0da698b021a7e82eb668371d7a8559ae906d7d6a0a60502 +c146f7e838822f22e4d0e1404cc853aa913087dc959b2fe1fea7131a4435938b +2ceec71b3101fca9c4db903372b2cb6a6a0e88748dd8479cf0625a7d5159913e +69ea97f5153b3fa681e940b0c59c1c4193fc979049b88cb38ea53e64ce6da9e9 +d77abf19140f3abd0c1b89f3690b59603abc202d4e0437431c8da5b6a2b1231f +89723b569fcceef6a78c38843df658eef93f6414ab589c77ff88c25a1829cae3 +ea663f93db354455d10f4d40a4c075650a4e84a2468fe985ffec14548e2896e3 +b1dd0616c0a6b17681e24fabd35501bb0e446244dd55cc6a632dc018688d2b05 +18e7c16ad731096807c8c7984d9a90df59d2ca0649e1f7111f105fa3808df731 +10de360b039985e643fabe223c2836e1a992a5eb2ccd396ba1fc1be39c148e3b +2f1414d762e9c95f1ab131aaa17d5632f6b3c3e566a1f1bc9be2ec3a89b595bf +bf99ac8fd3963d7ab464059c643bc6de1e806d5361b55731281d2556878d1087 +10f4f9f79598e4f37a2bf74aa4a94e563cd226e50d1244f38978bc3994b1b082 +586e5fe3723cb33dfa0c48ca249ffc20283e7e3a84cdb0d8df92e540ed428fd2 +0943e502f763f7fc0c879d6a18ac22c7b9fb410761ffb5e60e2698828666450e +aaa8e0c8d5541036badb9c7c92885462a9e7421c8923f82d978074d51483e594 +b0d24b3ab7306234079f4f52186a341a8cf7eec6485a491f558c50f86aef7c10 +6fdadeee7dbc16438b213746425c80bf19ee1ef22ab8952a6a91cf1629d027c1 +b4ec94221468a107eeae9b727e1463c690c41053c6ed0d27adec33586212cf52 +c4aa47cefa30fc2f22d1b36cd731f8818ecec6d3bcec641fcdfeb74f37f561b4 +f716913c74df2893324861227e362084ea3efa36414906bbe0ab92b8dc7360f8 +ab2dcdfca4bbc7f23ae6a6ec7eab609a6d04fc0eb78d95d63a7be15db384a098 +477c2d5b367996fe969f6b26be3d09a2ab3c3deda2f2ec4c9bb2f0646bf6124b +23c91547ba42f72c6d4ff83478769924a09ea982092deaed2445530f7e62a64a +6c6944f5c8a8272c7611fc494fd7c2a9f371bdd05607ba865fbf5cf8627922ed +46d67ad28c4e8a01700634db291a8c900c37d8f7cda706184bde8dfbfda3cc1e +e6071783a69c4fce21a094fdc2d7542d005b33850772f73a0e7ae2c6e4624ff8 +d77fb1e978e9b013c2c2810394675b76c7ec45e39f8f3dbbee1a92e43422ac76 +d9dc26e9b4163fd449f1d2442f9a17ac6034ef3cd200d50875b89843ea4ac7ad +10c8a2cc4df2c690e68c6f1070abd2bf25d6a62dac0da009d9b949cc257b4941 +8ec05287561ab344e71aca7cb870e71fef718dd65a69c99cd4173cbfcfc8155f +f8e67003b086437f488af5497fc9416b15fa81d22709730f32ccb984ff67e291 +355503d6d6253fcb17f072f324b3259bcb47f2ce27ef9708fe4b09449e99d575 +030ea81d86622fbaa1bd1e347105a283f2b394e5a541aeac32151b376464ed0c +96a2282ae7812383e1434e766f240e1379dd7440b4901a124607c4463b6328f8 +25fd34dff1bc61dfc6c3fb2ffcafe3b67068711e1635becebf8c890c62f342de +baabd191fd7f17369f6456cd3f69921466bedc81966b1055c49fb4d139f234c2 +8cd8eb0d15ceb048def05831b3e940627b2f98ed44a0cb193284c616cb77390f +01cf62e583c01909a36b83e9dc1097f7d946b30edb637f431ae85871f33f24b0 +0f3d42e09bb3cf5b9fbeec56c2762d4c7e2571c3300058af94ed8a09ccae9e60 +420e3b78dbe9b76d2e661eeb84162d2514564d3bd76e59ec2385ea5ca8e77480 +cbac4e07de6aadf16a183fc172d5c5bf7f979a77660706f2df8fc7c49cc77f09 +e3232aea4172e2a10cea4a9753724ab2b5a31e40febcaeb284436daa7328bc3d +48b2f8ba50495e566df032f44d23a1ea6d86557d48a71c7456c415562464c4ae +0ea04fdc6b07680daa44a90f34b59dd67802ad85ab62ddf3790b8f8a8b8660ef +815cfd50cb8607affc2e4fa152157101c957a422f4368aa35f9faa8b6735c27e +7c6ad626bea86f8b66398dcf40080a2ff60fdf8431d0285ab80668d39590351c +588cdbcb8245e5b9d5259ceb2e95f6238f0dc40b5406a15ea059751ca482b345 +10d6f256ba50792b8adbb790bcb9b52cb37cde2ba2029afa435bb4fc541735e4 +f76aaa503353a8370ef5a83bba65cae93b3bb20d727b24ac58635746de379ba9 +04bd03403cd2dd8cdbbb96282ff967bb11c89392c5510c1889dee5d2126d1e22 +c2815a7c54b10aaa07d797e0337c992bcfd5e023a0dd2603913df6fd060e40de +ea1905d3c9da64ffebdc539bbb00792a098e0aba893cee2b2222f62f7bc33b9c +0fe107b99feb52d76b600648b32dfad7f7edb025b143b445c2182c8278da240f +8909e3de7456428deac22c0fc88c3ed99ef0444e762edac64c4a4afa0b97a609 +58c607172daf23b09bbebbf040b5dd5b55cba5f2bb1e765e359d1a80c6df7f76 +c703baa94076ab528d326cfd0a31156698b9c9c3ffe0f13b7711ee58276b8422 +80fa784133d0e5f5b07dee16f7fa0dbb95f7e1f5c8ba8b45ff72d64586fa334e +0db8c968d3628ca508f945dd9189d1f7d3462897c141d080dbe946a66de8b2fc +2f2c89df29e8ee18681c8f01a43213159b9cb09c121eb73a080047b9706d4b25 +de8b147972ae87932835a6f4f12389542de405192f0023ef363327dc02af7ab5 +f3eda2970f67ed2e5435c50c522dd8dafbe0dafcfcc58daf945657045b3bb9eb +a9b9f8894400f2c1030c752e4ea6bb093fd5a09fb95bfd484cb326afa941e2d9 +6936453764c5828552529668257f87fee07977cc6d217b5b923808f93000a451 +d7c26a81dc47a1e7fffbae8016303157ceb3f64af87f5a2fd8c8dddd04b8ed7a +809140824d1349bf77e19ae91f8e42d7550f4163570d87c349ed3dbf427625c4 +f18245abc4ead1ec09110a30f4fedaeee971a2fd5c4bedd0bd1c80576da035a3 +a2527d163b2198e6c483ed7b14e9882f0a4ebcc2b55b204fde963da8e5358371 +dbe833aa2c41f60e98abeaa394bcf0212743fc5a3efaebb77d3206362db106a4 +2c57562c547826a558bd82bd5dbf7d853edf511135538d554c25e94c40b3f73b +5c79f9cfd585cc5cd1f0aecd196c019adf970563fe58627bcdeb9e2e03471e05 +d90d43ee6a20a468ab4ae304d8ac4049cbbbceb0cdce45d38975bd8f1ce5d1cb +b20fb81cd0507a3699c888bd8127aadeafb330151049b09b3932bf301489cbf2 +b09f7c42502e6ea82041403ede92b34f1bfef5fb5f5d920d5533eb4d65445c06 +7899f0e07e081795c9ee931a34ee6a9c65e63744db3f97815ad946f41dff97cf +7099378fbc99ce8e7f0c7f4f4e7ffb5089e970085b74988304ac99c229df5291 +9be0d25d890b071bea811aaa588d28f78e6331385c5e12d03682567e5abcd599 +1b51b54a680759f13683eeea378081c76234cdf5e3d3e5faa8363c2e74a7adc3 +92e744d370d8d466a7e1461907ebfa43f44376a7323847ac162c24ebe8ffcd9a +3ef3f05e197604898f9dd3c737c7da17c8242b8f7a261774d48b822831ce02c4 +f9249b22cd805ac81a0b9fd24ca446594cc50137223b67b97507d18409586cdc +aab9f58cadeb6e5a1f9a843b7cdb58adc014d4f2f7bee89cc3d207a82e6b9e7e +65485bca7253c6668629c44632120edb18b3e4bd170b5f431c35b2b945f55f1f +e0181e92aa60f35ee61bda2a2f25dd60afcab8962077b38db99c12efaa3e62f8 +024bf9e864953cabc76f42827360f39ca838b7b603b83f2c8acb52b4bbccb905 +953612745b0a8ee64753f5db78bf77762bbd7e48b370ae59f59a3609737ba1bd +d08e30fff8ec11a92050a7733539758889fbb3ec25d7c287e74697f80a485653 +1453d337173bc751eb122095af020c6acd57451e9d492d87130f898073705b05 +d044c77d42bd91116dce3774460fdfdfb7942c45f3053f13e71cdc7e5ff368b6 +02adffaf5eb51099c87806cd481d923548e4a1b153f3518445c2734a5b852ef0 +7028968378a565dd0245685ed23165d93450a2fceca590410aef8ffec0747afe +a184ac2c6ffd4252421a3fa67165c48e1c0bba8b039bf3c5f42bc031d8bde0bd +075a3594ec943f67ea4dbe5d5ec1bedeb833af6bb8c6ae6a3974ba1241113597 +4eb0a6e3107654d209fc0f43416c71645605a70ca1f9537eb49e2b901ec67028 +63c6a6b6a142dcb22182e2cb05a6572ede50e2391943b3a589f496af92bc2053 +3f68d7ecb40d1cdacf114090014dad9b9c00f34c47263d626016bf57ee1735b8 +5944bee9cee9d46a7a78bdffce9015ba5120b062076ab7968384404bfc7912ce +0025ae48ff3d663aa3b312ee77b669ec2b4052794e90e85a7769b500c709833c +607a352a4e69b4fa6cf41908453d07394740bbe9cf4501c5a64c0603c6f24812 +85cc4f4d1b22fa1281084b24f73b3436d0db59f2da5a100cc70f57c033c04dea +cc78a56999fffdc14c143e965bae844d87c7f7cd59aa05d352434cd3a70feb77 +3e878d1bb0bb9681622449483923de84737149dfc0566962808602790de465dc +86051f569beae85236ecb0b6a8de7d2e5c62cde8c13830ba5d3a5943affce66b +29f771f8edc3bae0df9629dcc9761b2caa07d29b92aa72564e700ec9bda0340e +71281448fc01a5eb62516d5d921d22e69b54bd74e30f85fc52647ca24fa8d273 +4ace1a25faa68a654bb60827585a9b5dc901dccebf5bb02437b6456cdb93ee83 +3e226b7822f375d60a1b75cdcea40dc0acd32f9aaa39808d24043098d76e7367 +26e24d0602eabbc35d28509c64a4d66df7c008d32e5964de8aa2c50134a00177 +81d085806a2b2783911c89f6876c1a4964aff3e59644e05aa6fba05e970ee558 +614ced908bb4838b5fb24c1a3458ca50a1d7e51af615549d340cc334b96aeb9a +4aa99e74f3939a4b640c653b03181a4c54d45604da621d4fae1aa04d4237b7cf +9674a72b50e6f26c07aa85343b43e1cc4436e0b326b890440dbc6ff36202f144 +e118eee07c880f3d5121834366d6b174b9d67886b62ed002e78e592a42668cc6 +31e500ee27ab1beb2c87a7fd3b1f2274efcabc70dc189b942e55d6f3779d6bec +67701f5aa3efea75615cae8bc8ae937cd29b9a6811f9ee11585e39b69b09176e +e5b0e4a8cf0c6fc393fea31f0164ba03ccc6af688df68f4228868cd63a84c480 +1ae93da9c45f79f384fe3a54fe463d4c7853031870c9e14687dd9dd76b9db209 +9c21790b1523d2ff913552ffe62b3b371fdfb87919a2d961847bfcb4131a901e +9a8cf933b2e2693a688e435ec50b1c0800ff31c63d1f5c7101fceabc9211860c +d043f5a575ea71977c7a5065d927a4de2c7752c02a857b884910df8511eca9f3 +b81d36526a9083de5c32603649e944961781c3966fc6c8b9a7c1aefa7e08e5da +782a9d694b8ca6d5c3887617e2bd3b5ddcfa2f965b78ed018a217ab5c4a4e538 +85ffb9485db87327232541ca112dec18d9f6d4e66256c929d8c38eb634cffe5b +b4b3aecdd3ce66b85d9df1f87b3cabc609ca8d1c5bff49215f8c324bfc42dead +64c43bcea81619ee6948ca0dcaa9c7e2a19f8b9e830b9febe1a59ed5cb8d650d +51ec17b2844c9d67184557654add27c135aec9c6a6bb2068cbc4edfeb82133ef +a5f46f0dbcb5996702b4b1b67b3cff6992ef64fcbacb316e901765a87d76b0d8 +17d389d165efd517aa40f6c75a91cf060968467c82b1294f2abbf54a35227b61 +3b3bb9d32eb143393796fca19b4812402f221c7859ab4cee3777a52f847ad8a1 +3c637ff08c83a58e5389960e44cbea061bf444fcb64e613f8f47bfb1990c5d6c +5da42c20b4199b633f3675d91f301fd3fddb875093d565e01f45e3c22250358d +1a7af5ce476b44245788eca65c4db73bde810290d8a63e59f30b3c83d16c5c62 +de36b6dbab5d10659924f32a5b876c1583cd8bf728afa797b33a6c3c0d85b40c +536b2c7d1ec7ef7ee7a9df19bdb5fac451001bd1e8964a320209372646202954 +0eed46fb166faf15f8b10b8515724b409c7461a738248f60429976bf7ace5a7b +bac4452ac45b5cd4caeaa310f154d78f101667fd22b0e69bde93ee67c68913a0 +67231e0b73377f31d3bbcb61d8819e32f0aa013fdc543ad95ea5f48cf95deb9a +70c31b233f591549701daebb81dce7c3f6241d0a4c562bd9e267f55f017a20ca +d232044a680e59425b8c072682dbe71e21c7ea603056d9ddc41f16f26ee5e74a +523462e49d58fca01dc10d1ad6b6629cfdd36c556f8fb347af37886140a145fe +4fe9e34d22e5d7804db730cc076ce074762f3849c62ac49a2d66c707455106f1 +ab854054aa54222ef6d5e628c8065228723805076993d356f0349243d9e43abb +968eb1c9998ec26447bce6aadcd84f0b6993d4ffa5f536fec6e12943747aac99 +c253f9b24caa7db44311cba889b53ddc5664475c22526fc9e1e700b3d38b3568 +85ea0e60d4146811e80386c11b2ae0e2eb94afe92dbe3b5a82fc3b7ea5b39847 +475b707b4058e717d5ec2d599db0f27c04a3de4f85bab108f6d1463183291cc4 +75edb7b62e0c1d6e6f0c5f03e5b9862c6e5b1fdf755610ba188ca32f5994ba24 +8c6a0f6e1a6cbb2378b3f29c4543511dbff9345a6992fb19d67500372997478c +5618920ea5a62eac4aa661291c8a3e46a26260c8658178e17605b413bb89cc6b +fe10c7572049fd36357290dbbb19a670e1244281b4b2a3ba60e1b322182183f3 +96d486b97fa3d435987879c3ed1a4c4a5e1794f7594f05ba6a1d75138dbc76bc +5994ccd69499f4fc7c01f0b0b04a7e2b8c2c3eb6cc39a6e61d8610d0db8bbf88 +074959d4efb3f4e638208c7935e08d34379884930d8e99c3465ea4d4213a8f41 +67e091345d5ead21e5d9cb489f2666c02a25c938cf7686a943d645feeeea7028 +7e1885a3a2b2cb9d3b3e75896058ea924009f40c8bc017c82495de1f8ff0c62d +3245610b0e5d54908eb3d96091cb87df26ad8133c46040e168f82547a32346b5 +0175b7c37b6bde3f345b4322f9a57c25363d32d1988941be4a84403c0e4d3440 +c840be8d4697fcb6678cc2db85fc9d6ba2f59814f257f18bf17e57b436581d95 +d391e318081d75a1a9d8c1fac834819a82100b47b78424c28871ded159b5e5ba +49a2ba27f1a0fe358661ef98a937baf3722a1b471f269e3f8cfed8f4b44ec694 +b38f4106570c9ba31a30d56a594fe4bd91178389667c3d15b54cf7590c46b9b9 +a1ce513f45ae78bdbfc81a820b2ea832f390ab3d389511add1f30d1d07f97e7d +fef1e1f796826561873c6321e0915eceb5d141d5e8d9e664802f39be458850f1 +69990f176dc24f0b3148cada39a20c3afcbd82ce6fbbe0cec2f3cd6dfe390b96 +f9c450e3fb31fa357930ca4a2911b3441e4813db96daa79cbb6b6da2ee464055 +374194ff4d779d0ed6baf67e7c06d711fe1b5e868c1a4e6c7f3ed529fd3d3492 +ad079fdb6faa5dc0924400149ce79a9ab729283669917b2b538f05bab7596b8b +bc9c86cb74481d0181c8fc2b0c333619b96c63b6fcd352f0564862205f685eed +ff81f069dcb2bd3d0ea80b86952f7efd67ea8b60f3e90ca23cd176c76d73cb1d +7c7de170a4196875e99ba42f5e53a5c3a7740bee37d08900d68e1a5836ad4c45 +2f325a1fd0d49f74e9437f2d28062ef5d2934d063f0521ef792638fbc96af2a8 +8bf23e8a33c7079d2abe21a018521acc0e14c5508e629fd83773c9f59cd37fa6 +4a121bdb1db13d1c598589b00da37e78bd59d0e9f3e6d3c99054626e9e0cfef3 +35d2dd25c138f96a3f7f62e2ff2ff12010049edb86f3645f0272f36eeae0a60e +532cebda1c0c0f39c454e251aa6ee1ff82536c1fc1c9b7c9679fb2deae693a02 +9eb57eba3882901d2dd7d0c24d5f0ef6b799080e98ef048eeb4429ce058e05d7 +6a296e34c80467c71fee0d41a366ca38b6fa3c5eb7abcf854fa7adc4d6ec565d +7d8c39d192fb3b06bb93518623a1b1c56cfe095354ef43fe73c1de5541a7af68 +c51ba01019d7685596d730bee70268 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/courbi.pfa b/ogclient/lib/fonts/courbi.pfa new file mode 100644 index 0000000..5162aa6 --- /dev/null +++ b/ogclient/lib/fonts/courbi.pfa @@ -0,0 +1,1940 @@ +%!PS-AdobeFont-1.0: Courier-BoldItalic 001.003 +%%CreationDate: Tue Sep 17 17:04:09 1991 +%%VMusage: 57715 76639 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Bold Italic) readonly def +/FamilyName (Courier) readonly def +/Weight (Bold) readonly def +/ItalicAngle -16 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-BoldItalic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263789 def +/FontBBox{-48 -288 860 839}readonly def +currentdict end +currentfile eexec +5c03f98a9ef1056084234938772b65b659a297a60831474f7f06192b155c7867 +6e337a4b7c45b34a88552e942ea1b7667df4b71b67df89e141537fb4b1d26675 +7b98b6502e4b2246f50fcdf717d3a5cbf57a5bf92df803946d950138fb0acd1a +c81f3f66f82ef04256e333e070972e17b42d661f50b27463cec7ab9995060f63 +ad76b5de2ee0546d9a2e43488699c40c150f6d60a9fc1dd3b5367a87d081de8b +a232ff2c4e9e7ab38f13f20d747cec9f5cb36fb8ad1b9228a42216d93925b91e +3643f1c2f86f0ed4286847196391768d58895b7dcd757d9f656af1125a11f291 +42e28ccf91a17be1a89d3214be746c4fb82da439d6ab53f4bb12358b2f8c6b17 +32fe22465ba0dfc22a955139b55389d1904f3f742faee44c1af9c3c9f588ac13 +3635df24815df9c92f7ee93e79555f834f18f20eabf3b2b7a815770715bd2e16 +4b1fcb206e2fa3aacaddc54d5d61dce9a8795d8f346bc180a550aeec53154733 +bba47e38c6be925bb166c8b776c4350935f15e3c6123f8a91c65506f2ff63ac5 +d79c7a7519f9d09301a6de5052913938ed21c0194306c8ae995bb8f5ab991343 +5def56faa796248a10f995ff7d6ae352111eed560620bb6ac41103ab077d7cc2 +d97a20aa0a9dfabf6063f3a600f2c12fe79d30f9967788f90f5285da7c197d4e +58a9ed99659dc24269914e0c0582e37840b0f6ef456b0f6b445b18e6b5073f41 +8ae4fc99f4998da4fd8820393e41aa4f953ceba2edcd901d5b7ef2fd026fc8a5 +26610bde74dc20173add2c71dd98cd1b6445ea20f88684638f269801cfea8dab +e4cae300090a10211e08e37e65b79433989f2a3d888982631301a76e4c68a604 +b9ffbd0b7bf26b12cec3ef5c6af999e72243e396f5eaf36d7a02fd686268bd85 +d66d617e51c2c7a5033d160b8ebe9b7d3c0595cd0ec31cf4b88cacb3e74e2870 +ed7e20f88905075cb6821889e85fca3fcd5a397d44e9150750b16260177280fc +92a20e8b891abff9492a07144e9ba614d069d8afe28441d03d34eece34f89640 +1ae1c190991de2ccd321ac65b9b575661dbb7dd5336f1af355062446fe088c45 +05d9eb7fd3f0740528564f945ce3e13e5697b23e1acdafb8322f77b455e983ab +dadbc73bb4c8b593eb357226060c4f723311d7c48435ed02bece6c61523c3c75 +5be81484919dde97279579df674527ae2844220a490187e9350e34ddcac7c82e +e1fe5cd11259688a987d6127565904904dc3d4ab7c41035c5258a9841dd2120e +de49dc1ae7f4c308e169098267db701bb94b4862ec87e13c4176a3b362f7ac17 +39b75de7bd9fa615fed494334254229a30da7357f1015f7d2983fecfd2cd2444 +6e697b50f2b8e409e73e46194c89844ee5e5ae5a4d646587ed37a0255b86fd7f +9c287a61cdbebb354185d2724464a70461a29dfd3c3a98291654bd13a64598f5 +4e23fac9ad312e05d6c689e529ce5ce92e97ddc924bb5c7ca024bfaff8e2021a +dcb6f07bc45ae0f8c80b693fbab5c1c66d5655e7de5151f48fb0d5972e2f523f +790c7c46663b5032f62a9a510d75f7809f3c7774d2f7378a8de57a912058247e +30e29f65e7ab0a93ca198e6dcb287d7e44f01755f849cb46ee4e8a5668f5fe25 +a4a579201bb36e45d4208fc0309d5b763cf6f5903f4c59b3527e11a1d594f9fd +d3f6e55a9ef313faf9ee6d0f05c3948fb186cc981ae63de15e4aee46d7e3b623 +736066975cb20d00149fa393a35d8aa21637c73c396aa1706d4486bc38ccc199 +573e5c564947739431f445a8620383c17350a9f818acaa67ef7aa609afc1cdb9 +44a8a2c76f2e298b1de868a5c379f8f7fd05af8e66b55858d579e09c84100b7d +9aed565c5b3491b2fec23390ff21231bc4d231a75576cb7382619f0480126a31 +ea8bc6b2b1535c7bf260351756ee37f53ebe18c7115a594001dc5b6d3415b88d +8a2bd9167a5ad2949af32718aa189645a94fa2f5ee1c07b8c2a6733fcd44b21e +8adf515da9d623d02a7a0f4d34d7969454c68fae43681a970841a4fea9da5a94 +445d4fbcf36ca7f185e8f7d085fd869203a8f3f9bb87d31c46f459c1c3ab4854 +2def58e42fbdbf28cd14d3a1bd1f7d8f4bd136ca919263dbb3c52ca2db0fca55 +110940cddc11095c5562e4338cc7b74b0ff0c6370c1cb155154f0360220c82a9 +9fdb9eae6e988e28d7fb0d44869ca4c92667ae358dc1db7601ab42668ec40f50 +14fa64b966506873d63ba425d899ce827cb7532eaa44cb8ca1e5763399387a8e +6dafa8b3b5852f23301c441366956805ab69dfc15cb156ac11ef709c651ff3b2 +064a491521cb0ba8abb66b99119d220a197516a7ed8d4d5d223bd6c2afabbc9a +be1daf6a4b9d6064bef32971984fa314e9f3a8eddde83b39075b3b6f9f9f0b52 +793655e96efc0cf833fafc4460565056522b189870ab1493638d6cdca563e6b1 +793516c25d149caeafa2bde531b397c4beb75b09ac16430b4219ddce0c4c6400 +1a32fdd1385372158ee82b837becd6af14ebd1cf92ba934154232cf3f5b4200c +41e65762b0dc5120e7034e1fd4774a0da978e6395e855c8cb369e677adc49ef9 +f4dce344953fe9da428bd35a79b6d6155263c0fb306f4195a5a181c38ba432a8 +1f7039f3221d3700d584e4018469dfe590a22c3bfcbeb02c56fe0f0f5b93e6c4 +0cd8225b071022e08372ef5c5de6de6d24e22640002597d92051197a2b88a27e +071cb9c6580212f6dddcb80185ca39a774a905b447b5b836d72ed90faee84a51 +d9f5fe37de26e4a3e5209cbcf989644acad73eedd16f028a304e0eeff26655ca +890a74c6ce61b49b81a191e158b6f3161d6ac5def3f084d1c0e48022f111bdf6 +091916d4adb5284d062c8d71d487dfed925c4f26fb6796d36eeb818b9ef5c503 +3d4fb3bc7b4aab1f562b563bfab9a79ebf49777f6b8c0dd77af6e4dcacf81688 +caf05981536b4e91ce965abe966acde3d304d9d0f3b6433078a8ebcb02ffdc7e +c210a35c7dab3ebf015fa81b6dba86e683fcf8962117f44d68f562b4f7c68c0b +5df0193ae2283f35c421c6da43dba3419c63438ae46eb65fec9d8902ac784015 +398706463e99a1cf1554ecc16494477fdf68d40ca992dbb01816d410662b743d +f0255e6c891b1482ee1353a5cc268a264e300b94d15aab2fb2f80bc1f0b714cd +7e1546bb733ee3db28611f58fe80bc6b4bf8b637b00fee2997cbd2d2f8808944 +f428727190675e1dbe9e4ea29869af8729248ba59abc84861be3814e003ac8e7 +f8f7d7ad667df77d6b9619d5776bd048c7399f01b3688730fc94af5fea41e905 +43faeb064b8a7e8c9ed0f04631f4223730e2bd7357d6c4c114419a2d4aead49c +d2ed2b619a15204c8fbecaa51802f3fcd8f201ca100c36281294f2cf2981d59c +ad0d9e2ed7ebf964dfb3a5f2b1bee1b3f361806b0a5f7a74b32791644d5184e0 +2515f2122ca3e24295e4aaa1165bfcba0ebe9718243db1f4587f24cf6a52f92b +c2229b9fdae40d1c97b6bc6eea4e16231fbd92592ef326227fad7ca81701af4f +f47a2be563bff9d42ac841df2914b89f372283b77d62faeb611eeb870cf9b052 +dccae0c500d9ba5c86f984fca0fbd37e813fce5339e177da499e68b74965fe03 +6a4e030386eb28c668c18b04bde229c53c86941d682ab64f0ef33c47cda25acf +91ea2c53beb3a7552d69b092a76ff6c496d84608ead8080518943a6fc57fcbcc +15da6f2c62a6326ce45f19b403c65ccc613991bb5e493d1cdd913269816341dd +c484abade62ee0eb0f2aadc0fb4ca2b04cebfb9989611ef65b6697fc6f0fbaac +6745ed1a21dea33907385730bdb0cdc2fc37376ab389267ee40056eee0e6467d +8181a77d6478b78d4c140ba7427eca7357e0f7d5f72324aa1d5e6bda674c5743 +4fceef4a522731a5092cde4ed87211ddfc4267b93655789469d47cbe3d1cfd35 +2a98cc4896b7920887378174447ae1c501c55aec394822cd4beec7ee8b9b042e +d6255479d8e1aa7a5efe0f486417e5a5e6f6ebd019aedb0992e033a8436f4da1 +44db254c8990b3d25a7786c1250d71fbfbf6f0e45faa7661399f12089822697e +62e4081d586ea80ae533b192cac92f9f59ad445f7ddd088b66b307041b737ab8 +cfea19ed2a9d2d35bcbe1cc4fe4487f09288e7e85b98ddcac4b097038b8a7905 +c0293c2d66739bd457cbdd9892044dff52106839c707b2e02fc433bd1d1197bd +3cdbe6b1e55298253b09f7ce80b94cf7715f2947cfab6dfb389e045294424fdb +6f90ec45fbcdea39cb05c6d0a4614c33769d135ed0d6a6a5a4cb25ae1d1dd408 +51aadb3b4eec2651c290a62d95a9ecf17430db06a42593ce2d06d3590e76b929 +39a2f87c2614d353d109717fcd46a7f9b6795cc840ba6b4ec37502d3271d5ff8 +09c61aee0b67bc4b8629d9ea756fdb3724b1f67ddd7b0f47b3c47c4c067885eb +d3cfd3b7fd4f949bf87994709f5f278a699b3addcdde90196b5fce894a44f3af +82034d0b4ad4ac692f54b6bc07b849bcef0b651d2a1b1f69460bcb62985cc661 +4da60cb063586207661c758ec6bfec68b1f03a32e9b41e8742fe7ee126411cdd +f327812a36818f8a88f4945202863de81671c01c608f2387d1de2d7e686b5f20 +b7dae705d654112576d937efb9cb33ee65b5435ec9ea9eba518b3f9f1d30b9ba +7f7162e86ea5082e983295e074a854f1be92f637be4e7d99a75b582ca29f968d +3585e2f6481ef968c08ce36976ee7dc1c1577fcf9cb546130352f80e880ff81e +3458808bad09930300f85833c920c47d61f6be8ca5a5655eb4290fea4d4847c4 +bfe69e08c0a5cb8f58455f27d360da7950118eb86df84f490efcc4969827a14d +884551b1185831850fe284b53b661098d1b145b3f2a16ea5c7ae601756da6aca +c141e3ce0b4079accf03fd2376db53832bf0d41b49da9063e79d63bdfd37bf7c +94906c6cd82ee31e2184bc695f2746a01cff0373b369bff632f3753058cba0cc +2e7339a4c85170dbd24fbf89d917aa24de7583dbb8feda459081af95940e35dc +58c7d363511b82b95d983b6679f11bea2675775a1390bd8b1f66afbbc1295bf1 +05bf399faf1665bf04d975b31d031c6c74e3ea1489c57e4826263fe56de76639 +2698ded8780494b338640fc42a58c354a49ed70301b128f18e1c33c45ceb89eb +39ee8c97e200dc39325571494b49851ce1b8d1d0bcf79a3120411a8b168a7758 +15c0eb119ca69ba8fb227ce5747785e4a096f4b35eb15abf3a8f45bfb50246ed +2a3b2be2d639fc263765a00fa0047972552466f8dd6d596bb6812fe530d78ad9 +5a6c1f0c70f003d4f5d6d255e747c99c7bad63f97b51de299f7788ee41f08ebe +f60f52904502200fc62d912560792ef032433366860a3154a16bde3204401e00 +3bd3663669d15a79596abf25c6770bcf93012334db1f1383d80e18f783b5088c +8e03e5537396852caff77cf3a15899d21f6cfd57ca4e73aa5a6db1d7f3e7dba7 +6a31baa5d770072c9a29c06010bffb0a0e1141c7d9ccf6193cdbe7da527f4cf3 +e63298fe54b6e82d64bebb75fdba752968910cf13b2320eef043de5a140ec54c +01942dfbc94375e12a9612cb20d117f9d3e0878ea790088bfdd237ebb2caeef1 +6e13217f0f83f508777f9df0e37843fc9216a06eb096f7d6276df5ae8cd9db39 +25a9bd2966b7c3b58214efcd2f9af2636d9e9f73b09b4da344a81f7a47dceab2 +b23238f002540d017bf200bdc87bba433c7d7ec3b55da5af20c37cbff34701c4 +35f091ab701cc51c9f0191d5028668bd6a871e4d08ba19170f8c1430f1b542b1 +7bb65c5a95924a1093c04c9af060e456ae7695ff5f6bceb846976bbe437a780a +e7cf5650496c859eb598942e3700e7d1825e0af3bbe764369a7ee75f14dcacb5 +24be8cca7f80985d42570543532aa5302964f5d50fcbfd1e094833464c361d94 +de5ae694e605271102112615143f68365c9a626218b923b2a2ca76c4e8707810 +f1cc16d0da031df23e71591b1cba436bbd25829c3d0f0eb60e8b85d2f47e30bc +b0abb659bca53b96cc968db4d82f0adeb1467b54315451bc89e953e1e2f47141 +174fe9a4850b451ad468afb338539e2faa9320edff3118c60a5c4a7e32a072fb +59bce786196cf4fecadfe62c4f3a000a230169397f73388f06d9c6ab33fefeb5 +b0c93ec5c4fd02ebd912fe85eca4668d8723d9a755ec2501ae74abac9ff03238 +d8f82e1b48071f527443f2a94a1f90b6f2260ccbf51b9bc2de684a2a8563beba +3b05379fae11d6ec2214953decdeeb994dfa50847ab7357b121abea5672498b6 +9a52b029e8c77151bff878f7f30fd0f9a40b8e1579a8b672b7c755b68e28376e +4b5becc11fce9480bcd2c10099447b4e6b3bbcd3b7e84ed51c633290ec084571 +ba4665bc26ef665621495045e18e2be0ee391f764d94f7e631d02c3c9191637f +e49b03f893589e3ad60281ecea2160e8171783693e04355722ba6f7c8da1db86 +b1ea3004f486f94e9ccf37749e8a0e927d15e84523402684c1fc4c514e7baf20 +d77d00506cef1e9b81fb8244f0d6095ea861c446948fdbd822d10df5d6a82c3b +0af0caed6d1fe7521c6515665be4a5e10c8703c8e4d7db3a735119fda2bfd79f +8f3dd3accd038fe9158e33cac57890e6fb22b41f82fa854e1b6a75cea187d2b6 +18d4bf9117bea6261aaa838ead2e50c115c997dfc996c8d00b587791c5285df6 +b5cd27b12e338a650f53a0ec9cad5bcb0f2053dc77aa57a766e2f8e290586e27 +924cd5a5c1cf0c08c48d0e7f9990e84644e9a6f5c9b49be9e3d7322b9b66de57 +2e5b0ab001a2c9e2d9782796a4a7475ae1bf45d9389a99371ea684ae896f3985 +8d17a6c734ec6fd734a64c6747a207ee39f1c9f896b6f6ccead910d8bdb9b642 +b141d1a57dc06f9f303947c61fe1d97699fc3ce4c66bf9953b6ec5ef743717cd +831c22f49a68446b3b8a966b8659fda893a67fda0cb566c0eaf31bf88f7b480e +1f05a59cdbc561b6c7d532252aa464fda44727d80b6581c7f8fd89caedfc3b57 +802e694b74dc15b889c838571cb6ce197439ed966d5624ba7567e60e4dc52c48 +c74e5f2c2e0282e54cb82a5214b3a97fa82e779957265a4acf064bec17700158 +8036c7b52c4c2233cb0e8b5b244de31afa11afecdf26a916cf1ac85847a51eac +6cb46b3b35d7fff18d2041a63d853535fd09213116b0b62a115623b471aa4849 +6d4112ed9ec7351894cb36e9f9a0bc1c015cb3110201390643b2925dea3a3dc0 +7fc8d62b62ebcdc38c2d3316b8ec0055c34acdbde86473e4dfb1d5e33266943e +9f777ceb99c757b6c6fb5c69cdebf31336d418f0698622f2a0e46bbd0094cadd +deedd149e7ebb57664649e550a850dc994df665b57d81b571e4bc6c0d25a470f +bb9d78ac9d2fa47c41675a11f3e5b88b567813256f4a544fcb21238a91e2e30e +c3fe52ff997ea81e1b0d9ba23e0815ea78f46003a8463158f6077024b33de798 +ed9c1b02aa6428d1dab23df5c5b055537b44c47b4cdea9c7783ae5d534e65b2b +4dcbc46156e6353307e0e510e4d63c2b438737671c024f29b80513335be3b4d9 +8dd586131c242b34686881b7d38deee1ea765c86e7cedee45e8f184987ef2e19 +15e668f56d7864d1a8ffee2446c74c34163d2f3b7a9c130ffe08ed50f82ef23e +de6b14e54da94c19bf1e845d52cfe4bb5799572993d3115c4e8026d233eeea4a +2e9aded6f4f13059a77a291a68899f823c1dc8cb477b8a63e613dc9aba760219 +e59dd6207ca3a22da2934773001d735472c921f2c2edb778c8cf892295482ba7 +6253c77b38ceab6254eda38eda2ade861ecaee566ffb7228dbbaf41cac2cecce +53631734fc3240ac314f0c027bbfcb5706cefe4f1f975a8e2ee0956b23fee700 +92ef2de443b84ce88d513ba4def345f5804f6b88752921e636e9f3805ad16575 +88415aa0e0de5696f58ee1f5bef9053265fbd2fb59b1ae56b57976169aca1856 +e577d8ac3f8682ac5ae380031077961b4f5109f32cf14844d5bf33c230bdfa36 +7849549ec66ace781a6872b0997b3ae724ecdbcdfe1e3bea3985c4c49a301c61 +d420275f26fcd495a44e006fb0dc4466adcadc04ed4e7d5327430b63da5fcbc6 +15df77ee82f16d884b82ae2ca29fa3ed9bef89c39636c60d9b3fa3b0979daa47 +247a16e7c85d3a2eff262f02693468edcbab854de2450ad5b57549cd210aa038 +66b7ce681a264c8fe84d1e9db444dc9384613dcdc5eba9b416e45957d6781b68 +2b91c3f421c8ab3cc4c34770d92c17154e67c70dcf432c75b9eb5ba31fc1db9a +deac4609c8cabcddebf16af760647e84cea4ca275a0172367ad1267fc4b53a93 +bda2df9bcf433ae4a97e97d2216fc97fc6471b30d717c89c070f8907a7606c63 +2d584eb26c0def8166b20e33e5801f41937240794c42b9a89cbba3d69edd7983 +702788b068646d730615f77cab05aff0d0d3d6aa954aad02b927fd16ad2e0fc6 +e867725194465abc056a13368c8ddad965d1fc158d8b2860ecf62f91254f5d22 +642493aabeddcd7936ee057c74b65c3209f97d139b4ee97d071ca97ded70b3dc +135b4f6bb4b614b9b873d8861803e52b5c1c244041ac55002271c638d59fe5e9 +81869703cd7a6c4bf77ee3c1e874d01e42e5971584c4fe6793c9bac4ce1e4241 +22267304ee3494db762355ad4ff4f4adab137c86b075c9b8f9d550f7c064c50a +f47e512f1249167dc28d02f21f46de36139b14c872cf9bc0c42cb876b9381cc7 +c193a46d0e7e4445af03a2b80f21c03c1bdb4c8e73a45786b4e3bbb461765baa +57b956e0cd966d1e6df77d4a4fb5ac914cdd7c6619ba317f7c33c453ebf567e4 +e4ec75816c790bd658350a0fae0eb699c708559b4b5df253895491ae9c77da38 +8ddd56129988ff4d6fdbe7c01d890ee2689f235590f0b80de4a591e33e8196c2 +0105969df7fe558f8e2f97372ffe67adda409f12c17c979739510da4b5314ca8 +e4e64281658b232b0e3edfade545fd3c7e7fbee52adff818010270b0855df99a +acff5c77eb34159fbbe8c6d355da82eee52b7e153c354cf3f18baf88d4cffdb3 +00c8b1cc7f30219b26efc8abc8edd998eef793c7f4cbbf8a7d8f702271740335 +ba6e596c0876e5b3437218693508f5b59a5e24e754adb4fc549faac222b31402 +a8b754b37c2cc69a69abf86cc89123c9cf654d2d37a08251bc1f119ba6b72ad1 +55d2d0155edd88f76eb739280b74e364505548ecd95887229aab96271e461c54 +32aacb7fcccfd3616ceafbc4932eedcc145aa25e9ca13fa8d9ccbc9147418793 +b86718c5fcf833e4ee24fb58fddf71a53fc5203e1fd3f8132425d9a9bf216a79 +e769958a89ff7104dee938179b316361207cbb3aedb8422ddd16a10cab1edb0d +0077f1d83716f824236037c83a759f323cd24d057a3057e5b5cb8364528b3676 +c9bdd5eb9c47412c1a65d04a72f4fb24aeff98ac6383398760f2d593f1462aed +705e4ff227ac6805f91d12486a7658a9015ca7fe8badd6f449a97e4a4d3912a7 +3942c9ad0eeb2d732fb5243700cf95e18712cdefa2406b5c230a495e57b46274 +e064104b8b1ade3f2e62762a9528b850e4ef45440713626eb81df73b470c2f7e +e1df0501871f216a39cf671ecd4a289dba51123997309113785b7b73a5bfac2b +26532b86124942c3018c02f3d904c17596d451486f488593aaf66b73490eeaeb +f28eb3eac5f2a7659015f205fadb5c833f10375b029c1e3046a957036bf27c18 +1ac81761cd177fedf126833b3dcf3e5caf296b7b910caf9f6ea742b6a8b7503b +3772ab82feeadcbe041fc4b959586e06aa7185ced2095c33fe11564e857bc596 +2cee40d18e59317f21efe1f27a10b32ce40d3b4a60692d5346cdef10fc6ccebd +2a7ce79bbce9c4ff44b2f06b9a28ee1328e043cc12b42ab03317cf9bae3e84d7 +bd52b0761c1c0fb049e7aabe8b2a6bae03b2a8ee4a6543cd1f2c89d4b906997d +5530f949c403ebc40342e9d8816a39061aab7ff76c0080185afa3153500dfc70 +587481dc9db515fbd77c0b08d86f944f71745a0a29517136c9b679a5b0bedca7 +f623fba6b954f39e14e1fa04f01b6e377ebbe90e24d069908456762c42b35010 +677308247b6343061bc0d785d78a786b1a04bec9f9dabeb86e30e64fb4ada8f1 +b9fd75c9b0d64676c4c78d635b3386e362ec7cb06bf2c85b8a22292a58f7c038 +827a1a964af9b7b9f3fbcf8472d120c5d9c0bdbbe9c13ef14d2bab51a183e3ce +487c2c463b5b74f4b770ef9e0c60ed08a7eb54bffc1c0ab00c51163af9a1d428 +c30a5f2abb783c39e1891b93b27ba533aea8aa8b3bde4d9bdbebd0cb63554705 +5e2dbc482dfd2f70e88f9d7785b37492e6068532149a9e8fd5607911993e9dee +e1dfff50620ab8d327e51ecbc1d9f57045cad11228d13f073b197ed7bcf23bba +338890c5e4c89a831d3d6ec6f4938658b12656546498a6c7ea94f50c04bfee0e +96b00e1f90bbeef51162d5122d00a62d6fa8bcc6ba2609af9ef96f2af7341ef1 +ff453232622e760c66c04a5ad7005288a1963291a82ad061105283d9c1b6054c +5ac6087102fa0840a71d8ca55225f5ee5d9d8c5f4233f6e27992351df89150e2 +0e4c5b3707c15bcbfc0a2eef1babd8bdc8ce88410b5d21b2ad07f6a6a752346a +9392ac16bd36af87384b3959c8ad6092acfe0bcb4b1ecd45227fb53969512f34 +a99c43d16849f0282592f199a87cdcaa47af35b93c37b341d4f9df8aa99de0d3 +9dc3ee52a87141cb9dc54ee197d01063340f0d8c34abdfdc6132bc39e0d10e4b +094ef37bc33398c0c2eca7b7fd26205816798ccdacde7f235a70433df45909da +178e6ba670d4ee36c0894e42fba7c6e563dc44b64c253780c586a355963c153a +d25126232fb9a930e7e46f68289d1d1ff10cf89c2b81a82872b725d74a0067cb +76f0c8d490a3347c1e8c514dd118ffd233fcf22eebf361b73cf6d3a2fb137276 +4adf6e62d8787f9988416118607c6128f7210327017bcd6db915b88c7233b2d6 +25840ca2473d6a9b86442963466334f743263c0d9df232d42b7b35df16d80cbd +a08e17732d864bbc1e3f244c54f22f8fc198355440f8790aa50af33aa967eddf +d61cd3272c0e9bc63598c50c3af58a18c649ee88c38e4404af24867e43a0fabf +8a709eb5ba11696a044c4d287dca9328d768fc04a14c382d55dd54500cd5e601 +bf64480cc4f247a4b0c2bcea1a0c648e7e8e661f69dc09e789e12581d99464b8 +549ad6a29c2874744c42b434eaea2d2943fca61c27bdeed1a52be6e6808383e6 +a7c204ab964e78295355e2c53f021a809475ac21375c55e0e7491f4b1289b3f7 +5a2e607195f602687628ae541fa96ff05d01dfcd6c04a2ac5b6236a7b9324fff +00b71e095442bf04ad5b8e428b18dea2e6dbbd77a9c096cf4fd591f6a563bc3b +734b45ef6bfa0e83ccb996b9f8981e55627f790eb93947b2f01c46b7b4ccd788 +d870da4d3242541fce9968ddd6e438be5d36359d09ffdfaf2bf1ee47d9633132 +f41001b946b4879400ccae1c8a934a808fd1fa6db83cbe3d8dcf2af0d577fe8d +f6fe30b1e0ff0a68c7c8fcf950bd9aa17c8d8a19296670eea02cd17bece759ab +abb6a93ed4a6af531b7f8ba2e9ddc5c438eee125506816025795683f27d4df22 +d811c2646ce8830860a5d8992ea6a8c0ae01280b8fc4f27b1b31d32f826caaa9 +635a1ef2cfef6ba6c9ca9c0fe970d6e601a88ce06719578c27f33ff9f6f2d672 +dabd6f0be0235e3ed61c90bb0f304188784a018ff90156d8d04c7071f0de22f7 +d2cf7ed96707a83461ec99fa40f6d894286308858bf6f616f6c1105e7e84060d +1e20502bbb968b61eee38f151fef5af57e92f1d0196b8eaac2bcd8ce523529d3 +e8771aad8265b7e5e9846f28c2a83512fc056de6a20f8c4b0711231304b5050f +9510c17801de0c8e2dc22934ebd24a6167ff15e9a06c023d025f05d1f960312a +bbfbc9eae21c4da1a6cb51ced11db6669da3e2d8530fb9c9287a4dbeca43c0ca +936364d960f7611ab03fb143557d9545ab4fa4d407f125b8ec4e5c366c4d2a7a +0bb9a135eb9fee265dbb5955ace3bf374a0d321c82e99329166806ec8d198adc +af85bf2ef282c3ad477224d4a028584b6a2b5e4677690874194bc2ca665ff590 +da247aee67eec7772dca11a4897b12cd08532dadd9a217055b4840f26a8e2103 +e1563952d46a596e511ef81d1fb0d502fba1c6f5c0ea17c3e75e2b69e54eec6e +0bbb9278f565823dd1ba4e5e850cd6f5aae2672bae4a07bf015ff08a013bebf5 +810fa3969991aaf53ce458d35a44afbb39d4c3bd166ab4cdd2389f3cb67ebc2e +6782677b79fa51bb557c49687bf1b11f2082665b151e757e94259ad6659502f9 +0dea0e4588b706f5b9dd7e75bbd371539949a4f203b1402e5b35c06a7061f048 +8ce78957c95f4d0db1897d624e8f6f60e4f604973a89445221191f8c06f5519a +ec6be0a1c2be7cc6e5ba73c619f2badbaef9e54fa9ff4189246fb333f4dc1f9d +deb1120971d08567d890c29571327fed1651b073a357d71cb48a852afcfd9a32 +3e1b540aafab71f6a61e05addb80a225b4b88c4c0f484197951e3972df4b9560 +33d831653a2ff15e7083adbea09b33a35575678e145030c94b0c6e0927c9d4f9 +866b72e6b2c203508848ee893c13ab752bce6fd4f9fc6ffd91d28d14db80db61 +733849442b4979ec6dc0d37c1467a2d5381c8d33663995ce613728d6ae739370 +2f9d266a3e09aee52ae15fec98a8abb59ac09dfd740c0eef4e11b78cad38208e +5f60d396e41cc30828df87b3e50bdab69b39af0fec8c02c324d086eb42e097ae +4ce80ad0d2dafdc139e67391347e116bf1520ec8772b4b74e9272b4bd1d4cf18 +e808908988ab4bb2cec3db5565393461ca5af862e6a0f2183fff5d81d6508247 +05d5036599fcca825a74d487a8db33e6bee831d324f78af5910919d966ea57fb +830f6b782d3dbb8d5f7bad8aff2ffa541b16e78e2d23180b4c21aec877254afb +34076c578e4c40058375ac7e7cbbb7793488d7544bde5a6d29cffae9eaf0bd69 +b717eb353a7151bb06bd5ef2a38259798a5a6c9a684b377c0d72c932d52db0d2 +c9e86fd712ab9efd0eede6c36f24f2209605c401a3ca9bd28ff0959ffa480ff4 +a0eba22ff723e4fb4699beb0eb10c3f8e52022bb2ba2541941582667a784f397 +3cff0191832b3eb363c6977661032b8728ac754db575f3504749f70c8b021518 +90c8010c0da0503726f4aff60c240e8fd733fe37c74ce40a236e8c088c083dec +dd187a2c95515e54ea4ded8226dd9e8b217e936d4b41c767eed5d20da9615b32 +2193abab5fdf0a2c3ac1b35743e5dc9df9048557982b1d87296c2f82dccaa4c2 +3293ebfff03fb7f8f252ec7052793b3e01fb17cb526814d7b73ec1abf03d9769 +a18e3fd9d4ac55bfb534481780790b76fd92d947f3adabdc10d7ca73e59406ad +65481ce38557f64c5a23d1841b896923011af9d7c3b999772085d8da26122059 +ccd4972c484f9fb3e6319414b393d39b813ca2b603fa2f18926178f1fd33d22a +bcb5d561159b0bf186e52cadd6114791a9cb211c285118cf6550ba24a931dcf0 +d5c7bf30dc413918ab2f6404e51d612b50094de3dd281db363d254e17fb7b889 +cb5b906db3b604789ab7c7cd9922e879b1d7a5292990a7667fc1332d71e01be8 +95be5d17f05d662243c7e3088fab828dff19c60b61f1b413e38891b5c0125648 +59db561729c92db0aaca99d8309b18f0789a09429059c57f4aaf4d39c60e4866 +a01944c0adee288eedc7a3a3abdca9275720d1b3da4233c91a4ff6f1ad4b8eb4 +ef4954da9bc9e0c48f049baa0fb35815c66d644d3bb340872928802611b73c24 +397f3fe32125811c8891a8a4c454aa2ef649d12d9c285310e0177e0400d6cead +27bb940f9ec37b7717c3668683ea1de7e6fa950a5df69c6acc537864062cb948 +435d769f1673dfefffa71d9fc33c063c12f77ffe7a9ae14198a6623488ef0721 +93b48be6c45bfe6a1eb11d5cdf6ca9dd4bf4a2f0585365c690e57f83f7c0a80f +2e24520d10819e81809116c0948278b9a9de9bcf87b2cd06723c0d95480e5747 +f437531f4bd6fb9ed73f5072812f66dba6fbe10eed9b19ca8d16fc023ba44cfa +d17841f9bfd586f914e0d2b3336b4cdfe63c602fc06ff2d8dee6705955bb5b40 +7ae736aea9e77d00f679ed23049980872f1ca425b6ba0f35703f5d3d28cd7bfd +8ed8818703308374a6a0bf0411b8de186a8b9ae2c67a37e4d2a4048dab5228dc +53dd2bb2b269b1d220975d7ae8db6f17eefcba79d8b8d21100e528110bc6c3dc +147e8e2ae9a38c54dd105ba79b57816991c435f412e6deafa71724f00a1d0b68 +faf771589d6de7b07f48e0cfc509726d1015233a6d79ff1d290d40d3f1ad1dd9 +19a8b41646c625c840ccd98fa5856ebb7a36f778d9b920d7ad0357c13fb3235f +52e7e9eb1316c4fd0d692c6ef630edb722568d9eafc20ee3103ec21ec8ecc46c +c6cae184b121be328883aa1c0ef56ebe2eb0e4b7cf40cff3d0fd5cd2ca339dff +5560ce823f29fb7e3cd0cb47b16ed8bd72a2126f3276cf178bb0f1a2017dc12c +8a64aac7c26bc7f940e29410d516f4543a21b07f28625bbcbde727901f157a8f +7ee6d875847151cc685c1474012f5c92f25e8117c16b816bf3d99f3fbf844e71 +51e2f5d2b487a03399b3e263ffc722f6d4652ff11eb158327a2c94ebe007f9bd +fa6365221e676c846423d48cf1c945612bdddbafa91e7f76cb71174a48bcbcd7 +3330040298c4b93ad3dc7f7ab689d3c68daae2693482c746f3d16ab5fb291fcd +16c7dfc8b36b5105c35d65e23b7ae1f46fe78204f0e48dca991d94bd4cd0ff6f +b587386211746e1814daf38866e9293a890b47cbe47d6d0241d1a05db32f3947 +dcd22aae8d26a2c92aad8041372f86ad9a518b2b40d8f9a35e5afe82770ab8b7 +b1b2a2e2e456a7895fe9b3144ecc6f3dcb4804d21a6cf11e5f48c8f7d6e69e23 +cfed3dcbc7cade5410701d7dbb19297616419fee5ed72f6c4c302d4b6928e551 +7a810b9c7cbb33096cc68d509201879f24646bb6027b541be7013fae97ec91a2 +1161e2c49a2ab5f6ecc731da083842edab4d7a029cbace3af24dab6ef566228e +892062ec9ac9420ad0cf098f89bcd0e46f385fa52943c352c62341d5a1054e5c +5c8976d6085a43da60468e301e19f2c10dd0084143e377fb8f53b3a4ceeb0c83 +6f88ff44e180d46bb136fe75b2b2ebccc364260bd72ce07e935d65d2beea401e +2a3a12b6b1a9399b76b66fb16f57431e0a84813db0672d84c405bff5c06dfb1a +7cda4ab6974e13d88c631208a06ed15794469491547056e7929d543d05ef7f14 +a51f64728e444b0c6fcc06ff89a8289620160d82e36a477342b70ca1254e4792 +b3b0b5fd349c38dfaa19a3c306124d50079295bb7224ec8b8568c9a60f8063fb +4d49cb80175ed24bff8260e3361ac5227cf87a0d9d49f56366756991112e567e +a80ae3e6451f90184ec37082aed7eb7ffabaf3ea4cc8e9262a4c893da2e6531a +4fd9e46d3c448031f043b0fcb636084bd0284a20c57333c11a150ab595049323 +d0b9c535bc57dfbc7f32247a374412328f5119098c9e2a5182a47e8ea456a42a +bd3e53b3166a525cf6722aa07efff48901d63d851666ab149439f0a53fb5a45b +f816564244c03ff44292183533ba2251bc0b2b1048a02b270dc0d20fc731104e +176cdbd1dc8be38245cdc422ac0f96d8cf78f43343a3be655aa8b1fecbfc67e7 +aba66493f877b7437c84aadce69d46ad9d61a9b2cc484e0f0dc9376a857a8709 +39b695d5afcdb77049cde5a4ec726022d0f92d309cdbc7f6ac5e6b5630169dab +c70fe75da2048a6c5c6b75fa2017e8892c8cd4aa408452e0054c2a9e73d43e91 +67104adaff3f149a43da3deb46045f507b08768dad3587cb00a1ce8c185f874b +d66f45316bf9ba7cb47ee1a1a055a91c03c3d94128a82b5a7bad7e304f7baac6 +5d3ecca28b6624e745d728af83006891bfd39cc56e28af59ae3317501b450592 +bc6bdb032e8d5f319552bf281412e033b73644912eb30cec6010c152f36462f2 +5bca347b9ff899a593a7e9b96d6ad4b3ccb20e6a972a192428d4c5bdf79cc717 +97cc5d48a22981afa791078445b7873ba9f36a47d4e9124fb063506536bcf433 +d4f898d334548332e655f1430c5fd56161e78a98f8584de372f5036b7e02d712 +c0422bd413b89b831f41ef23d94dcec5db71061cffceb7c3f920a1a63d28cddc +fa742f11028226b3c6c9987ecbeb75e343c61837bed4597f4b2e8e130537bd60 +7eb0016b5c48efd3282e758fce1868ff5b302074cbd62af9856de3fb54996a3a +ecd8f0c6f0b20ac3b511321dce8f97d5e67643a9a63f7af293c863bfa4ec2c0f +a2c76aaffa828aa6643eee7f6408b6ea09e91037f30cf2c391f4c9d9cb5fc01a +5a012008b64c7e19ab795e24ec662cd3a931a98bfbb545be4489d7d5fe732cfd +c903cbcf2f600bcfaf858b0123a31c12f2abb98c17833876b152ee9efe354873 +b9c144acfdefcb99273276050fe43a140247a35b0994927aa2a1d7463ed69e08 +8881a303b6131e3183893e3d001f241809a990efd1c1ad7c3b419cc1644bcdb9 +a47e3a8d8fcf1f52865c4efee0079b840b82a95223193515b85b9102c7e3f0e8 +65f44580845f0fb5fbc16e339b66aa51779eb714a056e56afaf0ff6be5bce7e4 +754a553912486a7658a9015e1cd381969ffb9c6bc4aaf54ebb6b0051fc7eb362 +39941c8e0fbd44bb2fdba5dc229e9d659db1b44bf2688cc7b29eb0bc96f03f79 +fa0b953aa215ece923ef8a4030ce185073c30ed1dc8f6d6c005eace2a3642060 +b95a54b0a0b1980b1f4608b63f245b8ed7e640a9c3bffa3fc42449d9d5cad579 +e86a050e5c9aa8696c5e7c4521daf837f3213249848ad7f26da04aed56f8c543 +61b910f4e1c0e56e336894db76da6031e445f889c946e4c79c79b21c5c64cf8b +c88d06cce7614817e26c5d522a2c3d26048b964f93008d482af4f25638e190f5 +0d2775dbb1c4a4c077e3721df3e49bed7f8f642a6016963b6f58b8efd5ca7ff1 +1367b20a7019cd66c43738f84203abdc5b12ac2c0e9c8fdd15d1eefa86b464ea +d60127e71e62feb7394d5b99d465cca9022a4942f9e8f6bee849d655f6e52dbf +26188ced3107e70480cdc5e7eb3766fd734dc86f86f823c3e5c0bc0afc0707a1 +33663995ce61372981903adb5cef4df34a3b891cfb8c30ec92c4627b30078643 +14b9ef98e4acfbb87a6912b3559d58dfe7288402bfe33064f126a2da07b981ee +0dfe84cf8b2c72a67ec9c94039cba069c3ef2a24847a72d01a86145d0a97be64 +700effa830feccf46541278fdd3d35d082ce150c39d946362f3e5d23096d97a4 +76367bcccdb04e7ef9c608416adbae868f8800e645a80793bc0ce0e648a398b9 +268f697af3372197c8b33bd2760b0e75f7f38a6d94c4a52ce711c3ea21292bf3 +d48ccf0088c5781979bac62f072e2702529e43ff4bd63d94048a825882d6311d +dcdb6f2de1c3de60cab153c6f48f5b993ddae60211b154a5ef0fc2a0c3d18c90 +eca4e35b8796fe6d99734fff908735ee111af75af45b6665b82189dd3c835ffe +b13290cc59b25161908d29f385b517e85401222a94e1e5f139c5c00b72d5d4a0 +f4b1fc8dd6af78b00442b19ff2b9e8d87b0c33565ee49eda9a5e3d26b7c7c82a +ed94f162930ef2bd23fe4628085a3e7c41153fdd1a335b994b9bb10f6cfe6ef4 +2cb7dc8f3ce9d8458f560fdd41c6c189acc63a0c38e38cca94560924b4de1e59 +873896edc1b8d0170c7da1af5908497d4a48158498d8c23e49bc813eea34a1e7 +3aa06342b6f1c7914d73c1618d856a995cb51c407b2f6ab72f76ee037547279e +336fc3d223ede5cefd69b5c15d3972b2f06ffcba1dfb9a0c9f23c47f369de28b +662cdf284d112ce70934d22e2e00b5448905591d813e0ecba462d5edcebfac9d +415539241ac5e4f2ba785515a78b7b009b4cd20cccdfe4f5d8390f9765749f5f +d6e529814fb9d54e906bc323b160a29c65c60bdb47083a378727009feee85acd +ae66a691a76f7d58d031692215c3a82bfdb44cf3c52697006e8a5899a78aebea +ddd3b4c4c8139a0fe0ed2aafd845adaff7b26ef4c318a568dfd89b5060b20c4b +3c000b7cf8562fe82185dcbb58298decd616f6d9a0e879f1887c1605bc921f72 +d6b7eab7a44a883ba9f1687432c498eba28a7e650eb7b1d97ecc72c9fec17047 +7c62e050da13dcf5f62f26e62f4025ffeec90ea5ec51a2326f5c08bd1f7ebf97 +483279163ac37bf0795ae19865fbc560658c512240d5771ae5b8da18ebd3ef91 +e83fdf9d32e40ec1e633733ecff3ba66190f94f2b5338fb7d0be162ae41dcd46 +388bac55ae53b56e308c714a91ff676ae87f1e6a478075e259e9148d1b60774a +a1bee100372a7e29379ab244c8c4ba555f5d77c3d98f22e80f8a255a36f1faf0 +b2fa0ae59c61d33cd9e70d0259da5d93f19bfaf6b19df1dc35fc783b3939dc8e +d93572299348201b4549a05f316cad76edfa35467c4328df10e362b91aaa50a2 +ea7b859a5b11a9c5e9dd49a2968913619b57b8a2d6319ea4f102d8a9813d6c8c +3dc6de3091f3a4034078f15dbee8514a59e6eefbd5559192d86c7b55761afd5a +6e97279028aecc6d391feae0deac7cfe033e9e64339b0e581f5284bc81cf79b3 +eaf122baeee10655aca357383fd83d481291f37c90b8737d16d3416af742ba1e +db69f6a73f16aa2f7c122a2ba21c499818774d11141e740d8848ac15d0acd7d3 +f0acebb718fef48afec1dad102e364a5f4624ba04bc3d87fad0798bd45a99923 +abed715884d93590752b7f86a3c77b14543590eacf229f8f223b8e9a22eddc3f +a2907482fb537652ac3f6df21fa57cf44ed6b8ab79495771acbf4e99c1451507 +e949dba77ffca3820c50570d56e1d49fc4e9d89aac4824c370ce8833441f8b02 +d19753daa907205d4a7fdaa0fa130c296cb7b345916ffe0cdd15d92b7521e46c +93d5b6ad6c39e66d5d6a254bde88dfde11fc1e0a15ab05899434396d95dbd7aa +fbb7e1335de4a13915d33bac3f4da705d9ae891eda4d9ac185a9fe58c1ef7ebf +bd73a418c1e43ebb42938182c0d905e79506f642ec70961d096d6fb73be25805 +4064c56284f06ceca2a7afdbecb611a0f67e2e3ea52c186384f7713691c8174f +0bf24103dbab5900253a5f424e485c7c27723fb555d0e2c8af7660a5b914e044 +51d41fa45b17eae3f7815926098fb5346d527a7d7db1cbdba966bea36e6b963c +2cd8a9f509319cc9ba41eb6ac29832c8be17776779f8c2d6cedeac81005b91ba +fc8e4cba19744a4433c91319ecf73ac1a013554ca0ddb4eee09ea087fc9b2596 +5a9cade9dc4c9888ad0c9cb468b33bb95231646f016fe42b2b2749f77f6cfbb2 +d4b131c98712e2df5d1b024f9f22944fdaca133567d66fe5a87e734b958bd292 +4d97cfd2c3a13dbcac7a09abf9b153549d9b9c078813f407b9a9d8afe99711db +00edcbfbcfbb273d767e4c4334d9a91ae12522eaa15f54f84e2f9468b8e74bf5 +e74a1fbcba022550c63a64d85c5eb33d02ca6c0fd1f5a9aa46348a953aeb3396 +86a46ce0a13686927c03fdcb24ab3d98f1a4dbd8e6b991bcac96bde4603a9f1f +7859375319a6a850dd327d7d745fcfdbe437255a3566e9edd14af6c2e3444b1d +d9dbbcf70cbd7fc5b947266938c04c9f63938e88ca30e4d636aa9cfb2daa861c +3874cf2fdbc490e32bd6598ec696cd7d58da40bfcb6199d24f07b283b4a9a9cb +9b5426be43b4d0d67dfd8d88152fa14b531d522a9fac6cc79d2617993d95dca7 +d89b8d7efddf4c29e58cb0feb70ba74400b8be82c0499833253934c7edfe9e7a +90a004c4ee1c7e3dc31c24ad166cb1320da8e3bdd05afcda1492bc34bca43b5d +32d540f77fcf45d879a5646d4a4604397e37fcc732001d0af721d7aaf69952dd +ed912594fa9428a20fe0ae76e8401a9535f38e448f69d48bbd770f23ec075d69 +10bfd3604a1dc79f2a5159e8fb26b4a3eba3b50cc46e84e4ad657fdb0d254f0f +64e37824ed4c1efea12231df670dbc1847880cb64f7f3c382b88e183de261485 +f7e917e67ea381a568ce37212f8849df5cdd75575ebbcd7522e1dc3400a1d8e3 +8e09555799cbd6d3f488633a9e3bd4a2f6f180e1d27e0aa3949590cee53cfcb3 +3a14fe287e8021ab0777baa8859de5c21ed2fd8c3b818968bc26f5f9fd712eb9 +424c83d0ad28b76d1f5ba1678ca31925d49e2786356867ecca08a150a4591523 +964ce4589563210507493b74148ad80cb3c171e22f38e73a0aa59f13c839882a +536c00ba899d409a98480a1c7f82a44c36698d8ba5d0fb8d50771c0e91cea55b +836a946ae06e2f0c2275db32833265402264e2f6a1c8b896d5ebfc7c1872f2c0 +b4fcaa97210160403ae0ff1380d7e68251ef7c25e0a66a312fbad992aa1311b3 +61cc5afdc82f982d7343b8b7909c6c7171f568eeac8bbf8b43dde0d928e81c86 +ba3bf4549e255adf55d6e5909a01ce0b270f53169f9807cb9c7c70f3d3a569ba +8675d0f345f8e3a00a1c6ec27d5f83d275358830afdfd12cf23a0500e2512fb2 +faa9d333566da5a65dfae8ee515ae450ec5aaef7374ae1d598d5cbf677b85dc2 +e0394ae746b8c9554581c737d79b31048f4471d72972fd34bc2662a83bebbb32 +7d3e2c2bd7c65e68672dbd3ddc32bcc31b27812a1841c3edcecb723bbae371c6 +70f5dec75dbc9dc90e557280a836ce401105aafb64deb25e6ef6396da68183aa +a39e207a4ed29a41d9be11cfd888c1e7c1c5f869ec0272c7be8c85703721101b +0d41921b6ce168b781b1c745dedc1b8fb3f8fa027b0c2f63aaef59bb3c485c1b +c773e6c0672bd48bcec83042cad9b3058b14f14051906960602293261be27514 +bbfc3b41fcfaccf05d7eaed0f50b3f9d85d8bc79288b474094ae92dbec3b7870 +d16c92d667fb2074d176928ec7bcf3939f665b774762ea69b989ee8c8334f20e +3451189600c26df2e3a2453057dcf2562cd28a8d04b101ef004990d09afbf7bb +f0bc3b20218d3270e0a3e3446ed7ddfbac2c37c5bf8eddc74c008b170d912bf6 +b1da8b9377005a6b6fcfbff04d0250a74b93a1437ca0a7cf497637106c239017 +160bc50eeefc55e12d6c3d65261c238e00b0bdd7a7c0cab8d1e3902ac8d22a11 +a7ed80dc0dd04ac63ccb08399b92abe56b4cb2b29b2bf5bcc4e7ed008bb99881 +c74036842e45e41debec5cd4c652d37ddfea9049fa439747e6b700f7baba635a +ed47282e91ce7eb743571d533b7eb9d09f0c70081dfe408e503f14a0e117196e +c1e7960f5bd60a1f5f076e31c6ca28c9ce51061d4bdcf5e35beb3622e3424529 +ddead48eebdafef6d30c02dbdd5f1b5c00bb52266a8ac0819fd60371053ba1bb +80a8954a4eb7464618ff70369083068f1b60f059ba217291b6585d12f9046aa5 +e66dd926f9d802e694ce1dcd909ecfc14b5f3f44c4f73a0efd3e1422a747a308 +06ead9d72deb9fcc1a33617fd94ce9cf6e31b027b86937d0dc58b350a3230d24 +2596131192677c84137f034d015613e65e04fce2fad699826a666ec8e1f758c0 +f6fea6d199c6b3fdb6b81ebf80fba48ee1192e0731eb1b6f439f654fe7f419f7 +618e1e00dbcc0dfbbd1897678a9e4a6078273233229035c98b0e1fb4f4ba5102 +91d44e807c37ba07dbfac535c9714fde3de3114776dc82e28f7906c342ed5688 +44c2f06a45de22c2704f3b8c6293626fb9a018026a9bf7f688dd2c25a6f35845 +fc3bf34ada6e71c93249a8575cb6753fa9d7d8a2b10f4b0979aa234326185387 +63a8a532543e427ac650c67aec94fd5f67a697d93baeb2c8d1fcd83f04de01be +37e4b8d966f5d91818b80bba52c34e80897521bbf46172c89247c257c77be91a +39c8e4b4eeb5d54215def158219b0111b7f9a6c3c5b32945a5da895ce74fecd1 +c89c2a3933fdc1183edfc2042594fb11d3f2ffdae852be0443f5c37765b3aa75 +2e94fb1a0ae436a38a5178023601e903851f015d1a74d1d132366af6ab2e78ff +5493e19ad35553ca6fe7dc51b6f5dd62f22058c35f2b0ec5755aea9722491f8e +6a7f5d3e855f56533fb9e5775fce5aeb0ed6af76c3e7b24eabc352548bfa2550 +c66dc44b2795ac40d1223b416c798cf1c3aa90a8b404bc4926b3bbdfc2c8a995 +823857a98bc528813437a0b892530fdcd05f1fd496340f528b8bd245a7cbb8e4 +a77482da0f6c2a00e492d878a13efdc2f280015a6864657ae3226ca00477cb3d +c5ba741aa7e4bd3a876c6d7100564be6f6a2de0613ead5f9926c2e4cf5acf5d6 +5035e2a79e286ad6fb4289ec577bec28f51a8bff37423f9f0751a79b91bee5ef +1e18ece169ed2723c9d2103b675e335641cfe424360ce2503ef49dd8d158b8fa +7c3d6bb8d1d0bdc607a08630a67be00625786626f6ffe698c3dd414215b56ef6 +756720a12c1c32fc363db28ae0e206181ea32fe554972e6bae5fa7bf89ea3c5f +85f8b274b9fde63c7251e43102fcf4aa7180ec3829c55040bbe511c619de5ca6 +95765172d5c832691f6c432be0397bc401e2e54ea1b847bd63c85c5c9f62cc5b +e1ddb4ed907938472ce6a6a3cab60495ad8d5967150732915fbb5ba40a8130f0 +5df637309f37d4249298cd57619452601dcbdb1ac7f022f6a024d7ef53c0eab2 +b00ec3212764ae73ab88d18806c1252d0ab508951bdfa2afb67b9d5a1460c11f +c24eb5ffe80440260d212923432ad3f3f9b67b58462a66e7313e5c886a046e34 +80a23e08048ff3c918f26194066e29c36841b547aa3e374c1bdea8c9802509e0 +e787ef0aa8a9955e1824d0ff95e294dddcb644a292e91e8f00109994cdf9681d +c84725604b266b8ad4b196791f2752662189ec0e9fd076ecd5233b3a436f39a0 +388be1ffb33d075e55a4683b9cbe917b06c1d18de8f08bc06df4a8946869355b +dff8bc9a240ed22bde34f932d90ad2994c7b001b55957b9dc7a7931d1a87e215 +367e5b424cb74545623d8aa9539b66803581c1746e463079f3b52fdad364eb68 +58d70b9835b140cd6db9ec95e50a64e4b88e88d2a79fc3cf7ffd469801bfac17 +1373ebfb52e32486416c387c27f0a455ae5023cf1259e691cf5b5b339a2ceba0 +9a2c556ad65734baef23d18acb009564a661f59e1e93fc163dbd1c0f2fe231a5 +8aa558be68f033d219b0736b42a0611fb15916f3058b3acb9f9fd35d81d6e1ac +665a358233c0aa23367ec3adbc777539cbd7bee88e68849bc91037670e8d9df2 +5402768f04b5fcf34fa8f2153c37ba7ef356b669b5cf4615b745d8b9968b6009 +bfa5ada490637faaa554106d24d4e755e4f9f3a9f52a1b15a61c35b8ecb983b8 +083af04f9fd3511fd8d36f2d822dbdf884c61627d81020a0acc19f5e36099daa +53b0d6d98d0394569fcc93833b89f87e115f5cc26317196ed78210afa8a5f0b4 +9abdf7ffd38a892bffcbf30064176ff3c7fb3030da4afeb5af90610abc321319 +020412a91fb03811741e1b0ba8a8c93e59161eb5b41f82bf41a5c21694c8373f +58e3d1dfba33a6c5665d8b73ed95c9566d67df8456b2f61c559b2e8d60c6e2d2 +f1c85d4eb1ee33dc4718a4f37e6a5b965ad32f8d16cad21d98ad189721a79aa5 +454249076a91c684fdda1a1eeff70dd07274b8c402b6a37012b89c0c6870537d +056fcea0c6fd79efd834fb29f8ca28c25c57de5123c540750972b2bb08311835 +c11e6a5bfa0c31b18ca3f44899a8e160d97715676ae211ae8ca83cecbc6bd654 +e1422aee98c12ed1fbfc834edb3229c7a693ae4e6c759bbf3cb496672469d856 +cf7da97eab3042ebc9bd3b645c1d314d3e7b38087a2b0e7f5aad5e880a4adb50 +e2819b638eb42a2cc2c3b84a27eee2959e51811af80b3abb38900e48a8bda718 +078a5402c724cb4080bad3657b1bab969e2f0a2a088fec1ad16c2f7100370b95 +62753c659fe32401787f51e1649274294d3886e7fdeed53adfc66efa195a546b +05bf288823b178a968a20f8af64667d75e3e8b1c492b571aef01e55623e33e9a +f88bef36a34d620fcc742244482747708491a1c56611abd75cd8964155f602bc +60b24f38121bf53748455bd660f17ad52eef19ef0d16eadaba48d5b4e0cb0422 +7229961f8c1d14cf17a7e88abcaefc3eb54fb656c105b2babbd90dd6ff7d44bf +9d29c6ccb09b5c8ef13515e6184d15939fc90aeb78b4e064e21e2d376dae6dd7 +3f4fb1442ba15e9161c62cc93acafcd55aa333ca496803927d4e40371cd7b5ea +665113de3b56993e991c966b7777e80c8e0b82dac778254d6d9b3b4c661db3d9 +f2cf96fbdc16a936912a0781cd61af375f314fd8933642fa12b970a75cb813b2 +7a2e900a742de7d1d762f780fa3d29637c1b7dbd66b7d4f7aea7a3f51a6510bd +8dcf5c4dc4b5ef5139a7f3f0f654588a4848e9d642676ea145d5df301ee491bd +4784e01170c4a5a4a0787f83db24931b5d9b761b1ef47302944b8e689d56316f +80cdfe37424c484c83c02ae707803169d1547cbebac170ef5779911878988333 +1577c0f514131c9f94914d942d0b4cc6d72a9d06c250e0454810862a0973ba63 +8ab9d4b424ed51d5abe3e39f0befae042437bf1acdd364d20d76e3737956a0c7 +e666ba52a889a52385496273bdce52e307440c4db4a70e7a6da7c655469d060d +4353f090bd41f70dbe4b30f33c00d8964f64029c41ccae18243551afdee211b8 +9744d966c63913a6714ee2b4d1b82fd0aa1e6d2b296da04b3377f9b621f2fa39 +0b23bfa275b1342f62e6dfc4e3ba85dac525ace7cc2c170157b32dd13ef9ab65 +63c62e6c44c45affa457d12f0a8fc23e1e0cabb5927e7584fc714d310d3a5c30 +71d204f98979405a0edb83f468d58f0cd82ce3d84857f928124b5d4d592c2dc9 +196a7b32a7b8ca9f3877a9d6463f1a4eebd736d02e543d2ca7675702e06a5c54 +08f5fa709feda49a9b7e202610ac9dda957eb65d5615d91c2fd66c35b88ebd5b +ed398fade31d7ab65cff138e211f9014ac86a994e58d20183908ffdb55f64da0 +39d1a1f86f28d18f9ecbdbe7f6abebb2ac41ac88e385c64eda6fb9f73c47c6fd +b29f0b4dd0595e5c7f76da3ec7b81da2a516031bb54ac9678eaf2c16999e5181 +1af80b3abb07354a786e339e812ab142a59004733178d3922de9a23ade1bb2d9 +23234fd2a2836d3c99f582778cb069c46ee8c14999748c93f7b5d0b607abd3ba +cc79739ba4bc945b8cc535ec56511c8b184569c7428ec82f5ee9766acd217037 +2b72cf351729da098cb6323a724db4561045f239731661d2ec26fd014f57bd27 +07948c03ede03875bff01c4972530cbb129359826e1081c9f2fccc0d9e6098c4 +4dd980b1988c77bb4e04962c501fd7f8c5d8cbf00e97b2020d75d1d73e4d19a4 +929f282565a130474ca0777cacbcf429f995873f54031469e3095e39976a6877 +92e3db78cde4e930213f64d8ada47874900a2fb611e18c45dbb8e219d44620e3 +151fd42a61da68301334c7c8883c800e7a851ef4072aae38076c4f11418443af +7e22c10fb99f32b8ef835156173e00f37a1457bec7c74fdf0af7f75fb1cd15ab +a72c0eea8ff66233b2bccb79ca66860a3154a16bd31283d0ebdac5fd5f54df28 +190388468f1a102a99b733781b7674dbcd9faa280416923e7331b6f407d8ae09 +5a380d8ca81de6dc066ebbbd1341553fdebfae0e60aaa229d6a80a419991e8ac +7585cd947f6e026f6d1abdc3ebf4280d3292948b1ad434f26b98a05fd19646d6 +88894412749bfd5c15d963696fb5b8490eb5d0eb4a72d15be972d115db0be268 +724bbc432e470a467971c3f18feddca78ec38e60c79fe265959e82fd986918c7 +ef5b7a72361ab3249272ffb6e55b5608dd6c0a4fb1b72b50430f230b2383d8ff +bef2b686cec585676616033e1a0c66287d6803376e5d8e689980c3a5bd5a7bc1 +ce993e47ffdeea6f94d8c562d4804034a3b9a910c4d567ba82af21e4fd778bde +ca490b1c5e4982fdebbe4ca4592da9e70d5fa99fc17ee11963b866f7f62efebf +e30cd690813542f4fd8a14b43ca849c323c8d67569d279406b31bc066e8a99b6 +284586fd6e7f5368bfca05466560952fabe47658cf67b93207b004a9e7995a8e +49c81472e2bbf23fdc86466a6151e797bf086f32282a9e55749f94f8977fac75 +e2aa9e4af7784c533f50c8f1eabb82f5c325f8b89604d635c05878ffd17e45c6 +5f71425cbd6df1354f76a48ccd20d009e6d7a866bfb654fa0b1f4c1003f96419 +b49b5fd675698911d745106d7bc1d14db6d182fc82602ce2ed91deed5a07e683 +36c1768e8e0a87e1e112fa37aca99b4d37768120930c71cbacf45b58f70f767b +3db154fd31061251ab484ce619129b2d5c13a76bd15cc92d68aff8773c65e212 +399c6d54cc6a5fc0b48ebb33b23b916421dfdf26d4e8afb814619dbb9dc67a07 +951192e58ffdbecc7bf82bfa10d37cff66f5b211da9b7424fdf504139e6e733a +b1179cb9b56cf570f63aba413cb12872ae76eeed4ae160f83c977282f7c9a692 +cafaa72a6d89a9adfbc498625cdcd53fe9fe591ee00a625b157321839eb85784 +775665453d8187cfe0aea8a671194ae185ca9db23537356c9061d934de5249f0 +2ac01055fb32f110ffba4560ba8bc94cbf657ba57ac8f524a2d01a8323326777 +b6ff3413220187834e45da6076051cd695b1d51ede7348cdf8e51b675ca293df +dd1101fc53db5d7f8de55ece38a55e5528cfb4e8266df99d41ae7db821903111 +bedd329b1237bf7468ffcb8f8ced0d4416b36f7b2bc0231aaa331bf2474f11f1 +3657a008f9279855854ebe123ef3918acf58530ff76553394ef3e72741e9fef6 +ef6aad2e58d4ec10614f041698e78bbef2456260e6842dab488d96d609f4c77a +02e18dd13549d77925abe02fa098e923baaa3c0565028522fd8e7c0cd85e15ab +18f37d4ef871b91a11b2b5de8f5faa21bd9d1d312d923964c2f608708aeb6301 +e31d028eeb41c46369ea39e99d0ace2a3739e5f8db16e86615c56eec5ca95f6f +4195b39efe02a7ea9a6e7941baf8332f224bb9ab9ecb4b0dcbfba8e084ec7279 +24a004938789150a479da66cac3b054d108019b4745b3ad8b87aba19b39d00a6 +104e04eee9b26af64e338bf34d109b12b79fe268ea224a827311479b3a3b527e +40e7e864ae56cec78bc5a487590e0178a8b6fc25654c60404661e09c1f82003e +eaff3a58c0c3730cb34415c85a5a1f18d71b96cbcefe4685609aad50c106edf0 +9cc002ebd9fedff5e401affb0047bad90130e144fbe267234390b70f21d8dd18 +c43340c360bbbac5e15a745ec971d3fc7a07d78d9414e37ab6a1f547d7630c8b +a657883d45e788c499157b37410934f73002f10e6183b696b1034248e449ba93 +9178ce2ae5249d4a4db91adf295fbf3bd72d201e90750a60d9224da50e2644dd +6904b958fee6400b27cef19671c51bdea071c494acfcd1cf8d85bafbe9b2c3a3 +f39d120303ecd5636e6ea61ebc8af0037be2789d8d885953687df1c7207589fc +62441bcb3e7b5fb34092d8f062aaaec579a29d0ee2eec0530eacab19356a0587 +d143aa46fd5f7748859fb088646edc3778ac9f8cde1da8684d62feede0ed12ba +3e4efd2f1f3702edbba6f881e40b91ffe0a10ffe7f52f14bf975509bb43b2516 +e05ec913fbd145e7a6efe70d770fcc43700e9585432f78e3cf0c98a8c68d738a +dec7a4b809014ed76cfb8fd1b12eb02ee8617f94d0f3a3bd273f0675c2371410 +42201b05d1d131af293d460105f728afba25e65d4f8aa3d1959fb4e6166b6ad8 +fc2d6d41f5b1d11143a7fead000e9f46c3a6c2610f013f39205e4dfaacbe7bc9 +dc534ca456f44f95ec4e573ddc053cc124499e20ef2ea5c4989a9fc053b48a87 +aa4618e403cebc2c398af7ecd2d4aadf65363842e27bc5d20f24ea8ed8bfb829 +506d5a1d0739cc7e5716d0581618a1125b87da79e086d52d030603da88493d4c +14d99bfe5a30e955c233d3aa98f4b447aab941f069dff47374825d012b053733 +922c16fcda14aba584899d2766f4b0dfb3b2bc505149aebbe63a9ff68df22cab +1beb9476ec1b69d1f036f3abf79799e6fab6a7fb7fe7f61878642b5a8fcd62d9 +1218e6e52585dfc3321798d4d27b147be6dcffc1bab7c372570c5608e0236f26 +2d9e81d2c11c06e453f40f8453e3a4df34fc0dc124108a9cf176d41f7e2675aa +030d9c9a0c3eee010e2e6b53416b07a07addc43e22aac8a78c89f687fcf10924 +2b8e323b666063e23de1fb405d213567807edc2edf7955f4ce43938afd21eba7 +0239d81517b14c34a320e62ce46f48b10e3b8f0d443cda27717a5a416dcf968e +93ccea00568c42b31dcc857ed537d1c32d4583ccacc21efbc9efd7cfcd22a88d +4594dc9c9cce5c6dbb68a6b6a86568712a79321a3ef48335fdfc2a3937447b89 +d43a2fb9e0ec41085c249c571af59b4822519aa496da159326458b5168d9312c +13ff0b9879a8c96dea99cdd10966071b12f2a3f75ae6b150bbd0e032f7a2393c +6afbc4ffc9acc38afe90606c4f9afb95b5c2aa160539126dbdb2ae9d61e5c4e0 +ce260ba60a5c289eca44c0898637888e1bbaff38a4ce83a342fb92c64ce086a8 +5e6b0048c4282631bf1d6a42dbebc647f77e63429b18cdc8e89b2d0ba8040ba2 +7fc47879bc4eec51e5ea8f4b5628929a0859483cfb2089660cc15ec5d9dc577d +6d69a076ed24e02e80b83f1444a1aaade36129cdd98f91697f0b28d53a56418e +ca65cd49ca8c49863a8f066ddc4ad208dedaf2e54da80f294cb0211a90340771 +aedef1185653f5a2f7925894404a9c12a50b6e8615c2e5f48de9f9270d79c70f +61599223c0a8e822d8c60c56fa46100f85e5ab43fd7dc58b8330563495317ef5 +8219cecbea2f11d8f24ce226b52fe0ac472069eba02e29655c20c272eadcc1c8 +18ca5a0e46eae3a5fe1f050fecaa2485899f8a53f4234baec7c38343552c1577 +10c72838c76b82bc6a323f1d8dc68ac54f8d468da99c828ded907e6f7c1e38cc +bfe55c46ed3c2676335891a0e3f0f3e660435607a996030008f28fdc34ec67da +c93e7062c6b46c6149ebdab9d8378aa7443fad6fa5fa52d76834aa04de524148 +e5db4023e4de3ca44d245b94d6d96b503c14abb03d7c2207f28439cb338120a4 +da8d30c55cc8976c25dc4affa410e8aa3749a6a08b7d37da55d8fe73f95d0b0d +3c6b302a09738b28b703c31c3912646b2b64bb6124ed529748dcd032b4832174 +38c51c3dd591f4651a22f9fb00c91124c84d8717c4313437c014da2e72b62f56 +22ead7a96d0daefe66dddf7cd9d4f77eb17845958bd97249a5896cfdd57c4d8f +24e3ce5dda5629409f881ab5e8498bbd473e61dd7160a5eb6e6b5f47c2e3de09 +3bc622e2d1aa235d4eb341ad4277c1d6261c77bdd27d14e8d0f5a226957906b5 +f6e86f1a72fef7d88a90bd711cec812ef92f08cef71eed903d8924f5493aabdd +94cce69e2d4b04f111c63557f460cff4702b46f2e49195eb4f749dd4fc67070c +e2770be237fc41a300600e8e4363dd2d57da17ebf287fff4b3247673b662c7e1 +eb74033ddbaef52f8a00c406e7b01875a54e2e41b9149cdcf919356aacb0d2b5 +88cbf5fd0088a65b789e51d2a0ac37f1c833d62f022eb47d0580e04932cf332b +b7c6220ef8791981944439bbdd9934007dd5fdac813cefffd522164d16727705 +7078e41788ae6450dde5753f39edc4bc21861024aef6145aafc70d0d3c7c509d +5662ea004699eba1876f6fcfaf1757ee7f580ad9c071ccd3d02bd445a8d2155e +8a1bf1b8663af3102b1fe47a14bf454b789ac0c5dfa3afd8a47c55a7f1590c2c +2f520cc3046555f35bf8a847041d54ef6babd4c91fc786336ead55c3e83bd9b2 +fb4b4a0e84184f0bd7130800760ea587157e08d5a2390f84359dae2b7ff1561d +94d8dbcb34c98db6b45d0a593e2b0cd398e1a96dfa93a7ae8e7774ad57cf2ca8 +1028349f8a5feb9652f811221368bdb34eaae8d5e2e7e16cdb6f64ce04c37ba2 +4589e43481d723051f163789334a5bc087f2796b96d58cef21d82d0372a919b7 +93d782bee7cd8e91e26166f2041e371464ed4cb6a73e08048ff3a596f4689f6a +7b09546d8984ff5931a5ad2c772eb59ba1386af0281de907561423ebbf7fae48 +225a4261359bb445959a50a34d4f6550a582d152a83066f90cd6d99029513b9b +ef7f182b22afc41fdc2824bbee4fe2c53afa59ed68c9c2873aceb7e4354dc0a4 +75c03dc0bfa5697b7327661cd4f1e61471c439365707afa1b73377bca188774d +a8135ce7279ee809f94a5de196b97dd70e89a152c11c57b88ef540ea1c083bfb +3c99faa22248c786e216dbfe8fc6d60b3f7a5e291ff0870c61485a051264e213 +58fc910521db6766bc77721fa8ee503e40efc848be05822ec37f4aef6486cebd +e693d839b7bb902efa75ada15cff2040d1ef45feb81f6f69010ecdcac215f5e5 +f11186cf3dbf369c11275a1874d4d8cda1e17565bf6b7a4f22e5f7452071b3d4 +14a1f17bb32ad088a7751101606c6881e9d2c1d72d88e05410df086d62936262 +5bdb1fc4d48bae24abe9a8c49238a194b009bd7049914897ef28879f14366e1a +9ddf1f3bf2d55eaee7676cdd6fb111eeed0b67dec4ab583f53030cdfaa800a71 +cdcfc5fd361dbca0ae02c754ce8de1a2dd4d19d8d91f338b4f4dade9a5f10f6e +6a0201c2a7a11ffa5bf843881b5fed41f778111cfbaf373806c1fe279a686b32 +a8ea253b2dd83d6af13c5111e1bf990300fb337672df16d47f9b988471775229 +337151a88011d68faa093c4439185ac1d4ab96c945a363cc9b599f1ea0b9a4c6 +6a53a7e5c49cd875f0565a693a5b99b4d70046545549e32e32173d1a33660de7 +a9104dc3cbaac08b6cd22095e7492aeb5ac369cdf9a5fca87d343af87d625d46 +b465d0fde1a5e425f6e6509808a775bf65510d64ba9f1fd4cf83dc244f637c05 +e108512d9ddc088f6fd41a4f4185e664cd906fb33fa0ccc4c3c0ce1d546fde4c +c06919304f2fdb24500aa01a61ba0c365f6ca1b57bec0795850c6bbd3eb63218 +9fd7c118689b7a17793ed9d2165a51d563a96bdd2ac062d0c25e055e13965af5 +c140014d039ee059075a208035a5e9acdaeabc61b08ea51802be6cb592cf1e8b +c276d2ce5f4ac5d914e8f8dbae3799372d0bb33ed94f8077bae807ef69a07758 +d442ffe74d01f6f960b8938140e83f1adffdf4f0f0393e73ed41bb2bf11bab8c +aeabd4f54fca2aa26bd5bc52dd3e4d5c598e3af226deb96c3efc96c479e0db19 +6bf1debfcc4bd8bf05cb0e3dc04be5b445881266b74eac4595198addeb53dc46 +16781a275a481f4768f607346db394fd23eefc63e946a4357e8da64ff14813af +0a06b51e6f9180a48cfe90f3c9b9eaf82823213d605e56359ccd898414fb088f +6a7c483928d5ecb72fd544a8cb46e832b97653efa1629c4890b90e02b9e54ab1 +ae990473adc54d7b687a9c559734574248005dc2f125d7ebe7040eb23f4927b4 +d376768793b666f7acf187b985fa099b8890cb17e211b67ebd09742f06b224ed +96a0c969d8bddf909afb02bb05cc66ac0a5bbc9b80cf09fd19611da7af1ca69b +87179d1def40bbce64ae68a52e41978fff34f91a2b4369f0edfcbb7749b042b0 +d9ac767cd80d57438fe5108b4536b72e6e5e504a6e5b4cf70ffadb19d502bcdb +e7e3e566d1269d0a9631776c4f5c52ec3c98d63f41fa32ef489b5b697e2e4998 +3da756a7791a3a036c258f59bb22ac004c821ade383830f0277cf580fb1e8972 +7c75a27af24910a338df6a4fb373c6622fbf818cd71a5e891d19aa95a0255968 +619f356d84f6b430bfda80012396a2ab3bf91ace171a6b3f6295fcb701f3573c +684f445ee96b38ca3b53db61954b4de9250c487181f548bf9b2a20d62bf61c23 +02769834fc84af37612595d6e57be1c80c38e5b757b99c3c073a490356ce8099 +ed09b5fdb9c9e1d9f9219033d200c9e5b31846f4c14ccaa679b3d7fe2fa688b3 +7229c69c984c5982933f0ef41765b1c1656e4fc98a2086ff68b910391aae365c +1d88447411145f885044a11f3e11110296d9a81793ad31310c1041fc79c337f0 +9d2f073d28ce537934b841c41bf677b24ba9826b6db142f36886f45162ec3679 +fd46d7a7c219182cc2e2760d8d2de2c975ba4d29ef94b65ecdb2bf1a75a8459d +5facd5dae80fef1ffa72b0824165f25e7a47b100e1aaa34192d3f017fe5f11a0 +a9bedea570c9ccf6f8d18f5ab47ec271e5dfe1d4280d24f76b471e2d1dda8313 +4e0d760ff6f5673ae87466ec2e66e7ee5aed7bbdc5ebe9c723ef0e0bb20159c0 +d41ab0a2f609a0066f627fdb132fabdc28d067a4fa8f313421d5096071b17e33 +3311d9e905a42d49d9c6c2e3a09e7afe91fecf4e1ad5e6acc6ad0c91a79d3046 +c9ce741f9b2796f2d021f8494804eccd7e256fab1a8623a014060f0b19b7154d +2aa1e772c9ca5c68b6247987d190cb0043a9d2ca7572bcb43a69503570b2a374 +3930210d268fa1b528ba3a2260e6363df7012857c411dd5e6dadf4286ce805a3 +f03295e3c3db0f81c6e4db5faaac574ee227f7b3c98f4b738c45c9bb39eaa1bd +17812d2cb45fcc54ac785af72420ba310e3267d97bef54c29315eff146b2867c +d300d8f6c0b943e2f206a3d14c9d8a9ab4358cfbcc9cdcfdbb9b2bde4aa8155b +69c929f12179006235dd1af1a906d9769978fd90e21b9e3d2369f21f4b9e78ec +41a67909a2de30cb2bd2c10d2b9a6020acad882d6ff778c4a6223899f1832b52 +a23ed654236c8e09543e2c6afbf03f4c1a150c0ec1563db17931b1304a8248f7 +76fa88792ec90a34d39f885c95af9ea39ee8e93f84a9e66785431a7a99a52bef +d1cfe2b871cbd391e6b3cee6461e42d6837aa46d632dc3c302f07bbf934244f9 +77ce851023a129fed5b480b3bf8321488939288de6d054a55ed01a97a9f6364f +7fec9ef87b9b49b1edbc3fc5e192c6d9aad582d2fb1ef161bc2ca9c421ad5bbe +33bd0828d5228cc9b4caa49632781511789186c3212437e72e4914d5fb17698c +74978dcb5f89b066b8804efad90b3bb8b7246d4943c71d54122c2a36d9f71f87 +c3c898cf272e017ee9e2cfa8a0c224da23a460a96133b13f7821119627b325b9 +bd2fa8f30977d85c690723bcfce51694bfe89439f2c39222bca6dd0c9215cd1d +6b9bdf9f912c470d204d2b7b5717e018e03417181fb10685d9eebe592ce5dd6b +626094a06dec5a89b7795d789519ae31f43763828d6075eb023983ff6fce4e21 +25d516de3b380f04c1f498b846d945a32664b61bab4c28e68ba4037a8e462be6 +8e5622372c5f8d56c2b6c0cac890918ba6995e1b03a4340c9ced6ebc875be611 +1f445f705f78cb117f3396f707d2736be5d32c58d98ba4d4f72a2bf05bd45271 +5f1da83969880e4b580539a3c06d4415e89ab8f17729bec04b961929834c9c2f +05967038a7100bb5812f618a084a8d137d8fba8c414a5a0fca217e8f4fc0e3f7 +0da232421dbe0a2fb47a0d078ee4b3b484356ad7889a942fe6b29b4dda5734c9 +70f668a614cba321a71810550a84678e71f43f845cc47b0f4b82418fdbe34234 +0a28f53cae7f2ac0bffc4a9b4a4448cbc7403594b9c1570d475837bcd6277aa7 +8983daeb3f31442d4a0cec8a41b362402b7ec3afe2cc8c4372db07cab32b44a6 +3a00389f097006b1b1f7187b745a628f60f64124e845e16a8114b1d6402d3898 +158ed0573ca935bfd23bad60da9c6fbc0b10117dd56304cb58f81de3fa0feace +1957bacedced8e8f626752cd755f067bcabfd234d4f551c684524a711a691fa5 +3be61de5319436e86688ef0f0b23fb1a8ade3a78a1348acdb47ca5c327305555 +156c24acc760602f133116649bcc5a413bf919a083c2dba88306dafa66f73382 +50ab5e70ffd8e298883c620d3a37a1dd532c193f7976051e8e2da980d5603ef4 +8bc2518775ff39b5390cb7994be69973e3fceea2a99046cca5d72a5a2e9fce56 +d1f5f31f9d05f4e95de8349a6645e936ce02825f55785d110c3843399c726129 +d7ef56bc39b65f4fe6bdadab905206bd305f034e6e64489b7d97da2d9831c988 +8a94cfa8ad0c0130154033bf82287160ad0340938a78cfa27aa291bf4c0a4b09 +1db4f3322e3f76e556fb16afafb55d9f90c0749636e71511102d3d2cc091e8a9 +bb0ab55707cd2fedca6151d279ca75d90940b3f8ccbff65982143af38d17090f +02f8d5b6b25e1c49ba918cb6f3f2b9befeb404f150e593162ab14e277ee0ccc8 +3fde67c7778195b795519556db688e4f76a9045e029886f60db89fecca97fc9c +23fa3c0ca5fefb0de6a923c715e90b8360b85a51dde11776fbc01323b578ef6d +86b76123e3c41a2e9e8470034c64783072e549ce2949d5c2bf6b0d42836a60ab +2b51621b608b2e22c16e6fd23a3288c8f721430b22043cf3b48a1c8a74e84aa3 +7a06514ad9f9a697328571e506d49ed1a7e1cdad6e1e9f3f41a99f84ed060d85 +41f56e88cbca3267e0d496857c103fca42fa3d4118396d494c82250c0273e939 +94a09f812dafa45efaaaa6194a234ee39eee66882798bfc41d24cc303f58a445 +5733943c10c0c10f6776b663d0f59286e2a127a906e8d7b2d55654b15bf58016 +0af11f67c20968d2b13139456385cf84430a425dfc6a48066a59f6a91ef3cf15 +b3c8e068b91892ac2218add4ddd8d201579d6ccf3664294bee67d3bbd0b2804c +5165e37d567a70de26860b8c13e90d280b0a79776ee6fe064343b1350094cf41 +a5dd65ae40fa25a4a579bd9fb74f47114cce0c04e6c7f6b044fba8509f456b57 +81142522088226d82a95cc38a8823092bd3d113a61f6439fd78f70d781b0193c +773a4c5810cd352d2febf25ec138f5af2e5ac51b4adb09fdbe4ea683922032ce +1b202d30876a59a3c0009139b87b6cf0c37ca07e0d585435986fe85a9bdf2743 +da27b85d5d1a37de840d7fc2e5d92609d65bab8192f88b758a6c631df196980c +2fdd706a2d8c28011699e7498aa1c14e47a7a2cbd54312a6c5943ac0a9a3f163 +47eb0d6a10f5ad603c080d9faf3571cd2335fe4d1c92c7315adc25f639a4f0ea +609e73035bc24bb5d44371f19a7fe7c497be059904606007ad153b59c64bcdba +e3a613c2787010cdc081df84ad9a44495d78f6440c9a7bc7395d04d776169c7f +1ef0b7621e2b440a8c533ee3660d35acc3b482d20b3515457173bbe7faa9751d +f1ab67fe48753834da25917b746ee6d2e30ec6062221241283d8c34787455db4 +541a04752313bf45c844a9ad0a29ae66356f4bef8fdec5741c19c0d2d7bdc699 +ccda2af082f28202f443a789e9b40bd6491e777a49a4be285d5f985583c502b1 +b2d9568e493bcc1498a90589e5981323234426e5769180d74a5bbe4358492875 +337845eea1381ac1be58745711667874a65ef86e367bf298a27b60319179294b +d2138bab5125b6171150ea426a6158164fd3390cb51f1fbdc930a2c1ff6dc802 +cfbfe3c6b6e34f8138a0880a098992b2824ffeb149d5b136543b326d30520063 +42f2a60e79e576769de0e65da6f65c88ce9fe8d7869b1687d0912c518d1da5e0 +5d4aae80fe32d8f25aeaaf53865e022590056983221fb8966bcf4ecabcc6df19 +8f03ef373007e80e224e1a45e03b957d39fdcbdefe916b32f9afc8a48c91b647 +6ef437aa7768588068977c97892eb1d4b5d1c9c9d49b6ed7e0573345ef971304 +119f725e0f88fc8794b0c9cc35c925e4db50726d82d4788bbf8bca83ec533f2e +7c19d7b153bf2d4cef8d5c7f46ed2f1b1a6ebc7f547a7ca5289a1fb0c7ea14a7 +34dfffd1543702cbb4b2b67e8cca16e54f971d115aae21019cae5e9b24defff9 +a7d4b50a44aa37015d68f3064f9c3185ec444cfa3af32aaaac7f4e6b2f71f7df +02ba34a4d51e2886a2517ce0b21ee84b1f877852b3d5932840c14d523576777a +114d80f83c8b730eb41447bf168c3a2d259851f545fdc15c5812c58c79c8cdd3 +f8e9eca6e2a41b53557beda8f889df48884d521add83e65e7ce4025c5187419f +cce51c7ee43dd66baf2409b4bcae3a94ad2d99227be325ab135c9b38a8a0bca6 +3bbd58e7f7b0d438e8b01e441786d8a5faa23f6b957dee7c01e2172b09c7fcdb +cebeb62ede3a36b13a3932a81f512c6ca6f69413a83ee30efb5513d2b5a6d15a +ed4eb95338d01879109e113515553402c994f32ec590e11f4c0845a6729bbb71 +de7d4893839da80f1d1200a2ea5ded805b3f8b8e4209fc74a16733993e910e8c +08c3aafa543c04d9ca3947cdba12a285466ae3cfeadb0cef83286da68a806e56 +62ec73ce7913223adf0c88deabfc3c5852ebec0b67c72a00650314724cf38bf1 +eb463820e829bce660104921f069bfadfe4e3454e9d6342abd2b8c5bef56f385 +f63c2e0d095687f04a2bde230fbc1beb95a19bc3ccb0e454967260b13313ac23 +048e48979aa0e379903fc3307a97aaa6933519318a68dde5bec8370956b11b07 +46a09198235e6a5d3a21ff337be92d5f291606cd3505ff41dfecef31c4d5804d +3f361277028148653bfe090a8a9322d797c2f7c094b7e302a7cb7d0a6aef8533 +4db7dc06c846cef50a24d5a463f461c23b24b171f964f4733c1c249401e791f5 +088b0eae5cf16bfb79d5dac5532a7814aea77e35c072e6b69e50fb18445a6130 +2b19b60969afdec3edbb0b66b914c3973d1836faf2ea01c65d75401a57bef394 +8de682b7edd50be4b7a946ade2f5221d6cfc4b00e94ac2b390067f2dc92161c1 +d73f7e580de3063d112fa8f27cd5d6d37ade4149ec5f8b8c3c9d88d13c235a7e +bd04cf1a2fafe65da20b949322b50dc78a485119775de3e5ee70ef714d598c27 +0b82d4e73697111d0fecc9552d8f5caa3439b7a52f5f445b27bba45c3606ac01 +0666c4bc2a39af44107750ac6bf3a8005dfa3248413d98b000bf5e55c3188ade +5287349a01041067cce0f841d6c2f828248fb96e6ffd770789c72369cf05a9dc +831e7b1b2c01bad69d465e83af7b3c291cc74fc5ca2e69c2060eac386abac347 +5d56028547656815f50f46a251020ff63ca64dc1fbeda490493a55b285d1407f +3cd803fb15906baf8bff8aef2eec3a738fa9c011ceb51805ec77ca1a4e8434f0 +9fb36b45e8d95afa830e6ce6ab350a4ca06c463444d4184b681df11e04e733d2 +9dffa1a3a68c502a29e05be5206c5d31c3f260f56b5f88901fb0aa8d7dfaa992 +4045686222cece6a868b664a533571b19fc3e1e69397f3d9d0a8bfa4b3df5a6d +40a52946b8bed057167e3c3ad3ee2305d7af4a16696b00bf5463e8fb76892a34 +8618ec3d153b3878c8bd72c21ab2c90ec88993b855e19bb7ca23e454415e9977 +3def574125029a9cf24540c6f61ae73ca96739ba838f1938627499014708f2e4 +1a00d397e7c67c74436dfbab39869975b9ad748b90abdbaaef6744b796696c19 +5b8b2d0651b163bca5a1a5b6188a29024ca97449dfc87a99ffa00f05c68c3906 +b2588be6003f1f35d16d2e4f52185b87a0195f64cce629f9ae188c4f21936b48 +01a34c69b570b67b4ab176b30f23e28f40b25da9d5f8b30d147c19dfdb1c5f3d +a8ab8fdd2c22d629fbea477afdb3c230f8488b6d24791f76a53ff2c21daf7ea9 +08ff9fccf55f0712fe16bf836032f104eb2c454cb4e2a3bc93493f40f9dc0c02 +c121cc50ec16ae11128b8f43202622a4eba117753eb656fec0e702fd1f680ce9 +1865b792896d48aef87f5bdfe71429e5963c74a77b24a036cade70ed655b4271 +2b5ba33ef9166444840df7a1e3b0f6c5675994239840ffa04dd8f4cc8b47d694 +e6d6d601d775c19bf504ee8ebacbee258841aee1dbdadb64cce7c026897a3ffd +e77b3e0043af31eb442ef7ed53dfcc969b726eff1f8a43c13c13131c6532ae0d +9e8703618ed8af07ca8468aefd047658ed08d6f647fa2809cbfd58519adfd791 +3f970d65a3f97f63152d9dbe9af502a2b6f012d2a81e32f8d8cffbd56e63a9b9 +e49a301b2c3699706088f94e7a3f11c7fbd215cfa8fcf44892fbe4f50062bf95 +38fbcacca34099f0370de74576d768f1f199c1457bda68473729f390543aeead +c9be3985cb5cb4e01febbfba7021d69b9d038a326a76fbd1aa2becd26f7979e5 +bfac785b8dbcd84cdc90993b553b694449c98ae3aaa0d1fc59953dd57598fc9e +2062cfe07d482e20f23e1b6b8f397b797656f38116853178b7b1fd8a78fb7071 +c433fbbd9ebe90897f52651aefeda189f61069f96d195ecc93692c417c9778f4 +0b23525ce5a0f6d29bdadd0abd029089b9c255201d7d829d12e138538dad4108 +1826ce5a43d78ec57f641000d191c9631106268f64ac7f4946fb8ca5599aa3a5 +017d03a837ed1c765bdfa4780f3375d95041526cb137250a0af36b9f9d055fb1 +98fa33d374baf553aa3bdccb1f4eff10f972228355144c7709a6cb45052ce6e2 +bc667623b47c220498a25caceb28dcabaee4ccfced7aa6c14b586a2e1c60a9d5 +4f4313885970d4f824c9807375d8a1b70c7b5fbc36eae7affc902c89e394a2c8 +39dc7e4d0c7faad918c768214e16a3e3b38e3a3bb382bce607968c8c970a7bd5 +91c6d5bf50341ea777a3d64538875fd65a714c881e73818c61a567d1ff2e4d78 +0b2851ec0a9abe877f26dc9b7269cea5585ee3997eb314a370724caca582830c +f1e1cb6e517528360930a1b81735adcf20d43511249f520bbacc0d94f7449d60 +b62c90d220e1b2f9afc749b9178829b5140c5471074b074b42ec5c28e600e8c3 +b596461665b2fa699f33ab8eefbb7932d383814a402748183cc59289b27f19bc +ac8b64cedee4bb5bdca401e1714cdfcc9c0329d35939a76229b77f629fea9551 +ce87384ab083011c4bfc8d5e3a1367b48ae5a964785b34827aa72c7b6bb4e8b0 +3c6990b6fa4060dd7bd1eca5e2b6efe3c8d9915940525d6d70ff2b2c8fe45128 +22d4cbd4490ea070ba7b8688aca9ad168394170b7169979d7c223fd1c67c02b8 +df0aca0cc03331885c384c8a573770e5ac87b01bbbb8ced847f7a4d68e5e655f +ea4920b32bdb79d3d7099d942f07c18b7829b1ec7d68d187c550081a4831ea95 +c3333e213aea8f45dc8aa8a5b7d925e05979cd2b0da0560be2367b9d1fc368e1 +837cfd77bece8538b26b9306e054fd86cddb668e58e487a772f89138c00cf8a8 +62b913e9ef8be9fb90cec90bd6a74c4e96f55b3a73be8f223eec41958313dd0c +b0094305eb85730ba87f6827d6a5238727030123fdf6566581105d0645454553 +0cdcb5069c9f1ced3cebb1f5944e44979f17bca52400c98932e6391d5cdfccfc +da6df93f86b6da1832f83683fbd0ff6b47ad7f2734fa4243520ed9da9521e922 +9fd4d1961d36f1fe1f0fff958d4a12caadb6de73b54ffc64d72c089090af3fd6 +24a712e60c9d7c95c030827d1da39227d5e6537f01e149f084451c7b1799dfdd +ec0fb4d8b3655240ee03ae14b08c1947da7a66465d5accc205e0d4c3a25ae300 +2a1f991a5efb7f592260e6576a26d168c568deb32919a5f47325044e7ea0959c +bc65907b731957685aae01d3fef2d9f87b3ab44cbdf72f161ce92240734b3018 +ca6c963aa5b29402b5f12d539672c4ea7bc1c66ab6104625d97f41e65abbedc7 +5d3df3802f9c2101b4cd6fc7e559873b88e8dd54309c8f53dd2d6cedf292b366 +2fffd38681bdc5936dfec644cf6b7a7e415bfd7fb9de469266927e5b82ef3e7f +011aa4d70ca53c6e71e460a7be3fa42d9307ffa701ebe91baa7875816e1901a8 +15e3ba35c3b4cb00a6c87b98eed8d8095740ec71d3c00f8b578daa88b3f33dcf +5bb6635f1b2ea62eb9abe181dff47374824dfefcafeab400020191e74671a097 +91a6757c880d4dd5a7e3da51241876415d9f70c689c804b6e9ab5b2b87f332b7 +c0e2c3bf5b2246ef438ed81ff8f7808859632ee8fa4458eae295eeeb9cfc7b03 +0c0b906d4805f9d33a39a3dea89ff2eb56db4c254579c92ee37286385a5c67e2 +0a1399a73ad6921b46082428bd84de18cf92fc9f8058b7bb3c193a4a50b34403 +358600d3d3251a543a6bd9ad3c5db4138dc043876387bc1f55d919fb8c35cc11 +cd707aa89a7618ff67f427c74998a6e75a84f261a2030710ce94325020dd8814 +91384f4c83ea17fbb58f73630613552a6e9a905a98206c8adc56b67419f996d4 +1da159cf2d8695507ee04fb958ef554e30d482cd8f214478062d4fa026f86b13 +3dbeb81c957e43ae99142d2b9eee13712878f5ade9912228bea38b1d42a835f6 +45f056ab9b40681d736ba72a9b4b5ce2743e92931676d8556000d32d259e163f +ac90b30944a2cf1c52a236b4d71a1b2c0c8d45fcbfe447c732b9efa9d3e103c0 +381211c00da6df127d5f57aae449b9699466cb369b996898306722d85f8c24de +e5ec2018a7a4042b07178fd55632305cd5bcc0467dfbcd5ecdbfc9e494dd5a65 +8327ef45f0ee3d232622646f56d7764398dd5d01e92f5aa4fbb11d95cfa277d8 +1c0d5a15007cde0aebd5436103be6833beac9fca1eba100724eff0924dbf1569 +97f7c080f05ba7eb68e201f6bbea8541a94973855b800cdb7ef6079de238b758 +e465e27c2efa56dc98ed8e4c2861e2ec8df3f2e919678ba369890d15b8002fc3 +546a3ff1def38e2694941a702ae77e16fa2e55442de9248110a8739e58cf4b76 +664897bbbe30c2b6d172b2604da84c60746a7339c7971a83d516ea4302785c02 +e508a35efeec0b61a42caba94b28bec74f53e66a9a54bbef4ea1171472e34bd1 +dd2072f460b24283c8217d6bdf8ab34210c08cba89a7d761df442ca147effc4b +4c041cac1774eca35d106b2026d71615b4279207039ecc03b0404dcaaa7d61e9 +d18ef74eb9bdc614225238ec4ba8ae417be9a6386ad0327dcefeb5a25412bf36 +e6ece299be240192d182508a51c1c1ec7ff65096f0f6219f25b8d07d67aaa3ef +d4bb00475135483905e87aadb826a889cfe5fd3af57466b0cbcb91c397cfb9ac +f17bf93c4bd1547c6b196cee7741726321a55aadd02e6677872f6685af9d0030 +f1c331a926b9c42ea8b6832bca8ac9c607a73b527da6c9a2fbd289d781dfb35d +7c5a053f8f91248f1c3ffd96a1a5813ceade13599db1b3ce32f5bc57f0335693 +c8d4c405b6f9a956e704e6e99163ef2f0b6787f0bff18623dbc1158e34006608 +70434bcc19164b41d499feb2b26fbbbe4020728e4882a6a123a8d78bd1f298d0 +5249ad33d6111b4a9c6f3ed2fc7b5a552b79af79a0ff935775823729936d3083 +b7b93a0b15ddcd84581e28b75451682eb6bf9d3c8ace9b275a510cd6561058a8 +8406173d4128c3cc60170d911246294f6c6f8e71a8de8c587e84d44b78e8ee6d +b68a4e4dcb14d73b6d3b35f2d8c3aaddcd0967e570516ed9387382f78e741c05 +1093aa322dd6b0a42cdaa10e510ae3905d0542513d348ed98c4c9e01e0505f52 +2ee0b4658e51a433252f9d10cc18232783d58f88997634ecbf89a2124a89754a +56a4b88de81815b3a17fa42e5b229f80aae7b8559459a773d408141928619cf0 +f56cee08f05f8748a201573013e41c6f6bfbfd740759e512a1e48cc4da24da1f +aa24672d4164234b31c631da10260e2e9e788bc2289501b083e926d63152b46e +6821383d6065e28d61d7a6b57b7d9859289dd3a2327d3251ff65c72ba121d0bc +81b726e38ec1a2e9f2abd4827a6ff5d19f3b58ab955a609a97f221fbf793aead +e245e3164f2824210a5b97912b0a71694c3cafbf60e0af983b31ae30b4b9a41a +aae396d6433db119aaa6a174e02941a4209e3a7ec58581701021c3af19b12925 +4e16cfcbc2977089ec85258501494eeee8e21a4729fdab90efb334fd2ae0300f +ee893650e27238444c5a8c0511712d6c00afaa55b83a258a691177384a7f2d7e +17da838132d47c18a528098888bb160762d1d93660de8de402282c4df7492ce8 +920d1ac9e9886e4d9a1302739890fe2c95eb37f9dfe73ac4fc51c4b0dcb1ef45 +d1dba50df66f32c1b2e03e2bbdf0b151424eb2a5479dc085a84ff7940ecd5651 +7480a4e7653edccf6a147d8af6da9977aa7871708f6dbc0125ed0e4eb6a2aba3 +656018e05f90831ec7d00a9fded05da231c00b95779b0cb9780d9fe96b1dbbd2 +291d7eed562204c11393602fd2d90ddc31d438b420720b5e19a7a760773107b7 +8e2c1aa72e2e1fc16ea9474e7167ae6be661e6d0f37f3beab24d3f9ccace3dad +be68fe29e086a62b2882eed800451f432db02614da4d1b7440d2c8aead012aac +e32f90080f444b368755d49dc24b05e0c48ef3fdf57fd112166685773c138ee2 +36cee78ae6d93130e97e8e633688ceada23fe3aef575af02d5bd3c2c5bdbfae0 +7c83cb2710fab57f4fbbf57a8be81415c1abe8b6318db53dcb71e8850511af89 +4d43b842cae1e9b4f3db6304d45d99fdb452ebf0ca76c1d7592f1c9eac61f785 +c775c0cd72c883b0088cc2cea72367337a0af42b233da8324b02b660cebe5970 +ca1858217a3d140556d5894be895249f04a2fe9a03cd39eea05ddcfa0c757fe5 +0122410c80274e6fabeeec6c0f8181718ee6e673229a0a0ac2cb4414da14c4d8 +757e44d32207fa9f01cb6a4f04a6a67c38b219d1425dede228ba157b4d1ef96b +e16bdb889e8c9527a0fc4cdb2fd6aca296d7c06daf3f259f0ad74fd806c047ff +0250339e1c1d650d8867ef37c6c42cf7f930fa6027445692ed00f0be90a79ada +9de99a986f81117165404bc82cd33a64c1778eefaa123c3581454a8334ec0529 +4cee91dc0226be0dd6e8a229199a069ed36d5b76ec66fcf363d749ce886fcfad +d6cb008f76f0298be337c8eef13a24ef7c3d774010e2e4a7acc429d8c0da7a32 +f8bb44aa9389d4f594be75a2f764f9cdab9011a3c65a3555a9509f81c27dd091 +221ea30ec6ed8449368a5d4ffd302fe809f3ce67f4738e96ad29d93e265921ce +45622608522273b64bc36454a7a2d3ebd334aa8acf9e4d4ffa863ec25819e7ab +2ed613933fc57a4afbd0811d4829d2bd9802885735ccfb251ef38766b436deb5 +359278fc0067aa17cb27310c52cb5ac59802aab49029ecda9dd1e02696d4fd20 +75becc63dca6908d1ff00efce86d5ee281baa70f62e3738ae4f054bc027829f0 +5a57e15b9326df9fc56ff8c040daa752a0399db4d265f221103192fca2b3c88b +a6d90659c0d85556e58c473dcf3a1f851b4a1c96cbb48971e1cbcadbde7b6799 +ed6b2d77eac67a7776eb7c571f6dc43ce0697f4392e75978b289965920cf17a0 +d78aeec7c733c885ee89ab9061094d0d01022bef4839951faf991876c26e5e42 +9eb7e5a57de0da10b61ce825a06d33df1989ef3a93b83130219f933ce36e4b0d +1f626265306898140b6d6f4e4a253cc3c6e27304b975767a38127a0b8d906f60 +53d097e7a588648e71fff1fd9415ac7d7141abfb33086171868fde663f6a0aec +ac7c8f8e8cadf5827ce72fd49d319ca5985cbd50341c30967084b5428cb488c4 +859b000c3f0cd1019267d9ac317e02cfd4f7d4480309e7f6850bce35c850155e +7cb5f93160d33fafb4383ad3924d0d665647865b5b9835519ce1ae14cd4d26a9 +c46f889407d0d984d2a3e63cf6aca920262df305ed31d3d1a965c20422fa870c +d860c3ec7d3b5966678c238c0e4f69daaca76fc006201072facd2873aa30db95 +626cf97cd33eb47950b2b831040be0691f451765f57824ff493c3d06133744c2 +9fbea2172f3097881cf406da9cccef1b6be9ada1909886ad58edb99228972dd4 +240898cd356432c333673b8902ae243686912f45ee6bde468bd3e8b09448ec5f +00d7a9213628fd6743f0cb028707ffe5e5b8a8a24e83c3750d68c0e465b820b6 +30d209d39da1f548eb22aa88609136aabfd98026bdc4582bcbe7cbc50deabf90 +49d4737e44f1f899062386edfecd5dded3a743db71a61ebd8a81ffda6470612f +7cdf827924bb4e7e75e6c91dde90e698b319d6fe6fd982955eb99424e0f26aa9 +3acf642ee1c9ffcebbdcb6102f9ba206238cfc64d68036129817a65a175327fc +f34c379fa002c5a2b9112d5b9064ecd77912987e28883259a6ec9f2c2741a84a +03830b31693492ea5286ee18a52af05b41a6c379b6c850b5cb4d31f60a6e519e +981c22680db193fb72d365f0260abf3389832ab1d78759c1482eb1ffae6d8c4f +20676bac1407720c6d3cb33d0b19106c6f3059afa85f3c782918708dbf809228 +81552754d6fa2c7ab482e703d664aa495805292274adcd64e7696a5d096ee928 +9e350c8294d7a1645354674e66213f18553a72fbeb7fca3647ebb5828f5a452e +03941d4cb822ef0839254516c2e6fa668006bee04122ab89d1e958b57b98f0e8 +ef8839dda01dd884e0bca9cecd0a9d6a037f5731c7048b488f8e972884904692 +c0a558358d736a25b7eeaf608f9c85ce45bfb13fdb0011164c50f82513f8fa5f +0a53330cfa24ca4c59c50813974c2307480a47c25044b2bd1360df7c82f2f482 +9fdcd0581ae31fdae1e36d59ed2a6b8cdc97f005d32333e27d1dd49444176a4c +71887d2757d1034f27dc74793ddcdb0d97806e9e16328509c760801174dced00 +316084e04d488626ca71a824c2e1f36c7b325a3f1446b21d465b8870f7a6b05c +ec4c2a996db293a754d49a6ec448b31cbcafe353209ead320bc8d963432888ef +1ccfc29e46c0c7c8e2849ffb6bb680f5016670b639bb411a399c63371fd36c6b +079077160bd539d0f253eb437d3c3f8bd522a05632db51872cc2b74cf505da34 +eda8b3039e636f2b8e9dd82951380a5e5e8bc776e996e50938b8f9c5a470f366 +e26e719646a3cf2e362a95f8ff6776cf5edbda555846f284c75874399d211240 +33cc43062237e479d024a7c34c6310b81f3a299a148c0510b78ef9d01a2c0db6 +151c80d7978a93409e2c7e01417bd898fc2d091a4f258e777f5c18dfc432cff3 +7a13005c10deba3b25411d93b6426cf9c1e25d3eaed39f8f7d1c17f8ff23bc9f +47dd0674ce0ffd60e12c1d406587cf6ecc678220fcba0ed870e0be75768362c1 +2b8158c19cc70560a058e53b83b19560ecf18d0acb4316b7061a9d9dac63fa9d +ee3a0da5f7cbc2addf7ae5310aa833ea1f45b97e7698558f73f952baf03ec25c +ae370256a1f81578d360814dcf29b12764f88ceb7ec3358e923f781bfa4f632f +de9414f7b98ea0b063536770f3fb4ecec21a68caed7fc7c85b9abf613b94ea8b +94f49a2c22e23233d65d4d16e4e6cf2c317da20e8f2307d4b4c654ca9d215479 +9cb625b53cb49947961f81ed2ca5fdb4d64f97edec759265788cfc48333de518 +fa274828bdc27394e4a0888925d2d9270716c89f82c2bc569be497f7ce930924 +b4f16ceca99254efc0965a3eabd78da5a16cd9f8d581cb7106ec2e9058b2c9b6 +7550555c837e57fcb453174208c072f26c717b88ef55bc13bc3188e8f768aa6d +11026d3b69f0628cdca2c2155df354f24d2af4c9941b0172acd73cf9c7f973a5 +394aebd41728178dbcd55e73a998df39cfb66a287c0288e8e0e0816ce5ec98a6 +804b2d1ce83f2e31a17d32d47033ed9549b0b0119df7e2736bc89a21ff725695 +018ff19d096d87e8b310b9c0884d4f8fedfb889538c9911d4e3fd53aa570492c +98a5f5a822886c60b8b2a72e775d33d0509a4b63e016cff3b2c767a6d39143ba +995cdd4aa4a8c4de041c27343cd57715fbb6d48a46238c18d79ecbb2548c0374 +b9af808dcdbab805c520b63b30aa66a4cdae35e4b71b45c3a2db55c34c2aa879 +29218f60b74af83e44b1ab43906a3a54a34d85891573c594d3ae52fcb548d177 +296b52fe2253195f97c568894e8678583165010db416012acfe3083431175563 +6d1dc919105faa02f9ca5878a719aa7f0719a4ea81ce7bbc5c2af1ce73a5b403 +c12ddffcb317a401a4e12e3a3168a04ed036f04b973093605d8d4a9be6bd4cf8 +6a8b57b37633a1fe2791b281f40c018bb53ca08a467735377ddecdcedb939d8a +38f757b77970cbf6f174b6a6c60da653e3e3366ad55890e78f61d293c4f96e4f +f03dd48b2b23f06b3dcedce3c624eae1497e5d65eaf1723447d2f0ece09c8f60 +df0976b17c95dd43edb503237218d7a36346d08b285ed0f288fffe09ddb03cb8 +d2d76449dd1d40db1d11992055f5494f9b8137e4c918a33446a616f12f5e0683 +a4979daa9b97d3acb1fdac75242e1c3f2bad66e3dc8a9203333e48376a6ee721 +a86b34087389370ce971a7057d608e93eb4d7989f487c874418fe9a58bedad1b +622192bd5f8e012b1d1942a6d65bff9cf5af14cd6e4cced7379a77cad8221dd4 +06adf2beaf7b32155da0b6b22a92adaa95d206ecf5a7704c4760d14d70b7c268 +4812a0ea07f20c02a797cecd44bc22e147df1c10d51c221e0c2161633616da82 +53ab9a727305515f5e287f7ec56f540f1e7e7d9142811123b84df2cfe7124789 +447d50bfafffde6ee2d7f206996b2fc896978a06628c983f5e33335b20a20fe1 +a71f01634e917ebd7996da19287755e9f9eaa0efdd7a12934da4849121e0f52b +da07c25468a7cc24e792f5d8b37443a72e2e50c655bd80a7badd47e4fffabc67 +7d7c4190824f88b63c0606e93ec889184c70e88f92dc556e7e71239bbd733af3 +0d781cd85b03ff796bfcc24e7ace070db05149982338665b57ada0e7c2b80d27 +a64bbf46940f28865292f05f249a1b0d3891efcd184f32f85bd96a2623c5329c +c59686103b6593dcf33a6b77e263167dca4a067874724d57efe3786f97349854 +809d3c8ddfd04d3942877f5def5aa3fb5d8be234abe999704cc133dcb3fdaf1e +889f6d43cd4fc7fb570460f7ae4c3b2de650b6d9e8caf3c6a338394a68bae1b8 +ab46be4452b9709240803db075bcaf0a5c36008ca4d8080cbae6adf1de652b8a +72d6f9b1bd1628eddab2c1b1f28bb144f9cf7fa7f86613b5b0e13d3f870954d7 +6e358c7841733c90d28f8ca3b045bb494392d36a1b2c9da9fa354c0909fabe20 +b9335158f0258d231301e9ae5a2217e566b520bc87583a5d67d5b1b9b0a999d3 +dbb824d88fc6510e065329ebdeeb33e7e7ee38ab4c9afcf46b089f6489287a22 +59a1137f6f31978958e1c425c2b8aa54e8808d12fda962c912c44092646d2fc3 +cee8190baaa232d539f9b453aa07d1e0527e6493d97b970017bec1413409110d +3709d1a7faa79f1f07757be5d05718b09cf1fd0fab0a442ca9d14483d95767d8 +d8538f13c198e4072c332b3e0002a3a77c014a1682a5b113eeb65155e5a0b464 +1fb6d589313a2e56709e1be53e8acff66fb138e8f18bcc6b684457c16aca8a02 +d063a19b8b2849205dc873ff1febbccd7778f5948e8f974d85f74ee9845716b7 +d431708eb918eff9ab80be8ccae06fa58caa0c57f6c3b0c4f24fb07aaf81da87 +e12ddb61435e564ecb3b74759374e8e08d98c011bfccfc824f1a7d9df9d83fb2 +cb3a4136415297410035b6c824bcfd9b01f7d6f19f065bfba1eee8d560045dd2 +c552badbfd6b03ba6293d12b01985eb156c61033bbfd2553c4f96a77559061c5 +8e9e0d7737316fc1a1b4fadfc662ef1caf4aec6c2231d50cd7583f94af423b18 +ab4b9dbff979c200181921d84a63e4e722bcba97e42f78170f9441d0001dc280 +451cdc1104dcbb65df237553e3baeee3c69153ced25001e6fb970e6072ac27c0 +fb99138c0c63a107c9ee8e9fe1de42e534180dd9ab1a5c2d4f4a5cfd47711c73 +f55ca3cbd2e074c1ba4700ba73d237113e9f1908836c5a334c157b903113a9d3 +5ddb5608d0efcd863b973fc55017d106e68bc4fba6eb3129259854d59da2b47f +e82b837e5c9b44ef7f279c0f6c0ffaceb7f48a72245216e5ce316a09983455a5 +089114d310a111a4b11da77a68c5e965265504cffefded03b1dcde16d3c3f940 +ebee6cea1616cf132b0658baf0bae5d3cd6043a8bb2f071df65f1e5f16eb0e7f +84411556a2a7e5fcdf6b692c3dbb9d9fb6c063a2ff8eadde118501b4edb0e647 +324860b5a4402ebee015b663eb8ea6fcc0ea91b97eea89545ae93c5e3cd5548f +c83f754e3ce0ca0703c2a0f35e0343d137a499aba617f83d46c7b7c0597fa84e +1e544dd77afd9cc36558449edd033fd4e7dbeb57071cf624c109ed1ebaad04c3 +15eef5bb0b004895834dbf6b867198688c9b4117909aef484930e8a31602452f +c799fbebacbe7b75d1ac37f6afc8c32313db3c8e4d64ee504632c76654e984a3 +882762b78b8791e6e46e974ddbf7ab4d048076aded03b6071f373aab006e89d3 +87dc28db2580559d957e2a1626b1b936a869da79be30d451f42e583f0d9feb53 +14a59195da976d1b6f42472a9cd34834e3cc6656cfed7a4f56a00f721967c384 +d664d6a48781058652094ebd87350c6a3a4692526053edc59963e0c5623d1df4 +0a0579224fccfc98730df4e1e0ba9b258bbbbe9d2b4c1db9c33e2a4311080da6 +bab0e4044ace3f56fb92c99e3cd0229c4cd9c1cc03c1f1ee32e772ba7cddeb6f +4057a68a458414611bc2eb218d824189818cb4a95cde2fb9a6700d412b3503f9 +8ddba098f014da81df3344748d1229fbf801c1e2316d95ed9559ea16c898ce9f +64f4e41fc35748e1efc299c26dc3b42c26123c330b9c8cb7e001da5de642e6fa +c44c19f97b20e47ecaa5263bee98690f122326556c5cb69e9a21286c3e462332 +e10721f7747d3425cc204d4b4f514501e14840aae43fb523b89e8b2abebea979 +c6762a89e4546531afff98c36cd30a38d13fc19116873917684fd3043c3446f3 +7c6c5a36ed36eb3900bcda089778c671d6711ccb2f7a7373aa6f519b27e7ac73 +581ea404ef17adf8c92a1f8e9edeb0201b3a48866584806e667d7eabc955e19c +2abfd1bff1f71289b2d8f694937e965bcfd6de56844f0e5fc980efc777f50f18 +9cf4b2d7c0fed84513f215845aff1bf3e4250aec7d7c19158978110a81d73f44 +92da75ed640441da004cce30d28826514e409baf6d41f7661c4668016d9fa019 +380a21444e969a6aeb6ad3cb2341d0287e2782a409675295227fa2ade601e1ee +33dadbbaed9ea5f0715a88f5390868706ae6b5ec4473c15e65ff58e9c8117106 +c83ca1b91001e741eca076cf0cda6d9e44de4f8dc762175f422e12382dec63df +164388ffb614abd40924ff4f6ed0e57cb451b320136c34ad9e3462ad884e4472 +7fe5f7d5c6e55997355cfcdf375f3ceb4913f23d7873731d77435e78deb10d07 +d0afc29c261ab66f2b5d1ebebf36e96b536218e85de4211b5be3bfbbf0c359ff +3207f6d35ee4738be6233e4fab21002039fe208f10fdde73d0ed01e117a69c8e +056a048757242b698bc4567f0684c8437d5d391fe2d95ca241f09d573654fe1c +cf138ac60ffbdbeb15f975f8b1fa3dff83f552e27844ae3f44c4a874feb1ba98 +5237293ef7cd143d83dd6ba9cd08cd0dfd63d3cf8b5536dc9d65ea582b2b5a1e +852778730e3a0ef6853d3126dd7ab94bc3cb8c41f60c82aac4d82223296fecfa +e01714eee59cc4f75ca5bc0eb875f8a4c9a6d499c9a7e1cc470987404dc820bb +c610db9470c0153995c2ac7cfdd334174b91923efcf4de1f3543d1e9971dac29 +a6a67169daf36b910780d691201638783401bd49010122d7456c7d8c1d301fc3 +243103d48e9fda5982b07f7300315a1abd3c84d7aa3088f00214f8c2b4ade1dc +d82061a23adb2d2112efdfc648dfb995ea7da854793df6cd6b3d6ed7a1120832 +220c9e43f05ba4af43913c5bf74c1d3340d4e11ab7d68f6e4b9f785034b64321 +1a1ff2fa676fd0cc367605ee99f1c7f4e618bdb26746cd879a8670c3506707b2 +b774104efb3596ce07ee5966c7a7bd06563f7856742b284bfbda52a2664e264a +5f781c5fd79ba767a19936fb3a0ef2072c998e1b916a2f2f663b4343afb8f168 +f2f00d3f5e1f583d20ba03f6f41a980d777c7c5fa5300d457830c48faf007548 +b642a7da2ce598799b042d03f4a1979cd0130662cd81511a5ac2866097352329 +a93cf79be94055616a889151b66b0054053822de0248141d4d3c0471f3ec95da +cc00eafbcf9010ff26f90c186fed7adcf4383297311c3dc317c5bde2da60ced0 +e6dfcce2f0b25d00b1f16f5884981a210483a1a4d7dbabe00baa1e2ddf541a8c +cddc9e051a54be5f4c2d0ffec3b83e931fb42456d49b12f4488627d3d3214c4f +876ac4ca7e3a4e09a13d09c0741c7511361ee2726a8973650c7af8175fb81882 +245d94df87618d1c17632cba8bf34c37f91681670dc816afef4ed278f63a9140 +9cdcda8ca64904523eda55908972827693cf36089dc580743a9eff42e3f793f3 +100bce00a6bfb089e595c736eac8444815aafae9654d9da0accfaddddf283629 +be4a00a9f6b464bd3b84bfe069761777f71c6fd398cef5b915b7729dc2ec8cae +b4ef063d47ec4ad9a0d8d8316a0deb5fe7982824c9f20ba43f907b56b124a2f1 +b3fe3d644e9a6f1c1979130b56a08e9a91d71de0458777c461a93fa416246373 +81d8a7b70639422ecc3841958dda5cc2ff32fb018f7127b24fc1f8b2a97f4eb8 +a5ace935d51e1f55c5ac8f2f3627efd76f052bb517560359f6e139080b19f328 +46f0bf11f1a5485f055151b5a802d3c9b042ce62e367446f59519a37dabeaf46 +9c7951ae6216be980b97c3106e1bc77516555ce6a82a25a2c348eb0078cf5a49 +ae48b25df34867cbe4318b2180a68f0d283ead9448f3a93cf5006c9fb4105c38 +e3ee2a6a0c2c68516379781abcf30bcdd3e29353c08cbfc7c71cc33080a37fdb +5eb3054341ff059d1b0adfd213644085ec8f1ec8e0ed033db2e69e5c0c479925 +1e7996a730640b1e16ac49341478ff1b73bfeab8dfcff54c4f10dd7f10d00db0 +16d2e673fe75ca7cdf656de1aece63bc018ce97c53335c140cf8b98927b869ca +cb5b1f6667d9df1d62544dcfcf12a15432e31efda2d8f4d96b73f6128e73d9dc +932d2babfc3220aa8c6319c9fb435470625f259104bac932b7cf05c222dee3d1 +70ac1627567417f41f4db1c7fc7b892d18b2c53f12995344466d44be856cd953 +49f4b959b4749d390f66bdc6ba0983b377af879fabbd02f1311b6d87b3a45075 +516e347a9bf9c30f0c22573d03294fe0bf1d86490dd5e0f1800e97aa4cd34328 +325d62c753ae10fbd5098d1659687f930da4f195b9e4b8616bec2fbd0b6c941b +09b03eaf23bba7544838473f2b5aede4a712d754a117591bf98f2a534057d7ea +4a99ce86c87ec2b12619223c8046f9e9947fc8ec69018cbe93dec5ea5ded8ec8 +56b1d03f7b57b6ca0d8894e7a26c721956a66df5d582c397beb57c6c120ea224 +a7d5acfbc6acd556f5a08d60e5c1a725fcf062c8755df1d6f22381564656446b +19bf6518fff2bb1e04aca06aa90cad4333f10b16f9585e5d19ee150da3931c8d +a05618f6e4e188b44059ac3758c930c3ae763267ceb422e1b4595802b374ecf3 +2576af6afccf151af304747e2405f609f04509f38f17dfadc6383ac24d18f5ae +f8eb5125446d4d9b0c67001c84edb4032df4bf86e8eef2c113617f3771c333fa +c9b4e8d10be191b4f0b62a21c839a52f75ab070ad8d7b6fa6fe538be4844841a +d1da0cf4948c018259ff3065dee62ea4a2a586fb09550b1e32ee006768065f6c +a62e69542a84ac74349e4682988f106f944da6132c49facfe3a71e78f15fc928 +ba3a391a2599b16fbd0624504f340a0854332c12215bc1a8638275f6bf3fc328 +8c9cbe92a0196afe73ce3ffe76b146842cffb10446e80edbc2675458f3143366 +803d716bc0254178f6a3412f9978dce95ef93dbbdce9dbb2e8495780a784dcae +7e01eb627febe7ba97e715d3439d55e3d86ed0764b2ebb4e09a1a44a4f187fb4 +dcf7edb3bdd615cf4d8a2ec78483f2c5f1480cb520f50c370ea1adaac5d105e3 +1299ddf4c84b810164d9bd90500b956ca1e9cc387ec7b697a220d124696fe475 +b963bed158dd5e6a466e0674ab8fe21413d2bfa7b890a2f75447bd75e18f582c +7b94f812009f9e8c842e68e3f4d8545ddcbd12b522adf6bef2db3d9c9e417d19 +ead754d89c81cc8355f3e74d9e83df3a5502027be852275d5a292e84fe0f3330 +f0430353f25f954b08c7798719e59d889814d0f3da68006c3866e1ce7d4e4c6d +1637a36b81c57f076c2a534139a3fbd06e814308f41d534a0b8efa70dd0a3334 +28b39be5842b7ba882ebcb7cf6e4e39a8ef9049304661a35067d684d4338def5 +0651c76971c635cc67118e8fc3e14b1f4593e855bdf58cab00bd96c4b9fa3fae +06e5f2f0453b9785067720fad4fa2bce85e75f4c7627ba4c9ff60264b7e3203c +b7ffebc5a030ddb3e9f73e43476cb14db814f6582ae10880bc2e05d2b45d6703 +fe5ff8fac1811faced4a873bce848c67f21dec481e5bfa16273b317ad724471d +d6c000d0567054afcaa249b29fe4868d3de14f3aec71a9a516534d7bcd5f520f +4b692be725813ad0686818ecff6583db9caca9217d917ef8e95b4f0f65b359a7 +bfad81b047489b5a27f25e9d0083f3857155bafde723af49d89d12d0ace5fc57 +55ecf06556351af4cbbfb31ced64e43741e00effd88c100126f6a9ea7059a29e +e676d797f763662be90baf5888d003a90e1b3d2972ce2d2692905474fc3ca302 +45dab5e679b2649139d087da1c52b573f720136584590951849ff1acf3fc3a8f +3598951f265080079accc4792c81607e426c7c94c49235defbf99c2ce7cd6f83 +f6500ba6df15e5db02a83f6fc92a707f46763f7cc3e061ed52833ea1d5e2c3a5 +e792d30003fc4442c2b2da5a7b6265ff74c554b66cd79bb3f8fe8f925be0b8b7 +5539a85ec4d8fdec57744f34ff9046971df2cb948efe784244567ba3ca7585c2 +d30e9227fc65efda488c6258472b8078e4d53cfbc75a54b2ae83ca83d25eae24 +62925ec4c6a8a71f1659c30a40c27a8002d5af1f808e305584a987659eaf20c9 +bb9149bc90071f272e1668f28d01cf753dee6184f401dedd303e41270d956b3e +e8b162458a0b5b36f1b44730faadb167a76a906e4d515640db77355c10ce489b +f531944e2af613ddf4e8bf63744073505c11b7a2391f3bbea1eca42415e72784 +67ac2104f88c79ef1adcdd9708241b6c666a0d9376fb23ba488b16ba96a4ac15 +828e8d286635b79c99bf768f8fce273e569f2f1c6c34be942b833a1fe05de68d +ef04afae2e78ad7d500d16d417b517459820a3056be375cdc94d51b97bbc360e +918e36d526c1bff1242103d6aee802457fe39deed5f80f274a4a76930ed84c41 +08eb6d4ebadad5d97f9e5226af8bffc0366b13cd443863ed1f3ac1a43656997a +1562b520c57ba0ce60b0470c6200fbb418b567b575b76cca63a371e05b44bacb +8fd22384616378260738256cb80100fff9d04375e79f8740923c4f87d02eb586 +40b9af5147a7f15a8278252473c6a757900ecffb061aae3ef8437bed0f443f99 +7e1d41fbd1ae69e08a4b72f3d82c0c9aa74558f2000cd23feab368fb9fe8adff +b1edec68788c845dca9093d157db4aff2385d94b615d680dd2463cae985d94c0 +bb1e898d1ba8a26e8fd4dd75fa1ff158032b42ece876dc01ef0af5e59889c9d3 +3867a41fbfbbacb9f2b182a9e88fb57f4abf2b4af4b76b262f8b04e60f41e64b +9b54b05972a8c8377db85c8c057c7770ef3859ba3e6d4317246b4d82efec05b1 +b06749c85bc5a915b8da1d3ebdcf13ce8f09427bd6687eacc75ea0a196d22616 +6dc5dd288539be39b3fc157e957c1ae0c61f682ffdfbecb384796e603b33e5bc +43a3ee16f854455cc1825a2fd49931dfbc0b76acd783b8d6cf57ffd909e44e0f +65f51296a1be58b28ab759390ffefd476cdd169ede92dfd5362137f2412f76e9 +ab8d3d7c0829a910aa7866ef6d7712fbda2223ee1c672aa42584d3e5dceb6ccb +e16755b381dd61e83c43ef2636c33c5e1a453bdb8f30f51074ffa5ff9b427639 +4bc83edb449f5dad51984e25e77062f4ef7981b0cbcb6b8f97e938aa6e8ebb92 +2d7f2c599d714d3732caaabe65994e20e56795579f7feaf5ccb5b1448b7cf3e4 +c59366d5e5af71390116e2d7c545523fd2ffecdb8e2a59766cd2a8720b3bb898 +063b54de265f82d6cc34e88bfd5707b1ad047686dbe9d434414b73ee4cb2bf32 +8882565e93a6434d7d5e40faefffd695ce65bcf0014232760e63389558ac39fc +23a295ed68fa43957428c359b5256c6b7cdf7f4bf4de03d6e24dab79d709a27a +0ca54d84fd365f67d85a0c641073971e12260b03c0d9f88bc45cdffa45bcf544 +77e564efee2b7d8b8fa4af0745b8f4eefb970e6072ac27c0fbcfff9444ea7126 +c7befb2dd02476f58123cbc23da0ab4c91c8839af709a516df1db6acbfa7874f +50f41b707e2edc5cc705a64f3d9b1cf30231d422b97acf6a37b9c5d6c0f6ba6b +0768ae1b907aa7e986fc583178c251b36bd3bb424c13bcb9cde19644bb8b40c7 +63d2c192798218322f63e82bd1176158ed074b7293e4178e9953766f19aa08b6 +1765dda1ec557de4d4841f98e10f53985d111edbf0e132dcfe12d8118ce78632 +b67ea99982fd3cf289ec0cc186ee5993acfa41113eb12f9457c01cf3a13714f0 +f3523eaf4229da65ef3bac70e6518dc954570033bec5bb9c49f2bdd52db14a0b +9b1dca8b489d0e9992d9c44720f9e9039b920a69b36e31a27f33f105bc700e1a +dbf42412f827b364c91bd06a57e22097806f615ff8cf20ddfab163f32351b638 +c39bd7b05d0fb10df6ae8bbbef8a47870af4198ffa6f35859a308513bb3cd6e2 +32e50206aaae2f5e14d5bc6b8ff3f64a9497ebf7566ef04ff1394d1997ccf7b8 +31629e685294fc9cb7468a919ccecd64048c60a44e217e775fec9d31711d2ed4 +839a68a91e099d16e24b813817aac1c10e6aef41b6c616dafc4f6965eb4641ea +db27f46ac00e4aca80488665771724dac1fe2206506f09ec75885d5fa3129bbe +4e15f47090e9310c0d47835c5e697a634bea062a60c4dfc2d4e67bb8591149ee +30ee8c5d284d332f4d7058b1e21826ec6df07a1b12ced9b109af752cb4aca0d3 +b2f64eed115d963fc4356953a62dca58d03c6a1574eb46c2a902ef65c2d41e15 +677eedf8e0f92d99fe465d596ce0154785f623a6f21d0b293e211402870271b0 +a7669015f8fa46740fc7f171f42b1450e001190e0dec67a83f96e24ebd79d9cd +f8767571b35a891f9a7da04ecb6d0b0ef28bf4be1e1e6ecb634a3bcf8d48f797 +89fef27a51d3da06742a93f5367ba9dd87932d6f41fdcdebc7313673a427f172 +b142a59879ec5a115ba6e50da31c0c65cc88b2c012f14e7acdcd39aa96f58b3d +8feef0df2d568a41874b0ba77aa07ceb12fb6113698279479d15b5798d065431 +22d252e11d1a8ad35a267b8f9699f36c87e5f9e84f931f1fea9d9226de70a6e7 +e8503681d81dfc236d06bb2599f896cfb97ed5d287f452c7bfdc04b6c25bcd40 +5624a580f4e3ceab7d7e13768cb014bf82e1988b458a1d98f1e28ca698e5e108 +7be4a8f26c3a25035c6ca7c176215877b2ba1e812d79a37eb3914f2eb5ea4414 +7c3f38cac536f3a8d5f7f9a17e6008373c54669e00c937771e8d6ba2bd833648 +8f5b9b61fca0099ab4d8acc4b5df4a5dc685fdbc90a6cbe881cd4fb561e8ec6a +c76c3a42146a5dc2ce7f6dc221d0717138f03e7c5a93ed07cf7620975f4fc4dc +5ae665540f85b795e42b15df5b82644f6e817c831087e2f7b1a49eedec62a9ab +6b6fef18ff94e1e1f9f60c445ae93afbcbccf496255b1b64433e445b8eee247a +18d7e43f90e084b0728f70744f87313ff6fb2c7ac61f207abe55d9bf4f0551fb +12ab7d62e77d0eccee2ffae62392d6cd7f1b70d29046933384cea2e2c1428d33 +4a33ddac649ec5d4b7a65bcb483096a6ac1dd6408f48102e378cf71dd4c872cb +772c1eb0ca9c8535a757478b30fae38098b92d38a2972e3f765b8b302b74ead0 +b41dfd21601497bd746ebf9392bc35c358ff0debb36b6800d254a10214e0196b +eb8150a66c59e0926813c5189a777e924cb6ba0ff1c593c6405d5709e70af9aa +e553034680e3af6afca2327983165790a6be4850b378556b29f213a78ef91560 +82201faaf9cd64884a12b176e5941f4783bdd9c4ac23cd7b33aadc49d2f2ac11 +ed6b4196e3a1546f2723fa0cf4e74d51227237e5be8dbe5b61e2860100c8a212 +ae75d5fa0f3cf636ce9db565ae8503d426f7eabe413920d7a98c3fa47414ba75 +af6580df563f70c08422873e6ce8e1282a6058f87dcd2defb30e25bb3bea88ca +c4365dff510d9ea8e3c85967d70d39c035f3083c3624d7617bc5dac707f5b993 +78ccd3e91f5a94a67413515a21233f1b09a18acee0602287bd3a1031e169098c +6dda3771867c4b6035ee839a1547ac0532ddca75a8b778ae07ec9c917cfab4b0 +ff9298e54fff5c54b4ddf6e5c3c44c1cdf1acd48f7b70bf36fe1a8c675f957d8 +005836caf879933b4290dc7cae52900dd58897aee9f8d6d91270aacc08065815 +3753a34da04548780f70ba1ce29c1019f16d1193d94366b0dd071c323b4b65e8 +e0f8580ab8b9c1818fdf7b2a92a5dd7d4cdd005d5b902135f0410fee82cfe1d2 +44bcd29e599d6d5f95643bc960779083159e00905cd2fb3ac66d4bc2565c4aff +6b0ad51d1a051bf9212363f5508a98035af3c89748249af4b08253891fa1c26c +e2e47cc4c3585450162b3e94eae6efbf5314d1567e240179d642c50096fff099 +bfea2ed1d2a1aad5164ee7554deef672219fefc240f979ab9e97e746b65927d6 +ab034d96066e955a3c53b8e3f2f2271e977e6ab006293b2b3c1fd7f615eb76ee +faa64f082f68bbd8bd690d154cf62d48a7aac61f37d325295724dc0aad8edf92 +d24eac64a11d372d132434dbd70f34a67ecb0fb97dbdebae6d738446949de8a5 +de1f039f4b49c7d637acfeb002b56b1b97dc504ba5f00f18881454aae16f0793 +baf18badd0dfb6b218aacd7d1d878cd9c637729924184c546de16aa550e81741 +3218f217fd6fb7ea6145dc73ee00b0c0bc6a93123706333ff6bd82cc38aa848e +b014ed145236d5b8ef7905f9be3a98fafb89e811574779f482bb9b0cd4c8fbb3 +0f12457defd87f6576c0c37f542d5ed7dc35f09b1f382718c535893fb1c2c5d1 +989a1245e44738cf6a9c49d80158796a90e98b706b03ae10da2d58a3cb79890c +0d45d554667aaf0b110deab7535656ee3995dc28b34af6796c52dd0fd682b048 +7dc06a27282d141cc02bb880a0a87756faf56972e53257af8ae9c362121b0d93 +0b8321683cf50c57a463600936c43bfb65396235837910fcc1a0bcb79c57f721 +c3cfbfc40643583d680b3162e12794979c6c593f9c9525060cbc2b77505977c2 +a88b40bd2e25d8aba89801a09ba7aa50c401647e65c89ac200f072231039f7d1 +962b7fd0104e04636114cb84e7317310b590245703e54b37781e473265d5db82 +a19fc83b9725f1aee25ef915815b3d3399de9ece699d2c54c2a39fe2408e3f2b +84010a6ce7dc04d192ac308a3209dc0ddaee51a502f198b2f74913c2fb6cfdf1 +b39c7051b7a2b2c374cd33463d784da35f96e0298cfd1950c4f2fd7a64050e10 +98c07c3f8d4f6631b7aa1a0456825db870ccd2b8187a48dc6aca0cc86d5c1cd9 +1c062ae412283578268bb9241946644186bb61a71cb80fec8ecdbc2c1254d4f7 +cc02660552a8c46871b574714d9bfe53e7ad6315bf022fc769eee9988e7b8a06 +64d6c44e3642b9d06632ee37449b26d733f6201d862d7a4137142d7fafe95f3c +1f63107ef0d183f69922c2927c9b244ef4efb28c9b1648423d03039806ce157e +ae5bd445ca51f3eecb05f104ec9eefd3bf76a37bd23494768306f143f1170177 +2ecb2abbc0ff27ee68face57b720c0724e1afb2ad4405d35ce79fa406102cb93 +d110fe7c707781904e41a48fc4ecd9819cd5cbee4e606a88932172cbc37e1d66 +2f0f2ca2379f5c5a7f554c59ab6c151209972825a4b5fd4a20c77696427ea5ec +1d30765e4ba579742ee3c719a9d93c77908ad70394669d66321f1200679efce9 +7257b2f7c5b2a68c7d097c8fb900b415b490f386d9f6c439b3067893eaccb2a3 +c376da7e13b14bf196bc9940d0aec3d560c63b8497381bb16625ef73b1f4e71f +30fce3196c7643c0eb9683c4f311cb41f6825d736911b294117ecd759386db0b +97def1aa3a7e433b89a8d8c7d1ee8b89e6e6c8082d80e71bacab06ab48b188d8 +f27811d13c04c03967bee4322dde4b2eb76e58249a74397fcb632a3c69ca5021 +10aea31c1f57cc1c9ab15cc2c8e66ab3b9c59e23b06e08782c9217cf8f2c6459 +3b0cc08e7f6c75ee74701a47c9504d6bbf5d2b5468f7270783139ebc2c14de22 +661522d175e3a847aa72db59a991f005bc86622168bf57a3d28c2ae1cbc06ac1 +319c4b8195bb715501fbd26cae0827ff92058d7a228eec31fa0c6eb70554a256 +1fd9b21773a3f765255b6eb4d4379ab3f599c11479f5085cefd19bddbce533bb +9465f89e493a7ea66cdb039c2e85a0fd0aff5d7dd8f4fa0f618e248c837567a0 +9b72aadb2bf3ff6b9d4307e88c206ba9b75e0ac844848b5fd2a08d5f7c1848b6 +6e49bf533c94346902eae08ac41aba2836bec511d8bcac30986a18a8405c72cd +0f189c2ccbfce5dbbd09070f0f916ef76683855fed5982bf9b1760420eb45765 +994e8da3f7033a5963c244439a7ac157219fe0a7ccee82804f641591e6b66fe0 +2b0d55bf5f704a04dabc1d5bf63739e6cdff39415a5fc216a55479fa8e7e2647 +643e302eb4205dfed647b3b8b47ef2616df65784347d5677b52e9abc82c18666 +0b786335ac635e573aeffcf8224205d947b0ea67b353640237a63bd73510f828 +3816c87d8f12be5f998b727ae398e1fb4e46e7cabe627d8f6ed455edaff7d8e1 +05dc0203e7c407dc05aaf9b9df596313630f683d408400c6b41ea1b7e05c8471 +a22d583135a9df1ae41b0a2ccb4a739c2844730893585ea7586c580a0f66eb87 +7066491a6835c2b3141fc1dc23e1bb1d5427860a996ebf4efd3c092edc54710a +ec4da96ba61f0eaf6f0d5d9680bdeba2b6c5fe6d71c3ca7a425622135634cc68 +7aab3e9ca2bbe997e074d251c1e8daa885aad2c9322e6cc85031f9e205baf648 +d257f38b320a958e202ccad9dddeda59a8c0e4939aee0ee7fe1daa0acbeed8ee +111214437e6695f25b52f1386ed2b5904b2cfa095a8ee8f0ac2707239091fdf5 +ddada518e04bb44580ee924a8c38d681aa160378fc3c76290b21a9cc03f1850a +6a277de7ff51614e67043cbeebfbc2a473993b91bc7b31150ac22fecdc99dccf +eba2d8ecdf38f46dead509b780ebe45bd0879b68d9052fcd50e431f299412272 +79afa25fde7a63961c924ff02b0990b938e96683f82537c0073e42e58a49690f +369813992dc8049111536a76e1d1db712fbe9a9d353793e4b1e31b4e6c836a96 +e542d207c6987dea794d9fb2c23ce8d1cd9d1dc6b13222963320c0f3c5053323 +37744b297e3c1eadcee45dd8a0b62bafb7f6bf33c628e20f40c4aad75f19cc91 +c5832cc45aa9978c087ee415be15681e3abba579d8bf1f33c1208068a8150bd0 +deb3ce69a7cf00852a436a71f9c5065a3b262238910bb60fe4d08a6c74873628 +697c148fe67f1a59cc1e4f9d18d862fdd6bbffe395d9ac79686ecaf001cd9068 +2f6a838feed75ebcf706f01577fee2a437cf11cb392881cd9108223d71a95edf +ae83dea1f6bd87dd0240edeae67c7ee6ca99b569d15deb7cb52a2c768882fcd9 +846359dc48a34f9c93cf5058d60342b01feac20aaa60ec0973dc5e3af0198a84 +052c2beb9c53e6ac865ba4567e42dbdc69e888f6c1ab4eb7b547a41141578c9e +75647ad89fdc7c31b34a9ca6aeb332b3e6942b3c41775307a59a86275289dc84 +9430fc23784b0cac2a581e4389b16d17d83d685822d09e47113c3c03c45b90a8 +5de29e346636f864801b043d1a1bedbcc0c610144a6900d28ddeafd5533b5ffa +79058fa4ff48ce1c7c7ff32024f4e7aad75032ebf0b125466356f95158194a5f +5750c3022797f5d91e6ba6648c62b7e754fbd6a74b82f9671234020b78689f47 +638850f2e1a57bd3441c51716b6cea8d53a422ad81d7f35014709d2c960a6697 +0d7d8c00b63d97bf188004d78ba34a6f60309bea91c077335e09f72bfb662340 +156cee8710af1551e940719cf9f22d9a0ff51a0981301c4f1435450a0c9c16e0 +de8d669b759bf6796e6653a07b305df4c93e62dfb869c5c4439c79e1011f3676 +c8b71f6c0900ec9f5acaa83b12163a912b0448ac5adb76e29dee0ba832938f52 +895f878fce7bf9d3bdb7b16e41504dc90df6abbc31f2b9f50cf7edb363998de7 +3d77e142281b2d02067bef95da5e7429d4d16f41cfd94f76b139baa0b96576dc +08e6e8d6bef850f2c530003efa2a12fc493f1432ca635512bee93893be90dce9 +6c65ba7c3472585bf1d37e6c3eba0b9bc34a438fad5ea0799c1bdc674951fcbf +b5635d169110a70d9034cd19be6d7ee95a06e542968c21cd5427c8ace58f52cd +8769ad774a2e46c8e0d8ea342fc39c683072bb821fda38c1e3fe34bbb209eb21 +e4d9f44ff3b252dc0df3361cfd671749023b1504e167a3e72c2f38bf20ff58ee +ecc0bf2ffce73d51cc8ee71a43afaa6b5b91c8b27218f3287595ef75eb8c184d +5386918ac83903ff8eac18e55ef730abf6262f36b7e3a58a25ba0219cff270cf +eba11d973e4ac3b3f76a1cb0f6a3cbb03a8c17c92b89087347ec273db0035838 +7398603c291847da22ea02cd85cc438a9bf69cad8e6e1d44898d927d9e10eec4 +209c642383c700e644c9240259ca6ef8eef9c9a33337ca0f866850851e3e62be +aea1357ced843cca5d5494d30917b78454c78387b15185748a852a91f6f9a981 +c7de39732653ae16f28b7cc2d8feac6da414de43621608e2fd7b2855de0975ed +3e7ac410e6eedf48165310e4fb817a02800b9ce0be655e035174abfc073064af +0b999221ab0e169b1afca5642e139f482771e4fd1fca9c2c197c0262094e6a71 +a37ac0c0970d89e7220a1ef66bef84c959f444a0a7bd666935970748c0bd4670 +604614d617e8c54edcd7c0ed73912cc074629d0fdbef9fb6529b82385adc3cde +b0107b8b2ce9ac4c8b482ad14853f78be96e7b99c8c70ad7a0ebe802bdeeff5d +b2ed7e836651db037f2c345f63285157ddf3238fa19130790e7a603afdc693e6 +ef58cb564a063050abf1d44ab800d754d354256802068f0062ee06952e95904c +f3e456831a6c58214f9f48c507777e847a5408e7f1a4eb890dc97503718267b1 +45125ba0e28636d20caf4baaecc17c5545f1b11c73dcf7d1627b3abf6933ca21 +8db138a9dbd295818cce7b4931751c8eacffdf7110d9a37241b12b8906b6bd69 +6a8841a83b3ee2b85752e4cf927751c6cfdf7a7138a4aa5811a1c858e4b555c4 +05833d5ec60d25920de78fb347af37b50f1c3b2f7e087d059406f81ebce8746b +8ac13758aaac6ec1cedbac0477927a5bce0564c1517f6a20f140a868f1624e2b +20332bbb61fa5dca68c18a20bf9d1397cc0e991747ebecf1f6305c33aed5055b +bd1bfcf15007ecb49b61334d1e2d38e5ef24339fe6d66948846a55a88296d2cb +12f47df17c72af4370565e1f73a449a9b0d26c39eea04125fb9192141265a122 +449ff568a1f3654585dce47622ca0bac147715cb7a1275d02c1d083aad411878 +be64dc4da6ef276ea20697436faa00de144b11d2145a0a0280041e0618ceac52 +5039839261ee468bd1ab9a22a098f195d3853155740005473b0ed526751ad4d0 +d671313593340b36dac33b54bf78cc87256c6930a765f2fd927a3582343bc8f5 +8ec18900b67abd359ce7ef7eca1f1f9411943e057872f3386357300957e9e75a +314835045839468e1e5d41b890f7f83255c3584ecd26e2971367aeaa1d3cd22f +22121826d56aff35e356dab010747c2f46d46629a951159b6b69117fd548614f +ec9e7d0a917402628829460cdb6bc8ce3f93f96837c594eb29c63500866d9ddb +fe78d09876d3d2f8327c3318f96a1327691195afe12065448493411832ca1a1f +3b0d4a9593625d8da1b359398827da68a7824255446e6342364db03dff29c917 +e44486cef063382245d06d9fd5a36a5ef79a08f36a66409a2f63e9235a12fe2c +bc9bca58381b4d9cc7a6d79caad7d1b00cc6520836cf3794901295935bec1975 +8f473e0147da152eb2127f1d9da2500fc70be6811dad855d3a00ec44496a4338 +f89664ef47b5ae81fd8ac944448d1908345f3f0b448a028cae01e0e6c7c12e18 +30299a40196e5de461d5184efe63a568faffcf7c4272a37b8af0fd106dc94e7a +9a55c62a4ef9b8d29b5d85fd0e596bbb228fc20a84641700ab85b33fd420163a +deacc45055ffae165c50473f13119d6ce2d5ee143c52ce41260a22059b106529 +b87a8cc28917a38d5aa18029a96b3e095ef78730f4332c4f59eb02e686be85e0 +ddb57200449614b8209fdadf7ca82f4e8051a7baa6501270a3d1f00d99d552b6 +316010b7a51c23709b23849156adedc38379fe4be0ee796986674e2a73e34c7b +195eb533fd924a2cdf6e73c1a02de2b3e0ce5ff89ab08383fe39d880d4dee544 +3dbddad4fd25d3881d8d5fb4422635e72a9c237249ccca7f926e728de0d293f8 +f5fff6b9f13ff9343df8a1bc3663d7786cb6d520b2a81874a17ea112e5b8dc0a +b3b81ad49837767e7879ee03a82e7822c57e265be60d0f6b2789a3059b673da7 +5da7157f777cfdcd9f5c004ada55d8852952d8364c696e762dd8f449783f9290 +6b8f1c9817f5b3564c1fbd5f2ce6bdba25bad8a38b29dcc26938a7285577c391 +7b972d3fa1738737089433fedc6b6c11f2d9eac832727abff83342cd4f99e14d +25e7463585c1be15989a0a0bb377ac009fd8ca8a5172903fa64566b06e2003da +dafdd852a6937f9522a23711964b30d4fdbcff209d824491c0d0d46e22bde4b9 +4e33758ba1c3df8429ff69142e39d447d54caedd9e65ccd5a92015e979871f0b +9d88029dfb4c74f286d7711a1dfb1c40fc3b697f3fc8feb4ca281b0027d8988e +841a4a6ae8660c7c54d335322587693ba4fca91e55df91006a7626cfe30d331e +5b518d2110e317d71461d12d8a908028c0030dea4fe6ab488f213fbcb97dc979 +4a844abe241435ca55616ae41715df1eb11558fdf3a39e7b854ca99d1535bc87 +98ffe95ff41816bf1d903fd839badcc7ef963f825c7c18079fb521c2c0f2405d +397972e2038be57a51af173480e23b8b0959573029c386fbef6c0bf83a8ecf1c +f3d6e1f174fecc45ca6caab7c90211013b552c6f7aaf3e837a02a2c2be6b4cae +fd267fdc0c24da26d5ce30388a69280465886121614b029130325aefb656f38f +5b56a08c2c379a8dbaccfebdd2d3e5217f75db4d7b0cfb8952aa192248e4bad2 +545fd3cec2c0cabb48f25817a4dbb1b9a0733f0a220ce533665abddd39a39eee +9f4784cb26411c7862c644191fe63fa81dd9c69fb2c2f32d519ff145e5ff4ab6 +88a996b4e43c5289274aa0ce8b67bb95b9bd6ca6ba4e86505dea9dfa153e58fb +ce3acb84b1d5b156ffc84eb9ed8d86f5dd8db7ea1a44a70feff4d03541199760 +0246a0071be64ead64a82f6f370a4f9d39555622e8bc09f4360aac8442c64959 +544189deeea7d78b62953fc6c1813c23f77c72761e56ee70ecc3f07bf4b5ee44 +ed0a6a7dcd4dcebca9925d39d190cf815b0585c1dda5897842e7dbd44b9a93ca +9afb0344416c7e12f6a69bb9ec3a0a5ccd176839b24cf375c7b5aa63fb020ef3 +86d1a5467f5be498dd3dfc7041627ffc4b9ec0ae397c001a3f7703ca4ec8d27e +ea5c798083c4756cd0d4dbfae4eb389026f97ba04094c0ed317efca15ada576e +5315be4d6b84e91b8fc41b4ca765c508db57265a76dfed2ba23f2005ee3e1666 +f0f0ac085e4151f698661c4a69bea8061ea0d86db942164e18f51802ba4a4cc6 +2646865602d3d5bfab3dfd4a13d9127075dada545d9254dd39cad08661ee1891 +40da958aa1d7f9ffbc5d2bc6f8c13a54a4137bee3472955875df9643c71aaf89 +cc4d0b34313ad78fb100347e9a6ba236bffda2c9120f728f7f9dc24475885a7c +6d647b40e380ff8772532f649a0a8af8d5d577a75548cc53bd93b2d94975bd82 +6058f644a247ddb8af1bf9169b39afa10d810842992d9503e869439b08958f75 +f255cf86e4943cca9ff8190955c4bbe52a22db1d33b38a8ceb231f25fe67d7d7 +1451d378083f32232c5f1f46a654d87705fe42be37f24130ddffc294ffa72d63 +3bf863e3668310562dcf82853af99ab19d16e015a5c52f718dbf998e20316811 +988fbd4e96bb4532e180f9f76e7089f7d15ad1530ab7e3b6a833c4ff4ac9a86d +41c91a98c6f20c27d816b5cd07924e3dc3528f7cb3922500189f429ca8568af1 +fe89130ebd9c11860be49ad45643ec0d18993fdc9b0e50a166ff04b409a9bc3d +99215881c09d26949749cf7ca37b0b89457d3b392cb44aab689fd25ba7b5bad7 +06257de81cb1c50d2b283726b050d1ae03fa491189c8b9fc1b22b373dd70e86b +1d40de563ed4a3a80579255ef9dcddd6853c8a757957ce2907a0cec4e94fc5a5 +9641afbd3cde23d6a31dc99bf9180c35393e8e6fa092f5e0a5e215c618a6eb9d +421d9eb8087fc539daf2b707856d59c049b650c264105d2eaf3c5c383b8c9665 +7a53e3aca0f93395f70a078369facc3cfcc8b17367e6d88887b4297644309b12 +8f4116185b756509d9df731553beb42e51e78953a7d9fb81f5dc3a149de0adde +c7f7f517410f474c218cda7880bb53eb0b27d0e3903e1d50d641aaf4c510e03a +4a0862d2205572130f86502a4fac7ba66e5ded860eb07cfc0d90e908eb7c74b1 +334d1783a3111f249055e620b622a4600224a38ef5ce99fa6689aa9fdd5fa97a +f90e3c3d0b44a0090b840404686ad0825117bf9fa688c989597039238cb3bbec +a709d680b9277d87eeffffbc5c21e8b667f1c3830c6feec3046e70b3f46431e8 +0fd084aa78463ecb7e4dcc7b73c046236372f8701397244950dfded1274ef63a +74b45676af1f34b40a82def94255003583bb3845e92f656d0c553155016ad73c +21c9b41d25876b01e1592384222e6c8af08f3bce00c1785aaeaff39fac59771f +858c044ba0a298866bcd42fa82d6e2b1d947d922597892eb38dc8bf3cea0b556 +80d643f58644c80d55b64ed144a03f6a9b2b5471c685c8656f3c19756adbe22b +be33a8f9b37e9b3bcb84c13171abc2acfd73fe7f20a8f6ece9ad9de3c8a08e75 +670425356ddca1f26aa9afc9f31de830373c71213d2b84c29fe667ab899df5fb +9f0b5102556158112a095ba239a299b20056c981c17f2c06614a1a0862f084bb +f420bd958d1d458169124d68c5299d9b35464588e192386347aece5e2a48ba84 +43213219c87812647a9410d34cca55a0a62bbab770ca79b6959dead30f6b5451 +8a20a077406e39d2d126b7e13375104a1ed7239b95a9443b95dc24079d0f149b +08123838d5c21cb3e8d9fe656c5736306bdd4bb5c88393610947253ad725952e +7d9b776ebcb6617e74de8e9c62dae3e081078a04c492c4a35f303e0f600d7d34 +eb629dee4f5531f86916dfbbdd1fb9f6b1e385afd3dae0cb6c15f45ee49911ef +2a8e2ddc4c5e1570f512303d94907fd941bd7f7a053a42f990e7f25fb6f8d1ed +e7d401ea0e4d3405ef89d47416aa7d24dee907fcdd88cb2ab09ef07261f45f78 +733903e89215d7acd1df74ba26056f5c7d3d0ac61d2718d984c022179c98c658 +4405af27a3c9863f1c8278dbde150addbdd057d5e11587ca2ba42c1e6b422932 +6bd7314e190103af64a33794b3ed12d8023483e8d17ee4f8c0bbef5c9b78e2e4 +f350c487df51e966f985b5ee5da43991da55362f6326324c77ae53d320326ff6 +202a089c8d8aa68c588ad9c82768c1f889615ec5b6ac79f75d95641a500a499f +1b57a6758c9da836b7124af1d37ee04cf01478edecc008521831381f6225f593 +f371fd87ec832bc3bd853d579a20244c3030b0eb0db3191d900b654f1067b0e2 +d2a07232d032b264aeab347be9abd0d2a07b6caf85ecd57ec87ee34ea40733e0 +94dc88246eb7fe89c751326de8c008fd1b55e2cb07f3b6a08f7a0041540c7d68 +fbc4ece7a2d0184629adc0cfa77ac198901aa5a1479f1dc97a0b3ab87458e1fa +4704290fc5a744412454a2d3677d9d7565a97eee239a5c5f7eb94793899cfcd7 +2566835d9998e772fb3afd9673b3c74f4bbd339095f2f71c93458484bafe9741 +a1a65b3e15ca5045fbdfabec1723ebbd4e7ab85cdac37df2141af2095e0e16ec +bad6fe620d2e1b874c4e3bdc34f656e9604c6e33cfab4438324b8958c8a7528a +4404b2b8aec31bb0420887f4a6f3c3866e370b1466526937851f6851865b23f0 +0245a38682f68990351c12f34e63aa96d729828bab71327b29eb1a96f30c36f7 +65d4cfbe0769864f4a46f037d2798279f914b8b2ae86acf94385c79db5095b86 +d684a976dc1e662c6e02ce94e69fd20a9960c304626aba2a113766c5923dd7fd +fccbb999567520ff855248bf8377f01ef9dbd6ed1511581b3468d11e73ec622f +6dfc289cc17026fb10143d870b68e32e6f84d19567e177fd4a48a6f003591c1a +83fcd03148ba9f32e6ea26fb33e2b7626620acdca5b302caf98dc6cbe8f93d09 +a877d7cca4d52d75f4f39ce9a17aba04fea7707c097f5a8c50657ade42c5adc0 +76d6ecd980b068651e8d4c630827e0226343c57b39d782faa3f9004585cba68c +ece0430f332e4501d2ca668145020181263aec4a988db312995df391c9638619 +6ee6d1810a9731cdba8632772f844feb41e34e7d046c13f3346b1b4af62f6f8e +da0026e5b306830c0aaea5f3b91eadc7ff9108008fc1081e0371b08fea45ad38 +ea17df8a9d1b7194f1ae2819a2c1fc1b46fd054f5b98b84e4b221a7c50ccf1ba +c995d85664cf8646e2e5880d847f532736d4de8c9fdc2f91be71d89b062d2246 +ceeab03bfa0f8e5e3ca581e958a8ccea868216178925614309f2ccb1616c44b1 +bf772125753fae57762c8a617e6da4d716aa20a762316bd91bdd080a30cd8751 +7462a59f7a90200980e620811ae9cdb8903887effe20061f3558ab479f365a06 +2a8cb74720631f690dea945f6149a4e010e73ec5937c180fd71e68fdd9f4b101 +0ef804407a9b2a375a5d742ca4126b102496c02a6f0630a4ee91089a2beef12b +97f7a7ccf7c2c751aee789ea80cb91291eb2dfc2855fd792bc858a9a0df22e09 +19f5158f584771d9446bfd864fba50582ed52644eb80cbc73b37fe9f8e4f8ca8 +de234351e56df85ea853fc6bd27f5b4f0c1d45cab7dc0aaba49585f3d2e1086c +1f002a8a6585816270be2953a6e6bbe0accd129e201423582909b00d7bb2c73f +c2296a4769da723f979915a82363a457b814d97a2315dc448d3017681175b6d9 +2184936f9784d753644575d5ce4f499047871e30c84263722460ade708d0c2ba +e7998af8194e6d041ceccf6c7ed6d937322b860081a165bf69be1b47490453ff +0e2aa9f0c08c1856c53015152850b8cba83cb82ac6d21730ac9e00919e78f994 +0a14c2be0065b65351a4d130612afe42c09567c277dafd4e74bfef17c252ba7a +e0e8480f0e184c93e34552d4fffa5e427fde368d6b1583581858081613e9074b +a2d0ebc6965254a4d5dce59ca92a857873bda1575899839af87f456faba850e9 +16d06d3df6931f04330fb719a8cc91ecd28821bed1e993863cf9ea95d9e03c7c +b67490ae6a05e0ca47da8d6d7777ff553477a949fb16864ed0ced4613dcd5e73 +5517d0eeb3b86b5892efd3f91b7a1d9eb11ab7bb7feb32f54a1e63788f3a4854 +a4e16f8e81459838f341e5d288d25ec470c18c29f8e5d449bdd29e40244332a0 +4ad3233d92beb334520f1285aa1b11d8f844d33ffb74edeb98de1923c0ac07f1 +92b887d19a423ffdb409def765678047b774d040f771a6b7b675814b63011cf5 +0584368a865b6cfcb4b124d79d7283df63d601795bf5ef80b747d3dc23276610 +46cc26d90ecb0f3261d1750958bf19925e4962cd95d10824a47cf1406e8881ed +1bc5dee966ebb033a5af7a74d7183117b380fb848d4d5890faf6691e9bc3d0b8 +ee3edef892a29942544e1cc7bc2017ce7642c6eef265c916a011c4dc8fe47b45 +3e338d4655572c220bb50a1a05df970834ac6d0b91a86cc416eec40de3cf50c7 +0caa0b554698fae5fc76e5073a9ef47b6d739a8ee52758b82811811e32aff60d +d474cfeb8ddaf5cd242c7a8e7747602aaad0de7f1124194eb3e30c060d3476fb +43d520389df0b15c44007dc97245ca41f3e5b8fe0b283a1e238b57774472b73a +da0ad5b739c912e42864f1ca568e7f8b3c7525ab752db196b35937a509e24596 +73ebd59d66a82daefc60b87f8e21a2bc4e85a5bb2f858a5cba43eb83f54bbcf8 +d85731024babb818063e68ebb3a7e0978b45fd02b7f3734777683cda727312ac +b54f2606bebfe66499dbd8738fcad5b26e749a8806b7116ba138442bb85f55fd +49049434878537165f2c573241b1c1a56a0f961cfb5a269556f3eabcb41b09bf +0966d4cb4a0f3682c212e251310347a2b6bbb258f346d71dc4de399a4bc5529a +dabbe008d511ede8a302a407c7a4095739c505f1fa1f7a51de21b542f23d5287 +2e8ed319d7e867282a407ab35b5ebbc72d96a4cc6d6cf8322d92a82c5ce488e6 +f7a90ca6f5f9b9972e29526031f9d5ff881bf951e0aa40c6b05d8651385c7eea +48ca375b3f06732322f3259a5f92206755336a2579040d6768c85c4ca0afc4e1 +d28eab5d5f1ddb7d5d4f1a3b3b2b01cae132f4c0731e44f103abd7cdcd0d61d0 +8fccabb2471b66249c4ffc31711013cda5de95918cc50daec85398288439c7e1 +9a2196bc68ad745adc5fd398c3189c574380df2c2e4486a40817c23a81f3f316 +26825bef951991a1208cdb551d300ed38886ae677713f4b9d4092c9e9c76e5ea +22f1ec6be10e62200f4f9f591fa0255f249739dc710de9addaa9d34ee904641c +9bcbe6e79a6e4484fc6d0086ec2afa5b8b1926df580af637e73bf126680f9e49 +6e5bb8c21d6a428e77521156f78430ed51dc2e33284f88d78ce909fb940ceaae +0a07dda0d9739b8a3d2a304c2d9f8cb443d4d4d6fc3047842cda21c0b0073e0b +b52f5e1b7ddc2048fa9f67486e2496e0fd2d09ce80730d5f7d0f7e0ed91b6bf1 +87683b6f62f263c10b36b01ffe6fb601327450cd5a4cd8ef322277f942bb2567 +0b358456c29fe2f529d334d5db6245c1e8336b29af092689764cb1a19276d9e3 +2b4b77f0a1c3313421c89801f2c2ef5f75169fc2b3a98b69519c9a7c46b40148 +d474e7a98f7fa7cdb85c471fb1171da6de14027baf64315142b75f677ce7a413 +6466f817519848f9b9aad66b34e3be10e7fafc53571da25ea3b449d7929ec079 +bb4c3f6d513b9174a49bf5500a5272fba2d95362a562339eef996944951e61b7 +38beece89882bbc5580b7622f84adcd3b460828aada98e5cf6789dae52a41ecd +7ab5fcd2dfe6aa11cfe66d6366672c46ef3140f2e0657da447a4dc2f855895ac +b5a79d11a9e45aa7a457c11b4df4ad291f25a925e4a01dc7a64f848c64f2a739 +bffb51c2531e6717dea38da478ce0c932a3f9f856cbd2aaa1e148a0692a92642 +9d77254e7adf8aecd46a8626b7a31442e2046b9532817d285469f59d971bd398 +b6971a38e6d44f31cc46e3f48f10722641905d7ce093f5ae90fc6a56e53ac90f +7f1cdf1ddcac29bc60d3202de837fc9d659e30cfd707ceb5453028d1199a8a6d +87af5bab407c0a78c571e01020560bf1c77936521405c28cf79514579b017733 +70470f68de4e7667237065ece8e2e9bfe2b5d3df69a0bfd8b17ffb8254aac5f1 +d7a8c51d3f93947f7779f368c71c343159eac60c5a671f81cbf2ba05626f91d2 +aa7887e41804f5961b341a5d06b849cb52676311c81739a96d5da0d480cab2a8 +ecdfe115dab597f553767e59cf392a536dcc9d52ce25c424a9b840fbe6413361 +ef591c196e6fd7954ddfa457e7cbb9d5fc00c45d1ea21184f29291c54c353ffe +59d19239224f9de9f6595d5fb5279fd19278e93b366cefa22b41750cbf2e03bd +7b8bec58170e6d3c276f8dd4ccc99885a5582ba4ed5253a17910580a7195d775 +6e10c5608e2499df08572d1fcc0ea139beb4f0bffa5e18f7c1c17ecd20a9e400 +95e2d469da5d9403dbf146aab0a04ced94b508bed89375c6253424f6fcb2afc2 +a8019b6fc866646c1b54c32858992abf31da24399f89ead105a4056526d52965 +289830fb4bac1b0cb6a629104dfccae1a688563a271da0927cf2a644274d2a3f +f90e5c1845205ff935fce3a7633cb8f14e01167b6a0368d2a2e8f072c1bbc6a7 +d6f441ab6d23cb3111d8ca1634cd58dfb4d704c5aac7dc2df32ef43c0fc490bf +86592326f415cb9c543563e6c2204aa0e58eb42163bd9d7209899abe51946f7e +7505e6491711e10d5d125fad62e34fd2e08a0ed0028fb0234768f7948ba2626e +d037619703b922ef43225732aa509b580e92bf5adb3979bd8489d5a50a132b7a +685b271c2facb092739061b8ff4f49b2253db3e10839827fc99498d5a44a5806 +8d9962908f92343b87f44a8bb92fe1830c362d29f990e861461210113ff1ab0a +55436ddc38db4bf16131d9d96784f3165fcd0058401dbec514749dad00b6af4f +73afb28ba5b5ff1a023cb318fce617f5f55eeb0bab7c5bf819edf6a7f81d38a5 +d75355916dcce33cf2b8e771f9730b385c646555b1137e9416c70d5f860a6138 +7d131a9d8acdbe4663772c07722c4e4bc85451fefd08dfccaba1c8f3c251cd09 +3fa5a333877d32ff4d2ce359e6aa47dac276bce065cbb7b50c0e3add00f41c6d +be9778dc241411d1f9e934be7934c6506686ce7c8d619490f2a3f065ca6f213d +9b173efd5541375438e9c6e58d664e8a61aa1f646be623688b1934fbad34b627 +2e1e5614345e8e42ef1456785fd526f21078798a49b61c106e23678f1f593c0e +1ee8c5561147fa5bf38847b982228952ca06cf4549e210ddb6e37cc2921f98dc +162b175bcddbd5b8ad6c58d59ec66c5e118d919ea48e81cde2c17149ab133d78 +e1f45f4c5d931f09526310f2bd8f0233fed3a6a64be805d626115b35b0b5b39e +9cda7b197fec956504ccd72b71a29e9526a544957068c9b7ed6fe04255444d01 +2ecb4f59707fb4cc4a1636c37f9b94d0eec7fc12b70a3e88c7325c5524a5fdae +bc4307a8ee518fb10801bb3ba4e17a2931b5596155171765fcca938fffb35693 +82e0b69a88235c65631e4072e3fff4b3f00a06624db945db691e97986357a509 +5410d64bac2774999f960f332c9050bee455f229061ed099eae00dfc3fb9724d +ac85ac49b79a19410649f06099df677b8d0b39c4c7dc52e0aeb1d35baab7319c +f16795131e2a6d83b4f30fa42d7057ff9030c348327c91f1a780209ae58ebbe4 +188d8ef5e354491d38bfaa4626736cce69132d6b1e71f0962644dc09ad793dbb +368a8e4cffc7a8cb1697ea1b85f5eb9a831458c968ed6b860c344b928d182afb +677a88a431acf29e76053bd900e3fcafe19cf96146b492cb0b046fc4388c326e +1f5ba7f4f9b738c11af96f86cab033b8212716766c1d64675a52c304be62b163 +fa483e426fa8a8066bf82180f77909029eb1063b861ff73dffe14fbf7a25cd7d +73a33d520f6349b76459f83ba004fb60e3dc4e50b4306fdb870f29cd7044d6cb +20d345621ec5ea26ae9ea8e66dd198087e51e8ee972f6435b82f635c83fb4d95 +585e1f88829beeca19a6ea42157c10f703ae52b0c0df309a4634314327ee3ece +2ce41c7dd423345ee25bb7f64f5b300002e11463baf80547ecadebca51b18156 +09c7e479883cd404756e73cc8411dff1dad55e88757314f155bf1eedfa94d1c8 +7806e41cbc3d89eec743c50aee90d6b69bea9de11684c85ea5d0a64cff534085 +f180ce75bd623afe1e08ff4fc4902d88f769e1b3221831f7559867e35137fba3 +773f7bf4977cc27997b9da44e1799353cdd563c88d067b13279752179752ad5a +68f300640de27cf42c42c5e235f5d7d8b345ccd63bee391206499bee8304ea0a +591ff1b118171c51ba62ececf66006f78d1c56415178b9c144ac2e83457126c0 +cc7266234abbc4c1ff4ee17fc352e9bc830aba16351a937cf1304173f0aa12a9 +f79575ba5e45e6c14b93d7a34001b29df1ceb73cae7fca7f34078f99a72357a5 +c7b040f377b8dbe90bdcced28f5363526bf14f0ecf89c919d53f4c3653528b79 +8dfc4b4244f2d9747e09ce16fba69911dad746356ab3f2db59e871b21b10939e +ec4fe4d11b49055c5cdf81f37a0484978dd312eccd5e95d5ef7ba378196396b6 +cc3b51de1e27035f62fab5d507b5a95493e2ae54a6b600d1727db436933ec9f1 +1f01d50b0c645e8dfa94f43b15c47b2348c3c387010989bc4d0f7401a024d351 +0914708a6015b66af6f255efc2b86a535806de1fa9520889f566d000bd185ee0 +9dc171fe42079ac3c342ba13607bced1ecb521827c465f83ffd8d45d50a69a34 +8b1f0d3a524776641483ece863bc262f470c3e603b380c92dc8e5e4319428fa0 +a5a8cad19c001868977d6c36c49eec7a4e3068507b075b8071ac787db8a6d3a4 +3b290f01b24b0fce5c77ada9b89704a5fd3de6f5e8eabbc2c51daf3727b9474b +8e2f4aecd0433e0ffd20671d68f64254db38847ecaa7b118bdf0ba25de5c45c5 +1815d08c82c6ba3dee113d34a1fde725ba8aa8fc05c607487b703c1ef2ab05e5 +575602cc6558f7620e43450f7f508e029693498e2728e4b62571e36e02360964 +62a9579264eb4baf12402284f0bf498d116da62e81d6d3b11c5fd8b0231d3c5d +009a3b0a5506f2c5ff195923a8dbf04768655e63b48d22ebeb97f8e416925e76 +3bda061a1593c0233ac9c058b5ff5b6f483cbbaa4bac15d89f3093909a4d50e8 +a1f61bb76007205d4abd546628cb3d17202cad80f851ee95567cb313e3155258 +23459f6c8b3f02f7e1cdd1499eb58c0128b83c9086eef4e1479a915e75e06905 +f08ba8678f8ba2dda7a15a5461568c2a44e100e078fb41b49bf2e34a35774c59 +cbc642f03830c29c73c8c8334f7f0b8ae263235dd2acf4325973ae353194c10b +a4d017e0d61602715e8a7a3fc90adb659da741a39b2dedb707d5446cf0a12997 +f5df3044fffb50bc9b40c0f551ca4f7b012bfb033e6324dd071372e93cef41b3 +8e29dc94fb145e8c080ca7e606dbca4b292ae98bdee61041e733140c638de3d5 +2e49482c182b75d5d1ea2a27cd8c40926b7aec98d97d80547fe840d1ce753797 +e8f903f0c59f5390823e6a15941a55af60a6b0f82423ca76acb3b0e27bf4998c +2d35e08c4bd4534f0b43facc2b994775ab7c84903605358015445ab8649c8213 +8b1ef913b3c9a3d46d4d9c863c07ea43ef77f04fa4c91f238a5ddbed49629e62 +a4c84190f9ff58575dcf46392c0db97a225d99dc1e7ace1376ac9f20ceae14c1 +8372673772db403747b6067992238fcd257cdc9961f30cea0bc096c77936bc96 +51e8529f52175ddbfce202f38ef4bad1e437fa76c8801b7569c347cc9497bdfb +d693d6f46e66aeeeee2f2b0d4d1784234064ff0f63a730d0c0c80669ec5b7ad2 +3e68a361a69b4de9663426606cecfd2b13171f3e1f8d278240803a0f9aa067e7 +24170d8ad2f4850e1cbf01f0460561a2d06b32c891f15727fb139ed20fe35875 +b04b174e9292b2be4f30f2fb783c2e35f6a47e5626ec3539c0ca7c78a8c65fad +8255c95360855297e5baa060b4d0821ba56c95db62f42d5aafe040ab927d6e6b +a50de0a1fe6c404bc445cd13d1ef1f6f9ac1591d174687f4d5e4b80f8c57f1ee +e2ca56e6b71ee222fc3b75d9c8275b5ae804c530bcbaf814543b53b3cc333184 +f259717a387c6517e31cdff3742506dd3fdfac9e86a00d15ab09c2f381029609 +d34f14fd5a799f1460472115d8452882d250b72325f273261ee8cbd06dccd1e9 +88aa035ba584ef6062046704f0ce3b19eebb71ec933a174be1087f7e763e13c4 +fcd95a51745025643ba2ec4ebf6e7d08cc2661b38bdd189b68d4f5057cc1afec +bd5920178b7ec3bf3073716bbefbc0fb0fff6dd56b32995245eaab7d686d61ce +cf8d35d7ced60e1d8583a27803cc31eac0dba9dd35ac730304c057bc81ecd5b9 +9a7eba791852d17300c6253de776cc756614eea68c940d787656887930b9c38b +74ebcd963254a3a116f15fd5e0568deb54dd076760fefc82e43ab8caf157f2a1 +0934ab492ba04b727b4a12380d8620ecb36b234ec23ea06e1c01b0ba6172c505 +b5fdfc5e1808c9050c8a9835859d97e4c626d48a3a26e077b86970a4a4f1f924 +2e056404c1c3c750c7e6de295c6b9eee36f1ebf4b7813d335144884068f1d8e8 +adb020e3f5971f627fe12b6c4d39e56be8cfc9855ac76493ed4994e9be17c9cc +3464585754dddb9e577dcda000fee128090977165fb6bec6e90827bf7902a887 +ae02126496ffb08eb85095cdb4e5cf63afde1a5a5948793b163feffd60cfb9f8 +428ecf3bb84679c18356122b74ae5efd381d63e496750bbd3f294c55c4306df8 +4c4c5bc4d7e7aadd52704b1cc066bdff579ad4aa3dda718db17819884ff48c16 +18a6fc03cf9954436d24005f7d0975d8aa864660aa30d3bb3ca001ace7b6a0b8 +f115b6fe459915616304ec5fbdfccb656da02cae21b5802a9dcf20ae0e06c5cd +fe92aa4bf2be74a17f7f8f2b338d3a53600248bd394982f97239089f5b7c6c8e +de8339b8d17adf2ce3cbefccd4e6a6daf5d4881131330c1eb4c0ade5276dd50f +2b0b4fc97ff5b6c887fe7bf378f58e5dce3d85b98a4a9fa335438158ee3cf58a +f17b2a4553afa66043e146652c23a69e6f6f747ea368637d4e1003b4251a43ff +71c4b12f7e2dd6848cb84316b9ccdb4fb282615f89384717a5016a0660adfca4 +7e9545b2182f553d14660f38ea41d327250ee94d9d1a23d0b395303295a6de00 +312ff97e49ccdde1359cf3d098e7ec51df6e7487b4f9b94a69330ec7885a90a7 +b294a8e5ef7e99aaca70ef8531bb8951fa70d28f8e94216ae8c54d03d5fb5766 +b08a89c1786affcc5b771581ba4ca4040bdcb201262985482c346fb3a00b5a38 +332ba95e627431fbcd2811018044d8fd34192c775a0025868c41c34619cdc4c3 +e07c62ff21e9b53ad927b473643185eff0e0af5dbba7a79cf8b2cce506c0f18e +a3f8e23a4eff5c581bcbc6dddf0442780c00346859988f464557207c2f3d79ae +830f86148daa52cad0fd0e768fdfddb665f046960da31f389460790c645fc65f +ae80feb3ac5e96c07267175b41d80b79f8bf05eb5905aa917dd65a95b3b90b62 +5e692400b6bcba9c60df3de780ea6c3d39c3702a4d0fc899e26d5466c3ce7924 +60529634d54e61a992d907923ea6a831f94b1be0a311abc904dab3e0d71e9d9e +4d87d50e6d99e03b54501fc78c3f57de92f6c336cbdee2f4c03728cdedaae12b +1e28a0160cc0bbe6b332e5e0442763dda2701556c351c4f81ef3059b06804a1a +da267bd5e1e0846e23f8472740f0260c9d5c82daacdc931190e7f10011a6f718 +80218742749e3493db5f64b500e53dbb333a87926b413444c0db7b39cfeb12a2 +8d4a45e223e651ea6e6c65f5b1c89d4debbc133c226c27f7d8638a4af9803b72 +e29c308e2c4bffd6285910b9968dd1eaaedaa84f335173fdfb51593384a9d128 +3e2e49c3d722e825f67c77b9bbf2ca5e19e64bd7dc212b7f512ac8835fabe249 +89a19f724e474456b6aaf6b0cfb951d3a522510b5556fe6ac1d993f1ad0ab9ef +1d29ab40b6bbf4b8c1eb90db2220f3944f6a70f7dab210e0d2bdda392b85522c +079843ab8d38903c54f2354520cea0a4c1f4d60d2b6d6bf97b9b657982d5d3c8 +4a60ac668bc365240bbe4b5c17ce2c64a1f2afdb01997851f7c405139b3e4c55 +eb2d2a9aee9d4ca05b3d11066167f4bbb75ad5bf8f35813c1692fc2338f70a78 +efd212989488b031ff8239c56ab9c65f96940e45422ec9f721cee7bb73be2a08 +5921862a0a039d658534931865e17607e35372e501562f074a8d7c2366faf616 +0e47317e3667b2abbec7be0a3dc640b0bbc7336db58de5ba26f1f1e910adb1e8 +5172e182308e9fac6a50cbee3e5e22c21026bc31a8ea05577a5aaae1ca049f43 +a9f930ff5994abde44ed4c5cdc4139d1687f30f2b414e106dda8c246a54497c5 +1e9aaaa4d3e2c35a13a3350514544c4096e4ef17510d59eec945a7825f560b98 +c96f5a51e05bcb8878a6187b607f135c69f1dcd1fdf7a88c60da3116c5e46ded +2238210eee6bf3872c8b95e0e70ba4d7194d4aa51b356e060e2ec150cc9a666f +4942009188b80f3ed33481d8b754a3e7f69b1913ad6c7a1807bf05c5c7f06f84 +5ea967d0cfdb1ccd8cf14a02183f1e8ee7c20aec2ad2d4882028df0e165fdfa9 +c06159026bcde2f858d7358819795d5460a464cfd3fe23bda12f4096b62d2039 +4be06a2b4b08f94aed653608dd59684cc9d5585a9ed606e2aa9cfa7191badfa1 +fe20e83d01f42f06e8431ed876381326e2a31c230aa834169a18e92a9ef20b98 +0c96bf695b7771aae13d335733c96dd8541b5a6e3c7777093955f598246d135e +ee64474ada3f017cfed068c9f3115921276f1a95a1a2162f2eefffbcef0c3aa8 +e36f8c45889f3757b51af242c64fbc3d2c04574822487e014daa342ffbb8e1c5 +f0b7c0ad1eaea5bb5dd6b9b36f661e029001b40845d011dce1a9188718384933 +c0d3ec74eb27768cb5dc08f86b7914e2fb3f2b717a1f330c29d91e89888d83d2 +2f1d6d4531109a10f3b869377422cac3d2f89c0390b940321a8d0dc7f343b56f +a417206882526ea43ffd467c2aa969cd80a09a9eafa0a103c8f8206178749c1f +549a3393c1deda03623924281f806d8ed881ab7135903e993baad767de650fb5 +17615ef40209ce1ac15201fe094b32dc870208c0dd032ab639d4ce4b8b1e2a76 +ff3eb9f0472ad1bac009e3e9ccad32eeadc5047c8c80aeda16a946b558a4fc83 +6f8b9a897b415920a946bf2c81e2d9421ee21cefcbcc7f9ca6a8242d47d495c2 +158531ce2831f5da195954f10fa375d24d7e4e6a92af21972e02696780333cc1 +ae4b6c6bd8f43fbf196b2f7bf2f2f277e628e959dd51bbfec1d654fe7220f252 +cee9a500071f202a8567b6137551de985d5b0beb267d044c091a2e5066a0039b +bfb96bb94cbf04dd2fbf7700f42b68c9be0eeac34915c212d5cc6c781c89af77 +9e5acd11d425c13239fa07f0e28f2447d63109d16f909515389fdeb76c930791 +9c4d10959b0b63b39f49af938f109e45e62d2e46abb44a873f291eb4d078dcbd +c852cbb032ab7533ac8d651cba2f1429532122ff08967da9fbab8eb8e927d718 +136da194ce2a6433d6b92b441a4a9d06577c7c8cb4cd740f5cd83ebe74fde770 +229f7f090351a048893d43330247ac80afc9b28f7729287d54ed1fec1731a198 +a0642b50adcbfc5f9fc5dc00ceac0b4ef68f16cf5c5cdfc5c047ac5cdc26c357 +d8d9a6340846bbb4dc81966b4e54a550ed425b260da1b45a4905e6cd1014f197 +495ccb262aeb75b56377dac775b5ecfdc123eaebb617c48224c1e3276e453867 +65102b0313aa262d358566c9d518ba3c67692881747954e9e87e7900629fb73f +56537924923a4aec74cffaa5f32b4fb2fc0eb5c599d80991c02f1369721cef28 +dbb86f5c67f9ee5bd42ce86dca1872a382038926277a1b7d690ad7ff52945536 +32db74e9a632a5554221871082e4c33d36f5b0d225f0f75286d8b117e7d2d3b5 +7c334aaefca81df6d585b767004b6bc0fcdfd7296e8225b3af501a5e6ca4b3cc +3363da4c203513fc473bcf178c48a71e9fb1feb2d86d815d0c684daa1b2cef8b +7a17ac40531b319250803d658ee867e7beb632307701626d55460946c478ec2d +55e7f3f71c059816372a7ac7110bb97f6e86a782ea114b0adae033b89455d3e8 +19fe495b155971f926b139f8d003b9fc9c1e612d61508ec2fd4832740b47c14f +b1f194c3e440e9fa435494135b6af2d9aa706b7516ff853dc3f13c57862d7406 +63efe646cf15a3a54823e9302d870204e8694857f5ab8b8152f6c5332997975d +2bbc57e321c4f328ba2158850cd40a6227a64195817575c017f5fa090ae0556b +a7665849a46ff51b36263392d22734551a6c2a4faf5159ab2ad481825fb666d5 +653006265ee72e32c8230e733788428c7a8bbf821a8c8ec41b2b7ab77142b626 +1951cb548c93955bd2b0bbac1b460b1f490a2b6711471bc33e10d412ef004577 +49760ee95cd989440f59f188458fbadc10780dcd6b76633f3f60689ccff06f4a +ac24d19a052d25bb5247624e1251329b9f6e9200785faf56efc7955ba7dadfc3 +4bccb712a5ec29503cc890f16f14be12c9a98d27c4ad4ae7fe0feb05aba081ba +004391f5cd198e418654fd240d523ef4df055eec36029723b311bf07c3388116 +bf4da3aa56d5b9e3330aab618736d2a5029387a472b437947e2b9029e05b0218 +912afd8d21d5aaabb3135ab311778262455f2a559e166f48506dab27e0ca87a5 +315d30aff6499bdee67e4137347133a9edbee671d6dfa01ab4959858b2c1fac4 +5aca951a3a87f45fb859d7c7921deaf989a56f12c09a899d5e2c20746d44c380 +a88c5b06697083996c3d7690fe1c268e772a68651fc36936a36ea4ce8dc9057c +05f0a51898a7bb4b5045e2a58cea600491f21a09161ba7866e8d7f2d59d502b8 +ee2bb74404d02a92962d3c04a05659daba8ed04d8d92f2951863d67ba045f217 +bbb3f09bdcd2676bc970c34337695d053c6bbcbed78315ae82270b4aabf8f3f5 +8826a965b7ee29e3e6c13bb4213b28b0877a91145153f09ef866dfa1831481cd +87df5322e6464ddf257908a35d2b49a3f41a5767f14f5ca17c0be3ff13a8bedf +d59283abf933f33d7b0db0bc4d95c903fb422fd3b82c6ae88591d6fb3eddb7ab +3966850a8bed62c957170fb89607fe22aaefddb22414ff7a55ab50d5f151d86e +600889da55834432fe74afccc7be5f16a6c63262d5a788b3fdcd7ae98fe4f3e0 +a3ec297ffbb9d0875ffaa52ceb8894ddfa269df08d786a0e29102bf5a8d58d90 +293ea4e6f9d50bf4e7f19c10d805dd5de75770129639be680e06f25be7d07b40 +4001eb64a6b74e701782b42eb03c689d9b9327fd7fcbd0925f95630d3336cb5b +789388b17aee7e3616e43f935f30608c02acdfba2487664865f998c5fbbe6a2d +ed471586c5e68d4beeb65597c9ce368b494983548ec6fa4b15c556415bc15b27 +8186864315427c9aef3c102193c013b424e6ed789dbb0d21d75ce2afd3d9d8f6 +52f158edffb99e4e38b6df1ce9421e7eb130dfd305b5f9d88a94fd645a7a5669 +a5a2f447f3f1ed95ba822bbe972e4ab9b75e03094c3f23163385fc551050b982 +9b059a5a530f4ccd5eb0d4ba98f003f95c8f90210012830b76c89792d1898b9a +76c0308878786c3fd23199701f383b986c8f5cdd99fc86223b3d4cfb39587800 +35d33a7e56428ba3cae9283aab4d5280d952d5d028299d958dac4a23fce6ffb7 +7cca4d88a720d5d47fb2cdcd69a1829235fffc728d6a4b98dd2aae73bc163263 +ec6356d0d9a909a512735263a1ab810296026a7b0141ca44afde4632c5e31f87 +116869aeef9626d5786ed2d25ab3a1cb3adad4beb38bb5e3197f18b678e3f5b3 +8923c5405121f0433167b3f8651877974ccc784d92d9bfdef8205f6cabb2da97 +5e2871b2a0acd7c5d4998f942af4d67d84233aa6ea1d54c8570c3eedb76b0907 +e50d67404fee83fd79623f0599eccfde0fb9c7e8dbd87baecf9cf68aa07992e0 +8ca55e5acb1948f6478102ede178577b1ecf8eb4851742c25a20c39a12774513 +dac23ac5b53be148a4bb4c80d55b273b58a7279220c377b25920c4d89a6544f5 +f73204ab88bf1ed0f9fb756d28696ba1b3ca2ddb292115cefbeb71feb75b1427 +12c238c978bebbb9584c63fc9afde0b2ce3a6ec8e8818b040588187e3f03f1f7 +d01da8632a8b74347ac40b419da45c6cbb9d76c66a97caa79e44dd5803d898f4 +a3f22409aa49c0a837b47004ca324a59ab3ca4d4b8c23f8cbf99fd72ddc1ec46 +205826b8ae3313675fb819e3d62a7a356e68f5b65dca8fc54e98982d9528a279 +7fce2ccf3eed85944bf571173c63b0911f1a34a2badcd67fb385468cc9d243ee +f66aac6e15ed9add917ec73497ab853675c7721a1a767bc75ddd2a959e95b06c +81d92ef8773b221334525fa10ce0829551bc0713d1cf062908c439448b56cb3b +526742103abaa9e254d573728e902bd053a9c3cf044a99e509cb73b8d14a8dba +05492c2dd922b7f30c120fc1159e6f442cab60ae23895d0318254e5b07381e5b +1a2eac1bd664a9cb018a0c68b407dd84b17c21457e0c2501662f434ee592c6de +8bbe5fb8aa2b88f398b2ab790bf10431abe91de30452704ebfb4450b90a99664 +1924960ae32615374b33dfb3669569b69cc60cef0178c38151c17887e3b7708c +e0a473b3edc9aca81506cc0962786ecfb6333d51cf3c3d01a4f4ea20cfab0b75 +408887aa9cfc740ca661a7edd6af8e0b17ab5713165286d2ce1882ba9302e5e5 +9f02527ded5011eabd72ce5ff1f12350d4e5130a990857e9676ac998dfbc4351 +800e309e314cf6dcf3750f3bb5467fb72de0b3afab584e4915ba93233c5e513f +d2f63bee7721881aa14a331c979028d7c20889115d626772b465ea0d9fc0c775 +b5edbc3f3e27edd6b46ab8c3a76b0245e14b755a308ef25a8dad6d9cdd64b890 +e169114fb7e06afe3b91ed8071c91235b25d4969ec9f03c1452d22b1ff2137ef +bd3d7b465154a1966f9b203e94c3f136a92faec041f74af4470cb54208ea6ab6 +c92560f542b85dd9f9b31e8ee2b5ccbe4ce674dd9be8492a161d646b77cbeb49 +aa5244cc402524caabf499c8f2192cc1a9fd5517105999a0338a3648ca03f9b1 +1b486352b68ab7a4816929d4d2706b5561e3e7c91eb5b116fd10f9ec9ea529a2 +e1ed87699193a44c174900fbf685f5cfa2639ded75b2e40fe9b0fced8da05161 +51fc5db43926292602db810b3a412c6f1ead6428aa7f45b4599e611289b31648 +8e9304e1da4d49d67d6217564a1bf74c887a2b595ed2f7a43426e1a7f1851c5e +97f591fc95625614cd115c03d8a3e2497b99c6b48510cb1e7f556e2d56babb27 +0ce9af4d3c3a37801e1fc28cf9457368737bd90d2bdffc8aa9e03ecc0f8c4eb4 +666936e527dc0efedc81a8acbb0f925de56566dbe14d187a862b43f7c56a438a +97331856ba272c57653a90a4276186d9f16350ea0f59def08ad5cd2d67316254 +efd0b990048bf4b88af600ec5faf2aa5369ac7c81c6caa59f8dd5c7dd29f0a03 +369037756c72ed98032589a86d9f31267c4932fd5ea2929992035781ef53788e +f64ba08a3573ce1f4eedf19744737486475480b4afe3cbf2ed608fa651d77047 +e6b016185db1503cdd5f17c8b515f40120f4a676ce153f8bcede25e0e998f7b4 +c9091b98d0364f599a783fb5ee99c24ccddc7bf77eef513b06753e26e2ba763c +fc67abc3f845719cad166be74e582eb74884345ccf6c265f4ff6623671358624 +5ea33fb16a4a4c4443c3d3c217b167e97c9c0eab334cf6f4f02a61a4d9c6f41b +5695fbff38e8d4d91733ceee4b1d93b642f974b510b1407d7992f02666d26ec7 +aba5eb40cc4cd100cd964df5dab0a31d07b36fa48efa64cf8c591c04381b3a92 +31c8f11150b820871fa64be805d62634c38a7ddd0855c315e32621fb962f7baa +44c9f56de9b712119335863b8e08652c9ec3cbf07279950b11b2eaa12ff17909 +40abccfd12674887866c008f06976d3d3aa9bfb4bf064e50bdcf3823b7ce5d6a +66732655620ea67c93ce77cfe64cd3e121c5ce207b6cb583fb317c1704034dfa +8d7d5ce9bc776e2e3f7cd965d3e5bcc453842f07fc539dceaddb5d2625078735 +ac550c310d989a98b4eb17ddcbab25e709cfb854880a51109be883d0703b8f33 +c64a47fbcfb7c1a336831f666b18a7ea57ab7b090e54eff27ef90c1795920917 +18ce8255e72339bc4accf7c4a0a832b3ad6d326218954b6ef1eb2b1c6e283fdd +1a84af455f2b88feb1e445278219265e36560e12262640f0b8c39d5823ec44f8 +f7fb0b0b1396706533621e3d3f1504f526224b9234c3cdcd1623c2025675be08 +89796843913c5bf74ad911974728626e2ea150b990e11027fa99ef57c7599702 +c0c8a8f3bd0a4453abcf0ee43b9d2f8bc691c5bf000c8d39a57e3a6061c7da19 +0332b98c25b3a5eb14181baf64d1ba6e846e962a5a3ea875ede2412419533f00 +0927ae15814e4fe907e6c002aefe845e32ce23a785965f87a4433e3d9cb40146 +fcfcf5dbd1cdf4cc5b00fcdec032af3383ee52d1bb019178b5d64ffc4735f4c6 +2350cea2f0c6c844fa492a097dd45af2692aded617e8a061d2734e40dd12cfac +51565a595b10c4c6eab692c7d1898bc887f0664ca953a4220d49585b6910d048 +bbdfcf28540d9a418881877dbba6cb7214e3adab8da4c2fbe47e395900428f6d +4b4b2f318199e3b60476b81d65ba33486d6581a95532ef5a8c4a6182756d1a5f +19a35a156896d16eb1cbdc3c71c34cbdb15b27fa08744257f7ab4df53312cc59 +5899050b9a1a484c6e7d7d2b8156c1adc9e65fd3a0afffbf77880e596dd4fe88 +70160f117e7f994f1d44d82b290b3412c05094227d953cd8d936253e70bcc45b +e679f3c37cd829e2210262691d4b4fd2715d235ed932fa7a4f3d6a51cd2c1c2d +98bfdcab79d94ae5a0c763b5ecf82beaa0346c55591333a2fe74ddde412b5113 +4ecf85c4f33f16870585929ff3a43ca183880c3b342de71d0b50e0caec8ac96f +84d6c65126ec6e15b475536b0cc310ac9f4b2e878f82c989f85aefb499cf31e7 +617300e920b4fc4c08a75760000fd68dcf357301c58a7d85d259456c19822a33 +33df916e8dab10ed7533e4a5cac1b999c30fa597da3fb3634b8c2d3f911ffa10 +c77152e36ddc54eb66be93aec9d38b41040fbcad8582789037c2752b45b95d89 +748fef565f2a0db42b2a5811388302fd3f66854ee861d3941f833051563adbc2 +ca1447923350863fbcd08df7b2014a1fc656bcc14549abff4345a697e7971457 +2fe7f47f74f6fb110ec6c19a820b9b8b250629ba3e1c5875e05b4f3337fb4964 +a4a4ccb5e2b3022070fbc8d443415baef77dc51cd2fc0e563a60ff115872eda2 +386b73b755eb353d84589804462783d6f2e47c88ac22149f64e5cbf873c41174 +7da691f652905e230e04457643f56a0693083c3ab6cd488d25b2ae3d4d093744 +4e7434e673578a3bf51005f94abbf2e2cec0c49bb157d6230c1166f890e7d888 +af0eefbdeb7a8c8e2c329736fb1abfd1c28a236f48bf45ad3f9800208e2c8941 +d7c2646791a2c6a9f77ff6b14d7a4cb1561ef7d5a1a4cddfa41490ef06be0dfa +4dddb8323a2ea2db2acf4abf56bf4f0cc6f667d1ffe303fbea1022063007e244 +03bb1e90bb071aad2256fa48458390f293b11cd33588cc1360df26cf9d91d9c1 +f5b300a063059ee65641c58fe08b5ed6fccb1f67e54cfe0076b02ca362a45f97 +245ed407e9f1931206addd15ef3784dad8d867746dbbe36bb2ce156744a87b3b +a15af3e3cb363c364563a81cdfcde7cf4161ac8896427d02328b951359a912d8 +1875b42c28813384ec0c949a6bc976f6742593e3c9a99448636568639dac3c53 +9a21cdc09cd7bfbc86cb8eda122ab9d6eda9fc0e4eb323431d002c6a8cb29983 +be023d9d52f147d73773c1f1380900e0072662ddde03b7c9d2e4db6368372608 +e0496a71c64ef37b03aaa37b039bb034e6a62ab9847c99bf3f9099a6ac828649 +32a248d723f9382cc93c76dcb0ec3db065bd6ffde538058914c02439a92aec80 +a66aed7b67ba8d5b75eb76e277c198f1f1c2f71565bc0c23d25d6437a7c69017 +c72c73f0fba4bfa80a5a046dfd0ca7a783d708a338ae2eae71790312ecf250ce +a7fb1b69c6c52f955bf1b7333972d48f6f479e96f8fcbf0ab105b92ea72d0613 +7505068b025f00b576831cd180cdfc27494245d75802ed8220d1dab513e5927b +083eaaae23ecc085b27d6ef444ec9fd98782e35f45b0347b55499af1e7a55526 +9ecd6b6b0b0aa2b711e5d3032ace6fee06d5542c686215133cb7f158c65184be +e20041a7d55c838e396b3e50030d4ac5c5831dd6cf3be395aff8d416a1cf29c5 +88149b83c31cb8bc45a3f900ba4daef0564564dc006c44009a8c5967f87ee50e +3fb7b500da32f03ab2abc380fddde8c875c19701d1b9ed54777f2a33030f1aa8 +def1ca0b3720e9859c189fa70462a3eb074bc25c2b97c2be9813f9dd887cf118 +6126db00de2b454417852b5ae707422cd60b337c63ba1acbdd549c79f0e16fbb +ac549022ccbb79a62e2fff0bcf1d99a016304e8349fe6c7782f868c7ecc3c27b +b81fa8c522d9cd26268c3606d529d8cbf039020630e084b6385ffe35d911bf6b +138a9afa6174affd18a6204e0b67c8ca76c229c30a13ee2de45e35631fc03f4f +9b1645ada82e4aaa2504df003f8c6f7ea621a0d2bb693feac0e68544e07acd39 +ad72aa50b3b9518e87763a52f92f7d2bfb84ebc5c6c7fd83ebf6ab660b5d39ef +3b8ad3d47743809397e04c52fb109ff9a99a3dc2f462db485b70068b80546b58 +a77bd668c96f83fecd4947ea612638502aa06285885913c3d0a55ed59fcb5717 +4d6cc24d070d554074890f9a30bc5f749220def451ed203fa509e245d0022dec +80185e5130ba4c2d55f2ea3b518cb97cbdb99c94b7c71de53416cf63db5662c9 +314bfe5972e405f56d9c64fed47f2403d9a369d9762d045c51a81f49f2dcf7f2 +9b4b2c95386371755169be5ac5c77bcd5781b0024707f89703390a57417224c2 +f3c071030c29c5362d86fe7b0d6fbdd4ae0d5f9d88b0b6b3f3ee624a06d12a3f +cce2f10522acd3b1627264a10d27bf4e4228daab35976226415e2b5580801957 +580b9b57d264ae556bb8c19aa894a68cc203a4f1c61b8f736c0056a6396816e4 +b325c498cb8ff2163bef8775f0374edee0975c0e12664f28c91122b2ec426e3c +bc4040b96af0a0e1f1f08181a125ff32f1deb1541e765d3f6c395d4dd72cf70a +0c8786e78251339ca115ee3f5ad2f2833b3299b88dd51dd6e106312b6d2863a5 +d5be8dcdfd3aa0c23442f5d9f2c52e26b7bcd93f651531083cbdcc8a1983cd9f +7dc0de8fe4a2e226196bb179f8b06c12041c55b3e8e8919980bc4dc1b7c40ff8 +37370003395291883fe84981a3890f0c7dbe8e528cb2a81ebc8af0faf17a9069 +a7a7c9ed225f696a36115daa94dfd10dd270ae15fe601a9987bab5c9f66b69fe +893345a4f78534651e6a1c3c3569ddb6f9a055e1bfc7dd93b698d98797ec1328 +a49c6af1fd7955f566b8ec99300711cea2d99dc4bb2c6aaeba79af44bbc2debd +d43bd144d1d53b6232dec21840790213b586fc630685c69e438ef6d245019c93 +9b506df33da438b20df1aea4a4e5c246a8e6e5d3bd22fcfee85566287ec4f7e8 +8e33762e9475279fba8c2a21b334d6f21f189dacad1f5df0e6de190418609ef5 +9dae7a86830607c5eff55bfa5dee90f611d04f634b19b68f3ad16320ab5df8c4 +ebe6a153b8aa346060bff0f079c765f5b007d5a480acd201cf21205f3999697d +23868cbea55866d79f3f44bda0140212f0790f51dd9c8d6c1b6eaff7443241d7 +7ae286049962a7a2df2f86d77817eae276876498128bbf9d0bd0d8afd6b7df05 +640a58631d71a56095d048d54e43b95e2f63a09e36286bf5fc9caccc3b353eaf +3215a65f0bd46782fa6eff4efbb0a35edfdf715e7a0cdfba50c6ecb72808f1cf +e2fe93a936c821c4fef275c04c4ce10e503216d92f41dde7132b70e78ee27753 +5eb60b276faa9b10b2c485b6522741889e4d80ab8adcd269e598ac4fb359a4a1 +ca313b71d5c448d32f7828b9c0854adb69d25caf61a7fc418e524167ba324abf +78995886c0a6edfde425d5e2171de85b609152f30305138418f76f9c3d15753b +0b2716cf8f9c412e553a0b7dd4a3b1aad4c6d5ea4f18f55ea03b91305e2d23b4 +96b5746b9060aec17db39fdef6466e99c99dbaaf458d19a5290969bbd1241fee +6f8d49448d81521655b7e24f5c4d4f60f8d136d4c62af41ec98611a04a0323fe +51671e40ce6a0ebc879ca0823b42ef74758648a09bb7b6491ab3c87860dbfa5e +1c55f515d43d55074764dc43d7fa8c9f +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/couri.pfa b/ogclient/lib/fonts/couri.pfa new file mode 100644 index 0000000..2822ec2 --- /dev/null +++ b/ogclient/lib/fonts/couri.pfa @@ -0,0 +1,1893 @@ +%!PS-AdobeFont-1.0: Courier-Italic 001.003 +%%CreationDate: Tue Sep 17 16:31:02 1991 +%%VMusage: 56675 75599 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Italic) readonly def +/FamilyName (Courier) readonly def +/Weight (Regular) readonly def +/ItalicAngle -16 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-Italic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263787 def +/FontBBox{-48 -288 800 841}readonly def +currentdict end +currentfile eexec +9451d7e7a4929782edaf756a2645851dbcddfea354f61d8628b8cff733b549d1 +03a6c4f5bff18e7f42cc7ab902ffc194c26f5e122df5e4153316cf8bdd34f70f +7f4ac63c058fb15bed425f41d00b0fc3ce2bc7aaf11938e1e62955f527022fa9 +101fa95110e14387d94d5f312dbfea32c17f8467e82d9c3c014699e7ceefd421 +346e8b03a0eeff980f4119e6862a5e4c2acf990756a4c25f41289ed051a09703 +966cddf3bb9f59d54985d5473684443849535c5c052a1a9fd7bd55f5f76f6e3f +f7eaf762c3144175458d38e0c1cfad096c5f759c52459a0bceee202940109f4b +7e589678aeaedb32e62789199f908ae2c370138de2b7d42d9fd5f24a1a39526a +16f99ff43def7d9cc15cab7bd4984a978c5004eec4dec999af4f79cfd01ef149 +746140fcbe1dd3efd7bea7c6ad6b84229d3836f4d7f5714424c21a13a941181d +cef9ea1d136feb92b96b3e3126d9529878cd620a1fa3e4cde95853533f067ac3 +39f288527ebc6ba9eac0e767731a02705d581144986ea6ac8eb055b550ca00ac +d031813c1ae301f907efde4be3eecfcb4a5928013475debe556f045ee0df78cb +cc080be9c5628a6254b28b146328f10163a09a83267de2cad5115f778a369cbc +84fad9d59d6eee9785bb43e2c96d13476cdcecb6560ebfffa7de0cf4662b3490 +36859bde1974b21efb897c498691cfa294b724a58138e92e4a32b138302362d6 +784aee399bddfe6a40ac7a1e473d9eb34e949ea7fc42e7276591218e4237b50f +b02bf78be202b0972447920155dbcb8fde70e74df1167fc2ce02a96fac4fba92 +4aecf5f4f94ced70e010eff9147c40fa6ee88c7e5b06e5f761f2c222d414cff8 +12999db0535504f922a533c7538d77239c45f04c9c31a48bded20106cf6d885f +1f428e2144d399a8e589c3790d572985a9b26876960e31eef7b8ef5430d391da +9618103b8d95452d9ad4fb2df2fe324500e205f5830649bb6688ce7b599dc96c +884d0564a73d7a3bb2e2aa12102079ea29ed01340ea9c2e6cbdab1b2ab6301c1 +815b16b46aa4cd714d2454c81a5c65fe62bc038c62f3db91431361a832fa801b +001999d79ed82fc813e004b875f8f0b69764d55966952482a015cf67587f3624 +f0e94e983980c9ada89df75eea4b6f3c0fec7288b07a51bcaf9b50b7316c4c22 +65da826d30372d94e3e01067b305907a6784fbd29b427dd950a27a4569c9a93e +b94d553d5698f8f312e015cfbb4e411a521ce2f0216f900eff711d60a21e0487 +1191cd8a870bde5c7d90ef2c52ab892db301513264ae73b2213c6eadb474d7b6 +03e6fba747bd5532515b9385eb4da75f6acdeb8d5225f01745158ee38c574b4b +842962be90df91632ab92fe2af21f8699e670bb3ace0f4b1e5f252f8a9e836e8 +baffed5e34f70561ffc24a440bb45129d3197476d9446d4d15929d957664c3cf +a3f238ba39dd636376e86414e7b1efcb42a6079e1570d987916d1c0e3abe739d +bd70ee831509b8bd6276adadee7fde2a39b015884f5a8dde60fb6422a00dddf2 +84839f70f58cd9674d2a5b3e6608dd892a76425f4a719d999846d53ee1a2ba19 +fd0a7144af29d774ed2d707e6f5c409dd262ef6a1a76ebb0f326165e41578203 +492fd1817cbfe7c20e4e71ad1e708f72aec944f42e097cd71e75e530b853eefe +3930ee67d4765fa79b2922884a4f54f5ead4f149b3d7397affd32da788d33c0c +34c7b6b747685680cf8de88352869e58aa05405f2100033aef8e07e465421ce6 +1906499e3a9219bf545a2fc6dab9363c51d28778cedfc72a14124bc174868a5a +6b077a5bc3fab24ddcdb66ce8f1228f2e8795ca00d158dd85b6ce80bfa2c5b33 +54582dee7138beb45b0b795205263cb3922fdfdff57a077395eff212f13dbea7 +595159bf5fa6ef014b84484bd27d8cc405dca16b6aa3ed6ea9b0b69ff2b160ae +c0af127322c7f3bed8b8089f9bed60aac6877faf30db93b59e3f99f751c03174 +37135c58c3c43e95681e4254ed00531a086de8fa24f68483db6a97fdfd3dac5a +6e0296b4f2207e2c301e3e424e49c7c5e98f48bc1a545b3a1b7e4bd5b6829f20 +0e5663995deb31543a56990850f6614abb032a91994f9bf380a8d0a22f6e19d7 +006edb7e5dfcad6e01b9e3d791fc9326862e72aa717fa3b68c537202cd6ae9c5 +d81773186a4c30c5a95d86e6614e30eb630690c78a40eb87c08e6f679ff4f862 +25dce99ad158f978b63c037b51dc5267c11d2d46d5823f429ece0d1b1e5225ab +092cadb0c5ac32d54404b1dc2b6b340e7b2d0b478ab13a3e53d1f365a50c515e +8d4bec663f52a818faddde2cb9f05aef238b5cd55a29382faafa3089d6f69379 +ef72942826fc4742e7beb16a452d0319b6b3a3e08bafc4f69bcbe9dbb938e768 +b392c9755bc00415744c0f850c855a1ba009b1e2b3a8c48ae92e4b4d95bdfa30 +aa0b6e310854ce3137885f88f687ba590220d27378d0ea52145b84429071ca41 +fbc3d285a49c55f32cd0d31676e36a2bd406f33a0ad837af2cf35602f9c6921c +9167ef568466c90308107b918419e3245dbfba44178559abc36fc6c1818aed6d +91c79d4fda4b4b2a47c068a11bbb899ae064327238fe5b4816dd820fc81a8871 +40025ede257cb64429dd34f9a1632c60eb44f3b24799a8d271b5059b45092b23 +a4ada866e017c76c8f7f701a37169fe6404a9c2f3987f81b9d13fcbadcd2505d +2793770da0f40850a837fa1ca9b6aff2004b92c5ee6fab82895f7b7b584d704c +94345ffb2f055d296f79fd2adcb5b1c1604290913b8df0f49df05e637266c882 +c0aab6855aca04b6bcc488a4b4cfdd8314b932f50e5d2c72fe4551390098da93 +060d3b350082b6950e7c9ace10f3063f9c24956cc7312ee1453defd2618392ac +b8c970cac9a2caa289639c4a3540fde6851e0801f5fe97b278e42280dce79568 +a4d459defe3682ee830c395e0949f8b0e90b43c5c1081b02d28ada072e63a5ed +6bd693ab68093e99730bad8499a55fb9b50c8a1b7ff3e01735077552b1f14466 +d86462a79e3b965a9183c0539d827686ac0c0c828448bbc999cee7545e6ff564 +24d47780bc2ccb4031214818681f6c1aadf6fc05ef40feccae7a672c83487458 +694df4bb1aca47b5d7922e55fe29c7df4e80d6e4bd4b79402e299e98a89d22e5 +d39073fcd45c50d08224481a9da4ec0648f002e0e9ae733d56823c9504a467c6 +325b8c959e79a08504417dc181116ef4c082394ac90814e97cd63c2b591eb78b +f78c30368cfd3ade41f83b89dd6ebc2db9bdc9e62c40db51eeeaae3c0e36ea1d +153f80beba54c411b75852627f45de38e320e3fa7870134e7cd41e355fc90aba +3adc77b781ef03e67e49a0a94c8fb24f7b01c6eb37fb38cd409d000438b39296 +dbe1edf020ee046411bd70a3100aa113c4be50f47371119570c7b5a74fa60b62 +ae02a8488a26ba8b057ebd29c3dd1d813f29c85049c86d339f32f0ed83b41f7e +92da22abf963abf1afa56f424c127a23e39a5a2213388827660e1c6a1b016b9f +834e6eb705a69f7ed8cc981c651014fb12c6de4894bf36a317db98b870d07409 +43144994a4be0cdc78c8b14acb0583b9c6ae0286cfc355c2652e3ce38e4b57d5 +da616ade47fb63fc9ca2d00e118de2f9a43a18d5065c91ee3b57cd05d5ab7dc2 +3cf8c1de80d30a857edf235da528370b006209854fb381fd693bbc060936639f +3a90ffbfa38d497c5e04bc92ac2282064ded4f8b48a1f0684650e8ec7aa8729e +cbd4f167f3d6fe90a095ba8f75f03a60cdd5bc4d83afe96faf8e8199c4211e57 +4f7f843cd927b2581aa05b07ebd916989d980e3dabd8140e200de167e0c81f93 +bfa47a97844c1a663bbf1975483989d9357229ab5c774d4222acf58c8da0e891 +a6068bebebc3baf1ccd312a45ac40706486735db1fb8eb68f75de2ba3b640fce +39934712779c7a27ab2ad4c3467b0d00f48bd23c32b3a2c3fa9b60a26047d7e1 +052d1d8c316caf1be1bac044be3564604892b7d33202142e1ce3d5952fcf0fd2 +faea492b74cdc5112ab8af4dc17997831d98b641d39592a9e84b1d7981c413c7 +63c3ae7b07ee80199900c204b54ce8e28ea28a7efbf7f7a13cb9122ad020115c +ad375a74983094c289061e23d54b8ca38e8a1567a4a44ba1c1f3489647faff31 +45ba870af754402bc3ef934ecbee92735e8d88f0ed1097247e40257c1fe188b7 +b100222b745d457d8ed2aab04206dd62391fa2dc7b3d728e10405c9b5cd93bc6 +afe10b476451d3edb361a090a6c32b8180bc02494e01ee684313c171b4cd96f6 +4dfa467b45577b795deeccc0701c29fb665e8a20d04683592f7b3ec507cc8d74 +4072115649b573b99cee72393f788ccfc8b6739ccafd4ece7f0fae20ded802cc +ce4442beaec97cf0b5489707eb9779e9f72b5f55b314e26422a8019c44fed234 +a21f96b1b69f99e0a265c6435bc18edcf6cff798bdb0b9bca878776b925423d6 +0c9941fbfe4e374a51b4f4ab6bdfe767d3aca462d727a364ee60360248c54769 +7b3cdf8913a78f4ee0ac72369545b36a8a74ee785c1013f04ba3a482815af951 +703f3f3359ae963f49d1df66cdc5d47010cd3765e29b73702f9e0b687207b8ea +28ddb6a47c9aac53b65fb50d86cf716c68572a6e9223ffa141a05856de949f61 +12bfc258cb674114f7a5afed4ac2d75e5ee8e5475ed070342c724be8a8e14474 +b044416541284b470ca3360ad99898dae8194581749b1d7626eb0ced901beb7e +33b3672d74ca975b910e81f14569c725b9fd9bccea96bc61dfc6c3fb2f490e64 +97c6a20d8ad2e065a697ac178f99b174d65c8d082d9a9fc937bb669c9a93daf7 +c32d165b09e1b9a0824a3072990cf9ad7103ebcc6cb30c552ff984600560d2a6 +ab1270bed37af4b8b7863ed2d10fcf15a88fcac28c61f1e9f97dce05200a9a0f +291b4d0420a6512e6614c28457bab7007fee6591241943deacbaa5be0edd15f2 +6bdb59adeaccf91b843bad3ad2066865c7736cc8b4eae5a1ebd3009802955717 +0dfe24c72ae5da4261ea8f9070ef1da48ed288e22ddb060220f6822595ff0208 +448c931d2c6ad2e132fefb7528de2b6afd1c6453d798ddafb3eeaf906f972080 +d9dd4539de39dbc3654ace2fbc914ffea6bdb35aedaed3f5e0717c0fbf60f167 +5c9755485c254b6106faa14c995b6043d073a009572dd50f5054879b2c75cf3d +08048ff3f1957355bafa70ebdb1aed4a7c0ba38648d193b18cb83f90b2610cf2 +df3f4c96a25dc64a341e253cf2d09dbfafd95f562826cea8a85c38d76d0add80 +cabd96927cbee4a1c16d89aadebbff0a7e2632e25e1b5d82132527e4f47106f1 +0416aaf3766916ce6d4ed930fb45cbb2ff6d606323ea3557fc29e0403ae664b4 +434cf42973abbb2db64dabaaecbbebf16547396e751138a24ad9d5c3475304b7 +99e85b57b37ca1060378c8211a99078f8b8e8e43e3d191ef85f4b7a7e7f11898 +b3eeca83053cbb2e5cc421429361867d6631d5eb3c2dfd890f74b504cfdd2042 +6ff193765ccf5ae1c820bdcad46bd1097386d02a59360da1e30b0167e01557fe +4360050e15ef77f236c833bb7589b6e335d3c7aba5f90baa924d725a7335712b +4549bbbd20c12398b8c8e8f7abe3104c068ba6db673b81d9532ba41b8be616f0 +3350f14644713b17482bed129bd1c5c2c4c5c3924e90918ce9e7262701e314f3 +cc8956a36219aa6b3c6782b7fe6c91af6b272f9936ba0c819ec1b0fa0a8616d7 +2d4a63f758128e2c348c083050f06a0b6feeb189ef7a000f4ec552377671b0b0 +393c66047a5756d7e9ac38c955d3ce583f94e50b41a0a153961ee049cab60d85 +97cccbe0686d23140adc2fadbecaf085d96d31a8358912989dea8787c292cae1 +7d4df00e359d791cbc932a31626662e0552f79b396a22adaaff556326d508275 +a2bd744f4583dbd8c91c8e89bb70104d88e2faa619020412a91fb03d1b511c78 +ac048f87ae0ce52eee8161a84bd9994d8c4de132a71d06278e80d3fb341ce4b8 +49a4856f5d0bd770baad7bb1338449aba330590a9784447b363872c1a2c7a390 +101e4ac42b1331daacd27aaf670b13b29da7601e05bd49cd62787644ef6f6ce4 +c1e67e3fd2a3923281faff11ad358e756d285642be31a8b36fa372b6b826ab34 +af6a9dcbd37aad998a881b8910552cfd53a03b2ccf128fd5634b30279b854a7e +c3d87c27da01113b2e134fbf0283f00e6bee34291027ebaaa310a6728b98a2f2 +40fd33a44caf62306a706b5ead4f7e16ade438be5d36359d0aad5da320d98657 +9fe6af830b8bf4bb32ccc46d56f48e769b49cb6ce9606bb0f32309333e87ac82 +91f85441a72bd6f6adc4922908aa822dfc4ec0e95123e35b40f72be615eeef40 +58ac7c03070bf65c5fcbf8b7751a4955985fc42ad26c6b87433bc98f03ce0f8f +51c1e63c253d32f7383d02c5b8d7c57aaaeea850f13881972fb594fd74b57d63 +de373261225149e899d60daf10c7707a6572e5b61d0cebf985b1fafae29db8d4 +e2e0969bc8351d482d270d93c6741eacc85b53b3fcdf04a931776933e36f8009 +0d15d03f4c51f27e41e1b09a233e78b95d50bb59f80f025e497494a35168628c +b69da174cd860bf66879831bba9cb20df1fe8a005929b8657ac38e5518b94ca8 +ddfa11cee6f424446593c9ab1061bc6d7d285b4d2ba61dc734f23c68165796eb +48bb353d874ee8b354ea4ba245f249cededb1a45eff353d3b24e6ae36b4bf29b +f2f0d4958e8652c90c8607ee99d364525ff45ed28b2cdb035f4a921ff09f7fa5 +a0fe308f9322bee5db6e8fa9c1b928c093c9e3cc21d7f914209ae12fa687fcf9 +b143b60d1b6eddbabe07324398a4dd3b96b38637b979ffdc844712bf1457e73a +aa66b914a46707ea94d87bdbf964c736a72d1f173b5ca8eeff1aaec036756e86 +2ae63b2a05ce9bfe44dc59c91046127522b37dc99e1a0a40f9189f2041e6d3af +64adf60b14ccab5b3e0f19075f44f0b24bfe305db1a8cc97fc268136462fe36b +c18c54f419fab7c9e6cc41ec5fb01970cc761cc5439d32f2d05d7753934bbf7f +9ae1abc694d25e864601aeea52cf0393a8d99c1e278915970019298f21fb1eeb +253ad932b9ca86ece282690e7cd815ef823dfe706e31499b3200983d7b2e1e03 +ee85904457f4b67ecfc10b2911be7935059375b5e1f4a59aae648dfdadd37d9f +92aa32dfd4ad6aa52709ba37237b9ec1c15f089d80306f4a2f86ee4e53d43177 +72139d975aca988ce9fb925d4e8869d9bc3807114c8cff3b89aabaaae6c004f0 +b47d29a951688e253d4b9edeec90537929563e134863a5bc5b14b10c7003b172 +af367f7109a0026ccd1b21b70d768bab9ca649052944b5713df04fa2c491ced6 +42abb041b7dc3afa5fa54a1bd682f2f4fc11028e2742e4620bb7f7d2b6b3cb04 +2cca29b6e140da488a6c015a5405f6a9e87597934bd2eb54ff7cb60b457e3125 +75d1c1fb0e2b263cfc8a36be85418bc089c7ff09808906fcf9b2fa33c37926b4 +2ab5548fa99a68ac72ebed94f9e196ab78661d1603829f1077ed9667f1153b5f +30527f64b47ead21c8971e649c6f08930b334c052ef16bd8e08ed918b551ff1d +5b06e6a02c22c325a36a628ffcb7cda2e204a09e6c029dc837a1220e728f3a26 +370f833b16d3a24510de53f83f6295853ecc202053748399b8ababc574b17fe7 +d543ca4269466ac9b2f96a5322b1b2bda825c483f632dca511240c9ed233b5f1 +ecd258867fa35d43126995a505ccd4bee92964493d633dedac48bb516eea368b +6dd30c92ca794affcf72cf93efe15a5d5bb730dc2ff190b35e7805a6a448d8cb +91095447ce11dff34debfbd18e88940a93d2b35ff12108b89733a4fef8a8aa09 +4a569660e66793ac5fafc00dd26b07bd1e8a5db3de4599153864cc9c9b5b978c +939272c070947643f999070239fc0489e4248aa1ace1111fa45a02ace8924393 +d8781113740c2666a2a9338023a4f0c0ffa4c304bd96f04a93edb7b6f04526cd +6dd6125edfff5a3e252aa049a974e00f62c449c68a6f636fc56abcc3ea957011 +d2ed2932c11f93a299f9c8f76a99c166a8f0b3ab07723601a5360fed33dd9af1 +f9de7d2e5c62cde83a485f7b701a1de173c6480bc2354328736d3012ff4026be +5f4405e71a1f3c6589bbf93ec9b44e9172c872a23190da0eb8783d864a55b073 +c606eccf6e032aa395a025593c00c1ede21490d590f75e07a0ace72030a03103 +aa6452a75de120ee0e87dbc5100924a354d9bd59b45eae1ac3522f1560db9d4b +cea57007a8e2efd9eeb415fba88c17b6a262608e03661f78d84d10d2e3ffa3b1 +a6e22f64c77c96606897483c283a61b6eac19867f8ea6d30e7ab1c8426bc521a +9c6d95285ef146c3f26306048c0faab3ce8903141ac00d34188adbb2943bea3c +24ada2b77c2fb234ba81b18319141d0f66ed8f030b9488b42a8b77a9ea818568 +33e52373e4af68063a20983f7ef9650b36d756a9914e19459ca5f73de2aaf099 +6b7a4feff0cb044b5efdbe79c0f92be56c034f0837407936c61cbfc5c246aebd +bbd6d10151ff96e6c9a70c83c252caad6ccb7dce8f8daf0fd9369fb7ca917318 +305553c4065a128d48e72c15e73d342b60fa5cd5cddb4ccd312909f3aa74c6e8 +93e4d03dd5f14ffe7620fa57fcf052edf14b24946c3298ad90495d4ffb1a3efa +fa2a7fe539da1eb9a1caae17db4d791f82a6f7549f1bc9c8511c67fa7f9a0c4d +0e1f6b499c20ca4bddb2d01331235306174ddaa89fbba3940fe3f0d90ea99ca1 +7b6068cc3a067fadc54ca07971fc760dff6c379e0da34213efb3e31b8bce103c +b213d370e9d56a7d45d717ec95c147a5587d8fdc2dc5a473c55682d8e6ddf0ff +99b84ff7708d0861ba2e173cc1bc5bea35c9167f434af0892b36df9185858494 +9a8c30aa60f56427bc62605639c1fbbbe8b3abe849cf9811dd91e51c7cbaf230 +2de453d71129891f573111286f2e1e3409d655a5aab5b711c827727a1c2b3a12 +3c6e267745c9151e4f68fdc8408cbd61e2415af33491dbcb6213f7f863a885d0 +a0e22a64c414738fdde20b991e8535188c7fdfa2c4c2f7464996d39ee7a6e2a4 +edeb319993ca59cfab71ea429df70d7c13003a14195491f38bfe9ca0e847d5ac +5b4cead59f46f9a96e9d2da356764c8f9ba7f28ddc44da1e71aa78a1f37f4d65 +67d089bfbfc5905d0d9f8bf91d59fb36368ebe6dc98d2dc30bd4dcfd95f8a7d4 +5e5fcb994cdf902dd0d1e1c6811da7035265c2500fc841b593581a685348cef3 +e7194022c27ce9b6e6b145c00673ec1b5e3b44c591b624be9b98af5a2047f91c +ecde59fe67573c7ed7059abfaee47366095ec644982546b7ade8fab0405df825 +77a1e716f6c5ac53f6399471af444ab647d20d73b56bd4f691a1af23668676c8 +7fbdd5f36ccd0b511a3ddca6749aade0226839bf535c49aa48c8f77b93a92502 +ba49d66c339eb423849595aab668a0fddf1f05ceab7aeb0b07df1f074f5379a0 +716aef2d1ce011c7f446af69375061b61ee2a5d53070c700cd61d65a19699654 +5749531ead8bab91300d32155699a97ebac94fbb074c047f0891dabbf4efb01d +183cecd9cd90e4276a8b706f851a9545e24b979db7a160171a647ce1dec9cbe1 +48c67575c9225276534d4954f5bb7980f8ff64d841441c358c2fa6745dd63377 +fba23fddfedd38a275d953dbae7f499e16fd528bd167e35895d92ac4a43f1390 +d18c8df01a18da71936f4f21274a19fc16ac14676e9204874dbd4c5375d1761c +26a48edba84acea46018cc75c5d394f5a512ee51296607e8dd91cfb635cd52b8 +f789fa9efafb8ae5bb03f7dbd997a9c935a55cefd104f0f9668ea3682beac7ff +68fbd047a47b2f31e775bb7c014aadf38448734b5077843ca1b0c170f212110e +0cddfd06af06c11ddd5d77f705354f6bb10c132cc3009c229360799254319322 +09b3f4cd6527dd7843483bb59cfccde571e7f0c3eb1097227206846f4ad2e0ef +20ccfa79a259dce46351f57e6e593ebad5bab102f379b3d092b4562a3ef7410d +c31c4e65b0bc5db4a9e62744f222f389b8367ec3b98445d18ded8ff88473ddb0 +bad0e15f159e29f4498a68f566e7f9cb93b8d49f4b896323a364bad3260fd5b2 +18de9ef59b9d86cb2cc3d909ce04da0711a6e609ef5766f00c21c1b0866df62c +1ab78933e58c6579b1db3f75f59063ac680a2c71eebf9eed664d261926a448f0 +597eb74549a6fdd03986f8c131436cb4d1c0c1c2700a8be389ce3b1599710199 +5f24a9b2a41c0a3d2cd603b0295d93b8353bd96266da252e13917a0559b1b17a +14f7d6bc5337a70f25f14a530d10a10eb00f9e3cabd9957394fac9e6d7af4f42 +c87de4804b581186ca91a8be760d4b95e605168f28009c8ac52e043cee9076ac +fe0454370fd4ed08294327d321f6f9269c31702c9e22ad65b7f1d1e5d88ed353 +a5c22be5a8bcc628d35532eb0be85229e66efbe32940d6a0deef0af4a712f9bf +bc42144f489e4f55d128f3c190c0580cb73e1f8126bd9af51007d29c5ba37bf4 +193e55c40fec90ead412ed8e67ae1706487b8b99a0053287a67f9394924fba0e +66befd41f5984d869e86ecaa2abe3bdcc88f0a293d4f8d6fededada3c95c63ca +f315bc533cf7684d70a535397e0a365e51b0ddcdc44695d64fca2f88dc830caa +520385dd0189477673c12dff1a8a933fcdd35ff44b378054a388659bc7d34b18 +747e91e762106878133ca087ba8745055fa56b7d55be79e87d1b5393a1e354b9 +37ca1ccfed929827205fd7f4c488c9771c4ffebd7ad282e35781db53a4980232 +36afa1c8285393b8babefdb39279cd7e81f552b60789d4b3e75db380e5f5e146 +bf710018254463c6fd3afe5d36e031d8aef7466003a59e02b9a33d47a984e10f +1467571b66c861dad8df92ca1fa8258b2e050905f754428289f2fa21903569dd +4f41d32008714e3274eb89df20e990e1f5f8e374d9a02c1d6bc259292c589a84 +b1627573ba844ce758650e4b06609876a3358b42dbab955c6be52033a353992e +e992e1508ad495437176290ed1cfeafc4f810d1127ca707e632aa22a2adc7ce3 +fd75385bc5b0b0599d9177f2a73228dd510bb6136d02bd456f8a4a7fdd7b61b6 +5beeb68fa6d07ebb2f326a9604a45dd1281f2fda33a2e392f61c0b2d358539db +8abded8ac63f5bee429ecfbb646482bf5233c568d9808d2d6d1223262d97cb67 +cad55177ffe979dd3d75f23885195d30e1052932f9b0f0b69f56d20a6afa3e7b +716383a3af055c83d81350c49f3cba01202ae59fc4917435fe2d60141c4c9b4a +10a737b86504c8218ce86564063ddba7e1f79d348247fc9a0e66ae45977943b4 +33314c4d62945b734ee2cff74e2251e57bafe2d7df36aacc16c4e7e8317a99f0 +cdb643fd9bb8baae7554a3ce36f46203bf90ad04d4308182fbe1443e5d9b06d6 +0f690e546f14a3b59e88c73f8cee9e14e933870e726e57b24ab26a42d208eba7 +6bb854b2616ea206249684c7deca7a2039cd56a8b61516f4b804a8e7cef8f7d4 +64d43dd5addb534af596e512989402c18e23ce24d71084f38ab320c95cb9e812 +d1b1e0a5985229ebee8c939a4e520e7a6a9509328969fcfa8068ff6d7d0b2554 +2a1692872457f852a723db78280fa52f7169b8a781429bb077359249e35a456d +70e023cdcba49da955831be885c3cf2cc5f70645c66d22ba02896edf191f6b39 +6a475fa8ce12caedb99f36fa1a152bcf0ef1ed857bda26d8fd95a8f47cec70e2 +7bc1c1e6b526ab9f65b0dfef215e559f8e83b2fab3bcd7a84805bf30d6302b12 +3f04d1df11fa76fb79a173c3698b9c77a7696c96965cc63647dd5517ebc07c65 +2bd13ef9ab6b4c85f1138add1aca375e3d59bf5f706951a378801bc3aca40f34 +b3803a4ff311d461c636c05572e86af42078ba9e791887eba8e2a5794a39e119 +1eabbc368e55362f6d07a4785469815210cb386fe46f837187c2934158c4ab17 +977a1a7c901ae294523c2876955387f47a44eb4eb669e05fd34a07eea12fd6c1 +18e86e83837a76ff03f38f3ac579489f2ff340b0c3ec3bb0f2e57c226dcac005 +fefc63ec5047983995465ff27efc036e879267677a8ec92b6ab89c5cf347d25e +68ae8eea58c00884e4061b05b22e8cf4eaa7754046cde1ff34ba093712179848 +04b598e20ece471f32f99b8dd2cded970c6aaf98250cd2a93ef2b539fa7ab354 +27c69e31bfcd9e7a5003735d4a477051fc41261e2fd14cacaaed091a2928cd90 +3808bf6f43f1c9c68bd3722eae14fb308786562abef6bb2cdf044cd8b0b26518 +45a0292d3f11cd9deea8197b2d5a33cc78d2c9e14a3289c98eefa1b1ea91eb94 +fe8b9e0c132a0a3cbdb70c9ded02a644b31cd766bcdb7508ea1f1ffb8a9f9a04 +f72a3dceb6b16673d20a6b7acd566a955247ba287cc74e6007362553bdb98102 +bd5a1a1f8df9e1c1adb8f290f659357b592e8a325ad1f9cf74136b576ff926f1 +f37c044961104de93de26a01a2d98b8aead9e113c47e9179e7ec06aa5148d1bd +d00f415d4aa5a94293f8b0266587f463ef0db2d7f10749d072faa586b674abb6 +56849caefe4f8d74710aa97549103a526b89bc9d286f0f0b400cddf827afc178 +3ce120cbd1e6bd83bdaae22dbfe752158801c42460b64518f8c7a374cb23617a +3ec662a90c324985c4693b6e80b88aa2e96f7d35323c0999f56f1f8db37f9448 +d6214fd1099b4a73065987a236a4353cb11051c1ef75950c2c03647abaa98615 +55907189bf0147ff0c5a2e1db0627cb316fd2e6dea8f8c9b34fd5a58ee6a4aa1 +7191e2b5a08818b72919af8173fce5863cbeed9b500c924a55e58252e710c648 +d41fe4c020c0fd607b08a4969f3fc7bfeda3e20897669f2ef32511e08e9207b7 +305e9723c52a16224e8d0f1bb7cf6f7b687aa5bfa61582d1d07e980f91fae736 +8b5ccd687da89c884c5d199518d0fc9b0e424e740aa04cdb52510b668c09a3b7 +ea5a527074cace5b2c4aee3c846c383a1c9acdec4a0bcba9e0b3d05aa81b573b +14794a9961ba4d80b4f308cc38f89005120bc284c67e670e35238a3a72498be5 +b84a88daef4ab123258918a4bd292bcfca94049ed9b7310834a0c6d1d1b4258f +e410beac79f5d5e2bcbec6206421358fd7ee8d5090539dd3565ac9cafc9c2768 +9d84a692b06601008390986d834cc44e0bac0c773b099501c02800247a1c81cb +85f8502e773fb41256c84725fefc59c6f39b3696ab0bf812c3ad445193b9dd02 +1efc04c8a1e13b0c6161134fd0679c029780537d6e9dfc33f8b30b2549e8ee6d +360d5bfcfcfad3083805e8ee6a54c4802c8e6629feb6a291ec26c9c393fa6049 +aedc546db31ab6377913737976822d44ed7d41325146f691604bffe6da0ca977 +821d9f2dc65e7099ad3a07b3cb2943b9d8e5380d8287a787de997ce19d37ca09 +2594b973b56e58b0d14977b4180f9753c6ba97e5de6f268bd0d9c6a81009d3c8 +1a0bcfb206e17104f491ab5a736429afa5954c1a65bb7df664b7922c4bd041aa +4a2a0bedb4fecc36c0589e22d20f961c43e19aaa3f372bf4536644c19e0b4922 +baf7b50b04b6f7e0a6702cb7972b82fdc443ffbd22144dd9a5747801c587ca08 +815578b8cb6580c773d297f4fd1c087564a90bdefa63ed2eea4d44a728c84d89 +102537f5fac46638aecdc4e07ee9bfe2981f5add3d96f49976bad8fedec4bd19 +b352cc3f804a5109f058aaf9bd6fe1808166155c89c73cda60287c9f00e234db +b787860ba0e02ed0ef5cd7eacbffcae54064cbf5f0ac568800689bf02341cfbe +aa1902087ced298dd82db84866ed704b83fdb7e28b43154084ccb8beb437703d +b3a3215417039df5532da395a2d5ba64f2c19354b5541390d58c9ad230675e8f +0ae43962fc1a40aee6906e05a517c949eb03ac9763a33c232b3fc0b728111698 +685cbc993a0868b467bf7df14645d70739bad8dd0e3b10317ea9df08ca9208d9 +b7491ab3732fc730bbb33f062662db76df5622999109e566e7470d2d3cfeaac3 +f7de6b3d715ee3055126843b4a3d0d2f7f4e671da66a2bf4eba18fb4ce3abd5f +2fec20771e3647980766da5a9e5618a36e0c1c1b37f0e2732c7e0db107cdd357 +005a12ee4449f8b57573ff8b1dca68ee16875845ac77e89b8d3ff57d046acc8d +6e8930a8484ad26389fb6dbf0df6ae8b1ed9e689b6dbf205e3cb24f89f54f6c1 +240c693a1289a36bd5d286aeb94452c7d1238db5e904470bcf411db0db9b1a9e +97684013ad8e8377147869490ff59cd008c5a5104d08ba192f96cf9752e3754f +3e7850bcea027eea59aef4b18023f4b364423087b56b4c22e3942d6aa6a16300 +08703e93bf8a55509284cd1776b0c8c40777096ce1dc9aa6b5fa28e8a0030d39 +a9b64b72bee43f829b544172668b358b3cf3432f6d838ceb488f144e4b500ff1 +45a0edae69c61b7e457809392cde962540f36077803aec3e5e637b9ec513b623 +830204a7f532d6ea27ee2c4a2969eddc749c0dfb0d8e059a9e18347e094076a1 +15bc162c4979ad89aaf5ef22a715eeef6aa356e39f53e122259f21ddfd91fac3 +b8b6df3c3e91644b30102a9e656e6542926c13cc8401418f1c6b84953e527c3f +dbe3e76e2edf034b63f68c1905409b5f03a2d5b1bdeb97dcb8987c06f877603d +0c8bc8621836c082310de2fac8584fe5e453c3cdd1963093585942eedbb099c1 +1b659943eeec493efcfc13a1628b63e101a0a40ffac0dc492f03062dc18c3665 +d0b7b37cb756fe6102bd8590705b9de712f169514b8b6aa528e42e36012e0e57 +1de7c4cbd8a2097f0b3e4d6b240983657044e7184144db4d790d552e9d7198fe +b3131ab841d51d2bae989ccd6525c6f8f52f536e9a8388a760402af7572a42b4 +f49f652dad74c2e3296aaf7b6005b5e3a8d95507c145744f071c6f9e71c43cb5 +7760b0413ef195db30aa604b362de810c56d438311cbd193e540c68dd86b296d +2b75aa450134ce06d0084c2b52e7afe6e061935084759ed8b7bca87e58985741 +53255144a2c75fe57209787204a562a2d5a8ab5e14816075be42e56a062a695d +13553f37570985410f780f849926da1470240ee9246d36cdc06082425e381abf +7707eca0ea73e1ebb268494b190b020cbfc46d54e14bd0ef6595d49ad50fb1c4 +13b1bdc640a3a249102f3057855bbef5f17f1ecee2323fcfc5f85ef23a75e114 +8ff0538bf1cee2bdd9535aba93abd484d837a88c36f6270241205a1e1b0f50f9 +acf34b5175d5c41d93d406a606ba5a9fa4ad177d73b2d8e830fec7280100b0ee +65329c638ca69430f227ffdab6d8535ea52cfc4b31d6edd1c888049499cafa73 +51d205e533ee0a11e531aa5b7cc7daef28341e15b6c868535afa65529ec1fb00 +ba680a5f9aa6f90db191db3c0a19bf54291beda8f02f73e692075e1fbd287bb7 +1ee34421d52715b3a1bef464d0af2d367dd6be9ea9dbd2926688c09ca1a0e1b4 +3261a0008201f1663d471a3d758b28f1c5a8be1e904502e34eda86d92b8d420c +09febfe3f294e01915a8feb99feceec3c3a910c53b475eb5330b2541b41c701a +d17c810a269767abd65426b3e95b33ef098ca20606c000a8e906332e25e6471e +0e7d662bdadadd4ec64b301b415b8b7adbed32fef6b484809c8e8bbb98d058d1 +e68fae1442178c9a357ef1239b8ee076c7a04381f92aad974589dc543a4513b1 +ff178b50671ba14780cd777efd5bf09ccd81c2ed6e3bc723596ecba121403fa7 +e832bc13e5a549c311001a113e6c35786a65e654f83527e319233ed4130d20d8 +c2bfd29ee477e639eb1493d09078266056bfe3cbdf1e3181c607ddc24140ccee +fa9c2774246f2c93e7e18822f967b2d67035476dff57f0d9fabad245c3f7e287 +351affa20a22dcac4e8709ecca97ce660172a5a896ec58bea7f2d45ced2b4885 +d27b124367b65de5397e773c2829755972821c8fc029d91ed777532a6404266d +c3e40c32358049c6fbcb6b6e0827514d8064d0787bc4e232465908ed25db2cae +e66d3160836f0ce4a9fe4c06895772f31fb6a0a7db32f965845a6b12d3c018b7 +321e63aed1d54fc0429ad1a022c44f7ba340a3d584cd587cddcff7fb299513b9 +3d4dce430e28af6a12515359866ccd441c912c8f4f1bccbc00a651688a909516 +567a8b6264da305812330d6a3482b2869d3e108ce3d7884d5a53d20a84f08fcc +359dbf9869295eb94e154dd58c6097a8feca591e0039cdee5415c768facc86ff +1784aa20e914f1bdb3938a137d09359d65d5351d5aa30c46d57444254fa97fc5 +2aaa91b4c5a350b5546a1c645d28d60c9e2e1c172810c3f522a6a982c442d262 +0215def70617b5facd0ff4813365e817c207163d58af491169d5170871c4e353 +2cf911c2393cd627c73d591b500206f420e7ed5128539ff74faa798ae990df72 +d72b7c724070b67e0c032b086b11760f7abc6ca32788fc0f382282fbbb30c453 +9a8f3c793cab5762afc63b996421411e25bcb2466f1a2eb451f20d49e204a006 +51bb615f14c511c57108d08139afe3b1caf4d5e26af909ccef2c4da1df7cbac6 +445c366d5ae5c8c3085411ab5c27a9a105501581c57a26270f809b6d6396bf89 +025115d2e8731d378815abbbb637d13ddb8e871374a58fef87c6586a47dd99b5 +bd8c4749ba5f1f340a8d3d4f237c9c5a57dde560443e1ac655667ad624fc9462 +c18a75317bd8b0e953dfa96871d6a00004fe1823264e04966227cd079564bc50 +13ba790cb1856b33e3b857a5e9fabf0dea0cfb18fe337d6a0566a72484631396 +e5b5ad7cbc0dea22cd13a8a4f077ba1872b602160a9adcaa68aafc759a78363d +35aac022ef55bf2c760fff76c16678bb74f3a9206a85a4adbf6b0e3bb4d3e4ee +b3558f6bee823a48f62071eda0c220023cdb400a28251a2677daf9ab2831bccb +32143cb4cb8ec6a7c437cace06240b09f6a8fdc7786f02af0ad7c27747495c09 +45d09871028c14ad33d661bfd0ef987570b10838af72315ab79c7e4186ceab72 +322b65635b9c2e839a610505a43b82f6e84a43b2b501e5f9727baaac91224f2b +b268351a72fd17d87e951d1014ca44199f828df4efb0beda1906f858374239ae +1f8b1f957b8ae1244119f72f035bb6d65385ca0ba155bfa9c97d176aa1f66b3a +ff9190159758d211c45ed2f1d6aa919409e7c89ab1eb46285fa3f062b4069319 +515e88cb84306a498a4f7251619a7b8c6a8ef6430a65da49563d82e908785b70 +bdc12a18d08f7edfe7dd8dfda3c2a13596e15af4570bcec1eeb14d29d5ff662a +2958be2cd3333c3aea2f91b20972246d9a61a7732b238ff9e233cf311c49bea9 +a83d354966d8e964b0518f0f5f16cc003b589a9da8627101e51cd2ff759157a4 +8a9d9de94c6d47f1579d021482b8eff62393b1285ea5e521ba09751b9b722d77 +1690529076e745164716242b6dd41ef4fc5e95f15924b43f75a8c689f143ae87 +f5e7887a9873697a8c4131352911a8e50004468c72482b7a38149e7abf8534b7 +2388ed5b8cf474b3a3b78ac89e840697205b569eba2e85e2f6416d41149aae6a +9434f7e8e95e2eda2c8eb78925345e59728da3310e9d5da06b3b88569cb7677f +f348e8ed02296d1c2d4523a0843936592058e916dfc0524a8f240dc760867dc3 +0eb44ceda8f3d98733378ad7b24795574cba77f641a4498102296c985f9e8098 +719c0992a5b77292db052593bd5b8020c8fe583a46e804c00c715f1004e627e8 +bc976f9208c6b3c19cecf6158f27a80cae345ee464b2eb14ef033be31ca9b0b1 +a1dd40d025d2fc0ec2e40900a596bfd205803b1f4341933e0a998100e343fa04 +9de20c2534a06deb43f8f3d0a2a65dc9dcfcdc052282ae177f478048b0c1916e +e599a29d36fa69075254e29ca1d158d8c7dcd2f7aa643a3a391380dbb5258d6e +75ac53529abbc2bd29c803285d2a6be5089fb84704291d4a6219c040efb8f439 +07261d057541ccecc7846a3b8710c47f35a490a5078a6b4271e429e77782f315 +90dec87f91023bb8c9d9626b8dec28f4f15a88ad2378abb01c8ed262075f6f96 +6684c0b0c987daf6f52751c00c45c390e3929e7364b1959d5860f693b2e2385d +5dbaf080163e6922b88824f632ca07585d8607d9e5af14980558e6fde1008972 +fb77980aea10e2fd441a0186461a802572a6fc72e64925d7acf6f60f3e5b2a93 +fa3c76bf1963936286f496bedc875a1c6b51b4edaef334193de9f0a4cb00e0aa +19de0a3ee0b1658deb23de3912ce82982f7666df1167794e707a5dce52c620a0 +7a8d93ec150f53f2ec22528ea4514f5e8b47159cb7eaeaf5ba779fa274e34245 +1f0969e3315af81bd0fe268ceccd1f20d7ea709a3af61ec7726863ff1e5c2b44 +5d6c1da0ae53a2e62dee5f7f1a518eaddd3a9905f4cdbb74f62a16ad2e9a3ca2 +16a2eeb7da59521b43d9b358fe7fe5b252850a292a0112d22be0377b6be31696 +e342592437c19cf0e5fbce729c395fe046bf9412a3fb11e6182f53ad1124e129 +244b19c5dde1adba250bf9a82daea88ca70fef20f81bcc21bb7547c65c89ccc4 +8a62a161a541a984e6284cbf2e1158f053561ba3c6da02cf176afb494d1e020c +dee46d50a8dc700e6b71742dd929207846dd02ad2e5eb5d0db70d6267305fe4f +d99c1f9f8c260cc8e521d2ab0aaf5baee24e2b7a168aeb971aaaf2bf207593bd +466fa0a2dc24f2951557d02af2de5a05ab226b2fdf7d95259814db46e9e3f069 +12ae5b7b5c93a3b024922803ef16112acb0a383af5142ac274010d4ffa4ee7a4 +b5460fc628b6e8ed5f449a4e879c8af7550e7ece8c63fc00b1f31a7905251a6d +477e0b9dd1b42eba39041a54db3ec7349280eb9471f09b507e2c878a5e9aa8d1 +3f6a0d3e127ada508e3685a272ca56afba11347addf873b229fac5b047e2c950 +258f7d280a9cb608639702ae9e78ab11dec0bd348a7b9b43a53e30afe18ba463 +36cd658c82171f41750ea125f7bdcde7837c36b8309f8c7ef757a08dd3eeaf4b +4c28d8308556afaadcfca572e9cba9ea6bf5ac682eb798bcd62f5e4d97a8c6b8 +71d0de906248b1b103f461aae6eb1ee2ee0283cbcbd662c94468128d61eef30e +838075f383b3b4606c160bb9e702c2839224342685ba8673d284f80858530460 +5b82b2d44ac5ab01b426bf49a38647870889fd8c62fc5c34d3565aa0ce8d74ef +1fb14c1cd8d6f4f1306166698b0fc3c0446cfa14c6bb2d9f6ed7d7361f8fd573 +d4e032772529fe2248699a10b305132e0b0e03f8c709ae75034468f3252be6de +c005ddd79a854116edcfd4e17a04e5f737df69e0a6347930dd7dd8cf460563b0 +e85af9fff730731f3778faf6a95d696075fa932491fee95b206b652de5e35a82 +0217f13e9b0cd0f7156859f1484f3ccefbfeefa8ac8f006299f7ee663a1da3a5 +142999b6b0520696a17faf2eb7134e8e2b37664686a6bedf2cdc70fc66f7e970 +a0476a91340719ac17958179770cc2c0e38a6eb46922af669a531aa0e927fcec +309a7b121fcfa2cef327c4e71ce6a7fdaa611a0db34ddf0ab5250b8dc6770384 +c49ae556dc1a613e98f20a3792699275ed4d187c87d412a15908b6832d95ab4c +865b2af89c0e471c46fbc6d0686b36af4b12c3684a7f45d7c2d9d9817361df14 +7c5e95c3a813daa7048c0028afd43bdafcba03c5c74309501d0494ec31671d29 +b30cb884d9748f0e2b7a8d4e3ec11bccf9a491905628d2c4b6b40f8bb5d0b9c0 +b0acddfc846d84487e9c2e7f0d82b991ab2ff2140770f2492e3908b6df2d86eb +b23af04389a27cb3ad0dce5528059a519a6092a18f3a2b035cefd46d885d4654 +24029359070136db35c346acb8b288d36dc85aa13231fce659d4391a8f5935cc +c8e47200f97c15b8ebb5b8abc023d027bb5e8211d0595548e0c95ea47bebf498 +76ef585ad3b76331c75fc41bdd44d82671ac32fd665bfdecffd4b8fc61255e34 +58476113b59bec5aa15b03d623912276f1ac560c0cf18bd9043aca2c28e805d9 +d03de88dbcf10aa9d7d0b1cedeb5270871f632f7b703fc8eb5020e76a638bc75 +40cadbab7cfedceda58d0254ee7e8e48920b21a7cd38cc350cc6b67bacf468a8 +a246fabc596a2675c1fdba8cce35c28655d0e82755fda8a8b5bbbdee98c30d91 +c81f08cd0f809e1d55a046158365e04f224656a6c46a43a3f79fa2d55cc6e420 +fba22da808c4afbb03f6f7b0d33be67f9883b30a1c1fff85f78badad279de4c9 +77f1d9f16a5b9b7dc8abfc85488f117a5cb317fd5c84fc1e59ccf695892e6ef9 +26dd71c9a6c342a877406f0258adf45810746c1454627eee0b7ccf94ceba76c6 +7f1ce137f97ee6025a23ad42a4cfc2ded9bfe7e206f31a63e65bbc3e304ba088 +4f0e0738675e2a4535283045a69ff637ad95c9e0b86d834726e2ad29ab3a03fe +71ec91f8c8564ccd0069b552ea28867440145f767db71486d2e38e5a0a3c6099 +b6d3b57ab4513a0c25897b46410c783297a9b280f138bf91bb17f4f5d5bad5e3 +f858fa265cb1c1b0d0d9b84426f0ee6e4f5ff5deb2e50ba82d3405de51fd265d +3fa7396ab39ddeebf8bd2b61af0090e349863e88c9a5a280c4693b6e80b88aa2 +e9609721b4747b18008df3517ed1331f1dbfa46b00155288b7783862ea9e6498 +52ca1ddcab6c190aec0e25927e8526cdf32030cca61f071325cda7e0dafacf8b +c3cadc3ddee55640a7c627beb2ac0cb38e3bfa38f9c3a49cd7a400be740d5f67 +e59582031ac46c467fb35622ccc7b627718f858abe34a43e5734a74681ef229f +757dcbdb302475577d18d5cea044dcf3a8026ffdbde20a2585fc84bf53d6504b +ad3dd458ea271e5bfb498f9289849349a0c8935843db2382069eef873895c978 +341bf3c1c9535d13ae4ef05f135588edd96bec9066045199a8e76582dd9c957c +2fdd24cb36b53692448ee0db7b1689118fa13ad5f73107bf0a59fdb32a958438 +6d9ee99dbe469d3831f43773dacf2a228276d076b9144d6b70b315658dde76d5 +8b949e998c0f4e0c2f5e2e888bd316001cf0c981e9c89f69ab39c6892f658eaf +5c754c0fcaea82eeb8a443cce68fe5cbc857d99df78215f00b222f799130b7e1 +8d985455482cdbf5b9f8eb096fb0966aecb5bd5394f4224d85fecf80632fd858 +ea3aa8bcb7834df7746ac013d8b980eedc405df342604a8f87d92ae38e5f758d +4ace6d05c933347a85e08e6b796e6bb59ed8c7fb72d1ac04dbf57acab8875e08 +a5c4d4092166ea473dfa9c3da7e61c53b2249515365cc89ff4e5b6f4ab5d2514 +9b2f24ede7e8adceafbd8ef9d01a89500bc0ed3ba5d691dcd4719f70527ccf01 +ad15912e288dc397de28a0ca73837d54ab4f67e36dfcde2d75bba41fb152b312 +0eadd98894d332b20ad05436a75d0874a18fecaff6077db4ced96a6e91c2e4f4 +65cdc8e73b23299317a7ff4b4304c34ba43afd9768200e141a7309eb837223cb +be451fc43db69dd2cd3b1cb6b5e879ddeb6990f19027ca2d15a90d11d999e519 +d7ae9f87b009ffd95c5d3b5f8d0ac22629797ce6374451ce62d659ed1da0a826 +26ad8021bfb2db4f00f81b8e524b217e3347c2f93d9140e817c7b49ee457b9f8 +1f5b49c665ab2468ae83b087f3b6454913f8498db5d8f2ce02af56f307042c8a +290bdbf72c24ad3678e0c527129817dfa5240c03ed78153e0cfe712f301372c8 +bf4b82df2ceaddf1b819b828af9bd9e595009c1d96700a14a2ba9117a04dd425 +bfa4672d7f1d70df323fe6efbccd582ab3154358212cb5e4d1938b097185f53b +8da80ba35ef2bc26b88b8b0df9eecbfaeb6fe80893eb48da291b5b6674c009d4 +b9a473c4e191b673d693f865946ea5c448109eed42b054cbb3a8b9bfc1b30b3b +d021e90f56634c81ebfdfe6d00c97824729979b3e58481a0f6186093e4c74807 +04ad223b1a696fb51777c5695bc106ce57811c8ee455006f60bab6b6c43f1fc8 +c524674a638ed65aa0597ac1ed7052ab3f3caac9e62d806ea31ebdb359b005f6 +75c57cc36147841fcfac56baac914cd697fa2052eab5bf27d035f65cd0fea717 +ab06306d5901ee083f929cf13afb5a54d000f61524707cdc090cba1c46868502 +9b2469b0a29ce0178d61b66ce2f6b56d8a3d725687ee03611ea42f31f29c281e +8c4dc1a783171441278cbe383473f7f6eb4ded8513c5e14edb793bf0c98fdaf1 +1e939330122543d2725d3e700e0dd8205e8c1d16bea0314f5a1e993e0bd1892d +cd04efc67b855d03208086dee33d0297a853a1b913e71c7dc495984f7da86818 +7db70ab6e86c974a4983ae863927b0456534abdcf265133c00c42115455dc665 +6c1c683a43b373a1602efa87f4b3a1be04da20f7f51dbad3af313a5658093b25 +5156bf9693ab3ba5ab071cc5415e1eaa29160f8090968fd9dc458cc8830b500d +14682c560683dd5c3e2745bd9935886053181ab7d323e4b993587605ada1d9f0 +42473496e8e09f9af27f287c29fd4607a7e246fa3e77666ef78c0a0ce9c3c10c +5e75ef7385aa2078d8c98453449869d40d39a720e345779b5e20a3565eb47f78 +48bca3ca0e04daecc57db1a18ca96ec60b6ef42deea17246509dd81542f667fc +6d3b808075d84cbd3ae5821ea71310369f5b31c13eb0d122400dcc9cc52ba85d +6a7d2290af5e21268eb0e837e4830bdfe930ea91d4dff36ea26b2c4547437336 +4f5d8fbbb4ced10bfb1f3afa9e804c31c08057140e178d37408ee6f10b1f2054 +07839a09bee7931628b0720cc62160b3f541b2658cef64da994bf8adddd663e9 +668bf56e93e92edac17b9468bb02b1d90bc4dca43a508cb33e6d1f0ba5ef0f3e +cf43109894b73cfa7484484cf3f18451db8c0993b339362183d42edbe0c1bc76 +9adaa253eaecb81286a4c9ee0a89ebf9b85c5ea0198dffa514a192fb872d15cc +f70f773dc58a8f1f05d710f1de541327eb795bd5b3e5bd01dbdebbb33696242a +dc92a04dca1323151227dba59dfb17835f5da70889940e3fb886ee4453bddc3f +f02944799dfeba4b46272ae29aa6748e5408b90935a481be47303e5227f2e230 +5082fbff2bf084a05546d32b918ff8ef71ec86132f28a52777189ba8d05b1d00 +b08f9a78e37bea0b42ea7f48f53be4d72cef03c72ec948a4c23b16e7d3b54ca2 +6cc77493f5f2a767c0f348a0c85c85c544b0c24709e52272ec14fe72c719ea24 +61a1a842c599d4e6b8f175eea17429415bbc70b71433047e73c2ba5c4998cfff +30172a45e39f7fe86ad780ec28b9cabf4429b55ae8aeb38d6027922e985e725e +0a4aee85139bc1d3532e00b80b389e9d4c8197d0083323a495aa6ff75b613bea +94ba02977f79fa5752418ba6b1f4def3e66440985c525a581e6b75bf81997f9e +7d49bb437b500aaefc8423c1ea3aab735f87f7a17958a20e2de998148f6d777c +54ab5a128ea1c37e65d14f360c671745a2911313d174f12214818ca417e38670 +699371a1f7ddfc5c1634bfd34ba99cfcdb86daeb368e5c46d79b974b609448d0 +90b832c1f958142754571fc98c9cd0270fabfb5e8466ccd7f34e56c52d086161 +d6def2b38cb28a5126a8c0f233cbb7e5b4bff2e0eb4c8474d7e0515b14fb7702 +5fb5c21ccf4827952e2e20757ca37afcba30f4dc2b7e9a66aa9ff34a1ba94156 +da92b255835e8c8dcf8c054393537ed4b9fe616b1fcac41724a19abb7a1541b5 +d3e5208363e42adbacffd409b8ed46e410bfbde876c1b77fdff235bcfdcff0df +65998b975a24e2614a2a8ba89c2ab9f41469b409ec9e0a5c4234de73c630f870 +36060c9f9f3111586739972b638da804ea935ef2e74adcce254c9efe1bc00667 +9ac610b00a9c00a1e3ff36f5e982504f2fadd1d6c3d458819bb0359daf480777 +4d7e2cbe16f16afa47155c1cde36125d5e89432a508832c13fb8c7fd5ebc6440 +49814c8fa01838117f6d298baed8cc1158ff99d0a3a6c8e5231fb6aa4db98baa +216a556c04bf0e6f39c8c30f39ad1ec64f4a0db2827652e8d354a821cffd4dca +d23876224ed57795ea129d045e387a45bb88372e47757a16115b9ac149ccbe30 +982ad2a9207b175d2fbb72752e8d3dafbf4ba5c02c2dd6a15fc0490dd0f6324a +ecc2523ed53e2d5fde36b3acdb5609d70809347bea983fc6db80888420d82722 +7d1d237567be0c9c24a585c52fe3cbec727823fe2ec67152944ee35a65e7a005 +37e096939e42099a3cf73e4633cdc85aa3b4a2511e27223e0053fdb65eb85df3 +54009e474bda07b6a07da75957e621bcbe7a1e9d1caef92565c5a6c73664abf5 +fde175a64314f6b166351af7acb166b6a0bf596288a5ab613b80db91ff50f7ca +17e99d41d493031d1a5b5038303f091153cd08300ac6c3cc15860e33fbb3394d +e4b383b97b77d8ff0c2707fca55a838e0a2b5089fff480af5a50e6f07b29945f +789aa9333211be2ea8e425e00255f5a3725cfece8d262202a73db785b39e3188 +55abbba63de9c53c24bf11125f6f0d3b412f777795ab86c0cf9d9d43a2076fe8 +828085480e7adbc77fb137f8bd8cc8d26ee6435e7e3b2511e7a7d7a19d330d17 +e7d797061428bab2e7c290fedd6c0de9bdc2c5b6b2496b8356593c570bf8eca9 +c5aabe89434de698fa17ff0c08ec3cc13b60b4c3d3712df8ee02ab92a71cadac +3f4cc5e69aaad92774edfafd88d95ff90c9781d9f771c143b9918f554e3b3497 +4f822ccc3e473d345c7c598271e59456d2b1f75560fa36b02d75d040c23fc511 +506955ca16901774f7b4b9d2ff9f4e0afd79fd66175c0dc634e932566d067fda +e40a710edc1c893e919da8baeedb4ae0f4ecf0ede9f08e43dbeac3e62c97fceb +c434c60ba5c80d15f79823e25563e2d746baa0ef31ff6826c120ccd9c2323844 +9a48a624790b757f9f8c03e1c447c16de51104688d79c87461f610af5daed900 +748acd52bb3eb9d975d128adbbe794421c434cf21d0b07c33427b81a6d8a4c97 +49e24142d669e8eecef30f35a96390b81ecaedf8bf65edaf9fa12adbb895d631 +986008fc95aeb2df5dd57a4e09582d9ebe82c685c856769186f36433400f1be0 +1daf022f7c217099e520d05ade233feaaac372f2e7f2067119925b801698ca24 +12976934dcd628be992734365ac6b522b098c7f3d788eb86f045c6c9fa7ee89d +2d84a923ec1a6de6dda87bd949867b2a6d6f910ec58519088ed577531c624d32 +bc7c62116630a4ed7af8927fb6c4f4e65f000c69910841fb600e1de1c6a23f5a +a2a5d199d79005294c66dc160c38a880a11ec92942c01ff8ad5e5693f132b238 +12c90045fa8d0b60c6b868f0c7d2a27815e196438c884d2d82222125d2219356 +555f8a67d48a13b3662e988d03a2dd3b648162884b715c89d7021be05917ea43 +d1be90113ed3b3af434ceec723ac4cd314527f560bcd83e7cb3a764fdd8f09dc +f1f1f45fa4a47afa6401420b1a2a6cc0f28cdeaa0c83c6cb35fec7ff2e432270 +78d283f79547d6689b5450d02fd13ba6096e37b08ca096d942cb94ed324cb63a +55c9f171cc29eda44d10545dfd8bcdc4afcb26191f92d0c61fea1b106769e9d5 +234112650aa8346eff624a259f3f6833997038e24fe4b74c459b14841e2189e6 +2842ea4cd2693bd162a9e90ad5ad3ff82bc6ed2e7978093b9bf4caa1012e6843 +5c34f01c470eb39483e22a1e67faf26fa74ab7434a682072ade050e72cc73123 +1505db7a7b2512ee6f8cedbe6caa06b939a440c9e5f0d5497611c291fadb0948 +1b19186861938233bc62228b15171612f026b677601715bb4c5b1f2ba72db37f +d15c629cab69bcd96ad1a6ed6533b09cd3f6049e6d214caee58d4ed72e9f502f +9a9f5682398dfaaae732b6306076deb3921685b419f41593a46e3cf4f7de9352 +950d1f0a6843175138e8589d22efa6c4996098ec3946aa1fcb1245625d7c4e1e +d18abc806cd490f103da453ccbd52db6c97ebc5df69a3f94229994bbcab8805c +975b57fcb6ab0221a1c1c553cb64ab882cd3ece7da6b13b0505950c5d58ace09 +fa7a0e4ad20be0733d9d540918922c588bec42902f9f8278dc0d6729a31c01fe +7f90292b8c5c006035ff40f28498f88ce4d9981abb7c9c80b915f8c12062fc89 +2d49b55e06e3d1220d1d29c7844e96c259bd806ba601a6e6a1d9f34f15f8e10e +945679f99ba204fd1b7cf84adacd615e858dff1365aa779b241c58ca6d07ded8 +81dc8c5cefc435b9ebd7139879674385c860251ad25d08745165e0aac6b46c61 +49fc0da7baac61ba658ee976689ae42c13d2b36f2fd0b526585b6098a6df1f11 +a3943366fab8eb81c4fc2f1e510b4452d23c41e47849b1f15f992e9428e8926b +8a28f15206802507f5dce36de4cf257e56dfb6edea19c9078658c32212005db8 +5eb640885757fa5fa468f7267fd0d89dc2814828c5b1113b7b276093854b5fc6 +88a01863a861c535e227e98949aa3db4062f52a88a0dc7ec40d7c8a92e972982 +a0f7f6b0eff29154b5d0297ed270948f05fdefdae6126ee87a8baa0469512ab9 +c2ea9ac48d5a01d9160a3e38eaef6550cb05dfeaa33ade4de76f4ca4649c69df +2ea79a0f787768b7300bae785977076d4777bd0c76e7bc23f90fceb533dba7d0 +b9ce8ee3de306315527bc84ae9a14dbae631881f485b88412a5d56f4e69438af +33ef583f8e6516b1bb7414318cf785444cfe87ccf1a31af08f89c574b8394a0c +7d260ef39f50feb4df3121ccae4ee370cb6a769b40292d559de8cf00700cde64 +439eb7ab50b0547252b14ea1c88fe9c6f3b5ef5ecf8ccc010d488fc3c91c5159 +e0baa7afdf4af77778331e7ece03d8aeb6de3bcb9ef6370b9fb01855bc68ac19 +476a442d3c5aa77f9280e04ef51960b53492665b3a6d0e5d95bf545ba3b1d2f0 +b80cea9b814ca19fa6399e2e93280ca1f93a9ff39cf7ac04badc4adbe383fc59 +e81c19fa691c829cc5fc63fc56341b724209becea74960adac6e033e07838b65 +20ef9a40db38442544133888acefa9a6fe282e745af83c5e9d9acbfd2c73df57 +7245f691e3012c8ab3d9aae16adf1791f2de33765d2697a3c9cc01955d138831 +87b46d44db880c7bbfb5f9839b4800c592ba0e96484350221080f457c2ff80c5 +4794387ebd07cdbe2dbb0099c078d7ce26c89cf4d47f52b5796a6a861c2c3bbb +c28fc7321993e18295721898a059af827be695a1466572488fff3b00aeb24306 +743bef6b9616e0e69c6c123a86049d2038c9d58b13d43da51f4a31b2ebd6f84c +c72ff201ddba0047d6bba501edc889ba84bdbe82845df10f6af17e8d32cf3c39 +a8e9cdb6fee684b9053ac5bf867867745c661b4244a6e9d416b96c9e7acf7c7e +bf3e65a396917f5f3362091e221f30194efe419b15b01c2c172dda86af46b1b2 +fc5632820d48e1292694a3869d0550c7256eea172fd2c2c51b52b6a9204bb040 +6aff5c3ade4d44e7ea6b259aee7a2a196f96d8df445f6ba0439787a2f9d56dd0 +b7e1a48bb48c564f83397e299bb6e4de0a3ba3ae171095e1f29b30dadf456031 +237754be8fc42ecd1a5c2c47ba0a4dd454f9ad43b772a43f10b93b9f21456aa1 +0a6fdcb3dd43c9e9fe0029a3d78ebd534f1f1373caae0e69cb63551c80bcecd6 +ddd726fe1b8a10d46e0daf9b028f13cf4f2e248915eacdeebd403397077143d7 +982fa3be9b3690f299de482d9d9d30d1a3c73fc0f77a5642ea70a5a738c4a203 +a0ee361178d65dd9697f0ebbe7c03945e9797c2b4fde79d251088b54dc011dac +2461d15a29f76fdc80e3ed21625a1ce5ee5848b32fae9fe6db0ae668d5fab8d4 +65dcfd42cfbebfaf42b5a2a604c429c29031dc86fd90161e9d25f7426e485171 +d6db1381147bf66d92fa199377109b05723c5b2dabd5dbc157b89b7965b07dfc +bc1271ce306d95d2c75988978114e451e07dc5ea5a0a7ee2c4b5b560d8e63661 +52b8175c258dbfcbe57fc8f1369238118ec7c1ea2c8183a6bddae0def782d71a +9f0e4cffdea4ad89fbbb351c139133936b7d8331f17a14faea91b0fdc69f7b28 +c63c13383f1bd915c08a74801a12342b690288c0be035bd5001de092b0b0e04b +60d56735d50b99f9810588aa4231fc6c7ceeeeda1f5e420c6e8d01a0db4b1b09 +51057283a92739d75e494c69ee7fdcea905eba07480addd991fd2b7f066f84a7 +bd6c7a24a3f7632c0fa1965b0491dfc426e9efa2dd53c6cfe9c00bc1ade9b3f1 +54943704d3ef3d40cd97ff5c28cc2ac0709d9e765a06ebc729f16b442bb7eaf9 +6b8382db843cb5ac8c3e404b765ec45dd2b4ed24ba321d019592a37b2ac208cd +450dc7107b57a74e9b7381dab65d48548c665f7c9aad56dbf5d8bc64074b186f +abfd2d574801fa6ead0e1d00908456f361f17ba2c74c99ef7e26b7e8032b65f8 +ef19777bb992383f1f10d363fe7bb8ab7ce8dc304aacd1b6ef1b6b65d2d41d83 +0910a514c3059bef3f677b92fd2601917842f9836eadf6cd62a1100855bab14d +225c974eb123849a23514d1f50c622b258e59cc367d6cfcaddf27630eaabffdb +5394b86e724d634868ccc7e7991bb2997631f8fb35ef850076128d65ead586a9 +95cbeacb7e6de8edc0b369742cefcaa38775275a17a6c83d0a81e323fdb8bed7 +05f6261f7976f6f505f6c97c12f80eec0cd381a048ee9c7a8a05595af297dde8 +79803975697c31da784c5ca16c668d3b7503b3aae5494a4d631929870f9e603a +38e311ec4480e366c79d4d03c533277c4aa585f99a32475fc691c2241b00ccbb +c55c1e9b14851f815b162cd057f1bf85984a3393aee38c0b9ed3e9722495bfb0 +b13eac7d28d2aadaee2b280e48e5179743528efd7042ab6b7ed6dc2f4efbbce6 +ad43c35a3a0372814b1d64a342ca614d5e601827c1c18f8a347de9573b1f55f2 +2a3a3d709e17f7727477a45a4fce29efae3e16b80b6df52a4abb265577fc4178 +0ea7a98238174222eec322104e04dac53af8867b5bc0334b02f634602191d4b4 +960b4f482c46862a86e02f4c0b496d1a8108cac762022ce6644b4e6092353146 +c9c42942a74869c9351b3101bf15421a95a7ca34158a56e7de3a7d45d4fd2bdd +f1f5b4e5b3bc9f7320eac4f94655e8a42c7799314376d6fbfa29fa8f836a83c4 +c1fc3dec65d28c408d8f4460b12d6c63a323c0533110c6b6809d1867110f166a +3b41da821e59fb8c8b75068dcc4c8f8db77fef2e5d5cc965cf091b9f47369fa6 +1c1f5f5d501b11ccb9f43c3235f94cd287b944ff7203034f0985bb163054afec +484e0e6046aeeb50ee74ac84186027cac9891b1871980bb94de61a47c7379204 +cd8662b17cf066567c9bba779f76edeb13d2ee996655def66a0cf0cc59659cfa +e416a40ce4b7ef774185e79c76545ece7c498db03fa717a591f9aab08c167ec5 +f2b4d9bc25478aa6697d0edde31041f185c965b263acfb2399c5695e42901822 +543f8830ea58e49ec7189ea0b6bdbce349ec55346fc238a7a6c4cd6652c6c30a +b5c8bcfd382e6a1fcb1344323db38fb9829e4ef506b21fa5b6d58a92657c05b2 +09adc73d93897867cd867c915cb7ccac7f1170f9a6c555ccd4a097574501b6b2 +565a57e5c1df5adf39c5740ae63016da9a566d7a830ca624b5b4c75685c95000 +5de2d662500107686eb62b3a8f7f9f72bd6071c85518741da3b455249d84152d +a165aca84daebf9395d469146bd4e35452d00f742905c9a47ae2040e136e8e62 +38dd0e9c0901ba3a9c3216226c44b1f80e41c212daaadbdddadeae082b016305 +54798bd555a251d380ef952d085457041fc51dffb6eacd582ce2e7cd1df623cf +9237da7c39b2167c7463bb427a7199588a6cab503aed16238c68c250ad9f1293 +b4904d843ee27e2c1010ec9f4d1190a11d986e8ab56ebc5615134d52764a3ebc +a9aaa1b7d5bdd1ca23bcd8fef9048c4ec2fc1b60853930fe82c133bdf9021102 +15ec5dca1d137a14e519bbc2e35f93508753fbead6543c66d40b28d828be75cf +2f2d3e116b42ea71772e07fe42f298945232934fb85f9b046e8fc56d843f0d5b +ce1594c5bccf37117111cb497c1532afb3ab347e3f555ba63bd47525407004bd +8ac2f37f632f253ed4bed95afebe62f2316c225f32f1ed41fba0f84d49cb80b3 +cb5503ff106053ea70540e3732b4474e5b6e1d53aba1b8ba36b1116d2516d883 +aa55e8401226b175450b8b4f1ef18d55e377f7b40f305a6df691d316a0ef17f3 +8cb4506398258e75cf230bb26523d391fbdfc331a74c64fd06b14441fe966641 +4469ab2f3ee113716cdf0415fa646bee2afe4dd3449dd1a38f4135ee5c4c83a2 +4faf571b0385d2a2a0b61fe9bd5a047999028fef216f2ba0dbd678572790f66c +c575cc82c4825aff3b542499519f82f4d1833c2899b5a46e7a64793c291c7238 +da8d2c0c7ec69978d3848957062ca371c8808f6d3244844d54a49ae57e92adcc +a97bc421d8cf01e3e2fef019fc2d9c3ff6edffa264e55a24fd1b7c32f4a86285 +3f9353aaa19e6918a3fe84c798e019eda844a5168397bc875368dfaf42514a20 +f8123edc760c20356bf81d8230ceb04730d5d7ab947ed143b6c3c772350eafdd +9636db454174c0de1a047f0e30370cdd4cab9a1f9d8d7f99abd8494ee82836cf +c73cf595a2a72807f133a8704172c069cc63cd317dc20d28e45d6690c25949d6 +6bd3293aa87b0a93d5675c42636a8837b71fae1945023db866ea01a774b5c2f4 +6ec4b86a3055327f28b179a6a93087b15e7c6169b7053d76026207c41dabd8fb +bb17dd3d49e63686638b4611b43896d1c7697e352c976c26fc58b4e1e08df30f +bd25f93e05f58892bc7f07c4f739d16de447d8eb84537e847926e39461dc385e +f79c2ba9327ca12e7033e6df84d8f044b57881e71f32d52afb2b0e61975e730d +a21fc31cce5aad86c09c82b7d0b4557fb79feb7e1ce6d98d26a49e8160159023 +4c5da702c3feef7041b5dc43ecbc8b2d66b7c33e5008a4d171ef828bd96da0e7 +4d8389f04fb4eeaf1f38865a912142c0eb9934dda5c4576fe18251eafd7608d3 +f35319aa2335e2df4a0aba8a246aa93324dfc19ea353fe27c47628f377259a19 +f9f89c599d11fc306e7181d35792401f9304662f56a2f3e44a1281ba24f4efdb +35876d8bc31f5e19dbc58ee35b98282167d21a1069dc64ae87240384309c42ed +ef9dbbd68dbfffd34c57a001aea0c91c36c2c8f422cb09f9456379f450edb717 +e7ab9b36b451c27f5bf10f018e25c57b1cdf4d2124f284b3f0c396ab3c806506 +ac6cab227e74d19a593671ade70455869614b5296d8768eb4d390a2e644b4ee0 +46a8d64d40633575087b3bafeea233f8e7f22ce22d2c190a0c4301647ce67668 +dbaab051719d516cd4e6e7f8c2b9557e8167c78ca6ca1cec05b79ab1ef61975d +c2511aaaf3f20e393099ccd20ab4b022d2b206d9cbae6dbdaf96296df88f0092 +aa318348201f37a5738f17b440b35e47d17f0acb0d0d255d2871dd5dc43081dd +4b0f9390af189582d2d9b39fba9644537ec6e1725de83991f190b5fdfef310b5 +e8483a7a91720758e329efc146c95771b2439bf2607a3f10ee247fcb1b7d5578 +a05775df4bc4ce1b59084f5e625e26e11243185d730fb8931455c3342fdaa91f +7093b21bb911fdb04469469404dd387ab3a61fa4a1347be3c5d69324ff67c6c4 +b6de7d8ad88b287265a9609a6266b0d9146c3a3dbb0a3c9dcdc0d6f04d48a247 +df9ea9ac5daebacb06628fd7c9feaca1d71c058fec7eea5ba7b14bba8c5ceafa +3b81037a197dd21919d6028849539f2be815d65057d23018049f2201c33608f0 +54f358433c3df8bd7c72f81d775f2a86ed7edb494db813e6dbaf76e405f64a4f +cb3240348612e2940b7531ef8a93a5978faf36e37cbc1a02f2b5e3337fa2fa22 +91a9d6e9f9969604869b954ced43fb53ea1badcd0435817d1fda2e66552dfcff +8acb5b5a5c819906a8fb02cc97f613f8400a9ab950e12d71f076807caaff259a +e63f0de2c096a63eb4451e64a4f904162252f398496c8670b92923b8f7bc4f40 +a53e324f50a66920b4f9f9239dc0a3da083791fb4e524d2c599229aefd8f64d8 +34ed26ac3f7af54ffee427e4d9ec3f8d7d91d4978d974be305028d3a32954d4d +79f64fd4b9bb74596c6f6d17043e104c664f42c70a3f526069cc369abb2608ae +ec16a11b0a8ca8095e30cccd7df1c4543f9e53c3ef8ee191b3213c4e641e0772 +d85601019f3c9b6f94692e729b87c5de209a92dfd47a478e7580399d635ac5ed +0bab11cd5b969e9af5bf1fa7d0865a518f177c77a8631784028fec51ee1ac336 +fd2d1d9c8c2fb4341187042ef872aa168b87054fd265885f2bc0a1332b3e406f +259103dcb242f40a07a5de136a06b03d3ee31d6a5f385ff1dcf76d1a996cdeff +76ad2f1dabe5e2d2ceb334ed78a9aae6c6ee8f17483a8e7c61f7ca4ba03794b7 +3582a8334cd5545eee22aea82e0b31b0981161abf1611c2e350f4dfbb77807f3 +3d3536c51f2a2b83e3a0f9b7ed72de16fc6503e9d8967d83a557d662062036a2 +7778fe6c9f521b3163a2692d16c4eff90d5fc06c69e98a4d2466a77d28c80c96 +5287008eb275a93713a78e8d542d4917abea24d60a0c90d1921a5880aa521fdd +65a16bae6b72b82f2b2eb2e46ead1ba9b9710b4847a0ed217bf98dafd5759478 +cd3e8ad681703c00eb13feb3e5ff2761455a70e0bd9181ea6ee4850b281aba92 +0d8192418492352b2c7ca6a168915de1951f774de37d63ebb033d774606c5d4d +b6bc72a68859237c5aa77421305ac6fcfb6e555ed3f52c41fa177ba49aa31bfa +fbd4cb3f5df1d87df5f7dd810d8bb6ece0a8db60385f6aad7d9248ae8eb799c0 +9e4bd4d2e06ae9adcbe4f5d4b5c8232aee85ce60357a75886f3ed6f6e0082879 +c36c45d57707f76f8bcd1f472271a56095d05f4ced5ddb6a72bf6b410c7cf0e5 +c6cd21d8deca9f8ab7dc08efc69e5ed7925a0e531eff73aa537704db9779e83e +097b9974b9d697521ea6b0f3a76820494608dd21ddf0aa164bd9830db40efc9e +2c07c02b4c7236688d8fc135757aafa153e75b8bc3636485112b5bb57f01648e +1e69d5e9e6ae84c2a58cce8011e71a7ccea36b8efac02f75cd506b402365b467 +ec1f9e60eb81169f8d7b676ed8fc4d5704b8d06eab192939cb570e0e0c2bebde +3671b64dbfbcc5376e1464964d6e05eee27abdd36e52824d80c74cd20795f3e3 +647f70416d394c89bdb150ba20bec76b2be5f157d1a9dafed474c521a214769b +4dcba56bac771999b3d3e172be1133d91755234a8d277b1d63942f0cc3933acd +641e40287e5340f8efaf9d06715eb2abfa57a7ec2791b3fe2bfbd3f939cfff50 +ee4062c9fccef2f3296143190ab4f34cbf11ab5fff417a6ccf01f7a1d7b47b8a +4ba4dd923b0621b26944b513e530352c92e0f783be39286ab144ee76c1e57088 +fe62f9c417eae4770fb7e27959fb74e3b6b3efcc36f96a5342d6ee780db6397b +cb0478b4f1f8245bd8465850e3a83816697eb16163b7d78d9e0eafb40372b999 +e173293dfa6efc2516703d13836e11f407113c49676b16f43b4165731a4c0f21 +01aa6f3a89d7f5fb743c1ceb44f97857555774a63b59f96bcf03c87b5057032e +4c8d1d6b768b7b0db5e444116be731e287ac0a13bb25e8143f15c493c417f20e +be5217df4041413f59e33f6dc1737f9006bc221c6458b1a5c6d42da46e84e3fe +4db8b35dfcf7c0933d4c1c977c5edc7d89185fde71534e2addbf635b819bd48a +595b29cdf59e590f2eec097e3241d78fb27edb9f2274fcaa3246d0ca18e4cd05 +81e45dbd0783362463adb5177ed036e6f17f1edfabeceaa16d20a176968039cc +89fd7902947fd931a080e2105f50ae2c865c1fb3629f22fdfc4f5c0f21dbf758 +56cb817833d0f510da858fd4bb64e91b30705114a2add3f3e8541a89825c9d3a +0bada8a21626aa329875c9f90dc92e4af23a7d83ddcf140888e3098196ddfe30 +8014fed9451558c2f74b1f13aae39a1a0a50db19609b237bc96fe275806f2e13 +6c8049f38fef87d5d0dbcd10f232476ca4153bf2bb3cede4102dc388cb05caef +723b21b6f6f2d6731f4c72cfed94f77bd76efdd37bca46c9f7dae18c05617a3c +1941d5bf77a25169e19f0fb50c5335539680ddd39e018600021856ab815e8bc9 +cbe764e4e06c8f7b20f4f84d404423e6ab37271d564c8f3eb1b1ebec03de7c3e +3a68be5edf58414076716cc454bb971c4d7e09af1c897ab8a5091024ababcfb2 +43b89e13ba6d3af800736f9ab077641c8be2849125ff20f3d760cd52d5bb6518 +afa9eb41b98094cc129c790094c6ac076e758ed6d1dae764ae66a7fba70d2671 +92afd13be3200f95432af7618203c6a28df7453198b8e426b82514648f8fd0e8 +79424287eafa66e276341064bc42dd35f670a2dd82d2c41021531532e4333463 +c95b0aad5247ad3b6f1582f2016e94bf1f9dfdee6a28d74e05dfaa5f41d1bac2 +fe4f355ad90c24361ca11c24d9a92203be1fced536bb855777a0065964cfc86c +d3a27f3ad545fff70ce4921e4479b61281f728d334093f90ff6f33b0135d91bc +684be649b6db580b1d34f38a491ffed9285ae4ab412b2e1623c8b6679422cdb1 +2263bba72cf82416e151f47fe4bde170ccbb8523459d36ef415903fbf38c4834 +86ec72ba6c9a02b4827433d39c27d3c7741d8a9dffed007cac8157d6e3145788 +45b0a5dc6a5c627d2a1e24b351d93e2dde958d206e434379cc20e4f7eab470d4 +e1159aa0e714d3d4191cd08dd45457319e2c41198923c8cc360532ae4f640b60 +7244c08e546c85f9d077e2a249ff2ea24a989abb69e861f8e71bf788fb81946e +bef9d0b05804417e75589e89d2b8186dfcc79b2511c810a4581334d6d215effd +0e8ebe5425d92eb19022582ad7dac770c36c3d6f86cc2ee279cf432196ea8eac +d3514db0d7f6c59e1a68401358a2d5aa8b80259afd002e6975d86a1b8b2bafc4 +5cc0983e4deda769c0fce889e049c00673ec87ae17f1930af5a5e2423709c2da +49f44db4dfec3e00507d4779d904384b801a43a15770a40f10752d29e14c253c +f4e2a01f25b70386667e7e5b2877425502df89a4c25b9412b8a1abc432256a98 +1e50c2e2c7527b6219d0413dd104b80e9d045a4f6e8507f0bfb37339f864988c +b1f62e3f68697b2cfbcf63178ef0d7cd564577d7a4d0517eaf8baeb8b81b5c42 +8273229f9013e77df1bedc6f04f380e3e90f5edd9c81c416fc78a02edac32ccf +a01c5d8b6664fa08dca3d10b9fcc59fcdba45cd41c44a2e0f606dc1c7f2e618f +ee8f9bcb4685f26fa93d73be1d97bb431fe198b04884eb2d75f604f7326e3064 +aabfc389b7230d325f32beebb2d0c339ca51feef98de442792c0b5b7bb4d9234 +b7f82ccd14bdd609816215a9921d67c4b891aebdade0677297e2b9fee67c60c1 +6bca445b3fa9924c81f46a0c88b0bf880477bba09b471da11dcb8e7c42714011 +70c4216ab739cc7e998aa1e54240f9913e0162333a49306ad5973c8f650200d0 +2123a5726c9e939db85cb8978184338adc1eaee4c892eec474731e567ed56618 +32bc375af73840f81530d8a2679d25b532495263eeec8a438b7a9569b01309c7 +e263f451e593689f209806808edef5a896c1632dfd9a823c9ec5d266702db77f +b145dbf4d34a371344437074c6d9954253da577be60e4c2f3e303e382890e688 +112c07d9e4b2b6e5e710e51e1de8399eb0e01c618cbf2d0c02a71f3986575ce3 +f2afda7f40e9da546ffd5f61fa12ba786a27498ba5a60e568e09a7c0f0b1341c +7bbc5552d10a3c23de3a76ede29825d50ae9c509bda892e6b3bbebff58dec41c +c126f433c9f7a8f417585e026468565f5b2f823388e8d5a36807cd6b53294c6c +bebce4329ae476c02d3e3e64dbc40b05c9d1eacc9321179491a4c760c0c14ea2 +a0b6fe66832957f908eaa6f18310690938a38a606f73132b44fab38884d169f9 +5826312ab82666de60297f057e98e26f0914a32f7b4ccd1c9640294909b17e5c +1b6d206c57221a5a17e9eddc8e51cc9ba343eed45493fdb9aa37e477da35a4fc +fbefb497d3eb070784ef08239303afc0f15b4a9d6d1e7ffe49783c3c4bdbb5f4 +7012884e1cef1996d2de2362492d8065009c863d0bcf4867463fd5befe4af3a3 +9730e869b632375b1696dd1b2479d21d98554ac1853fca848241b911b96988df +db0713c481cff11118f5f0e99479a79b5e59eb0031f083721a37de51758fda74 +5332f9ab1215884c1476aee17267c91d5b354314804d1f56678a168ec756b61c +d57d4a4476b7f3d280557586b0c0f88be44350338c1b43eae03d0f8f21232123 +6732997b3dc602628f23619a081af22185e1f0671d807f682885d9d7832ac477 +667dd8d99cdb3683cbb4758ec38c2982d4710ee31ef2b9427b9f0278b5a36b12 +8c1511fcfd79cd8bdd95f845e164202caa314bfe1dbfede5ef71016e61d47c89 +b880f63dc0a79122118304ccec4e3f5a7e9dd6a8d988664fe2165910a65b14b8 +27e34155b2857ed8af38eb81670657cef86b8151b5068ea992902fb55bd4468e +617216c9e4f11a193c5e8d5444700caceb3bb49365e2dc4771a58cedda7d6640 +fa370a4aa115a45d78e61e1bef9b1f47eba3ad1d690aeb1cc1fbd14c003ddf04 +fa374f156be114144cd4a124063aea75f383bc81759535bac7accdf27adf05ed +bc184fd63f064e97dc2b650f04ea22fba2c9765c9a90f00cd987a0bd5bf12f70 +54a870dd7e615b3ab5dc0f16879c7020ec4a60b7eb94dd23bae021d06454f6d3 +985e49bec7c5e01c8be251b4368d1f77b28f8c8aecf5a41b959bf43bab9f0ee3 +5a057d2671d5a408f48ec62be987e8df582f40931d1f3ffae7e9515df5452f73 +0aad038f607c30140ef336261a310fea7e13c18d44de07968367188b77930bbe +d3be4cb2bf84392256b8a180397af2ff0ad22c0107c333b0c690ec01aedb574c +9ecb935dab18a853b5de2fd79d63eb688bbfb55f8982a9f6d19cabc1d2f27999 +8185e5ff169c01ee9d41723c8762087b4e7fb05b7544972350438825df0343d8 +29005417158a5cb24e6df53d767c0d82f3d72c53bc5cc7de22d0c346efc28af8 +ceb4ee03194d7b9ccb465c0e6f9d015e1e2daea4a43d9b04d7473e1aad92e478 +d8f083b1b4cfae16b3aee3cddff25d6bac9e05289952044599c25143b6d58059 +9ffb92a171b10fac1c3f22cd64b9601894165b76f9da6021c90e1713ec69ec06 +5b3d3048ef04fc0f4da8fad276fef2a36f79488a5a00e61b3ccfe7b237dbaac0 +5e0a90e10eacbaf9bc7f47fcd09befc4e6f502bfcbf988327ff5ff8e4b85cd63 +f6f253e601c5b267488aaa1a0bc8b590e647455ebfced9a84e4126b0c67c5974 +8d85e0ad234d93ad38bf9d320b7349d5fd1b9ecddc1cec055903c9aa96584a4d +03330eb0e95fe7ae0ab895828a9512989cdedfd1e66403bf4122e293582baa57 +60b961afcfd1e529240b44f5943fe38629fecee1446d6a20863b603634dc0605 +3985d82a111445f7006ff79a4bde99b758c18d3cef4c6c281269ddc43f6b3758 +0c58462b47b12d4f79f1c8745d9a197851e00329bcffaa2e312f45b9a909a7e3 +353fc343413647fdaddde0836faea6a7a0740623bf43fcc3beed6a99b9803a06 +a02ce672574d41898e330f18f3fdb0c3493e377dfb002728be112e6625023724 +a89da99cd67caf7c1f3b395677169559b06d748a331e2818f27f50efcf76d881 +c09c7c237e3c00304b0d6f59dd7a12caff0b1af769255bedb43de8d4a0fe7803 +62d04729ecde386d5e85e3476dafafbd4f41f24d9941f441cbc92b73a3c9817f +ab397183e9a64ec258fd965707337408c4601049bd8c38d8b6f769ab08008f5a +badf01bc94d801e9561a9ff414d7d2b9401ecbace8a8b80ba5abeb5d701d02bb +6ddea8841621c977ef5d680b1d22b4ec83c1a749455c1aa9c5087035b832ad5a +c364bd1f18bb7b20f6c735ae149fead92d2c3a5403c46e0d55d1ad0fa0d4f1d7 +f9d670e5f0426e865c8733825102b6b92dde23679b74cbb5ca4eee791b93ce27 +e8abb062e3eb82f38018dfb9f144cc640543fe7d8ed16493848b5f1f31fa86e6 +caff6c5fbd54555940d3f1bd376f454caf69f002b91c2fd77848c3353a3cf208 +414155a9fabf34047f1d6ac10e3967f434218357ac6c5159698f21e53075122c +fa05ed1392431c4d2638965864baf262fb8d7fae487c4f755a782855aa157de0 +15dcba11a1c649cf5c926ffec3dc264386491f298d52071ea5b9bb50d82e1701 +fb5463461de9e98e029cc3b7d4621b16f29c598c10750f61ad95c1f096c3a3fd +d4a327adda358bbbbb0dcfd9ad6331e6a28bee5c58506eeba7db703a9524bff6 +2abbce7362e3f0dd61052504cef97f1725a5beb35edb5e08de8cdb3b72c2aabe +ba2c9f6340f95487edeed33d8fb9006b2b105a71dde5f440a0543af51b9d13a6 +70f0438884b84220229e992f3c18d0193267b133f8234cd5be9625c712913e2b +14697b6042de352f6f1afacfc6a225a4faba63826675f83290965a536ea3f31b +88ff1ca2774aab2d636ab6de2f1f87fb54a5380d3a8b5f9a303649a4f7c0de26 +626b97599b0a935da6a62d4dcf88b7f603bac672f6575bbcff1784271bf18bac +4e33df2ae95221bc09d7a58b670df76bd96d1303f66ebf40c3712eaa384252bc +b63d409a8f280ddea937f73388ab0acbe7f37145bed320d3efcbd94bfb6e6c29 +9ddd6925174f858497804ab4688db812cca27262e7b5713979f5d5fe167294c3 +5f10878e60950d1b9d1bd4f7f10c0c0e1fbbc095c4fc1856f4c04d85649b8011 +5fb0dfdf37f9604f4a9aa6061b5029ef157b757cf3064a9aac5aac24648a9c15 +f0a2a74dfb655e65341c03139de98db3dfc2dcbb39bffafdff9e67d734516e0a +eb7c111c39b6ee987f99a7064f98c4f974a24466f60dcdd9f8e526033bfc238b +35a5d78df28a114456211b5d26a164ac45bfe67bfa3b39c4622d67fb8a305d03 +e5b8548d0c01150d18ab5de5aba0aebc35b456c42933ce0370f8e8413b13bc6f +db80d558ae7b5a32077897e3ef1eb98b93db5c00f34f33133d08a6a8e7665e3f +eed2e1bb318afb48b73ed72bf9b6234c40f028e76a5a0f902f8702ea234a92b7 +b8dd516336336c31f9baf355450fbe924c44560f32510e183a976a1f98e0ee77 +e99e26faa72e5e7bb50248c336e6481c1e7b00596b1f511db2dbef7a288edf8e +5653620ab52f7e3d10921ae2e194c6a842ff1829ccb8aaa542a53c04f8c23cd4 +08b414afdacc34931bbb91187dfd8c1f3bef02652e042adeac4b9bb5ff5ef7de +60926e02d49e3d55cc1ecdd555c1f4c1a1083dd19c6d58972d86558198314511 +4cdcee4aadf3799bf6d81ec7d4347225eee6e67126fd91937c7711072047ed3c +4bcaad89c800e05a3304b95dadaf9c7333f0bc8aa1d711122176f3db92d0a4b3 +30939d1b554d47893be691dfe0e5c47d32928fd984daf6c03f32c1b99efda210 +faae4a783ef7d6eed603d5db1828c274061c1fdf78c40ce76a7949af802bce9d +d84a726212e23d97b0ec1e975245826f3c49c995c08940c680c39a598553dfef +1b3c7232f0b698fdce76a0dbc3a2fdf0a53c6a0a48233a322d1701bf43c82bca +12ca3393662fc5c4d38a693c30b9d3c987e872b91a0bed138bc6a671573d4840 +46c9adf2cb62df79585011d6d61e2159ba67b4e7cb35caa2de2ec53452dd6d82 +f488fed31ebb907cee7f61773290dd0e0cf4969f2f123670d59d24f909b8156b +9af55056199c5a1a4d4d3f72eafcae937765a6e041f626fa9ef67ad918d9e10f +328b3ee0aac1fe1d3a0231ee926659f238c60c772fdb1d13ca48217e43a54b03 +56cf7084cd9bcc3e0e482c18a1d5e01cfc1ccf0cf196af73f676b915e5efb9ef +5427d032e8d4f9cfa5fed93f85707a1cc136b7bd35b52a7a4cadcbe3f3a6911c +dc5b7fe0607861e73d5c36bda58e125d20c30ebe336dfcbc4232524a179d763f +6e23915fa34eca1e4050027a2b8b7f54ebf0b95a68960c676a0927242a436cbe +64f7fcbecf8dc5c850858725a1e3b701915f9be0a41214e42fe2b850dc7de4e5 +edff5f9c6eb1be2faf002a6c3347f5895a6b39f8a4ca5aa65261b03d7a17b58c +b04fcff305a35b1afce3bc9465770b512604209efa3052c2a455ffa83b870d21 +15bccef823883d2a92d725123912a9e89b4abc02185621a728a447a5957d78ea +36a3e8640e9169a850b4a2cab7ecf9ac05f2e0b30c6f626a1f59316e29081c07 +5b22a491b8cc89d149eaf7216cd9d55de0214ca1e70a5cedeb9824894dcccbd8 +dad1e22d7954a8434773ddfcc0474ff722a521462bc78d20369fb9383a6530cf +e8ed7e26bf47e61f7d16c44631edc1bd494c461aedd67ab56aee434c442927e8 +1acdb71ad196938935646560a0cb98677a64431ff44f2e50552fb2706f206a1b +39b95c94b82c148e1a3618b666c555a258908f96bffdf1e6c34f65919440e8a6 +4c10982dcb24cb5ae5ee34981c9c340065bb0a6d68b1735ca808bf5593d86440 +6bc88f81d3c9f0575216f2f2e5d7e12df7459bcfd90d217f4eda8a8d6855e960 +e7427f6f3630ccca0d72994f168eb9e0b7d401e797a1b3b250cb11d3873fa3a0 +4521d64a5c71b3bb2ed62c762184a15fcfd4290761f54e5c2dbac8a9e196bdfc +0fb03afdfe8c441933c35296063e4a15699c82b83142ca7ba239b6c65e3fc1c4 +e287be933346e534d611c38b85b298c51dacd20fa15f91a7c84dce62e3f9ca70 +000b6d0e62ef647b47f8550ab0b3e0e0575509f08d73b522653610f2cdaa60aa +a62677a35d57d06e9f15d99c7fdfa77fda7625fb3f418bcf4cbe480d748b99a1 +2e332920f119423c75e8d3b18de4284155230945da1e26b73cf56aadd9e20fc7 +b94a75b55e3e5ae6b51a831d087e6e5b1606757ebeed58b5895d47546620313d +80c230bc01b17f0e11b70e1a9b17bd878e2d5ab31e3436c92e5366c5b92f2392 +08e2c6994fb869586c4095ab7c559bf8c70ba0ad8cc13ece387c57a6f79dc107 +ce6f7821f77c6e8e493f756453512038b01f872e90dc1d9cd0b82026446a9dde +fcceb653599aa3b063fcec2f7e9c80665b65ea21e69b82ee4a99ea51d9441ffc +0f2f7dbe9d4dd204cd4066874b85ba361fd0aff5bc11b8852625701c7f174302 +e60cc1e257e6511bb7c819a8838501b1432710df25b653e1e3804e4749cb9abe +f08ee2a0b28ffd07b9742fbe2d67d568618a593945959a706fb055abef058a45 +c07d62ad9f63c2349ab441e2d72b8be49d1af258e365bbfea63da2449a87aded +b306753dd10c806c0c9361cc27ca6f837723cb538ced898caffa815e12bf5e9c +819b16a449f8e9bc06a8f8ad631ee0e8e23b42dc7eabf8dccb0f9dd14f129d23 +49dd04e23f1e033c95d11fac2e2809416055546a93c9d1bf3c95fe8cb4cd8cfc +f0f7b21632bec14a136a9b694e40e36049c6f233e01df150a946bb28fb0f000a +4d99dd94b292f45acd9bf8cb8269061bbecc062b64b38c526cc7a55e2aba039f +c3bf691978904c0152d90c85f5c33779af5101a6ab0eac7577624649c9ea8604 +b942b0b966c3c6e670601cf3ade97a20fb5a7a79e5c3c0d5a7569d615120e89b +1c33397696744512a60789193d699802ee1f37ab3a13f8c007da56db937f80d0 +b9a23b066971241f34004597effea6d0625fcd9f18258aa378c8fc4a41b7d1d3 +931d1a7d17edb0d36568955e81787f4f2ff2858855f60b3061a85e6cdebc42e3 +44559734780c07989a41642720daf7cb97bf3be7acbc590d57f1791238ac096c +b373165488fec94045578f0a69fa4ed0366b94f000045ecf486b0bd54d89bbd2 +33d1d814886fff091d6bf567417120895056372ce8d490c02ee8c0b40634becb +3f13ca1305f352e96df55e9467e16ff92d2a2be8b1d65eac380e41db62be9d4b +341f4bd6aa69349791c98fa61490bfe18286bdcd936b27b18b6675733d447eb3 +79d07b8cdd7bcb3f1297d4c142798d6871bbac3752de9b23ff6853d5438dbda7 +6b33d3fe159a064ad2d2901d5b31ed8a3987ade8fe06cbbe7d69716b4a35c489 +841220a5365f0a000206619b081bf55dbf6abe9adbb9aead2dd25b66896f81f0 +9c1c9cc4332972ce1ff07930421dcf83428e6fb32fb86c6089495bf91273d7df +681070765ffc1eb22f5a31a00d424f99e11bef8067980e3d9f0e66ca266bfca1 +61413cfe419bf03ebffe788882aa52b4ac2b1928800008394e18fc88a55f1db3 +788c6882da7e4a1eaf14fb1dbe6ebdefa5cef0d686245c1dc794298511d38006 +2fae24096f728f0aa080ecc9d85e5bb0d989c5ea82fcaef430cfeb7aa9f6369c +74cead4731d892a49458cf89dbba50d7f6ec38140852169dc4ab886d92a91a61 +40fa81b25b8c93393837d64b8c390389205b36d444731b3ec745a944b6cd2d4c +b75a668f49b01b6689ee9d3bf88be3ee24d39b00e20b4764513e0b2813c5d4ab +2d067d468ee2a805e3ab73c05ae11e55b1205af42fb851bc69c54e8f3f1083e4 +4b4f781cfa7f44ef6b1ddf3163567d125e052870995761b2a9c5753e867339fb +781f0f80452d6350d4cc6dea0c7c6dc7ebc3f1d99653ab1374b26091e7247364 +b9ef32721378fa994ee464b5d653438bb181e2d5af0d52f6f25955fe91825f2f +504ed079a87da169ef93971413c2f31fe10ac677b7d533207be18b95360d9aaa +ba427161e12af468b4d05e929406396ab010aa775b3746098a044328ff0e98a7 +e53240a0a3a87e955b3e7c5dbacd9a0cfd7575ad4cd9cc22652c7cbb43a29764 +01ae4868bd7f4530775f0a6bb230567ee11d542cb993b2aba34f0bc38a36204b +85ba53df1d746b211b1bd22ba85d6a7dcf9c039527b26d950afdf4892d186b65 +c7ce1c2de59c03a520af9d013878e989d6d5762824733cba8a37b01fd7e3c169 +90bb8b8b469767dc749663904285bd4fb4de7d363efa8fe2e058c641744f7678 +99f9b384fafaed93e9dea5615f13957c8080388b70c478eeeeaeff2f0d3d123a +04ba45066d402c6d1afcb4920bd0a07a386bc5876c73cc5e89cf3f2fda80a47a +63c7d8a2403c2c767625f25f2407931ca9f11d3f3f1236a77c38aa35811dce4a +ce4f9fc2ec53e0d87262fac254827144e92eca37c09e73445060ff736a334f2c +c1d6789ddc6f426024e6765fd9815f3f2636fef179784f7b47ea92a3f6b66382 +5fe65c4e219a2c43af91e40ac28c2b7a02e7afc1751b2b24eb838ca55bd7f66a +9500ff4ad31cb1a627839334ffee506f87b0c44b50c4214318aa8c41551a606f +e3addcc30fe261c4859fe204feb3471d9d5356c6508e2c37616d529aecafef05 +25b67c8f7cd1c26cac2d990ea57f3f48b221d288a034768646ed29db82f0b471 +fbfe3a70debbaf9736df89e7b054bfb1bb6c6ccb6a1a71f9e11937f156a75291 +5b717c9a40c8902740e1e5eb8eebe94183d9ec18ec857bda2635e0eeb26d7ff6 +3edd21c1cb4be925f049878ef687007a67636effe6deceecc73e8871441c842a +117b9dd817ed80d0920ce1743ed6b8d9cb15c93725a4140995411d75a0f1bd2a +a10bb96893a7d439d3110bba9ee156d8b18627c7c2b8217969e3f6328b53b4ac +62dcfcfd498581b59b6d018733a3a5ed55eb759b83fa3b1c0793a247bbc6362b +2a8837413d0edad8ae649f3e06214a316fd23c5d0306f0ed9f8f5b896026da63 +d2a18c58352a04c540a3f90de5d56a4843e3d1fb90f5e712da7897680a7a1d25 +4d32308f7e1b8de9e8cf4535d9c525325a1ad6f543eb0b1fb5552dfe957e59d1 +e66da60051d6687fbd7231324380c9eb9fc8b6cf4510b043fa48019fef1c094b +84b7f5e3816df7c138f2e6ab1303b368687d1e3c7dbce4754337a3de11f57252 +4d2a143826e406e082c3d7a69ba88e2871a1cae22d6a7bf1ad1de45fcaaab235 +038cbbb623719dc5533d36af35f712e9f8ac826ffb49b4fedcc96c4f30913c69 +ad0533b02a4684bfddb065c32b54652402869d8d6141f90608201397f3f0bea7 +f41670b138c6339230df305a07d31b5aad40ec48277df06092358bcdb3961bea +d551c94cd039fb97f46115d234965aed70aced9be3305de77c7f1a33f3292bfc +f965c53292a7f31a8926e038147a827589579842df86b16e840b836c23fe23cd +059ab92be7d7037843661fe65ef0dd48d31b07782b542f0b0852071baf3b2809 +8b95618ede124c9545b31323d1e454ada5a03e1a33ee34f6e1901d54fb90ab12 +ac146fa7bf5aaf50f0de423e8e47d45cc01867674ffd404060eedb137115f352 +c07f7251835a8ae2bdfb70d022c2700b79fcb83c3c312e7dec4001ac20919443 +acc723f7269d60f3d626dde9d961805ae77acec4d40419a51baaccda682de591 +9df8ac6875b9fdf1f1281988bd94cf1f5f06ccba48cdb6039787d63295fff9b8 +c2b84b30383dadf7ed216b830a38caef32a3279e86ff7e92865bb6b421166e93 +923b68a473de95dd52c986a5a4f73473560ca69e8ce5f7005e9aed1f2ebf81ac +397c9d6efd6067cd741739f7ba770b7724336429685d486ced5a122aa4d78647 +81fb6611c6fbfa68e7aceb2a757992b249cfbeba51bed32b7cba777fa78f6db3 +95641dcefd1a61263e2ecfa95938e2c3380a8617d4a775dacdd824cd2c2cfc67 +8a5727ada2b1da97f157e543f252f8d3d2bfba555cbfe089e8bf708ab253a4c6 +3f6ad9bf11b96988aec8a66984ea4952ffa81aeee213ab59184f8be355db5010 +17bf130f7d492b9bcc4b67f2cdee249f9b00bb405e3c580bc56dd1639ff81771 +8d57d1ca96b5e8df212bc86b709355d1551b4167b4e35b14a32a708d7df1847d +f80904addbffa67dc2098848c24b6154410df3c6ca0559a1855803ff6426aa69 +ccc262dc8a2636c17ab65c23004d5a33c7b6c801596f0089a033afd69006ad4a +f21c0cb08238c0051345e0f1b780e914b80b1d74eb45facb77b1c043a55616c2 +8ba8ad3983fdcfa07a3ed19ba69b97c234f89a296f581e4a380fc58056e72096 +7781f036f7c3691ca713ca9d886ed1b4a742295c29c1ef093f93d6fd507af0fc +80c5a01ca38c17b8ecf33b38fe224c67cb551e43db191968311c38779aab6c4d +0efcc2a0781f4e0758a99b13b520b75808cc555736424a4333029c5b95edf387 +7e6d17b114cb2821286dc34dfffc1e89eec9519c44bb5c928fa4ec44bf5b75d9 +e13aab1a73abeca008d75e73d72839653af898db554ce339a867d7cde546c249 +d0ac179997861a121cf2e1a1001154ddd1f337ade69263c021bc78724884f470 +4cc8b2ee48a1e91eae27a905d0e73a98b00c4353c4da0aa4abb75794b5617080 +a4a610ee9270af4393efae916b8c4f5af945d453e9ad0159deffdc96e5c6fcfb +95d9546275d8d7e4608cf4add77202df1894ba8bd0394d7ab8a066bdca5c649c +a78544a7b54b7c6745321da400d74a0c67b7c1f412901aa0c8c73d075918b4c5 +a5462d30577d848479987a4a6110b1748884576a374b488ed5d06e017880cd29 +70eddedbc04a39bf3cd2eb3f0a48dcb3b7679bdf0686e77c63b2fd085eeedc2e +bf04a42bfaae73afe9012890b088f75244b6efbdc2f37774da13dd60c89eb077 +3018a2d9707daaf64a1efe40cfe46a5ca252def56e9ea2abbea02e4c86eceaa3 +85b194025491448e9317efd74f3e323683c036805c158e6c420c54a9717b4c7e +7343b48e2e9cb16d98efb347dd42f9f2ebeca64bfca0d15c5f8209d35c0e6328 +f19be8be0c967c2f577d7ff09a9d1b4c6dee3d744d6912977e597be47e4023dc +3979dd6280d66382782466112ae09f2c8048c93df7c38176560a87e679a681df +708ee6ee2e3270bf6c8b07c15a0839b0b4c4a9beb898d523216f2a9384fd767d +07256afd80a51a2782907e34d1694b1aabffc98f5dec33af246e5fc759c452c6 +6b34ec94bc9d66fb80898322701ba188fe5ab3dda0cac7230f6deb980006b0c0 +786f1586d58bf75fba6f52697c8cbde27b8525a27c0b8bcbbc43faf42b419156 +eaaf3475a96cbf399605bbed9fe577155c920eb4a4851669ffb1083ef45ee35a +83eeb96f3d0586402baaeeb1b71c448639a1ee577c42a327cc78484f4dd38fb4 +44162bd3b5e6eee672e6100a818657759b899030a0b1105be1e629a391aa397b +888f0175e74c210ee7d5a8a817d4725785d2cd565059c8f08a6ad227a2645918 +5de5cb6bbf78143177a4aad766d2fa844dc7399ab1f800b5671777d074b8398f +dfac8803cf6cb19ebdc486db2f55b8d0249382dfea1732ff0ee0d8fb4638c316 +458c6263e9aa416105806a4eff7ad6abd753009c243c3b1fe505e6200a7fbfb2 +0e5595292589d13e73286122f291dcd71b708414936143008bf4e42da33043c4 +c4fb7fc1cd40fc685c923439419a441200d118c497892ca1c492c52dc1408771 +c428cbfda340bee7f84d0c2ca16c4e35a0962da289e76a728683bc6baf252f8d +a0bb4e3514f5127c513ed939ad1a585d7d3303e13af4f5c35db672658269feda +b0d139750a4b4a26253f6402460117d541e55c7b899f544078e7a435d78d474d +71f7bd24e01a395265cc80e525eb2185f137b26dfaec31f616e7deb0f6018edb +a959bcf2d04999d1bb21e39e43739c995101557de20e32e0b25674d17c12ce93 +f0dbddaac156767ed03f2e081c63ef94828ab30d4a11ab5091e632b6efc0d740 +30004eccfdb55c3a50ff091afca5acf052cdbacc49f4a20edde87dc6dc2e9d61 +7d0a40cfadde02ac8e7ea1f375267c7322dcc2d3e9633895d1f897969c3091cc +7a0a7a7c84a4bd15ef83a16690d9dc380f07189403ef0d9113c7ef0da0f1a66b +61d7f9593f82f849743647d8c2ac15b7e0c87b9f7ec8d7adf890c754cc29c38c +02982e19d542ce713462c3f5e22feb2cdd4cdb6627d419c5b499c9442c58e4f7 +f0c0ba8ced3cd519473145238abd923930d31f369d3e067b6dabd69c740586b7 +93acd9e69ae61baf1a063f062f22025bc3fa2e0ddfd7d75454dc1b8ad9629167 +656edfee69a41240a08f6fd792e5cf510a3254970429cc76f8c2f95a86d75d2d +c98d8c7bb4418561d37f478ee00e9ec8f52f8c745fa570d42eebff048d60a6d3 +e16d9a9bfd1722aeffaaff77ec82cf4fa593353a1bc6d96790dfc9c6484d22be +72ef63932b363c6b3057969624cc63d177f5b103b77b8a560bb0595da7416e29 +a8e43480858201306e31a72b3a7e01b367a8917c19293e57e4535d734fff4e17 +f50fc475ad13a5203501cf2c29a3d135860788507413ae93be0598f21a51f317 +e9da8415f5e00a4dcf49f640ca26c8623ba9c5e80e8fba310c8f06570a629a50 +758318dc48c876b126850118b8134ac65333f17d67ffb7f3c7bce5c07655665c +4a09e6fed0bcec0364386fba63f4cd34431d2e5fc44e3821abe5033d77c1a901 +183a127f32b003add501dc875c453762446a87bcaa50bac3b75a453caeaaaa30 +12261d6c08c95eff1df3ece254e9f41d7ae85efe476e244fc9d9e0853017eba8 +7ff6241cb9d11b7213d2ce679cb1c071daa5317c7e3624df30854049ac46a995 +97422a2dbe9814d92e829744db3d600fb8509f9537a101862f9dc84d17f84b82 +b819ce71e40c2e397259459f55ab6af355a6c4f359ebb831fecbec1dcc4ee2c2 +503dbe52d26b3a72833d36a67a73c9de2705769d8ea05c92bfabf4d3ddced23e +a37214587f6b58df7de6318187d2272ef039a8955de18eb7069d08fcd6f9bea5 +87a2a6d3db572662f278146b51f771189e46a044ef16b7def53b9746d888f2d7 +ff871658dcd3487ab266197e7e34c177f877b07ec4dfffe71a0120fea56282de +97de3d547ea5b97b5f2fe7f14f7adc84f461e5fcf9aa866bfbc84c9797c68749 +03b1a017186b2a386dfa8246c584461bc07194eeffb18f8127cf521e7756b715 +7f6f7c7358d2e5d9255feeb70eb771514d052035d27a86378a22d82378d99911 +f8e667e1d2df9611eb6c369826eba29ed9dde39dbaea38c9fbf05ceb5910d484 +453c9c282e5d418163b4adbdd92c091758e1432e8e75e151872e1dbdd5e813d1 +1a86cd3a230bdbeefd67c02448594bb5e8ea2fb6d07b098131a73a28f9cd9063 +59e8cd66c000894ed7ab70240e06602d7c4e5c2847095c961f88f2b02f2ff063 +ccb5f34f7e0696af4e43023cb3b0474af145dfa09dcf90835b766358e2ede785 +c63e9bdbbc208fed261c5bdf4d10a769112b62b086bbbcc8d25486310f6a919a +35383ca27e13724504c63667f79103fda47692d2713923a5b982a2633b3f86a3 +46b4d7159a68ccfcadcde10084b91150fd86e1e185753a663fa82eaa428541e1 +40edd7a75007ba37fcd7bab998a401a37348f58bc42d809ac2d0d38c7f49c350 +2bc84208804d6550bb732dddc1f760684f0f2bd1d8fcc61b29b5fc6b357f3832 +54a0f238a00f9dbc38f063827fcf36ab943c9f61ce4add29be32889b32dd1584 +c54d3900de0b0acfc1345b1bec5ad097f75adf92655a12542af7b8c618f07bc5 +cd4d69b206bce599e1e6a8485849a7f2dca770618e877b44150cd34101e4a8ea +e8d3bbfde9dc4a862af61f8fb4db683a81e614545d38927875cf8c027c3e28cc +152d7299854b95eb16df2443c7ec9fd40ec579b52f9ea5a6ec56e3b662171b3a +bf35565869988ab1684d47b801ae6eb23a6bf085c41e3c3f2b040aec9bc6cd82 +58ed64d6ecd8332f966da918d44af30897e54085050a0cac70f459a72f5af683 +3264a26d0cb7fef77574f10d4fa8ecfea0aa397d5bdf3a62d8897723de545ae3 +bbf38ef76b76e3e72d1c3a35b29966acb40e13928de55cdc20e691daf5dede05 +b71e8713e67ffed407f926be5b69aafab337d2f04992abffd60364a8549835e9 +299df33af8212c75c0819000536b89127613c763df066d184f718e1f10fb8e08 +f5fe7b8abe9f72743d0db04afd1d528780a097598a67a9da8172247c6d638318 +9885e4fc9231537ad9bea8c3028c7cf26c3ec6b7adb82b1481ca1b149a9d2316 +2ef5477fe27363a3b2ce1dbed38128d16b869eb8f21807f6d5430aec30cec535 +d0f4458efb8c19834474719b6791b30edb637f54639396a7dd581a4ab5e97fba +284e1b756f2e2e3b54d6e136b237bbd042c69b21244248674dbb4973ec7ecdd3 +9f1ef47545ff01b39b09d06aea5b412e81fa46ab0d048b6803a5992de0fe2f63 +6d6d29b316a9bd4608131cc7b4c0dd1db4a249647ef8dbc5a2f9b9524284df3f +1e70a74c8aedcfde0f6c556713ca8b13cfd5094cfe64f1f482c29e72adc2024f +a2846a10ff5344cfcf8113d0d1da07927c53b9aa76094106061eeff3c7e5bf25 +d875ac8c07c4ef7a0bd5d4af2644e6ff82c8aa6e4506975ac9625fcdd47fc085 +4ff26d3dc3f8843c1d97948374170812c223ca163451e0fe4ad73ac7089e4fc6 +c24836cb8413a3185224724c5b302fa8d9ede4bf88a0109d98be35ad56b45045 +3422785c4f579a9307a860be505f5d880fa5ae66c82b293205e738e910ebefaa +af82bd9d493ee18eeb12e40a69b9ad40d5aa6839d58a7894b5cee115a2c42465 +860139d35c0f2640041679283c476a3fcee985a53ea863414b206dfaf72c7d10 +851ab12466eaf532d90be235d9beeef7e389e88a9319c536954f081f511dc717 +16f16c21eef839669bfd0d8b505498b0bcc83eb41889e6380d8104fb732e982c +ddfe4d508c45e8741e21d6e5934e678f38dbf17c98196dfeee7f9e205a52ebb1 +b9e2fe333d6b1c1b1b3386e079fb941c7ce482f2ed5c9426a224309edae06e3e +9e8f5819ba4248d82c7e9cf44f7d1eb97b2110f9ce9acc313579840154427df7 +b2e57e2c50c38b25f593092f20350e27f67a1000f86fe87e2acc031235de5aee +f246f75d4f4bf7d8852267941cc50de864e0ea34e02efbbfa72587ce257ef2de +b249377e0df834e89060680b54c38d036895e4e2f8d55b9e4a5fec6da7b99966 +9b4ad9b695d6cffc349bcd34ed2abab20e289417eab1916574e583258817a100 +5173bdb345810dbbe2c600c25fbcc73727698446a2c4d1f71732208a70cf557a +30e67fea48eb40f288ce4f576366b0079195507f25bc9852f6fab94827a79d9d +16fad40c0fb0733ca838a148f1c2050590eda6cdd3a87283911efd861c7183bf +10462d87eb0c7131c18346611088c5a8deb6e200ae86977736f2d15d818a444f +5c435bbb043c7bca3d5f65152508a0234c6043d7e67da24f0b4d8b3e7367afe6 +c50870216ce2e4048589188cf361412cd5cf8baa691fb7dc66677822263ef3e2 +338a4064fbacdd0f7460139c508bb21b65f3f433c90fdabd0170268b7ca7003f +d72ab116cc3207ea8aefe60b715e426cadd96d4dde5cd91068214c92a1307237 +951e92f30e07878b695bb519d60512ec7124d4df28fd5ace12a9cbc8c4ff6c16 +f697ade3613e22880897bdb1a3aa680ccea6085e234ae3d62d270afe5d4254bd +6c4d0fe6b7c281919e6d422431e1be80d47a51628e3edffbb685a7aacaa27dce +73938aded090460b036236e6cbaeefdd26c1e5caf99efc45cda9b3fde97bd072 +9efcaa80ef173375e99894d12c609bbb57fbf0bdec7b2150970889d08f992382 +23cdeb12483e3fb57705d03eb900f648618cf5822b57480e2fb420a5022b4e22 +138ec9b68d4088a833d50b2da7a26b4cb07ce56aaee2a1fbe00dace02a1de81d +143f3b20f87b6a394ebd896b3a6e8ff548ccd70bfe95eeecf9bf9367d543f75f +575333b7426d644dd94d675e17dd5694b3a1535aeae056900a9bf30d6a7e39f9 +62dff42d57b9c7d469446bea7dc3248e2093d47c3afc995e7be86438cecd902e +13b1686c5ac4a58ee9a272f0ad18599b8495306d146ac0f6b958b86b72e66121 +3279ed284087ccbd1e8c865df2fc26702cf399b46afb744a3e99af6079fdd596 +5d1b59ef92713a40d56917270a40fc029583989c94caac0ea6aedb0310ceeac0 +96c62a045f3e6b5de1963ced45c566d7b10ce5ac76a81ff38737104595667628 +b51a1ba8172022d9c06f5ed6ee8e429be415fea9c8f648a27f8529090c6bce5b +69abe90177b1274d5bcc64d29db949132223c7eb9473d5af376a81d94826f141 +9bddd79521481b06adc451ef5ce33ecc43a69be43916509779b4c8a5dcb4a2cb +c12bb54f3956a97eff63d26de59faee85d6d3ed74e2f897fe852de6831deab85 +10e2790367840dae069eec64a77abff4e09225cbfe9f4fbc99a1cff38e2fe632 +792db6c32e444e85b2e09dff8f66dd638c2b0b5ce375980a894bdd6a1635c793 +33da9068aa329714e0ab8066ccb7eb15d1ff96414de80b5b791b34a62b25a249 +21cfe87d128a4cb6b93d0e51ececc9deb841e3a3d63e78c053f1c580bfae7d6d +7482bc54705022d1f48bbd33d9a2ac7e0f6ad5efcb172aa4e49f356b993bdd6b +8667e358e612b24ea9994a30f80a4db180c801b740a3234c0c95a8ad6d823791 +0ffd5806fbb8e86165fe6f343c72e655b57b2102f41a42d0220ab13a53feb105 +4836b876148c29b5d2532869882f7b54c92bdb7794c13c737d8a44bff734def1 +69786d9dc57dc55d385209061f38a411b5d49c66f191af793ed37432d2001a7c +0fa0f23b32e80ef519fba48264eaa841427b4fb6311995d63ad919ad034f2313 +d6f504d4eb0369678afb331cfe7f4ea1b69175d72ec4df93d4fcc4d91b880009 +6c371d04c12f033541b6e1e7a010689a1614c157d5191c69edc290a907349459 +b6ae2a0eca1e8e871cba19bafa4b861a29172153afe7b9b7764a6c3ff87677d8 +8f8db936d12c33ae05e93ec31944ab240099e39ea3e9de81217996c91a4b5685 +e5d9f7be2727d5f3fa41079bd37760568f2f4b4ca19226949b0723985e98e7c0 +9c1be3b1d19514e8236f8da7655c016cc7a79e7d19c0415c74ba1dc510536799 +5c08f9e243b1d3065b601af52a1fc72a24cc36b3a283adc49dec4d33fbdfaa37 +055f9ec1846911e326cecdcdfd4ab522d2b2871c03219bb991567cceeae2959c +96f068e117770adff52a3be04d935141c20a9d1c56252003f8bd51aa1d22ccea +15fb359f308ff2d6979ba1d0da54d9927f723b505b86de8325bf3978230924b7 +97234835b6b946c5239c196be506bccc1e9a4f2c339bbbf7b4291f1e830352b0 +2ba637fba6dccb5930638db302bb61621a534c7993a0096265271ec3ed86fa81 +b6c7888114a33b3346a27931ea6b0b2eff65f94ea692addafde2579482a28609 +bb20c6f343c8fa777cfa9bd9436cb47cd0dadf4d16754e7da03aafab0edfe819 +3d5afd59b5b96b329bb4955a9af589c6881d81ace8c97dd92be95623d94b7825 +4cec015c59bf4ce98de9081328e7cf5d085803212054da028016350005aea631 +bfcc435114a426c5d4367c86311e6437e0a59137e29db512efcf312e1fa13624 +ee6f728904e0ea5def5e842f8f07f2627d077320e90927a81fc6162586f9ba73 +d061839ee5dfb7c4c66a530d1a0647a87ac4ffe48c956fb619c01feb95baf99b +56b0799c8bff1d670ba5530cf7cceb6b4aa1de7119958d3ecaedd5dcf835e7ea +f16dfc6c671e6b861297e675ba9bde08d0654c4d9add46a288b15268df4a6572 +62f9b12765b59b338c718651ba92329c9510655da59347336f8be78b9508b267 +3e366a409db85adf04edf07d75111d2fe6fd24a29e5072a876ccfc4290b0f868 +fb9fcff47575a376c594196d8463f4b2defa8434bd1e769553eea3e817fce981 +dec52191e10a7c9e2a7328df0d568c9149bcd8476913e4cd385176184e029343 +3ad94901ce4b5c2cbb88c785553db92464284fbb1cc3c456d8211848dce535ba +697134df3371ed34bd6b0fe30ad22356c0dba8ccb32055f01c0fd9a931191bfb +a1af29f383a66ae3a810de7da2b79241e0bb376e4405bc7980cc17ab240b9820 +202c4cc9ffba362c8a547a7c9f3fbd37b55062a294870721db5f063e05b48d9b +567728f7b844f85701174fc98aef1e583a022b7207a834dfbd9705a16ceb4dc8 +c5dc9305ac98f5f41be6d317e20cf2d7166934586bc63a4cad29b1715bbc8d0c +0fa882e364ecd976e7406899f12bbcd6145dcb5f314195cd4ab865ae475a0c20 +644747ed8f79ab9f4fb736fd7f7361d4885bb41cbbfd59b0b7620cb17659be6f +986fccd526e9756bdf412c6000dbb9ae766101ec23f8036d1afafd45f106ab14 +a3ef3553cdc80411e766399bcef62e77e67ad7568812d3b150c29a961dbd4e47 +ccf7ea533d1bc8c16ed25bf5a330731ccd02139b72f63234d49d5c33a995abac +40cd06c867a08cb3c19b7a0f9df091d51a1d387773ae8dce4147533e41f929ca +cbe198e61b81380306dc2c99e99abdd0b6f2f84056ea25d549bd1f88be1dbf4a +6fc994783d4475d4018f48ed18f1bb851a221da3d9624e3a7faaacbc5e9b8424 +797e5646d08404f2feb868d59714e4ff77d6aa968749e1507dbd7b3ff19218bb +fab82906e56136cdb9e3ff1db470a20298b16f08f48a6937761a593e5d98243a +c842bd5c3acfd41791ab02f991374cc14e1cd0de834d5a13343d70d739c746ea +626310b0f7678b8e7b767265f343ec770cb789e8dded6c56889ccb0528ecd747 +0668da632b3f399ef2e28e3d8731708d630be0df2a1becd0e95d031aeddd74cf +6a2e2bfcc5024033e2828bd043dc7271d1863937c71650e5510418e9b9c35b7c +8bf9037305bf2c78a63460dbf914e867c16ff5dfcf05c44912c4083cfcf6e498 +e7af6072d7052e882b188c696fe69d1cefc7baa001f095ed80299c9290c31dc8 +3042ef7d9d3be6ea2f97f667a77918eb207e459958b60feaa7ae8d0fa14f00b3 +37a1b40055b720048a3b67c2250f3d94b10133c1e473e5f9bca3b4f72da29c5f +d4c09b6520ec5c54792dc37f10d75c0d4302844f7d193cba7ca088838ce44a82 +f1d3161489ad1b9a2cd319840c0f347131f94296f856d935661f691d737a7e94 +51872d4c49e71e9fab6ca34a96f682da48c50ea79dd68e199a2a1d49f81a132b +9a990f99ddacd43888069c37571834ae8dc60a69851f7a80d65f5e1a688930da +8784aee9a5d6ebe96e62e4cdc8b34740acd63f50e208b43a38c6bd0808d356ab +5ea11fccd7ab3bcd6aae709995b45e03bddfe1052a1c8417f1d8a794a66a0e72 +9db494db21a36118bf7c031c1e0a47c35682e1f0a183e1289a438c799273543d +99a3840d7549891458f6a3ba49b9f556920193dd86ef7d457293c17ce9cc76b0 +6eca47da729b0c9d0c3181b59f993e773f0279ac90a5ab526aacd6d8293e67ed +ca0eacdbf1b9aba40e5979a2f20810e6590decebb53bb32414b81aecfe304407 +c42af75e03a6c1016c381a378afb7b943392c081af0680726c0ce4c984856999 +2b7995735bfd871bcb6228d87d3634b3ae50d766a3237361a9478adf6a32b12a +b435014eebcc53c44c63c7ae474b4f6b0e4fa1b40731d0a3aa530f9a1626e700 +12b5a51fc6473e3bba2e0eb274b747273ca382902511948174fa78de5c7ab5d8 +7ba99000052d5c0a4c3ede1da7927b214b893d61fb11ebd6dd1af012ad26c065 +fa64581182cc1ca3b86150e63e5e3b892c49fe4f6ae6c34ca1900d5fdbf72c87 +6728d86b87fd0db490dbaf34c1c10b4d123ccbddc9887b3818f4335baa4991cf +812bbefdf1f3a3c4ac56fb633d75d04c17b5256a8216537c928f9d48b0fee946 +fa5d23ce42a4bcef5075e9b4b144ebcaf4887180c733e8e3ecc1ffda9459588e +a4c2f6af2ef3a06a8edb613ac2d5dae127e50077c4377ece47b7239b15b2d27b +d08df1870d8f78fc6e82a08441ff64b83ebf556db056fa7847f572fb4c2b2a71 +e5ce66c223e92040e104257c916587c439e8ef8cf32e65b737395999c7a435a0 +2abacb6129f95513d1d89d7cc1a0c8aeae5b5aac1d78dc42a37c435c641972cc +b3c92858756559f411b808ba10a55ee5296fcea9f4574550ef07156b66807b45 +2735cbbd8fe3c607b2e683ccc8f7932e4d5ed4d87c672fe56fbe8fb644f40ac6 +9b88d91bbc73fe3b94420e4aa3e493800934a40e519e492806fc34d134989a5d +1c002d51790b15793c3dca232a38c0ed32ced20ea5bcc8da027a7144434be835 +9689e94ac5e8b38da131015f4d34dd8ccded41cb86fa14946ca03f3ca776821f +83f875a2660a64c4a3788038d7ca62d041e24ae86c327af49cea43f81f9494db +935a8b065639c789911a46b3737d9e5db2bd918982f172a76cec867a086cbdee +a030c8ec695dec82fe0a6ae7dc013df64abbde862456b4d525517185015efb3c +f997ca8904e985f2fa2ba8f72acf1b6704ae358e7d7c2868010831ece2c87739 +17c92b6b425ed85f3f21a7bc4daa9620eb6a224cfd08fbeccd11652427fc904f +f589c45547a3a33146b80dc930fc515655593d24d259d925e4fb46996bb35db7 +fea309a4e4162646a85d3776bb44f20621d4193b38a28d1472535ec01d1b442b +b681c799ced74655fa5b5652a8bb99012035a5f66b2729cbf45a998130d619af +77301e13e23fde352a367343b8ed274a70ea92670eedf6f61a34b18db9cadfe8 +f45bf4933b81c8d98a370e5d9afef4a7bce1681627e3cdb633708efa623a3751 +7cefcc75635dd85ad3ea10ecb575789247b9d0257c40f97209447341deb604d8 +6abfb08a5120fb0fe71ec2e337928a4e4f6ee3113064e488270af5425c9ae51b +17e9dd6892f9ea2f98480ca299275c88bccbe584a4a192c966b9dad344753efe +efdb52013c642581e44d1b1c866439648fe1389963039b0a9352b68d7f3dc41f +fd3cf32c49c062d964fd6cba0fd1100beaeebe0fdf55112132d5e51fcb0c079e +f644dfa99d580e0cab548258aa864149d4a4c0e618566fe4ca9ebcb9324bc63c +5ac232512d086830d18d0f6657e9694bb9b3c4f4915a511a45b3c56460dfd523 +30da25d236b0356aed6ea76117885adcf2bd57222199bb5fb586e97d1c89ab8d +08ffff75137d2c0446a81c32bb336562088bea8702fea749c21147defdd87024 +d159b2bf1692244ade86b3a9f63beefd1b030a29b6ccb2904cee95b737180520 +59f4426d40c7ca7920d06fe5cdecd29e70983f787607055b277030105fa2d9d5 +adb7029c7a3a799494c6faa9ecc9bdcf91ec35cf0defc2b95d6bd447904851a0 +ab0e39fbecb080046246ff21e2328ce12bf355ed414334be01ec175299c7b82f +3e85ff80347a20c6d46a596b85e842c185b8e7a9bb8a54fa272edd1d46d7466d +d668d145ac815c5b051536a2a393724dbf52a3412409f40b92f857337f1e0adb +23d2f0cd6fc33564a3c1e9010f6e0350c966a7a003cae4da4767ab839f032bed +9ed1e90d128cd8b1396cef03c25bdc76ab04e6bef073bca02d83684e11731c47 +6937e5b7c02b5214ede19fb749eb7b33a4212701ec325a343a7694dfd6be76a1 +98890826f825f18ad39ebad76e2d9cdd294a79398d431215dd95bf1a663ba9e9 +b130f8e80d2260cddb9344b644ce84974ec8787ab84ab4b9517e44fb09d77a36 +102df99690bdafe89b4edda58c693b7f8619039a3ab676f10d37d0be02b29bd7 +da19c67fa4d07c1d562a65247932762895fa5e9002c45e59350ffb811cc5181f +e8eb49a988ba3342d129e03e86ab9b16d5a92b4e872e973be41da232878cd14d +f9d2db75d4d5285232ce5e4480fbd0c035dcc427e35a9773edc39d4b17f1eb09 +e842a7348246f1d69e3a15f40443471fac10aa392adb71e66b61308508ba380d +64374b66e8d234fc62e392347dfdbd4301cef800aa88f29414f8d5d625ed4971 +f49a4473ec350715c296c71cc7947091b49b62feba902f3d68a29e67522b0db1 +3524416b434fed422da4563d3349d19d187f7f8fce150d746b4a038224e123f4 +8e27c8b26a83d039225b551c489d1309dcdf05eeabc4c1594a0ec8596c2c8a05 +081c9df97b8675259256b8531fbf5b684e7ac076425ec9e4082530763c9142c9 +808c3da66c0cba1f5f704a4d4d25183d243c01d33feef4119606356be453474c +bec5283151aac2b18f231c6542ecd340f07cd7728db3b345aeb977f14962d72b +e54f4db3e5596d6da03985689d8e6929a2aa8cacbe9e14b539cef80b2edda603 +34b90ee98455008b4768dca85003895ee04613075287741fd8ca8d579dadfa69 +2a5ccb49a6c5257296f9fb71028a6cbd52f4daaa7f089b8a65f1baed85c35313 +29afc857a7b9bc8ce5905ff58730033c8d49a45f9f098c39a08c2d537ed00b01 +a6605633e2eae0971506f3df8248ec06a343a4aa93dcc57bcb9afa200efbdb0e +543f964e8b9b524f460ac8a72cacdf807b7dd6efb9f768aefb928876e40820a8 +31686dcc538e5cfd348ac3b6547add583322b3dd982e34ba161ebb0a9737af1d +580bb24095d2629a6db07413050f653e8700156bf5bc85ba077c244a55316841 +aaa3c6bac859ccb7cb9a79a7c9a3704431c2caccfc35cca5f3851a560f5720d3 +34497b4a425b539cb74d462463a8ac183c924a8e53726325cedc4913b1ffd640 +466ac24da3595c7f67993f9b6c22ed186412831a0724a352c9670f6b5df44513 +2f271fb623984cc1f8d268565f5def71ae23e6b5ee14e33c7b3a247763ca2a4f +9ca8f339add4056629787ec74e0bf54b8102e4b22c577f9bf3b151dc8aeda087 +bf05c29721f2e7bcd3433ceff31fb65cd6fd530ee077f4f0939ba37cb38411fa +fd11e1dc3e910c2a7ca28eba1cc381e3e43c3a78cc1087a25631238c894dd752 +46cba9a8df26d9d44a830a3501fd65a324d63a969665477cbc0306aca018eead +533c7685ecd289573423ea384eb629db976f9230d6a1fa6cff299aa98de3ea79 +f29b4c274eebc64bf619fbf552d6ae9c60e7c9de74036e434a4a6dd6e671fa41 +b8cc4c56b811f6ad0cc459fcfcc2bb3654928fa015fe4c6b1177d7c39c747fbf +5aaf612f30b889ba576d87dd4208a9e99becc44753aed1480bd1187ec5172632 +25d00b69d034e040971aad2beb20710f726a696ac48efb960d05a0f6f6f47962 +2c5a5690275e47c173ea000d392e8c20789cdaaae0637e01b321cab63858b0fd +901209b323dbe6c61c10d9bc8ee9acbd2a3cfc357f33ba4d5003a337df07d9cb +32b7b7360148291c45a4d34d4d850ceec2ff978a5f0c90a0420b2bbdb4b6c778 +fe9b5a41833940a0ef9fc0015e0d3e6c80a9bba970c57e1218e10c0c8b8c8808 +2f444af6ceb012b2d9ce6a96eaad590070424ef286225d972be1fb2ec18e713e +59497bb9917a173fd07507a422e35431fcf4fbc6ca86086f289c9680be087a55 +873c75e7998ddcde7b71c54b3ed2f6b3571f0fb3d4c103cbd1ba2eb006596829 +cdca02d166fea0f63fa0c044ddf4e3d941413b900f8550740e6115a86818dfac +9dc935f8842e0b011d2746e198ae3a4fedebd8245b8285b7dbec0ad0a6d1e277 +23ce1da5867caef28cd21cf6378e43858e596f5ac514cbec60d57a6c4c6a2820 +b541f4d6fd50a03eeaddba07e236417341ce99fe674079a48725c6fee9b3293e +7e2b593a573681155c344b0626ccc477840e49e6d7b76738dde7b340341f4edb +30155156049a4600f1d8c17c3dc2496776425fd23287127d5a2f0d9fb785db1d +9be6f1b410830df7f19f4c432c7c7766253c67eac8ea7ed19bb0df2ceb178adb +5437c8d85b7b27fbd2c23d2148305ad2d44ec69fc26880705d4efc5daa7a1a6b +3c5790e1d691a9975ca37d585c845cf15fc3c7b152e29137ca4168d42f8a7d98 +876564c9ad163eca51a2cc404ddafdf61f9139021d7dd275da494fa167267841 +b7903394140a7544ce4cf8b582bc8b0de916890a560ff490db22dd7b27b34ef8 +b8ac86149645f63306cd298b803ce40abda69ce13dacabeb0fd3c44248b49232 +2daa161603ddabb2498b9ccc84fec903b6b5cfff8e9ff5dfde25a69457d5a206 +c0eef48227281bb1866f2d3f13d96c4f26c6f6c2c8aca1359674430747c5fede +93ecc169a5855f12b362da58fa513ecbf15dc22e9ee46665507151590ab60444 +89ee1f1986af4e82c8502880381b246a905c5358e8d23e62c210c455b579ffa3 +d8b3e4d993e6c446f3fa77b1cf68c1ebeb463e9e78bd53b68f918e05091b6b9d +453ec9511b8bc1fea1025875fc38ccb3d8d4deaacb959b1d08a226b4c830b733 +6bfb8ad627152314212da50aaf2c2b5185e2429d46ad31cc6f9db819934e1af7 +b1f7e75aad6653b03c2b6415c11ff5c6918ee1c03e4cfd08de00c2240194df84 +328d780e49d3d616432272c26711cc0e05d88068bd009e5085d172c31c97a64e +f8070719ad1dd72d66ab78e8201cf1f67b84456e3766544471fd7aa45e706cb1 +37a9c256a0d9b2607d15392f7060a47409e4d6a5cfc310045ee7ada6d0105fea +fafed036a5cb444478ae11d920d9541877f8c1c3740afb763c4ccaf77f6d1dbd +40e40ddc6a430e8e99962ad32820055ee55cedc516b17831062d308916502d40 +255f786238453677e19b51c44d8f0be9ef19cd747d5836b65af6dd5c41ea6901 +b6fc9c5c7dbd04d3fb9f7f08a2beeb9d0c13aeb2bc1d5419ffbe2349dccf91c5 +3cb956df77eb73ab811ca30633e6d61d5534551d45ae24fe967cd29f8e19c8b0 +305283df0fb776e5d84c3edd20bc2c4df715285926e95f2f4c3b963726d2a7d9 +4fdc743bb2b82bf4855cc0ab701876827457aecd2a69bf58ffb363b7fdaa2ca2 +8b7b7824ffb535b9a74b00e90ad3f23cb7daae9aaeaedf7d2b97807fa3329cc7 +63689a645f515c11d4e50dcde110015d5599859ca67f59da7f93ab98b75edcbb +f382f878b9b045b9a114b2b4bb6404c0391c8ddda8d9d635a9e3c74d7ebc604a +d07f0d4025e39a369cdbc672ebfee5a287e07d94f161e11d0e18bf764af79a08 +f15543796e4daa5c3497c4a3986084e7a9ba0789a2ed2e1432623b03c210ab9c +e59dfc017ffc59039df164157fe74dbfb00087d3f4026f4d625c41250fd4c09b +b71495a7e2889044e87bda9d1c514734c3d14f4123af5dfb6d618765845f9730 +c66751d613770679c554cd03d99f4653db05440e2bd1202006a05e044e501381 +5f51c02148a91edc8af6143aecbad2804038d2381f7436db6d46b0e9364a893f +5531e49e42a740a40a87614d10f9e22d336711ff79a6b7b9f8248456691f864b +4ee2261a13ea203f282e36d6001cba9fa218c220e447313420be2a66e76c4c38 +2d0cc85cccb5d4640fb8f923e1c55c9dd5cb80918976b5e898f03263177b0832 +2b1917869cbbcfc7789f3d799cb53183bf85b89d9850c1a0c60fd6a0047b5f97 +592f3dd46718e25395b6f13c20d121bb1b8c4778980d05499ca442b3d4363491 +19a968f8a0ebedff2b95cac72a617172cbcef5c6e706b9bb1d9de6431beffbf3 +715116cd1d9207402ed3453f6d343b92cfa09c4c23f8835919e183d14526322c +1722e4eb7e8172b1c8c86eaf3a2187bf9674f482e1623163d2178351ac35028a +89aa2668c0e10315ad5b5f65081e768bf4b02fe2cfa1e636266c4f632d1c57d4 +bbb4470f51d06eb3b26a5e02aed0d6f00d27fc4118b8a0b8b9ccae2c307fa7c1 +83b45122390c52d5de9bba735546c29d40027ca6c00ef6a5bdb99e7d9dcd721e +cf6f3760d25ebd62174aa9c563a31da6a1225e3b4ed652db5b8fcf013954c077 +ed730241f4c26e0d2cbd1c246c855e8aeed5c8059e70d5bb8a1b7ff37e2d9ffe +681f6fef2788e4a603be2b272a41946f63da44978d2b03033e5b44d098998d03 +05fcd73ebd820e5f93a9e9f79573a60b805ed0375c32cc65a1ef4569a893baf5 +45befee450304d67cb3460a10d620e929f44e352157e6d12d353fb3a5bff0a90 +4bab7dfbb4fa6c398877c79fdea6bea230d2b6df6b46cae2dcafecd544b56936 +40a00323ed5c9e30cbd14b40f93f37fc56011bf329ab6fb5d96ec229edd0c541 +ed4f661fb4167ef9c705b1d293dd432bf89b33e97a0dfc1ef10fe8d4c863da2e +b16a3fb06680812c50cd83ae377c94fe26deae946687df5601e56a46496e2e09 +bb38c3414580cc1c327853235c483cf4600d1de1dc59223b4bb641cd4f256092 +9e0f3df061b19e8515fc9163d4f16fb3ee44a7a8cb1df1dda0ab32adb9252005 +34b21ae2d23b5d39399a7dee2866d2962445501d298390bc870d2d9ddb3586aa +1ea3ea0fd2ad4458cc3b80c65364b893640c1c450505346a4f22d17bd44e7ba0 +09368203f133338077bb806db218d3aa4c187fbf7c440d48cd18ec75fb218210 +ce3081e0a56a7b44536910cfe0340c3f48033c9eca88560d8207c31474b42446 +6be9d5caf07a46a7892c24ca1792b5b3efc4dcdad2fef5da25e1b0cf22f2ece4 +0dd8715df95a808a223e3715a4a534bd276b6fb114f8493f72521f15e2f7c194 +77e0072d1c8f2f5a6038f3a91d5970656d7f3f740eecec42daa6615ebc893a6f +cd030de96086b39cee1ef7e9207f1bf228c1fba43c53ea2b34732cf63bea3ff7 +60d3abcd75551d0b8e8d5cb80646ede7706674a63358bcce4059341471a7df8d +f0bf5fb04baf4d41719f505923085f9c48388ce354b4bcdcf4fcdf7846a565cc +38385d0892a856ddbf7f712c156cc114a67cadab7d472be7890b298ce436206a +a31e770c38ec997a397f5af152af3df7e350bea9054df0fc53cec2f4a0ced3f1 +5c59a8436e4f14ff49b66bc6f9e1f1d97d4a0bdaef25cbaef33a0f7e951410f4 +ed5aa38b2da8ee932ba0a414ccf256c5d68271c75d51fb4fa4a7b66d8b4307fa +82d5eb2e0b4681edfef789033b08b70c2e35b66c5f5b868a9825247719d2e14e +7c1be51b5cb7b69fcf20f8435207e803bae6bd01fa949bd59d6e20c3ccf180e7 +e383fc79038a439dd256a4782906723448bedc672c980196562830632f809645 +872deaf72534ad4d42848ce497ff12d28ef0fbc728a7f60d60810db5884d77e3 +bd259d298dfe0e4de7695fe2ab4a43ce1100a5f766fca8ac44a9c470369a151a +728d06bda6ac3a64905a9e7cbe1462bfaaa9a4d57a317682a221554fee457aaa +485729cad67fbb139d4d7d4645457cc28575160493cf84ed6b4cf733052bbc95 +1b80a186e49dea1eb7f4e7aa45fa5c3666ae749676bca70674be4bfe6e196bcc +9a294d3af5424dc1e994e0f0e8a89fe667ab89bcd11353b441e0b24993b0c1d9 +cd7558d2c89419aa18c2e85ca74c013e53b8d5f0ae4c53f29f7ae09e51c2d057 +95423b75ef20a44ab100c45755764a8d0eec7d8f013f30264a648a75bd5b88d4 +1c92ef78305f6403da9a971625be0b9503ba6a28e440af5dbe1954d785a93f9a +7dd2904214940630ab80f88382486c437754bb541c946dfbbdcc28ea0bed96ee +517b2f4de993cced9a5b503a8ef1561b74aed495fd64a44fd89a0adf96442db1 +cd2eb39bc85a1ed8bbcc60063998d49f02d3dc2edbfebdc022b8ce3ead29196b +9c07622728bb9ce2bd992876c2e783b1dca5f33e8ff322f63209d94eba4ac6bf +108ee86f250a9a5a6ae5b06ebdd0fd2751199d99513609864b434dafeddd7d47 +713b3da2b4b12ec7b779003e7df7d4f2bc33c9cc41ef41f0d9529dd0d3678957 +4d66283f10091c41bd2387cc771c4499001ef2c86d0eccdaa904e44c3fb818d6 +703fc8e425088b3753472b6c94a946ddb7ae390b2a2a86e67302cfbc5a3ab520 +728bc8c399655998fa6c4eaa3385df60d379173deadcb5e7543f8c6a8ada3c16 +744ce62c12e0f312ecbe114fce1473bf1a9affb8df1a118878066047c1a1ec5f +ff9b8455ac309d720607eef62d2c0146fb73c256e90a722c5fe42aa19dba818b +17fa00fb024793c03613650640ad749c039550e418b563f2c522eb7a40543dce +7cda1b1322834ab1bd1ce555a5c284c9a92f666910af211aa6b258eb2bf7a28c +ba47b4f8cfefe17985470306a85bda0aee57de81220a5f3c265096ac21da57c6 +60bffea3d98f2358dba450b29e832b09e764b4e41f9952e2935e09e76941a850 +d25fa4f4f916552b7ee31144c78776337c67795e135e26cb5e4e80484fcef1d0 +fb6c8a86911f7358d5077f41b31ebf9886430964bd316f75710d83c7dd696fca +7b6490801cee0387b0fd42342322121f43163f512ffde8f284ff3aa1f211319f +5556d08adc1880b1cdd4acf7592d4ea358d2f34e69a73ea9891498cd3d59a74c +7a7c48629be752b60e795a12c1fb5f6d29ea48b1d32253e7cda453357d769774 +af1728837104aba991ab43309b2f298290dbdb32066b59b360fdd2f0e32b77d1 +797406014fbbe7c9fed681f4efa445ef694b26716a9d7b5ffb1375628d61d800 +70262b3011625594c8eb5dfd7147cd224d15aeeb9d443c88359236da5514d32c +2308414414c22f47b85d88cb6954eb5a7bf4283754b6129ff9ba6fcd78e558e3 +281d4201679a411ad5613e38f5542549325d6fa0c15225eb1c13917b8d33fdc8 +30b2eec374994f6b6a19701f9b3a7ddcc8b2478a8601750da43565c7acb34114 +cd24f87d601f995fe17f94a33ca9005c53a5b760e6bdd4256f716c8d59d81128 +1e72c01629c2242295791e664f490d2808fa695986534146942c7cada8efcce2 +bc3ededf886ef8f4d0ebe0839c90496481b324dd7de90e2713c985d0dc196f79 +059f964352a2c72d2df0b13a4eeca5282091beab8bce8f1d305464a8cc69515f +99c720e6e2221be1047c938a112f3e31930ad86bef1b90fa747238bbcdfe5a52 +92fb9cb8b9a4165c7b0156b550b536a7680f217f0e7130785644e1421a57c9b3 +e94d27d62d2835530785126d553640f88f4e5d05dc288743817504d48fedda6c +637c53296d2703c986abadfb74f6f830a57c0c4915ea7758f2dc0881ce5a1426 +3f298c8ddf55dbab0a8f22e8fea76f63a565059c72e693d7e29a104f7f550d0c +3d871d6c7e3c2dded288500f8925fcd72cc838545f2c7c05086cb8c19a3c88bc +dc738a47505ed1e76616fdeb9421861d5f88b0904deb9ec637c997495ba85d93 +7a491a2b125e3a7a97046bb2cfc7187071067e6382a8da1ae760f513803404dc +47a7f93b8f3a0b2ed5f033d65db9a5d5fd11db4f10152b19f4f5b2f48b8a95b5 +50145156dbd721997233961621f5a64f1e6513472e083c2a5357b08537c53b9f +07b90663adf19c5028d53d26c4dc1c540c86e8f744c8e1d02dc76f137bfa6a06 +1792d82752b522e8911953e0f58906d47bf089ebc14dd0d9948bfd6ef2e0c892 +c8ceb39d382ebb830b9e6ae7cb522d189b34827f45c962b0da89ce3ff3e9f6b3 +967f59a7076733d65ccd8526a3b3db8ff45ed6c16392152b5593c94a1842741c +2bb710e4b331fbd7bfffbfd77f81ef4d9c83b10eb58a2f51c4655f6bf062783d +18c3c06ea4e922e60cef329de28fd55232aa8dd4224937a79723519b3b60504e +5994fa207bf4e2908fa81ac69a2841d21cadabbb92498416a04630520b391c68 +30687dde665acc525e86fb783a3870ff43e0f0b55e50798dcb788ae93666564f +ba7a6fc3742c86ef7e500d2ad2b77ee29348145b0738579189cc36d8fe15c5df +dc4b66450947f168347afd5238e153b9f2b1d7f64373c0a90da71eeb18f72b9c +f3e48ffff7c202ff5a7c2cd53a1c967f7d71e7cbb4e4159e5cb5f475ba0fef4c +0713a2923adc04968030dff07fe9489eaafb0095e542aa9497544d47dee12c4f +160ab99511673a43cc89c8629bba5f3863636b9ef246078815b283d9b7e91399 +e74cee17e147ed7caca02f203ebc977618ab18590e217ebd57e41ca020290d84 +f02a4fdb4f2b97df16b6cf7e3519eb810b654d0c50c4df1e68cd54bf05e52e94 +7fb47f105e02d1a4b7b78c0ec9f3bfd54b5cafd746322614ea56afa4d613d5ee +6baa19c573bfd4640f9428f23988fd9f0ff4a49457e7bf1f25392d0d68eb89ac +68f43c2c2e02bc83bb45d9f541bb2a6ad28b8c70516ca2476a52edb1ad4b467d +63b970e2e40af4c59d46070352162eed10bf2662217b32ddcaa42b5c9ca7c486 +f3810c51a5c9f25af078ba635ed08620bb7b91818797cfbf47e7d9e22ddc1d47 +de4a7765c4566b479a1c66ae9362bd4bb7dc3db16daa5d27e79918bcc11e995e +3055d826b489f527c5061f4d46606c7a4375ba317b35e43ddcc5811448489273 +c8e114b48d9e4e32fef51ae8e4440ba35f4c7ed307fc81cedaab0264ad7187f5 +0bdda954f5eff597f65759e538916efe1ceccdcf33c363a5879e78f1f47dd1d8 +2fa4a4cd61fa4d32de859714ccee93b1b64a3c7d9d6bec30aea2b10c896bb60e +c8336dbcb047e66998ddb368e1f83b94bf3df73639560f568a5aafdc810cfa37 +f2c53a0f3a5d54fa0cc59a769f862b22d654472d9846099f5b5841d5f30982c6 +ac2feefef527613aaa3005607cd82cd56073dbf37d446f53c9509d9540d4b10f +ba4198cee56d6c2448112ce7431a382fea84c92577de8ec194e3227b378ecf02 +a8443b9f395ba5bf18899d37b2cdca0df725fc0d3f2d2d010ef35d1d11009c9e +23e611de999294c5b3854ac2cd44c6a3b5d93a2e3c0979f2aad87ad368478739 +94f0d9d78334a8cb0a9ae03cea4a9a211fabdb4cc1c50b325754e9c615facb09 +6e5bb94dc9b4ea3fa0470831cd8eb273753710a9d0e1122e0390c763c07b7296 +9b1ee534c46a82e62dd6d85eb1242f577a444cecd5caace05ead443675715ae4 +b2e89c8a3f861aaedfb882b2217c8a59f074ff7666d9dc0e77760e8ac0131580 +b4674ee1483cf7952d5f2614af279fe375d9e80947af930dbce773f89e2d1942 +55cffa5a25fec611208a5347d8da41d06b265537590ed2a18dd61244561f6a28 +6aa7b7d003fbfc182bf399ca86fe4f3b0f9916b4be9494dff4dde43d543b4475 +2dd8d8921b631588a792ea159aadc9a05b07bcb5ccbd39776eb733a2340300ca +d08bec731a9d17bdfa35ba445f38db9efaa3f8bbb550cea8b742c00ed6237599 +9b9292275df9aae57f782a7ab34a92782a0b1be183913061201faa4340b54d8a +0ae2acfb004ea2366aef056ce8a0a0e17cde94723223eec759e7abf285a133d3 +ce981716d305690e627509df3701119306b8e8adbc9cb7891bb5faf9a6b81e6f +8b25275bee86edb442518ff110aadf7cb120bcfbd380af3c91e62f1cd51333b5 +6b25de8112c6d47e77bdd08e3bdf3bca8f20e6b96b687450b23fee7ded8099af +31a25c939402b197b2356cf9d4d882a02b01a82bc7091775941e0c883f9ac2a1 +30ccf1d51440f8aaa64a2d0eae3c5ee5378b3ec57a27a6be73e3aa6676cdf3aa +c6ad5603f20a30f032386d1293ffd63b98e751c6d937509bb27a0dbdd677ed62 +dd628e490b5a3852d2841774d6a3c16912b76314cbfd630bb48b958824aca788 +36dabb0ecdab2a2da7722c9e3b7f511a56a2498b329f11eb454b34b185704e3d +8c244f54c36945370aad2050fe034726f739edea05b164662094962904f8474d +263b43008f4ef5de0cc69c9dc7faa91c6beeb28d2bb977fdf96bdf27c4a49fa6 +bc7b802373517aa1e4d43342d90acb99f8db854b41bb95fc333e3fe0ccbef3d3 +de3abb46991ea91baa44fc52b96d5c5d683675fc6498d85daecc9f467dc76b4a +f039a69902c5c677e998367aac1d3a765f52d55cc48ecefb30d709056d22c8cb +b21a422419e6b9b9b50b3b5ea417e6b079d6fce2447322a960b74c33e4f7420f +0ebefc2f36471c6f9997afdad5632ed7c0913a76b7314948696846b793aac81a +491c8640a04a0867eb16d497ce0f26bbde677f840b87dc743122a144ba858a80 +1ce58bf6b3e5fc0fadec743ecbfb6f8fc19f778a3062cb14cf9556289e7484e8 +73e950c71c46b940d60a6a718fa72927e770e7a917987ac5f0afbf0c5b3c5ef0 +591455ae1aee69f4768d690148d8e2c831febd5b60203914c960015edd0a8e0d +e3a47cb4e0093193dbd2b925bc3921f88b58d856b384b1f0158e44bee3e17306 +6c86c5a9673521f0c6dffd8413201a17e59a8235ec8bd63e60176ee65fd81832 +7782aed7eb7442d55164a7b35bbbb6413a36de24dc127cde8eeb9bcb1cdaee56 +7463bcccf86e738d7b5436d1079fc6aef850369c04139e93933ce920465fb403 +a1354553eaf1f8171fe79e61fe157bb8c9cdc80467859599354b73d983190ce1 +60171ad887b1d46bf64dcfe3c092a49e3b9447e1d2cecbc440a03a9ecea40105 +a7bd0e0a4dbbd18030887df3dc8271fad0a92b57da8202e425cb672cac0c36a8 +095330aba0cbf4635969d6f35d2626fe382ca7890b5743df92963de76e7eb4bd +bb8a9a950ca59a553aaa6a94ee66b9bb154b86dae32ea20ce79de441228c47a4 +aa40949db9fe13d761781807d8e7adf991a26081427cf719ae656d40f3358000 +37330a4464860a41a0653fe5fd69adb6a733f84c2617420527ed720b944f022d +890b2cdc2d7dcd26419127ad47a747c9d3e0f973ed50e9a83329294a7ef63b38 +bc297930be33e68046c466b7f44c3d374138e8ccfaa477db9ab5d83a77df8f31 +d330555acc08f04cc5e2126d4a163313183e0aaaa8645e545aa59c37efaa3663 +3c92a17a53afb715a6c8500dc1e2c7d454611ff5d7a60aa8859b8c3fec060f02 +c9576bda4ab3b101424b99e07096bb5cb7625bec43ffe2180635994158aa8b03 +2c82a993c6c7233d971d6c8306a2cfd45c787cbb5a1dd9fc01c9803689b4b281 +c82a7469992dbd60e611e37f0ed8133feb5ccfa57d9f091758622772fbc94e6c +54e3b3d94983d914b3fdee77954be3252497392db6b3bd290c85e0a295f98c44 +5f87998274dbd62d5c724c3cfdc2385c6b54c8f073f9104086d618ff37bb4e1d +5d571a0d41df55629c5c226317b77ec2c2441b5af0166517aacca31193143e96 +51ea351b6b17eb764be26591cf205855ff03022af47782095a3d03c805dccc44 +20fcc40f5a3aa7639853ccde5badc2a85248161a9266a60f17869ee89191524c +f286cb9cef6a48d9fe8256fdc6f53d608f99b8cfbc5190402cbfaa58e16a0e87 +9f4cac054676b5f591f831c07a32533665bfc07dec0c8439bb4b51d54e35dadf +5d81dcafc0bed1a21f0ef2fd67547f6f74815d8951b7cea076f26f5d19468e78 +4433f450bcd1f3b29bcdc72ec68385d908e773b6f9b1c137ca2b69b115d3bbc3 +05ce0e8217a1f42305c77b2bf244d298b53937579f5d54c94ee6f8607eee44ac +06a657673402aa59402107aba64d49f1cf28aa48ef73d5d0ea01218c7b06100a +9501fc2c15e5b67ad8f65eed9e42cf8a53cab1545dbf8c82803ec71a1bcda4a6 +0fa271fb315cbed111384051ddd396b8902ec7976fb48e216e3505a16a30e96a +8d2da699b6160c8b3b5af59a00e705479d78dda5e08870cbd81da9868000bff2 +5a3311cdd21326a47a665c81bc450ebb14884ca84b2a7a1996a558330a7f17e0 +99eb457dcccd90a9d303afa279b45af41693612953c0f086d9ad81804d09759f +c91df65a83c83edd31e652ae98f3759ccb963f40e83f532a98528911bde3d7cf +041c6f8da633368d1bb63494e8ceeade4b2a50e6f3f4203d2ab275b751cdec18 +2509d76661094660cf22e58264dbea4738f5b2f05a4b6fe97509626f79561386 +3e78b156fbcd6ba9df4a2edb9d56251593feba7c510bce2768252c66ee7a096a +0f350a5ae6fbb6c59f5369b3a94c7b4026f7f0670d7d7c01c9f4b58209a16b0c +210167490ae40b4eda10dfcbb455c1068bb91d28634da73dc05830a33e0f2542 +848afe96acc2bcd8a138eae0baa5d1b31436751c649998f3aea75e95f5248abd +d62f6425fd91506fd25f925097d6d67c6ca523f72e6a5b70164e0bc5c5781f5c +04bedd5a784b3ebaa00c5ec187b9f30b36a0e3f6e4b249fc4fd085d7fdd36446 +70c740d4dde28e44a1210323dc4b1d6319328970acd5102cf9a049bff4e99cfd +28ec810b2575aac8efdd65e7a9e6d929734ee4927efb0e25f843f9d4649d847e +5917b6e18e440f23166d04e721696f18bbdfab79cf291684b3f0e8847007df8d +114f4b3e7b7933859b0e27d019c0841f7ad680e54b25e7b52f8e729f9a62fd6f +68757a9a650f6fc3cfb39f7ae9f03566b7d5fc87d765bd97e08e87e021a0369a +34306fee74a2fdfb11f3b5f75499159e5c97a4f1558e78cae37ce871af94c108 +6b1cef84418ae4408897f5920443585f5029c8d70ed575c19eb1714e2aa53748 +f03c05bb82a355df1e181c1f3aec05cd63370e10136a3d912da64a717f66d511 +ff5edc9e42e15070b54455b95a52ceadfd2fcab3b3c338e6edd087123d2ed361 +ddcf924f61fcae961c6b8cda5089b4492f47db89088d80a994ed9551b977fe94 +8f2d92dc83f93067b38c91e873babd2ec1c32864f521770b3709c4ba93eacfd3 +74143d8159260afb59f774f70fc8a892f765e474b5e870d7a210ce552d1aa077 +10cb44f43b9c3e1bb6b0767f3de1d18a485316e80cff3a163b8e44970bfccb2b +ea9f75157b99184cd1313d47dbbb21fca18ad708dc914eda5ad4122f7476fb73 +2c3a405c091a211756647e53a010822ebb8cfd4d331a97a1484d239986732179 +4ddaf15ec99812ed7f55cee6f8f015ef62ddc931378470c5c1ab335f5958439e +f3f21f81e2993afb8f512783959134886b73df730f351e2135be658b38e005d9 +2be5950daae49a5db747e46f8376c1aa09c178b2d4d08674daacf05880852147 +6aec9a46230df3f4bdcd14081f0fd21801f7d26a0b0c5090a3e144f5f486d5c2 +85170c17145fa317903e7ad4a97315a8c4d0a9f845cb2d5fa818894f8647e94b +feac033768c71dbcfc7e4b2ee4afe82fa0f63a2e88d191e579df6be30dabfb4c +39116e045c791739845b789d2e5a4f4e138394c57ea1bdf03277fe1df2372e57 +824b4cac8751bf0d96c27c691b71ee19eaef51842d9a621a180af064aa774e59 +6d17c8f39b5095b8412fa0996136b523aa7e2d34a15ef1aa3860d1bc693fb986 +df92179b5c2c283ec1739a31c39df37e02570b2068fed8a7865d530b6b83e6d8 +c90755bebf25f806731eb5afe12c69b7b200595c5b9488511ce0b6d3e50eb78b +b87384aff6319f53fe82a57e39a9758b4c2baa7dd9d237fcff940c7dd4e2dae9 +fd6f9814b52ae3952ae507d890e8ef4e46f47644d15663e50bef06e4c6e8f4c3 +c9bcdf6ce9c12e59442aab2209222e8e9c38e8d836e47401d8912b5944783d04 +2185e0b5d202456311fc41e3c9aba816d79444213f17d96b673bc819a5afde1b +9fd118916aa3f976b67d40444085ce1295b2cf635a58d881b58e9d6da3cd47fd +c385915a260cf460cd51d103aba3b9b7b718a6cfdf6e31ff90aa8abd8149720e +7dec2fdc1f9ba1970dc589375737d50861ae4ea98b54f134d7870b435943e4fb +50896149e3f419de19027f01feaaaccf1578410450cfb575957959a3e7f2b3a5 +295a1e03e47d2cc044af13c7f8d2e28f7bc6d498aca27d9503e19c7993795444 +50a6820f38c24b1415aa1322f2d3dc5d7e7802067fb426beb22fd9da5d3d7f77 +f7df61f59f5228d99e930652925a12436362de55a25f190fa33c3300997dc628 +ac5524bf2954d119407635b2f866e52bd1a44d764df26b66590696abcac99637 +6dc90dce6b68da6d630587aa9cd14fd4d9c2f27d8355179cd1bef7eb8f7b3ccb +adaf1a938478ac5f858e712f0e908b394702a6e1129d6262b299a00e8767827f +dd0f7d3bfb425b667717be47f8792fc7f852e2f3119a179c7d156e5e020926f0 +1a92a05ef6346a64fbc0a1b09ccd2a7e09d6e848570aceff71cd34ed28ac95c4 +03a468a2439ee50928e555086a6d40caab8d40dd847cd13e67f5acc91a12ef37 +85967f08fee498e5d9b562fa2cd3473995a0f76b860fd08393d4e59c38c86634 +f9d044b6d6184ff952b377691f3970e155f07412a640d49b696e3ea58cf60630 +ed965503ce7a6c0c145b6431fe0a5dc244173a089a49e0907fd2f8fa080f38ac +ff70eee1ce6089611df1f488858c74b81518bd028d55b437878dd4d14e8d5362 +10fddd8c4cc9a8ee14e961481d0c0b00606084ca496a88edb25d984c34f6c1d5 +a85683fc244cce71b54eda970b9111a6ed2ab33c63fda50b49d343ad5eb6562c +01748041fa0f964183d14239a0292d06ac831129fe7d7d34d0c82f1eb011f207 +c63fa085625feb4b87349abc9a065027ec25db3534c91ec2843c2ec4ff4d1b27 +1b1488dc1907ceca2d4eacf2d0c4d4c7ce6c42ac81ec78e853baf03d3941ccfb +03a5dfdf040fbe9e61613d9147ce6f9c10e4f96797d15362467058bbe68804d7 +eb7113b166df726b040f2cf4aba8bbd3ed943c0715e09bd676cfd457a3c1113f +eec29889c0e8286c314b74e4b39e2497c3c5dfda95278958c0995faa6dd4d9b6 +8dc6c934b1463734ad0c71e641298ae0aca519168bc667ecc7239cbefe78f34e +465b10de38f54923be640a55ffb991a0164a6f8ccc09c5b041809e6ace280343 +0f447b22a97a8a7a340078fe1b765bb6f55d340f757ef8162162883ed66c029c +f7ad3264829ac8c8c26f9d76d121167a912e1bc1e2869308499a1f8dc9eea626 +fa3f9d1ca80b45c3ade3621a3d4ba9ad3482a0e13bc7382af7157633adc45822 +d9a5c8a481775c8a69765c8956968affba3c77c115532c7680859c41500c13f6 +6f5b445374a79bc199d11930b2fa1cc1f8c76848b7a34c65f24a86acee4f02be +4eda4c7da149723748b748c0adb67c01eda2a9c0db4e527f289281a70c32d574 +5486d18a49144a2d6f2d4488f61f0803805105b307e0ab0f4d795a0139acf396 +9c3cd6092cf0fe955653943dc38f9220981efe8d162caadd1f3587a5f434dd9d +0a5efddb38477d669b1f2ddb90781c790ccf341d0a348112b559746dbcafc4d2 +e9c81839e66de708f12e907552c99140c428b13920f459a455832917abc1dc21 +aed809121dd4a9df4133b84378e413e62a0fbda75ff4e86fb8fd405dd3f252c7 +bed26aa06b485eb423c2aa83e0a478235240b19ef7f7ff1875c21831c7d50eaf +ab4e0fcb929725dc92823eaf498c806a1b0102be38e754e3dc87754d1f480c64 +30d95da626a1c08434ad5edfd4e6be96a5c593b96f062d7c60e56a4a07152c23 +7fe4e29b99a23cb4a93ddec151cdc68fdb8428791987935574e53b8ff6c2a4e6 +4c6b85c47607618740797ff21b34f6a4a534523c649fb18798b55ed04d9080b3 +67bac8232a2be46e4d973f3cb860f1058ff46f7af441049855085e9ab8de8e1d +cf035c13d86c62a1e7e39bf4cda92898a21e9d1a878f8cfc0c485d40c35d2443 +87a3a20eaa6cdb4920f6779fe9fc3832a61ceefda3d6b45b5b8c27845c2e9e2f +c572e80423fe40d6d695d11853d03ead0e46974105333111101dd791c7b03f6e +11a7f39a2d2232c9452df2e7831261a365e3e79599b69fa0b787844d05c538ef +3274761f16f644fc94a7fb6ca0919fe5ee78539b59fd0232fd6bdf8e9e4b1c11 +485de6c6c1dc27f59fbdcad2790d1f9b9dfb1f88ff3330ca215e36636dcef81d +167456983820580af7ba55c1f1c6b217f8a11e487fee442235768eb7b95fdf29 +d44ab8c385236c3947925137e26fd1278d4d3fe710527d9b017692b357aef874 +ffa8c09d59b78f3175f8fff85cb4d3e07c21dfe08db6c2036e98dccb11461fa9 +ef986be98232c893e25d76cca348df852963d1fadbc217658e33c49bacaf43d7 +1ba692b8e65feec21749e489c90ea26fae3540cb3a2af56b391569fbe2e6e1f0 +4e5a83c374455e1fcb6dd1adc2ed96007258416817bc4d1585625bba98ca3ed7 +f49f6439bfb0fe67ee1752ce1a678cdef7d9b02422858cc2fda1b58d0a62f598 +4f78daddc56c29c9c5d8d1fa7567cd69f58b3f6407f925fcadf6a1111978e51b +1730a24ad9f5bd83e7a367c8e258c2d45f2dd5f7c3034690e968ec4eb4746a74 +d7d3316a6dac948d3db0b8d069bd2e833120668dd794d89f99166b04fed9cf0d +b224d6985605512acb08fa6e27a8772e5e968fb66495cc618aa42862174f174b +b400f59621a17bbb22087385ba839562281503632921c176c9e6c27bc2aaabec +ef388fe9cb262e9305e78ec22a52f0bc54e0c4f167930de0558d3a3f228ac651 +932828895747c28573d3fb5e12bd7dac2ea2e00606f1e34ec36443822cfc8258 +fdb3b8f3a8d80fe17c6ffd932d63da28b50183071b30b198b078430f8c25109f +710ccb6687fd2c3bcee778a5c80efb9edaf2609d275741575601b52f9b7fd6fd +f99c10d28f4576c29530ba7d40ae384be27d88770b0ec8d870dd3e4a20a64476 +a30282b0e816c58080b09eb651c046ee91f52ac08f6c264a36099659d1e50e75 +ea75dd82238a36e7ca1c40cfd44ffc12051b06f24c2c4a4bf4bcd4aac42814cb +ff434dc7c0a4356f4f9395913fa1df17e1ef2caf2f4afdc87189276b09988c55 +6b6bf8f4698d33e6acfc89e1bc25f0614cfcd94e575f0b881c1a8ea294996482 +ec2b1b0a6e4645d68aae01131692336fb74bacc9d91194054c76b21c2b01a8e1 +973e402e8915cab5c0b11da03ae8dc4bd570cf65746f0636a30c8cfb92752bde +277aff02df8402201779f4b675c09817faac3b384f6b334524b08ae52b7995fa +4e3c0a61f58fda7416db15558e1a6772a2349d2e1b1c669e4ba39a01b7b18c98 +aac82b5cddfde1daf47aad0dcb6ae96593904555ed04ec06a4595238a3508d4b +4374bd37d3e8380f49c01f39c0071655e8b0808e9be5dcb715faa15c7875871b +b9c75c2e0fccac1c5a597ed1d84a7f570b9fc582c6e54455551fbdeaa8796f01 +5800bd5e2530399b6be18f4e406e42ea671406ea691c732ab92182cfd599bba2 +5abbc1f25965c5696dcf2f2e9c64e138dc10bff55caa9a58a8c34519f8f50d52 +894e1d616938225abc73a28cb2f9216e8b7f1928a82194463a6092356aad8fc8 +35af7da897e58ceb6897ff6930e2712ba97e6c53c470d177c91300dbd04566be +233833750c2e79b320c33fb7413c856a37eecf0b89c9079cc7d70f8c62e16437 +3b8f43e28aeb470b8865aa04be19307d3ed6ce12940a24d8d43ebc16ecaa905f +2d7183d425035db5d77b518c34b2f002f199d27788664aa94551a7a5fd574368 +6d7a10851ab124640d58e0f67f0ad64bbe8c7a2654a29391485e571d5542f87d +4d1b016cfd97584f18f57f6bf9e2fc514cdedbcf3ebb1518e9b53e8b64752eff +909c7cd0a34a2cd3a945ab3c7049e255ebe0e40a84e2dd81d67e543ecc5a6443 +34450a5cccd34edd52dfc43fc420ef298103431ed1e49e8c2b4df26fd0727bff +7f3ba05b16232f4c795f93a5912f6002c43aa243cf3dc7e4fa5c8d9e40e96985 +da2e3ead98770fb7c07cf8e71ecff35d2c255d6a3ab730ae6c2ceb3510752f0e +2d8aeafad5a4ecb4c4d81dab5336d764e8b7df68b5088d6dffb9aea0db0f7384 +7593dce3f68c793ec780cce00e92e28a342d05f2d0b0d48fc23336c7e0dcd610 +a37eee3cd6863fd4b74eee6afd6f2235f92a1d32d32fefdfba511c8837d6eade +7a27e375ff1235557486ef07d80a2cbcb0645ce7d1d2fd06247e2b52d47a25e9 +cad734659b9bead551871b85a2aad1340a9649467a791d89c9e40c6ccbed4f1d +317b63eb10fc5b913c72e9457f0ba3aef5c50bc83248782c220ba4e1540f7192 +002c183e861eb1dc7f4f74a44088fee28b03979eb8e94e9392dbc24aee6ce563 +f4953106b2d7f71e2d38639965fa09d69d7c5569b416068612b32fe5faf650ab +8ff820bb496ed9a4b025874f7477feb37157df5a35dda9a19a7bc3fd604e4050 +5a5c5ec5e9799cbaf4a8d525d2db9084f07395d03ed7a95e2adb4865cb36f3ee +7a8cbfd35faaf669c4fde98ba282e5d2fdf8ca495ca7f1a054149d15a6138f69 +9a320b1a30f1faba3ab29ce4c5e4490aab404893afa88a1b7ae6731251e15db9 +b00e5f82f5f1e03145ae703849120f65fa475e1810a0bc636cf540ad441631a4 +52ab9767b4bc16efbfdb5c197501b0a8344fe008afae144c126eae037fdf9364 +f743c060bc4d17116e3a59ed0dc0e3218949c3d9259a6a4e0be391e8c8455600 +7871c3e0db8e7939346fe37f14d7a980cbd945bd85a78f84eb1809826c6d15d2 +628f170976117ed59290231459cdd6dc863cdad13504bf2da4c38ae32259ffdd +f9325ce161a472c192dff26a10bbb74f2209dcea75a92fddaa50bfbfd12f6683 +3054ac58aa385b4e00bda8c962261fa4edafa0e85ef7fe908662b9f1c26cc471 +f28853b5c50652538f1b984db2197805deaadc12fb9cadbb68399bec0f707bac +dd165f865a0e9a455e0a8e317b3b4c75182a5f4001c5c4dd68bdaab9896090e4 +f7e92f51bc147280b33249fc8785acbf402441e769f70b4d61991c51f6ae12c7 +6a26eee6986509400ffdf62268092c7e1ff78ae963673b60d874d2a57c2a1822 +d24822a1d8fefb88ce18b20d446f560f86e9238ef3e78d54ac04697c4ffcbc40 +09b9c1c2acbba6e17ee5fd9da57fa7e0b6aa720103862c9e5ff1567506b5e09c +47fdef0cf04e4c10374eaaa0c47957ffb4fec3a9ff0cb465a10a5b6a09fdd474 +204ae694ed6e2b31cbe9333a6be0dcd9cc1a17672fc2be032386351c4ffa4684 +42810dd1c372e10a5343b97d6f623968691417bd32fbda32b1db60deaefa4df0 +c804d1c1926f6abd1e8d8fd4087a28ad05cd7b13080490b1bd03121270adada5 +e94a72be1e1c7c975d95690d4c2147026e373d2f464dfee782b5d074cf3ba1ea +f669ccdd1ff040728bb9bbd3f27c2c63f0d381042a5e3d5ed43c397513a5aaf7 +62b4e17f1687eb9bcee0430b766ea8e1ecd137035a7c90b29e0e26b76ad542f7 +26fc0017903351fa32c9e9242aa77ced9f71623ca744ada6bf0ad855875ae6cb +90d72dcff52084c7969ea06a49db1c0a2f11a82b5f524d1efbc7a48640944d28 +2c92da4d78aa8d13dc57a2aeb3f39e788e3563b5e6a36d78ac1df07dfc527938 +a12a129064b6e581d90308e2982fbc3d5eb92d7ab8b2e34cd0b2b9d7979def02 +e9a9559cfb15221889619ce00ba62c09dd6fb51e6acee8bada9573614a0ad0f4 +411d35ddb1c1d801a8970071bc5b7b5d1c41e14e96ee54208f17ba69ce95977e +de58beab72e4c6bf484a8325a96153ed4672010717157034e02e78ab861f118c +5ed3409b1db8f05f6ebe0ad2ced8008a73b3cd355da36c721aa40bd1df3f5af3 +41389a9b965dc43002ca70a828a849e41425c85cd827fe6e5416d5bf18347726 +241d22d665332ea27392009e81b3a24442fcc1b62832e7b81b02480dc6df345a +ebd859cbe6a4d439b8400f4813cb9001f4c2fc67d86350d2004f7075a8264ec1 +e29eb0b255c6bb530206e96f39611d5446ec2c468acd603423137643e26fa702 +942d436bba71856e248c89000a6021e8bd2106861ed20c5b02ca4da733102b97 +7ac7e43e8099febda83003b6a4610a9fd0dc723d506dde420cb36e188c56bde1 +0a433a8a85589d9ca5fad1533da73075afbedbeb5358edd0e57492414a09dfc9 +418b0910b3e32efe87c0fa8702480aef1b281a5acf6d577e49f801626b9d5532 +d85ce8bab30b27c9053f740d9b1ab84812071dc7294fe5a79dccfb8ea3d33e6d +514e303c806cc8d27852acb180e2cfe39c72181ff35c8799371fb5c0c0c002a8 +b1b63207ea72646785a35c4b1d6b7db906f1a1a814c102587a4640eb8db15ad0 +4d99460c843109555b33859b1aacb2e527d5aa120dedd7e7ff078de5782ff5b3 +3aa960e29b51b867c111a439bbae20cdb9cf3312288ad9eb549a989d863225bd +a7991839644cee9cb7b2544b41e4777dd3f0dccf0337977e32c6e9791781b091 +2e568744cbb4a2c3b431f62385def0ac69ee221d4e339b407fc5641b1d67026e +76e7c4425c5c6b8f56a1640c0b78c3c514138300fa971c220fee8ea1924802c2 +f58176075ad39d4c3f336a758956c1502539a23d67ca167eb119af5a95cbe134 +5989a25786ecb9b34abd0b5814468cc339bf0df3f63fd5032f0708bf0cfe1876 +91430a5ea81e649ff57f6a2a89e97532d7b58ab4d9be95e234885b39a73a7fa3 +d0ad9eba42dd20ebe1c4805641341b7a06ba786fa8c95d055de5b1b35ad51ac7 +d3a98d7e9ead882c5a0911fa45692e6dbe34f7fd318c17ed7094b38bf7113f02 +053f3b8a8c74eff956bb5c15f6cbf212059a2edb25528f60f67d6204b08ed8de +b3f591ab5fe471ea4f602ffd6903afd034eea6b4fc7ed858c20d1e4a1c343ea7 +bf6283d3f3d8764f3b89282188941876679b48448645aabe8a04b8ec12e8d76c +75a5500659e3cc3109962fe5c945979c8f56a997fd806f3838337de82cefb25d +986a4e39416a170cd2c2bc223838d24b15330cb2352ba753bfc0d084886e7221 +2d275a4cc0faec6af2cb8591db187da7503e479c83d2cd78745c939088650573 +e9e60b3aa954044b347a63eef25daecc3aeff608cee0c3c3a7864081f7b237e5 +6806e57f68012877e0d4210e85d8c0f917c3172ca19c6fb9198ac8456dd9607c +aeeca44bb0984130da6830522697fb5d8408430217ff9496275f0ccc323a9bb0 +52ffc86a010d14478ac6ed38eb6d4f5095bfb738ef0d88efbb5d26558f3691f4 +59f62b6f3d8f3c2bf2a87634d6b65b5c7c0dd9fea60fa51822b8e185999b4c60 +73730e89c0b8e48bce1abc500c1929571afce0ad11147bb0fb682c976e67947e +6e02b7cd6aa88a3d578bbe3ea88a458629dc8799d34df525fb56b5618fb025eb +c50f0659d9e9922f0dfe78d0d9c8ade1beae1cad423b5d63d43b0e50b8a9707c +6322600d467750cfd7a4603bbdbe9e7c01899a3447ee96c66a464859cb0a886c +baa46fce0373d84f6ff705e177497315d48a1b569ccfb7ff6802c2ffda806e11 +8cc119e9401e0ac7745971d33f21622cd806ef4d761d23388d632470f4c04ff6 +ae7a008f343d80bf70a7d02a9aec04ec3953501594ab91fdad11d6119e6e5ff7 +5055af6868e9ee262c36763b29813f6a6660b18635ca76c9ca7da158f9cbc823 +c234598ef5e858eb25cb422a0a30a7bbddae046b63b2e18832d73b7d2c2c8562 +31f88e8d3ec0f6a3a319b06cd5ca75a8b78b060de77d6108f14182836f2ba937 +914b433c8718dc06dbf52c11f6db1026d2e03418bbfbd297158e18583101bbfa +7d932e2ed1a3d4bcb4671e9c35ad24732a296640cfe62adf680f66175fa8bfb1 +078b4f8a36b6a04c0534fd0037e9be040eab494fe8181ca7e99911f339d49a24 +8f084ff5bcfa9073e541c2b6cd2ea98e9818ab8594a1952a9a4a46ff5ad29692 +5a2043cb4ee3d9ffcf04ab6847b73b870350c32648193193b2de0a087262d213 +b270353988ee6dad64e54fa69ce113ba122c659ddab50525a5c5fff3855dd0f4 +5f8d1e6f4c8790ab73c2637a89af0adc86521390ca628b87a0b28b73d527dc77 +366d2bd2bbd51d881a0cf439aa85e19315923793aba81cb43ab8af1081a43f03 +8a8b6c6cf72b5f5d5761c279d23bab4cfe0db2c08b557201c583f401ffd20e7e +a459c408130a1cf7edd311410d6fc05c7cddc6b57cd75ad08fb7bce952e0e378 +f6265ce9669177c624184dfd2a8bb7318acb4709e52224e44322a68e23728410 +e7ee378db5286996320a84ee9b00bb98cc9e6a1939ecbc6983827be07a8d2f4a +7f16bfb7cca00c158e584965d7899a0a627163298030b8ffbefe9678289f4bea +f835f749d878ad6cf3791e86f18021c795038f7dd00f180b9990006b9c8cfdd3 +630a37c8ea6ca98e5fad3d4a7cc68ed9aaf043b6a2e2974e1e0b77aa9e6edc4f +491a7186ac562875a59abcdcf5b92abb49bb976a0dcdaf652ad02d70a93dddf5 +d2b2dae72861afc83bcaba60e08f5e149e5ad3e133b2edba17c77ec4bbdabaed +57b9993fe76f41b0b5677892ac3520a04cd900070e589cdcabd105294c201186 +81f1d8b6d424c8f3d4a3311d1ba1fdbde82b1181fe27559e989364d34ce45f59 +54b49210cc735bde2d530d84de0825bdbbd3a43ad45e0b2c2369d7201797a873 +d13a15e97dc4011328682a38ba18dfb2720e1ab6060d666166ac3fff441df908 +0ebb1e3a8b039e80fc5c19638501988467a55a5a72aaf62e6f79ccce8a3095c3 +37a8454de4d221a3eb4c27c77bfdc4c1eb13c82987963ca769bace0f1306f3de +5feb716b12542517ac79f5b21008654a9db7f46e2ae284c466f0474c92e4b13c +286801a27516f2e33593188700950da279f55166c260b647033d6788518fb8ab +8365fac94ecf28bae7951c0646c841c7374288cda7130b22189a0a9f54620c12 +3611842e62e411419974775609633d7b77bc5be483e13d4b34851f67f3395580 +b47781aad518df810601e7d7d297abfc761a2b86624db2efe2f11402a203ae52 +d8626d2d9830ca9e19cc6991cc818461a5a4b8bbc478de1699ebdf8a29f57436 +8503b18b699c98f0002f04018ed1f9f0b3ac9ce0f87e212b23774f8ace72cc63 +1e99c6ff814ab41433ea2ece6021ca93e5fa451e3772ad243090e0937b7484a0 +5dc02321d6c055a60436ebd4d778754f3e7e4605f4250e22b9cd1a12ccd814f1 +eddeb081c03244951cd43ef802e3aa5d1176417eef2d1c33643787f5528a61df +90aabc2fc28a06d051cb52080a55783a91d9daf657518e5cbe6a7f6b91a82f86 +0dcacc75436c1e97e2273391802ac27b13af9bf2ef23277f2d45005ffceb0318 +45baa5a0f219ef6bb7ab7e4b393eb7ab602a802cc711acd271cfb6e886b582a5 +645924862d791d9305f4c3e72969bec72708b08ddd1e784bfd93e75b2eb90754 +0787c096a117759fb3375751750589bafb889d7c3e0d72fe8177d7c29f16b0ce +96d65201519884c6a6255b50aadbfade3dece3fd1d37610bee5a31a614d65bd6 +980b7b2b12ebf02feb7482ce7fdeefc401fde075957b527bb07de743d7f8fc11 +4ad7e0d01bfeef9d19d4fb1d36151bc866b85489af274d4d58996b33d107e9ed +b62b0517d4b1bdeab330f0281ee051ac74811995d148e0b0059986ecb5d17c28 +5fbc4d7ced7bbefe9f877fc303a0b0da0988e564a28e06a09127c34477cd37e7 +3b6a367e155fb2883cfd9f05f2df64d9feb9b379dccad9d1f3a123c3fd1d4ca5 +f8993ee3f62b19015fd51860bb3294625a6f936135d0b4c76acdb41b543d3de7 +c501192ae23f20f5f03cb3a2d463e3392ad6c5ffd4d33ed382bc3068be221667 +4f2f73a3e82c12b65e6a6339dadf3494a32e7f438629b7619a807d78ca6e802f +52b450a4a60ab82ffb8345a3a83b1061320f9d4a67467f4bc46e9e86b88103e7 +f1c218b0881f7525eef46cd61719c018874681e6564294d37874fba063ffdabc +24d57e553799da32f7fd498fbf053e626834e07390aecf277af8ded94146cc0d +a01dc0e8ee4a1558a38571ae3a23ae16f6ba5069bef357692dcc6090bd2a5a03 +72acac2f7fdf52898bd539cde242d5ce0985339060e30a7b8ab2816eae920141 +47e70223801fcb31d23aaa237f9a46c386f2000681f17c9c2dbdc41e60e66b99 +ef318f557f62f9f375ffdfb97a439dea9143f0849b579fa4949be1066e28463f +f2eed4f309c8aadc0ddf04be3f08edb096bfd656d8f567b48f157b0e24084899 +03b64fcec581ddb9d5548fd0f52331cc9746a7dc0a506bb37772f1c1c98d9ee4 +1dec9b9e3bf96fc73d40f5b4220ac1f3d2db769eb6267d985d3ba2fcd451a87f +74321e8b1967d344f666a64fc939514b985ab808512861527253e0203387183d +26e3f001bffc2fc25670a0edccb7e0bb1ae77acb8099be4e65d3df6f490ec116 +fa8b1ce80884b53b22547111d314680c72ea849d66430ca595053997e9669894 +12bf8a94d3efb24cdcc547f4993ca291653f31b16d64a0b15561bae47489681e +e56df9f2ea964d6bc27ec9c33fed273e2c91ddafc0e994c61621adbfcef7e6bc +29da8d114c35c48d87633072fff31627a095119ecf2014443b9b3d180a3c1848 +1fd0a079f11c60c046487904c73e20cb0c8558e63f1a1f03810430df48044b46 +2d7dc135e3dc7df8f8f86dab887e9f3e59e07348311276bc4451745bb0038f6a +a03101638329ea3719c573a74f638540e0c6a9e26b638fc9e21aec2bbc9c12ef +dca71884caae97a648e19c2d0d1d89364c47e7f8cdb68db910bf75cf31989929 +9f73d0416b472698c88b49ea6501ef95d72fd70702709f19e01457a70f9e9590 +e546dfea29d2ae0f97ff65c6b7fae6874e230465e5dfc37e929199cff89611af +ddf0ccace45de017828aa0f60c12b4816634820fb31278ab8afcc4d231a8652b +ed7ca3f05794958caf5ce60afa102a17df3ff4022531009c4fffb57a87b8a64d +afb003137508e574a1674bb6a0a6e56c65916eaf7a280235673d4afcba05ec33 +b4924aa9a54d9dd4773a51b5f00e60baf0c950982db184ad0c96ac402a12259f +22d1337b3c5321b7c8692943fc5655e0746a3ddce98ff33b9d13f884e9029347 +2aabe2275bced7ce59373a650d11cafd1a2f74394567c6491b2c0c1546f3f284 +6e783fcd8757d2b8570f8616d60e97b3830606d04f130ec22bb950efcef6652a +01f8e358c822d788557c41d1066695db66f60440aeb80351610f7efdc2aea014 +4a682d7dd13851f6d187e9d30c44f3377c9cf7356361cc64e4ee2adff163121a +9ac78e13aa4fb1112b31153c19b0d28f007848c1bed88a10ade265a8b606b9a3 +662683a775f94bae38e065681f7e00b0afa9364e56cae809771e53b826deef22 +4f6cd881c6b7ca7dcbc33806606c987f0071925edde39d68392a137aa17561d0 +8f14c811e8b51bdfe34c0aabb9f31013879b3f8a348e5e03f7c661822834e6c9 +2f6f64c36177c579706ae06e73c3756efd98b26a9cea78362bca4cd8437dfd98 +ded00bf0129da7508680158a213888fc8165aeeddc216f77f05e635d4a6c8515 +3f953a8039f9cd162e2778f30644ef6c13889080cd8a05b6fede9770834edc5e +04fdf83bdb9422d18ed88b6f614569d63864c399942b1c9aef68272309e6bc7e +52ebb157dec5104c1f9e0c1e3d9886403ca2a2515e0bdcf60e66edba0f340d56 +c1ad2b8d5518cc178bc4a8135121c45b8afb23de5d84f4a123172f9a71f721c6 +e4847c2f5c6d30cc2a966cd5526b6f98d85d3a8255c6a9776335bf2fa1e9d5df +a154702bf15025b8cecf5bf1c66f0abc9ba99e54da9390dd5c04bb984e1c406e +1e1c964e99a2f164ce3a6aced4af3ae77954e900d5508cb7ec7b83e5ea9ca73e +e832ba8544107820e053627f8624e89e14301e18d80706ceabf0d1860d8a088e +89e491b38c6428555684e9572c82f292d59bc8d23ec39cae1ca2e152805df3a1 +9b4d96ae8debbd4faba3dc79960ebf56fb18caff0c0111543d66f3d530c502dc +cba972803afa6ea4f8149ba1708ff8748b115c523367244e9e2e9fa31c830d09 +f422f8cc49e5300de95eb6d6c07e7c7a29eb14c0ac30c5eef24219586b3ae56d +3160839a2252f464860c32b3e74b23bd6d2deb50e23f547c6d8d60415f123f24 +e3bb62ce14d851c7d103e667373d6cd61c66513c79b0ebc72adfd40b7acb6c1a +7086061551d74085fa458d212c8873e49658fae2c8c6c28d89a7f7c9deb4e1cd +270082ce880954b8aa36eef316f8409e4835d4677ea5e35e1c093fe1d544388a +e0b559b1245fbeba4eec94cf4a14be7c83bc8806151a071070cde9f13a8b8c36 +3d02b83d6f0c24c5e85a36b0fc2f907200d4e45fc4f5de13855ec20f5f9d65b9 +11b1d6f9544da2d5a5e2cd173db447995b351a722ba9122f4ba214465328eb59 +998296c9bf8d3ce6a95c458b9e0acc925cf33c35d99df1677240962cfa6e14e8 +2a0b7442b75223821213383e3785a3e3998e96d6305c61beff921606cf1cde1b +d45be689ef1edcb04cbe2c7c317ea93fbce61db1e76f8ba6e5dd3fb265f52762 +59142336e4d375337a5545f944f6f8c8e50b4f524c3421b0316a401358a2d5aa +8be973fe695518d61393ed4c7903a816535b7cc28ee379782dceb1ec955c2184 +8b9fb4aaeb7e19447f47f46ace999c7fc458129f215e4533a45e49bec7c5eb7b +9474691c5dbfde3f56a63930188596e8264c3f5157fc896d1afc5f3a2e190f92 +33e8ccad3e8aa7f94b1068370f19075fb16efe9ce48ad789e905d0218bdcb325 +c7632a6d5220ff2b05d5401b06b5b9f3e2c2fe09af3f18e8a17eb6d0c51959db +cbc76651bf2953b9590b7ec08b952ecbb1f8f8c86d08d217f04520cffef1318c +56ed7eb2abbd6040a04032f62f59603bbbfcb48b578cc8a8c332e2d8e2322415 +a443a92afb8bb38026160f679bebe4638a81b259488f73b4301e36f052ea618c +52dc0216c924e2b418fe3805eff335e6f2dc4517cd2ecf8fce49baa53c44b80c +4809bbdced1f8cc72e35f362d567b5bec58f6e9bb8bb9e134fef4a8850a11c6d +743ea1d516aa3f00f559e7432e3521c094f9312ea7613ee8a6b900fffa99b26e +896fce4ef775717c982a136978884f8aef17d96b253e80064577dbecd1747c93 +75c16902367a19d0b5a8c6f14ef55214aeab3e4983d5d00b4114a07f74ae3250 +58c54d6903f26e3283eab708d672725549105992fd14eabe5ffa167f850de4be +e473c356eb540e8bff1acba6ccae793f162ba95e8589505138460fecf8bb9c47 +0ef6f107ffff8f8a3c6e5f856c8be2f2c57c5487c9829f72a74b897258eca965 +58dc303c1c0a28503e9863564a07ea6ff620eda460a224dd5af73c806e72fa2f +ab3f702a99e763b4ec585da2783d049a58b4aeaad5f4c799e3d2d3b1bf9f101e +5b041db82f366084f692e914adbdd1240ed5d2afa22e7fc432f1bc194bbe2150 +b4521875c441a20b3d71ae58a63decd8cf47672fa04ae0e816902926c6481641 +2f139c8b605c1d065591bbda536ff18f93449ab8106994581811da593661da49 +6f964eee801f05bdcb631ed1d79e373ca07722e424a20e3dc2be63e6a0dfb028 +4234312463799b57c90aa43cb725ff51509ebd9852a37f9d643a81b0a4c9e304 +203512e475f467171805484bd5f6e38016aad5090e5d1e5f6cd4dbe6907c532b +c5ad198ddd056dff2f7f32b75dbbbabb1dc24e971cc6768e388a612408a8577d +dd6b5b8a03bd7cd432e59d34aabba7bee276bbba245000d5cd9be7f5d6a332cb +6d73fa04674da67b8582b036d93ba3014eb336ca4c03119169ca8aa5c5ccdd6e +297d651a6cbc07b8b8fffc95f56eda32bc6e748f33d07feba741a9255a8813e5 +6a788869ffeb0accb15e982debb0e81cda9733ccc8f79a48063d216691b72111 +1a871ff5754e21a7788e +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/cursor.pfa b/ogclient/lib/fonts/cursor.pfa new file mode 100644 index 0000000..ef1724c --- /dev/null +++ b/ogclient/lib/fonts/cursor.pfa @@ -0,0 +1,954 @@ +%!PS-AdobeFont-1.0: Cursor 001.001 +% $XFree86: xc/fonts/scaled/Type1/cursor.pfa,v 1.1 2000/02/08 17:18:22 dawes Exp $ +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 2000 XFree86, Inc.) readonly def +/FullName (Cursor) readonly def +/FamilyName (Cursor) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /Cursor def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /X_cursor put +dup 1 /X_cursor_mask put +dup 2 /arrow put +dup 3 /arrow_mask put +dup 4 /based_arrow_down put +dup 5 /based_arrow_down_mask put +dup 6 /based_arrow_up put +dup 7 /based_arrow_up_mask put +dup 8 /boat put +dup 9 /boat_mask put +dup 10 /bogosity put +dup 11 /bogosity_mask put +dup 12 /bottom_left_corner put +dup 13 /bottom_left_corner_mask put +dup 14 /bottom_right_corner put +dup 15 /bottom_right_corner_mask put +dup 16 /bottom_side put +dup 17 /bottom_side_mask put +dup 18 /bottom_tee put +dup 19 /bottom_tee_mask put +dup 20 /box_spiral put +dup 21 /box_spiral_mask put +dup 22 /center_ptr put +dup 23 /center_ptr_mask put +dup 24 /circle put +dup 25 /circle_mask put +dup 26 /clock put +dup 27 /clock_mask put +dup 28 /coffee_mug put +dup 29 /coffee_mug_mask put +dup 30 /cross put +dup 31 /cross_mask put +dup 32 /cross_reverse put +dup 33 /cross_reverse_mask put +dup 34 /crosshair put +dup 35 /crosshair_mask put +dup 36 /diamond_cross put +dup 37 /diamond_cross_mask put +dup 38 /dot put +dup 39 /dot_mask put +dup 40 /dotbox put +dup 41 /dotbox_mask put +dup 42 /double_arrow put +dup 43 /double_arrow_mask put +dup 44 /draft_large put +dup 45 /draft_large_mask put +dup 46 /draft_small put +dup 47 /draft_small_mask put +dup 48 /draped_box put +dup 49 /draped_box_mask put +dup 50 /exchange put +dup 51 /exchange_mask put +dup 52 /fleur put +dup 53 /fleur_mask put +dup 54 /gobbler put +dup 55 /gobbler_mask put +dup 56 /gumby put +dup 57 /gumby_mask put +dup 58 /hand1 put +dup 59 /hand1_mask put +dup 60 /hand2 put +dup 61 /hand2_mask put +dup 62 /heart put +dup 63 /heart_mask put +dup 64 /icon put +dup 65 /icon_mask put +dup 66 /iron_cross put +dup 67 /iron_cross_mask put +dup 68 /left_ptr put +dup 69 /left_ptr_mask put +dup 70 /left_side put +dup 71 /left_side_mask put +dup 72 /left_tee put +dup 73 /left_tee_mask put +dup 74 /leftbutton put +dup 75 /leftbutton_mask put +dup 76 /ll_angle put +dup 77 /ll_angle_mask put +dup 78 /lr_angle put +dup 79 /lr_angle_mask put +dup 80 /man put +dup 81 /man_mask put +dup 82 /middlebutton put +dup 83 /middlebutton_mask put +dup 84 /mouse put +dup 85 /mouse_mask put +dup 86 /pencil put +dup 87 /pencil_mask put +dup 88 /pirate put +dup 89 /pirate_mask put +dup 90 /plus put +dup 91 /plus_mask put +dup 92 /question_arrow put +dup 93 /question_arrow_mask put +dup 94 /right_ptr put +dup 95 /right_ptr_mask put +dup 96 /right_side put +dup 97 /right_side_mask put +dup 98 /right_tee put +dup 99 /right_tee_mask put +dup 100 /rightbutton put +dup 101 /rightbutton_mask put +dup 102 /rtl_logo put +dup 103 /rtl_logo_mask put +dup 104 /sailboat put +dup 105 /sailboat_mask put +dup 106 /sb_down_arrow put +dup 107 /sb_down_arrow_mask put +dup 108 /sb_h_double_arrow put +dup 109 /sb_h_double_arrow_mask put +dup 110 /sb_left_arrow put +dup 111 /sb_left_arrow_mask put +dup 112 /sb_right_arrow put +dup 113 /sb_right_arrow_mask put +dup 114 /sb_up_arrow put +dup 115 /sb_up_arrow_mask put +dup 116 /sb_v_double_arrow put +dup 117 /sb_v_double_arrow_mask put +dup 118 /shuttle put +dup 119 /shuttle_mask put +dup 120 /sizing put +dup 121 /sizing_mask put +dup 122 /spider put +dup 123 /spider_mask put +dup 124 /spraycan put +dup 125 /spraycan_mask put +dup 126 /star put +dup 127 /star_mask put +dup 128 /target put +dup 129 /target_mask put +dup 130 /tcross put +dup 131 /tcross_mask put +dup 132 /top_left_arrow put +dup 133 /top_left_arrow_mask put +dup 134 /top_left_corner put +dup 135 /top_left_corner_mask put +dup 136 /top_right_corner put +dup 137 /top_right_corner_mask put +dup 138 /top_side put +dup 139 /top_side_mask put +dup 140 /top_tee put +dup 141 /top_tee_mask put +dup 142 /trek put +dup 143 /trek_mask put +dup 144 /ul_angle put +dup 145 /ul_angle_mask put +dup 146 /umbrella put +dup 147 /umbrella_mask put +dup 148 /ur_angle put +dup 149 /ur_angle_mask put +dup 150 /watch put +dup 151 /watch_mask put +dup 152 /xterm put +dup 153 /xterm_mask put +readonly def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/FontBBox {-484 -517 517 484} readonly def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc7c8a959a39a32e9dce7faef17ee +3bec9f509ea0bb8adf2cfac3626f0443046fbcbb211c518d48ebccdd3cf3d833 +4877f4ef1dab34759b6d38f757cf015a5ccf12d00a3239084905ecae5ec9d399 +ff3b917ce3cd4e85a1c49a750549d42f00f90f5110c822aa441ea813981685af +17a0e41240e5c924b9c12d51f92ed0f3ef4fbc72c8b3eaef402c3befd6a52631 +47ff2e91ace4fcc6f381161f004dcd1db73271726d2ad25185a9b1ad0097955e +b319d5f6d40a9f7163a0e106a361ebf256f5d931e06b8d9fe4e84e785bd29b7d +fb70d68d41d66196ab5099bc38e613d11db08b2e9194806b651615dbdad9c797 +4bf4ad35bd0ce5d087baaee81b670d70d72475c0236751e9f2ba029abcb75682 +ffd70e77bbc2fa605cd824d77659de79f11275b5d6185386f0f39988ae683aff +876ab78964fff6118dcb35b502ed5c7a38c6e7f898a352c307c6ddd0558702cb +f9c763be246b45355d103ca1bf99d92e0f7743000d0019d4e66bac2292422b81 +7dd20274357d55680301b21eeded828c8836a5c47b12daaf00bdecf88289692a +da641e1893c2eb202c614afd6b70524c9e2d6385de26e6f48a5959f587f80a69 +5401aeaae3c78d5928dc524e12cf874a89961e67d9d71db9aafbbfd960e6c395 +1f0ba3a4af64ec2379e956b2715829f009faa9fedfc79e06559cff13a4c8b860 +4a07ec9c6565dd8530acee97e2d2f0b92eab28e5299648f00bfedf9c87bd0223 +02495fde3f194d735815acc2e09bf4abc693de6e975f0c2b6b0051c90d727988 +c6a90a3dd10bc83e264984752520880d26f1138dddd805001ec71b935a8461cc +0d6aa7cb0cb6c7c7cbbc99af3a513ac06848f7e6a222363f8696cf4ba2409054 +9b616ffe2d893a8f5066e6e7cdb21656530c2a720578af66d456de1723b3dc3d +1406bbf7dfeda3aa3f649077ea7ec19f8bb18b28b876ce1f8e61dfc50d7b4db3 +968efa987e8479766356441906d6298fb426a428a1109ee9058d4a71235ff03e +205a60f64b77d3e0920790200fe13d6676c77f78e4ced35f23912234da3b568d +e729baa323bb7ebb41d72994261eac9f2c02709de342ae5c070d9e7b394a3ca1 +aad2e95d98c05cd4696759cdf12d16c3e000f3b2a7b5ea03d3fbb204c6d59b48 +e4dd5094a54aacd3f8f62d63b93e3524bdfa95fcbf75fd8be02544bbe661c485 +9f4a12191be62ca8b60cfcfba14097f4f7daaea4af8675fdec8f6ac22dd822e6 +bd4cbb2380c0ce2f6e7e4db197ba213942cefeca436f33249a881c60c77e58e0 +93100c28caaa5f861d8557cd2779911d42563f5fb8f7c890c8e24bebf300c3f7 +15d0854bb460462de7364c007c0be17a57c23959bda2282f9fa8bfc1571d7e2e +5cd033129735be336dfe0efe4bbe19669e7c1a3f3d21e11c8ca081ec442fcaf9 +e4d5a1eac515db6b686f9da7757475c7b47cd2dafc56aa63208f5e0bdc127a3c +51b9bd6796842d3089641604bf32ecd04874ecbcaa8c4be805cbb6bbd3988040 +8505740a2023924894097f466e1736c0bd795cddb95d80937d662592c70763b8 +97a8dad80e3467ee8192d4d8667cae0ec40a5bc9192d59eece9a405dd140f988 +ecb324c75704e502d088b5184cac0ee0857289ec1bfe9a2bee359911b9bb30ea +8daade18b1ad9ea1c28b2d9aacd6e93833d9d8acb46349225b4d6b0e32cd7848 +fe8ec185522eee670d0cbeaaeaab94fe7904232249027292be36d2aa06ce4b53 +adb71f29d4746fe19cec148ada960820ec7eca5ebce18f19de5a7974b0d15b14 +2c0f1d0af773b4bc5ab79c7f16747b468ff0a9ce39970cf439720bab853ae9da +c6cd1e282d0860f012ca867969474e3d396370a876dd9f603a6b64afcccecab7 +dc0186a089a815288a68564f62db84d3a295f31efe6c1b40d1602e40c8fc8ab7 +713c11ec7f175b31389f70bd3255ba32c10b2db0215aa5fddb1c02f74bf8c33b +d4059f1f3640a4dbcbe0fd59bbc830881326e28b7c8d5b9704f95827e5e21d8a +f720e3ce0c1bd124963ea970e1c4eaa6d340eae793aff5f8257f471937147c59 +fdddaeed8b547b3b98adf6b5bc81a86dbf9436d010d14b3b5ecc4ed9aecf3ffa +9a4ae3b08b9cfd79370f4c6ade8406e7808ab8fe30694ae7bd9008c3507786da +543465aa40f8ddcbcd1d561a5871be7f39c95ecb0e3fd7754469b1103c71d18d +446ab34f5ea212f0b5c4d3fa8c50658466d770adc17f53706ff5449729b9c23d +72cb4ec02402c38924dccbc49c976312dfc8f086050dd5a38132eb139b43422c +756a95879b56babe8f77771f221f4f1f25d1a308064ec10eecfbb306eb55ee78 +2692db518eb3d477c4b52a182fe897e45c0c3d302aaa0fdc69ab3c26e55728e5 +5e12e7a51d28af01f104e5dbc61bd210daaa526c4dd9a93abf8867178cfb178a +70dabac26de06f5abb43392964a7acb193fbf31070de491ab477a4c5492f4fc6 +4c3bc40d760d41ab31d8a3ec657814086a133801701ba8fc4dc5ba92b03b463a +0f8bbd73b9bfcd6eba567e0c84b5ad5b32dce09e5edf39bd276d75c3cec89124 +a4a8bdf208fdc212469bc9ac96ab17e9df27ddd8b085dce1ba68ab50ea445bcd +0f002681a8dd517660794d96bba265fbfeef267d26fa2a1bda94235f763209c1 +1f817081f930f20d2d0cefb9261e22eea39cd0a390626fe71d312fc0fcf11db4 +6b0b70010dfadb9c7725f419c1c89f34fcbcf3b268c7a4f838d94cefd82685ec +b619d3f6df7571031a82e2d2a8bb98b8471d8c9febeb853ce0d38d7747c0bd63 +fe04e36dd00d2ef30b0c842d2a59457b3b41e2b8cda904a5d281290219814b59 +c4a75469375e9e0b3a358434a910bf1774657bbdc64cd408c680e2a09ca26507 +06f95e8c16735cdcca195f20c9a03a2a0ed60184c03f4e3478859c6639ca8ac7 +241b33432661741333406add1d9439690f07564d09f4b67152f32943cf93e247 +3f2a17a476bfd897ff69d4fefed1f4a994fdf535e3e45b1a3d46d560d5ac55dc +2e4c20408c8ceb82d7bc21016bfcdddb8d5daa9e902c327261549ba62090dc4b +27ad160070880cbdff5d022dc9c7d6f3f51a49af6dfb713308dc590c7dae5236 +74d7946c1db33177e4caa604ecf655b792be55e14272e0daa0cceb2afad8f3b1 +6558426e102f72ee42a5d9dff66d65d672451316fe551fc2923e4b24d9788091 +66457f55f9c83350a62bc5bf590f7135929b365c0dd003a95e98760472ce988e +0e5affd7c654bb99eb4255bcf030fa008bde51daa55ed736086953c599bdc3be +16efb2368acc883bd670d753fc7bbc65ec5bd797d0cecc14ac15f6423f0f22d1 +6b630dfe8736c2db51b45774f99280ea1274ae1c207ef3574e55478f68bac3b4 +8e24180f8891a2f3e8c0c9f74c22744830f1617b99a78feba5fbd752134775f2 +5ab542c17ce32465058ffb9e3dea8030dfe1ec82a1818c9bd1e3db30e25d8128 +9ecfaffe85bdcad5126fd461b6d5137d2b15cee2d97486f3266e4c49964d46b0 +db16d96593bbf257efaf0dc10f18e2f4f14a347cdcc220e8ba87eb215a66030f +8f30d405308dc15ee9f7d7c92c607140a6bd1cd8c8274a507c5f12293327b9a9 +e5c3a13eec859919a805f12aad2f1c665d054a17fd4dbff471890585a35f4e0b +5e64c4df9b687526be10da6eca391eb351ae661e16b930ad77ad33ad2a2777a4 +ef8881b5be91a83cbffd8b95a8f7c91fd86c71061e7717e4cb2f44f4ba2cf5ba +a64c4f7290690036427ec227446192efc7c14479525994dd0e86e7bca081a9bb +00d55ec51e1bdbb504c4d43463902c05ff0c1d67f3125b8ec48f5d1d394c7f13 +54e70eee5ec074d6a7e0dd6f3d2f006fe8a527b56a560685cfdbdbc9f5c905bb +1dd508ec7829a13a2d49cad2db823dfae5b85f3d7c04c0d8ba1fe9878964534d +c23e890fe460c0b25700c5f6432f420f3698c6a655296104eef778a5b125c74d +79ca60a8f987e278421b0d4a311bc4ccd59fc3f85972091516c8a4662275060c +8851c2532e2a1f72dca5c350a03fe829db297d0accf6458b10836d22cc461b68 +452cd2f3764a3abbf2314105e414fefa39686715463afcb6fb6782eddd94781b +5130a77d16bbf0689bf64fcb46c14682df23e70f7a571aaef0aecfda9c889562 +080d3bf39422821ae0093fcab7bc29f9c4281eac9ca14454adf3ec397855c008 +fe7a9d64ad134fe9122f7650e37c17bce7bfca7661a0a11b45b42bdffff2decc +47df5d33671daa487d7bd6a5aadb32e7257dc8d0feb9b7f0a4a7825fdb8a5cba +a31a988477486d0f09858c772b8c468b794ab2db0defa88c3b4927b615bb34a5 +8ac9d9af50a150e991e6f4330786f8a4f98654558a4fec8144eb2e46a6190b4b +5043ae396e7fca1eaea3e9a96c0b200826cc065f49c47c2797ddfeecc6e9b95a +f2deca74b594224dbf75041f00fb37f3aa70b0b0eceb4343a9331e3047e86548 +c3a7b1a42e7af0792e02a5bbd2ab548f7cb8cd112babb89213f66913dc109d8f +c1fd5307e7c20d7340372935cc459a795ebc9c4ada9136b71fdb3f68aac98729 +16052f949b6657114a04472fe931a761c4fc5f9b8ed340c16035889172f7669c +c6dfcd50bdf910c615e5f3c64101e2e6546f252cc4e0ecec03c5e19249b37269 +a0bd2e68296f9627e4ff72e37bf3c2be74e3b34d259aaecab472a595af08b2fe +db51394d6b59c390046ad76dcb8285a32c247c7cd181d2e386c6d5abdcbb3789 +3e8d9859a02c13a72743047d8880606488a521185ca446499f7adfc9a25c8ba5 +1b1c84ba24c0612ea3d957e76bc398457821e25844bbd906defed4d3ae434c39 +9e52e60fedecc1acf4ddecfe92452e9841eca92acf99c4ca9c2cb32afab1dc46 +d0ad255a851a78cbebac54fd314846c35d35cb7ea10596734ab79be35e11dbb4 +9d30fc29b140d5823f429eb8eb3d1fabd90b9c1509faf33f609b3ae40a48f873 +763b3a5d5c9236aa0a2be1661be917921b58ba7fba139796d4c125127885779b +6c71427cdc5812dbb6725153a83809446d26f9bc64bfc2a2a4bdca0c57a20918 +4415951c5d56cff5a3824ba8f8c0652e91a5d9c04d1ed0d928b33801b98d36bb +04af8348436aef4abd549a063eaed12f7a4655f5183515b067eccf550f7bf906 +abf1dc63139fdb1e8a1d2472133fe920777df1acb2d12f5b655e568bd42e381d +861daebf84ed9c6db8d307de2bed017dece82881ed7677b5f26dfa34ac25e19d +5837f76dcaf237de6391c1d6679dc1a981737ea3e07e729060a0472090d5c76a +dca9262a3823f24b1ecb646aaedd7de4a319f091a948935480d53376703049bc +a45851f924ead472f1b100ee7b4b388c6d37e6e9cb850ce7da81896c1ab68677 +c3298a9e5aa71ae6379990327ec585aa1e291354e44ad972d3193424a9805226 +f43b07992c5f1c5e01cb5d049ce2922dd2921ddb5c4dbce968dc7a340ba0449d +11ed4160c846a508b5227bb5ae574c8c7dc5d43a0db7a0bebcc638814f8933b9 +03404c4e720929833b4a5d5b3e54b806adb35724c2ceb47d77d39e43465e7a12 +51da0d53106f41313f92fbf9cd992bcfa4d13054bb7154965dcf530b2e0cd18c +92690f54a6c6d7bb38ff4c59d8e35359eb3ee07061356ec6506b2081878986de +80a2ba253a34519189e706fee9906a723bba749cef1c15abe3653eb31c59e486 +a6191335292bdbba1c442b229b56e7180be446a319e811327ed75f939936cb0f +56e123a274c843f27b94b35babf938717b4d02c2a673df0a88d35c35833c4d84 +1bc1d5cfb8a00a181cc1bb68f9dba8fb10ce8ff9a520d938ed21fefb140b5634 +8f2c237d2d1701e50d3132ff93ba3c0543694c83dd500000b829b705e3268ec6 +f94887386593f0e629f6e74d3cd192a48c20d0b1a00ec7b18aef659a62777caa +3692512ea0efe4b8a4f2a138631b10b59f0df0fe27be23f2d3e1b195c2375be9 +6e307b3b8404d2cc6f798fc995c1547354c24e04cbe50d273b50967dfce4ec7c +ba9bd4cdefee3ff4310358014dc02ef0be941c4a8273cce80ca9b8f75eef61be +854b698a2ca1100f40987aa622fe8fd1932984e77e8c9781c691734caf0c4e86 +566def79a60cd4d3a3cd79f59332ac99315844424a627e2d6d38b5d6e81838fa +357f0d137804d5a29abdd374afb2e3c4f5901cbaa94b8d15a5a8988a62fb92a2 +e06cf8788f37a1aee7adc0e67626d0de2881d822f940dd658b5f310a1c4f1bff +cb7fc9fdb347ad0372127ab143e4d80657e5f0c364f4721d5d68ff624705da2c +27090a53f2d481492c3b15bd70fc050f909edbc2bbfcea26ae850abf2c2bbcbf +fc4ab4d34d006a1a41469e2c8a8f5b4ca5f9820d105ca12f1d1240dd32d955ce +ef9de1e096ba539a3fb11415bdc0851356a40e0571a1033aaa55cc3f618f372d +8c71ec445768cfc42b2c10c04e45e98a649e770a324defb330b84952d46e5287 +65c417a6a82deec37727a517c12bb296eeb5e6c285dfd16a479369bb85289a0b +e24254e6ab5de4e3a0343e7f901c6e39d79902e7bf437087fc894556dca62fc7 +114b344d4052b3d7f84b07ef17199a938f69b2586ce6a9bb840c7dc1336e185f +6264b644cb411a2eecdc43e1dd26ec51a837401cf78dfad608a3b9038f9a3a40 +9fc464ff2214599f8ed573112ac944b593ae83348f92c54ae5d6db5956de20d7 +4d48f8f6c685a70265766a97367ec2d7c6e1ac00c30fd3b0fa4d2891d013d840 +693f61956cd4dd4ad134886868a55d9244f58c27f101b321ddb99b4e2eb23137 +a2e596ee6d131304df4265d6e72f9425127729028cf2c3375a4bba7ca9363e30 +9278afe6c282536537034c787be5e9ef1a0053c64b461ff496050cfc8da1182b +c1abe0eb88089e2d4a994108b1d24a2205f33f3293954b8e8102be94aee1e8f8 +d725d52e87e57a2de1f79c68ca6b5b36d05ac31c2d2f73cf5b955b602a1f2eb1 +6091edaca5e90cf43a1fc23a19e2fa06eeba82b15704ccb5b1b93587b2762517 +abd0e6375409f518e74d727b145daac480a52602ef35aa037647d7c0d403408c +095daa192800fcbb56e5af904fb72d069f6a15d4f95897f530bff36828630bc6 +e4f83f82a6f0814a943a49fe2288eda1452db8c48cad67b1b6398e481ca1835d +b0f9f9257fd3c6aa11a7242786b47fe196cb4860964cba7d224acc20d22fffad +c9e11d0c6a4487b53654719506c04b2e1ec53b3ca316d5232b821e5256fcbc7e +7ee284e54eca74acb23fc3efeee59e1dabdd4e9c46c7a4234f7e3e5784b3e65d +32ebba3709c63dc9ebc2dd6891e39c87bf846c3fe524e434d98e2ad199230432 +c84c95422e8950c4323caff03a9de5daa32a5ad3d07b5ee831bd589c0e331888 +33ac8dd264a563457fe1213d23d0d14536ab8c1e75e5af941e2068d1ba9a74d3 +ada91585fde5c2797229599749c420c694108595966b815c96adf3328894e76a +a0cd504efacc06434c27cbcf96009947a0f80315879d2108bd1611d6f4a5455b +178b5a85b5ea739546dcf226c6889dc02dc08b5dbad34b702fb77b82069777fc +3892034144ce7995712e3295cb7e31095f430622eec4117d98fcfd6075a4f0f3 +01794fb45f3a05e725588fccca124eeaebce479b9a835bac7b113dddab302dee +6c50e47c8e87718b3867c99025be81d05a905b2a9335068b59de14733d656b89 +97d21bb34893b9548830c45071921d0f13add9d9b75a6f38ebffe39f1d2cc4a2 +2482a80bf04e13b0e3614d1326e97e86b3dd77757764a9cbf6a0eaa530450928 +0c5926cf98b98bda505da3a35684fd0fe656e71aa67ae6e7693d3ae11425e6c3 +7fe01890b287f354f747e4de8d5bd48451ce4f28ed4bbaca7fac03eae6525174 +6e75b117e4c7fddb6979ed288f81053783f49f4ecf3af9cda24a7dd6647368ac +4f2b8108451496612276dd42d7281d6365810a5ef3cdb304fa2630432c5fed60 +ace8924e807b54a77d63185e7c7ec65c887ff17a3633322c0d4c8367affe2ab1 +0845fa3f85262ed12a0ca9c74cf1c0f87ff1233868b83238831f911e41845abd +73a346e7ac01c2b07dac7153de91318619f576a5ff1c0f9ba90315c5e89b8f37 +cb2d8d413daf121e0c1b3aa7bf1a62a2ce28e39d7c43da5275e8f0972aa73986 +98dac6dca24adbaecc997ad0488bd9cd356dc86c15756ecb6fe2fac61d4553b3 +0b996e98157e29e174bab3af12176094b414bdd13f4145144f087c349b8a7042 +b1e5b9e705c93ade44defd86ffe43bb513b3254e8310ec64409e79743c2f897e +40270fd5154140e0e65566556892c49762a351845f767621f5f5e5cbe0b67109 +84e30ad39832cc5f8857c23aa7b19981ffdec5e4497cb52da24fd1ebb53855f7 +8f87823ff65f6650f362d6741f496c21f8db8a609af33f6e60f858e7bd5ab91d +9ac64226eae4994670acf610130e10e7e3a6b1e6f3a07b87d4e6b712d243a493 +d5280549b827378ace2f866acaf117f9094c2b15c2430624d2f1c9a8ed3c92aa +7c3ceee15ef6eba0e90686949aee9f375acb97a49bc96942d20abeae79fd8e04 +fdabe92b3c8b493f3d7efb13ca6bb9b8d98c41fc4c4f8e171dfb2ac038aba4e6 +60724b873c96a9e7b7b4edb24f09e22c937c8068589afba95bfab3c0618aec42 +fc7b68f1fcecea13a54f421c23e2df1b04785dd471f82587616fbd140758e21d +17a1ff6dc30b301925fb1d2956cfe57f8b1baa1ccf4d171fe03c9336bdd0678f +4640dffdc2ea1834e5eebfe68d4c26c9d009cc04d0cb8ee8f4f0bc477df068c9 +95eb41e087a9a4c390ac5ecc87667aa713ada2cc1991262a20fcda33625eb9c9 +1f419c6723f2875f40de2258fbaeb821e2a398dc0ec62119c4efc1e7da92fbb6 +c0175c56d32e975115a12697fead8852b8fb75b23cef1bc53b8deaf493c7cf1e +9e9a9ce177bd9a78ec55f3dbfd247f9367974984f31ba071365fd79bfaacb882 +fab5934f730081165771963587130b5a1826b618ee51001ea81ee3372507ed03 +545d33d977d4bbdd73e0d1f235e7a2e020a28759dc53d383a980958ea0e49865 +b3658294acf2a04e0d93bc0806150eb192c8fd02c5dda1fb457bbaf0f71fd063 +29b87327fb05fe02ff88f7850d17b65ef608e7857d2876fb37fb0665e634cb39 +2ef9a4e3751103c087fa26998f68fe730c0ae114e34a3d412e715c7a12df3b56 +862f24f1fa06f6cc83769ba4d310467b07a91ef2dd6bb873deee11f1f326c40d +89aeeb8f7ab1ba650444b2d3f077dfcf18803f38942f3d30f22d93cbad14fe1c +1d968b62b018525144a5d2ed4bc636a0c9064940ef84d9ed682004774d8b09da +998824b6cd1e7efb724fe553a8566b51bf2c6ec6f949501ce0bbc54a9309eaa4 +378e143ce3e035d57beb62873b294d07b920fece0f58d5ad1c5c4c67d3180a3b +33eae3ce510ab906c841ecd9366ff615f07a905df9810a163ddf8d681920bd96 +d7b2212c74a05cea57e1e474be64eea47b8433755d72e5c1f79b8fccbcf7106c +b70022721bd1bc779bc3f59301fb393d4429bc19084e228034291413f21fbd79 +83661ca0f6d331c1657fa69e2117464b8fe708520655c58b3f346f9213630fe0 +a31a55ecfc61f5466ccda3138f52cbbd575a56d4abe425266cce9e490d03bdb1 +0f9f959cbd9e34505dc46b9a439167931828d18f8e2b8a0b5d33b4bfb64df5dd +b3825d34568453b740127811f4ef2995d0e7a09f29d432e0e0097343d5726719 +b04a72b4a5e0aa2804d6f7e155e1f89a168dfac8d593a8af33c075e213c0ab66 +366fe474ddb9ca17e6e7bce12b473ede15fc938239f21583bac0d6951648cc94 +cedaef748a18fd237b8b50f36fa97dad4b0a2b9e4bca1eb243a60b0eea59df8b +74c76ea6067e77c0fa5b0aa43330690462851f923f6503ca2076f6b3d10483d5 +a1e8871c08434f6f2707f7cdf3a68d7dbeb4f2c7332d01435e37787877a7a29e +a59c1493f2a959981026d58da06923d04c47502c7b5bb7f151ad5f0ebaf72c93 +db1db631865b261af7835ab3b596e4efa81cbaa8e6ec72f784e0b268f71d268d +517cfd39804d0759486f8968ec149b1952be695da8553900c7e7c6878b63c664 +078dde438b8c75888e32c0d3285f6bed05132ff8e81e393b8be800662356b8d7 +b0fbff19c35c9ba9326b36586a179ae3e8869af85ca655406e1bd5a36c94ada6 +f280d1352577263444122341f71b118c95ed413a1237a72a78b59d12eda3da5a +3d9fa119572142e43ae69551a024fbce71d153a1a1c211288f878bdb3f8a9502 +4a6420b3ff69f0ffa246d5ae44370a24576118dcd8c5f28f6988fd922ffa8cc3 +af68ab7dc10d2c3bd5900b05060b984a063bfe7b03932a1a4427de62b8e4bc21 +4ef0c83fe86919a766478406f57d148ddc4ae0500e6e15246e31dcf0a7149ff9 +1800ade772d44268a63d11ee0f3f8ad11b01cb96d04a52d57d827fd931e7aa12 +f31373e2de4027c293a1329311510a63a268af6d73bb839ce767b3bbd4da9680 +4e36dad7495374b17f506f899ff61fe23f71310b8ee2f530bdb6d8c951fdb34e +8fcfe71b12a555f174cd72428acc96eefa57652a2f5dc1a446d9f363c7994c53 +0159b89ec2694fc59cc9e083f506698db58d841d03f3961897168b96a3965a92 +500e29b74743e35681fcf93debff5785569e3b0e42b2b586dacacb72ceb0dfa9 +6c2aa8902fb26f1c3293177dcc7f70b54d85cf1ea4ca1a980e0e053bedde3eca +0aca76c214fbed2982cd51892bdc35baa7e3ddd34da26a5b9302ded1de8099ee +0e87410403d8f782f46987be974b25ad7766608525de89cd18bb00f831c8b3f0 +54db8cb4ab0ee2a9b1e63c8840ece040c3d7d763c7f65bf4ffcb33e7ba98679e +2f2f77ea277314b42e94e936751b1c649afe60fbc8cbba2655c4bba13e622e92 +4f72a5612bd507388c7cfc8077209c68c4252a81f8efbe8b8f9799a947594894 +8a1d1087bd458d2436f837ddce87ebea385e3c44f433f2b775f6257b1f80dd96 +2bbb0fdcc8c78d32dc1e09521bcd9810fe25117326f2ba159a60c26d5aebae75 +8d8a422e14feebf2cc3d30e6c70e320d3448eb3edc08ab72e44824e5175790fb +4a6401326b5ffe81fac99839bdc39a9af68eea930ffcb80223bf21e301c531a6 +2a523ac9985cbac3bd9e426dd9cf6ef112817313ec460f8b90a4a2349f819d74 +3444ed4872acee556af837375eff1b44dcc310f4ef67758731f7be7c1cfec351 +ada83a533c06701f63d2d8b7b2084afc5e7949ff250340351eb4b2886d16ebc9 +7cca76190f3a4a58995fb281a0dae019ed92b64190656f7bc5bda4b2532c52c0 +aa2d5ec6168e24b120ad5ccfc0bd31d631345c2e2cf3c7fe1ef9ca9cd4322b9b +9d587204a24e18ae280b2ece030626bbed9f66f2979131ba38043a92d19429b8 +53e3475c7b933e054616aafdf0d3fb6345ef888e3fcda12985c2b2afeb2e59ad +ed76cd456c6ac11d453deceb45655fe71a3ad5f5f770a7124a2976639a0a5847 +b79379244738b5a7b176207080dcbbda96f43a68370b434b348ab5631dbb1d04 +1f1082c04c564b44191a51afdfb3950c2b65f9c4ed4afb5f4bde68fb7a09d710 +4bbaeaab1612c1a0b1060fafeb385da056099a2765d69388d9a276601bc13a54 +fd114f2ce447e68ef452a6703d6fad6acc3bb591c3da0581c45de6f2edd02422 +aaed358aa940272865f7f93acc28460c8f0f5222454c05fdd3eb100219113eef +5b0c02314cd29c2ff20f4e86b7866ddc9b8eca4c7256e9434091319ed99f9446 +f606dd0fe2e5b86e3237b2af55df6bf9624b286a1a9970759fe83b3bde380b8b +df7132016d4be25517449ad88c5e6da4e292da5632eb662a898bf2c76714b963 +ebf7e7cfd268198ba84cbbfecb7c3fd01612f7c6a9f118aef4cd59307cdde680 +25d9f98dcc9542ecfe6a8bd8b2d09caf77f29e4644bb7b6ae295277eb8f5b733 +617f4ed5a2111a5d9eff858db8ebec3e59e8fe318c2e7a474f07c9f4234c9add +fabaf11cac0a958be217bdce993dc99865333aff57576ea0e43fc70016c23077 +8ba456546e8ffba24581ab50e72fc463e2f524a07cc6bc11a347584d4c9f40aa +8fe8a6873b680b5e7871b47e1103a77f0fdf2110b9801e8f24ca8218e4a9724d +021144c9449ded25b0532a33d410bfef2382e1ef629e04ba1b5fc09d86b85481 +bd8b1f1d719cb01352c49e1cc54c34d115a6c1d0f07a83afa2acea650ce304bd +919eda435e6f5a044ce65aeba0884f5099d860fbbc90dabbf0ae5cb1dd59555d +2ada2f748f3a74010519af69b8ffcbdde7e88de7ed1b0f53c255cbfb8e41fcb4 +8c80603c8be3f3965b3af9f94b027dac3754764f75509ca2f554ac1de60bea69 +a53d7a9c4973b51a41aa7c0386117b6353555b31670c803db4e475c330be39da +4d10f247ecf2992f3e3b35cc56bc19ec40a3914da09c914005419448a633518e +3d4a0ff8c39f6ea57917fc87f890ef834dd2c6531b3fab0eba79e0f580c19291 +9974c58cc1320d8e66765886ac966a55e594abf6fa69fd1ef3ad7dbe2d964495 +08dac3b161a45e836755af3ce6b0c3e3247fa56d71723e41838bed42de4404b3 +967c900ae419a7006f0832bc24559a56f417921ff6c83120e70fb9bacc6ed431 +8563d3a82877b5c1422cf56cda1305e7154ad1f63873237de5ac6f382217c4c1 +17559be71ea1491edfc3afeb9809fe0b4e9b6e830a48af9798e70c9411acd054 +9d835fb1466aacfb17b7a863c7a1cdc81811c220007ca99454e8c423ac95b8bf +13ea2b29bd1af8ba4e56662df2eca3ac252b683df1e9ef0cd47326252131649f +e64086725efa8a6886b8c6dbf56490143d5d91ccd1c1f3db4c78ec614c3f6ee0 +3a5cb384ad5b7f3c7e1fa13ac9cdbed4eec6c5012de7f3f48b41531a79708f53 +d5f16ac0b89c06267e11a5fb32aae3ab16a1782489945c14492824724206dddf +98cbf03cd9d969a543ea1d516df6664b4a839281b179d1096a434bdf08b3b6a8 +b0231c8857f9d4b4436f9c02211b6af4bd22d073d008bb8789545b7f93635082 +641c6e475c12ce89c0a4361e91dadca8ec20583003b1c9306122accc59fd089d +28757e3e3324c4bde7ec7a161b49bc994084a42880693ffb8676366879ed7554 +43661ba1326baaf4dc099884f753648a05a37c71be30b4a3425d768b049a00e3 +2a3f3c3b12ca5c99bbf419fd25714cbd00a850c7d84a0b4c3e5346cdb1964a0e +9cd1ac316f017f6dff9679091a6e93a70fb6d26072a2dd886baf9b4bde98cfc8 +372927bc92f28bb3eaf14252c7661be1c656129af8b3e468456ce20f872bf151 +22ea95d1c79560268976be3ee9bacb2a468e1e84c8c387ac41d3531742ff094b +c3e14b27444d2d0dd8f4dc738e0af4133cfdf7b0808498646e6d28b738e80117 +870bb74f8d4947a15100bd891188a1609560000bb7bfdcc210508903dbdff736 +07dcc542b58699beef7545cf0456b8ecda464126c86ae3db47c7ef6a6477808e +a8c1dc20768895055bacbe2562921d078fe91794be3ef5ac268f410e4ea47f0b +68bbe84e54fe139dc9f18808574ae9316e15d0f3db78ccb4c0a8ac63ede19a31 +09749a0829ae1302fc18d38d27e43cc24dd43b091a58ec394f998c5fd4145781 +d6ef576e99c850fd41d46450fbe5d5cd4063d0a24c8bad4a45753335937176df +36d2d60a677fbcf63d8342232b3d9c0fe3062ce4f1ba853b40bed54da124d913 +4ccd113e18fe2d0c4bd55b58fd5c5fe6321996316eebcdaead6751004dc26676 +1f47c198fd7c0b686705a63a8d2d7e79fe826edbba1d166822aa804858c48f3f +2a126fb0e7b2d0b4f2f082b78b98c2702f5ff3e4307e1b55fd99ddd861bbaadc +90075adb2581c3d4e5ecbfa5bf8fc2a4cf6df7bdc0e3382bf12e612cdf016479 +3e237ab37bb1049ba63bbbc0da17d1ba3f98d88ba38f98d7133f53c2b9e87889 +5304664b4d5b6a43fb2577c5ae332fef6d7b7982e0ffb57b265d0f51cb569936 +8fac060e6ac472317597615711d6c13058b2f192982a9e858c093f854a60ae49 +8687141101d45bcb53dc69d432e0632265d8704cfb3766836caa3b09b2a44a1e +bee69f88f9b8e62d36dc16fad6fbbad7f15c91f1d2431ec61b659e9072fa34d6 +8306c715e2d111f834f7d9fc93a902976ae995bada6bdcfe09d5d3a67b247c74 +1e45d070c6e02c7a9e4aa540a8fe3a41df7fb4b60dc943bea339219bae869762 +223c7492de1434dd6a75c0366624f936179c494f7166085416d126a6bedd962e +1321f9a2e1b359ba90023ac18942f3d19f8dc7ea36468d055d68c9e758c0bd3c +7bd2b10e7567282b6fe689a2c713c3272a664df39acf1eff9e3a64a353195290 +4e100ec249c9de6196020e30791284f028f8d98e4447330cafe620642db22f16 +e4dc191d9c2d4ac9b54c1de35a59b2d3138fd686741e836d55d4b12ecdf1cc85 +5bcce70a55d9dccbd33005e654150899527801be8ca74b238a7be4fa846ed624 +9e4d5a6a0fa190963db0d0b8c5f982aa477bd202ce0fa2fd54c3cd4d788d3eb0 +1317a307682c2a2813b48ffd7603a4b40d79209d49eb456064e66cdf7551161e +9204ccd7d84c0deb458cad1a4556a1cc1e7df0c815da189fd9499e58c9d22610 +f387782f059929860518d3ad42cb245278dd67b01c9e3ad391e0a57b19fee753 +824cb856bd538a05898ded31e347c26ad123ff3669ac5b39e137d655b1c05899 +a9f73546d556290347af154004be5e9ade507c27292e9c60d8a2bdef92d57a90 +89ddeba1dfb5bd781c8ee4d036bb8b67ede9cdd533269c40a7f862a4ded71e16 +cd04e4f144cd4e2070379f4aee9c47781a15b46878ca5d640e0f434010cc15fd +220aec4821174563c17e19cd934cef3290b3462ef9cb001b84991f29e8de05ff +686787bd434149a2dadd81e4bc4079c31b7f19ba28eb7240a06b9cd5b5e11490 +66573636e87e5c0a10d0ba380117618f8bcdf3152826b110a7218c329e49fedd +c3d494bda6c0fed8ff7da20da6a9e0b54ec79af50c7fd1577bc4c5fe1bcf35d6 +891091bdbc81d468935fdc75756067516080fa9f6cdffc557537b959d150d86d +9e0e1794de22b011073e79eec4ea6f14d6ffe0a75677d20fc0dd0391603569bc +8e7ffee11b6b4f75f081fe4e7a9eb847a49d11d8531bdad6a73f1b9146625294 +85db9550e9ce21213904a4f9997a83c1bb9d53f5c2099ba94f56bb7985fb1cfd +be30d619af77363e943b7e94b12f88fe3f3a1900d722107350b0376291296f94 +8515d1b41e6bbb5addaf252985596f30df0aaa37b0e16936dd786cdc624c68d3 +2d796eb0faa89df09f0b41980b8b86009b682dca85eea7c16638d99ea711c631 +35a79c1d426ca9e8782007c61e424c8ede1d72dbf919267d25c73727882557eb +f78da42d7e816cc83d80b95f3bb86356314e65083022a08f82148044d071cdaf +db03c7e44017af773f0e7d03c2124e3bb8ef458736c1051f70fa18536395e521 +cbbe933c514747710cb9edfc30f774f75bba103b091e24e4811b4a8b9ea2b492 +de7c5ce1ed103b70c913261fd04caf13727c6df5d246a419c52f175e580b9f73 +fa96742e4f119405174784450411374263d2fa6d277cc0a9dd60c97e9bd91498 +a7942547c6888fb80f8f9a4a3640aff4c00b2181e9a89f367a680cd1932b7ccf +6e1604774602cf412130503d43f8bc54bee8514a24da005c733295f022f6755b +e5387da8e24854cdb5a73c39b1c34c4d1884a4d234adfa8d104c004efacdd2eb +43f20ee50840d297bff0095bd290ed796f726b506e316224907130eac9d99a69 +3a62927d3ef4bafe96258b2b391b373b255a84d6e9d03797f0b1db056052a5d7 +4d4754284dac23a05ad8f2a0c823a8a9add8669678c9acc3d1d086ef67e116aa +2542986d3a021f8bfcc00f66e812c83e1235990d4adeb39dec07e62c10089c93 +f1801ab8f6210bd328aaf6d44e0a4df0d5b2ee8ad1c8f2a21f43e4f9b897ada3 +88653a83ff3cceabaee4fe26de33ad5fb3337e48e35d14423718642c4071a56d +f39725f27ad0f2a71b67a14708e70007bac926be651398bb19746f14d1271873 +b7d77ac822aed13b6689b311ca57b895287e16acaf3a03cb9424dc840ba5fd17 +543bf2b93b4a11cc9cb7f9cdf118feaab5d22244096b4ace849d8e51c9b86d4e +4c14d5874bb374b75e8e468a10db921c066c5c095c5886f4f21b4cf32801a1ce +ba7968215ea52e217b2f892722f3749460b65838227b45b4c697c2f7d9ddc59e +e76a83887354180d4eb39a789f0c4ce770f54802b55c238b5189e8809bc29775 +e02104bddfab6edfb13614960b68a49f8e903e6c53d38faeb9472c8bafed7516 +0fad6c4b186735d5de8f6a655ca46f880fac0981383b4720fbb3cb90c757de45 +8f0036a7281b877143b5ae8d0bcfcfbf15f7fe641e216d09aa391ade483d0b4a +f304f07036ba5b7f32d9f2d0c8969c4f392fa855dbb57940e80e56b3209853cc +f140c62c9af0a44b180280b95c9af522e77b0f32de23eb5f7625251bfda99170 +e9dcab1f6ddfc1fc7d9ce75c8b9d9350a73823790b789a41b33bdd12e5f527c3 +6785611b74f8232deae963e873156e473f2282f7598d6b05275e8c5ebeac183d +5239da1e92b56d987cd9e8d817b2be1730651955754e028b4041189921f28683 +8f80a3097ce2e58784a85a18477617d1565160895c588601d71584c097711d07 +fceb3809a57de8185ef6f4492f0ed8691693cb3c83a889f4116684657f1aca5c +d954d0c87ab67b71e6f13358a83c1a651805a7d3571c0c9791cb761014129388 +de2dea7ba4d0e10c3e3055155fe5f713e51e35d927ad9bbb85b033b9c6d94737 +22cda751a32c178a3e9a526ec9f50d3ea4dc1c4e979597a1f85e3d4342e25e4d +2bc78e24765ab3cfabd4db25c870488c2d5962756d737bb1c27ec5ea049e6ae1 +91ea186f69bfa8c8969c6c0453a47b73d9f6550131e73f00140249cd8dfe74c6 +c585467610842babae638f2c67ddddde42cf80d561cb19fa06a3b9ef7dbeec22 +e0083cd8916482c5badbcbf03e88f28aa322480baed5cf147f7077da4368da03 +9ba3ed7a96798b9bf4af20946fca2d5cce88915df1e03bccc0a8e8c8c65bd6dd +6b2195c57bb04dd20928222a230f22f564f51b3e9fe79564525eaef5d017872f +3020c9326b49682962c78064c067c2b46fa3b94567647e04e9e059287bf2895d +9d9d169816cd864157c41b432c86626680157cd9e3bf1554965ccf68d033123c +3667deb2680ca27d3241d6ad950b50ad22aa3166f566c91128cf9448777a33e5 +15a5bf3acd90e0148c7798a5a3875c7aeef66ac2d30c16e9ce00c71c82484f9d +39ad43a5a30dc01aa0e0bf5e18d0f91f0fdfcf8c30fb6bbea79a848af26d02c8 +431733f1f7e82fa4b37afae125d374fc172d1c9197ead90f986afc0da1243ff9 +97d02fc4b4b5c340a748429841b3a8b56cf3f72aedd6a4d90575fe7c781667ec +155153ca416dc9eaf8df3830eb21e077653f595ddad569d8bef8802ba2d2e2b2 +7123b7f55745380a83080ea954ba9f2c9039867777b33d1d3dd812d4f8166baf +9e1124da1b7abdd6c69596cdeefb999777943235314d3098beb54f8f9ed68ec6 +b6acb5aa9d3347b138636a0718f19a06285f194e7a7a81fc94e4d54110561e5f +61b8fee49f71566c8109162f879f16b80e3ef0342c1000e0cb32bb3b81dff1a4 +dbff77e91e6a561630848aebd0d1c40c5f3129e409da578238889870a7bce285 +b744707adac54c8091b1b1f50390f2886144294e036008c3e4f20267974310da +229b68182c2bb1af96139268da254217c47e5e2bc279200d858ff72a885fb791 +43ae0be2efd2ba6233620c039a1d47d8b111cd330609cb1d810279a7882aab28 +0a20204aa812c580712c7179488815e2366103d96cb0d564afb0f5a020493076 +46cdb743dd9df4f304a60871e597bda480624939ff921d7d36957afc64d5a507 +a48f8a087585bd0548b1f2c5a4c72533cef1db0694faae62c035bab307b765ca +422f221a5536c51eb201ff03b81834aa581f36c62916dfb1dac0a680f1f4ad6b +2353c8603e960f4a70b2aecf44c0d134374c35c88a77e0a62b542efe834e48cd +4de9d5a989923c8a6da285b3f6ba2e8ba4df07e63a16fe98bdd392df72759073 +f7af0cc58e8f279a232763a8a9d18dcb205350cefa25012c0183713203ec50d0 +f2d6bf83edbe9a6d933ccda8b1745b183adf413617af83605120075f49db2a24 +df5dab6f8085d71c4eec8944dde3ec0c1e51b4800a90116b25204a3e51def988 +eaa3ddb44d44a052477e2ecdde55d0282a5a9c5f4fe31f1d0bc7f40d1f76866f +c31db401b2865de254b1699ef0660727bc944470949955feb0a8077be04a333d +72de1f17e061040ebb66504544fcca2ae6b1b58dec1478967b7b17659a4e8c9c +fb5cce0a95f52d3b5b9fae59451608518b907aef2e1e94144b72fc846b1990a4 +69674c263d050b38ee61ca447b0b25043c980d68fadf6114bfe9319f27ece2cb +2437c5e78984c9599761d264bf15379d554540b13a2adebe9d5dde18b5663650 +025f9db1e17d5ebdd776125112f32c157d87978c564afc1ab4bb9d734689edf2 +e165cd4ed1eb93b699350d5253f3f869953eeabb6add680ba6a2d840bb7d90b4 +c4e478460059c38a99be0b7c07173b2fac2c68e242e9d3a2eae427c6fb733698 +e429a14c8b04fa08bf6b9980895b4706da12e7f8cf42fe3eb14aaadc87638a45 +704b14972f1df00b8e7a9354c15462ae600a6a8c4b95f33acd11a7da207e49a1 +192cf225d16b58ded179c8ae20fa7d6ef7fd384e7941a588fb7f8c5c29d98172 +4a848cd2a7109333f2a5963f2f42c6835170a57f92c54f03fb2bd434364d6a55 +d5adc8f90b553cf66848ead1de1197b267061f83442021bcd668fa332f3f2034 +143168d02812313f6abea888a321affb1a540a20df468fa35562ea4e45640c54 +e03f932f5581de862bf2bd2c05d2c995bf6ee2039a22ca68c9a71990cb499081 +60b1ee8c5dc10c9174e88f2aa5791908fdc7f7d37e7bada45f04043ee35d1dc9 +ec3704d315bb4e372ea62da6580a5cb5192ec21865ed4ded15de27bbb1672531 +bc5b4c3b2ac266dea3812192324b38c50e264f2bfd995e3a33119e6b47f23fd5 +51271d0a7603da01412889b76031948f722f9fdc54012b4ff53cc77e9a787946 +b79a81d8a32577317f3c7f715f8d3f0daf03877d06d4161503cc441c723166f7 +40e4727f23a4c75bec756e4c40b0cde10315afed35bf03d523d6ae00bad2dbd0 +358e691bf92867237ab36951657aa0c4d79726dc75d8c1c272da1b3d0b47f95d +2436d59ca941577a232e540928bbf58673d51715188aecfbee7aaa56fa672850 +b047bb56b9c8ef5104b10f8117402b229e483c863d4831b9a1efaf164e99cb35 +39c0299e73158510e5e1f861a6715b979a9982dfd800b0e38a394f169f0f3d9b +f4f931de232db24c616bf79f59719e6bad4e451df62e9769ef3b2e74033bb0d1 +437baee3efb900853193f6ce69c7d28a871449e9f84909a96e594db7fd08efc1 +217482e67b2e02065e60f4dd931136556c80f39641860d84b7354e86feef096f +06e84d35dc3645f05626b80e24f01df1031a4e1ee3df4fbf139d27f95926ad14 +fec86931515bb225c1334c86a2a59dbbfb13d6558d389a7202e0fedce9df3d06 +3c4559b11255d23e5a45709756d857060f186c9dd2cdea53f0c3031a4f0392d1 +4beeea8c705f18ae48fd22c8412b71aa4c62231bb9f34d2220e361cbe109818d +1b6b0be26b2ff128546d68029dc837e42204d73a35ca2a18e13c46d488fbf3bf +7f6a6f623085e42743ad29b3b9c042efbd195dadc87928ca26487e711463969f +e972c925d517c754fbf308c3a4ec5c604359a4c8fa57e8db4ab77341dc6364cc +c6d0640113d541476389195295d68984a2f25b33441d7d7bdf581229503759d5 +e955ff29ec234f2a7ddef7fa898dc3ef0e82da664087a42b6dc28d665622cd30 +92868e09703aee3764518038ca3969947a1b4e63cea5d6a7ec7aad6e7577b88d +2c9fbe177a04401747ef15b436b75d660c7cbbeb77bb44e430e9835ab409c2a9 +108f94117951832a5a0af0a5acd4e8233fe636a348f252d22fbfea95a5eae39d +d145abddd1467561b7fb12660b7cbfd5cf9cd84ee2988ddb6d56429e4b87fc44 +6cf4b70f45e8fc082d7020bd6e8ee33c6b94fefc99336031d219145fd293f4ac +bce0f52f8ea974d74f2b858a3daddfbfcfd50c3a778ddadd1d1090abf318fb58 +2129ab1f2acd880911be86a256af0d0f74657d53a339a4f527e0e9809e47914f +d7719db5db1ab21f486d85dc8852e9e2cdce6d35f5ae66b361980bc0516d1d12 +51f9444d3830473e30c9060a76edc532e8d74c4fd22b5bec03021bdb293a3a60 +9d8fc3aa0ff599c7a4593e555e1b82f0186671be699c73a26a281aed93af14d8 +5f9961d44c7f4954d3c878f8bfa0c5632b31d9a0c978442e917fc9ee88666818 +9e13fb731cdecca15c658320272ac9e968ae89bcb8fae5765998c8b4d98aa59a +26e36ec1543032f391f712dafaeaff23be8821b3a23ca765270cb0bfc601f57d +da601e2e28bac03b7b171101ac26c195863ec701a6ad7b9db8177aad94be5ede +eee3b11860892cec50ec4059b6adb16c63482233de6c780a26109f8639a029f4 +5c2d3e6a2d95ba25de8097aba992609cdd0a76683f8fc50acca1533e04f0eec3 +96859b3a92dfdc7d8d34f2add87cd55ff8cbdfc446e7154adea4dda504f6a835 +8e2b3433070f23fb153bf3838e13a23672dc8a1f88ad096693212d994c523955 +75b925b8ee182522d63a882f6d6a3ba45fe37eb499f44ec274666b1256595d2e +537684f807838d60f07ab06603e23f360d6ab50c94cc48d3ac9b31926cb8342e +b5a881221c1e34888336699c7cee8199dcf5318cdb661f9188be6dab543d2bd6 +9016f5094d7b04677de039ec3fc22732fa1ace506320899074a31d1e9e580063 +39613072d3eae526b88b5933a0c5c1a438558372ae20cb80e0d4682571f75a1b +47d69c6868ee47dec033c4ac744d0f958e2915b2c5115a73b5268aa94ede8f3d +182e89777695d9bc36217ecc7ac1bd1e460a6503d1f1a33919e1bf91349ad296 +45cfef1aa1dffa8a68d4cce0d3f6f5dfad069c8363c68924647562f23fb98a00 +62212b4b82a5ca2d9c98353b7863909d6c1de93a2bea9327757528701415eb45 +43472b40f1a044cd32ba7ca9737ebc5e98d7a0bb808b66d616526ec48e60f788 +d5051dfb52801b9d3ba318da1354dfcc13edb89536e9eb6216bf35a77a1f4b7e +5eca0840226eac5a9ca586ad811aad53a1938860af4fbf5fdf1af521c07ba519 +e2c2fa0dd7dbfc1153a5a77bda9d78b0ec5f28e832943ec8268a9fe453bbb53c +6a45a9e2f679126e323cf885ba754bcef56ff40bd992f0372bd85c303930be6f +14087eb0f5b26e5900f236d2a8895aa299e3b769767af33f88da11e5374eb32c +6f5cbc9cdd8b067abc22e26504fa960e4464803f95af1ad57b249f0826e3b092 +4a5508b46c8ac2eb5d113da479890a7be56a7a5a4896fb097e2374f2ac7d2e05 +ef4d4a31d8e9fae9a0df448f198cfb26ee8462dc01c448af7389076577d4814b +65fa2e4cd81d22d81db6ac028c2c0419cf6c6b0c8678e1c8bbeab1b89637fb5d +f04d600e7ea27f4768bb2200fea08e1872d2643cf36b7dc9a1d45425c2c330d2 +44dd92eb0631c87d8e6a275ce000dc7891a91f71a326d191c50c6426c7a5f677 +17a628260eabd753444083e6ff60c1a4257d97c6026a15efb19af06c73de3845 +878b618e10ecf189126b9c1f440b5114bf0d736226f86753da676fa34ea9958b +863e2f5e085ffcce7ba461ed3191701eafcace0c98abdd6ec4e5e37cdd1375a0 +cde67542bede694bea4bd5a92bcb296e6ff79e40f730490fb4ffa1c0b88e5d7d +cf6819b545612c1978c34ddd242ce9f05bd2de8c6bff8e79fb747035c89f0c1c +8bd4f55f14b6c510060105605dac0e571cfc02a8a580390292473b7b1705175d +33efe45867e7fbc9029106d0e66341ed9fa6ecdd6c8b4c50ce213a022a4d16f6 +adc0ef53f46870add3d7d1038523d8fff0b2443a58f087f910fe374b3181c982 +732b86c0e23bc8f9b657d5c49f4925868ece6e5257b6aa08f08b2df97380cc7f +d9c8e09d7b6886fe8adb6184751bb1a776b0f0b365dbca4d2e470a9f33c0e424 +318ce60407abf86c71cf2373e4226cc556491a91f4234f75d8a974a5b4c9748b +25e143d76d91150a4796b1f668e9d709b8d92c47173ca4323a5b1594c97409c1 +82a52797bf1f74a8cdebbe221e9d1868cfa963b57a28f27ced76ec79dad9eafa +c9dbc14b8a0542e93eb35bee947ea0c0fc373170406275d6f94483b5adbc3c48 +1d877a83805751d169c08a772f3dbab227d3ff467c9804ca7ccbf700a75ca77b +14f32e0fd063e6462ef94bec9bdb4e8a392db2d4e392a270e982b05cfd2dbe37 +02eaa1954bb92e0c74873c3e7b780e7ac3341635c5a48ab40a855052f1f769b5 +48b78ce8549bdc2d972b41b2ff8d4c188a6c6a3009b3cfbf20c9320c78b823cd +dd1b836a827ab16d2479c289f766029f35fe1fa278ee20c0c8bc21b02837a586 +2112128d04df3d2677260b123ff58fb1b7e6075f1aa0f6c7d56b9cb593ca07f1 +7e5ee7ca93720a395140b558549933bda0106ed4fb29284ea2b76eeddf0e1ca6 +89aa2a31f3a655c6886efc94ab37c6f2bd2cd81e351554ac3f569683ff1876da +ca0e0f2183c0613ff4266f9c4399f11dc9db5257a48f44ae2994dbce930db588 +46ba3d42b1e318a207645ee9b90ab34aa0ef3e113744471e5b827a90fb5f7717 +27f72758ca2e49aa0fbb427df80dbc2dca243e2d6c332d205fd8e8ccf4efb9dc +be143004845e09908024e4e59e8828f3108da8b9a590decc82e5f821cf3154c5 +319038719c08714b54082e645fe0baa6667f6ef885a19de9033e25f6f2274f77 +8e8fe9b9bf35e5b8186e9cc7ab124d0e49a8df2343922ce64f0f65a00a5ffd47 +9dcf079a301f59192a3b9f6115845ed1909643e3171ab6f105cedf73ef9652ac +c7f9c68b0b0fd090ea8bd3d3838af25fa3cefa1580faf0c50bffe0e964a12859 +e27e017bd84f8d89dd445f0afbf8da3a73904ca77d2b1ebfed76c96ec2f8a1ca +d38cd76b2343f3b3ffae2ce64de4a0e3dbd9f0e265807f731f6f01e1d61bedfc +f214ee2ab782eb6d3cf4746fbc372acea6153853b94f37f3f8771c5c01d46e1e +1d307cd73f2963313f46b0ece915298005a2e37a20e8b0da1eba7f0c06a7e2c8 +5bb8385b2034401837bf414b33e4cfe4c40f46efaeb4eb66d8c73c82798b4dd8 +ad3e231d2fd7ab77e3bbab8f4e7b15bb6c93f92139beae8b92fe3903aa35db17 +35cc096486740c95add2ee1c3acab366b335d361f39b441d0e22794696cb2a89 +279f434cf1ca1cc2263218f4084261de8635c0f87e38240a07f5a0b8706201d5 +e84cde169961dfa50d0aeb38a6606b76289c8234a918a37c766877fd4b254b55 +44b31946a76521b83b6175e892670905956aebb55876d19cbb009346b8f6f10f +a6a7a4c86da23716364edff21cfe7427d6bceae58e5fffe9e3ae92f3f88d9ef0 +786ec2ce0f1440cf0ab52ee2249d0eb924f20687e6716af698f8ab76f919d5c7 +4b4a860d28647c916c23421c50754d52749551e7349f72a5afdde899ae41a0a7 +074f2099a53d4403e3bebc0270bab5d191672b4fd9b24a3a32bd62c863ab113d +0c98bd274aeb746e8c592c72010af8b3806c86d1434113fd3a915e11bdfd4e3e +b975ee34dce95ef509c14f5cbc0ad0dc6b2eaccbfcea974baf685a369aaf802c +0df511bd0d2250813063525c128eef1a2ce9e0015937a9ab1d590a71587a9a7c +b75c6a13ab9072c934953e93ee05c36b99d54a765cb1b1062e5a312de7a5cb2c +092a5b06a9ac8914f57212df83432441a1eead79584163d3aaf35be581bacb6d +b70a2e42bc886f8bd7224c1e98dbd4fded0f293650901d03b9015b6a6f761978 +770bcb647758f87eac41a98633abeb13226e46171db24a7f0cb2f94e43cb7775 +e389dc2cc772f99b17f04dc1baecab2cbb77fd8810e1d818be0a22fc3e313d2d +462d439e45ba764422692d68b01e7e18fac49e91501607974c9c1cc61f2c9a67 +1cabd1ea8ce615786bfee65314b414fc14528e59befb56f4863056b4fc18bc21 +d61bb8c0984bc7c16b491267a7f80255249179c6f3378c9485514ac7c2c84f61 +00e5d81d362e49f278fafc1b6bf0aa9d76c98476a3e3635165d53a904dd6b699 +d6ca2e9cbcd609d11cc9373f4c1179891d2c370681c8010ec75ccf893b040b7a +a413663f8e262d4c054bca74f0c5fe40e24d57ef4994db6543bbd561f2b33504 +0356430cd25451126ec91f82bfc73ba6d843c07f304472aeecb7cdd660a34a2e +05c1e3c06be790aedb514288ec1e029bdcbcfc13689377be037674051972e96c +df6753b2e31da945b56c0a7316ed42adaf78a531d7412b3a26e33c3fb926446a +4a8abcd35799ef47481ac60948245280236668ae7df01f3cba2384dc88945c36 +7c9d70039f6adecabc5be2bfeaa8dfc69bc1d40b593140c974587905557c4a68 +71ff97652466fd44e8f18d31e9855bcb25640f15a398c257292c61ca77b752bd +aee91ff16e070da93ba5a9cb1d2e137fac8d78499b015ec2c3f8e38422c058b6 +8ced660fe0af345c9d4513983a7662a0c679236b9deca23879c983788e49b143 +67ce3f436353b3a86148ec21402c05a5e815ae1e375de539628557a8caa5af62 +7bc56019eb0c11f753193b3475c6512f1af8cd4032b4e13ceae3fa51c167a692 +01d054707f40b3cf7d7fbd23a6cd3b680d5c20e0181208d4b102e0f96841b6e7 +ec818a881bca226699ccf9587bac922a6b51b545d8222e9fec0fc90bb7b88496 +01a7c60dc2adcbcd798c8d3b67a6c4b6978388d83ee7f052e58d117c15067d4c +7e0c8bcc3064287cf2cf511ab902872592280b67295c0cfc7b1e51b3f8b71fda +b9e285f6f0de7030ce9b57e50df59fb2ad6ed36d423f7f2e148246e66d343396 +82ea928d4a3153a382a9638e9bac663b48e2d1f565ecf22d2a2eed624f3eb980 +444697474a2b983697ea5614c7a867d48363a1ddadf4efaedbdcf6306543d62a +4e2c4b153ea731c1e44b1f362870621b3f7b992c85fce0d4889b78b25d1a1a1e +c017613de16f6da6ccea3e6c0958d27aad413ef02097a1e379a965ccc3a75b04 +73dd0b82caf8ec8788d4bdd46665810855f8bac3daffb60ad8707c728fae783b +e9c8a8d34d949caa5122f37fea44063211379c4b88c5fdc06f451d1c06b1fb81 +3a25044a5f8d348b4eaabdbe4f9c1ca8943d2af204c41dddc2c1a2bbf979128b +665b9f84cdd35c82fe3fc9f7457513bf4a908c3bc2a0d917d8af2417ad776767 +9b8c7be588b373753077761f99fe50c8df8a8f85eff5e4fd53d36644b49e7cae +3f65634f6feb5838017ed45a4ca1dba9adc2d4c525d1f952090d31a49b8e2aee +6b45e0423385f52628d8e43e0cfe89d07640971455c629da5d938f551f8e60fd +03eb7fc642bcded570f8f592eab13c71ea7c9e833ca2d2d08c453f84b13fbdaf +7cdcd6383ff2c103fced1d16cc4d8a21d57a9e65d89f913f1a028250cc3226b7 +0fd0d223f4d715e233caa1aee5e9fe4ffaaea243b0e13c198bb8dc8af12fee06 +09be128117b9c7bc338f21434dbc92bba4f7034b062a3232f73132558ede0fb4 +5ef02c7bb6c146e4290f0d897ca4d72eb8d5312a9a5fbd0b1fb878aa3ac69c5c +3330a735239e9181ae7f29267cfb5249fbe39470d119ca8dc6e0ddc18d5c277d +b2f4a12cc489660685fd824e4db3a9053cd6fca133c94c75f8ac1485ca36045f +8ff8c6640b95d2eb5a7b0d4c5931ea75418c151157bd25f93e05cba374c43c38 +f04e4e89cd5cda0b60e1e5d4713396e2b553727a20bb76a33273bfa660ecfcee +2d3df3bce3c339a423fa84d97a637e3a3d99aa19ed8d6e5a68246ddb6d3d609d +7515cb0f19df665d9f5cefbdbb745a89d3d69887e5a0bb1b4e59f4c5bc0c1a03 +67568e924f8c50654474b48003c443652a2e7a32d5c1775e9b930cb0c99f1a3f +e6ed3e505ef02e231e9ba5a08c77571fb397b28df3f6334a59d62e87b9b73bb4 +8b3f911be84cbf41565870434642285ab575d94cf326ac39d601db42c83371ff +55b1f9d5471f81754a3ec6233b47f444e28c0f537d91d8d13f57be0b8cce06ad +f946dfcd3b272ddc13c3360225b79919f97bd2218313b06a80e4d76d899e17e8 +90a00622db00345e86a42f406a6f4185fda063e80b2f8b98b80bac88b400eb82 +12676ec8390a716d56e244320febf16f4ecb70e06caba17d7459801da82232ef +71c80a924edaacb29af50d26be34bde0c1554671f4b0153a40a8693790d3ad6a +5422eb65661cdca9379e47e813ddf9e1240cb259990bd8b92d96ae9576df599c +743168ff8f0c64c37e870e3ef25146a9231c46578ef77cc3464adf25ce35131d +640e067c5843d0d628a36b9f5fba003cf19d15ec0d693a8862685d46a30a18eb +7d66a20b365b258edc2e9d9a6b414ed0f1ac1894ecdd4bc2d707d88833a1e34e +a72389fc95d26ec2c10e8474bb00dc4200aae15adce11e1d8c4014d7e13c5c0b +6caef835ae542019f4ea14c7283fff973eaa8a310f40de4de0ff56807bd4c46d +c45523fc703fd8c6d08b32ee6e31943dcb52a47b30dad4d3d2a5cb4d647febff +ca269375f1cd0455dc0a81e1886a1dd4b78a9d30138e03517011550a22997fbc +4c6a833d32631d4a6cb9bfce3d8a98fc0393aca086a6bedc8ff833bb9c455e2d +1cfd953d3f4e60f06e8226c561ec5dc4994ed8745d934e231d95765a0809b952 +48e85d325ebf37d8084619d4de9cc4aec1204c9122b918279b1ab7e63d9eb477 +74654bfa2cc04b8ca5984e2ed6cf7358df124b5bd67b523c4785046780708e2d +982f3a7f3e6e266a5b3b72c1d9d13cd7d055a957d96015b11ac1e05dcd9fd6db +aa69fec04dfd90eda81bf71aa205d1587eb8d1ce5b97cf43f32bb9bb2a41ba55 +2fe72fbcf8573a998a4be2e870380d4f6cb4d086ce926c86db0e248b4e594d4a +e233bc13dbc6a55c5e7fc9c9ec994876cdc9795e0d3d0535f702f13c8cf64659 +b0248033530ea3b00295bc96240e3a41fd97a7e175b544242eaf7146a6d413fe +fd9d4c4bc1362f20a1678b8d6ab03d7a72d9cf8d79a9fedcf826274efea6ae0b +837eed3e717c09f713dd29b6ed9f5a6bd7ed0676b6dfea8c9c02a32fe56d704e +bf1271604acfc1ea301d86e270427c417baa917c5d6e8e24af0b352d4f6b419e +b63ac268e581a5aa86c7eeef14a718e33f4dfe5bf05a94675368e780b8f81ef5 +ade6d7647f4282ec319bf5991a09714594dd1854ba9c20d6b00ffab76e54f388 +a60780ec12af64779f2adc061dd71135447bca3daafcccfa6183fcc78522b533 +1f39f30e8750c0a3337a44766cc3f7f210c1a8e10f4ed1cc54d0729b26f1fefa +7367aee66b33e8dd0e78cbec4bee5a70ca809ac39f84b72f1d119e4353c2e4d6 +20c7f6383ab7129b62270e6f7e75a1648d1da0536e79d60787aa3149b96a284f +2ed1e0d2c9c4de7be5db53b35d360c1c6210362d4a35f91c6633daba2c2272ce +d87c53f85ca1b55002d4e8680cbef6bf500632752827c0a5f19a062bbad900c1 +11442036e66d360743faeb0636e1f31b554b6567e4540d07abd6e1ce39313277 +5029e890b63ab4708ad351725bccd79d75e49cdb612da57efe3b44a2e7870e67 +a5d9686eef4b57c2a17f2d83cecdeb54914610e5a3401a97050fa517f1662297 +e06d29442d0fd89ba10f21584e71eb8bd5b03fbd56f5a538f72c9cc8ba5da11d +9e4a7f8d9dc2fe56f2976d3e6bfc901de356a3d0690a0aa715ec6d339d72061a +530bfb5323a8d038b8ad3adae140668e505bd100bdb20b98371228b841d0873e +832309912ac7e9d4c7ee9ce81285c7f8e9afa8e2077e635bb36167c9e9c6153b +c73fe799800c39fe343d70e38f30a721cf2796839096add3c82b675f0b659f6c +99441f9352a332065c9df5b419a020d9b2fff06efd3295250d5335f7a256ef97 +992005ea2fd03f408a7a923ad8afbc8224daa112e8e4faf2ca974af2cafa92d3 +d5e9fc80b0bb00d933f50ab9010d671751b3a12196919e073678c2b047435a8b +b826809e33bea0f12379ab1a0392d37f27766ccf15b3648e574e7dd1aff8295d +df3db858bc078153072770fbe45196c3107a12df7f48d7bb6e4b99cd3553e01d +59bc130f7877b18b65b15ea50db1146c8ffb2da5180b603d920c099d15aa9533 +b594791c144a3822f337abcba4d33d36299bbcd94190f85e0c28f4fd51f9cbb8 +9d301eb3f41179389b4e3323bc407c1ab223ba1608a5f8cea8d08a13dc4fc307 +2f93d59a3c8b32cf0721dd80c369e4f590d6fca9930d4ff110611d755b5fafd9 +9645e29003540c72f70f1ba5b1a884d1938f77ad689e6e70afa7216f31988919 +86df34a1089f9a009926b8983b05663bebbc603d90ed348ec33afc5a549af5db +86b90fd34f534b24234f229409f960e2e921575cf45520f2d651c62bce7ab637 +6c2fcc99345aa8880a8cb7a67c54ca398cd61ad14162c9561ed8e4e9737aa9e6 +b513003edb220ac92894ab112e100509608504afe0fcf85b7bef8000adb3afa0 +3f85f52b856c23a68f58bc28a601e5430ae318ffafc24975eec7836b147a5a50 +d0369b90f111aeac20b4db1abe66c32bf4231006d79ef4c303e7aefeca4cd5b3 +00b6900a26b2b9d98da2809a9135dc6e16644dc932f106b016fa02730f1d6dc2 +b1c9e10b610f2bd769fc071e06ee636ef566bfc05899c740bf3ba380cd7164da +7fa355324aab667f33fe518cdb19060cf3fae8a0363e4460a6c2c9b70bf39054 +b2d3eb81093b0610cb03e2e7180523561cb05761b5ca8cbaaf5a35f7179b1d4c +18d0b7eedde1634f120fc0f6134e55a6de259aee6d440444e0ef0fb7db8a9c63 +95f3200e5d40b854ea844860529d1b694585b8826d988f432be1f620629691ae +f282e79b2874754f96c4a4a1155c2ea07450c2a256b9d8e33eee33c232c99860 +1e34dbb63812ca08aff99255ae6def9dc3ee2789e9bc1d956de9fb255bd51d5b +09da88ffc9d8744f61e002da68f41aab3afd0314ef876318c8785f87b04dfbcc +bcf681dc8a0d615e24ce8f6322705a59a0824b5d1f0d35c7b04062d13f5cce04 +7885cf30dada61ba4cda74df52c4d4afa32206ca799ff9e9ba2bf939deaad2fb +5b14cff0283dcb41869cfbab91eed9065d69a6ddc91cb241634df75a81fcb4f1 +490bf1195ff98db50e9fc3c82f10d91968259bb1b07645881c274d7751e5c2d9 +40e9e8a23de33344c3e15b8c0a3801cf73eb1dc8e9df066e7ec61667ed349f0f +45ba6b0832143d4e6e7901d4ab7b461ea6489f419b59ef6fa892663b01a222e2 +7bc2f4cbc81b1982f595dd2cc94d6388312cbb61ff2bfecd27b1220dec43e9ac +143a83b5a63c057e2ae6393054710b5d616316ed94db2e6698c4c1ddeab6d9ee +2444408d659c7b68d4cf5c294dfd4299507c41190068c3905bce2425f652c49b +de244eb94d28d3d5297e9a11adaa7c9a9138f00659f2f4a42fa34db8b8e29246 +15ebbafefcdc538911625e0e0e9ac8eca76662bf295c8fc2f871fd9aab87ef3a +3a7b293875328e89d018f40c760006fba666b8c1aec0c64231793e22825df5da +923979c72db39f5541e7f489fb5d9510674e8be697a1aa7a0249dac954fbad79 +06d11031ce4605ea491e9920524f4a60ae55c85371fcc9f046c1b83bf3e5812e +2a2f06cd724c777d2238fc465bb016e8a78ce7c86808698a852d474b63c811f5 +43591f5d8391fe4a4d2dc3abc5005757a17922b6eb0be4b9c238fd162f9224e7 +475456f639c59a26c8c6107ec20330c8724d6f6842edf3875cd0f87dc434ee65 +421155bbf5226c31de48374d426bf3f3d07b9bd718ec54f8eb9a6f88a9de594f +ec2c9d4b2b32827fedec8078a6851bbd269993b246b0c902242f0c7ea422d799 +65338a2ed8a27e49a0be708911bff10f485b753574d8ac8313caeab496e0ccd9 +5b67f10cc0c074ca7613d05a67bd45df6b72f6e30eaba836812c91a2a0a4bd42 +2141d7443ab359be588901f46a22d52fcddf6bc04e1fb006a32d37dda270565a +575354b40af0869c9b1f8a85696326f546e9a25417b38b9b5d972bd0d933226b +f8b34f70b324255750f5a64c85318907900c3320f070b1f789620e4f5db6f37d +461f4a2f15e884b948327d53420dadcc4b073b37ee4fe935c8f520d9828ee209 +976fd2c26c71e3bad6583784ffd61a2f419981d51592a6f8f47b4718b6736a2a +1ed7f729a521155a39394d038c34d8a76e9c6f91ca369da29fed83edfc05a219 +853e5ebaf1f3d5c6ec932e69b7a0dc19d248f81cf541348c85853acbb8334b12 +26ce33140f3965db1a6f79ae0abb24b93b6916496b1698057d4c2d4a6a72305c +11b731a8a07ff1eecb84fb6e3f3c3706b09a0cef4b1c2012bb9278b76f5189a9 +38d5b9fdd4cb9028f43d16dd39fbbd10a684582951236a05e0692bd1c139742d +7e75a21cf14fe99d51dcf0a0b71b267a0ad42b8c1d7f46ba46972c8ba7bdf849 +15fa6c5a922dc93fbaa9fc50c7696494e6c372f3467695da5a6d7eb87c0437da +d7b68ee36874203d741e373e931425d4ce521b2728633a25dbb435f963399f37 +8d0adde8345439cc5295ba3d255a72039ddb1592dce1ea47a92d7b641182d0c6 +85d0616a85361c3b78bede0190834c1de0d4d132f459d8f29586dc73f974dcd0 +5def570984a9c2bc5a720999111c7de6a28dc0c6e9c51f82d8c55a26ff5ed760 +4337606960f847382671bb144d5ae5032c74e0581b19b21eea8ce4529eb792c1 +044418fb0e3da356a5b33cd97a0dce15ee9279b076405e23683f68c63b6b09fe +c3ce3e1b30a4cb3a1e72455a372b6eccc7e4c97336df45d0bdf94aea01a108fa +f28d98d7bacd750c7c25874e0fe3fe20d8e1d51043eca67c546278dc13716d9e +f81a8fe2945a6a49c82b653804d54f626238396d8e4a9bdec4946c365d1164e2 +fed12929b769cb13712ad61c764d31798a87a3e12e1502cab14ca07efb524ca3 +dc31cf17f73feace77494de837790d812dabd36cf4c78123cf76b504886d0cae +13fc6757bb6878f792a86d52d0e90913d089d7c81faefc56dfdbc3acc2195981 +0728dffd98a2254e39eebfb51742657ac9088cf8adc21208f3a333a1f45beafd +69ae647754161c6bf0a76800edcfb6a2339f03e4b5ba4308b924ca56344770ea +1c7322f692c297794b03f3c2a180b645ebf850afb290465ba050ebb9c8298f2e +50b75571a15a599650a7fb1fde8263e49a68773b5184c30da3fe59a7c75943ae +c5d26594361b53c26162410d3a1bced7c1cd0053390c1e2f8848e6aeaf75319b +7ac5654a16cb93832bf981b9d54aebb8daecf97894b560ea75f51bb39a2bdc9f +f59d01321b51b23a10827e1845e2db316d86d7dce368313f99ce7cab2a8e7c50 +8f91f0faf03626ff87247ba86dc7f3d837020e6aa83921385df0f401e4084237 +95251c27e8944749aa33b0b697456453ad8a5be8324fd22b192adcb22e03c74e +6a3c9e6f7e452ca491db52e6b18016592cb09955f05365ec73300dc3e179c32a +d08a443de2753d56f0c968db00d9cd58f1af7e3811202398bd58a337e7ddfd84 +1c8c8efd21aac90582130416d261f3a1b9f36ca431c8d4efceb9eee03d680165 +70ac1f37a1698c0b4da94cfd4c57ff54edc1b25fb713177fbf209928a1272cbc +25655632d43e6d14c052763452d51cfaa32c8df47c57112ed37ed239f8c00268 +c78d7f3a0a965fd9e3f3c1aef2dcdf74f663a72b15fa09d7309f2d15b232efcd +baed8a66f17b0dd190081a95a5619684a184603491a32114a5ef2c5076caddef +0b4eb2197fd59ecacc6416398da20414cdb6a9a3e9ead646c34ae4ace4cd57e4 +430cf5bf55ae076419c0b79095d903753ad7f46dcc1b93f782127d33a309f245 +33484156f9ffcbf9e841d0c71ab0b12594cb2c327112508593573cbd95d75739 +f4ed866beaa48bcfe3599f62b0a848d6f63fbf79937966f3a0ee4c6163ed16f0 +4b8bd51ba483da59fd1d719499ea3aa49fe4917e10e2da13301b0a8b50f3841b +6e80904dec24e5428b97ec17e66889170d12a27c028cfac9adb2eef49815f433 +b6089c9d6ef39f058f0cc655b27f4241ac74993af39e1fc17d5f9e27c569ade9 +ffdf46027fdd633bec61d8c5fe318810180f4437f356001633e14e098c992da7 +52f392cdb417d2bd30698612dd7b2ac00d0e5b4b3d7a20b99d0858d5e744d4af +bc9acac37005c3841103a6ffdf3192ff85ed425dd221e4bd71ca3db6a739c7fb +9602c130a1cbfb5b9bb9342099c2f60497642ed1029e5f9308a5097d6f33c815 +0f9a31a988ab5c162e5aa56357c8186ec5914533aede037fa99820ec322c8fcf +1ae1a6aa6e048c99d2af1b96ee8b313ca0453923f5fa095aff28e7cf79c4be83 +70058ec3619ae4eb31fae28947355290e967453cf351ecd976ad1c5da7573f0a +ddadb5b6661c47a0dc3dd22d7c175f9391bb9e359bfec4eb2b687a5a6f2fc8e2 +3ab232c34a95f54cf924fdf8011148145466799cd44a8440a0ac99b7f119e470 +a7fdcf6ff7a57a588f407de565b6a45e7fd5a1925efa770209110c54af8815ea +ac1af9a0b5a790f6df301f7f9a105e776ba30e2b56d1dc2c0811990c8d2a0d59 +d733ee5bb53fe30323632057131ba4ad1d49cadad65d386ccd7a2c70bccc068e +e881a538aa3471ea3b66ae24127dcaadbcb01a9abc8df00353c568aab8a971f8 +fe42a15ae22fcba141317584119f38d44e479a0d230273fb235a7895972f3f12 +c9964d1fff7ae88b9d39bd0c948a5ecbb2d858a26c01d57f3ae91ecca2475bad +2d9c5d8053119644ee9ac5c3448c412b9fa18b8c5cd666b58714124c3c1f7d24 +62b31fe9605544652c1b62a4c16c03876977228b7808919fd49da8c14e12971f +bf157f70c41e54927f569a8ded69e9ac4af29fc679a278a7c6b0b1a605bc8f3d +d28c0da975292d88fb0b27a12c56ebb71bd93802ed8634e6615f92622e598726 +f1964331f9f3353638adfc0b3ae281842a8ab707b753f94cdc80a4133dc2fa76 +0e723c34a5962c79901e1c3be3644d926abf5a71cd581c2753042a0264fc5a5e +f6196bbfbfc152730227798be62643e38c512d889e61b5123e58c173ae6cb8ea +1f3c5358d9ee649afaa3c0fa0efc9d018be248b664f9b16ff484989e0ed8a199 +85abe77acc50b0da312164a738dd0b0f8156eb2b18b9c18ad7c08ad8b61de543 +84d1f5ea363354272e3d937a2f770a74d30910f195d337780b3b65791a0546ab +18a8ad95353637c276b4fba66000886be4c478fdf68bdeab674527bbb86d75f5 +f05702581626ac0e693f73f08005b929bc154a5cb26f1c1447a34cf441aec12c +e061d5c75dabf9b6055131b7e27edfa1197492525b8ecb98a74753f10324b4be +61c87eed22b31f59c4fc0a434df9d34e3ef204268df01fe50866c937fdd83de8 +be67591219361b44441676d4e24fbffdf0fe6ffc1246c94de5de84d0e2ce54f6 +4001a4d5056dddaf20dab145f59405e14629138ce2aef7f7df4c3ac3c34c8270 +0195c65a7e6770d2e8211b5d6ee9ee826c316acd3063c634114d96b68f9e7be6 +d6f09e1004eb05a1b8d5b8602e7dcc4e9942a1a07cbce0515a5f651df70bd369 +31149d9d07e155b69fb7aa2ee350c52fec11cd82b0bd41dbe5af51b22a0d1aa2 +42bb655f8bc0cf68708f4891d0152ea90a8ace90fabedb75807baefc45b6fdbc +ce98089dbe4004fb84cf3ca808b355a401bfb7cb0bdf3d34c56920ea7c9fd810 +1022917883c46cea4f9c53a1b735206870f51b55f688da9c8569dea21b033a7d +26739a6dc374059371d7f0e4f1369f24abac48e2bd6c37033106921804790ef9 +8cd1e8b8e954dda81ce530dfd6b96e68e9e65f68893704d4e1d462e7fcb38be8 +9687baab78161f5e6957db5340f62b08b6a15b34574f8e66a0e3ef88db94a571 +2d01ac0f7b3971c994b8c4867c26294e63e18b06748cdf7067f521acdd28f928 +efd5ba043ff030c24f8dd60f472c254442493e4d5ba92cf85023881b5a222ec6 +5a37ebd19b3cf67310f5fb521ac4f8434ee8e998339f7fed4cb830c5f84198e9 +c5ca9e7347186fd6dc622118c624b6c5ec9554641de66beff929d05364b9ff44 +dd342e36818f8af5a81208e7d92eb91647f1b68e4bfbe708c0ea70e90a1bc7fb +7fe7d3d81f207dcf44c20fe86ea34cebd111b7c5cf7e0c4ace99eef31ebf1160 +ac50564b361d8d039b8f622e3c4d6e85474d232bceeab726bf66b307ce147c32 +b1351681a3b6be40d13fd8da37cb71bd787b78a922f3e9f70969a716a76c2c1e +fb6c315bb455ecc8d2475b1e61aea14f788f235f8b5a7cf987b78910b2da28d5 +288a7fdc879b66f78d5aaaed5293a17a1d96d0715e2d0006feb9a9d7e4837fb3 +91f3ff93e02ccee1ddb2b47716abca344666c1573ee338bcf35d7956b9cc82ce +5083ef6d3155e28f8755aa7f8dc6dde81dce8c37736e78b97c4459be3b471336 +5b93671811cc5a397a4a943b1a82f712a7526d9010fd07514856505621d5d667 +68820a69f5ea83b0d810ab8ed4e5c9acdd54d4c19f958add35d3d21f7089ddae +f69e4fddb831a94cc51f7be19410c5c6f3b0ae57026c4a2ff33bc8f91afa9844 +abf3f6ce +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ogclient/lib/fonts/fixed_120_50.qpf b/ogclient/lib/fonts/fixed_120_50.qpf new file mode 100644 index 0000000..95b6080 Binary files /dev/null and b/ogclient/lib/fonts/fixed_120_50.qpf differ diff --git a/ogclient/lib/fonts/fixed_70_50.qpf b/ogclient/lib/fonts/fixed_70_50.qpf new file mode 100644 index 0000000..76e5919 Binary files /dev/null and b/ogclient/lib/fonts/fixed_70_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_100_50.qpf b/ogclient/lib/fonts/helvetica_100_50.qpf new file mode 100644 index 0000000..5b407e6 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_100_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_100_50i.qpf b/ogclient/lib/fonts/helvetica_100_50i.qpf new file mode 100644 index 0000000..ac7c696 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_100_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_100_75.qpf b/ogclient/lib/fonts/helvetica_100_75.qpf new file mode 100644 index 0000000..a1ddae0 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_100_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_100_75i.qpf b/ogclient/lib/fonts/helvetica_100_75i.qpf new file mode 100644 index 0000000..8bd9d1a Binary files /dev/null and b/ogclient/lib/fonts/helvetica_100_75i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_120_50.qpf b/ogclient/lib/fonts/helvetica_120_50.qpf new file mode 100644 index 0000000..f7b8484 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_120_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_120_50i.qpf b/ogclient/lib/fonts/helvetica_120_50i.qpf new file mode 100644 index 0000000..c796828 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_120_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_120_75.qpf b/ogclient/lib/fonts/helvetica_120_75.qpf new file mode 100644 index 0000000..14c1904 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_120_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_120_75i.qpf b/ogclient/lib/fonts/helvetica_120_75i.qpf new file mode 100644 index 0000000..2078f49 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_120_75i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_140_50.qpf b/ogclient/lib/fonts/helvetica_140_50.qpf new file mode 100644 index 0000000..daf1e0f Binary files /dev/null and b/ogclient/lib/fonts/helvetica_140_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_140_50i.qpf b/ogclient/lib/fonts/helvetica_140_50i.qpf new file mode 100644 index 0000000..002ac3f Binary files /dev/null and b/ogclient/lib/fonts/helvetica_140_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_140_75.qpf b/ogclient/lib/fonts/helvetica_140_75.qpf new file mode 100644 index 0000000..c75d848 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_140_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_140_75i.qpf b/ogclient/lib/fonts/helvetica_140_75i.qpf new file mode 100644 index 0000000..81ef8ec Binary files /dev/null and b/ogclient/lib/fonts/helvetica_140_75i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_180_50.qpf b/ogclient/lib/fonts/helvetica_180_50.qpf new file mode 100644 index 0000000..2390022 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_180_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_180_50i.qpf b/ogclient/lib/fonts/helvetica_180_50i.qpf new file mode 100644 index 0000000..b2d32da Binary files /dev/null and b/ogclient/lib/fonts/helvetica_180_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_180_75.qpf b/ogclient/lib/fonts/helvetica_180_75.qpf new file mode 100644 index 0000000..b3a5f20 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_180_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_180_75i.qpf b/ogclient/lib/fonts/helvetica_180_75i.qpf new file mode 100644 index 0000000..4beaf00 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_180_75i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_240_50.qpf b/ogclient/lib/fonts/helvetica_240_50.qpf new file mode 100644 index 0000000..a703e96 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_240_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_240_50i.qpf b/ogclient/lib/fonts/helvetica_240_50i.qpf new file mode 100644 index 0000000..75ec4ec Binary files /dev/null and b/ogclient/lib/fonts/helvetica_240_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_240_75.qpf b/ogclient/lib/fonts/helvetica_240_75.qpf new file mode 100644 index 0000000..ca90014 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_240_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_240_75i.qpf b/ogclient/lib/fonts/helvetica_240_75i.qpf new file mode 100644 index 0000000..9584de8 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_240_75i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_80_50.qpf b/ogclient/lib/fonts/helvetica_80_50.qpf new file mode 100644 index 0000000..149db40 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_80_50.qpf differ diff --git a/ogclient/lib/fonts/helvetica_80_50i.qpf b/ogclient/lib/fonts/helvetica_80_50i.qpf new file mode 100644 index 0000000..007d1d8 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_80_50i.qpf differ diff --git a/ogclient/lib/fonts/helvetica_80_75.qpf b/ogclient/lib/fonts/helvetica_80_75.qpf new file mode 100644 index 0000000..4293066 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_80_75.qpf differ diff --git a/ogclient/lib/fonts/helvetica_80_75i.qpf b/ogclient/lib/fonts/helvetica_80_75i.qpf new file mode 100644 index 0000000..e192925 Binary files /dev/null and b/ogclient/lib/fonts/helvetica_80_75i.qpf differ diff --git a/ogclient/lib/fonts/japanese_230_50.qpf b/ogclient/lib/fonts/japanese_230_50.qpf new file mode 100644 index 0000000..5bf076f Binary files /dev/null and b/ogclient/lib/fonts/japanese_230_50.qpf differ diff --git a/ogclient/lib/fonts/l047013t.pfa b/ogclient/lib/fonts/l047013t.pfa new file mode 100644 index 0000000..475bdeb --- /dev/null +++ b/ogclient/lib/fonts/l047013t.pfa @@ -0,0 +1,1346 @@ +%!PS-AdobeFont-1.0: LuxiMono 1.2 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.2) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Mono Regular) readonly def +/FamilyName (Luxi Mono) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch true def +/UnderlinePosition -88 def +/UnderlineThickness 83 def +end readonly def +/FontName /LuxiMono def +/PaintType 0 def +/WMode 0 def +/FontBBox {0 -211 600 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078983 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83BF47CFE01E54AE843C1 +FF919109F85F08DC15086C2613CD4932FFC3BBCF951312D7AC8EB70626A8256D +9CB48AE151BA7EBA556B7FC8966221E8114D04E16C2D41159D816F0736665744 +C5AA840A8C9E4A697E288564BABF9F22155139A91877825F56BC44047FC0057C +78C5CD71D7859D99CAD461A73C7871F7161E71EF00E7DF6D787AD0209C092AC4 +FEB4AE0EDF2141C62D4C5120EC43941E32433D8D3EDB02539B98433D8D9CA45F +6AA67D383551729AEF5E277B8CFC1BF612583912EFA2A3EB1C1490696E3B5B64 +987F7129C7F195446A898B0405208E0943FEBF10E74DC40EA182198E60E9BE5A +785D6DF540CF0AE65F2EF925FD27DE63269160F358AFA6CEC1C121F1EE2BE18C +DC1237C59283BE1B774EFB9863BEDEAD8229E459BC6E2DAE03EAA3083214E847 +AA01F76B67C91AC84CF459139DC819E0575C04BEEF896208B91E6A6CE8AE784C +E77246F7BC68A2A4B4F642AC3AB4748E352DE8555F5907B36C1668ACA42182D0 +E9FC1C228F7BB63F6B041C2DD08180D1AED8C25B136D007C6DB9E11C2367F0B9 +CAC27A34AE8EB2981315AA94AE8377875C50BD43DDB93A2DF261456B4B945340 +C81C790B5EDE5C3828C55E244DA6257D05D0D2C3274A35FCF96C19BF666B8C45 +1982729FD8C9E61FD1F81A4A346902E511732F09CFEDB4D88AA555E15C05F19E +2CA7BB2294D9079A9182D8970ED7153C9D262F6203290D693744F86EE55CF4BA +2F11579C681D25B9FA91255884C9A5050A15728E11348EE5EB4F370749C3D27A +D6A686868DCF0E327FBFFB45EFA735CE9AE0367E6A239B85FD751BE92E2C7D8A +618A08110FDFB48272337AEBA86F992A033663B0DEF168DA75BADB4071110941 +7320C0990BCA84EF516AD34E5AE14FADF3E3E44EAD46613423069D24BFE0E28D +DB6D32D0001738AE534BC2BE240BB5BFAD1489CC2B2F6621449936C68786A51C +02E8C179B643E401D01BE6849BFC89E896B1C3356DD9E8FCB69691AAF6BEBA04 +24D62B9F266D560B4089E20A9F35AD4A7F65A7183761ABBEE0F7EF26ED3565A2 +5516A3A5A57143979A1EEED8CD52A69E4E1AE4795F3EE0CA21B9F4D166783A9A +F54B08B6C56703932A310197E328C6E6A6BADAA11D66A952964F31FD690082FA +02D1E2A4512A9F274233B203FB770A3A1C7490ED630D0FAEB3066429D00302A9 +5B07D8F628F1EF4E3F45B5AFC9638A46BF1286E21A7463ADF8D870CF36728FC8 +3FED84B967CE31C5F19D9E36E707907AB3946AA1DDE97A87CF71BFAF25A904BF +9D15DA7739FAB55835A8B8AED166F2445E020BABCBC2A84B0A20C8CD2778BC3E +074CF498E454F752CE7412BAC70A04CCB4C093854AC72F28F0ED22066816568D +2B61F311C2EE3444CCE402A461CA0118CB6328C7A8FB765C4A008B5DA5AB9916 +AF83CC04157B769C659A794A7C3EF8149211C0EC2E81A2FDACC6E6C2C0271987 +E8C47DDCD84E8AA3BB0889764042EFC8249E0FD10586BBA5E3C7D5394C3C2FF1 +D482A67514026A4D65B094DB94C4A8872BE1FF437E983F6F2E8B336EEA6FCEC7 +5ED6683A41C9CE6E70671A63F4BDBE846CE41857FDACE3327FF35AAADE4C338D +528224A55C4504C2CE5A774EE32DE11CA3FBFAD628A915FE452B0B40F774AD1F +099860E44D875F4DA0C71B9E586A7D4B8AAA9B7D8225CBADC7C069C46B465BB0 +3F558588B9A6F0330D353A8025B39BFE5ECD63F6A6DAD23A1034B09F44BE2CFB +F7D974BFFABD8E22DB54CFC0CF46203ED59D7E257E07531D818752BE3E059D0C +453666701360B64A0E687F8B6B06234CEC96F09671999B301174E74945BE4726 +3CF6B35E73461E18DB1598541CD4903EE143F0FF8411858E57956DB86364104D +369FA26A999BE77F55F821932BE8C1F6995ECE359BEC8CA7232E70C3E17F0DAF +4983A7A210F2585266B9AF3C044D70B536630411908DE81B688DFCAF9322E09F +F0977B628FA31D986C1A66D0F4A6E8A2D7376C6C60099E31F0AEA56CC42E30FD +DF24FEA95C859905D140824AEB9FFE0A7791C50B22E8E158989FAE39A43D14E1 +BD1617E8F13FDE3BDD86015BEC64003E1D634F3DB00520FF465705B55C18F64A +695739ADE2508BB69D539CAB9101F955D15BA475043848600BBCB00FE0A2A53C +C5B5C98B2B0996D3DCAE394BDB1284A6B716D23AD0714E05AD6F4C749DFE7351 +A9DA7F1EE6A630FEAA7ED2BADBD4779E7715B866EF5CD6D17A79674F3F185A19 +EC9BC0480AE6FBD2DD06F3DB4D234F938A4FB5F61FCD5E23B151E89B610556CD +C649D036DA38897E2603E9E2A5E16116D8484A0D810FABD973AB649646769A11 +534B6C8AD5CA5BC5A38D4236DE32F33F47132143AF460828E7AA912911E899A0 +1F3C85D501D3C8136AF692B3832412113F57F5B498D06E8BC475D6FFD7DBD416 +5033544CC77111B564F7B21465B2BC0429162BA4FD49C7A7A7A36F646BCDECB5 +01E63158A6DB744B925977154927F97628D61221A64F6DF5FD63771F4A76A4ED +D0CBF03C2AEBE2B364298D7D8A4089EAAA7DF9CD4D0632E38525D0E59F037188 +BA436DEBB3D050B7D214B21AD842DE28E6D46D273F6413FB2B9A508639FC3EAE +21B2F659568474C617900CEFBB5243D7496F73E0EE7F4A3A0343746E7B189A7A +B1B3974DEE82543797BBB3D093DABCEF39C27CE8AB728CC971CEEFB76A24EDCA +564A31C80052563EA4E9F5308F070FC807CA062E26F2D72AF06069F50B1EF911 +97C8873EBACD1D974C8BD85D586DDE8E621F41648BB24DFC3BACD74FAB79EE9E +1DBE30BA8C1671125E5940927893B2790F7760631A34DBE6CD348E5605B5CEB9 +ACF9EF7A627CBA5DB5E899BD414506329E46F0B9848F730E36553F2A35AE992D +42D7AE4DA66E75CDD23CAD56D4C51176924D5BE94C2A974BB46E1058454FDF5C +7EBDA1632EDD353FFFF7525193286A9AF6145E102979CFEE99D9FB3CB1FC2EB2 +570476B11EA9A19A434801D58F4318D8414439922D89E568D6E83A57FD76802D +C0D30431821B145BBFD0126F2AB0161F103DC8F2A874238870740AD3B8954262 +55475C3BC6B1EC0E77BA8B1CBB176A8959AAF99A2969C4E0A3214D0627D7CE92 +A0D7EFE8E39CD42CC31263968ABDD978F3108C8D2F70B6E386198088209826E9 +6C31F1325BBFF8FD0E4A59327049FDA978C9CDE7D79E565E1BBEC909F8EBB12C +6BF8505890855BBBFCEE7265519875954B9F44FB1A024C28A734BA1A03AF3A3A +64CD95D8884B321A43F1041E38FCE81A6B2563C2CBADB04F4036B0208B863FA6 +9E88D301B364AF0F99CA28E1D023539158B7CCC48D092CBE1167817B113436B0 +7AC9BD5B0382F02EB8C8BF99E2F463994CC60A09BEA9A64E8D2CBD966140F4AB +F361D62845F72FAB9A107059C96E70DC1E2469EEDA1FAE3982A64BC300C9E81E +A98B34D8DAEF36B9E1F55E3F5697EF6F029E650D480D210014C8F18647EC2356 +8EDE0B22E54524F04BE37DF85FA61E3377A08E57E03B14554FDB1B40F07F2E86 +259E818A7732150B01A71181EA18AF4032E1BEE9A4532B26B9C8C063396DB817 +1A1E25A731C10F8B31A84393E9ECB4F279C884C29A5E596E08D144D081C4B7D8 +CF46E43E35EF09F56892E322D345FB7BCBDC665FFC924AD4EC638AF0959D931D +33A54E0062C68EC1852047D73E8715D5A6E11F62837DFCE1617608CDE2C753BC +B1CE0C4C1B151CF1FF1A4830F7484B8B1134617F6B1B60CD54B3623E518CBCF2 +95C49DD546E783F884D38B86022865E8B57139637516EFAB9DC8043A4A8EE1BE +623EDD5DAF585F5F3A9EB96E6A51C18E0B3793AA94B6301C3473C58B11B9322E +F90BFE890466EB6EC6A1138CD2AE2398EB1AB8749FADD587C711E18AB171A149 +D262A8EA2A462C4B0AD1A00C53F7C3D3D1C9CE8FBB95A7653113D387ED03573C +6AE045A7190E794571972FD93DBB5BB1475EB2F946795C131C1572F187F1E6DD +438DC64EC74AFB6B730830D835642F1456E76C3327850B745C38ABADF4E742EC +17B3293D8C64E041EDC5750FF5552C333DF29FF5AAEF6214463FCC682254BAAE +84C0C71D4ECBF232AC4A4DC563C819BF966C37993F2754077385DDEFCE85C532 +95B2F6FAC17A557DA24669B61997BE8D589CF50BA27FEDD9E76A19A96D1D48EE +4A4D2905E97F89E6C08F25172E511F66E04233648C85F00F219DB234C3FF33C1 +3A75ACEDA696AD9D778666C706246428F6B0BB75F812A4C16A689C9733B0D105 +71F948225DE8A512B7B94298D38555F9486E4496389426C896BDA10B71A25D12 +E984AF2EC3F78613269F85BBC185013872B1572A799506137E9A6A271683B7C5 +4590BC0FAC02DE3E0C9AED49C5CA0E26507DF36C2574C1FF73BFCEBCD4597632 +810D07BA9A666A07A099C06E0639283F42E7EFB3FF8DC79F7B2962967107F5CE +41CF3EAA45B092F2BC433BADAF57E390D5995B69F1E7806BCE13834433C891F3 +80694297260788AA2EBC3A0910CAD32B7E0B3E5101B5164BA8B0259B7DADFE9F +84A7C5DC8DB864471CB666F4148991C3530535DD7C086CCC09A768B22937D0DD +E18B1EE12E1DE6AE83F6FB9E1FB217B1D9BC2B4F8A01907A80DBB16A496B2B7B +3A00BF5CBD2BABFE145E5E49AF9C3398605DF0589EC2438A167DD38B46D52340 +2EF47C0644CE0258457F0D24FA19676191AE2540D4C98C6764B00D6917F62C01 +276D9E04BDC21E83A59CBFC7C6C252233BFD5C0C96A004B217B1E78436EB81F4 +FC2F82B70B19EAC733BB0E5B3352E4293717DFE2DE360EF780567D255AAFACC8 +432774772791DDC2BA4C250CF314D53DB0D8DB88F2B624AF4337C19F36D5557E +8CDE1B8703A5F1103BEF1E83A8327F7DEF9431953A9C814D067EA660252BD0C3 +BD0423DA5EDA7EE5AAEACD32ADB758D3697110DC41B6F67CC19F7435BB9EDE00 +51B5D7D941F01872ED0EDBD0E012DB3715BA84F06AD9A7CB13221290ECC5D98C +167209DB56A38C8961533D3CE2897063DC915F84BDA4095703477FEAF6720F09 +A70F352C574CBB342C3E69EE05242DBFF4BC8B673216206B6BFBC5FDC3F79216 +F44F8E2AADC0172794192CB17A696979CD4F7264268D1CABF9F8464AE0DF3FE9 +A8729F8B6AA0B493CE015BF1BD950E9D89FD9473215AD7513157CB46BD410FB4 +E130B2CAC097335F9C546FC6F678A0C8351A9424E981F316D7452846DDA58384 +5ED585947C87D1E1271E7ADB72085C960D9BBD3BDE3321BEE52132A62A57466A +F6BF8B639C9E5B3E57461ED4671283236D09F7C26F35EFB6D363417E24684C83 +C758B9AC5FBF012EEA6E69F5CAB55BFDA10B062E6D439FFCA550E7BAA1019636 +C5113FE61ABFF64F29118024063A4359D114E21D80190E293B80AB32BDBA340B +065DACA9553BC4C0F1FEB1F16E073937B11413C5599C058579543DD1A350F69C +0C66EF2D800F790222CFA1AC0745652238BC471FD4DED46ADA6226BD83089FE1 +91C7909A2FE12F5F4FB0D41341FF86465D4539A227E782E1FFB9652E853F65D3 +04D9203D4C9A93ACF81DD54FE0A4ADF2E839C997FC49927B92A99616BD77CEF9 +C77266204AF4219EA4D4EF5D974D4993EBD3FFDFF0B5D7AB0CF13279577C58DE +726476A0C291CB406A8D5DB1A631D404FA202AFD525B54041EE4FCF4DD94B326 +40511F36C2958FDB83DFBC22D6CFECF5415FEAC44C6529AAFE85212E9F030844 +DE707696B057D6AC50EF053F5BD88DDDB9552CD9F42AE29CFEA52065F06AE1BC +3F1D7B12B2346AB2EBB9024294ECD82B148D17D1CACED60D2BD5EC91447CFA12 +9479FBFB279ABDBF2FAA8760A54708E65EE4B3CBE671447A8DDFE9C51881A47A +83D5DF96FEE8EABCE230209E6A5208D1FB109D1B49BD2E9278C6603FA82DC102 +CAA038525870995634541931A77177BBF80BCFE9C12EC321FBCEFB916653F349 +244B6DA93CE590D48C6DC0D673299A47621E8397E0BCB164ED6D4CD605570CD0 +AF46D0FDD920181A58A1F2236D7AE126F07723445AA36179531633F8647F88D6 +3494299041A1B7818A7B62B8B8783B97E7C8F5FA7E65987EEE8C87DF23C0B09D +8E84BEA5B8613F0C144EE32E58C837B0A2037F51B467083EC9FDA57FD8FE5E72 +89455DD56A17275637E21AF50EBE5EB9D573F2D834B0BFC0CFD414D569D4AFC3 +C71219F52DA9A1A73CDAADA94EEABD9B14D42421A562065DF9EFF2784F1F40D2 +AF44CC68901213F1E6FD68CAE79898785FA3FC317F5D402A6697F6E52FEF977D +1C962966D0E44C714B15BC9B613A680B054D6B64B974AD0CD6C4BA7D255E49FD +D881755B15859CBF57EAE82406FFE8453AEC2F07C9D17A8C4D3A52B6D4259CEC +604DBE8177A6C3A96BE29FB309773A1B1472529C21FAAFB3AF407978B250353D +490CC9BA66416E522E200F5BAF87A3AEA2A556021354D7B74A9AB3CC0955A5AE +2B462ABC670F327CCB53C939E0586DA606EB7C2DF1C9692FA4CAC3078A250F10 +1A73EAC268EF45F1C3369758E1448600234477C85FB11770D17C36A66CCC5413 +544AADFE34E62102F2528407ABCF5775AC6308C7E3395F9F31976A7C0CA9A95E +30A5CBB8DE888F8C81B8F9B1A2BCC36A89E0E75B2F0B19EB4145C9CF0917518C +0EEC1D6B3CCF7DB0EC6354B75B9C54951796C825D9D8110F17BAEE6F4713ED36 +07BFEF64033F1B1E684C6F7D41AC91E8404D46577FF16E2851D3436770FDCB17 +B53D05F1F49C5B6DE9CCAA2B11F5470537C5C80353C62346058110C084C804DF +7A0B9134752E93B76F54A7A573FA95D6175319FF47496E608241D2E33E51030E +B79B9E4838DDB48A81DC4DE9492662F91C5308925214E2C226B28D8264F96E16 +4A49B248594E8053F86234651DE05A0188E26BC3D2CB7116DADBBC4DF98312B6 +8950C20F99AA330B1F011370CB0E50111CA1CE3773ECE6446742DF74432A38B4 +800DB338C4ED84E75506CB8E601B345BF60BA8B49710AC9765B33470A85FBD2D +BB0D2000FF9C0EB524F44AB6A0ACE74EDA1D46317CB2BD488B621FC237CBDB03 +B23A450B64BAB89B60FE976160E5BB90642C647A0FD609B2A6DE281A9978ABEE +0CD7D99F087274C3AC641CBACBB0E128CC29E141F022E4A404BB25F7FD57B58D +582D176EAADDAE7E3385A93375C8B37D11924AAF00565EF7E53C117F10EEA3A8 +24D6DAEF6766D9BD9429C84448D9F1890BEC8FE63513E5690426F85655741096 +D2DF9DEE68530E79B08CFF9C53B280581C6FE3C5C5C8D54C54705F12B1CC6C14 +7606153AD79BB94473AEE5056ED3974B71FF5D3AFD68AB651A94ADA4F84C58DC +42F3E29D3B7423C72DDE240542F038B338D888910E27B4F55F40F11B654B4BE8 +A196AC89067CD52DEBC77E0C4CB4B387D4D7DA79FDEC55AD017E62AECF4A69AE +F04A2CD3F7F897A50FB1ED048B117A1BED63E07A0B9645EF7CD6B91FECEB75B2 +3E4C48C9F82300F8C100972F29F0C132F3F802128B3C28DB8C0C557E0C18B0F8 +F6F3085E1300FA06B9C360681B8B5083079B79BBFD9E8E82D160E8208A3940A5 +553ECD27B328EA8425A53EC26CA31D86D486D9EC8BDDDCCBA4421B050CBFF54A +7CA93679FDD917E46A288060E42FDB60BCB784FF90045821410FDD246DE7F240 +8E4E5F9EE7A97945D959936D692C5345AAABEE0E739C8BEBA85316649DB457C4 +308CFA1AA2D107AFF0EDB39DB5208C4F6FDF48B053A1D7F89C473A158A031213 +80B96B47905A4FF806CCA81002C3976A4ED1849382ACA1BC62940D2F2B5423D8 +FC67B48D387B440A04C2051BB75B24B4C15F6B0665988427F23A3CBD576436CA +4656A035E9CE18B233FFC11FFC35A88367DC48D61512CD052824B2272A92304B +5D04D414022E16FE3A86B047194B7A0A29DA9E2111A575ED97405E78DE606058 +24E00909DA25E9F50E335128969455E6D3610F129C46501917A352E5F34C5C30 +8B5E67B07E4E6886E909FE8DBDFB2DDC0D3DB1F4978326A50ADE74998840F3B1 +5E82C51F00454B57DE06854A58A38D34B5B7197F46CB9AFAF975198C7821029E +4CE991BFBCA3115EB5131414640292341979F90CE55FE7D737BAADBBEFE37D14 +F17C8D795A06F04883E3207A1E72AD520B22DCD826B676463DF341E365C3E95F +58CC0C17FF5E13DA0CAE7601D5C09D0F5E5A06BB0452D26D3399AA084D88D2C2 +AC9DB9261BDAA3699EC899459996E26EF30C36B636B18E5532DEFE9EE1157949 +D719550715D577C1C541EADAB9564D2A5A8EB242014C65764002DE9D1368A3A6 +F7C2B52411EC39477E94FBD8E022F9B3392097953BE4F90F6098CF819CF2272E +5D4A4C202550F1DB1D98A097FB8C1B1636C2E90C8E903CBC9461066D6D4F9694 +C8D0452C4AF2EE38513434633ADB80E1CEE43F90DB31DD3402A9A8F79F9E4C6D +4CD4F5F4B8256B973923766DDDB1241E963F456273A768608B41B160472512FC +5F708B6862C97AC5722799EE650D6B94A9CC66483FD6BBF17282C1EF506A3034 +7751B8CBE2494884659CB9B9E71126D50F2F771358C7ED0038C67721E4DE280A +91174C08D3D1CD9CB02D52EF619EA3BCA6304A8C64D277BB7679A0E13E12BC26 +5E251DA7E103F7E82436FA55F5CEAA984B0920B415D919AE9698458E336FB257 +2E4A4341A2B26C69FBCBEEC84E608777CFEC5C099C912B638037C7F47828F5E1 +D47957FBBFE87A5A7B5454435510D5A79B769EEF11199C6A81E64D7C84AF6E42 +80C3185BDB0353584EDBB0B8691505CA9B69321DB43B9DF3F19E0A509EDB55BC +0D1BC93EEDA436AC29C087835CB7DA098813889261C2591DE2C20672A9260E6C +F7AD215E722505889A98A0FA33D9C3939B5FABEB8598F413A47632A029D99E6D +1E40079A737A6EEE0D5DCE9776746448B4DDBC1DB82075FF8370512BC31F992D +0C1865E1EB7B4A3234EBFA45B5DFD2803770063E06F54D07DCC059022A2F5793 +2A87A7E516B7B69099328F1274B491261FA9118F4305814AEC9154C48C2E6E63 +96C5E315056B50F5FAEF68B76EAF217AF680340A8FC7F91B83D79103E1B168C7 +6D90577D2E151338A287A5D8F6D45D21EB07D98D1445157EF9A970858E80ADA6 +30F63B956FD01971FA9FE829E99D8F460616C4462215CA40B7BDDAAA74EF9CD2 +20E86A2234C836201A7A53E511DB8C7DC430CBE22BD1F93E9010C27957A20FC4 +714981CFE0EB619D9A84E1B8A1985D5B638FC686FC8738CF790D91D97741A74A +FB39448D99ECB58E7A7A5C061DEB0EA250BD616FB538CE3F332E455860536EA9 +7F59962BEC3D23EC294302604305C544616D3245EF904D6A62517BF85BA33090 +E68D5AD9D974C7A97CC63470138DAD63DA0FFCF87FF4476EAF26DD7C1D89B330 +9D11B5E451B73F5F6D254939EECBBBC90596EF0EBAC7D2F6A423F44026DEC23F +70356D47F2911351B9FFA5D17B8A5D3100BD020FF83FEBF040FDB8E179C74105 +376613C15F5BDA64F18E162CF868DA0862F89883CC6822B266C1EDC84A2A5A76 +EDE519E849C2794B5975E968CE9001D823F33FD56E14E857D1DD6C5490EB678D +80B66AC404AF5C25C00DE8FD8B811F68019A325BD008FF2758CDD0CCBC65979E +2B8F2CEDA715EEC6EF000AB97CF24F5021F0529C8E52DA2B05278E9391D0E164 +DAC055D267FD3403237FF9BE4D30660E192DC8AA46EDEC4230AACA029C99651F +DA02296C4A7F48D3FA14A66A46D3B2C4EFC585B4638DCA012505A09F6DA59875 +3C418609DCCF6EF10336093B10BAAFEC6447D8820F7F1D2BF8A1692D3876C8CD +2152617F95BE5E507C9FD85B65CCC9716157E15E9A9A163C95A615981F67FB83 +B9A30F47E660766CDAB3D2FB5D4B32CC38B1EB62F4B0E3977EA0CEEC21391C6B +602EDD051F432F219FC7EA421597F67D09B713DB13061DAB18219213F340E5A3 +CFDDA5A71F5FC87E6AE0DF373C0F4B38CCC8A69844740E63E17E526B32718E4B +E1678F5B1EB02F35ACD314962D7D0111369142F1F318CC5CB72D21A1749F3C80 +744A126E6FC8875FF8AAC49573E9D28CBF5EEE5EF984507F01F5B56C6B2B9012 +F5C2D8C85BD09F8548D24095B691888C39ECDF6C1961DFFD56FB055ED7C620CE +3E680603440A9368C457C95E340130B86737C1BAB1DFB2DCBD14A87FD61359AD +F633434879EFD38A7DFDC11F935AA0271875377A39346F4809792D75D3D1A036 +DBE9C6E0F4BA355EC58E46A7C85241D72D3CA87B2E5BDEAB24BE6E087CBDA69C +F5507560D13D13510640742CB19FDB451C2A313D3FBC571CA74E48D20FF8C998 +C30E56C2142EEF490F5F88F694708AE7251AB61FC5A55FB1BF6D975F750124AC +21CECC1B8A9175BB8FF8EFC8DA34C873E5C3ADCFB3AFA3EDEB4A4BAD75CF63D8 +4FF86FEFCDB51FF7B8887E5C2E4DE36201AADAB8BA2671F2F7154A157D1C9700 +7528B1B9509C36428E277BF37A097A281F2D9ABE1AF16328505A265A4F2B8F9A +E0D8F6F391785358835D5D382FBB2BCF5839D78EBD49A104ACCA215C17877E59 +B438ADC652A2130F5E79D4441BFBC63CA8AE9D6730FCAEF12C92FCF1061D0E24 +83FC035789A10DA0FA865CDDCDDFF7749D0723115D869E6DF100057E2EFEC85E +1BE6C671205128371FA4D39465FE54343BC195498F3EEDBCE65B913E9A45F96B +5591241EA325970EB5F2CC9791B632F057482F8E1309D3A20A52C2398BC96673 +8D6F30BB78E4F55FF4339CDCAFA8C47A4DBE00CC0A3548B1CACE66925427B900 +1E6ADAAB861EE413B225C26DDC765B1EC7DDD718CA0AA0E7E0B92A4F11435E7A +BF6F106538B016EC5C713774BC3D71663029E0AD2D02674AAA26A91A6D048D2C +8380645767CBFA882FFB0F62B5452AB47953C35DA3CD6F178B5006DE79D5CFDB +7CB628E29C3BA71674D35F346488892F0C1FD53B47B8613BCD6FD8EA73BACBFA +15C85653D4DAC9924A324423C92638D93E2C9DB9289271F7DEFFC67C5CF3DBD4 +DB5997D9356A4086B5D2041EA33C78EB7A4B8271840614E5D9021448C93CCA50 +85EFFCECB75F30B1466869558851A9190EF43F6C25EA419F02D0B4A571C62454 +2B5AF2D07841904716A18AED7F49DC7649704FB5D3154D1BEFE2E47073D9D2CF +40D1D6EA1D0806ABEEE7803DEDBB65F30E69E0EA7838BAD0E878A86359529A8D +716C6123D5BE99ED71A47CF92D27EF42F8BE0828261054C62565CF6DE988943D +0E653E4A4E2EB84AC004FFCFDA56E5444E36B1BDF8021DAD38D68975F68B96C6 +AC7DF86DFA8B06E85669487FF3066DF334BC3F7C7A0A7B728653D333C901367C +9434E3517D782B7DCC366E5D1217790F14C87839E0F820A7073E8E7ED430B6D6 +50FF6E60F50E6B4931ADF0B9C796D47CB44C9B8497D7AEFE83DF411DEDEE59F3 +3D9D24C893DC7C9727691818D856A9974422AF79A32AEEE7F84EDE5FDB53F405 +0C4CF8D19DE038DCBAA6B67621BE99979BC8D08801682CE7A6BAF9AA0920641E +19F99686191AAD34B84C6497D7035DBD189A5D868721EB92EC73D62DFB0E272D +6C9F5048E0AD5AA1E8DEE499ABA2F8D891E5EB8BA3BFFA54DABF3B16E439FC34 +2AF610DA9801FD977A102A136DCD03342ECC66E68B983E344ECABDF95387D7A2 +C0F749E5C9F5D71AB50B9AE441D7053332CDAFEC4E57FC1AFC794EB367307AB5 +750CB771BA33C8591D4CE3D0E8C4C841E3FCA230602B4609F13433CDD4D0815F +7059BE698C1F4DE0D0297AB43C3C0B6417CD6DA5629BB857F4475DC30267D831 +01417146B0C1C7DCF877E445FA50C2CC5A433EAA684798E2EDD76EF9BCCC978B +1A6473F2306C17A6B92A53835E2F6C64AC1D129644EA310A920E420266CE2648 +E3DC281BD364B5C3EA9933EC57E55FC1AC534FB4932C1764D84458F8B14A9D18 +3E99ED71B7D67CC839E9FB4747D7E15EFF60EE9026598D7FFD39CDFC634F6543 +4D538D4A33A5C563FAE46EDC8A7D4F7B62BF7538694CF5BD427E01E60CCE30B0 +50F2890260F7B8B82EE310C5E20E1D02310B36B76864983A187BC6FDDE8B1617 +F64C971F69761AF5C6CC550DBF3C80E69BE8B2AC311B727AD651665EE53F9350 +D472E4CFA202E95CD72AEBFED28F411F9B7DC4C2F7F9FD501B214E9950EC3F7C +684BC28D0A8272A769209EFD48ECF6A633511388F5738FF97B84B7230C78E9C1 +C76804160BF038CFAC465E3F5ACA33E2CE853F0191415EA84072F9E44AB09715 +950013A33EF8E0EC7A9A7B7C10BE0DFC17082ECDD1C3D6E108F098623008F3D1 +6E926ECFFD1A0743FD695D52008925B0B031C14AB64FF996FF6128DC781FDBD6 +ED3C9B0E80E49B36B3C4812E9EE63A70C689172C65687BB83BA8E7916772A06A +D972087B74718FECD5E32CC04FA76B57915DC0827C9D387344E72CB20E373325 +66037392EF2D1E9B7AB58609145AF02EF435A2EAE82C06F29B8E736F081D4FF1 +992BB239C627BD9CEAD20D82B9675B70AB6603E4F932B3AC9281DF73F2F40F52 +C2FC6951D6EAFEDF7F02BB70E1B5684665DC0AA3627AF05FAF58031D6643D0CE +A54F11E2D07CDFC9DEF212ECB685522C9D6F6D6290D59677AA606313D0F44812 +7A4A7E1E2C992286184CE893B4A89FC32BAB2320BC3961EE4B49E9351C2B28E7 +0B28A837FFCF09E2F6054902C0BBACE191453FF48D6D0B0190BC3BDBE365846E +D2A8039ACB5D9673C50C0AA82BC0FDC339FAF8CB61DD5E0BF5F18B9F979E3442 +4CB364E6D9AE720DAEFFE1A862C0A68EDABB17C4E43278B4A4C98C08D975F62C +31836B3EF8912D40F1D211ECD3FF967EB36F332E3D8D7F7C98D7B4A57B373418 +C5732B949E391CC6B7C456E72E6ADEC949E603814467DA7D2AEBFA32EEB1A039 +ED79359CBB060DFC9782B28B7481B356CE2B39605EC6658971360EED1C72A524 +A95FCF684A44781D103CCA8B11D4390524D1201B68527E60EE2CEBBB3CD45E74 +9468E5A73EFF365C05EF520230A52BA4FD53405D08752D01613029D77EF2A7A2 +05F79644E955660CCAA3F2CA5E58ED822F24E73970C92562F3AE99FBFB7270AD +D588318B44A214CC4DA5CA6CFAAA3F70FCBBA7F0B40767495A2F19599F8C4DA5 +A055EE9BD280F09E693A3B196A37628AC7115190CBFA9CE5FE51B5BCCCF86DD7 +3B2BCD92FE8F51246D0CB193661F197F9D731A3B719D87853D1BD267A16C391A +9D4F1E8C16818DCE0D24F7213E3A140C07F66E465BD7C1DDF762F48633464D42 +7B8529FE6968B378DD6140FD636185E1C58C4AD8FC5FDA1F5D1ECD76E81B2515 +F29BD82DE369208FC9EA8ECA3704CAE5944CBC74FE076852658F237F3AF02D43 +9E11DC17C900E66910009893C751E74E3BA60B95605DA55CB9ED4EE060A34859 +7D0DBB5021C15E596361346E07833987845FD9AAB8FE403C9455C21B4947B978 +00840CD11857A4979208E2DFF63E5EC4D9435E297CB1EFB5E022EB30FD1C9508 +C26D1135B157259FC7E6B53094F4EB7E50BD21979F428CA996B438D88E02BAFC +D1C2DD524879A76FB96C515F18DD3BD49A9BCB9B6D5BED899757BE7E748D842A +61B916DF86CC3CA1431A9D3B6F048BBF4F348A70E03EECCE83961F7675CD8821 +9241C0DA67E5BEC09EBC3A4A16DBF7F42FF35D7BD3EC21B52FAA4D1F6A446721 +6F9D2C770CFD004E830CF11BEAA35FECEBE878B85A3A0D13C5EF7FA6999DE090 +3CA1A7C149AA66CEE6AB31E3F376AA4D3CBAC14BC612D5DEC98121D32BBCA0B0 +97BD77384E215A3011EFCDA2E24B2866C0CBE8A3FA646CC1D40F519D62A7B6A1 +10A442599852F9352221219EEC7873DE48F0105F95AA4BBECEAAFF33F94BAEA4 +B90C5A44943E4B9502598D260476DA762FD3F69CF92CB3FFEEBDCC3A333CFD31 +F5893F591CDF7A14412C7B6B24FC6451BDAFA0B88AFE3BC385D30C9459BACD7A +4A50AEED28243A668562956006624E4F557E942212DCB86B114C5F88A1064CAA +FCF7FDBFBF62609E114E9E1AD40AB62F6D638D866F278860E3F89A4987CDB130 +2704A70DB8C42D1CD9BD22A1494B52ED3B71761E459C30492601ED712A9A1751 +CE57443CCCD28E6116BCBCD227C50437AC7812E7AA9166AE6C0078B7695B4853 +4880007783A978B75D2DA6CC7FD83B1E7B07D55078CFFA0312FBA9062B6DEE2F +B1093B47682FB325F3EDCFC428D3D56DE67101CEAF945ABB8BEC9A9B223C092B +A322E0F0319495EF5A6B8F5538CF76C538D5D57E8D05945412B55720ABAB2CD0 +14FAF4DEF7793100A21715F4AFD7B9A2EF18A633F5767DE967E03954A7052057 +E0928F7A8115C2971DE3B14FD72DD75665525EC2DBFEDBB3153B7CD0B7BE1E5E +A74148D557436C3F3780C8DAE74A715A41FCF50B069E45D3451BEDDE480F3689 +0E48EE9A64D35252B51672021805C0D7D76772470D28616B7E760DBD09C52A82 +D83AA682F189222CA3A01889E016BA4854B1ACF2121ACE59DAECEA323F9CCC34 +5644FCA6B0537595851B12A3C1E159D5CC40E9B632A941EE0AFA50CFF3E26575 +A3B799D850DE384D1BCF84AD581E30B0EFAC66EB8F4FE9DCACA0403F2F42BABB +C6E30BD7ED53FCDD893606CA9F41EBD95509EA1448F8BF76BA545B3AADBA02F8 +9591452EB3310AC78FD5F86BFF400475F9680452976D717374C62B2AEF3B6115 +53885C26E4E2B35C58847F36B825CEB631C11109E5E9EBC52918DE2A9DA5F3F4 +D2350E2A69897FF8E4D148B2F554F22B95EED13BB4CFF88DAF7CB8EFC08C4D0B +1A4DE99652B29BDA1AD6C58FE3626A1D31D0FB3234695835C33EDFA37584CA48 +5813347EFC28237649F5A29775D2681CF949130F93BDCD16B759B44EC210F457 +E09F25FB0368E4D98209EAC333EE2159612984F18B8F06DC1F7E89F2239CD7B4 +43FAC95CB2EC0881218DD3AB689168AB4EE907E09490DF361A1BC1C978C7C79D +6FED7176C2B72C3F7D64B01E635C404C6CEEA25FBAE5B5669B5D089B562B1408 +D5FFAFE3C1C653A55D6F1F6EB4EBA1A56F8E255C15B41C6992E070B1DBE872E8 +202F7163E36C72AC78DD56CE8239BF3198293006BBAA89707D90E4C729D774EE +165DB7FF5988125094175A7196939017EFE1A2DF1ED89EEC5309790AA50ED3AA +1B310BD333BF2970CFA038C3DB87BE39CB6BDA17706D5508C26C9F8B4FFECDD4 +43E098165E0D0635FA8A54C2776C655113E27FE1641E1738B13873BCDAB2D922 +85698D571A6EB65A8F33B3AE27DD12C05F08B57E307A7B55561805C0EC855E44 +99B73DD02A6F95156A9AE5C64B677DE5339D97F19F4BD75D4A1251DF34EA169F +5E5EF8C7B7D1043BF75E80212D05B3C3A9161F68FCA385C1D8553E299F9E2DC4 +EC56F08ABA3B8F692A477595AFC231A319410B97C5A34ACA08133BB3B5E7D449 +63DBCE7A0404711C7CDB14BEBF3405F1AADBD8FE13D8423D5521E11766EDA4FB +8D751F78D4E012237C0F90B6F8FA1E42EA550FE5BD856DB4CE9F84908DD27B0D +452373A9CC8CC6267A6C8B8D5B253A7F930DE0A861540CD3D6C5B68B817DCDC0 +11074810779B2E243C444DD60FA0E165B662FFB16418DFC1E476BD40549C09DD +EFAA9752533B315BBC5072A3671C294126A8D4DE746CB0C61499577D3AA047F1 +28ABACCF06BC80D32B76D83C4E4EA743D61BB4D8F6309C5BB8320CAE0D0E84F0 +F5E407311074CA8260A32D676B3015DFFD9442D9F3F5E55C06982B3E359D2608 +8F918A354373C5F8209CD51BB8AEC4786D2591108D6EA01C0CD335FF3D007184 +F056535B30DA59FD9916531C9AE0EE69F9851784E3D79DDF5502D878FC92B08D +D94F0538670EE8273F0AFCC92CA9B34BC71F06080DFD08DD0BEA5FBB4918DA94 +1AF17468F57970A007EDC44E7D095C66E6325A9C55BDCB1E4F0D003BE568DFCB +D49D0C91EE3DC0514CBA3707408B35428689AFFFE60EC051CDCD04F8DDE96BF3 +37DB8DA3AF0587D4E1F7AB4DB221EFA93094BF7C8BA71C66D41A850C873EFC6E +2B0FFDCE7524BBFE592D7C5FC27856125209A19CABD8390E436188984B982E84 +EB38C95514C5DD830ED54908C08B5076E174DB8B3A739780B96C085245AB077E +83734DBAD19AB141ADB004B4B2A83A579B60EF3DB586F18DE7636692956290F7 +2DF3027C7E083EE457D4AE6CC35E11C90405304D9B74E0455E0DC2ED84D3223A +476C7442336595FDE7F1D9CBD3B108EFA3F5BAA7C3B03FA2AD9D0BC7AA2C0160 +4DD87E2DB156E11F0410C59556A50A989ED90F37A167349B9971DCEE6F840117 +7A985EA44452A62A69F2406F0E0D781B7D52575171190D42F2156C67BF68F828 +1947A1E79ABE287D6A19C2A2003891AE956BBF4F18012385B249354093DC1692 +8D7B068CF6B371CDCDC742A20AAA4CA6DC052CDD2A1A3292352AF976270951AA +7BDA8D6A408A761E73271A77E4A6C299161FF3E2292F77E8D319F5A39041741C +FAE69BD1855A2DBA7CF238F0E0F3E1AC707A420D40ACF1AF5D79D268A01106D2 +27AEB0E25D265EF85B6C4715F8B2169B191FA5666C369C3DE090D352DF99FCB2 +A359992F5379F796992C77C4648B74D2BCFB70D2CB88644E6773B17385767C53 +63A897E259DD25D1DEC1B917270E9C2B90432343A02F62A3E864019EA3E48350 +482ADE56458C646DC3213CED67C35798718467536C417EE7ECDE3D968E5E6E80 +00BC3317067F615FDD4224B8A4A6F2D063799818681FBEDCEE6BF532FFC9A4C6 +22E99C5A3B6B3B8B0906E19934E7B4768E4229C9993DF93D279CC08E624D76E4 +97F5C8A68B9B0A3E20DB1F97AD62A9EFD0D94C86D5F5A50804D93680F7875E8D +CCC5D9720BDB031E76C4DE35D408282506715C928C4C7DFC1CE7B569830E8158 +C64FA2D3791CA5C5EF2FEC2D0E7CAD0F72C15FBFE175C3BF768A011AFC3FAE97 +77F15B35F618B040B5DC4A6D952C947C93BFA3A49CD7660548F0CB67E1B7EBFD +B02F89B429212C589DCC26E8D0A862F978743FE67E6E3CD80E9EE36023A90F9C +6EF66BDF100B09613E6903BD7BB4893757F772842C8E71E01529740A453A5FF3 +EEA0FC407143610F244547C5EC06F18182014EBC167667B1C3469C5E36674DBB +CD9822914244A3FEE18C6B145EE60C806DDAE13A827B1BFF9DA3C5D7219689C8 +4F425601F01CB9E15D67395A0D571B3B189818822E6CD0537C661DFAA8852E56 +1DC02616F2CF080976E48997C2115D1BDF863473D7B76953CA6B52F23F7464BE +50CE2C9875882D265A9DD514E41F3CF44009F5B71E1F52D09261D95C025F1D51 +924891EBC45A09E1360D062CBD2E65DBBDC8BC92A7C3BF8FE1CC570AB7CC1691 +129650C975F1EF024D54FC934371E605C47E06803D85915B582E86A3940618F0 +6FFFF72D7369C2CBE7A2A5A1E2DF9373BD3C2D76AB12EDD4F11291781DAE2F6C +E0601144B6E3AF22F5723403303887F1A4EB9EC17A3A0AD2D020EF2FCEEFFA9D +EDE73E93B6714CB34307B11763A1B833E0783F918F72C508C529D76CBC4F0AD3 +EB9D86EB288648F2857D546E8FF022B5B0B039E490BE97025DACEC16D8EFC44D +3D2D45FF8395F75EBA7BA973ADB7EC73C539160DBEA3E380F875ABDA51710054 +EA6D478B39E06839C5A163BAAECD19EE086474D9EB302B818061E1E4E6FD1D12 +FF82DB6077D6D6C99309A225074E6E8E92256042E3E88FCD9409FA1E19E90047 +9697E4AE194F086908F91B8D34A649C060027CDDE154E9DEDC39D9F6AA90C217 +2DED68743609DE718C75FFDC92FCA076BE4D0865A249BC72000F94E4F1D03FF2 +7F13CB176E0DBEA521BFB4A536E8FE36639ED3EB0CEAD041DE6455138576BE7E +41AB953FC3720AC4F3512BE290A5E2D5C63132E1B0D56ADD8728CD616117EE12 +066D4E68B82BFFAF18B9DD91CB69558534CC419E600EE3E670250D0E19F2FA17 +A381077973542A10F6182FC3D0D250C24A2BC5C2E3AEDB7ED3FA858D558EE47D +FF81A4768A9A233AB11C844035ED5718497E3395F0238686BE00D975CF7ABE92 +E0C58038AA7B09DF68EF4C559ED91AF5A6E607781C7D540BA0C77D4691A475B7 +B39363B6D7CB872032C4C8E382127B0756E0B91BC6F87FBB050C630453C08493 +AC24F4BC8379CA871515C8F503BB0ED5CF55A6C7BFBC7A09E4208776603447BC +068A016CB63AF338355B44545B4D9FF234403E858D2CC43584DB031F8EE38B3C +2732293233312769A0A984ACD721FFFA24A03AA9A00CD1620FD332EA6421C40E +F4E917FCB00638E8B8FCA62228DE95CC02CDCAF8B2A43BA5950881BD7136286F +BDCE88C3BC964E268D8BC6EBA1D367EE179CFB277778F20CC21DF0DA363F73FC +A0CABEE965599A00FB9DD52C9E5EC85F598CEBFBC43C6B1A85CD6A382829FDBC +D65E57C80AF9BB8D33177C856F488A91F6C97D89105702D9E36D3CEE11657DE5 +848D08C6F777ED161CF596C2C21DF22D5CAA13E9FC2B0DA8847C63B78E9D8239 +B48EEA44A4C1D17EEF695C8ABDF5F688B0C71537BF80146CA2DBC3030CA9D942 +1BBA232834D3220B5DE5452109AE248D0F5C87F26813BFAC6A953C49C456A74F +D0840CB8E08AED6E07BFDB69AE6A4E9F8CDF872DC0D05D3CBB3EEABADD5428F3 +2A6E7C217E8BA597B225A08BAAED70C35EC9FFA8941D719B6E228C3E1BC94879 +FEFA33CA8B6941981A8E1DAF8CA642C7A6932686EB7E77BB54F4477290DE593F +2AF063542CF48F8C0D92548903DF4144CEDAC9B9A4E83824839188D0755AE284 +07DC1C008BD7102572EACA79DF2F069BD6C53818C64D855F2B8B3658BA55E78F +391BCD00E3E517B5FA7E738B10F304E917522BF4AF52AB6C799E1839C8CF45DA +28A598DE94B0F4101C5DC4FDFA8D22B53A0A9D557B8B84F8ED6B0ADAC375B837 +346130A77F0B97CC46ED60A454CA958EE065584A0E3BAFF867CB29889F60BA44 +AB61DEA85910F12CD0F297EFDEB244ACC85537514159BF2277996C674D9B22A8 +94D2A552AF8556F487B6357F59B3EFF328F675CEA434F5780C1C59E540942274 +D6852E2461EC38DF58D6173EFB3A520EA6E08A6904895097746177A1F2676225 +A229432E5A44B77909A74D1300BFBFF446AA4394524F93F4621A10AD5DC44722 +0A0F1B79AA194C275EDAC3E6016E7FD5CCE9A47A493CC0DC6922B639EBC98EDD +C906452E37193235127A6FF5F873691F98D714AF9E834004268D85CEE5D87D4B +C9CA8345487900A16AD97243BFB135AFE42A138C2FC26E7F7C2F3655797608F6 +A722BD7A87880E7F7B18E61BB5C780A62E81578C2E6EAE90468CC53C16D34888 +A41F542ABCFF5946A475CE31D631010238C03288ED5EFE6AD0A08F5698A55CE8 +6202516ABBA71A3837168DC0F3605D7B5FBB88FEEF8F62CF8014F0759912E0E2 +883134B6D916A436864BE76727743F4AF4630ADE41507AEBFCDC4BDF1B09866B +AD6C12C854E15194E756B96D2C9F986154E767F4DD73ABD97D31C0C5619B5CAC +6B8F9F709BEA5A9FE2A94B70C0B6E0DBF63F849BB253EB68F06E43513EDD6F6C +F80E10D98D348DF6F6FCDE5F0C20030A05AF703A5F4EF72F09313E7EB7450AA2 +BCC6386463FD43B51DCBBD2F585DE6AE64C8C0A58A06C26377E917EFD2477F9B +0C084ED099199C387A3176A2DCC142C8103B74275F997C4E38BEA75F25CF3594 +079939BFD5DB439C24F25E5D900353EFC3A71F9E826D8019148495B692137587 +354E52E822609639ADDA15D9C466FDD5E41A6A3BCFCE8DEBA38F3605B4E262DD +3D905D67B680F04E08208A21B7FD8ABF2D41D46BEA9F5697E32EC9701DC0F395 +B41101EC847CC82259A5F603ED6D8B311CC68D48BCCF3F88D19C2414CE01FFD4 +DAE254116363C032E274B538712310F46C2CB3E54F85D14D8FEB6751068A5785 +788CE873183B60997E0D5A0E54848383B56020F7105B5FFE278B66D7A4D075B5 +B7F02D7BA1EBDAA9EA32EA5953591DAA2A39FC9A72C364D0FC44D199BC1D035D +F5131AA54AE791A2223AA3FAF28FC36ED32F102935B728BFAAD51EDF8A379C22 +193172FD86F26ED77EED31405D2C5A964F20FE631123DD3EA41CA5EE1A6A0113 +5B6BA096FBBEB694E813C3B99672EC808A0909A9AE96A68C0B960BCDE731A49F +DF5F8AEF17D96B253E80064577DBEF7CCC237877477FD25650E26939CAFF93ED +A7354A9FB698D629CF1CEEADD41EB09048CBA593A6D2698EED63F5281ED9CEAC +4F6D8447BDAB9573AF6A69326F82A1D28C1D71B5FBC6BD0160D5D058B3368F16 +DBE9BF339018ABFE4B1462FC12B5AF34D94C47F8FD72320A2CFBB2B5C6D871D6 +630887B9022B75D603DE136AB08A3DFE989519EB471C308BF4CDCE9895092439 +190441AEE9B95D976F4017EDC3E2FAF831767543507A36A011000F889C75695B +73B38DD95EDDCFE98862142096DBD55100715BE46366D0B4C07B41BB86D33CD6 +6D069C60B2479D512CA1BDAE44760D26D1E1AFDCAA882EF6DBCCDF5C8C9C0351 +55C58985B1E558EF7BE135405B3C6F436C4B601976951BC2FC021C95530D4962 +4B1AACB5CECC35355CD348565F2FFD9726CFB074F1AC582B433D330560B72DB7 +7E1DA2E2F92E695978074DE5ACBDE9B3BA497249A6E31629FF041E8F9D1AB785 +9954E01AF3E318B983E57668D6F9A2C71CE7744BEC3FA216ECE3740D70445691 +FB86F4181B0F8DD0250A0A5FF42E07018D0F42D2C052751D942AB2ABD417A219 +15B3F393CF8567EEA0991F9C749AB79DC9CDB9972EE564AC97281018BF54C116 +F5678650A7C0408E4CABDF28B7BB84383B4DA3F3B32B54F1B01972EBBF2C540F +AB2C85B4E34106D01593D680CEE680B83E335DFC30951100DB3B2F1DDB92169F +86D88093DEF5FEF12BEDB7334DE681043A76E887121AF90AB152F6B473222355 +C088DBAC06100F32F9601C5D76C7E2EFD238C3B1F06E91471E2E31685E7296B2 +DBD18DC081E23C608BFA875F632C9C2943C10EC6BAFE59F116B1FE4474FE9B34 +F1F831767543507A36A0110017E3AF059AE3AB77A75F4AC116131CF4CDD06D1D +57A80FB17CF0608A0D00E77F7769C2278833EC936584C62BC403E92716EEAAA2 +E4264AAF7C0340E1C3BDF93090E2E9DC77541690BA2CDF850F9E1A967B3B867D +1961709D9D3D5E3D0D9013BAC0D2A581E09E7F2F4ABF073BDFDB2BD0FE1C8162 +B1A98B5AF8382481B511AE0143F87BF420EA3E4B82D4672D449371F4E1AB6165 +36583BC5A90CCE79572D8E6A3C6CA0FD46FA494765FF4351F6A773D4EEFD42B4 +A2A1A24DE128D63457808B5CAF5DF465C1E966923DCDD7E3099A8D43C3676BF1 +9E3D6B1E7D996664E063E0D51EE85CD6AA56240BBA9DCB5485888E3F7436E467 +8CA74F68060D052110401E694AF6E016184348EF4C6FFEFAA073498205527B2F +51EB6276E8B1A483ED40E46D10D775E5E9FC3A58DF4E4BF7E7692E61BE18F517 +BDD664E28E4EC5C6F53AFAFD18CB2FB7F9F4B2A47CF529F9536637875AA9FFAF +544A50B142F015EA16B9A1055B5A15F184E4F6BEEDC245455943A3DF312D7F24 +9EDE312CEC2160BC7A169D3E9E6917FE7E795BB1D3D2733F0E77B5D265BB1DE9 +4641C27B08879B89E76E0AA7DB55C373637EA09C358324C9A0522F6E26B263D7 +2022A0E788DEA549DE6A1C991A3BD85C4EA3E71C2B461BE7A9121FC09139992A +B474CF3732B8EDA9C38F903167E4DD3B35BF99893747ED95A0494141D3234970 +B9D8DAA1109F6DB5122A23C155A988FBC188C5A0E7540392C039A6E7C8553473 +7889355073080E32DD4E529DC97F6E7040C5DC37214DB4BDEE26CBF1E2E2E7F6 +A06B7D9E86C7561842B61A3E5C4B94DCCE011BCF92092A00D42B1A3B3F799F58 +11A4C8115DB64711BBA4AD932297F91739565F38A7FE08025B5CA3C479E39588 +5657AD3849A134F035FD142A263A1A68902ACFBADBC4CF3E64A10064C5EF7B5F +A8C5B11EC9199E75B83A1BF891B2DB8B180F75E942471E7090E9E78A97507941 +9798D4CA52DEB18C09E4C4B24D4FB511681732E021342BF769437EB266EABAC3 +9332C3008375CD804DBE03AB0C9B5A29475E6D8C79E61ED661819BE50AB9F1AC +81DD036968F39844EC50555A5DE8345382150B2693B607A67E0AEAF3DDD09858 +7AC8D0A3FAAF552F1B224F0BC57B967E9988845C61AA68AF74A3DD5BA00AD7EA +7BB4D503982779D7397B566EEDDA93D4E3FE0558EB8351B7F15B4BFA39351FBA +0EA54BB0FFD1D31E22E8C00BB3E642A64628C51A5CD3A4B9AA240B1E3EC4F597 +9A1090ECCA2120EBAB4132F0D81B60A1CEBDEEF87161DE49A707240A70F667CA +5E78346070629D8C4480F9FA4B5026FCB7C48A149AAF3C909A298FB39CD6778C +E1B0B400B1E2EE7576DD50E082E84BEA93FE08F884171F5A3B402C29D373CF5E +339D8988EB92A5345CD6E10B6B61FCBF51E881A1B64C40BEFAD5C72C5DA4D219 +C4F3D0B68FAD2EF1626D1659DDE8EE66FC9D7E65F8DBDA58151412B6D9524777 +F9F1657AE4CAF358AEABDF7267A724AD62B4D006C463B44221BEDA0C08CA934C +5DFB1C77B4A6A1F8A56D91B1D9192722B265E883AC45C1CEC5E176F331183B63 +F3E7D61929861372E46631FF63916BAD3D10C1111E5253878F9820DB501B0FA3 +1FD1A89C3DAD269A818B175E6E2EC61B7F7A562C0D58205A9D4471B083F9DBD2 +33D7DBDC0CDB8C464F5A1A798401A3EB50004CF735F8E8C16E6F83CE65B720BF +B15410AB8AD4A9407BBB3E7A68EAC77AEE9698E5E50DDEE6EEA0A984480417F4 +9097AE400B8999F08A7572C37F89207CD83C1BB1FADBD562096362A13E173B2F +D82D67804247D0910BF81334F2F843EBBCC0458DBE9F21D458D7F7900235F6A5 +C0B81D6E3B9C9FA25F53C714CE8BD134928E88EEA0CA70F49B8942CD33FB9BD5 +55F6F9F9B40879FF7BF41BEC25C6E676244AE10DD13676A09FAECC3FC2B62BCB +89AB7305887932C37827F4044C555E89FFDD6DFDDFE507DE5785C16EDBB13D2A +C76A294796ED347F6A6B3FD434FDE1329B37A4EEFAB85A489FB253AB54F627D4 +51401BC7B78F2FB41F43C47B33F33980C43939686392D3B1BA80063E35F07A55 +38C66B7B2CF11058CAB2EDAA16250D57C889EBB4147E963085ECDADD5CBF741C +FA9D1CA3D307758530ABBB5C2A50BDCA276808972135BE28DDF01016E7EECAA3 +E90E76DDA13906E7ABF92301C72CDB2334AEC951934AF92A594F9FEBEBAA74D5 +25DDA66DB5045BC505FD43450B489B480C9868B17D0305373271039F50D0A381 +FAF7E94DFBFCB40E3DA958514066303BBA8D0B585721C861149EDD288428DC05 +CC5252DF29CA07BDA189B9AA0E56463FBEB46F098E5F1FFEECCC14C8AB0731AE +B7AC09C515B3167691D90457F87A16D1AD02E53E3CE8CE7A199DD93C809825BC +F1D8C736EBABFD526601EF314527A827D08C987749EFDFB8D57F95D0B0A4D32B +7BBE1828EB2DF4C64C4DF2C6703BD8346F14C59A9AEB7615B3C6BB81ED09F494 +0B02C88D60F7C344CA0DD720220820CC857208B0704530AAEF522B46945461DA +1FC1A105B514ED4A35594D391DAC2A7A7DDBA6C62802EF75E7A4E21454896F5A +F42FAF1909A5EC61831E6288215D8C8BDD866C18FAE3668D39BA217567BED9F4 +5415FF5916B851FE3ADCEF9B9E2A113019436B3184884E6466FBC3F24C5ABB32 +621C0C4C793AA0BB51C4A68429A611563162457DFA45F651699F2F21994680D2 +E18AABA6115B1183D6A4F6CADE349423A4D3D83423EB59023E66023872E80D96 +D3E2658E3062E5EF5B9A90A3C4BD07442F57BFB0F4868EC9D373B5B8C72F8A4E +290A12D1B2EA158FA7EC4818E27BCB2C0DF316A9F5A9606899D73DC39E3295BC +3B342D20375451E653AC76A096F731878C0B250C5E3D1045A01ECE86C5643193 +0E309F64893EC5E5818676980BCFFB3372ADCD656B42ADA232BD1EAB9481CB85 +B738B31F0504C78A89298EB16DC08E3422516E51B871241C3D348A09576AF5A9 +A7AECB8C4D04B679187879EEE76FC1FE0810FBE6FCF7E9A51E25D02F4E30672B +9D1DE282DD2D29265F2B8339533EFD9575E2FF57B1122DB4B16D35A54F3C4908 +6CAFC314068E5C37A89E2E6BCAF8D9B1BCCA87C14F41BEDB9214B3230274F922 +3E269AE3396283032830E8870DBFAB3B01EFF41A49D360218850CBCF2772F780 +0E30166FD6992C18FF429CDDA136BD81F7CEA7AEDEE140EF20D9F6E827FDF918 +0C1FE773A147A4AD0C2C0D8E789F4387DD69CF4DDB7A5084A37C3CF6BAEDBDC3 +7DC82ABFBE44E6D45960858C46A5B061A7FF169E95C4CDC59574B36F7B410B43 +C8643EA56010192D8CAC939D95009F3DB69E782C71A0DA0F78DC73FA5F3D6BB0 +D0E05C11D401DFAC1F127860814DC9A14780577C5ED809412BFF82CA82C47E49 +0DE1E08AAACA436EB618C2094F3519DB1685D572B046A4FEA93D19EDE10CF0FE +DF2BF0C402D7BC3A9B9582EC955CC57A9377D0F7562F7991F7FEB542806DFAB9 +05F9304B0546C9D04C343418AE1204B6AC2BF6EF3DCAB00B2EFD50884B8BE2DC +7CF985258C5489A37BDD9AB727E4430A2361D6CF0CB45C80A60DF0EFC677F1BE +66CB904C11D868F88BF36D9AED9D4217A42F0D138B6943E8B42FECAD07B248CB +89B415A0D36289E1F566A4CD2DEE7C8EB9F62E8A2EB3F6016780C60C460750B7 +D599D04F3868956371D587E68063D86A673CBC9E1FD630A85F27883E2CDEE493 +D0ABFD045055F162A009CB3B29D3219CB8AA3F6E0441E189C29E0E7033240F93 +907A7FE8AA4E9CCC93B0E6E6E8EA3DAF7212659378E95DC6AFE72DE348BB9892 +DB4CE11916BF8B4ED640A9CF0E9ED09E4A133AD659AF36196A8E2BB82785C51A +A4931E36CFEBA394BDA9306F93BE42E9775B72743413D41A5656C6716013D30E +21845140AD93C540B7EB94493BC25C27BEC5F3BA459F9B57EBB9379AB42AF326 +F3004C8EB6E90661E23231B96E054D7D903E77E3C01B8BE2A05DD624B84D7876 +E09A58E75E3A14D40BE9710C87B87839DA33A74E38C40171098286EFED3A931C +A2F3921A688BB57252DE0FF714E4E6C57F50476BA3FEB5ED6EE6434F1CB9EF2D +6CC52EC6A483956E812A30C4B565A02D85EE90C1899F5CDD9210926BC142F7B1 +A19C4487B4417F94AF9783815EC2825EC7B16FC827A75C293800C70C525C1C6E +DD8A31FB7149ACE92F580CBEAADE4D8025BA127B528C88B6D511FB38AD626732 +ABCCE4176971678EA3492A168B16055065351D18576312B863B1FA566D380FB7 +A2DBF1AD881751DDBC8328B9B2E3B00EAA12136B14BAD25D2173ECCFAD1C0CCB +3954B60B4A0A93F027050A2323C8A24175BFEB0DC33F9475401A84625F30CA4A +2990ECAA3127A97CF50F995C001D5F190AAF7E1AAD3FD511E5DB04BDF3A21D97 +6763083BF896FEC43A4407571857790AFF5AFF1262814B9741F3A72C872FF129 +6953B892CE7159640FEBEBFBF790BB4017B4BDE4BE66F255D4115FB0261BD500 +90BBC4117BE9CC9FEB9F58C02F5ECFD16C402A55E16F31AF0028CB62A8825419 +8F04B7B83C6BDBD31FFFE546617B785D1CB84918226C8D15E29CB8E20EE2F706 +58E899DF355A4CDF41C7C3DCD52356B97ED4D9632A11C1F10C728D8CAFCB6A9B +F9780D00B6B3088C8542AFA3BD27BFE59FE97B1A959295AD9F3998637EC138F1 +686C00676484DD3CF97AC801F31A764C799F2F207398267508558163DB6F9401 +041BD8E9D12A194E2B9816EA4585414005264F0F475E10A452799732C04A629C +B2A6B696CB661584A092BCE0622AAEB5C8DE8753925752E8D7EC353E7D819192 +37A48D0ACC93BF59192BD92239E17A144C8FE2FDAC9F45A0FF0A784C0F33C0A1 +DFF65E2F1BBD6FCD94C4C41D49D82097191871674F926937EB84351E66D618E7 +DD0AF1E5D1F4BF5F5FB6E071F16389EABCD20AF855322775F6EF175DA0CB3525 +A0355FB8A75B2DDC429D6A3D3D14DF49E594F6132F40EE84607B21DEF33CB651 +986876CFFF7B9BFBE0A48A13A616583D41167A1AE4985DA3E295769E6833C073 +421B7A1BB12A1FB7F68E2B689C62CAC27E49ABC85400AFB47B65C347165E8287 +E051C825736965833C97C548A4DA4A5CDB970A26E5594D058A664ABD5E5FFDD8 +D4B2E46CB14A1146BD4318DCA6B934C0C0CB359A2F864314C060298DC7DB3C2E +EE7A53DEEDE3488283848C612E01A3541C006D51EAFBCDEAED5C8BF5A53F8765 +8882C233355671ACA971546F073AF5D523D6CB158BD2E52ECDE1C86A320C1D56 +5C7CA1E2C7DA1518A64D7A9946BC3CCBD4DC99ED4C06C49FCF7ACCEB3825C20B +A7FB66E20CDC7CD5B6DF85A6F9651B5A0A6AF8A7007D247E588CE3D10A659DB2 +2409C592617E844B788F8F31439A864A83F150B9180ECCCC77FCE80FD76762F9 +FE36D8622E27287C1BE29C6ACC87BAC41E303229045ADAB41339583A7E2E182A +25AEB962E2DEF3938BA4A36C1FC61694231232E0556C48E4CA6F2D8B778AA221 +C7C2C602E5BDEFA829B8042FF26F6DE8AB24C3D6AC15F08F18AC87FD5DBD10F5 +6FDA435B1844B5B5C001F812465593DE42ACCAA50107438F94B9540883D5006A +989426C0AC036D9F32221DF58D516CD07E8A62217595902DDB61C0122DA5CC53 +033484B751B448E828B3F2F5B780384E879A4AC2A0B0463CFACB6E71E64910D1 +C29D15AC53900540AF00AC76ABB9F58BCDEC17A66943978DB0FFBF26E7182F9C +51237DDF5171BC1272D2A92795FA94FBCFC990A30BB4089729DD36B34EA74298 +4CEE7B47FE85AE188CB7F01E9D976191C6A179C793CB5854ACE7105651EFFEF2 +EF8A2692CCA84735965666AAB61B7E66FAF98B03C2C91AD6BB2CAC04A25697DC +378F43BB2026ED0CBF3A95E8D43F3DEE43E2121623BD3F211D15AD7542666E4C +D1139BED9A63B41A12CCDE934DEAF7417779748B6507ACD789049D0A9A13F020 +52616D42561F9D099CA6C9C2FE5F75841BAA73F9B66B499547924103D120A9A8 +D487525A93B270DDD29CB89F48CA3794FEA61AF992B6D063EE294EA6506EAC90 +50E497D4029A2EC47970F69C3CD93871128B24DB7B64F9E1DB03D6C26848C888 +DB489E5494A272A2671FDEAAEB5467D9BE36DCAC57C1EA64B5981105D6C0CDE7 +16047600B109EC9FB61CBDED2B3A9C048F5DBCC6894A4C2788B66265AE2919D5 +FECA073894E52BD30069C895471E01C2FB1AEBA27E651ADBEE11798B8641AA4C +6ABD9FDA2FF963A342E695155472AFF17729FB6CCC8392DBDFD0704DA078F819 +39A12840DB11394E8C52B7D525F1CF6A9EC558175489B490C6CB529CC6C9AD9E +858F6C6574E5765EF040A0BC741339CC899363C897FB17552B54170C094AC439 +C633D71A0A6B07FA0E5F052CEC01B7D39972ECCF810DD236071E6F33886F1967 +5BEC9E659784790AD81F18478217BC614A09B450F9F367CA8C1319EC321304C0 +F167005B9442397C767749A0E80172A3E798778842E72C9995090ED9EE7E77A8 +B4E0B5182CBD20305D29FA42232D25CE8CF595AFDE8AD238796CAABA7A05732E +DEDC3D9611E73FB21BF48A838AE013D1DB05ABD0A8E104C793ED29C821B74B60 +7BBF7AF551643427F79E4A5D5430AD237629DC722B95DF7997D56C0AA35261F9 +059895E4915405E39187287F253D0BFC35C9221BC7BC7D1D6347AD79EB57D16F +7CD8A0F05688C5BC3DCE2833435A9617B0724C9D0AEC113719FF60498D379DF1 +EDDEDA305BB21A276068B03655C718ABCC9463672BEF5351A07A70CA909BCE6B +EC8D4FA901DACBE229ADDD6196678AB4931A4453D433BE83FF4B10781976554A +E32181301F75F423949AC99BCCAA0D5E45E2C6443EEC033DBCCA5EBC98FCC960 +4D0FE0B2AD4D63F8243ADF0C07C669433639C898B6032BEF98D61A1C712624B9 +D703992E39D06ED9903819E6E06DD069AB2E49B39C7556A9A74FB9CD4005BD93 +9571973AF75229D7427643828DA54783719E0BB7093AAF9CB43E93C70C17CE00 +4F2F2518524992ADF04A85077EA168970C035F7BAE96F1982136D215BD19ED26 +B13FE585D88B9CFD80BE1CC3C475BA976D327E06A2C9453439C498A77074A537 +9CB48921B22AF51CE96FAA8194FC00E1A3BC5EE90758A28089DE5B78A9DA79F7 +9A292B613509BE684CEBB5029E7D06B115C6357A5FF14977EEEF7C54EA07F6FD +B144024D10CD770D563B3BEADE262952B6D59260D9F9C5E4D0C0A01D3FAC32E2 +667FB0297A92CC731A30F2B6380E4BD1B5296001C5AE4AF98196CDC282F8EA91 +D79C2F7A25E3D28549EF0AAFCF9F9D25AB744EE76B62FCCCF9A2DC9EC00F4411 +AD6B2A3F7DB78DE22ADD31DA29ED3EB6105C86554605FBE0A9ADF6AF06360856 +8FEB129D9EED78D6CBCFBC65EC32D619405C62C5BB36FA30FA0AC7E38AA3A920 +A681E6368244CE4E3A850D08D5D779DB84AB1E2D2CC9AE7EB7179D01E910803E +8D156650E3A0E2BC7DD6A123E640E6C7C950F5B11DEFC114FFD19B69E0028D81 +5D71285E888DC780692E120C9FF86951A13403321B6B32189608287EBE42C9D4 +5D87D9930A80732DE39715374715AA9B5D9CF24E753110E6480C0895F87A6055 +F9BF8CDC63AA7A304F91B9919E658E3E3506CFADCDACF85AA32C2FA99BA6A40E +DAC21971342C2969C79DA65A09543D982FB7AB63EE9E016BC89C3782AF98FAE4 +F3DB22427AA0C4081BE2A3FBBE6E6B8873BC448E79C38E4ECE119CBAF49303BE +83CEBFD5ECDD39B618D87AF87D2B23D0A39E529E6FA487799979C9CA7A8E057D +00270FD2B06F5EFA066E071C7B6A2A9BAF7FF07383B73E115E6FB2BF4961B35C +C1A4CC19E872465C98C0E7EF7566232A6E519E5DAD75EDBD011EBEC366C78FD7 +C38473EA43EED26FD251482E3BE6985FF6012BC6C29DAECFEA389E34B13AF04E +EF40BE464C56A9BE7BF590DC2400B357FBE1010F848C62C3BF13A095D5CC597C +49FE5119698063A4126D2B1EB8CFCF9A60521EEE14D203C4538EC94AAA4C42F3 +CFE1266BDFAB7807874978F69764670312AB322D502BA3C577E532D388864321 +F47D4750A55010B09B39F55F76BDC353860BBEAD1DBB0DA88986D8FC0B7E6B56 +4AE8ACC638BBF965BE16F967CC3647B7BE00D06C28EB360FF58801B5C4AE5DCD +79A68AE48A36385CD539B0682551D1D7C9B35DA190991341443F3846F6A4E957 +9CB8B3CB47A432906010CA28F18DBA32A8C6425DAB7723843421C0524AA1542D +7B23D36CC397AEF3C65D5A18B423B42E834ACA21BA92B5CC7E3B64BDB23C87F7 +2FD8B0D0BBB84A14DAE53C0582C35863FF8F372FE09DD1C1433F20DC53B0C42F +15015FBAADBECBD8BB5AB0CD91B740CEBE9D7BE2B4AECB9E5D572C52BD3C8DA2 +1C52B42DC5B1861540EB21EDCA20DCA5901578FB63A768B5B25BE7E79E6A34DA +C77D7BB4C18B90968FD2AEE3FA992359E5DBAE6CCD81CF3EE72A80C2D834BAA0 +B3E1676DABDE1FC4BA707DA236C3131DC4E91EF9716ABB2C71A57A076C7B366E +1015F0E3D69A002190FD689C11E3D137D5130EB46E27AADE6203B1726B852FDA +9A9BD004FBBA6F449309C517575DA18E7A9255152F8AE78B3B9C970C163DE775 +B9F4EBF840DDA1F70B2E20E5946A84C3997436A0F52D5EB8C923E9723EF105EC +93BC86F27DC41BD26CC28912126EC88B376AC07409FFAE4CDB01A72E5B781BBA +4316A3FA4F46A88B9B264F8DCBB9A8A043FFFBA529A134F62A05319825C7949A +A07CFF3C255C68BDB81DD007AC7D759CE74DB20EDAAE9153A9EF4E48929CDCA6 +8F85965CF5F8DE1C8E7526FB5F8C79351BD2027287C8A587461FDD4F4801E953 +8910F3D1B2B3487FA56B2A5A19E16C0DF0555B4003B3B377A3E2F877872944EA +FC334A14C024C1BEA0C8E8E18DA5B3E3CCEED380D50B278FAE9675BAE1A6A7F2 +8FEEA5B7220C84496216141E83ED512F281EB0CC8A34F29A04E02D29D4A2385C +98E61C5D507DCBDBFCDD6DA3CCDE8BFCBE2BB31875C62F5A3ADA36A5BE0B2F1E +372A88C8432526C8FDBFC2A8CD635F9D3055FB335AA1318425D44C7C290926DB +52258A4467AE67FA2A373C6ED1FE3FD47FEAAA70439A06A3BC4F764754F48B89 +A47594FD6C71901DD76C969477F61D4D0760F0D961AF9A24620C3BED85DAC965 +0D2EB1883381DAA2E88792693D52516CA19AEC59085AF2DB01903E2310812CA7 +F43D7BD3B08B3B930EAAF44539AAEECC6F35507CDDB5E92D928DB87A72CC9CA2 +C6C454D3E8B1ACCCCA5FB80D518748898D771D7B6428DD6CCA288DB550D7488B +296EED5C50F2FD74255C7B2A1177DB4D86F540764E9C51EE17F8FC39653B2AE0 +5171EE26A21F8242502DA857EBD9718319168669D9ECF8B072CB8DD0A5BE623C +C26B4862EB22EB5911AEF655ED4F52BD5441B04F917EC023851BD94BF70E84F6 +84DD916927014771943A72E8BA16E44F782B7AB40839E20847A2765FF9EE44AF +66834EE6E122B159FA7247AF41E616E5F6427F1D29480CF9D6B8BE66F42D5122 +34D7275F749AC63A93AD14E5E9C5C3A32CB1EBA1AA184EA8400FF39E0CFBDFD8 +C46078110DFCAD0CFC32606FFA7BF2183FDB0F9BF8FC68D5FE2C6B267562B777 +F3E11B16A37876A39F1824586548F5FAEAAFA57420D0CC28A57AEC1839C07AF7 +80C9D53D08C9030271E4B79739F2FB995A9E5EEF6957BA37DA2A5AE3B49D66ED +A57B58063CF1A9F7A19EC131178E8F7CB63BCC3AB7B0AB7B2B705E1885766A14 +615520B8B4752ADFADDB24092EFDD737761709D8C2B64C68DD84C8A6ADB68FA7 +2DBAAACE58047C6E051EBB8646342AEAC94BCFC9D4111977763847DABB4A4061 +292B80A451D5B0ED2908242C842B907206BD8A9292F88F37106900F8B6826488 +81DBB4C9005F5618C7E807C45B04B914B5B96BD39C432BD8B29D3EF605898309 +C7C30A2B24A64706862075A7CE7A6C58331B1E6A22868D9032C34BE24C468B20 +CDBEAF15A1027E4768EC6D30A39F68868911CEF80C074328B8210FCC725F835D +32B560BC1BD4BAE1BFCFC9CC645F24CD71CDB55D8F1FEB1CC3B579C2A6B2A50B +0C79A09838569602937841E0D6CCBED038A7635CCFE7DA841CDDA91C0C14BF3A +30F979E31B5060A102C24AB5CB6656DBEA74C04ECA37B8C9404426C60E0CF670 +B14150C7F519967FFF101AAE9B1912D0965119A31A57DDC772759F107B915F74 +956D7C9B33DFC59221EC7CA179952D0F05D0A21BFEA10AD65DFE985951304701 +1B0DA869C6444DC6746EBED908FE37E046A9C3A05263F0ADB027A201E3FDFCE0 +002339107609E666B29BAD895D1EC51C8CEAAF77C9B7900D4E48A8E0FDD7EFA6 +85890A414BF53D0811BD4424F73EFC028E1E24F827EE690A2C455BA56826BDD1 +76AE96CECB5CE924AAA05223080EA723FA1AFACAF18C879B1675E1334D14DFE0 +BB8F4390F3736EA40A1385E830E015E09034E3EC1EDDEB2ABB6B6923540555F7 +50D0AE29B82828DB755C16D3E28B9B4C003476EF672D9FEDB65C59FAD148693B +2F9A6AE55865581D54A0EADF9DEF317DB623AA0178C423C72A5FA7CF6583B565 +D68F4AECD003B6777AFB5E54B7724838FA27BBCAECC7FEFA482CE122D67C1F5A +7A89524A95B431C56180E67A728EB87E3831EE81AB8ADC8D5CD1BA34CCD3F7C6 +B57130F173E1E74167505C95E062AF8D17DA1AE20F5487D37ECB72D48EA157BE +8853F32050DAE379469C56F529867CB1DB8102485946F4642D12EA28AFB23338 +309516C967102F60499CCFA5BA738861ADF3881E4C77381AE42DA48CDB8B93D6 +8C944D9C00CD08FAF9F3EA6EAFC4BB81A046D60B9615E9E32CC1DAD8BE65CCA2 +4D9E275EBA74300318C0808FEB2F97EB11179CEDA173FD5DCD01C7A9B55F01A0 +72CFD68091BF0936F2CB6B4762B4129DB790A130341B1281239317BC4413C5E3 +33BDC68F9FC125793F1E71E49A160E70A0CFB2935384036D489ACB19385070F6 +77F1FCD18ADE1BA6128B6472D9BBC41916B50D349294BD9A8E55C53C32146906 +C33F4E0DB30DC2B1DCD95C14FF736DEC32100887BC3AD61F47D518B984DBF15F +9DCFD8D52DFE416E9330E8A7CB387993E92C40CF345CE5B4AA6237E5C165E444 +87B999C9C9BADE827E99338A935960B43E5D489216AC3A1B12553983E7387DA6 +0B30128CDB47234410C2CD262F4F513406129DDD4A5683D9A90213B15D82CC9A +CB95BF820B80792BE989F8CAA2C6A2BD03A17BD5BDD2CE037430D3C9D50B04D2 +57C04A27111800E45EB0A23BC142F8E94FC5EA851476BE4B6F28040CBE35CB92 +D58E7F283EA78F7803C9B531A641F969CBC91F76F9971D839486841F7C73CFC7 +12014116686BFC632620EA3758BE9A1BADF107C3CF1D56BFBDF38A243BDF7348 +1EAB5035A7D20A19A9244D922A16A66B9A015AE480DFF90EC74E1ACD6579A7DA +C0B60F1ABEEE7340156B4DE7DF797A6EC6931AF2FABCC7CBE12408C17EC209E3 +FA0AF21963EDE23E789F16FE7D5E504A082E0B1ABD3F32802541CA86D3DCFFAB +FB6BCD78D318EE56D9BA4D9C79727ED3CEFD9C95FB08BD05CD91E460F249B955 +AC1EE6D90C09D2C58621940E58E8BC2C7CCCBF44D8677D17D00AD53978C46064 +7F3A231901E4C0520D07A04D308BACB848FEA20D5D3AE8D2BBD6AA1637E0510B +42CFB4D7DC696414DFDB26622E3F9A763EB25B77136BB41ABAD6201D4A26597A +D5A21CB25E54EE60B6FD238905A26192BE539C1C06301AC836402BA71952528D +29E35B987EC4107D74F018410E5224C666847C416735AA1894A23651DEA153FA +9AFB47EBB67B66181EDD00FC8D0ADFB9405159BA37AEBD20AC6DE2361C787BC8 +60E969638371CB4003657300F22EB205695F5780A9EF6946C41ABBB314860407 +5E8FA325CF7A73966ACC1A9FD07183067705EF961E44784033A2B5E439679D03 +649D027F64149B1C223846C72D485BCEC6C627A24E5606919500289EDD483582 +86B9F89FFBFA9949AD5119486222D9B90A836E9F3A30DF87C8B6605FDA841D75 +3CADEDA0CD4F5E462A769D807CD93E817597583C273469E451DC0A0EEE2D44DC +390C8569903E0E1A8F3E4BADDF2810625A94C64B478F3B23329DA39C7D667A86 +A8C7980840A5BCCB26E9E00A03AF919AE303DB02E9CD24843A5C31D5C581F344 +CC05E9B78C99DF60271303F5636583D4AA19261A27324AC35FC60609C95D8A89 +1E1BD2D5D3BF85E9995ED8F5016E3ACD768C628F6EA4D629C225DB7665CA678B +CEE9262A08F77313EC07D428CCC490FC953ACBEA8B82662843EF29194BECA18A +9B9F7DA6EE5E69E1F6063891B6640E66A45DBC1BEE2ACE06966231460AFACBF6 +5F8CC0E6DC0E990ADFFD6958E9CDC3E2406ABF261D1E566D66C53FEBE676A6E6 +7CC2B0490A452F36FDDBDF720A73B499B2A24559447E6B64D3D1B9DD757EB587 +DCA3B09BBDD6270F3341F3C050D58A19DFE8DE6C967DD21191AF8D007546CB2A +29B6A9286C4E247DC8499D53F166F96E7B48F6CA9A1615156BF26569F38162C8 +379229886C9A14B7CC27079581E9E1AD044B911A204B5B5099A0A6CD4B93B5D4 +9E19292024C8B177377C650F14D7156E7F80CB1543B7D1AEC4BC22FD0CACDE1B +873D788E7679BA8CD24809A0E54734FB1DB1CAB70F0E305DA6FCE5158478FE21 +33D27702357D89436ECC6261F07609B047450F38F1FB447F44AC661B88D599C1 +46625D0796CB6907DE4EF2E96FE6619DDDE75FA874FB4C1885F533C7C3441FAB +FEEF1179C13A7C15C3742B832629F1C934D9870FCC0FC49877DEE9E31BDAE0A2 +B7D7A893BEFB1D1E8D661AA06A615166EE1A809739526EAF5748B402787680F5 +15B0E2C09D10BB1CDBC540B321DB8EF320F8762787A3550C6F0EE4A1F4C448B8 +989C8ED0646C084F39F72A0DA2F033A27A309F002779633D69E4900E716DEEE9 +4957732BA6B0DB00F3AB9EC6838E8D95C2CCB4F3C2DE12683AD34FF8D98CE70D +C2CD04BC2308FFE468EBF3E28C0451D2126E12FF74807E4EA74B6D318D358392 +50A057D3518C663E5C22D431097FFA3CE2D3BE94315C3C263E3192E2A0AE7468 +E8734C3907565B917A802637B8E17C0C3099E09CE5FE1F4C49E8F986EDC3F62B +925AF8AAE0DEE73B4554E19407D4A8AE540954CADC8E8E04C0DB4F4CBDD597DE +A042F8C1FD867A5981117894CB11DCAC13CB5B1609277AB8F52D5F14B0EF5CBA +6FFEB15BB5EE985C5BB5B6FAD69DB3DA85EA0F607ED70A07F4186A976157CFD5 +1FD77590B37B053366B2D59076E7C4BB5B17E37C0905B5A4178801DA04393335 +C2F5EC5170D36510D8EC5A3F74241D943D32D5936312F4E1929201CCD8AFF4A4 +8ACA3EEAEA2F80811E1AB97C722F5683CBD3BDDAABE2BFD365ADD468CCF773F3 +0D4CD51FBF78276CCB2261335439820D3335E049625BD62D64C10FA5482CA484 +91353DFF4D23AD3A1BB45F544DEDD955B76BE2179A3C115BA21486FEF6B9FE06 +C09DD1FE4CAFCA1638BC6C9C063D6CEB9ECF127EA34B258D56D9F466F3DE8E98 +44588EE4E2BE29AB2BA7CDBD0833E48070E2CA66569D1A31D74B3BB93C88B192 +9F41690EE73BADAAC366A5583EDC00C3A09A3B36206485D0EB6F952BC475A992 +7A08E52A909D47F93064AEF90826DF8DBEB1B8295843C34526CF1A753D2969F9 +41D4BBFEAD6445152C7566597E27074A6D65751802C955762833EFCBB59CC9AD +143BE9E315FF6962B510AD73E357C23B1E95E95D0E66F1870342066E083EC5EC +106599332D0B1C04080710368D15505BD555E08552C6BCBE59F8E7F52099DD8E +1262CD45DF1424FD99F35CEB8888EE76950AB97C325D1FC8FDA6B59C1DA5E642 +BECDF0BBC1D8FDAB995F0B42AC4B210841683DCBE8B0E57D9836EA9C5076D4E1 +FB7D278C068BBECD60136C1FEC4694E4C7258C4B907CD50D03481AB429B0DFA8 +5CEE01A1A789EAE744D80392D32F2D0D4D985DD521EE87FBEF8880B755BD8C88 +125FD6AB5BDE712D6EBE6C87E3CF95763C7F97C390E28B46DCE4BCD942C38A0F +B259F6EF84B53657102B0F531757AE6F3D5ABC4AF25682F4AA841599623AB99F +13613C3A8AD151528B371AC9AB71D884EF7605F242B0733BD8D053338AFEECDB +C04F5CE3F9B87882C241BD22612D8BC8CADD3A0C5DE9F951B4A9BD4C31C96EEC +7CD77871CB7FA20002606DAEB05C950B80428F48527800E26E462003975BE918 +6686583FA859951BD6B66661A0285D78F322604D2CF6CF12A3F92FE9B9121F05 +FA07B5FE84861D713956C1A4DF6A7899918FA425B97261BE40FAE4AF0F524D0B +1D3C7708CAC08B05D68296333F7CECEAD9DE485E3F290E8C8011B7A0AF2ABAD4 +C8C91729CF4CD7176F99ADEDE5B888EF92FE06D05E597738BDBD4579103CF437 +75A0F31B10B54642583CCA5C7C2030E21068A52CC5419406BCE7334F4861970B +1974F921D71FB38A0DDD0276EC5C2EA35C500C0806D9E06316B43F1B00B954BD +ED1DEB6F6840D36EF1E6F0DA25C565D06862BED9473D6F1F41F7B8B5B91E7398 +EECC397C96AD82ECC8411C61E0AC028E557B5AC3155EA12547C4E7BF9583F0C4 +AAD5FDA2DF0A8590B0A142287F7CD739734FA5CC5C9F4F3BE2007B055BDFED37 +D5A1414599E5BD8308B7C0CC59F59A2E5296EC476E578983C818F1307BE7EF50 +5BF52A9F05BEAED92F19301C5D754B4DC22607DF4F17C843EB25A57963128882 +1636862F5791840C87DB94004094D7472E1742AC5A8223803BD20BC0FF3B4803 +C64DFEE01FD9603B9ACAC6BCA107E276D5AA4F120C007B0720493A37EFBE8110 +0873203D4CC3F03BB8986608787346ABAFA70C97ED093AD9F8DE3898454D286B +FC6BDFBDDF3A907B1B9756431A73857B9C4605735776E00B63168AA6A7DB76F3 +3F57D42D4A742641C43C16DC4E9F9361100855DC833F154EABD36432338160B6 +7DCF1DF9CC167BE044C95A0C78ED4122DE12E8651941A9A00E9C110C7C8DF6C4 +3FEC21390330A78136783A85A410289C94B6EC85B28DD48F2D7299F10380CA40 +0689234695AF310ABCA57D37421A09245CCF60213C250BDD57D3FFC4B9DADA63 +4AE1788F0C90490780650C1BBA52139B4DD961A3650F6144C89E82012484AF76 +49C3371F84EFA5EFDAC65F27E899655F78E40DFD797CFBDF2888C10F720B55E0 +36B8670C5D0F2F1F7309F109583C440338082265523750F1872CB7C97E93E319 +D9D2CD62FD24A67DBBA77B305EE62FCFC13A60831F86F066AE738EDE223AD809 +74A5E78B2973B979B27652B12B2F65A8BE423E5F09E511623472496F1F886A93 +593CD8037AEA269C1D652B8261BE9F2C7DF6E2D923F7BAEB1089BCDA3F9F6C21 +EB0A8DD0F0CF8F28F5B2498018D995B14AA7DCC6A8C5F620F387009B7F4C9533 +C42D6C3EB234EA2AC527C551D098B55FE095645BD6EA74873635FECE40689D95 +B644F180B4515FBDAAAFFC469EDEB3D2257D3DF9F0CD87341F7D9894B709AB5D +2D2FDA926F4E66019A5B2C66A22CF7875DE999248E1C5FF77207B1F4989A1155 +BC301C4B0C7DACBD9B1A233295DBD7ED1E750366EAD9C138FCA8F38B12E067B0 +24FA74A712404A8EEC4B37BF2CA76783D8B7D4D1EE29CD494FCA463F2D95CEC4 +C602D52B102556E20DE647CB9EDB1A4C0D0D61CD40FF4EFF35C7F7D7E39D7A65 +B932358B6A749D90089F0BD9B0754C0034E1D599A0F627B6B1BAABA838567120 +D4EC81A2C61A44CAEE0721DC58FB6CB4A294B2C27FB1848499073A4282F8914D +29B158333483A2C30F1EB0CC5C35C9B44FE629F6A5A4B4227010E3065A39431E +4387E8FA2BB656DD3CAFCE39CD2EC1B8C694FF8A9D0A83412B59E064CE126325 +7D47C1E6D0A14C2E00FF23CC3B46491290CEB5CB0D77C076B682822AEEF33AC3 +72E5C3C7F130D4ECA6573DCFAE80E2AFBFCD8F75B97767336622B7186D1E4D2D +DBA4D4E7848A2528CA0B2932CCFF7C44CC84391A790844B68B7B6AC4E5247E11 +12E8B511AA79B10523C08F87C4FFD13DF16A32C14C14DDC3DFD5C7707AF0ADFD +206C5F08B6FDFBE6A25BDAEFDAC6C62D46FAD67CEBB962253F422E03E350FB2E +5D85310C754A56CCC4D415FA3EE330F65778D9FF6EDF4561971AB36976A7AA13 +65873392DB9FEA65D6CBD192D77CB3D712BA57CFEDE28FDE700E023D722C2107 +FAD33C3EC6DB0A1B8ACD2F5BDEC6664AE084E37C08DB2A394D6A03A4B5AAB584 +C56986A6A70CED92535BB8CDEB6E061803769D9AF11CC4F4B6681F7C309ABE6C +A45067EF13BD9BB6128B82B884A82A93805C7F9979E5EC4259829EB3A609578C +8B746C21E78AFFC105BCEFA657BA7E6A5232F6442C8F797CC460EBE086E4B5BE +CD71C218A4B381E95FA0193E29D9925E4892369B4F872D4D05041E04A94884AC +DDEF4B84BBF7CAB2E86CD9794931FF10CDFD59E4532F064BA6A043B7C878A1A9 +5E549CEFE02905047F5FCD191CB9421DE1DD7BC56EBD37D25CAD0B443663813C +AACA226CC461223ED82E6BC4ED9C9E463508CFAAD72D7B294F6A1C3F2DC462DB +D1D7A36FDD4F7F33C5CE8C9401117E58C88A1504E23A59E8B9028E6A17BE97B3 +A24057954B34E02B2013BCAA8E53A2A3BD80AF59375E58574796C76EB4F80A75 +65D18766C38957BAE977FCAB12B0905A798BDC7DF764A74A832F01A7EA583D2C +80F177A56353EB1436DE7BAB8FB36A72D0C99DE947F801522895B37169329106 +9231484FBF6DE63F4B2E97EDE44B80308CB50770D49F00E61E0B7544CF8B1069 +7014F9E674B59D24685755BF266F6F9A77ED1035A8101CB2B78BEB3008E75CA5 +5FD5304ECF13459607A337F5784ED89063F6844277DDA39787738D355C680929 +DDFC4CC7BF266D18523F2A710260820E8EE84E3B4EC13886E43A399B06B5A6FB +1CBE44275EC77FAD42B0D5F7F44FB119F848EFF4F93B7B4381EB3A6C70213BE8 +E90B52EE30700BD51306F314589A1154878DDC33967229B0A367AE70418739D2 +56B24EBBC2D687681684FD867163128BE945622F74AE2F6C57A63484CB126820 +17F30AD1C5329523D679696C4A7B8CEF97FDC8BA5C0C31B7F19EC8C39A61E5D0 +60A11A4CB9D899B363AD88F9297900E6BF51B5315CB42DDD6CEC555AC54E0320 +B97E989638A37897AA76614326D90977B6D5EF13DD830F004093E5A685C8CB50 +D976EF544D8C0471D3E037E19E42CA87028BC27D1477406ADBC4CE196A1EEE89 +BE9A06ACD6C17922A61705CA894C0D7F1783EAAB8031CB1C18DC3CB81186A1F9 +867B07FC73AEF3526C0ABC2F77FB35A52F82168B7A5C0455DEEA2522A5B74487 +82FDB49035062FA89995B9123F6EC3F84592158DC2D4B6D3E61EA90BE082E44D +275A6C4512FD61A3012861111496E6DBCB2CDE57F5963AF6FB129A3DDFBDA2ED +0EF9B3208FDFA7EC3B1F02381002D82BA5229E9F8D23D7802E8FE955E0DFBF6E +624C20E9707AD4C924E080F65243C1B0D53492B1D4E874BCF92862F85A47A010 +C32FC9FF385860AE6C95481FD8B83B37A86435AEFC6230706452993982ADEF24 +8236F5D4105A4F5C20C8796778B8C3ACD4D0691B984459608915C7587D382C20 +69A1DA37B0E75C90DC7060A5971B9551A593932FC8A137CA32952BD67B6EF041 +53E8AB1D2DF33C50D1F8B46D057333F58009BA460057573463E0895AFAA843FD +99F54D106E0BD9C7A87F8930DA17C78FA0A7057314E1E450CEBA5E65CF2596D4 +13684ECCB6BB7BA6C778127C4D69CA2E5F39FFD757BBDABDE26CD4059A85BED7 +C0FBB4C9428796356EA5F3094E76472A79E9E395F5CAB8B49F991F4D20CFE349 +D07B6412320C52F18EB4E87659D7E48AFF69D7A415F38BCD5BE489256C1144BD +281F85F7A037E4E7C8D141FE449D16F8D36D9039B298BB1F61BFCCF6737178B9 +ADF9A3A184489C6D5EA2B6C81CCBC3D89072F5093025BA69B6A29F2976898824 +406D932F7F3A6EAC0A65A7F016FFB80D0738FBC2D503E2531433E4F074D29DF8 +507C48857E39E25A1EEB835D5300ECFECDFF08215141C7B6100DFA0BB932334A +A4250162E36AC575FAECB1174F20F11EC6FAFA4CD886C023BB60DFA8595BDDFE +BCE6792B85B17D046054A266412F96583F76A66DD1D25599F31FBF598E8E9641 +7415366257EDACEC2D4672F9165BBE172F11BA76E5783CAB60F86655F87BFFEB +08E31DF6CC6863D05AD0ACCE9AD421437D17090354412872287B6D9575F45562 +C35597EA596E716B67971F5667713D8F2A971285C4D1B67EA77811AE7799CB13 +E357B1A03D5B71F3A7B836F74E65DC19DC8822277DE8B0073EEC17ABBA940B34 +F664745A79EF90AD4FB007C3F7558B84C98EAD1C20064082A2714539CC7F0155 +87508D192DB05FCECA78630C4133CD827932A84D21CC953B999C8C851A224B83 +F3EC014FA0D80C0BED17A359872160683A658B65309BB92A871B736E1B5E77A5 +8C43A658A9373F92459653C47707297BF2B08A8087B0D0E9BDAD307F118782D7 +D7003D9A160051C772E5291F33508921E1E16E48C03FDAB0F1C33BD9401CDF51 +9C7771022D3B69FE47296770914BE6ABCD4595116E2CDDA1139E6C0236C217A8 +DDAC4962DE70098E71FE6811A2E5441A54C5C91C2673482AFDDA9F1D25D39BA4 +667AC88E269E0A5973EAD0F112FB692A8DE56CD0840F2D3ADA9E35C8DC532669 +AC8EFC8A473C52E68A47C2EB6D1D60FBD80039C1722CD8D33121C295EC3B0949 +9DC8E10A76323B17EF0989B8C811A46099B179716BE70163106B15C58FEE49A6 +2BC6787698965C531312264F7AC5013A7F48C25D3B484D88213E093F81666D22 +D11A0FB4FAAF8D579125D58063D11ADE621799BB9CDF9394828BBA7C73BCF863 +B8B83B42C94AF06F076B73212756A3B6FACFF9F4AEEF704A5E8F6E66204C3EAE +3042E58635DB16E2B20D6FBFFF4FE81D34DD3E3CA24D9870E81519AE8701328F +B7AE637F2E009C8CAFC9C8CC9FD212A8D04236540FFFCE06A53F5E0DAD66692D +CF04864C36BB8B932D869AB4675FB0576610A39E426E16FDF718940E11FBA5CB +5D80356B2E191F3A6EC7062A60A91ABA2BF455C38A88681213E358016AECDF6B +F29412284CDD0EECC405ADD56FDD02D4C98324D60EA23BC8FC61849D2C8CDB45 +EE7996210A041FE7DD55EC3CB98A89BABBCB11EF1DFB332DD2A053E2F4DBDB18 +D147A80A364AA417B4EDEE6F799D012BB094FDCD5E2FDFB3CAC7D592C7B04C92 +29B6C5E2DE5B1C88FADFFC69B356394978FA36BB8DD4B8AFCD61EEC7818029E2 +86B5135FDAD4C4024472565F1154BC76FE9450FE41BBD47CBDE835D888AF9CA8 +2AEAF152D0EC8F366DBE7283298711F4E19A262AA773A4B5E2F83E514AFAC904 +ED893CE36C8CF3A4032D79B3DD677E49E40A40ED8B818D1C49A49E9135FD3A95 +CB47CA7EDEA07E1A5583B92D7DCBBA85AA62C70C7C79706F69C374EC8C9C8DF6 +85FFAC786ABEAB4C650755BF6B5D8B0D7C73E8FE45DBAA508665EDAF8FC4C49C +3A053156D255A9857272D167DE1999D51869F4329F336546D8CAA564C40E11F0 +9BFB24D7A92E602B520D2FAF80AE1F2306A6E4FF24EBEB2BE5F43AE99546F739 +2C1EB46C7E678416F973FD64C8F9A8FBAC24DDAC97FC3BAE905285ADA80EE265 +EDF710944473FFE82E0326579BAAE82A11EC1796F66BFBFD9D42B1F1844F146F +468436F1E3B101350A15961BE3ED3B060EA6EEA54B4640F9135DA9678B776415 +0EE9B4E2023FD929505AC4ABC41870A287913B41A29D4482439081B22E4C9EF0 +606DB52CB4E42B258E26E398918AFF672DDB8137A3D9E56AAAAFF283CD204F60 +1A7020497BF3AAAFD5D19BC5027129759552BCEB666025A958E3C89D87F2628B +B1CA120F99A5011E364F45524A30398A89324531FF1974064D8E442FB7F217BF +0DB02F38BDE00115A217DE0B6450DD5B06C1B4335B55DA1B1738927CD6C0FF64 +82CA6B57AC50923C38343853D1FB4F04B8A5A08ADE3960339D85271E59CD2AFB +2EB22CF048AAD9F50E5D79C8F640FCA9357AC2201E2F111B19E9E6D97837356B +4BD21586B4FE993EAE89C196D08C445A0936D9AA5ABE103030F5054173E33ADD +A3EBFA2DADC766577FC0EE7AAE0BE5FCCE4E28732905A49107201BF8DF75C2C4 +8EC78180A36420836D6909671E85B0FAAF3771EC118B6420116DC43983CF83C0 +98513F8F231E9C94DDA2BE07461E9738659913D3C7157269FD28A8B32CF11E0E +9548AA110FCC71B3F98284962854310454D28D8E38B37AE93433824FF61AA808 +5628F23DE58D64EC1A52AF495DB65FE16087D1F3FA0A36319B517B51679755EC +9E19706ABE12B8E0641336FB8F05FCE1E6672820E3E9C5EC624186805E4399C1 +F55F16230018FEFF64C51D5B89E6AD23D260551504393A9DE155AD8B545B4D09 +EA2EA8275E104F7BCFFBDFA9F8D4526F1DB9ED1687D1B74370F747B0B0E4B720 +CACD3A22A78819EC6CBA08AD1E7A729E5E42ED9B8D5166ADA2A94EEDE2627751 +336CF3F9033FF20CD52BE3F56EEC67E5B732998F4B1F136736987F4A2605A64B +1E95A07F5CB058FDFBAC5758E9F0252A31F72ECC06DF1053E090762D17AE84F0 +0424DD6FED7193F99520FAE01556CA67914867016AA86C1C72F87F5D843DDE28 +FDC16CDDD89050A337E455DCBFAF605FBDA91BBE7E3BF1E88005CE32291C52C7 +DC2B3640454D0C36C05648DBEDB2EEBB00F585D371E7B2A9F3B1B153E5635002 +25F859F46BA3CDEFE809C80B1DBC37438479DED51ED2647F405CFBAC7A429360 +4AD394586ABB312F3751FB1328B15C7B15FFD6B7E92B3C8D61C99C8054A33C94 +F6A9412EDFD6894C45AC431D1B29E2AE959D6B610A91725265C4EA7A865A64BC +CC1BD93DF0828E529C0CD5744644F08FC05B88A5D0AF329972E3B2CC2768CA75 +05DCFB2F758327BD961D7DB6C8401F3337D0A72CA5CDC00CAFF86A5A40BBDC38 +904BBF359700AE4DAFD9AF7B8731095AFF6F0572E857E9E8AC1C2DD5D74F5FF2 +DF3C0B3EABAE300C043FBD2E64AF0CF21ECB09A78FB62778C86E8E5A356B6007 +12ED08D19AFE705CE8E73A58136657E7357E074BC661681B4CF919B0B01B7D87 +9FEB2F4955DC17B86633EE72F9BC1277EF7D688E7FF5DA5B8E5646FB7A5B0457 +F37037F76100FAF3DBF4504F203F569550161D1B578E0E03EA93857ACF26C58A +B75CAF8E1BF6BE7DE26C974E540FA8049EBA2D17B4C7506EFD6E99B776A78613 +3A953BCA37768BB990D56A650C70D0805D21856301BA9ED1CE9CA46DFDA188C4 +F5C73416AD75903FBCD6D9661C4599BC07E28C6664C72606BECB75783FEDCE87 +29EE7DDA74C74E62BD1F1699531892540E34B795189BF088923E21E65976588B +A3E06B30DC4C62A4E10064F6D638CCEC9189A7BB33E8B599CC2AB618476D45AB +55CA9D497C2642B6F3326FC846AD02EB109AF7D9866B5988ADABEE994672085B +52C906A7F28343FE913EA90B9ADCA82FF8EE7A1B2F3E43687F4B420B5D551846 +3CDC11E099D8B0ECCB24B40C74DD93C5E40E9F3BB4814840A14A291191E95446 +2CF04B18F0E7DBA93BF4AD458F584FB02AFEF085AFC248263B12D76133776A77 +1343CD1E0BE802CF9D9A6FCD7F70277B10FF89AD4A78405C4D3C7C6767ED85F1 +20859187EDC5F026CFE93BF7DF4DC0B32D1F4660B5995A2A79A8FEFF93389CCB +93D00A3CEECD3B631015A56D9E6C5E30D36DD98E6CD2A3F6148940AA180D7E02 +4442FCA1EC0950FC292E35D3A1CB8AB4AA1EF85B6197BA950AF5D1CB94712C7A +57500E5E8B1B0A05D865672B098BEE02BE07A01B0A9CA67BF7766EE0EA5941D6 +823ABCC777162C9E35C8451EDA76E0F06E758EDCD0B65BA8AAB143C339D9E843 +24E12148C2CD94E6025FAB0093011ADBF3199D7EF02FD52A7DFDC782E9BB9DDD +D76955BF841D7A75D806533DEDAC7A906D6CCDF5990FA64F38CC5C22A5270396 +0A8C7963FF5830231D6BC7D0A18A9939B159B50E026AD34D7A8BECB7EDDBC6EB +00546AE102AA3D88CB76D9B816E069F1821BB2804654802E8EDD9A9ED2458D99 +C5C2D04D87174093282AC0879457510CC1A8EC14B3CE72B4207D7D35F0F74B8B +0F121DE6EE1A189BF7E076302AFA5C0A09BB8095D32F469E08575E6AAC4AB9A6 +BF82FFA86CC60A3A34D1EA753DDE232119D9A4891B77B9527FE9D9DAE34D6944 +CB9EAE528886AE53C91EA315E708213196A01CDD9A181EDBA37AE4C63A23FC75 +77C3AAB05987D3BC0A654BD9CFD5E6F48D8F4AEDC967A8C51DEE87DE9629BDDD +680515991E6D71FD417CB784E3EDE648DF8912EF71BF93E20FAE714E422792D7 +2B5F02A314191CB65DDB648898594B44A33F1252676DFDE978BD0188390120D0 +C0E5550B77CD3A08CABCF2FF5B62C59B2B6F95B8A2D8F3DE2BEF93E9CBC20CBE +64C51CE0E03300459F11451F42C33DCC1D361206A1FBFC4FE27A48F667892C7C +0817245326322B600B6C323587E7A07A6132BEF029835FE7CE5DDD5DA26FC5C6 +786FED8425EA1D113230D161A78BE519538614F61ED1E92DBA5A0D8B5B5BBC4A +D875B43B1986449AB67508BDB269D2549D2F794881556DD132E18B657D33C2B9 +83DF615A05ACFB843453E291CAAD9E2CCFC7490F9F6E57C934C5A92037E866E8 +3B2785EE6F10F6D4DFBC8BE8DC383ED4750E67ABA0A74669E2C53FEF09B69CD0 +9D14DCD5A8050AE52F0BEA66BF37B315DC6461CD782957A3A14088A7E4016815 +AC603ABBBB4E179862A20129AE3E4BA0ED6CE562F7BE1C8498A17CBD58E954F3 +AE82734476C567DA005C28510423C7914655D53B0CB094586A0509C190F64770 +C55D2EB3329FFB1D67E35D50533629DBD88986444EA470207BC789EEC011E302 +4B5CD55C640C3D1174E1EEC5F5A1E68FE677BE2D0D8694394C0563734E6F08F4 +FC35024975ABFC560C487AF7AC9961D912E620305A58907A0F7A9CEDCFC7453A +290C28E1AF0441419571546FCB5442A20674459E9E4E56D02D6D636DEB263A85 +38C63FF6F4F07EBAE0E3E204E94C4A56AA818FDFB54BBA54DA4C25A55C2025C6 +CB6483BC3B55AF578CB4BDC8DB58FF5463D1FCCC63400481A4C3CF4AF3D2C61C +A7ED38B6333A755EA1190CF54F7881D3F9AFF6408FE2DB0FB36321DD833CA4C6 +25816321DD6E830343CC5325331E765DEA567A8A1ECB8A7E54AE74C7DA049606 +EA4BE6A9E13BB0084093BA80DC98BD5E214F34ADC9452D4A9512E550FD4E97D2 +A64FFFC366896E8325A6A816D04BCD8BBA114F6469D3BEA397E35C7F91AC75B2 +2DDC5B9BD0BFD8C259E0467F5E874BFC42EC6ED7FDF043469FB69C9BEA747915 +778A99648F8F00738962958D1D87424F2667E3788E945895CFCA9EDBE7274A4A +BC44F16EE2A78599CD73B41E189025BA088573273DAA7D6A2AA19474AA29C1C6 +BD656548816750A76FCCD5634B7599362FDC9B4A252BD5667C4260F1116FA856 +AA4F363FC6032974DD19B5989D7D27BD59B8A0ED42FD9D1DD2858125583F28FE +A266081D50EEEADF0DD5096885D7DC706DEA8460D04D3900E9E081F92A6A1F95 +3EED1486DFEB20B3DBDFF252D0B2DC7EBBBD755FA3929015205986AAD7404ED9 +67AF080AC63ADE35132A4AD0E9C63C600326048179B6AFD1907C0912113199B8 +427C6196084922B5A0F5E1FA25052DFA4902BB43D349527468A9A8F3732DDB4A +AD1E9E3028B8ED4623D8D1320CF8A1E0B29C16DAB4A559EFEAB0D234A1A7D8BC +71B25D5CDE127BCAB2AE7E71A328F2CE9D3EC9D23E370A5E95848A00F2D1AD8E +ADCFEE7E929F666EF63CC9C90CA02C2ADDD3216C3BA79F469738D1B2B6349F72 +CEF3CAC9F4B4596771D6EC39E61B9817439F0380A57A97AA04091D75B7DA14AB +0B864A58E00B4B28F054910709B93B37AFE76A7EA777BBEBD9A45889FB52C6FC +FF985679C9607AE167EAD42791BD42DBCEB89D356416A38007220CEBF4A3203C +70DE5BF488A91278272E337A47CF8A5F12F95641AEACA5AB485FC5A316BFBDD9 +3052340DD5739FF1C1F850DDEEED70968EDB150D50D7A1F1C894FCB95F9B4CE1 +79721CB1DDC387073BAB999EF40FAEAF721B6BFE427276E3AB02143D3CA60AC5 +055757203EA5071D7730811D723237ED10B83B457BE6CB673B5BA4BC097C6293 +EBE8393443B750766B87534949057B7FC8265048A748D61C4B80F9109CC7E1EC +36217DCA2709BFDC1682F85E75E0FCF3235ECF266A78E859AC400D5D02ED385E +7E30492DF22D7D5B3035D2162DFF1795E7E9096BF30957B3F75481F31FA87916 +D25DFE1711390CEE845A3B7842787985B516D60A7F3636AE0D036A911771BA34 +866336E447DD88B6892A00BA6C017156F7D4F4E613BF163EA2F325998F046CB7 +5EFD1077B1EF7D9A40705FE2AB8C9D3200EB1E5903C5BE740B88B3A46C6154E3 +F702924AEFE30BA19D64C20876D8CF14877BE2F1FBA6D2A52D35C395BA35016E +8A9ABD8720C1A79360150242FB188AEEA1D02D7BD70D15CD0A4261B185ECC8F6 +DA0D3C23250D6B4C188D10D99F5B0B8EE0809BB20D0189D2E8B6FA6E0EF6E415 +890DC4E9F8252F6EE25830D5BF07365B58E0D682B4FB236DFBE36F32CC574B75 +9C997F3E74832510AC57C496D8F131F610A607246C31F548C859DC34CAEB66F8 +AD4A6355C7D04AE6876746489A94C750471DD1A33FDFDAB58BE702D1EA89471B +1E73286289ADAD1935BEB2F17B2EE77AFD9FB1E278C99F85C6EFC112C997DFA5 +66FC3238FF89BB840CB6B9610C983C24424EA95A2229CCD0D0B62DEA1CE377EA +B18709581246A060B6181D0A99144212DD9D4430E8B213FD5F37CF5EC4E11DB1 +E3E48223B990724D7C8561A9FA5CDEBBD4BD866647653F4DE6D794FDC4005D88 +C2773247A5D6397CE425E51B96C741FA01EFAB5DA86E5435365671E2BD29A628 +BAA80C56AF17B725BA84E5ACC005C658105162FFE81B5CACAEAE8F3A22209735 +E470CC97B04B0CA0A969E41E94EBADFE40684E0D018007D1267C2E27F4176BAA +B484A032B0CFD0B3977322AA298EB5A11ADCB2F154294FDCBE9117DD3FA00587 +83430596B2D432A471615ECA7789A6B01BB496309C8424C818357844F34ACEA3 +1B71F88E89AAAE14BB7EF728D75425CEECB1408334D2836A9F62D1B34A1BC9FC +25A43F2C69F01F3217BE0487563E11A9DEBF88C7655947F0BD725280348F9AF2 +864C611638D3B78B26785DCD3E05C47D297A4C6BAC0840C5E3C646521C7DE8AF +CE9CC7AF715F62AA0537E7965EF4158276AA8C7A1EB9D7D61C423F39CBD918FE +EDFE99AD29C73D106F7F1C3DCD4BDBD56F6E608846E32CF26DE47B08C53D3521 +9F8841AF5554757D0CCB44FA7ECD5BDD0C20263D097D9975E1C41DCEF4D8C9B1 +97EC5977EA0EFD9E405B429D451140105161EEA54D4632D6EC6220E28C7153C0 +307E1A3953DE1CEAE5D51CA6C58A15B69BC2528B1500BB281C7E90F40453A685 +A329867D17142A7D2FE906E15FFAEFE641EA5109E92FEE41FF134E8BFD57875D +D4F8270C12808FCDCEA5812812501F64EC79342DC192B20FB93A1A6E0475DB34 +B7A662C95EBEDAF862726ACF65393A719980839A9C05C705F251E6B46E276CB0 +127CBB7EA4C251B0672C01FD185C7FD287791019D8FBCCB391E9B9F818BD32FC +E61D57334FCB2266384D8FDDB094DB86E87EC7789A3287C1194827A38926AE50 +F6DAF70C2D3EB91238D87148642EB0693F7583F0D8D8E2B6FAB7DC139B06CB0D +AEA8C08415C14B835BB928FB81B7DE129A08502D89207B8673BEDCF22024BD99 +5777574A3495BB18121903550084E8FDDE6F940511F23FB95104E76E3846515C +F954431752CA60C08E345CE8E6199F1041855242A7315FF1ADECA2A23B7218BA +F7D895AAA7D5C49AD7EF03CF8A2EFFCC1DADFBC101895D17B0C3E102C7DA16CE +7BC977E49BC120C4673E14F55D00FB30DDFCBF592AFA42A887322F25C15A100F +82F5D3336804E68FBD0A470FD66D0566F0FEADAE76BE6A436D715BE62A653700 +BE088E4E594D99611E0ABE626A9AFCE2E7066B65295DC87B6A508FA3EA6C0C43 +2580AD8D9266FD81E825C4B0F908DE635B650613435DC700B7920A3B08BCD409 +69D7E559B5AF1E98D02169D4F2BC0CC08CF94FDC62D1877C823D886569EB5DA5 +B93EC5F0283B8ADC719A4831C107394919DF585AB3BABDCD98A63B153DF2BC7F +55EDD18E2195CCAC549C9B4CF3B91156ABBFB56970EB689EAB871D6FB5919B3F +21418C07BBEC9FFB2E1C7268290776B993363429B20A5D4C7C66D1B3DE0256FF +A3A1157C96BC1CEF6F6CD55207FE4DE2CB26E799C768E1DF47654968F6A708A9 +7F42E3A32DAB67EF6D16146793C36FE6876F1CAC18B409D5A5A6408F13CFB9A7 +141D3D25FC0027F6B7FF6D186587BB146DE91530B32B0F1677C48C28D54F3967 +C0E9C3619F09878D2C2A6112DF8FCA1133BFEA4AA87D358A35591BA6F402E7C7 +404A078F95D33AB26E0595B5BFC85D6D8BFDDE1297DCAADF67E1A30DE26D504A +7FBBAD316A050CB9FC56A10F0A6721E61E87A462711604C33044D6197C0A52D7 +236C147B09DA467579C62A09BBB25DFD9DA11773EBB8032D1946A35928ACA3E4 +CC94CC723D4FC49976F39EE66225584DC3537EA4138AF062951CFCD0BB9D5D41 +F119E670ED47DCC59E67DF658942835353783F571801BF33922D8EB886AF461A +EF66824F731E5E9A50B153195536AE96FF7F34F21598C83712DAA54B780FB815 +36880FBFD56675EFF13E12A8EDA31C76F6367B818089DCB9C25464C47EC3968B +AA0939DFCCFDAA0D60672A349E2E4768B386160EB8B41FC8F959D45FA8831BBD +4EA49CB9F152FC8D730216129FDA998DB38810CF886864927AE9F047855AE4CD +DD6BC5C4733B48C6614E9E9F7EBE404BA26E352CBFE1A533E9E74C78EE17A9FB +148B178F503B2154264C21A39B323D8B4FF8129A8E101949DE2C081E28D05DFD +CA2E08F44BE9B5663F331D34D47C8876AD9540ED7DAFCFF0216D6A50F7D9C00F +1591AD6FB27CEDEE703D6C3D9D024675A117EBDDC79DF5D4DFC7F201DADCA2A1 +72EB9A21EB33F5C8325CF8D8230DA66B6C7BC504386ADAC40C00E20BDE3B5F2F +111AF81049379BBC4712A78B6B0A33BF40512A1C42E3095323D07B0B85927AC8 +29EEF89786724EC48D30B8F2F26831BC7238AE0786936CE46FE7B2426A09D370 +460B950E850FA2D6710C50E78497C27E5FE43B7A830E67C5F28219D8B0BC1158 +0A2B02EB3E7A96CC1B6FC8B3DA8708070CE1C26AF0B7D80D83021FC27F0322F5 +2C3B92C29F738CBEACB1065948289EB43E334B5BF6FD7CCE82FE9DED9E3551D8 +1C4F66C9F9C1A3BAC534D79CDED98FB5A28F5E7A4650B4F3DC52058B619FB0CA +3DC70998B508CAC359C469E488B925685590AE5084C4EF8572EA48DFAACE35AE +B9CEFC91F38A26A2105DF9C3B859674F6B20F9B3A9B7E2DD2FEB80A899FD2731 +54AA5EC8D6107A55C59A9C20F2990B9DB221908F629E0E45E371FAA3ADE91879 +84479D6F3E3F8F2E972606BCD37276E9425B893233852201D8ED2D753B33450B +1CDD8AD735BEE3AC8C4E4DA651748B2333B972B6A9DC1A133E3D695D6C975067 +228ED6A4728729D0AB55040AE154F668A2DE8CE6CD5BFBB28A9DE3F90E358BF6 +1BE66D7BD0409D59A6E3430C2C32DAF12D55A8356E25B9B805A69B828B399F96 +824B96589D5CED4A9FAD83D70D12E2CF7C9B9CF34E3F55423F478A2B8FE24C6C +FCFD80E8898C26FE65DF206C2BE1C6439BAFBF809046472A059F53CBA38090D8 +E03AE270F456B2F63987F18AED9823DBDD39F8A175770C6164D839BDCD7AA732 +E63379F4A5C45E217A5F37AF8DE3F5F463BB67F57192F71AFAB06CD96B2ADCC4 +D9FFAAA11B176A5CCCCD8FEE8453579EE23F97143E6B176418184C0F3C004908 +38D73E689018BC811251901EC141705FC39D61A3FEAD3D869A1CBFA833AE9FB5 +659AF715D30854D9312919DEDD227A4ADFDBBC76851DBD3427A28B9C957396BF +6E530F570893A2056E53515D0B5A9FB44E16F26039161683C3F4D34A87E1A631 +7C262B4A9D1175C07239B87FF6756B5AEB02E315659D938B7E55CF59C35DC48E +006F444D7D17178FB459506521227674339CC9D1CC80C3BC472B026DF0A45F61 +A8940F2D6E9379B95F28AC3BA13987E685E4C30BB8F6BA6562EFC9D1BFF66E1E +AD72AFE048DA95093D064B0E692CADC6DA786221CD5655FF768B51FECA289395 +7062E952A0347FAAFD0C28F1ADBC0BB121F0AD038DA635D0AFFD2F1D65A769DB +2F69BA310ABAF715AAF91EC3C5DCFADA1235716A9F53A510EA3A3A21D1034163 +48A7963C8B12C1DA71A02EB87C2863176EFCEAAEBB5289568D37689921FCE677 +7D874CCFF1A72391F25CD922DA5A7B35A0E40CE40AF2521B567596DF422DE776 +A9DDF64744F8164F24985B081F0E73F43E43217BF0DEF9CE522CE604AB739192 +BDB8FAD799C43F17AA436B7CC97268A73D583BC579B95E56B2FAEE303A565CAF +5BE8FD7F04C03417A3121966B549FB7E7BE070C0B05A6961733D4F189B78FD41 +412EC99F5B7E841DBC5A7503E5FDFC10E85E2DCF4D4BFE9CE967C09139082FA6 +F40337731B9B6ABC831DEE16BB3DF818EC2B701210BFFC32CFA306AF069522E1 +C05F3A0A0F93E7251FD4D57FEF2211F79422C5172AECB8B51D1FB521924E43FF +54BA9A4FE04BCECDACDF64D00D736272937F9257492E90A83E064051ABAE4FB1 +8FDB08EC54106FB4B3289FB095E83299B57CB6276B78F465800651B8F7C8479B +1C97E0E31CA741CE73234440C0C62FC373006DA598E550AC386DC6E0932F46A3 +8A0588C3AD1B862FC14D9A8910574C17984B1127B6985C969729898A9197529C +2897CF8A077FF821BCF055C2EFC1948AF0569AAB1ACD59F15D648671E726F3F4 +2312EBC0E6BCA0F7B977B04020976AE645A5738401DF2D81720C4BC90D1132FD +7334F2C852838583465DB27C834F3F10B1237A7DAC5E0136BFC785759F29F5B7 +CB0DA5C01C2AFD7460F14E03A73C818B313824B23B1B5B7443E3581E3BC11200 +D55AE9E7900AC167A7D2F20935FD72F33B695F25B6F08DF95677 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l047016t.pfa b/ogclient/lib/fonts/l047016t.pfa new file mode 100644 index 0000000..4809408 --- /dev/null +++ b/ogclient/lib/fonts/l047016t.pfa @@ -0,0 +1,1356 @@ +%!PS-AdobeFont-1.0: LuxiMono-Bold 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Mono Bold) readonly def +/FamilyName (Luxi Mono) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch true def +/UnderlinePosition -88 def +/UnderlineThickness 83 def +end readonly def +/FontName /LuxiMono-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {0 -211 714 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078984 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83C82A2DC38F66F08FF34 +E7B34FBD496A97F0AE69763627499CD43525BDD2FA2EA9DDE51C821C26AC69EA +AF027BC54141332FA165BFDE024DBE6CD20A8E4EF56F52F260AEC28695FE9141 +7E7F100CCF64993650A81C0856688B1D101418D3B0926F70BBDCCAF43FF4B16A +B8328A5C459C7D6DD6FEEA1AD5049C4EF32D91C30962146E922D498E4D38D172 +CCFFA8F084C6BD440ED2C77C1B574CF8CE25AC39D2B18C91E596994081B36688 +EF1C949FBA04376ECBE32C3E29ACF83A8C36569C315CACB3DAAFC2FC8FF68839 +D9BF2A301E3E8F5B27EB82D8DF5D70444998F05B99D26AD632FC21A81D887E9C +80BDDB95A1C0FB1F43386515E0F2903E3623B19F363F35885143893761E54BD7 +C9EDB5940386C62FA7A8919B57E4A4F0D9F3B4A4EA82C071BAB90B57C7A0F553 +BEC3A57EEB877476FACBBB61DB74A76D95DCE4D5C46F9686AA5176D6B65F0FFA +37E1850A881EF057A62E3092D923107C691D32F3D619B05DB75B337EB54D5505 +2B7669A69A162DE45E9F900FB8BCC2BFB7AC5CCC64DF94DA97386D4E4AECAA28 +A9CFF3C9CE3031CC890E563F7A110D4690CDC5BBD49F7ED21C6E635952FE3ACB +02373DD80C2C653E01525504AC37C849D6C5F25DF0C5C762C45A83233517EF9B +D7F67A77881F6B46BE10E458FBDD73D225A6047095AB3B7AFE9FE2113751B732 +950B7865DE7DE98DDEC75D3D0311E902C2D7FD4A7F08F481ACB695078B930EC3 +6F3669F4E50345CE0A4CF1C739BD8A92BA29CF5FF0C3A85B687C0BC0BBBDB8D5 +DB96AF1962948038D1EC4ADD39D3DF966ABB57CA3017A28EB9B2148D1AB72F08 +899F5686A2013D69F6D3F5ACFB0503DCDF2D93CC7722D3F7D7486466F32741C0 +17F3D8F2D64063A9CBEBB462D4CF8569EFE4DEBE6DF3CD2F3C2AC955D8A20B1E +A0199D05C93CE0F92ED01330A7C9E65E7ACE079CBF7616F24ED2AF540FA4A1FD +5CCC7A1057ECFB91B02A84499F9209CE5989021F4D27B2B20D4793F6C81591CF +ECBCC22005F89BCD1A089C36E659BF3BB92558ACE98DBDF10F0F6C7514356F54 +5A8BD7EA0E326494BDE14D91C6C74224FCBB42FC22FF8F819AC8CEFF7F28A56E +A86FA3DADB388D04A015B0E703553CA2C2E5B688DD49DA92FD89107B744BDE7F +85986FC9C688B97C67C0C4C555EC943D5C6CBB8BDA89ECEBA41037A92BDC075C +3C2CC573B084B19EC7FF10FBE814B0226E216452BAF96DC3503218F49ED279D3 +CDC0369901B7764918E8071258114002152AD47B0ACA19066B5DDFC7AC37A6D9 +E49FC3A5C16F51A5B86663E15139A063C5D408C562951934700371469A49A940 +FA7074CAB31DF454BD990124F5E70B4B6D62DAFF949FD73DC758598B34376867 +3F7BCCB83086D6AED4460D71BFB2395A94A27CF34DACF70BEB4906BC6DC19203 +5512F6948158915E228603A5D4B906997D51EEA9BAD01BE45C36BC39D9C70778 +D6F8619B3814F7A3E9E0524C8DD61EC63E8B4E15C42FBBBDF8257442E5D2CEC0 +890F6B2476340387E8A4E21A09805F82A17392D2AB3CF3429DB5FFEFB093165C +63525A9BE659AA22C7FA5DCB894DCA8D1560668636FAF723B4F618936EE634D5 +EF823BEEC25B274EB5E8912BF186A537D3EDDE38F09801E74D5885919850F48E +A7A8AABBF6625CF2B0A9843E5D9A499C1047C490EDF9774F02A5CFE926BDBAE4 +18843FD4575E8634B27E536FAE9E09084D3F73FB29B9E4AC002E709986A90995 +B4EE10012F74A0BCFF2A6C0A69D945C19DF4F7070D60E3EF03508AF8793BD70D +5D4BFC8BF5A29B4339C799EA8AA64ACA925A37EEE489C7FC8A31F5131F386A23 +C63F7D3C6BB60E204B169AA01EA12B590B9F0FAAD50D030381CD0C6177D28538 +377F92029F2A448F7586C7B14BA5BA08543D8216E6875AD18E974B39A53B5D3F +157CACE3442B1948D2C44DCD88D1604D3AAF4487B4919349B7F0E01302261204 +50380294937386246EC4444C08955919A30118566A9B9D409F58255604A90782 +0583591C68296746D4DA1BFD0184029B73EC4C955C7F0BDCA08D8B85FBFA4CBA +336BA29DF59226DB39C3B02AC5A906857EFB7A227A09FFE63BA35DE73434BDAB +C11BE30C59E650592C518C0F533FA0CABAF3E2CAD23E69776879CC7A9225A086 +281FDF2C1F72FCA1723A5C2492BA061FB6D73F6240AE5708521AAB52F736863B +B05E53ECB5C64A26B277F106FF2E0C9699719335BD32842806F0F866CE4818FA +F61D141532738ADC2C8BCC1145BACFDF3BE1CFD92914C3945126847769D6DD0D +6F44FC9D966F224AA72C22D0EF953B2A43C93E581DD907B611F3005D62C25162 +FD2149DEF7894A112449FF5F43D8F30CD7DA81D408E85F89DA78C4998BB8A24A +38B9F346E5FBC6D09EDF332B8B7F8EAC363D0D01708C24655412AEB148E28D99 +D9F41076F0E7BBF10AB96BBD72FD05BA982F673D3D79270107C040707C6316E6 +11E4FB04A320621B6C3E10575FF97A28B60B30B840A877A5BEB0EFCCE0EF03BC +F247ADE0F509EAFD6CD7F70B523E6E145EEF8AC9C17614BE65934DDC17545C4B +50770418C185606C0A01B2622CADD9CBBB97E14A92D5230FB7ABE7D0D8CE9047 +F64225C6D488695FB9801EF4C76E20340721F7734AC114B3E6041D4C76C11F19 +3326FB3DE6CBF4B4C1F18B3388D6DDC000F04E195827F68CDCA2E0C411788B05 +4AAD40E3E09EDECA7817AE2B29316063C8579A90CF67D93AC158E940B14FCDBA +3B82EBE2D4BBC8A8B22AB531DDDCEF6E4104314DDC2DF028E2F09436CFCFD32D +0238D1C9C0404FD97DC627773CD8022632E4914D40283AAA5FFDF86914140D42 +0C4350BA37D3CD49E1D79081462E3701DC0A9E9AC67D712BF7CEC27C1200138C +9729AAADB724BB9FFD5B831ABABEE5BE8C270A1ADF85A246ABB9612F181730A2 +30B9886D897C2EAD9AF7E6A47DA049373049E5E4C29F5B7DCF2258A1AF341CB8 +C5F464EA85663A9B8132775E4B8620420750161C419F88594908C64A2BE265B9 +84A950C8B63C065B1FD4F78121F582EC875F396E0EC8F6851AB87C36C56EBE7E +036ABC0D89D9FE8E626646AC65DC5445EF3FB60CC5C50A5118F9F248FA15B3B8 +C8A88E168BCC5488D10CED157A8EEF8EEEADDA64372B76B944685B686DE8AFC0 +F4A376200790E0D0DB2172C80E6BF90052DE847633912F72840A5C745DA4E774 +014841DBB53EDB729DA7AAC1D3FA428DBFF252F91BDCFE3AC31C2CAEEAE29045 +DE7F0795D6D924180292E18B3955FA93DCC555683FCB5FDECA34EF0D0885ABA3 +C7BF9CC897C6E5737AF9448C952269D18AAA18FD1D3C2F5DB49D652F43E6CB21 +D22F7ACA596DE470A1264FA065C0B2CE3C58DDD168BD28D6A2FE2A41045F3219 +AE87AF49E363AEA5164C7107CDFEB8BACAF39C795D98F9855E35BEA4482F78B3 +8A62DEA5A26336671AE7D96AD413A2A5E98111D319AFF427420906C75D4E16E7 +AB85A37972380840CE59C78273A510C819EF376534266081CDCF3313C83D7089 +71BF31000698E853973A6D275A8F215677CE9EEC26B5FC21E481AB9C189C37FA +2F7E2A63B4286E1AAB933C0CCE1AEA78E1F7B9F7A16DDCFCF350514F1E671D3F +DDBB3CB3324AA85E9373060D2FEC1F218A06E4A1E6F5DA7E3B72511C5F0F348D +A221902C405AD22CF96C4A14F09BE984C710AE0472E90ED804C33BC2797D5F30 +F31B250C791B0CDCFBA202DBEDEF03C144D31D7431B7667F88C1AFD9E218A08C +46811F871812FA17AB468062FB0E478B8AB84B9C06208C8ACAC16E34B42E8B9F +747F8BBDAAE6736A5A4BC9C494EE15356CF6F02FCD2F52D4A3F9CD5B472AA89D +BF371F08DDF4FAD324B46BEA792CFD4E148E33CD0CD5C74A76CD5CB4EC885420 +AB9DF5D757C33BE1CE9AD32E6B0179C4C511CC984A5365E50E12CEBB8CC71CAB +572054A7DAEB7EFF1025B60BBF1ACA5C3A701396DA00C6F77E7B86F1BD246393 +1030F1B6A8D13F6A0D3FC3825DDBD7CE36CE55612D3516EC214AADC5ADAC59AC +054743534AC8068A67C09695C7D04341D22F5AAAC4086CF370583B93F417579D +7392D7B57928230688C7C5B1931E26E843B8FC5D2D5D09A3005C1803BEACFD54 +F5A8BF2A6CF7852616F93E05913D188AC4E2F9AC3F2C1C455B0F0D1E32D9752E +331E7ED9F777FDEEE5ECA4FA4A27354C1D5E7E388008D7C45456CB361F3E4D0C +AB08D54AEC00286398730911A5F145D7DDA76D696F1DC17C0965A4B0899E8B4A +7AD364ADCA31D1A0714ACCEBD2BB7FD77A4025EB94D4436925DC5E460EEB013B +359983AEF8637A929A04D9D5A963AE764FF82C42C62FB220530FE59018A89D0F +CC8C3E2E4B918FB14279F5D0ABEE4756C3E79C1CA70359FDA92487D42B7A2943 +3ADF2FDED43EEEF0108E7EC8778E14C4C0BD06B6687C08C1AEC415477176C892 +496E84FD5E9A7E4DB11287A9605F5F0CE1B71D3C198900C67B9B333D10F5F331 +CFC638F80E03CD59C5DC5862BF8A18B6ABA8435936A3E2406AE848EA94716472 +A726D75C94BBA07926745B20EFAC14EAC276B477B94FACFD9D664365B1CAAC7A +DB2BA6B75F4F83339CD645428F0A5F498677108DC473CA984370A7D6A9E295AD +AA68CE2D5B435915EB0F6B72A9F4D49E356050223F524A270A9DEDD0B8B66822 +C8E94A311C4A055EA18BF0292CD25EAE689C8F932226643B5085E72F5FE0A232 +6064C6850F189B2C46F9EB94966600A8B7205C654F33737ECAF9B4F3FB3CA0FA +44A85FE7A9AAB211C6B4062052C4C01685F58F0D2786585CE0FFDD1B348F2FDC +A19E31CEC44C59BFA74997E570EE0FD56629135F3BD7CB2B6466E2F031DA6E8F +11813E7118A232D38AA3EDC86ACA1328FB9F870174F4D1BF511531FFF0E23278 +9D29E817441F255261318894BB2CEDD0E6F8B3339D888A2C401D7009E7879D5A +7C6DF9C8D97C5221DC65181A96992EDF4C983DA8C0669F3D0BAA4DCA2FB17848 +F34F69182E6A129A983A1FC394EBFC31551185A750114B383E01E61CED8637FC +B4765F1791D121B8B1D08035B6D8ECB2856FDB43B25101444D160E02588E80A6 +10D55BA3B76B5B9C6B97B4C07A0AEB124459603BFCF1C50DD19776543EE9891D +9FAA53093A933077B5D3C0280679818348E77835C679C603F46714478BAFD156 +803B736D4CCB3F1C1FC2192B2EC1CF78C36FED5E0496B5A8F0CB1B72407BE183 +0BAB9171EF79069EC940B9B13F69F952EE781A811EA4A0A7FC8A5E5BE4FC60DF +45874393CD027EB52EA2DC1EC163152F3B74B7E7D62E042093CF3119F4F50179 +302EEBB352C362A6C2DAE8A251156664B492FB60A1DBB7801DB26476BCE9E78C +444040DBB110FDA2783A62FBAD6A95AB513B292920960E7F630CF7F5C2A5785D +5BE65897155D32CC657E231FFEE30CCEBFC00C375E105A5B613FD2C27A6FF7D3 +92C00B7E0BDCC70A6E80F5BA164F116A2732526B669E50F5F6BA575E37FDC9C3 +38A49BA0522EA697F517D74D533BA28F928565985AF5E32B84BAF188F2B9B952 +0C291440B04DBA34354177783CDD82AFB65DE0E179E638FE1BD2EB3EB20D5344 +C4B6E5D639DFAA78A77433D36FED5462B6B090E3434034B8BF00BF7EF35407EA +9F122694EBC6B6B4214EB779C94E6BBB04998AA57249B8D84353E0BDC605CA98 +492862A8239E8875A9BB5ADFEB966F0D7FCC355E3F0428E227D8B41945257F63 +9F6A6A69B7A902DDBE08D9FEC8233E11BCF15C1458C19F9E487314C26517D162 +9AFD021C75353FE5A161EF3EC7E06B616AF1447602483A3486788298AF766714 +939A160EAABF06B61D86CB02F6A958690D38C86BE7998B444B7A2B74C6BF72E1 +B9A59AB78D20C121D1AACD208531FBB2BE37BE529FBCE24D229CC242A1FA721E +AC762979A4B92565B6BC94EFFA2CD84985F8FFCFA1BB44503BF1265D52370C53 +4B445AEC55B12E40F05DF383B356CED44B5345007B9F3454950F12C8E87E41FB +72715838A27013F689D6B55925C49D92E0E14CBE59D9585BACC8CE5D62F86F27 +B51E89884EF529F27CF4C61A28BAAE981524CE3714368D664AC4773FF8B71728 +88C3E8878032EE246359A97DA80F1DED34DF09EE5F249B364BBA41BF81D16AAA +9ACFE092E3E491ABE1C40A53B1A50B88788AE14870079175C14AEAF7EE777437 +8F4A7A03178AAC032EB320DBD8E0C19C0071B262C76913B787E1B3FBEF926A49 +CF96ADF8E3BBCC3F679294B5DBB5005DA2294848229A557865E0116AADB4E6AE +94AAC10394B4FA2872BBEBDDC869163E50CE3BB2925B554235B6BDE9A29CEDB3 +07DFCC3D8AD0CFEBA9C7AE10314771DA1E6C3B927FB950ADE62D1FB8AE7A3CC9 +C9E0F4484D61A6C9F353B9AA91A186DB859385059544FC85C15E1A3357BEC89D +92AF74938D1B56B7120B934297A71F1D92E93658C69E7FD4B338F59FA6F6C337 +427532AB1A4EADAA5FF1A8C7A84F444F81D60557808ECF3DB67C052EAF4A9FF1 +0538A114857BBE83BE784E9865B00EE8B407AD9E2B65E402EE6CF733C9B31603 +25F2C97BE78D94A51CA51F28ED9E840F13057B1F21C30F77ED6FF458C8EE4DFC +493B64190AA9C8B22C5977FE16F31C3ACD5CEE976839E2456916EC66FCB30B44 +8FEF1B63D552E1B0F049C48445DE8C80F8563E9870134038DA5546C7E7E3A1BA +1879235D0F328957290810F18037833D7A83558C94EE9856D3D82A3AD00659C9 +3E9587751B5BF2535FA1D1A508FBF86DBF7FC7009E1A542150F8F0EA356689A9 +DAA05EACE716C3496D4D23F326D4634B24A419F483154FFA9B81DFBFCEB31624 +1C87449BC00AADF4DA13A25955485D0C7C5CB9AAF29E1940B0DDA19594A8F7F0 +033C60CA8C9057879F10A6116BE5991F332AC272834D99344B0E476F9B2034BD +EEBEAD5D1437C0B9E10DD38A002BCB01218A40844A91FAF28940BA11A40F2BAC +EAFD82E977AA41B4971C69E82232A5018A31F71C1E60F2635D59DC40B233FE47 +C29D0A2A906955CC69BCB72BCA6D80E9B84F06F618BA1C7EFE99A75FE35AE359 +730863494339E0F2239191B6E7C5E8FED2F43EF6B5789872128DC528CCC2D023 +AE7A0BC6F9C194E642F09B78D898D63EE3EAFA611DC428C24CF363F78A174C45 +8C3C91CA391D7F1AE652C2D81DBB7F1A5AAB745AB08EB93BB316CCFD7D353023 +4B7CF322F928CDD5A413D60669D062E5C59A0F2C1D6BAD36CA9C5F5D50BF48A8 +AB77EBE65D054FECE72D08CE3A0C1916AAB4202D5BF4F07998534C1CFC49350C +095D98A12E1E1E6A5BB2D3F3B6E6DFFD926A647DA7DA8EE687AF44DDC9FE4A00 +18D679F66287FA26D6AE4075E430BE22684B42EF75CD59AD72C2E97383D5AD52 +1867C37AF8855A4A5428D125DD22AE0B2757781A80EE7D425B7271AD95B96B81 +2092E92DA4D04D9E711AF88292C56E35E7FD15C0D12BFB7F244BF4CE5B589CAF +89807DEA042EB5CD7615FA6551DEC1CAB933A6218E08C02443AB912C915A5E95 +DE3E2B66C64846F9FF403DA1642BFE9F5FDF0DA4BEB832D07FE6552394558903 +82ECF4DFB28B7E5FED973A99C0AE3CC792EBD9E7F53C84783AECAC10F9AC8661 +F023093A9F37141E27811C6B33FF8614AFA7DFFEC2E01F0B3D60442F6C62ACF4 +7274D7F52AA594A3A096EAEAA2C161FCB10E0AF00ECBF9D7EA6A4533B7F8EC31 +FABA55E1AACA89E5D02114E7FFEBA84528FEFE356A48090A59AC39F358FD8800 +0AB1486BBE16BED95607ED284CE271D6D9239F3F23FD403304C19E3132E2F3F2 +B7E1323468C66444B2E296E42365A9276FCB51DE065D6196CD4ED0E45A096DA3 +C45D8DC05C009C1C335ADE0D874F714C8EC74121B386483D2E67B8E7466A8ECB +DFE911178ACC242FCF9DB814498ED313CC6199DE67133ED4EE9253C6EFE87DFE +CC9E4C6F2950F1F9A93834BC359215BB37EFFDE944344F922B2AFD7723A45F44 +DEFA4E344C6E8772EB6F9D89E850E853E8119860A6871668C8A062869E15EE11 +64EDC397E138D823F520B8475FB6703098E3F779FD6446B2E2B27289B5D569E2 +C2B5FD00FC05A609572F57D14801C5EC159423E4B0AE61ECDA938424F47E99AE +BEC534EAEF22396119C3E79AAB1194F71044A8973FF94FEDC317CACE3FC26E25 +8514B5C039CAD5B2E83C049D31C135EA4BC2167C44EA92AF8F45BB777BC56EAF +BE7CB54F02AF2263EC1AF29C7E8D548ECF88BC262AA04D6F7DF26E5EC5E2919C +52B5A8CE42AA960EC9CDFB35F2DC8FA31E0DD5FE5BC18A7A5FBAB0A509CB7451 +DD4230D95D6ABB2B914A93F42D0B17AC931E4814AA939F90E389EA9DF311F834 +8A0A1A86602B07EB1CAECA4178A885C11CAA3710B6DF83DA05AC6169364E6EF2 +BB75559A056929BFDCAD8C30CE83AFB66266D24D308A8A510FF245BE51B49A0C +C608B08EFB13973C7BE9CBBC46838DE5BEBA093863CC9B896C1761E6DABC0CC8 +889BA134FFDA108C9B101AEB88E18B52FB151DD631ACB1CACC164306CF909452 +C967430620DE41E0BA22C811F5D6D728781DAA43B2279C9E301096D58DBED1B3 +EBE39E8444AE50AF6AD2929AC1C2FBA27497A0AED80A72D515403B46DDBEC309 +7A8F8A7E1D840E4D7F7FF390A0176E85D09A5AECE75D167594FA3F7C670068FC +31B055894450460F91CF36780916C17E8644C05EFE80D525B2CCFA1FD1B5FBA9 +2CA3A87AEF0867E8F135086BF78C43BED284339040754E8091EE2FB26E58DCFC +9025C55C286E99D5CD2B1C0767F1FE0D89BE87146C8D9C21118267CA2D9E15E5 +4DF80A9E709C6E4D284AC29AB032FCE2AC173A4381E47FC8876716DB39C63380 +E0D5417D1D1ECA49D5414E93DA59754653498A27B796C04CA3B3DA37D326EB09 +5646C20F0CF2D34D45758CF49BD7CFF0D71294BEF0584E87D06D4C069A7D9256 +B5AC4005F524A46A97574FC42EF2F0FD8382C26A385A3437FF85525F80711A14 +B928853A5DB29B64475D06B1CF33ED36396BC1FDA09B35E0857B2424584D5E9F +A1CD56B852D910C67EC88AB907BDD4F94A6CDC9FCD1CA1ADF7D2D3D3F4C8EB88 +EDDB632D8430B157546038CC69FEDD9FBD7E58BEA5507520C9D55910A656511F +273BBBD804DB9AC2CAF9D0D02F6F9420C7E3974B2A7C57D74B562155FE7D1679 +904503BF008E32DE50A007251D27461F62277E50DE498C0432B48F3F8AE9B589 +919EE62872BFF2DE14850773B86331895AB20BD96412A52E9B87D06DFAD62EC4 +ED02516D2FD8866B41140D53B4AB65DFABD08B96E7FF634DFAFFF3403BB6ADAE +947387754DE0337BEBB7CBCC8CD4D0BE5A2FECC73DBEB5A3684979939F352E06 +CB07BBDE49096A91872C1B77BFEA8B6686354E53009577C2AB75BA32D9E6A6D9 +1D2324B105428EE06BB04B862127F0DE5A849AF6647AD7722B86E1E42C58A940 +F3A7CE22C828D84B84D80BB7A3AD87E1A16C2BEDC68E9E3ECA734840614E1480 +F70C26D8D185830FE5C1B2E6FD3AA633E5F856A4496574405310C3FD709BF92F +23353CE76FF2C5D22B5345C3AB129F107D478063807E9EC522EB4905F59F72C9 +31012EE90C7A4412D01832AAB0F8B0A84C532ABA1F6EA8EB84C91F16C5EFC2D1 +3A9C2F5DAEFCB1B00936DEA1988049FB1655BD5C1912399621DD755D506845FE +A59C625AB92649383BDDF1CD48B33CBD8E207CC63D7B4EB314354F5609A68713 +5EE512AAFE98A7329AB516F89FBA8BFC6AF3AAF189CDB905ED3F63F479CDAA3B +27A384522D571226623E887756EAF7539BD2FEA33ED6A30656A3EFE0264C2E0C +44E065EFD20E0961F86B2067FC7B60A3201F789E8712D79528CC5449D8A4BDFF +A16F13C8E077A259CC71DEA56691BE117BBF356B78074CED1F54C9E16DD2CE48 +501444BA0AF54B1C84F5415CE7863DBBE37CA30688D5B6542E9E743F8EFA5A46 +4F46FFD30F801D02ED63B52C6C0AA0750FD82ED149C8D35DB524C424B2DE7D17 +A886FCAD0D9A0EDF04EA5C4072ABB8D07A6589E9AEC0C9E1933B94DDF9350751 +A6954226F040D8D13F7F34ABEA21CCA64D59076F61885116C307A95E74F52324 +8B1E8A05358FADE97BE4703CE7AA80047BD200F59F4CAB6EADB05A892469C4BB +3816C606D39BF8B7CD0B69A5CBCBAF35E7C9670FBD4CF8A5E11ED3794308568B +174D42AA69F3FFE58333619BF448FB0951D9E627DE153FEA9A4F2312EC701C2A +9915D9434205857AE251095E8E856D01C4F1CAEEAEF2A7F2B974F1C27EAD3976 +7479273E36A7AFF9D4EA352ECF7642CD0CC31982D945EC00720286E2ABE0F9E1 +199033AAA3F9F0142F285B88B091E01249472F339FD8A9BE3ABB16DA3DF606E4 +2467780732D6CD6C20101FDE86391D4CF8BDCBDC0A112E9339FC5E928792B62E +4FBE7770C4EC526C4F5CEAFD25B3E4D1A0B4F06B516971A099299D8005C9231E +D06688D4AAA4550604F7D1C9294B74B159B6B0B15CA2A5395EF6EE355E59BB68 +DD8B01A0CC19ABEFD5337B00E8079FBD5E5CB3188C414E015DB57FAAF330FD45 +E62887ED507092202F32CC49757032D13444DF1F619FB561379FAF4931BFDF62 +3FABFE5B949829267190F61A4318678A07403A5FD9FC8C2F10EBD819D6EE9C73 +EE3D852B1DB42EDA74C3C63EE61762EE0C8D5582332AFAAD3A3BA0B5FDB17836 +9BF11422BCD69EBF2F11C67780BF0533353DD045AA551757111F11F4FBC067C7 +84486CB7A486B602F9D7C56EF84A804AA08A740E3BD2D647D1DCE018B4D225BD +DC9607D21377E450CBF76AECAEFE4C4FEF2F72A4A44E90B28D2F46FC8E549C1F +312CBB690F9D96FBBBD77827158FB5C2DE80DE51D17BB86A4E634EB917ADAF1B +00038B6028D3FCFE6805A72DD10B17C7A434C68744F19A260BFCE7C040D1930E +B4B35E0A3A8330A6E197F359CCAF0EF03502846C784ACB3068280CB7D3095977 +9BB914063E289DB7BDD5F8D50B9D8B64A6259AA947FA3AAAF20FBEB3B020B169 +8A2A68D6C899F8CE32BCA97D75E9921883663DDE2735439F8BB5B62BF61463AE +947A0E4862D480D9197054727BA1C1D3E34A0310DC8D30F24AF051A384D5CFDF +4DEA1DC83277553715A026F0B676FA651D6036886319455F265C4AD78FE72B41 +9C8A0B613A4FAED194DFE836C15F10E4EBDF0D2779B0337D54628F4CE0EB0AB9 +2D67DF7D287D233815462CBA378BB4D05AEA230DD884BBFEA756954EB0A6F304 +5169129B2D3A55D3ADAE8017B3D9CFC5687F2CE00BE59D084AB6ADDC8D8DF76D +B9449917623FFB4F924EE1BD40A536E1380F22BD07260D3BE827E62220E0FCAE +E21094047696EC4378722E62F696C4FFA6CC92D1D5F719E472CFF99995CE95BC +7D3BD9A6172195243343868EC7FC4C51DDF43BE6649F096C4DDDBF6498BF6208 +A7FD124B9D7CE06E89C45EE3162C8505255DA806684280C4A7487692862096C9 +ECCA26F72DA251733B700261FCEEEB7DDE3542FA852B39707044F5E34AA80AEA +C4F54814C72C5480AC15478E28D7898557F7FAC89720BE0C02B726F674ACD9FD +635A87EEB2BE08765AEADD636E261625FA9E93E77D954E5DBA6A2A75D431879E +5936B3E396B3E681F393669F20884B1D75CFA3714D967A7C6DA12D31E26FC12C +96CAADA06D701DC45E00C1903A8D9BCE04B19DF613B54AF7B6DE33678078C03D +F1B0C31A9B87FA42FB434F105633C646E2A45617D8352BA18F5F9EFA6DFE5A0A +2FBF4F79A0CC5ED15F8B9EFE6BFBD2F7F7ACC99A7162F1D0491ED4208F2A7E23 +1165C3D65FAE7B3513818BC46A9A2277100867AAE0DE763FB6C7319C933F92D1 +4A8F8B5B5460200FA193805D3972F18B4B3DE7398F8C0A4462EB53C54A4CA42F +93E671584DFAF63AB8B91FE0EB29A8E525C1F137E7673F632B0E1E3864E1AA54 +D22252FC1EEFA76092E85680AB35DF214E761395744BC84E03D6F2E50D15D1FD +6B0C0914E661159BA887B856C49C04993C4F3FF4530F45CE0323752EA175F97A +F4C5CF8E8F103FBB38295D016E639C931E1421762C075133DA533E5F5ADB6CF6 +AB5BB6C69A761BB71398C0E1C15E112489367193FF3464271F439E4ACA94F47B +8855971F042AD99F97B049F6D57FDDDF401551B4793C4217851444D674E2E61D +98D1D55CE1B7B00A82E16C25766195167C01E3BA58CAE1A5675B4E9DE80EDCD0 +96DB71DC7C2E8B147A22E683B900DD3EBE402F2DBAA6DDB847E5AE7D0D95D4A3 +0E5EE6E1514391A69ABCA5078C96E0895047D2242316792BC99D59EE40293A25 +AEE147A96C9B8CE778C4ED454D1E1BBB351966B1684FEFD4A8E707FDD5EC675D +96181FD81641BB578C486A0529FA2EEF184B0402BB93BC400B1A29DF5ABBBB03 +774499655178A19FF518E5241C86719B1AD5C04A0775C0620F23BF19A1DF3864 +9219F74D06410CC1C85DE0E172DA953238F83BB44ED46C37FA1841D2282D16F2 +5C3C9D3A3897F880D49BB65E9A12432F517175C2F3F12C5F44DBFF1094EA2CF9 +0AF10CFEC825F1DDBE0331DC70EB7AB9736DFBE1D6C3448B5245AD469DB40B64 +D1B89F7E083156D3B44E7C27ACBC411413D69D515FE03C7EBAED6DBC7CB3FB7D +DDE6239F8A21E6329C07E0C601D4B114BC3964D921D3C15BACAB7AF7EE202B20 +3FEAAC53D13F088A932409337991D5CE4D4D55FDE4D515EAFFB5E47ACA6207B2 +F059EE7A93965F859AAD0EEF2A6FDBB45408834E885747349244741526882DBA +7AA940C038AF5D0909C1B6F163CCC5A9601E6F7BC13AD1DE6A699100F9E2BC5F +EDDCD46C3147E747C6D6006C05988AA402A7C123F015A271C9199E3338B7FD85 +B73B31611FC6ECC10F203C91605279EB6894304A0FF6B67A7CE10BD48E44C0BF +04395105279961D56E6D3CBB3F5ABEE1F069FF512D70BD9C81BEEB62710FA967 +2AC750075845E2EC4B7826F170023D7BEC4719EA2028AAA3EE91D3E212DBE02D +53CDA397F61A4CFA58543FF5A5AE88D410EABEF0AA0CA8170AD71922181CD387 +96ECBC28C88C3199618DDBDADAB8FD6B87621B731D91FD6DCA973F2CB347C2AC +110544A352FBC02B408AF4475AC4A5792455416A6E9184C861B4EB02F6D565DC +EBA2A752C0C9EEF51CC5C0EB286ECEBC7FE5303AA411F14DF5B569A271BE0650 +BA2061861610C64BA81442A8C98B5334CC41603B00FC7D49CBAA7E6257EA6F13 +72A7FB4FEE1F7EE3B6226D7564B105D7902B3DF2BB43286B6C71A5F70A67E926 +706F301CA4CDF22411A6C91BA7EF405FA5EECA8865E2A12290BC2485714D891E +CB9EA86E36EF1C7CC6BE96AFBEF493420FAB5195DBE4DC80BC075C17A1DC6565 +AE1949B72A9E26D9E832C08CDCFB37B73BB0C80C452EAD2145E1C217A53C1E43 +6D7EB4F6D035DD6A6852F33E561043F8C9ABF09AC746E936B522522D1B5A4A70 +7A0566D6F3BF82A29918D3C01EB69EF77776236EB876853CD9C599D81E0ADBE1 +F909101A47927116919FD881015CC23E7280DF2AACB0D0D442B337952A691393 +7A7D996477A04A0A7893B22E6DF75C912518C0E80CC57D2F3011F7CA639FCD2B +5B69DAADF0882629EB56CA6823680B247C5131EA52B097977AE71829EB7D60E0 +9190E3B34BA4022932F24166659795E75AE0E286268D84F7D57F1ECA608EB49D +04B7BD31A76337C487DD156A131BCD19154ACBB7C36FD5E11FD3DD7D57684E4A +45861AEEB590967ED45ACC06D360188912A89BF7F01CF4430DC196B32F29414C +8BD6A961882B3999A3EC9CED31B063AEA557667AF65595B67ECBA01F488FD07F +4684052C4BAA9D038B4CC8FE1C1381083CB1A2F7DF95A213C46A272C45F7AE94 +47A605265A776BB5B81CA6A87875B3BF33A2E055F54E73FBB3FBC63CA47C64C8 +21D776FB9AD5FBAF9482E4A24A556B1C1F92B3984105C1C466B340DCEAAB9A41 +7869FA344F7AC673AF6D49752B7391260762B8525F43221A86D87FC74EC3F92E +BF23C1F2B04CC63F9751471E3B399B683318762DA5742988FD122D1263064645 +079F1DC46F7F66039AE0B9D42CC2B387C7C47758426CC1E35A249DB3875A8466 +198155C887D5502FAF403650E6E336CD5366FDA28662B818BF5C5E2BF484E207 +498C3CF05C037BCDC3B68D0FC718D9EDBEE4B27CABFBA52DA116A60EB766AEAF +3D16F3DBCFA065720704DB80A7045FBBCB219A4F679179B5B7E5851A4CBAF2E5 +20B4FA5B5382EED902E6CCA8EC283E2B39726C5B79AA72B45CFDF9E30EC4D5CE +7FFF76A90F2A3EBE77E017CF6418C4CA1E6DA141D974360FA597273013ABDDBC +A340524C822A2DBFC5E9551D79745595105EE1FF49A6A1E33516390A2C59FB71 +E394B13481C5179DFBC6A7E698C0364D93A8830F2BDC3C7B4B603D64BB53BC7C +67270C93AC504557DFA97050029D6D7B85EDD9719CFF04581004BC908B358FDB +6DFBEE6183A0F7AFB84040299B04C560ADA8AED59E43C2036F6DA09F3044A781 +DA12A23145719FA0B2C6AB6E10CFE84D8466BBD176EB17B5FEB793A917B3B604 +271F299780A5F33E212CE334756D9768339FE866DA429858CC7A6551B192C80C +659A3627BB903D74E8ABC3910A662793BF0BA13CCBB5361ED6D1B4AB6AD299D9 +DB7CD8E592D2D3D9615AEE2BAA6E67A46327E29298B0E91DB801832D66788D18 +47CFC4A5C9B8CD41AEA2366E8D7D19E605D0474D6A2D9C1AB44CF5CEDFF9A678 +9B74A83724CB185EAE4A58BDD2ADB9941B41640EEBA42C3E105393639D84152F +8E26E93EF7D35E028244785683C8A4D59566AB8D2FF2906C0BF7C4856AA9C3B9 +E000677FDEBAABE33B23F13077EA25E1699519624C03916E3CC0136CF3A3A468 +F328D43F7BD1C6DF305206F302936B12F3529421A81D0D5026FEA5B811029790 +42ACE0E4AA1D401D15B283E2959F3E130ADBC3262F73DD1CBC94EF659860A2DC +1D9ADB113C701867A4E62886C63FC43BEC3461205A37F1307061C62EBE4509A0 +24A95211B890842C00ADACE0B75EEAD4031AEE5EC113B7303AE4C42D0A263021 +8882592E518CB3274E367B937274A5F7FCC9F6E9D36B83784C4E17888FCDA3B1 +CC0F9E41246CB830D282370137AC001D9E4ED0351BBB39DDD7F19A78FEC3CBE3 +B875543006CEA3BF1724314ECC6AF4932DD9B5CD64A91D5A72CC2487A2F4298A +34A1DF796D1E32DE2A7F12685B33992F92886647B4CACD145FDC35C5C8317DEE +C9F58DC50E135F65B1A0A1862EAE22F1056EF92A2ABACDAF4A701543F274700F +4FD59D4033BAC20817F1C97B41466ABDAB3AF22DC3F60A5A5C1096A2ED73E84D +F5ED5392ACB5FE5027D0C3B1D47249D809D5D7C7FFCB0AD72C6E54438CEB4AFF +E7F1C42D158C78144B7073B8A1AA4AF5707CAD9E9EE68C45C32B1F2B2C876624 +163DB24823427080D1F81F52BAA3C0BDBA113AA6F24AC2F01E7E70D6F7754BC4 +BD2DE4C46D398DA4C94DA7F8A38AA2EE20A9D124291FB3649DEBB4A5476FC536 +56E85EBACF09E3B129BD41748FD8972F124DBB5821EA6BD7F26EE1DCF086D847 +82D0C7D60583B1424EC98A3B436A9939ACD437CB3B0F5DF18B4BAC9FB1F4AF87 +0854FE355E5C8790F5A5BDD2DDC835BF8FAACC22FBAA6589E843E04C2E8FE52E +AD35EA2608BBE0D77184EB4B4D211FF2CC58D37E3D7638A57551D4961F9E2264 +A7DDC677F263450D357D482B61D91D2B1EC15F6DE08864A5693707AD46266ED3 +46C1E5C8D14962B82FB881FCDD2C2C20A1AAE200E39FE74E8CAF7E396F1FCBC0 +5A0CA7EC0D2FED67B17DDE349A72923D2692B565D5B752336F4F49370878AD9C +772386F42C7E2FD66F4B8C9558F9E2C078B7D140A5E6B0D8C48E5F0196CC5D66 +553EE79C3596349568293464FC361AF011F8148B47BEB397A4F8A0552E416F02 +03FD3967E0AD6A928DC1DA73488D2A093E7D587A404F909D24A57CE63F2EE6EE +C945CFB2297EA4E331F41A6B8F67843B61C9226FC429EA62FDA4F91C98C4D7EA +D2EC09399998F08AC9C2A3602018CD28B3411218D90A7BD6A310427EE54B19D0 +2FF1A39B7363D31D6BCEE6394174BCF0CAA755B2EFEC05B962B7E28A73BE0BED +9D33189E82D125D4EB6E5CB370705430B78324A079769FBF7B4DABCF305924AD +1A8559ECEEAC4D0967AC739420C712B213B9A84C5D930A7265728931CB35C4DB +1889EE886BBA68383E8926821C7EBD13CA2AAF9BE7C5090F9D301AAFB1001C75 +C52BFFE1B81E7F415C38F560E902653714B853FEB28125DAA168ABF2EE66B6B7 +E4C0AA21E4B936F9F757188899EB4BB6AB3D708429954F706B12D928E264AD64 +1C4AB1A5C4D209D757DA7857B383FE9AC3319A9380603348A700BBEE4849D9A4 +2D7C6D49145FDAA73074B8F568BCE751C0A9023124C71F8ED7D8CEC4FB01E841 +EDEE9C56BAC00DD17E83CDF905D1B8667BF13C3B8DF717D23C6676840A152215 +ED17A14B0DB3602DF9170F979D8098412345BA610888F3FE450387CC46D47FCE +2241F9180024331FF12D713DFCE680F167E8AEAE710C765FE0F791C065DCE040 +676C53C797AE7F26C52CBACB82AA12DA9A14846EAA73A6F0F98A628CAAE12718 +A9C30F2B1D13A4FF3BAB73CE32593FD459A9ACC4FE7EAC78E893C9A37BCC8363 +D8DAA0049F383F1848F037F0250F5D9A07E0D6271F771AEFEA2FDD6E298DA77D +41CAC0CBF6871D2D8891B297AF8927D33D6E7A16974B97B7BEE5FE92ACFB9442 +3DBFC1A323C2DECA0AABE3C44C4E5FC67E31AFA32A2E384F9A158C5F5A7DC04C +C6342B7D88308F4BD0C813A8A8FF6D44E8B6FF5073F11EE1FA41FBBF07CE8E72 +CAAE5FD345A00CD4E0DF5B80A44DA6A11B271CBE994935937BC477AE4862E0E4 +0F55BD2214CA9F7186885EC69811F821109428BB851C01D1FB2F38341408D262 +F5DDC76451A7C107A725B609DC363270EAE8E75CF6BC1877F2B2BA1455EDE408 +159506B7727F9ED61D807CB758C0BC165EBA7C734EE4BA55AC6F42B6BB930FFE +DD0AA0A34F994AB151BA1815BEDB828AA1BF85DCFF99404FE4898548F2FD6DCA +E1A338E6446093AEA135A75832AB0D268A3B56C8C20F29341CE6A48D5F5CA445 +91CEBBC1E344CED028FB823437CBADEEDA3B322077A05573D60D7BD016240153 +6C28F065CB849F8CECD24377C69B42B00D01D388363B99330AF05226758AAA2C +B34BACF2F63EF54FB718B001C5AC90C9BD85DE8CC38398621AAACDA2FCFE3784 +B3257A9DCB63773B8B99076F2D969C0D7AA09478DCA4A6B3F7D8D95CEC5208CE +ECAD3A540AC0C067733557B5134B7DE5C75D2B5673CC9E3F08DE0B9AE76C829E +97E3BCE64918E5F1687046D0318EAC32659629DCB7CCA135A2A7B450E14A9A1F +D89F5C9793A4FE2AD7719037418ACDB24643ECD71D70FEC1D529A87B89847945 +F4BB9E9919386DA70484036A926DC3DE7FED1612C4B89B701EF4409979CA914E +5FB3ACD50E15AC6B4B22BE79954F45DB6BEC4CF3670414540C7F394BE2CE8F34 +1E8D02282357B6BB6DCC14B6E1CDFCE52FE38BF7FD091F44E3309D88C2CC2014 +3AAFFF868E201F1729C0303F62F5E21EF7581674C46DB63F615A57C4310B5F07 +A591A293340497C59D73365152F4F1ADD62DF144C0B2F4BBA9C04819D74CF5D6 +E5DED166D9065438C89ACFB14744EEFF77FF21A5DC2E60F8FAD10DF69556219D +3D5039A505D5DA8A35EE75094EA3930417E7F92BBB14C0948D347FAB53BD7077 +3FC6CC7EF5541D2082507130932FA415218BDD959004B5D1D9C6AC7A6D62AFCD +CEEC5F43688EF251A1D7FD4A9DA3018ED9A63520C0A0E4910C2D5B2F9FF03712 +EF45FC4AC93DDEBE9E1F434EC1D86938253F736F7991FA0E20500961EA080DCD +D2A9164A8CF2FB7546EBB59DACE8B6BA5F9438A8FE29223341EB1B1592607BE7 +E6E7FB761FB4B198F8D346ADE3B6C7F31192541D688518969AAF7C2A1EB51563 +0A233BFB89F1C2F8736E89A46DF07D64E68CD0F58CE1D698675E4A3F504F5D63 +E58854608EE83814127A760695FF30281D2C4648D5808C8C8548854474CF2F0B +94E15450CDE2CA5D5CA333BA71163E202F54DB4E6B3AFF1948FF2A5758A9BDB6 +9F004B02C13211A86F6B382A809BB726A22AE41C4E6210B61FDE76D99A5E6890 +BB1C522D0DCEB8916506622083567680F405E687C7FEE05577A8E7C02B30161B +A775FE0DB6168AD93C19B83AF6E95761BF57EF046642FD3C47CA1EDDFB426533 +5022A78E85A91D86F3B78E463B01CC30807204AEBC0E622B383DD5E2A093188B +62CBFB1CDC759D4FD7A66CDE922671D6F6F2122F39DB3C4CF73F3E16C1003688 +21838863DFFFB77EED7093A1B22CAFF89443AAA734B788F7F64BEB8B7C6E9579 +0389ACE038CF73D46AE11F9D653820FB3EEA99144CFDD4C6A28B3A86621F664F +9441664E4B2EAAA897F0FC577344FBEF2AE0AE4DB43C0CF12CE089AA00D6925D +BC8537F52868FC9EA59DF56FBD7AFD6A4DB12BD17E4B47556DA97DC1931AC87A +38A1EAD3D3AD8B462C1A76F830D7EB0621CC8B4FE740AC409EACC48BB7324B92 +1F5B2093F0F6575E4A903E2EE134E77874F70DA87C073FEE5191C118EF6E75CE +42E143037A40F8D5B5C92C55B497C134B61BFCE61D8E7AA93E66F74F0BC2F725 +A8BFD5795BC47B0B46F526E772917BE1FD164181B5731E27CB13D8DFAD0E8D9E +BE4436C6921E7AC96953F20CCEA3C2E6450E51FB088E16DA8DF471ED8AE84F48 +71433349B7EB58332DE9CB7126906B6FCC08CF2047D39986D4DE9BC1B2F2FDBE +163C73C9DF62D1335EFC64F38D42E2E4EE9A422718174189082A4E83B5C5D04D +E34ED308A2D7F8907571A40A0BF77B4990D7C1BF1CC0474C0A41876F2CA0633B +42D5A037E87BB056483D0E88298260265AB723B24DDF8E4220C8E7F3E681B883 +E94EEC6B2E77BF249CA69E12AEE9E03569D6E99D63FEAD2ADA9135B62793AFD2 +B7CCB2CF2D1144BA7FB613F00C6DB9736720CE1BBBC49AF359FD56F9E98253FC +57E2CD93BBDAFDA1FFBF9A33E427B37B333BC48844B9F7A757398D146133B416 +58DA341B54FF74D097DFB950D0C850E11D85522BF8D10BBA53A99117CC4A4B72 +A1636FEBD444F0D61397039ABDB39CC4D969910F46AD2EFB671C05C66B0C6FE5 +5FE8FACDACF7AD619A44B49800B287170D086BCAD5597BF592521B51603CF4BA +A286F141942C67471B47D67FCC581CE2F96D3C8152D4A86F9BA90EE6D5F06730 +CBCAFFB91FD653675DF525C3948EEA1F09CB6CD084D7D34F00826975368373A0 +A05CBF4F7425C9F57F0EB5F1BBEBFEC259BCA347D47BC00F90EC77A06C0787F5 +6FE2264D2E37615E28C74B5B1B96B950243C32CCFCA6925F42E921819C57D387 +819BEAF8250E117B9475D4A8FAC24ACC0EC44CD4C9597F0F852781C9C1817C14 +F38F8280AC2415268B3BFFABE7AF59B50DC33F7ADB38308F67F50EA4A74B81D2 +5FC9C14894963F82D10525E0926DFCBFBE775B85DAB7A4BF4D13E422643109AA +A93E559CBAD1DCFB01C24037672B2AA2E06433528915C03F222C8523E06A7BB5 +90049A82D9E930E77DD4BCA67A765B24E7274C45331E07D9AB8544C7112327F1 +538C7E19BB37C05C42A2AF30EE19D10E4137B75594EE6D6CDB9431B3AAA6950B +99CE785EDE29C89F94F3C0A395DC4CE31D058732DE45B6FC3D15E12E474AAF6D +D43D56FD939A8719B432D4ABC752E1201A8C1A66866465AD9DFD2D9B3AA029F7 +9B95EF7B4459F360F4F515D11149942717CE8137F0DCB4ED01F74E474FB91718 +4AFE6342F4D4597ACBADCB5E40EA16B86D4DADFDB970149C0177A943038CAA99 +D07C82504696F1A87046160F9C0AC7DC0F3C8496CD63B31E56F51BEF07C6E7E4 +C73FD39EE686C0B833315629060DFA6DEA06DC6BE6958C3F9BD1F007F64525BF +7F1F1B1D17C682BCAF0B581F0B986BD12A8C843DA6CFB65E901BA8BCBFA7CE64 +9F1E86EC50417744825150D56F2FF41E8B34D07B7EA3B19CDF906BF67DFAF212 +73EAAAE9015C8DFFC0C6EB7934DF360ADAB6BF70FF5B18F2A571B9E42A113F11 +38EA6A07CE358D0B2F4EC4FA45D3C441CF21D465CE936FAA1033E7AA407DBBDC +4A44306ACB55017E136D70DA322A115FAAE9FF0A07A3D588E48B1A571D2585BC +C7AA26DF65D9416A3C5DE75324CBFE52A76F3B74507DE787C9E9DF41FEA9A02D +7DD35547E56BD3FF30B12668BD2804F93CA6199B4AFBEC7EA51EFC9EE14AFDE1 +91C69B76727373D40C5D66129896314959DC47D672ED6B3F977E671E020BF01F +1A838631CA10118F13F91CF616BA7EBAE0C06EA8AEE25C73D4CCB7203FCFB0C8 +6884A1E23FE5ADFBFB0FFF19C532C2571062CBA81D3570761E3E00BE5556CA1B +25F2292F689E5B950288B794BAE1E15FB3284AA76731772CCD6C6085C394C5B0 +3ACF82A852A32989A638054C2E75B0E6893A880241498D3627B55F3E58761B83 +34208FA0A34738A75A67E5DEAA16597E0264A75BF6E05CE3C3B8B1B5A9BAC508 +B282B2B77CA0F5EDC38EF2D3DA6DF7646AF3C9ACB62DD0F59F50D0EDC193D847 +F8A5D40956C169468F5FC14E3D527AB047E8E5A223A8BA05270700AE1A07C3A4 +ACA5ABA29958F3CB2D1CAA9B5A0643012681D0A32048458BFBF2E3BE88C326FE +5F6AD9C996F3C82F186B5D77B4E31498CAC8EA4F6B3AA6BF524B38FBC53A2B04 +3F27EEB7854861B3EFD8C5DF19D2DE5D9C44540AD64AC3EFE729F4BE0CD144A2 +8A1DA61C8CC27BB6B861DDBB25782E44A33EC1D507D7127B51B17C7BB260937B +C4267B4CCEDF56B1FF949DAE7C5E5C3F061B6CE47BC4BEDAD0A78A952A33F339 +ED8654918143FE913EA90B9ADCB9B5C9C140DDE7E2E692B19A49AC15E7ABE60D +29453E54AEA9381B981EFD66CD957936D6C7F54CBD6306B82D13B8A716DABB77 +465EC55DFBF33839D5F37B47B634CA94489BF050000ACDEE4019C668C6EDE0EB +42985CA668123F764789075C18934790B1D1D9191E72D748F2E30E0AAAE07451 +E4D294C0106CFFBED91600DA5FFFFA3F6DA6F7C5CF3502FBB2DC37ABF30F04FD +6283BEC78FC7865D1B428F0698672E431D2A20E9FE24B1833C0EB0E82A34A1D9 +23C4791E6F8C17911A579DE17A289D904ED8AA16C8A365481D8235613B9C71A4 +26679333F179886DF86BEA8F3FB599294CA1A9859BA59E42B061255C93ECD97C +AC0E4A89EEB16A25A5FF625713F8A5792A2E6A0F537D3436F603D7F464B61470 +DA712B94735254FC69C4F4E0A66A36170EB151353CBCC3E55D392D78DFA3FFCA +EFF08200F1B222D9D9C4BF8329DEBB42D651E826BEB449BF8DEDEF0F9CDA4105 +8406F1E26BB06F60B7B00E92CAD3BF4EF06B9553688B099106932B18F7239DAA +27B747808CF11D151C28C9DA11678CC1E140DA40049190B194851F753CB82993 +349CE659FA85B8AB585EB7FF322499C5940C026FE8DEA5EBC9DE866B03C98F79 +D36AF4901182DA9E9995FE8400AF094906D52D3CFE28088B14675F2A6F846CE6 +5D5869A70EBA2AAD1D0C538E0EF7779C801F866EB96C7B5E19C67354BD364263 +B67D82983106C682E0D9A3BB0D5E60EDD6452393FF2724739D426295CD40AEED +882153073D356E2AB1F543E20F2AC2BEDDBACA73BDB5E8610E58BE6D704E5274 +D5C252A0669C56261555D0642C0937EE08329B8BBA2F807284B8777E1C2D73F2 +31E897BAD03DF7587757BE939038E75B25137471552DE0B7B3842760F441FCAB +0557EE93F87FC7079457AC62402B55E51ECE8D50F94566B1671675F0215C37DD +31FFFAE9B27B48798FFBF14D18A2C6F1306522CD8E8C0D8CFC228B3F1C17A827 +1E5273E3B5B20C2792275DDD7C17053AE8DB61B679ED2780740E947D5DC47B27 +D35F9B5DE0166539FAE75DA2179F3F9EEB39ED0452E49A35A1E1083683BFAFFD +9A066C4CEA4DE699EDF570C9208892E0ABA87784EFB455238BE1A6A376F64252 +82EA5B523A8B2E7812E3253C2B6E1CC4681656561179A4C95B48E97CA5F9A39C +D255209D9F7D80DF55AA3FB99908B46B101D509F3BD513568A4949920DBDCC6C +70ECD3BA39C44423D02B4E5B13E9F434545979F7ECABE6A6FBD131E169C914A4 +8063C6C9748D32E71D0A25FB40C764ED26450EF49735E12DE893F302FA491B29 +D5154B441D5C61AA4AED88F06C63D52409DE17D7D97C572F7579296D297B9942 +880FFF44810390ACD46FD1E090A6412F7BF21DA7CD3B166A845890CD887F607A +1F04BCC7F4BC3107BCAECD61825A959B61E62795CF4E458EC63F1F2235C64D60 +C62FE46E4A913685CEB2DD7B25494832542059ED9DD0849029BC1272582D630E +4310F978FE6569A4B9B97A7BB4BD602D5D32E79727ACF46429CFF0F7BB8EB39C +DE55DB6246DD9DAB7863DBA6DD21EF340E19727D5AFE9026C284326BA0D4D9CA +E015056824B392BE8B930D04BA60B58CF4A683FA14850B6B24787958D1A7A42C +7C33C1362DF20AF31CB88F0F11BEA022C609D9575F71EE270440480E0AEF6207 +733236DBE9454F088CD4A01F63B6B2C6270DD08A13108ADA783F2E7067B7DE4C +C34AE192B05F68B0022F5F30583D9D68754782186E5B8FF76ABC451DC9EEA08C +52C12642165408AEB813C00DDF6C27F4053435F2CCD8CAEE50704DBA37A4AE42 +9B7960169B0C865E92D270A714449FDF13D8835FC1D4C03D7FB376ABF7201BE8 +A593576476D8AB905076237BCE2630179D158F04568CE4C85734FD0A1C8E3D90 +272F3A65B556C7C803FAE8A0C82756B99C35C06673210766A8042682C873F811 +CCDBC015005336EC438C3476B4AE13715DDF6F7034D032D29F2383E005F6FB4E +19AFD4A02BB7A79917D54519D37BE66ABBC156464898583522A4D63FA6DEF194 +BD4B90C83470330F8B5233C24E80CB64C13C0CFFEE81E3087A4BEB84FC8B152F +44A9FE7D4393C652799B12A2C0FC0842861B1F1B656E802CF0C40DBE95350BA6 +32341D0503CC7CC3348953723981ACFAD95E18348CBAE09B630DE4247F3F7A7D +E4A0095D461854E4CB12840D355912AAC33A5A04C833E20005C2A71509AF51EF +697773C2D5C8F958893B26BC64215E4EBB7350166482F29539AF54D860C68F3D +1C60ADEA814E869E974E1B78114B091134589C089A2CBF12ECF1E31C4122155E +A90587849A11C46DAB620284D66BBEE187B61413740176EA8F914D6923AA0A0D +3C3383D95EC1FE1587DDFEF289B4BBA9EE208408BACBF5FA0A53BFFD88BC0529 +10631201650A258809DCBD5D136E038110AE4B818783716501CC5DDCF42ADC23 +86382A06F7FD13F6E99935F9CFA67D49BD51A2D28E1C605DEDBEFD24BA337407 +00029CDD5E8808F6EC2FE5BAF3BD3995414E9D390092ABDC355B9CD4E80A8DE0 +F104658871D0CC6A7F06CD149A0FB36F4C1F484D5A43AB44394934F65C216EB6 +C33002BF7D0283E798813065C84BB8EBF6E19A0855F0E146A7ED9B4B11C9B89E +48465EBDA7CAB38EA818991CA0B07182AEA5438ACC95823656CE47CF932851EA +3B0A9A2DBCD3FBD926D904749F62E27C4725410E297D9CB2CE16ED4B32AA41B6 +888B1480C538548FB6EA68D3E8221626AE219EE5E998B310D8820AC61CB9D9AE +D5C1AEC7C3CDC305A5E88E028AD21C6DEAF272ACB93916AFB42081E9C46F0C2D +98081D7D0CCFDF2A3062F218582CF432DD75BE9622B1DADB99B5801F709E2267 +BD5E0E1511912DA7D888FDC49C2137F65D5C1A0AE5E10961CC392307890FFA8C +3CC9CE5B898812BB6F0AA59557E352735A2B11D6CA98017C7C118D1D460585E9 +C6A2C132A522F0632B5B66CCDD2572EE7378ABD5EEC211CF82EF19D151D290E5 +0A0B3328C699746960A0A7BBF540E6F6CD9544581D879186CA576E3CC0164930 +264C26785042123F5784D2CAE377233A1387A3B4F8D868B40171EAFE7BEA628E +7ACC740937076C878F76BB8EDF36ABE98111D319AFF427713EF3CB8F16464228 +C083113FCEACDFAB97AA3E193E8FA750FA5024B674F63CFC58073BA959137339 +4B6958AD894CD17C4DAB82CCCCF154343270CEE203E13322D3808321FC02051F +90CB293FC80FE9BCB853738AAD70563E124CB39F9935AF590ACF3F5FA8560169 +2572D275F36192A5ECE86B988D6133B0A1745D6D386937989850DAE1E62D09CE +7D24EE2066814DB161F6103247EC2E8E065940F82E1E984942184E68E556A120 +23F52C75017514BD176AD60F29DB768E9F1B3DBD72C89E895432C39D2EDEB089 +3692507DCD57FCEAB7031D391E5CEC454D5266D140D7EE0CD151F9CB042E044F +FC95CA7AC869B4B04DCE1AE9D5202C36E343B1A2AD786F5B7D0F1AD1E42C4C1B +6E6BDBF86F022D90840FAFD81604C02689B3550AC41AE36435B29CB823D255E2 +EE9BC538502D18ECA40E1F340D0E9BF70C58E9C775D86DBB6BAE3D3EA1BCF920 +6ACACBD4D2E960723EA3376AB2B077010C1E685F759A56E9B0A84BBDBBD9A0D0 +FB4B0806861C272DE667F219D8645EE294FC321D8E373021BA63C1003CE2D689 +D5855861A575696ED7FD601D114E602735DEF72049400119E933DE8A1198DD94 +8457A24FBD19FF5D21D169FD99B6F6F6A2824F8D1653A13D5BBCB9B11E36B8F4 +2F9DAB2CAA39AA9453279F8D222EC4AC8114CAF0F7F58736D457BC01DD915ACF +7D9B4AD3D90F93256C4C9E41CC15A43B71E26A8DAB324639FCCD3E082B580CC7 +B7F2A695D029161D2F3A2A8963EC8BDC0E6D256BA06F08B6D48682CC9ED169B3 +58B063D8D7265C15B59C3DC91EB307F33FFF73C3101AF250F3CCA40A161FB3A9 +B698F261E9F7299F2418D1DCAA1400F7BD3C74AB55316F22593595649F3E9C26 +6F903C6C0B74D96CB7F92CD33D610F0AFDE14516105B49F1A43BFA558BBEF71C +2FE095E954125172B6CFE4C6390F701738232605A38671424723A68F13F2B94E +2FF970C51633660D9F5B00FE64046C85722B40515F34E44F32D18ADA4C85315C +2461D81D8F34BA7B13227E865B7C24236A16D9C6E1F428998C22A43D3D0332BC +55AF05204EA352710B199C0F1F710C96C72370CA7203A2882310A629995B5D78 +D57D695B654A718C5268E9751C7F848CBCF87776ED10DEEEAA32F50769CF5BF6 +58455F8CB9C793290D7F8A38320743F0E87CF2BAE8A07BC2DADAA9F61ED6EF01 +6E24883E78AFD03E23D3A9E77C62147447BB772B4C80C1022727A9C863CB8A7D +5C54C057BE3E148FDF79659CAA77229C438A163D366F5CA9F857ADF98F9377DB +8CA7CE8F361E5A553B4541763D9A6102467A059DFE0004C350EBA6C8FAAD15A9 +3C68C30AD52BC1496C4C214B5ED4E537C3B25DF46166E1B22B0185FBA3F9507E +7ED64C77517B077164E6661D73E441ABBE1BA0F68D8B53BC8337879EB8C08F47 +A579D32D0EDCCD91CF143F05CDE56B87E1F2868D001648513BE0FF3700732AB6 +CEC0CA78BE25810FE125B5542E407A984E758EBF4A3FCECEA2434815F64425D8 +C8D0862CD06D88B613434DA7CADDD3D6D4F1739E744B4DBB99C08CAD6112F0E5 +4FDFAC2B8D0D75A7A7AA5CFBE2C3966284E9D33CA71043357CB951808B3453B3 +B140807FBABE8F6B89A99B329D84E21F14F5D0022C0AD05D24B00CC2DD560C03 +AFC9AE7BF337FCEA66C41BC6A6D3768172C30F45DE176C1B4EA57828702857ED +DDC1953FD25CC900941214ACC73A8878EFE63AE700ABEB0AAF8113675B12D8EF +E370EBC067F82917498DD9A5C6B080AC066FB0B209C52448CD68713AB98D78A4 +7ED37127959969CE4C18D686B8FC5312BCC6B5F4B375DE186E927F42AEB377F4 +E96381BF6906E4A24328DA33A3C33F00C7034C53B10CEC70058D312D3EBDF1B7 +C81E0972E77259376669C71141162CDE55F5EF7E4A8A95A16AEBF41D00740055 +FA8CADB6CCAF1BF0850C4A11F905AD3287BB90D66E2878C58F00A71DFE1334B3 +3FEF4A33513070FB9AF215BD26E039563DF3BFD597B8723545C52570E863DA43 +8303766D7B0CC6EC75676C77516470F9D83908C0F91AB5DDF2041BCC68B1D3F1 +652153EE95DB246F151F63D85410B6B5FA265937B373A085AE2C42542287C17E +7FEEC7246F98BF641ABA0006F8658956222A9E5CF6605A3A93E5C0C97F43E679 +321F598CB94963C49AE48BA497D99B304D53F40D605D17DC12D966837825B070 +6AF66368D569B2BA9FD4066A155970E0A9BFD8F9E4645A41EE98391C5A2819A4 +CA09ACF8A056B5F65A4EC08DB490EC4BCCABF6D5ED8DDADD250A704D8D0B70F5 +D54C83A4E971792EB7A807172475F195836A9184EAB13020A8924232C95C8C54 +5852CACDC34481E182F98C3A3102EB6979B8D81A2FDA248D74E76B3C8900D6EE +9EB9AB23DCE457ABB1829C514F5AFBB43435FB2B4E83E6FB0CF79F24E93591FF +59AFC759E491A9B569A1B1EE3D61CA858357BE7215484F4504C6098EB705BA7B +A38C7B683FBF36EBD39987C5447C4F5074893D934C59A056D72AE4F0A363BA09 +EAC3C4AB6EECF15BAD98A0201CDB4F836206F64FE1B84E590D6D4119D2F7B548 +36A2B3EDED5A8BBCD95509EAD11F6F43FEC653F131CB4AD546A6B7096353B016 +FAE4C3C0C8AFE9E541291104425A1DBBF7091AACF5F539F29CF261F27DB2F2E9 +96B170EBD139D7D9BD009D6DC3EED26EFD5F0FD4F46F590B3D218F0F54F324A5 +C4FA31B4DA7340302287C8A3F2417F02C6324F2EF4A7BA2612F343EF11A4B4D8 +C3D6CF3DBCD272010AC01B525420CADFFBF2341F22B018515D954AA24E026A00 +AB3B5045E73440ACD6A2957BC5835009A310C7C85DA385C498D5D847469563D4 +146E97EC0FE9F8B5244B6F9C83B6E1DAFD109EB7FB1AA5AAA3A3ABCBF4B4FD5C +07B5524EA0501EAEC5D280688D6FBF1441317C2EB2DF818120427B4FB62A6AB2 +68FB208350BE986F805CC893E6C3F0B2936152B1E7E19001913C0A9F821C345D +6873A92FDF009CF16B72FAB99632B783DD3EE5317C30D3363C10569FED1519C6 +78F6A2343B3152C4303321F6E2158C040C7877C7514F30A15F052D3C0EB1794D +17A5BA81039F0B0F3CB0093CF6FA0D7389DB279018806C1957154952901F41D5 +C9786A7C0EE76E57189A58925CC11B9F79C17687198674B2CDBD77AF4E0C528F +21E588FBDAE805AB5ADE20E37242C55D6ECB9574C82A6044BBF8C649A39C5512 +D500006733919C4FDDCB5BF3F586E6C0DADDE28524039187CD1551FC7E193DD8 +B912AC9D6DAE8B1FC859C46D871FC08408E2ADAEF7A361A47DA2DC64DAE45B96 +AB720474BFE8ECB8A524FCEBA21ED5A28A01F90F6D28A7D40A4F1A9C2A7A9820 +12FE8B0E532D637F1FD9E939F124A8322AB92792AC25B2C6D5964F54FBC0E882 +9B4BBDEBB7895CCC4DE40159121E2BBEECBEFC1E83E2C386654997A9E9947B7D +38EE4C03C5145167E554DA0A7EB0FC8F4B80D822C321D7574D05A1289494271A +501FDE3325B7C87E1D24C34E08B799A073AC8361C9D49A02B564126065A7D550 +07E36365337A08E65AC7130BA92D6C9B97B12300F2C8886F55EE9C434F7768BE +5B9BD13D87F2063E39747F10C2CDF8A60B9196FCAAE79FEFCA552919AE988A2B +B16705FD84EFB22DC538ADECFCCBBE8E1F58BED0588678CE1A0005FB3F5BCB82 +E5519E9D23ED670D2D6BDE06E36D0EEEE7D78F99BFE25E1A89145B138612C8A4 +90D0B41453AFA81C62DDF3B21CAFE3C9807275BA3C5A25E74FFBD61A092958FB +CB84C171EBA5F91D31123B578780AED7E074BCAE8DEB9C10900F2261F198ACAD +72621D416CA2768A0851FC0F5483895FC84FD629F1C32212528C966DA662FE7B +8DE8D4B261723F8853A5BAF63276EA472698079F7C8E09908C614A0B8BC680F5 +9EBD5DEB3866EE4DE76926BC31DCD160224A056BB6EB98843D2AA129A3B35999 +3A31A60727B74218771BC7594DD1494E8B385F037F1CEEF0E1F413507E89F426 +A88D4D599B8B7D40E7C90A2CE00EC61E35AE94FD68E165AA4B30F3163DA0B493 +18FCC396151A860D96AF51C1BCEBBCD15C711BFB5A33692D7FB570F044386748 +6BF849598D52C58F4E963263CE9A9F64E8EFABAD9FE77B69C1F62A418E7DC918 +87470BE747148D5D3B5C718F9F49E2F398E7A2CDC59216AAB2F16FDFBA741F9A +9E0FDD43CF376DDEDC8FE833FE4CB1D5E27B7CF160F2F22A05A117F348B632CE +B9C299669607C6A08C86187B78A6AC4A70C5D6A204153B346D2AF6E4DF9175F2 +31607B29E99B5641BF3A818AE6173008066844469A0837A35C227DA9863D9ADE +DD2314224B8C3296B93D698D0B5F980EF4E1B62C30EC9760CBDBFC0277A242B7 +CE7989E0BA910E13734EDA04992F06A0A77E8B20C87EF6AC80A2AB7C7FEA5768 +46D2BAD6C8CF1D70B9CAD91EE7FB2F88562D6280C12A1B4D32FDA0A422E248CF +220ADA5A2AB5597B312386A58F8A21C3ADCE6D5FEE3F9D2A4363835B07527BE5 +BABF7FD63B05217FFC7ADCF2EC311F6B91AB091C6C963255B4B8453897C5D8E4 +B67CEA88C09C23A3FEFCA3AECE9B7ECF02DF65A99750A337D1FC2F13D198247A +D892F0D9A6A06265820AEFABB3F0729AC4AF8062B916DD3ADB87121EB799965E +A07438A72CED4E5320E6706DC2CE33BA6085DF0F9C788A176571DA3501A15929 +C2214FFA20A0470B9CE8952CA671C1B717A57B48CC839F5DB4A6D66248D182FE +C6D0C89A8CBE513E0AA41595376F70DC4EEA7ECA38B8E44EF6BAD64F6C15103F +A7692126DF2BB08AA38C4B90DD6C39B0B462A4B37729CC59B85105D5C6309749 +F1C93F8B2EF214F2CBB58922F050A80C2EF0F7A0D332B5F5D0209D7EB3779828 +F94760FC65E0F1547CCEC5159B7F751637F8A73FFF9860547CDC94040F432FF3 +0BA714B6665EE9F20A8A56C3D3E6225C3CF95D24079E41797913B7BC1869D27E +32212E244C9E9184CF56CD15A8F1EA694C92FC45997426F19201EE37CBC2B24A +A8015D92E29308FFDF9901CFD5061DE67D85AB5E9E5752356F4C98AB864AF589 +389E6B85C439670B28609810859B5EADD6173159903FC65125EE9F444ADD967A +CCB73B5C4E153C81110C5578C552D914E05DD3A18395087CB147B1985AABB2A5 +A2D97BD3D050EC2729E4B2E05F5204C06E266F552ECBC4472B0710D7A431C3E1 +0B7F89FBB561D42487527024D0F9AAAB4CC4233DA4900FABA883A595CD445101 +45B5F4088B21B546BCD6C0D6B757BD8114A7AFBDDEDCF923016671015D3DE3D3 +3759EE001C9828684374E20D6EECA756DE290F6A020E09D8C411353231FBD7AC +E02EC25A5B7AB5C681FB95A03D79AA01CD91B0F58CD3E3C723BD40ABD4B9459C +4AADA21BC33C4F5161874616818BE67923E3FD3D65BD18D4F90691F491B4EF3C +34DBBD11D03D396A086FE67F18928C5409FC0298D21AAB0779CFA7440FD3A083 +7C3414740EF7654EEAEF51253FEAEBCD7C0D5958E1EE340A298902E4B23E5BA0 +AB47D6B8A41DCE006A4E3671840A4C077E9E948AC9C1FF7AE26D09575727C2FC +8A2EC23A7736665DC4AE2BB65B475640BE71AC6D66BA0971128E7840654E715B +EA8C8277C1BC221590A283EE764584DA9AEF65CBB1E52CC41736378F1E294C44 +0701F1977AD8F5F8F2D060DEB4FA32D9D9FC53408522F74640D3444BABB39209 +68C1873D6E0C0E3E10483D67CF70570F55FF4A111F0F4EB54557AAA79115E31D +8D682671241914FC07D431201AD76319A849D53640C5E517AF616A157A056CF0 +ECBBA141AED25FF648829604626D52BE98AA9B29EF2E2382ADCF9704D0B2216E +D7408C359B159E84389B5454AD8E10E4C62C592E052590DFEBE546B02E2C100B +599FFA2942872097FB093540BF7786E7D45A8B5EEAD6D1C1118FEED2635012CA +178A40DF6F626F6596CC773954472F5D4CBC310CCC041E384304ABD270BA8ECB +D04051004C71FEB557C434CF3773FA9750F5C2757B7F1CD17DEE48B1437B59BC +30E690522C3045943D45EA6E51A4EBF8FCC557261689C562BF8705780986D2FA +C866A3FC22F941DAD2820912C97510B1CBB1BA36839EEF82DCF7368E382A4EFA +0ADD7FE767994941E9A5D7CC44570DAE3CE7A785D65AE2784B079BAA5DF1D7ED +C870EB560B792467C72C874601061E0FB3BF003101EAF8BCF7BF01F6DC3A71BE +32D391649160BE738A739FC07BE94A0241BB41CBE04A5F794C37E2F5C258CA81 +9126D73B4471411D4251283EC936EBE3F8C28EC36BA0E38FD4136F779635E95D +8D5E5C4E14C680D855DDBB8C1F90FF30BDC971919C7E6A93074A36D88561114E +6C999B1CBED051B7675B6264E27EC4A015CDE54B0A986250A21271BFF242B675 +9AD36175B01E120D43F8A60FEB9DAED5A70BB4FA975450097B966F1C95F2BA44 +3071E1057B6996F53199879DF834EC867B161334FD281CCF75CA1480F04DDC4F +511E6EA992114990629034D590C97A6409B520A5E78BF118E11B2BB74F1374FD +F3415AF23290A4FC3DF6683F1D5663B17260850FB1E307D670CD527E53BB2CB4 +40A4452BEE0F4BE7C62B0A7074A5303B534F3BBAEF96C818A3BCCC30B082B502 +55B5A82FC5E0C6EE660EF38167D9AFD853D48500839B16E1FEE13BB232D55040 +0805F63323C6D228E192B6DDBFC0A54C19C3059E16EA511F33278AE666C403B3 +BBEC3B9F435A9752984B43DC4DC6C5AED25A3D2E73B10B01BA097BCFD167D4EC +937DEAF6D992D924FC03B53A70EDE75494FC0EC27A34EF8B637357BFE6081EC4 +9731750F93B4AC3D1B3B6FAE7AE7D71DE3F2C0CF4D734CD43DA41A24DA7E7C46 +A1E76C9C1005C0313797A2C620DB3EA13E924BC71B2916C308533834030CEBE2 +E2CAF5AFBC7FC6D6F0D12FFB290A461F7D262A1F620AAFF509F05705D48FCC67 +B143ECD4F2B0D61AA00A69B700209F2DE4988323112836FC1A75409516F86D16 +3D36C7B1E7C4995E19F0370586B4C6242C64E9604D541B1DBC252F782D4F5BEE +A81FBFF9D7A49307E2265AAC20501FDE30BA6E9C949D5095DAF00ADAF7BD67A3 +77BEE10C62F19F9CC3B0763A9B1A62EBF43FAB15425E7D7AD7E29D9B40FCA346 +096549B43EF7BAAD35FA663928050E3E82551D502403105F7881257039A8D67F +1B5934CB7FF76D879DC26D6D9F8DB1412E04A18CCC4E30600EEEF35557E73FF0 +B9583317CE899891CC608D3E5332E0CF05C754FDB2256BC946EE256607A1550C +75907D32C995B1B54A243617AE98E2BA9C042B7ACFB4919970505E7482653F4F +F780ACE9308C9BEA60C891C5FF175E108C45301C588D4636C09AF8D6AF016450 +F66E262673314125FD1459282BA9A0EC01A7305A8ACFB6FCC254BE58DF6CD19B +98483D77048A3DE933F94DB60CB3D89A7404939FCCF918464032EC47402AB1C0 +DB66E1F48AADE6A3DA6D77D6124D75B84C5CF556AAAB07FCC2DB87262E5454C6 +4814F1933591DD4C29841719D334BB11281B94E5D44D234212C3A7A42C2FF04A +9766AD45A1B0498D0DE841D0DCD7C02428806F6F158B7C69B92743892FC693AE +4A147EE4E79D6F47017DB95262BBC9787D330D3A4A8A85EAFB909E197177EC4E +F2DF74F543EB7D97B5EB6534D7BF16D16560908D8408777D96D88741604B2697 +67E91C3041645C0843815BB87E0C6CF3BE2F8244A24017E6C2114EF0F51BFA97 +15353712C0F388552A853B285DFDE41F352F5ACF474B8D86491C2F2977FDDB43 +1F00F9C05C87ACF8D9F9B56C3617FEA2E7D8D9195C2C553A6863C734145D156E +FCC1D17572AAAEB4B0BE5CE51D10BD4273020DFF43E0F1FD270BFEEC8B2BDC3A +F16B43FBDFADB690685A6891B497412EDC358CED9589836AB173BD20E984CCF3 +59759CBCAE3825BE4A428BEF168DD88717837503804BDECF675BDB8174DA3EAF +EF5ABC8BAE00FDCA6F1AFEA1C03C14902D0FD9BD67EEB2F344A374688117858C +DFD1AB9A50E7F4BE806C5C5BAE3F07B8A7F3D4F54A29187BC6C38520895A823C +4B5B184FBA09CAA547CD661F6B4BF98E68A630D403D214374C554737AD7D5994 +81149DB2480176D618EF15E0517D56BA02FC995E85F2DBBCBD046F723D52903F +14B617472E7305E9F6C223D78A2F477C9D065181AA86FE051F70F7B52A3D82F7 +ECF18D48DA8C17870E8B7E543470AC7BE549759A1B27F31AB30C68ACE22BC9AC +E147F8C182255E7262EAC0D1DD1B8FA888D0D5CE9E2780C0280C519AD761AEB9 +C5C3FE40DBC65147F680F9D2F6B9AF3BFB5D075E91CF3A092249EA71774FBDFA +FC479A7148B477BE528C3667F0C3CD9C1CB9ADDF4F4AC8F93E1FDAAF3FE1793A +24F95BD0EFFDCD59298BA7BD8DD48A718C660E195C765E450380F771183B302F +F5F27514863F9FC48CBC94306556B6DAF16D54F9CEA9C45A8D28AC6CE2CF954B +771BD117CB67E8F93D933BD0693AC61D82BA1381D51AC427425F8791B779AEC6 +20AA9905734C7688F1B1EAB3F1F713B14883C48EBA0E91A64C7EDC850C1A6D7D +186F405C48125A77377DE45AE05B6BB2FC42849EACF6F6F9C003EA93D00B89DA +79E540A2B9BD52113D41618D7483068F923B847718FD6C516000B5B51769787C +8DF0B33977F61AB477861AB8D493ACCFF30D4F39511B0D9BFDE188FBDAE805AB +5ADE2C628E6E047CCE9EC352CB63964DC90905AF18DC3C7874C337AD2184267B +DF974A6237B97451A0C77410EFBB3A8A3D55643CA08A8EA2E0AC5F0A9375C461 +E4B343F80CEC40568C521447BDCE1A2E5D45408B47E5058D328C8BC323DAAE9B +274E797685343E37583F2F631BB07A8B954A5124FB9B90EAA7E22DEE4EA616F0 +C65C57864A3AE70F4E7C09328B845F53AAB943138E005B560EAA306EF67AACDB +122F74773D084FC0FE926AD1FC0C3EBC9BA82904EC2D6596EA65F4B3E4B5BEEF +74C3CE3CD45EAC63D7202E2FB9EE03AE4DF5B30E0C78AA18F38EAC73045DF537 +03D558AFD6CF63271F3AE844614482BAC4A34CECBB873F13888C35B29652E763 +30087613B8C3CF47008FF0C2B4DCE7B4FB86D0B968AC4E98882EAB48F41F7197 +9AD42A9C46648EE7F0F270C203E125C92CD0FAF9ADCFA05AEB08A69DCCB712CE +75D6B6BE60839492D18BA28DA2251A5E5D3D9504100501B32AB001F5D4AA2991 +ED06C8F063F93B888D504C5596CD273307730460EB46BC5FAC040123AE2837CF +59E9BA4C2B1E83412CE3F9CB5E2FC7DB0D15607276D93B3738C549619B17C0D8 +357FD5094A703B74DB8D61525C3FC1DCCAD810F5E5278897DEFAD47FE30350D0 +C9D3D830D5447A8E52AD2DAEFFD2279EE01FC95F4C38EF18A6EE079727FF62F8 +7F4D2BE5B80CB0B14DF3281A312EEEF077584D7FD2F0C06B6047934D745F3396 +AA7ED80DD3B1E3D1FA27D68C68F1317D30FB14C6D9D5F31EEC05578C08949A0A +866D434E4C62087DC082C036BEC3F9DAD2A26BF89687D537B58A9001CF3324A7 +75022AD2F66C9F4200A5EDE0314190F6638E8F7703B25C0912681695CEF8AE5C +E0A8D860526C6AAD0B0C3CA9CEABA721C69D93D5240F186B849BF50843DC098D +9F57A70E3B2F0961B304D771FFBDBE2B5B737FFCE21DB8EAC51594138F63A104 +9994DB21D186FC4C317A14FE9FE9FDA16B9B9B2F94E1E8A9DB232DF8B23C3704 +53164F61CCC22789D30C7145B6FAEC3D0501AF29B4FFE749A091BA859EE5CAE9 +9A404B19E949311CE275101FC885408CDC12C46AD88F530DEB6FC3DBC7929613 +C5FDB899B93807527A6CD8842B09E701E3C2BDCB75945C4B2E473BC4DE2C9B07 +5DBF4243D35E70B03A26DCD0EF55282E7993032441E8B6EBC5EA8923931B48AF +3A9618E3E6759C2CF32332BE904D74B41A46B53EC579A8CD490E2D94BBE4131A +89BDA47D0809830EAAA4C6BD50D146AC79909979E5716F768D1D95919C6AC4C1 +A63AF5CFE0C31F4E8CA5BE704EB74876DD3E8BCA2CC14DFF2C6D3F15A5A66564 +2416789B275E6FDC2E93EBAB3FE9448FB38AF02F3D37D1C9105B03A49DB0A86D +275CD3CFF32C1250335100991700B0973F3D5E54C39D07D260C2FF3E054D2D5A +728CA8DF72801940AF4F129FB2E5C4F32DAB16258C3DDF41B41334304C99D25C +D164D565E687B6FBAA406E001BD778939720B725B29B0444EBB2E22AF08A50FF +0C00EA68F9D4EC2C0DAE1D0CEDDB9C7417A413F5173326DC5CB8275021CE6F04 +5A9B58A4D50832A861CDF9C9D31525D35A943AAF66A34877DF57FB6B156AAB19 +3EF93C8C4B8394FC0A51732AF46FEC3497D2D84B19F64AFC3BC52B054231D5B9 +A34D45FDBC25501D52C6ECC63492962B685FEE3BBB6C2DD70A84D704CA35D745 +467E73C8E5B6A2DD66C370D412525628174D5E10201C84C9C4DC77D0FC4EFF73 +293ECBD31C01A74379DD9C4F90EAAE5FF84ACE13643356755405F66C7361A2AD +8600BE9E98A52536FFA517A2D4AF896663E6B930A66E2DFFF2C57D4D7A5C9F69 +F3154F6F8375E9803060CE0D4C45AF6475E53920957BF365961DDC2DF476F74B +5149BD0687AFE0786B18D2BACC769E28A6E2E8BB1E3F284992AD1F1DC058AF02 +CC94EE0845124DAE980E6D9ECEAAEE1849027B0684DF492F168C5DE0DEADF4D8 +9800BAEAEAC9168846D852C49387968E86D65ECE24D6AA3B60A64CF86484DE06 +F540D5FBFA86BF810EF5DA04473E8E25345AC9A12424150EB621CEED8B1EB090 +C76FA51610E7CBE23C6CDF040AD880B73F3331F85824319DDE430C00AD7F809D +D408879B1FFFFDA10384BCC19C8F3499B63C19DCAF99A5D0C2A948A7CB69E094 +5D3A79A06DCD7FE2122D3B3E646ED2032B8F82DBAD82A8563C5667A5F015D31F +8FA8AF22D4728672AEED085F88DD7DE8BD13B0E7D0306969AF29AD850E149889 +2B4F81D1592CC36DA27A29097B8F720F477E6F9E26DE7C265A54BE07E036B7F4 +ED5E303876C82496C2C5396679DF6A91802452F079AA8E653D13438B214AB47A +282D714843AFF0B74BF1F72C4F7EE4A012EAEE04A82AD8B2EFAAA33A87977644 +AC4F6E5CD474A6C8B08EADCC1665E3FFD09C78FF30CB4929CA140E04795686BB +C985F7CEB0363FA650137E7DA8226A45810CA44175E66ADA50A0743211D3FC9B +11B4EF4B5DED09A3CA69E48E0ADCFA5EAF749DF18AEDE11F9046A8629880C9D6 +38BA9498CC17F4DECF25ABC9AD80335ACCFDC534C82A9A479EC9074A1D9A01DD +96D464E1D630688755587DCCB5E8C1AD4032B4EFF0E645E2E2329D08128E3D11 +C8D22F4CD4E4783DAC3D6BE9AAEBC2F4AF3DDB05020796C972677AB90AD7E8EB +9FE96669A4615BFE4BB77CC787C941B7A0FD430AD5B9D7B63A26E954A28F60CB +E380AD0BB4724D99F3F46E73160555A2BDD7FF5BE83A2312F7B04055EBE5B2A0 +08FD96C4C90DD9A06DB0B3D5F570E8CF4E9FD7FAEF7B5042A5513C1988E63ABF +B3C8E1D8704041E279CBBF208AC23385E97A6EAC8BC634E3F9BEDCB3EAC4C57A +EDA544E06719AF5BEF69257CCA51FA7840BE8E21F66707EF31300DDC70717F44 +EB2DF6070007E7B93D1357ECF8ABF097B757524E92D31524638E69E63B2DB200 +4BA1E338B284936557D6DF04AB23741BCA5CE6B34099FCBA07CAA9595DAF1E8D +F10FCA58FEBBE12F8E2FE6A0680EA5E6CE0CDBF9A1C872621CA4C10AC91E3F55 +14C3918E1D32A2078CCF4D109ACB79C3FC55E3D222B9BC8E1D0CCBA5DFF91B1D +76367940D4CB4CDEC260F3152E03A86FEF74DA6A1DB82522B496C177A77EE9C8 +652B0B6DF023E60401AD8614ED9D77224D822F4B961EEAB6D9911922311131B4 +49167FEAD3E3EC5E251618F7D1986069847C7F1E7503E04B48DFE249135CA5D2 +8903F8C25A141CBD2E7117332EE320DE0DBF03946FBA0DA27F8DF4AF8771699F +696C489E8AA7EEE92B7824B5A03D8B297F9C606E64BC376B10C5C606106CA8C8 +B764BFAB04512AA9510A361CE189858A9A565276CF007EC6BC1C7ADCD6C4CCE5 +CDF512143002C6C2376D3CB2624095DB10CE42032BAFBFF7FFB6BC8AC5EBE973 +02520AE31D24A36AF5C897965EE3922C280FB056A36B802E1FD49A7C590F9A3A +2D699F0DA5D50F8EF5C01779953A5BB88EEAFD3DB8C428C6514146B1B55348E1 +E2CE1D3D4A13A84A240C40084EA97B971EFA414370BFBFAB6F6342425A324388 +7DB7E4A7BF1FB654BC7DCB56C7E1FAB0848828B86F5CC8B069055B76986391C9 +76CCF12F945173646F85C1676235855107EBAD75BDA3CB3E655BC81AFDF3F629 +F79687F72BDA04FBF6ADD00F9A1F21C0007599A177F46140D6004D06F6CDA03F +F087938716D4D6B2806985ADCC344B17B976547AE0F745FBF4B8663EE4F39196 +4B21F9AA8442DF78B1BEF23166510DBCE4405A20DAF5AEB09C4ADBE05169A52D +839BA7B8CC777A0E4F685686F344716E2AC2940282FBC795966BEB564B018DD8 +FC56F588AD42CC2630ACDB1957CD2F3A461AAC09E95A549144809DD7533812A5 +7A8BF8BE337EB618E11D24B0B2C34CB39BA93DBF0A588DF611669ED72B92144F +FAC3BE40B7B1E56B38068008B17DAC0C6648E5868A965166A798B9C918B5FC67 +E60AF10D6191FCB156411ADCCC75010D56E7A87C95F7C1CB33EAAC7231BAA719 +B927473D40BB980F3E9D304567305A653290423E74BE544D39BFE92E0CE23BE9 +0ECCBDD14E74EDC3C19B121128E807299C64E68391F13A96CB1A418A450AA9C0 +982B3B3CAC83E11C8A6CABC01F5F358F2BB79578D8298FDB47151007756597FF +0574F3357B719AC0E368A14CC91F6E65108FE1AF6797DA6AE4CA52E1B15890B0 +888D8082B70CA6B7BC5FB7AD9262CEA6FD18611AA1D7378735E923A6A45D1869 +81801E21906A4D73AF8D397B6DFA28F52355FBF16BCBACA72DAF170FE4CED247 +F8A80C1CB66BD33BBE1AD30182305ADB2A88BD5F9B435B472AD6564845EA9CD8 +84738801D498CF826C540664BC8E87B868C982E49D77916CB87E10AC669FBD19 +2CAEFD9113127041479C98CF1B2987A45A22ED99B048EB76AB183714E069D51E +6DA757A9A4E17E07AB37FFEA7618ED5E583F4910C7EC87042E8180DDBA7CF58A +B8417BBCCF198AFB196124807215030A9204771B3CAFA90876A5193F954D73ED +F0BAB43D936D0617D804B6B2CACCE9FACD2035141808E583A6E4AD03FC1719B8 +7BC89A97156B32033B9A3538E348C8D7A59183132E9BADA34F1E77B2FC8CF783 +3ECF3E24FEAC7C7BE1E236A94C9C44CEC78DA17D4D33BEEAE1A76CB5D4F0DD8D +93E332D493C6D6ECE0FC03CBBD275441D61AF9A42443355A369A0C495CDB74E5 +AE071679D9DFA6715543D3FC1B6E4F66E5557428C616047C498DA9F50EFA1683 +AADCF6B403F0EF9A78F1F8F1ACC478D0B5B66FD60322C5AFC4C79557998FC714 +41AAF6009A53424935C0EEEAED8CB4513D8CF9AD3B52CF941989591FAF2696CC +40F1887F8EA77AEEDF67CD3BAB4BF1DB2E57087D50A1F5944942CA5CB7085240 +1929A28CF489F26F59B850FC78A647287740EF2755A91C7196E4A53063C42BC3 +575061B2CC994D41EFA131FCB266A9AD1E18DBD854F2B99846EC903AFBBEAA98 +B32671B08856D84FBB7BCF5B82D245F7DD6459CB437B4183ACA555B4B274A63E +158F68D8873925660D260B4C7884014E735B72EF322D646C4CF5EA4917CAAA18 +3FF6ABC26D16ED118DC4F1B85B3405A6EBD15C1A186D7C7A9A8D22F6F03B5DED +F11167C738C758092C6BEE44D03532AD27708884E6F3EBD040A906D59E81FDEB +BF0C0AD4030D661DDC3048CF4883A59C362229EAB078978F7E62B9AFD9E329B4 +822CCFC1DCBC7D0714E5EF2B7BAA7126894612E5D1F4CE7421DB0580E8C3CCCA +BEC8DFD6392E9575607C895CD9FA1D78E92B634D62F3FB5DA75BA65958F720A8 +C0006A580F39D8B63D7351BE480B24B3E10318BE8780D486D3AE2E510217A5A0 +3936E396AD22D01D611DDE5F0F5140BB003D24599E9238397939ABC3833B8B79 +5C2B8CF9DEA9F3DB71377EA34DFF4A7062E91BA9E090A815AAB4EE3CE94A4619 +488EB722ACB22B32C391633A9B6BFFE656C75BC7A9DEF0E02CDC56DAEA9597E9 +360562717D81560E24972ED5E8C9CDF7F54B30792829A9136D2CC9B1348504C7 +A2F500383EC033F4756FE20A8EC0B1B0643F8644C1D871AFE21412EF88BB7497 +C79E3905528B6B2F744B9C9F10988BE7D061F5A5F56C72EBFB94A5FFE994A2C5 +D0BBD6F79F2BBFC9B811D6B4AAF40FE1D3FA6DE3EC49E0F24EA9490D6E3F81E0 +B56FC8B4D6EA1A0E899A9C1ADE24693A6D7E4C214D0847E8C0D5B31FB133F4B0 +F77BC331474486F8E4A69E970054D0802BFBEFA856550D95FC2CA900F5D6D3D1 +38A892C66D541937D24D9FAF5F54F169E5E78BF181F2C2E2B2E2B5D6E0F21727 +1E420D2E69203BD76417DE9A70685382A0F3329FC26C671537CB07764D1165A7 +6E4403882716938A18DEDF1292F688F657E27FA8E5D86821978DB65B0166FC49 +E7CD5C8D1C6AE1B78EF02E8A81B51B20EF5BFA1EC1F2B80017292FBB6168CC82 +871CA253ACEF6AC823372F41CC766617377ADB19FD677C46D7CCABF870DC5DC5 +0366E0A5750ED38A2A86811F9852E9878A95D3BA0F6CE7FA2670480B6523BAA2 +ABAD6A9C2D43E2BD21F2EE7222D21DBC394EF4CA9FE693A5A77CEC2EA60645ED +BA3BF1ACC360B253C970F7BB86281CA813563CDEE08817DBBA24059FF290B550 +4F803469E990F5ABC2F66726E7D04E00D8E634CEC60EFF5FB69ECCAC20C2986D +65F5ECD610BAF2EA2AB937056DC724FEAE337F5777258FB5462F3C94AA7E94D0 +FCA0B0684F884D7EC6ED8BFD0AB95BD5830CB4ACBFE139AB0A0C1C288A318B59 +A9A3E79A5D1D8A13ED7F632C7E52216E16A331101EF404489B2B095C0F787063 +9370950775CA15495982D882396417FAC4FF86355E203F53B33F35D4A5175EAC +A78FC91C980A6AA5BD49D87043C4686B224D0535C816ADD1D48BB45EE7529E64 +0EDB35B4A27C167DFE994EDFB41D9D166802E37318CB6D4CDDBC73F7CB30816D +E9C645E32C1B7513199F8D099CF39BB8DD762B6A947AC26242B3D51B11971F72 +DA4F942EB19C883CC0749E1596CB89A1E6EACCB35594FD8E272F1DB7529B059F +FB204FC404789EE182D117AB303A886EAACAC08999B19367801BA5622F5443E5 +1EB2903D603F215C9355DEEE42A5DD29C5CBAF1BA1FD52B9F8E1FC5DED7DE91F +34A4461661549339B595FEF063BA44CC0DE7428E131CA38106279246F5B9FFAF +B127B9B46B1F5E050133071924005746AD3D6AA91E4A0E75E5056AC983A6141D +D3DE44D5B37461A76EF6A8906210456F13FCD15203A80AC071FE10B2F064145D +0C7FCF12AC9EDAD42EDF4E327FA57D6BA92607F41B7E34A7DD27945B4AB2F0EA +532AA886EC057F98964EC0CC1E4BE095ADCF030B1952293B7B6465919A833D52 +F24EF2D9BEE963F7A33320CE29D54471526D4592CB09B0DED834AEDCAE0B629C +5BE4E13337BA87E9D64D744CA5CE709E528F7BBB7C35A3444D643B1ACDED2F6C +F4CE7ABD757F477BB4F64459886814743C8872DD2312EB952D5DAD81B0A6E52E +AF1915A81D5DE395BE25B24412ACFA3C65B7E447BC4B801B5531218BCA18B0B8 +D72809B5B3DC921B2BB0B76B91618064F45F614C3B3E0506CB24DF52FF8F2555 +6B231AD0088DBDDE51908430A8102E0246EE56870D08C960E00B9D49CFD7D751 +697625B30027C82D4B3AD0AD5CB90CEE2A2FF301608967581CC45FE77D67EFFB +2508905DFB42A0C335D1FFF2FDA1DEBE81C39628F53601D9ABAA6211D044F930 +70378306273D11DA99BE820BFF208CE0A7A81447056FA422428A6A21389CCFDC +5FC34E06B4EA5D9C5DA9AA401F1733E2CF6669B438134AF47130FB9838208A83 +668067B89C9025CC059E73C6B4C332E1D70BA59A83EB7E4407D000167DFDEC42 +8B86B4B1D5772DBC673CE5F8128858E46EAD3A675BB5BACF61E0D1114D5AC0A7 +D4BA9FD5C37FE37D6823A517F39B1FB14B01E38597E51BC93CB836825ED1A3B5 +B841CAF361302234A2C3560FDC71BCF6D8832A1D74AE60806863BC1F3271640D +73A10720CD078DAF15652B50716C0BE61EBDBA0AAA8A6DAFAAA327C69C29321B +251BF50D418596E84DC3BE92542887BC0785F6128085F019C1FE9EF33E02A968 +DB0504FAF26E033A05C4C37E5946EC500C5941F83318E765DCBCD06D4A09B208 +56F226B0C8A9C55B6EB087C936F7237FB2A3D2A262E9C6F95D454AB92801BF57 +B5788CD2C0FBAAF274BF5A8BA908CA18EC8FB5C52368DDBEC42F9C3E6FA16AD9 +6D4CB47C2359309BA3B458BD05FD4FB40EDF6B495DCE6A091E780B328BFA995F +869B5ED92BF513511C6DD88690114C5F3626CC6824ADD9E2BBF528158995DB9C +08888D928E420016C254485603C49FEA0D26E34850843A066F5628509183FB4F +78C3E0FFDF61E91C984D23DBC5677442559540A798E820E3F1BCC192456E9B53 +72F2EE0EFE321115375F0E43AB35256C770F5DC063DC7DD4CC59CECE9E7F3BAE +BD474CC7AA33FAEB2920A44D78A51D3B75964A4310F30CC0E33018D3E365F947 +A69434C67400EA09F40706320D603F292862AC24A488AAFAB0392C470C84C912 +11BD82A3A5A3B70D3DE85F3095A6AB122A930F8014AF527B71B424D29E91123B +0934BAA13F0765A883CED744E967B810EF265AAB4F7097A817E94C580068AF35 +C141EEBC26D24754BEC2FF730ADA142BEAD3DE4292E93A359E701D90EC594E6C +D1FC795EE82FEC8FEAB7D21C656D079645F36FC9FC9D7C8B35B0BF424FFCD466 +65CAD025F6C31398018304AF29117430B8745D8372FAE966404129C8BDD5F31B +BD827695C491C7E6D7B15867AB4C5DF488CB9628C6C8C114293337043B1616D5 +6F6B6C5F75238B27ABBB0773565A686BFAD3593BF53BA7C8272E1C597DBA0D6F +D16517424581069689EEBF47641F9A0E3E7367423FDD88FDFCE78426A0D3F0D9 +942F66169B84E5418C80585989E407B5415EEDD8961BABB8AE61BDD51AE60BCF +033F5360E7294430CDEB05DFB40C382D28C9834782B68F73FE9C129B7AAEDC38 +E3B6DD8DC041408FA064E0AC4EE68A7C07D96A51A1B7C65CA28951E38B58B774 +0312CE987BBEC2B3C6F20556F7E8066353CC46D8AF15DA8D7CEC2DBA8A3038B0 +BC09C733C76D095F8BBA0EF44D6C1E397B19A866364DF8EAD8E2E0E7531C7525 +8A6451008591A02C59FC1DAA7C83A3689A79037EB90522FEE181763D496A716E +C01C78642DFFE2589D3980574220F09B144072E6135DEF2919CC852056C82B8B +7F8EAC363D0D89CBDFA1B40505F3D356EE16E5170FBEA46B426E3D88FEBD8E23 +59C2FEDC109DC7A300FAC3EBA750BF6071DAF7327884D3C7467A15189AF18DAE +17F6605DDE4E2B2F3AFC641503E4DFE27F462705B356F7C17E1AA0E3D26C56EB +DADA9BF8B1E7149459B958001093DE38391374A78BEF8951DB54A69964525693 +63C5017ADE86C0E2CA89BB581FF57D0370F8AED9C95E326F88533E690B1C591F +ED30E893431F6F615ABB187130634BDAF94568E2E17613658D02B29A25F35F06 +7FFA714B60A56D2E9D586D4A4DBCFF440A2B47B179CD456EF099A34A56AF169E +5CFBC9C59516407286B2E11184F91EF25925C9274A6EBCA6BF38EEEA96E27616 +5AF1E9F5E84D9888F8EE35119C43CD7F02DA23C130A2D1A753A2D1E25E0F7478 +1ED3F6BFE62714F53DB12D15138189D0DA31E79F18CDE3FC84CD6D6B5EAF9E23 +F90A1703C6C9B435623FD375F926C8D013620432174B8C765299F6F08897EF92 +F129CDBDC3006D3755D3EB5D2953E182015BED56819D5A7A1773CE22214CC7D6 +0ACECC81DB66E1C6AE9AB70B77F6DABCC09111F559DF0911A87726B44AB063FC +1CD60C964334A97E2A6604CDA700C112450389FADEC5DCFC12980381CF6BD92D +772BC45964247E3E39D087B52FB67077AA8197EDDA4F613DD43D1A3EB7D6F686 +8528F7024C7A22B61A33E43502CD37E91605E0EF16D28A9A2806518B839433F8 +1802738E0B1BF0C7E95C4C1500887FB099834FE6DF4CD9A9D7547341A6D8CF21 +F49B9F8E7A9D602644B31396A7270C989F1A5BA9E3E225BE1F592D02D8AECA8D +79C304CB010A2645158654387C77AB0083D08A3C0A41B29453908AC57C181431 +101C6EF00A8A55B6CB8513DC8ADC5E2D6FDF41990E6B3DADBB607CF37411345E +42D0DC8AE568B2DAC69CF347B18C175C0E91CD34ECBBBF3DB1B5E6CBC17AC9F2 +8F77337D91885D14FDA32EE7A7367A3A382E8A894A9AD550DE350398FFF2BEFB +C05BB7A915B8DC4AA5AAFECCBF716F518CC608E1E76588CC77359CA228596279 +F95055FB260502B1377E1AD575D3C1FA65DC158057E071A56D2BA3BD77998B43 +938DC18257C526FF2F9625CCD7DF0AA3D50730B35720E75777DEA2175017A503 +A49509775646DC8D8926A75D64548B9E9C01AC33502A7BE04BA31441D5F39CCA +F889AA4D6B0CBDB9023F05B39DD7CCCA53608173E9DC5D45E772A3F7B4F7C4E8 +C3F7E7DE51770B2C887F14C473EB4F1A2FA420F64F4DBA1A6B651625F2AEAEA7 +8A030BC2B65BC4237AEE381DCD24B6E9940F39EF1D4BF81DA1A25140BBA7E1ED +FA371277B13A016B264B14833BCBD14E6B3F71FA822CD0E1B174B569ABDB6C6D +CAFF1A208C8E409623A051033AC99A06FE1FDA685CAEFEAB404804A701A702DE +79EFA5F9DBE3587A2B8434BAFF152B9F18C574FDA77AB286FBE21AE741813B4A +CEA10B071946CD4EC410BEDE7C68CD0B5142C2A99C836861A5B6A07FFE60E7E4 +1201B9966CABE2B10E71888FB8FC43FDCCB882DC2792994AE178B6129F23FC45 +32BFF56904E68A53B85FB8DC55D917C7DDA412625BB28CCD6A74273F5204CC07 +962DF7D462C57DF81738A8AE709F63BAE35532607CDDBA7CAC46F6789CE52010 +D84412E3CA30A0B8DDDE45A1E9956B4A7A8199D3177B5CF715A120FBA413CFDD +ECB451EDF3DE65A8FC8069D4D1F65890EA6D6969D8663C5909ABAC85D4941312 +CCDE68C63BAE2DC990B6D119FB0A8ECBD5A11C503A668FD66168BD051E55CCF8 +D0022F58FCD3B6020A70838B97BA5A54436F41D26F4FB60EFA36F9E632BA44A8 +A21F57BD665EEAF35BA65A4F2090F3D831E14B9164183C0565DE2352C00C1649 +0796E84BDB6B679DA065AAFFFBFA67CA8AE9D024A3700959262EB552C67FC216 +E61CEE4ADF9BADF3A38B4A618BFEF4CE0F96C5C382641C99B706A9BE793B24F8 +78CD09F4CCF19795F93B8B35AF5598470124204927C7EE6D3A87E05F40626F07 +B9521BFD489B136B01F406BCAC98D60130A298C5C455B0B2CF05465D268C55AE +26CAB1A2D4D740EF3D90914D334910DB05B5BB62B6863A4CFAE3834014D94C38 +F8E20C677C6A8B6BFA4B1EAC29EC87CE9E3E08C458219FB6B719089AB6982F75 +ACF33109F84FC1C7F0F542FB61F78587B7010265B411CCF63F00EE397C6C9D39 +2E33E50B1182385C79773956ACCB5970A8758638FE8069401540EA209B2D5AFB +3B20D9B33A51EECF3D65F0DA2C2063BA2A2AE9164761FFB5D1D36F2E21F29F31 +D2852443F8C6316545C9D413F64466CD7CB3D0DC23B5C282FF5E2F91B63B7486 +83800E8CF3D07434DF16557AD530DDFEACF3CEDE34C7C4ABA3278E815297C7E1 +DBCBA8FA4291D43F1D1AF0E35B0E09A2AC97F10A93AB9F2510BB690E3C635D2C +986179ACA326D19BB958BC60382A9E8C765A978A148CF02403C2C9866D78F05C +3DCD029540EDDFE623C9F016734B8BC19BDFB039BFF4FFF409DFF33F62508298 +B152FE332127EEF6B236AD5C1EF9B145849788311477ACC365D9E5848626DB26 +773F93F0C44AEA8B014A5A7125D09E28761A8720DA53966B251BE1C1534599F9 +B246763A28D4F9E3C52C33670EE390FCCD476419FA1C4429B31C055EB8072D74 +0C1FF3311293F931EA7F73A35E870F6D81D0FEA3CC445C841BED7089A64EA42D +947359421B7EBDB671E2E30306912EB99A754AE5BEC90783DBB14BB0FB3FBF95 +25BF143F7C9D9D6DE690C88CFF219075D9F9698D23A5C428F7418DE625217393 +0B79113E1D56E74ECE402015E0AA9FC320E447AE0345FF429359C48D617CC9B4 +6FBF2F72C9DBC94794BD9584E23F757C49425E7665A1A97CCB278AF1016E4969 +C813A40590E738E70C5B732537F477E9B80B3860B6FFD35A631DA0B6BC84E4A3 +8C1576C9EE90FE2E5FFF30F1ADB9581C6296D442FE1D3B3526780C5F70F73E07 +0233A3C769F74334BA6560ED81163307DC4AE74060B736C49BD83A837CCD7EF7 +44EC891EA5828026982D9E56834A3663150A462939E6557A5AA30C47C4EAB037 +589BC1710A9F042AC39006A5170B0DB0A952257D231498633D99B3D405C2A4CA +D064E43E50ADABA18A80301460C2F17965C5EA3DA09A7C96274AA1915FA9E98F +059358763626AC7EDFAE84B026CC16BF40296FA76396148C57F5C0E219B759A9 +33A46A922233E0AD0FC248DFEAD35B8B6EA330B97BFB4A6AA6DC27DF5082AFC1 +C17A6DED72F61D0C7F4DE52A3AB13734E55A875946F6D36703BDF1B917A758B1 +C1B4D00A52E890C43A7B8C0BF725F82FD416DC8EF9BB6E0487D7682F79DAAC6A +C9595E33481A87C6CFED013243C5BF92AAF6D700006F608E30CF70FE9E9E0835 +255F9ADC616A0218C7D4892B9188C61C801889291E17344448ED2D8C56095302 +E71CBCA27D70DC38B8BDEBCD7109D47FC1B6E6399F07AC085BE592FF9B5E4960 +02FDEF5F965785540CF412743E0C71126A68272CB23128133090E757249854BB +3F271F2DD8D7FA66985F9C380C104FC3A1A69A0CC03E2AE81E1EB3C7A2C3C297 +BF91DD1A6E2B0D3798C3535717F8046E92EACDBBA1ABA7D68D08AD31AE673BD7 +D10BCAF3324CC5A668199904ED903BC88746F2995ED2F5B1B49C73C34607C632 +37FA574A1F09D9C42789077425B8153E8F7F36589B1EB8917C87FC29A5E97E14 +3FAB4DA5EC20C38DE0CD0863683B58DA5C412A72C1BB8280A9236A1600BAC9E4 +BB930318B55E3006E5371157B1E2567C9AC8FD1FE196AB8AA86EC2A27B5207F9 +81AF2F85115BBF22287BD8A041DCEB89B3F5DAE811F1740D010C345F53FCC8C7 +BA7C7D685ADB01AFDB0D30CE7CB0E3BA122B9C8FA4F2CF4C5BB5793439E57137 +9D2E63B6132100B459F31D822AA742DBA61B8CDACE93DA530A66C034125344F2 +DCAE69E08FE774A5E09B29466898ED616EAE3458478888DEAEE12B6C1E2B1228 +A8A7C9AD6658D0BDA20DDFB0B4D831AC61CD216A60DE294C7408F7E34487487B +B462888649DA65F548C6EDE671FF2967FE50331006EB5E3636EA8998384CFFFE +0CE6AE5DF4E49ACC5574C73223CA5904DABBF73437D55E2353AF9F7B17E33771 +775F67FF5C53C5D45C40E60252F70ACBDDC054CB3867AF0BA7B01EFACB67933A +404D56C53520278826DC106956E120A34A7E2B9AFF2B46C2AB3E64FB38776E2C +456B5901398E5BEFC7CEFC35AA61E497CCEADE62360A0EE94D0273636A6CA4F8 +F144CBA6697FE4707361E09ABBA371A5FB8D8FDD319ABEAB87A5C3AF9889AA70 +B53E3C5A9565AC1A2F275EA303D579A0221004365CE864634BBBDBF5036CBE63 +3B5358E8DDDF56C65BB54A9FDBA710A10F9E6C505A2D8D11A6A17551616EEAD5 +679126F3C7D52B17EDF2AFE286454580A34F1BD963699F1AB742DF7CD9EE4D34 +17DD8BA2497BEE1933B02EBED1161165924F04915D1A9D227B719AD876995D88 +7C67DF53C14C7FABDC5B4D773CCF361BC58413765E7DD21A439E86B74795203E +24ED7491AE6C9FD9CF3310D3FD1E91FD3F714013722CA2B13DA3EAFC49A2506B +58B3B2984A1933CADDFDD10C628BEA54C798AA4E0A84FB4639494814FA18D79C +147BE5E688F182B901F9730DA6C8CF362F915F69CC74ED4B436E5DE3924D7DB1 +6B4728BC39E8F9E0841865BFB0AEDCD7404D48ADE9EAE74F6C1E9FADE513539D +9056DF8B2F6168A86405EA4635C19E128DB67D6F7323BC14A983FF1CE808B4C1 +F9226F3C6521310DED43A16EA768C8395E6584E90C5F24857BD989C1C6C2C248 +06D4BCD3C2E271C7AF22210EC2A3EB1A73509082819760E2AE9950D761828F9C +0D1DE7B23A9DE64AC61F48D45956B5894815F0DE950FF02FD0A4E0355900C665 +D1FE0B411D4E34B093E17AA8087B606AFE7B2E909AED96B799922953C8416148 +7C3CF96E27365C3A4CCCD78849CD9D9D498D7747EB8AE8137B16178BB67B7B36 +E41780DE90DC23072DB8916BC8C778B79215212719A88744DFF9AF40980996AF +379552BC08C8FFDF6605FEBF9B3CFB6D3D27D07C49554DE4844981DBF08A43A5 +DDBC572CAAF60EF7F8C4137C38B057E1AD5D953FA64E6844EF770A9B19B7E643 +F376273E028EDAA0729CD722C57F05023957F93B281F91510ACBD72F476572F8 +B66681AFF60DE653F4C8BFFB5A9076447AA5676C08828D7C6AB803AE9063423E +3FC8F0E7DF5F8238EE36A7B8DBFBB88DFDD587D5C9133B69C6E4B86D4FE42886 +F0BAA809350CC835274614E4DCFAB77A8AA83916E5B65351273A69E6F9B5DB39 +205E3A62C2C4F483B3D8BB2C4C7C72E2ECB6E024A275DBD82F5A1A9ACEDEFF4B +9C5175BDE3DC023253026E5E321A0F5867654B8F11076CBD6D49F2A7A1F45420 +9CDD551806DF00372B4D0426EF46BEA85816AB39246F38427431D513FEF9E143 +64F3A06ED9F59F1F0C250C9C6D45FD2B6C69375E9E0B89A4478A5EC458E132FC +433E8A93D3497DAE9E1AA0AA7CA895B8AF67913CF0D13310DB883D388AE9A35F +F5780A0AB6D55CD9B976014689C185E9455AB5B9697DBA8B9132C517133CEA4F +CE40FC2BD4D9DE31A6A5F60E00C781F6763DC03DE8D159CA70048B8CF6D1EBB2 +2BA6966CF523579CF5FE324AC1C7C12A50A8EE71A55B3A6078AC0EE02E877A02 +18F886CAF9FB51F29D01E3F4AB961E5515454D05490F4C57AFFC4E63C0D1FFE6 +C4BCEF8F67066A4284ADB88E569F0E7D36269A6A0DA678CAA5C1B1A4BDD3800D +FA3E3624A3698300BE00884235A996F611644E19AF114AF29E045FF2E4BE248B +7BE9FB19B64B2DED77D5CFF8D85A332A33EF073BC94E30BD78AACE2B40C9E04E +1E88D9EF0F0116E27E9432D461B64FD5F4055EB420963FDA20CB8D746B6AFD30 +4C70C4DD1AE440D04C6DE4F876BA09591D1A7F7F5755DB5DBDF1AF0FBB9744A7 +051885F2F13400F77297D66BED2FB53CCE01B56A7B0F7A74DF38BBAC0BB556BC +9EF9F4FE429DFA89650BF6453FD1B6F472427FF2F91DFC218BA4690C55CD23FA +C7E2B86EEEA984E0DF8ABE65813C6E9068B878F22467E7D981601238F82A43AE +4F61CD56ED2C3828D7DD53AF88655ED8E00FB33795EB13F5A166626D35A94AFA +3EA4331C79B44C8AD4E85E8A58248B83FF91BFB89C64CAE2AA2EEB95677B075E +3772681DF3F512E315C7266B9B6DD3C38619E8F0813451BF48660E137FC76714 +F799E17380CDE5813B4B6217B0D0A7763A754065E2CE172EE6DA76FF5038C614 +0050F3BC4DD98CFD8C0BF526ACA742F4B79B53708DD52EBE58B00CBAB52BE921 +C131A671AD85BBCDE61B97CB147D9786EB2C01DB4425E827C3297F9886BA6354 +C526D89B6B4629CF7DBC38AEF5D3EB58E92A7BBC14F796778BB3ACFC654E3CD6 +9B0C5EB8B24C3279D46CCC0A3EEBAC870EFECBAB222233E62E76022E9C80C109 +70517E245561033028135DE10E1BD8FA0BB9E5FC89AA5197CEE50A98EB778B63 +BF0E7A97BF243FC8D6952C78192F19753BE77B576486D491344D4DC5172F9655 +EC6D86C591840E8B90AB507C63A7942A88C5301C8E7C9AA2EB41BFDEBBF19DB8 +A905B90FEBB86086E2E01600FB897AA3EB954761045B00DF247C796EBD4E8E18 +41894D9F62E4C8551944FEF97BED212B29FF795A02979ABF453C0E83C00AA39B +E95AFEFCEE23B58571795F0358912C7396AD8E05373E5DAC0F76AF1B7A5406CD +2D82ED5E0F014AD1512DC75D71DCD22443E7A071E27A52329A04A18E12E4191C +57DED26A8573ED0BBCF6417D993269E56241E45E05A61CE72C63252D908DBBB7 +ADCABD21921CD36B6C2B1C4A5D8E6ED8F29B8F6AC9B8097F477AD77CE01C51BA +00BE8E44D5B3D3389E4ED09A7327763E7F50426CECA5424D243AA8BC7E7B5529 +9D14434148B294C2441DD0A926B678211EFC6A48EFE84130BD4D15BBD2CF1388 +B5EF11940CEF3CDD4AEE073AC131947B960D716973E63BB928977EEAD41B80E9 +BF08B06F0F107B4DE2828FECF7370578FC116F03ED602FFCE688FA6D25E274D5 +519B1EF07165FDB10CB32D3748C33CFB601C98D17F274887B554A596FA9B3C3E +63A7C426779220BF013EFA2B30448FD9B20790F87A069E0704A1EB4188A4298D +6A7ECAABF7F0454E3E7EB98650C2BB14D2B08F2265B439FB20C74BD93007DA70 +EC6C445351BD0607997666DA0A56A186859237F9BCCE4F4E594BC8A81E6E22EE +5A58C7B349DDCF0F753B3DEF9484B841DD1428881B625A4E28CE54CF896711C9 +4D380F508081C26CC9090E09C9C6BA12FAECD7074E2549779CB6FB88EB1368A6 +F709F6A2CECFFC5CCF48CA2985BFB1CE3E0FA2CF5C3B0F612869171F3649ABE0 +20837D908FF436B01AB54EE132A8F0D0ABB4C1015FE6ED45575B1573AA3F9D64 +66B521470DCD5C73ADBDA46E86D6EC5667D2AEEB5F7938F42018E1541822E475 +B11180512375AE63EC7BB000883043513928140A23CBB26658A6B0521F8B8DBE +2007353A924E762BD8DD3AD901D81DBADAA3DF3C2ED5AA2163167AEBD049390A +F4459FAD558F3FBB3B805EB1EF332FB14F0C677FF9CFF7831F203383DE4CE7BB +8CBA629180AFF36228D3997BFC97E051F2390791B6F5AC0B5AF929107EF3CEF3 +00894DE1693653C33B012583EC5FAED006BF9410510A709594D34E558DF5290C +4A36633EA935D67A351630E6F75FCCFEC361A8298DD7C9DA2326C8EF247481EF +20B8C91013AD02613FB321DC00C7B9EF87ED8AF212D769C0EC1D8F116950A60F +3FB2273E4EB993A8CFD3787C86AAF54CE86DD44A9A652307B7EF8BDFF73942DF +F52AE037D5D9FAD5E2D673F4346921B642EADD945164F8B8116C24D7A5EF8845 +0D1199AA2D6C6346075E1FEA51B351F6688DB0F9D3DA6489C34C9E1493038281 +D5929568721CF3A309C21FACDB7B4AC9BE329935446212E060629507D78CE8C4 +C5BA819D284C6AEEFD81CFF819A14C445BA6DFC9549CAAD4CF56FFB4FFD46716 +C60DA7F437EC08CEA0FD4711D745892ECC7AC2FD5422CB464D42977F991BC3DF +52E26CCF63B0A0D73AF537712F551DF4C8A9EB5837C6CD11119603EE13228E6E +3326A8A9484B9FBEF42D121304FD19581085459FE250BB3CFF7B689EE65EFAF9 +9CB50E6DF0DE0F2785EDA4C7B9E7AA036CAD799C8451C72C8387EE5BB933851F +ABE54FD373AAA654DF7B5646427BB0165303DA86B8A778F4FAB052928B6ED9F6 +083D9DFFC0FBADB4BA284BF9E3D0F45337EE4E52138044E8D2D9B09D1B3BF028 +C9EAFE1E2D352CF101B1CB1546A455C3264E951519FEE78C35BACB2A4103D5F4 +78A555C6E7B706E40B55115364E3690C7A7632B74CAC15C54D97662DAB2E7549 +777A7D0F70F1D20C5DB19E77FF69AEEE8DDCC120783D327817D3BA0E2BB98D02 +123CFF3299A4475153DD03AC6ECCD53B7395EF1BBD235E4E635BD925B46E5E9E +DD4E3818F1092525B84F504450523420B40140F7AB6FBC8441779B724B371939 +CBBC534E8AD2EAD3561DFAE319F1455D8F4D6F9A20A73A79FCAA449F067A1AAC +90D25E25BE199A9AB789D2B130605CB19CD2F3D97130B38B6B493DF57325B885 +467EAF56A17FB05542CD9567B0E04E291EE8E9E19ED3EAEC6FB270FA3F477B65 +4B60FD0A5A0ECE6D822290233D2FD6D0ED1BBBD82E5F0222A18417773597F999 +D3619B41BDEDC612072E87FBEF1ACECF313C297F4D6B27837C60FD840353C902 +31CE101BFB0B80450E991D466C0D33093450F373EF24A82EDCED7B9D0BD658FB +8C7422C078FFE08CACA51E7C14795759B2F8A100D042FA3BDA944E6412659973 +4037B9A540A20DABC38FB0F6A346E50E04D530115AC770669BF34FD88238EF5F +A80C403CDA940AE1CA5213E8A06E387EEF3C7D4941D634C3B3BBEB133BABEFD4 +28D3FDB15075E1A6626F90303D4E3DD558B910308D9CF699AD02DB06629C894E +B09D7EDDB076FBC42ECBC07B8C248F653BA031FBAE56D61762B48ECC3DE15CF8 +7FD07380AA03FA30DB29CED313D5EC2F8C21F74A337E76C097AF48463869D0A7 +20F46A5FE98359236E7DEBF231916B70AFC44E201F13215D4C0A017EA43ACA63 +F86A6458D0AA360E451DC4E3F864F33ACC0D5187DA632DCBEACF296C6C85A42B +A31E58EFD9F8B19893B59525B1DAEC780A71CA6FD27CA22C23733382E6D46689 +9AB673C87D7C6302C34FABC19B4BD25CAF910BA2A2957DC98917CA2BFB27636C +80F2A056CFDC2CB868CDA68F342AAC19538BA177B228B3736D6050298F868F8A +E9F0 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l047033t.pfa b/ogclient/lib/fonts/l047033t.pfa new file mode 100644 index 0000000..11e8dcd --- /dev/null +++ b/ogclient/lib/fonts/l047033t.pfa @@ -0,0 +1,1353 @@ +%!PS-AdobeFont-1.0: LuxiMono-Oblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Mono Oblique) readonly def +/FamilyName (Luxi Mono) readonly def +/Weight (Regular) readonly def +/ItalicAngle -11.3 def +/isFixedPitch true def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiMono-Oblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-15 -211 758 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078985 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83D51B996CA62E18F5E16 +E975A60A300FD933D7A757982DDDB53E6F052956F0A57B2EEAD78CF7E7056859 +D267B6E270C1FF751B2B0803C0B282576AA3575CC0743877BC5F871D3E0260CA +F07EA74B7C3BD6E1C9B3441A87CBE0C24C39D5CED05780E7A051605C83647B3B +4E86D8C9CDCBC1029AA84E30E1903B322805D506160BED37770D3317D2FE2469 +3B12CC7ACC1E3BF68E1F4F3AA7AACEAAB78CC0288FC854175DEF8280BA4981A7 +E88AEA83A0960C26504940E1104086BA90E50BD53FF14FD9EB047A0FBE45457B +B4327143B7AA30A23A05D29D397FE113A6AEF33F0AED8CAE911EA27A56560D87 +1317E25F10F1FE017D115ABB4800E8CE8926A3146BAEB4E48DDFC4834F93F488 +42CF2A19F662EA9A223B7F12DE1F71E9197DB954D2E57806F6CC5741E5AD0EEF +0A47F7D6CBF12D269A2ACCFE3976CA6829DC8BCE2165E18952C86A417777B867 +93F78E7A83BCB3FFE7891DAC14FD7FF0D327E664BF01093046303A3D43CF4E2D +1D22D2CC2900FA2D274C9A5E857C780DFBB1E935E529EA1903FB85C982282A15 +A36BA8725067022561F47DFDAE8B913B525718B98BEC9AA28A50EB40A96D1A92 +EC82A03A1D24CBCF043F743547B8DF642E7B872793C2D61ABAD6B655233F09E0 +509B371B60CA55FCACF6FDAC2D1FF5710D1E9613F5837963BEA103D99E02F9D7 +B75C9D78DF42286BDF35A50997D6BBCBF08309D0247C1E9410FD6F1A5BCFE056 +02A6C4C5C6E54F32B1AA03A7B377D0F8C5378DE4A6BD519FD954BE94EECC40B1 +1B2B14FAEE89675C2D6DD97623A9EBAC87A08DBF8A71417904116B989D30D794 +A9ACFF1EB9FD4EB6627F541FC552E3602EAAC4798761225FA682C5646A21FCDC +FE9934A59F90722F6A4D1A4BA63C4D44412F38CF175A8FEFDF9130DA4FA2F614 +E6842BF6F2D1DB5D8CEA85ACDA992C3ED51F60422EE7BD353AC911432419B925 +629BA2CF0CE7D2B93AE1783756F78FC322FB4BD50986AA0AB7B789DAAEE7416B +8023B87A09EFF918BDC4147B761217310B1467D92B15E49C3E15AF62D47AACD4 +AD77F5AE7EEFF90937C6FB7A0C27AB7EBDF1D97E1512925D772B114BB44747C2 +9170057AE71C3A36D11E1B8AD9C1CCB207915DC181A0FC47E0F66B1018EB091B +54602D0D0F74463EEE996ADAD5F99148CCFB27D402A59BC27D610BC0177BC0E8 +CB287101F44CC082E657BDAD45DE4C4E231522E56FE328FCE34D38B020D3E34A +99A9CC2BFE1DEF5E1129CA82364C6D62A346F94599B9ADCB5459507A92F19D72 +9D461A4DEB9AB96E86C21085F9587191E01BF047B383C1DA20F1F56866D370D8 +F3DCCA23F36C776866BCEC11F8451FD632233B2973A1A4A64B94558A92A287F5 +074A8C0148F2AE882FA202212C575F5B32C44C767CE47A8101B25530F8BE1C8F +B45642B3C7C2EF7FEBA3A38EE6BA20636A525A7A4305D8CA22BDFE84D0F95F11 +AE5AEEE2D2F22391F7CB647E1131C0853DDDE1C65EF3C618B286794875DD6690 +7ADFA1F1812F1F078C851C24E2B2C31D593589E9F27228CA21AF66F4E649B6D2 +3F67B91206DBE74E704276634E6032C91B71CEFADC7BFE832A8955F139F56981 +3422C47B3E8809B23C259975D466440820DD4E9E5F20A24787504667FAD72202 +83FE9B391A7CF5F297CDEE3DA8E9B9620F1DB2D387351409D38A9C120367E388 +4D9724EE90C5BA737B847A5E330A23ED12DB609837BA866780582E486C89CDEA +39D101941B7608A5633B6EF6FA9848C2F8FD8DC9AD48201C98A7E72C38861822 +8DE5C6800E152D2CD869137DCDE16DCACE6019FFD26751A5689967512AC8BE34 +882245228E4774EDFF6C8E4A805F854AC5CE495EB91F84876A1FBCCB65F5E896 +BF07B3AE7B4B6F388D6EE0072BD9DBCA176D225D0F45E55F492457FFD2CB27C6 +DDBA44578E2AB640190F11C953C3C80CFF99D2FB39BDEF423AA9AA4DB4D4010F +BAC17523B4B386B4E81B98F0AAA487A38641A966C829607521C7CCDFD1ACC6E4 +088F0295842C8F86DB2D05311EF38924840BC8FA3E02D9B554475C09786CC4E9 +F4B942030E1765F1CCCA561FDCECD1579DFE1F6B4A30D35576599941A2CAD8A7 +783135720E6AC6454BD4F1A7C1A1CCC9AB629445A4423AFA2B99296B2A478735 +62DEEDBD02BE125A4F7FAAA55410683B4950F60131BC8969A7E52BB8E11F986B +5193BF75D36BACD8D2B732FFB29A5A7E76E6BD785EB1F605D035B653276EE252 +344EE302BFD7DCEF9C1DFA24532D6E0AF7F221ACBFF7EF479F8031B8C836ABAC +FE89FEBF57CCF8089F9387AF1E919B815FDB85C69DACC562FCCF6BF843E088DD +E64FAD2F51D22189D6D2402FB12C9CF390791BF3F628C04978EF15CC9C2EA909 +B55DB3141788765F610587CF76FD63C73FA8FFE8F7697529D85F42E9FC0DABE9 +4DEFBDE3BC659FB168A8C4BF06A57A8661EC248E1579101F4B7CF022E7186675 +EBF6E5F8C3DA362612D97EE664BD10A0A81DFCA85F2C3250BA95B0903B45FC2E +34AA1C9900C092C3C1EE4A514EFDDE0F7BBB3FAE4A7019B547126FD62FE6ADB2 +17B9F504BED3487D1CA9DC6B5DD9DE01C2CCAEC45A0E115C251B0E9275FD216A +9A7445B40BEEA1E99997E81D10C6331797DD98C94288A64DD4DEAFB68E64806D +4B758A177694A38BB736D5C799F8B64FAEE01E8DBCA99597F0DC4DADCFACCDA1 +FC3010B68BA528E49BFC3A72AEC35B084DA9BEEF372C53AFF900824CE31269AF +9FE252457BF229DA29CAAFC67A6B91E2B59922379302D243B2BAA44A6D24DE8E +9D7470F7987C54DC3407221E1E90FA763B03536C9FE5DF99064B716412EBB665 +762686EB4249D83C7D80B27817DDBB152DB064796102467E4A604EF3328EABB5 +3366D50B9E2330CCFF98A8B98DD6E2C39AD991C8921DAFC4CDFF75DDE5E2F2E2 +DC1D8091B7E4B03A9772298DE764FE81410506B7FD8102EC4186D6AF7219DBBD +E11BC975E26F8057F5EFFC1FBA8E80C4653E80F24347D8D5697505B9D3FBF980 +847430935126B257A8E0B1326AE1C06A5EFC97F01C45471C7A528C550D2FBA8D +9CF4235FBFD4340B9CFFFF0802EF934183F93E0CC81CB125ACD01FD01B669595 +00A7B8675E1E61515594C1612ABC6C08B93732760B843FC93880E9A1700FB89B +5DDD227A3BB43D2C30A953182EC1717EEB6AB016EFF3FF18108BAAFC62AFE6C4 +819B12052B09742A16F9C86FE887BCE63B23A422FCB2531235CE49CD4E7D3B85 +EF05671D86BBD1494CFA9F2E8A9AE5C0BF831B6E537EC57F69626AC89B685D39 +AB226C5339D90F0CD595169E3D3F70DE1B05CCD3A7B54AADB9C0D0BBF1E35D47 +F55ACA00064767FA1A02318CC3F90635CEE5944C984148BF437352CBC2122F42 +26675385DD0131BC7F41CF4BB9D914D29972DCF531A1074055477B3AC44FF0F1 +D895759AF4B365FE9112BC4958191171EBF1EEEC3DFFBCF23DF9679CA9350A6D +66E54A3EACEF4390B7CD1A9C88C53490119121DA5DB6E77D9E065E9EC2B0DD1D +2A276275A9CCF63D4462A2DAC9B3F62F20BF5C8B3FFAEFBA2971A0DA0F78DC73 +FA301543A932076CC943C65D5147E2A018209F0D2C18926355994F3F17AC6310 +909B998AFA45EB9B9E5225630821DD05D6035F9677F839A7970499234D93C0F5 +5167BD2FCD1A8D3FC1850E21978C3E09188688E383677E091DCE521F65A8ED62 +1020255B64B2889C787963D0466EC3BBB6BD2A02907B6D8355A3149EB88E5EFB +D95B59470D51616B93B5DC90C84564AF3126689E63DC98D432B6FAE3CAF328CF +04373D09BFA77F54368D24D546C7B7FCCC1F66B7949AE19136EBA43BB5B0FE54 +E0E7EC4DE599DEDF4B2A437985235F08142555F62282CE0D0187987F7663812F +DF9458012EC5EE9624024DD39C3C6F3862E12ACD7D7D993F7A36A0E08E777C04 +DC55DBB78C02639ADB7D7156624E00CCDE7B3637C8DCFA60BD96E03786E27237 +180F51C3613F2C1B5C38F173A5E6CFE20F074C3BCE04556B6A6F2677C83DB5D1 +0F3DA48AA22E8B10D61132A58534C477D8A6146F60F1201801046500D37541B8 +F0576F790E918F92ED070B31DE94AD7F46EAF05F3677BB5041F1899BE14950F9 +7CBCA06BF444839A18126D23D57D567E65F9D4394F4846D88F6D3EA9D76BF4CE +9D168701DEC9254F2F0676F27917D25EBF495AD97144886A468F8CFE1475C3BB +DA73DF9EE532AC7EE2D706824B81467A9A2EE84C5D6205C4E1916C8250C778E9 +830718DDB534E6BA14F4A1D723CAF5A43F7668D6235580CEF1D296A9828F7397 +1D97D57748460EBA113342449E28B8EF96B9D0B8AD79CFF9FCCB979C86F14149 +4970698ED1FB72870122807321E0E2C3B1FD9B6B88FC3144A594646335BEB914 +B8882474AF2A0315BB55C1924EA4BD6E305B7B92E2BA498F5EDF6E0C13AA9A10 +218899781EA3EB98E9C9C52361BB9338766F055198970A06812DAB8EFE4893B9 +AFFEB1D540EB70D18CF3C8D2CACAB15A0D158E21958F020427F936E15F969467 +D2D998C50541009AAB95BB2844A0F1FE9E3394BB64A6B1E5AB8F98E9311A0CA4 +38CE611ED06E80C9DFA8B380A89AF7D18D1692DA62D816FA3E20DD647958F52B +9C7219C4AE3A6CB987E1C0442D1F92BE6121DFD75A4E7F68A4D3E6F2BFBF000F +509F8CFFFCABED431E5CF48B6BEAD630ED02D893D8F3A16E97E91C802B23153D +A2E93A3A9BD228AA835C9394085111344805E53B23459251A1FF26802D7A736C +9ED13E9B53D9BEC50A3D35624431F2E27E05FF01E56BC64801D06434C7179E81 +9390FDD19E322010950F09F9A36878E41D9D3C2E4FE37C2AFDFAE9519FE4939D +DAAD914E331196BC856E68BDDCCAEAD7551B0C9808E10A92D02275AF1A5590B0 +CB71F116BFC878EEB358E741F35F8C69BC659B844E2946E1FF649001A6A2B1F9 +F973DE46F57A27A567EECCE8A1EEE48760C663F9D9E5665F2038767CACCA4A9C +C9D0C11D846A5C649B52FEC6B42EA6717434807A999FB70784E620E9E4F05638 +7CCA3D6BD952B69AB9845FCF2E197455DB59A118B8C43C26E5693170463E1DAE +A8CAF498A7036EFC436AACDF9221A35AC4175917FAB053818A318F7CE4C218DF +EBE15A7E773CD4E988643B09D6F5482B9929D12A1C3A8B6611F14FD47C21BFAE +674C10B6B5FA34108CE615812F9D0E95E34F84BF024D6EC5AAABF6011684A03D +E83B69273A74D75073A380781D38C7D2A317086D80BB9BC3F99EDCBF8C3E4077 +39FCB1D7F88391FD4445DD94E2F193839B3A5C2CE65329FBAF0CE58CC24D01D3 +539D2C0F94F65DA1E5BBBBA772997227B2A702EFF5EFEC87195F6905E9A9ADBC +B8FF45681D61D02D28B119241FF8C8B377195451FD30AE615EC2913FD53B8DF8 +5E2E4A63663FD231758FCB97DFC18F1B522A9C1AD976C4FDF257E1D529E1D325 +34E6C1A6D8339B6A61577A17947148481A62C5E41238FA86968A3ED0DED467B3 +4AB877EFC912839525FF9A52C0E86FC7A9D7499FC0A75C604299099106256F5E +EC8168FB9343C144A726004BE642D55027DF9B18B80F9EC609A91C8E8E1E4AED +FBBED28CE193CD71F0F24CB64F08F936B7B0932CB6466E1BA4D8EA73E66A146F +12CB155775FDBAE83E6AFDC46E9A0680387B6663919884E88BD13FC117963368 +0C637980CCE4B7F393A7A7D4BAFFBAF563CE3358CB959BADF631B42E21E164AF +81AC41C462EB987D4A90EEEFEC128D1545C27A8A34FD0781F85C1FB588B2B12B +3DD933BD3C85BC4DB4D6EF64D7A1E71A68E56894E93775823EF35513DA281866 +9AECEE4647B99680344398D121C290923103E463B7CBF17514F32D1201FA86C6 +75C00997EDC3C17DF62E0A4EDC539167A79AB515B0712CD5702B3C8ED1662A5D +AA8994BFBB26CE64A54A1AF3B2373E8215CE0F64A6BA038654E1A098DE4E67EC +EF8244DCAF470EB351B684722E9FF7EFA6FCD589A1DF28B713A585F013DCD268 +4808FA1693FED0A859BEDEFF143673340F75A50F4904E3FA2351D874ED7DD95F +149C82171CF7992CE2C64C64CDF1E9E0C9CCEF0DBFA5CEB4B20B4466E1079B0E +8BE6CABDB2C771776DB783EC1E4AA66FBD34EA8CD04D253B005D206916B19EAB +2F89BDEA64268DBA665FAA0D68D2371EE1327D0C0CF18FEF2CA99B93A322FDDE +68D8F289A92C39C2B6B722DC1DF742BA4B1BE35259F0CC9DF36FFDD4E037B512 +364BF1D2D450843A1E9651A7431424BF1425AA1C2CC5C8E0DDBC959966BC3099 +D792ABB111B5AF5D48027A853AA22167A6704708AE7AC5E94B0F233512A7140E +125D86625BB6DDD4B919AA9F322F34A570B772307596216631906BB5B8D856F1 +665D2168ED20C9C7B5D9B4B49584B4687ADD1D4F888229E6A2DA6D7CECC34442 +3D48FF83F6AA41BBEC5A5627FC8A3F6D9A4AB9130C6FD0DDA44B48434200E0A4 +B939668D041BDBB88B5EDF1916598B4E6A28B893C4C1817C14D1E2335533F236 +B7B62C425C7155B85EDE07CFAC64B907C115859965A617D383440944DB680D80 +B959CD223F917446FF9354D6C833AF334E8E1C8EAABDEE4FBC864B5D4AF6D0D0 +3B26D04BF93BF3DED0DC029E69DA8D7D0404DFF15E050B233180930BD8B87813 +1661177C7E5B5348BF0EC3B12682EB539168A4304F754F244C8F2FC92D24AF2A +27B4CC7B9FC94447E28DE63B3FE9754FE4C6BB25B2F5DC5869A1A2D088406CFF +893AF7968C6D4DCE14E9133AAC1F03664E1E65A15C440BE2E9D7F48FD6F63A1E +9C06C311A7990D17134F424C41FBA0351FE639313CAA5D5E13FBD636E512A543 +1AA47D50876064744E03B82CFFBA550FE76D4A3DF6481F178F27D5B2557C0690 +D702153C470986414604018F15C89DB61F10BB7CC0ADBEC3F7CB3359F9F85473 +94377EC80668B4947F508CAFD4E7566F388801E5CFF6DD19EAD712D1E2EB9AE2 +F15A76E0F5844A7D7609D654B6E32991568CDB99ABC3078D960C0D1125A75A1B +90B73079E29654C0DBA19565303A9106602DAEBD547C31F82C29DB4A98F6142F +B67DB4D934D42853462A2EAF9CB05D6E0901E8774491BD44219EEB9CF4FE4AF2 +493FA01140E2ED9FCB1372E6484D2ABE6B1EB5A63E272F44F7DB36080342F7BC +A63321982294C76A9E63823C63722EACCA6C6A90010D3343A89E49FA2103ABFC +C60D3DFBBEC711F50B739031C43D984D8D59A2A4BA4937B5A08E55E6319B49C5 +D36B1A39170EEBB4D892228788F90DCD25878A31660AFE06CDBA1E656C60BF5D +0A07A2104EA457D1B3C6E54D068C7094AB8D0B9FBEA7E66C72547B7F63B8093D +1B29DF5F16D4BE002A4C5093AD3567AB0E085C87DD97FA849C1811CA8014B54A +C1B1518E962E8C96D1295955C53DBA39ED5821FB1900F24DFBB7C8F1942298AD +E97C85BE7A0D46873EDDD6D5EE79531DB92F3A8DD319D89E5D59BC4761562709 +EFA2526749A5FA9632CCC71BDF953A4F0A26C5B4F383A7CB429322736F449F43 +570942D8393FA50AF619BBF760016BB43DD12DCF93A150D7CF1B41EBB4AE221E +3C2F91C3D9DA821D2297B0C13A4555E289BE8B900A7B7FCFE2A1AB4405ED44BD +76F459235B3A5CFACA4323E85FAC84BFCE532BA323A92554D9799B20298FB086 +EC7A1CEB5D36BF34E7D6BE96D8FB7CABB562A59ECBBDE044E0CCDC42B77766D0 +54F2B99E0A7454C4FD03E30CCCF3887CA6C048C12F9D1D8E6155D490E78833C7 +EE6085889F8C8DA07E233FDD3BE1164C715B07A160EEE303CAF453079DED6F94 +91311B6CC2C79343448E6C94DE4CB1159E00CCAC3DAB69443B4A52270FAF2DF9 +285B6FF81E7F2413E7A79BEF760C253E9AD40B28D86F4924CC02274A6E37102C +0716859EFA924E50581B092D2EEBD55409A211010729337DD11B376D70B2E816 +39E3F67B0CA5051F2FE1D6D732878A8665B255A5C490F6376021D7C3E614BCF3 +CC3EF1045CDAF7A6DB17E3C496FF792605D5388C93E2316264D9CBBD3FB64258 +F462A7F4EC677BADA2948E272D2EA4F7D45344CFE0764886CFA3FFC4A2177574 +168F3236BA418838B7C0F68B9AF7FE806F1057E97575A79D4815C707C5EEEF46 +3A37A0E5B3DF712246A50C8A1D08940CC73A75FB7E80F73FC044D56001AE3474 +BD7AB6A05DD79585B4084489C2FB228A7BC1E39DF7C01F9FB6A8E8F9D6675C28 +351C433CBBDAB5B7F9EDF1F299B9F3831D60F6F7FC0839F3E33239F1F75E02BE +2F0D9F0842A3DF1586DB930CEECFCACD4CD74AB61EB66B20C3240507EDC9B178 +B0DA13F58AF8CF48526D84D39D7E0EC4E8D2E83CF8510E052D2687C6FD00AA79 +FC426348F421771E9F728AE1DA40FC3A6400E2F00164C7640EE12F8B9D6D485E +C0AB79540F30441E97941E5D9920DA22439730C84E1404E2E3142966D2FAE1C2 +937BD857F6A44B76776FDB46E849DA71032EFE2A5B50349990B90EC233E75ADF +E940E4EFC436D15DAD29C10BA71FF988ABB796B659FC250BA6BD83561D00DD2B +EE1B4187754F0DD7FC325EF420CF64149EB7C010F4A0230F5C00E8EF0287A430 +FD501437E36B3CA17C50A47800E8ECCCAC731F5217DC39CAC15EC1326FE67412 +4C8B6C795C60587B4A9200328FD08CC435723ABD617A9C1EB6D6137F845F1EF8 +12B2E76659E88A00B35C3D7DAF9126E35794B2BFA733206435AAD584A464DA46 +11C6F47250EF166301246CA57B7A4A360A43A577560FA90310B9A41DE8A7A569 +11DB0902F1F8F4580D2C9990E19E6DE153D42AE72F9CD6654A09EC69086100BB +7C7F940DD92A8404A09B6CBA2577AFF4FBD1731392B404F2C73477C5643AFD49 +CDFF85D630DE9014437AFD41DDB2A235B606AD3D19A3F32DDA92502C833B27B9 +FE7EA1B93C4EF69D6C25FEF0919D5270F1FA526EDE7CACFAD9282558BE6669C1 +AD9987C7261825EC00DD51D806B2ACC0F1325743093B6B1BE15CB05582D942EE +7F32F08C3FF5D4BE9BDA66523F19C565035E56A2BC2610CBBD446735F81BB02C +4A1D232F34BD287241B57B5DBCCA8529FCDA70CAB0464A91CD99A0B68A5BA7DD +1643513B5EC3F79264DAB7936CD59A7953F563E5E34EF016CCF46F1C1CCFAFD5 +118CFF688015AA2B3B3F287295665D51C4DCD6E96D18BA3C5E25AE7886DA085A +C1A0FB9471BE802C6D69B23BB1E9AD88FE3258FDE833182295330067910857B0 +A3A72BE8834CB2A1DEDC38CDAE04D2B0CC5492D490173A4757421323238C8438 +A660C7AFFA3C261E5EE4CD655B19B6FDE54760C2FB0955941097301142206565 +D048CFE4A7148DFDFB2012490C551A9309FCFC651892242EA852DA00FD19829D +1838904AE7061E21A7F1566E70469F52BC8B9E02EFF3D944B162D3C563D91E8B +28382FDCEE78EB8A527C9B6FFECB466AD43E0C0DA5C16831467F53EDB0CB8626 +BA92737DA27C98AB10C97A8A76353D3F975EC666FA00DB003015608CA6BAEEED +AB8BAC7D02A6607CED006DC1B4AF02110EBCCB50854DE1633C8085ECF57271E2 +49B479B3BA13B3D491313B266C9085ADDB3EF486237AF30306704B36D99B99D9 +B4DDDA188FD08BFBA1D7691651338BD1F9E3D2325CCB349327D09AD5A9F82548 +0CB6FC48BB965A24E3D2438BC00A80BDBF322E5B81DD7D51599A8EED5E1C0CBD +3D353DF1BFBC3050243CA4CDF48EDB660DAD7CD4326E7D8ECFEDDC3B79A28A58 +89FE0A38791F9778B809664E1DF7B0DD829288C3C7F00CAC6182629E86B1931D +D5145A5DA2FC1EBCF001ABA058AA48027688AE1725719BE01163C03F26FB3C6A +DE78AC5156763D1955A713CA60E9B98A0C8A84D66628217093FEE40C45E1B873 +BE5E5629F437E9C821EF110B3F89692B89F15F7FBF46FA1B31B66F0BB6956A0A +B1233B3D0475B839B2F3A57C1EA98842DB201E2F78D654837C11035F52C165A4 +91206BBDFB2098B435A0BC91622094B9F460956D1152AAEBE80BF2AD888DC412 +F8741BD4B4F5E4577F5F1931C1D9D6D8F16D63376507465B216E42586E28903A +8FC9A8799742081204B5BAE38A59047E0668598102BF487733BE3F830A1F524E +55CA5F45EFF823069DF8D162A2B4BE2542D6AAE3D7506710E46E50F80E4E95B6 +A5CFCD4063974BE71542FE87820C530BDF026DF178AF3F99BAE56F50DEB17645 +ED9FCB0F52A576EAAEDD00E5110E7406C3757DC5120D4E8263ED0F04FC7AEF04 +BF4ED0D0FD4EC2CF08044677B8CD49517FC934AC97789EBA59A68CF5593D45C5 +7257A4408935543255CB46F8BFDF523E1695065265FBF1948B95DEC97C7419E3 +D15BD2640E3965DD0FF38015994858FC8FD1EE7CCD08CA522F88584177240D93 +5E51036BD64402950E6E655BCF7AF79D94D5881A04E439DB1CA3D1CAB39CCA82 +19D1CBE17DBC2DB0AD5596B0BDEE6561229BA42A69763722DE13CF80BFC544D0 +49E9EDA64605BE71FD6BF076573B8F7ECFBCFF911AF62B6C45056C3D62779A55 +5AB3824802C2B317B985A9FFB380EEAE5E816EDE9A381334A323E1A3EA9892FF +6B480084B6FC82E42413CC9DA035A5B587DE706804232F4C269FF4E13D8A03AC +480124BF0C5C5536F9B491A40F9E5B74C154E6A7A05D91E0A01D1B07BD9CA08A +DEB2B51FD97C30D828A530BF26D35EAF941340FE61AF9D30D96E7293676D55B2 +0F20991553AC5910B75E6C8F5728F5060B3B35A223DB1A69C4D2E752335B2C9A +4D380197F9413221E12876EBD61467024A304EDF24E6FFB17622DAACB5AD710A +439CD1626F3A6836EB48315B2011491FF4F2FD7D9046315C8998FE7C758D3568 +D6BA5C6E158ED2FCDAA81B56B603DBBD917D82C124A61F629F9F69F834D08B59 +B53F10029802F0426C83E923D658D7F8D04D96AF9912389EB467F7271278601B +DCF84562F771B4BAE0A5A367015F91512A72171E37CAEA1B9930C0EE51275FE5 +0F49B05CAC5E9EFCDCD57CAA3EB5D101CEED7545F2BA17BC45648D22119B23B1 +0F9B7DC950350929A310C3853C4333C230A78479127953E85A56C335B264FCC2 +FCB6737637F864A503BD2E4FE44F14AFD8E8B51EBCA87910F6AC4671F9A9591D +972D0AB26E2AF36519CAA939C07D6D75F56BB331E7F37B6173383EA3B967981C +903177D5E441B6069D6310476781779F68B4A60EDB732DF6A9BF1606B5BA8616 +AD10D97F711902CFE0B79A228F3CE5D31D7E35FDE180E3A52609BF2A3E3E6DBA +E83650227EED7657D43594200EE4B71BE9A70ACF49A79173A985E1FCDFCFB705 +EF6D655E220FFA05B96AD4A5EA28FE833272A2034E0DE412818E89160B1AB71D +CC2293238DA9EEC3A0E6BFDAD89BE4742A4F893CFDC4847E769A8AE4E3607D2C +8FCAB808540C553DFF751FFB4996580010C53EDFF3354EECD54DD2AFE4BBAA66 +3587D0488A2E96BD38B16D5265FE05D92608F41CF56FEF44E977CD965DD29390 +7393AA40AABEB5006D6F0CC0740DB96B2685737C89E445DC07718B5986D13284 +0589CE723475C6E750F398CF7B138D4017120F774054EFB7CFF3182167A24035 +0A31A73C79CC763DDBC12C371D8A77F7B9802F9200EF1715F163EAAD1BD26139 +289405D97CAA32BF9D5C2979382B78635E39E4B4DDC0AE2A0B2B411C08A8D0D9 +ECF61C48C33693F24EF1B49293B2F637732C932C35998E9F7C2CC23B5031CAD9 +B2A816310F484FA71FAEA04B09237762C23BA7D864095B3234E32814AAB28142 +F65EEEED4BED3A1B7AE05BE68D6FDD81AD73CA46CC51FE29CBB6AD9A7FB0C521 +6B776EA1A7418CF0D4168AC00CF74DC39BF649B27F32F9791D51DC32FEF7E1B2 +F79502F3AF78BA3D549E5FB21AE5D265326D93CB4D32F6DFEF33029432A74D1E +B23363450A94833F158F86B7885E877AF5F413BF0EB3DB99B508CE4CAE50BAF5 +C522A038210828B44EE62FF7D64E0E33D959D6F45FDED3FDD6FA828A5858AF82 +4A63D360801D8DDC9ED0E131E3339E86C0A6E1C20F7B7F85BEEAA6067F18D9F8 +E5971282585D3930011661A5F4333868CEF20CF01770BA2C60DEFF2B368AD21D +D4167DD179EECBE8EC29225FBF1FCCC1D1D5A311703D80C942388BCE852CAD69 +E6034691247123B45A5613C7A307A3118DF37F009001A8A87D093BD0F48B1E93 +57A0360E523CAD04BF1BE259C75F52043A7BA57EE718852D350F7ACCA3664722 +20026A57015ED6C0208F36AB7247D91F81868424C5871A376924FCAE64382287 +D232C928831EB8C80D0A107DBB9CB53568E51B85912733B9559B6DC8287EE61D +BDB6159977F76D58C6D925CDEC01F728D7D6BDD27A8E61473EDAA7BD7D80D20F +B47E20C691794186AAA4F6AB76FCA59058E190DDFA2179EA4A3297BCBFD6F546 +EC6A1F7B013264BD04DE97E325A7F440ABA206CE1F0AD45AD09932F33DA483FD +A8C54582ECDB96F9E612C8F2A7DA397E1CDFC11D8C1168F18B5DE813CF7EA37E +1C7B2DF3B38AA6B3D96C6DE5637FBA31152034EDBC6511A965C78CB526DF27E7 +967AB9939D93DB8379DD1AE267FB7FC543256686B68434D3C5A4F5D823B50F69 +0F1D4DF1F4C575B9DE19C46363CFFD6CED771E0A74EFCBAA609A564631C59C0E +0AEF13343DF77FFD4E0EA2AE1C1405D5A9C010FA32317445B8B172E6382D6F19 +A128393ED2C4ACDB9391D3E96BF3289BC12D1B8C0D6E3AC30074E55F641FCA5B +B237CC2084537A34284BC94F3239C4E56A23722E89B8D604813CB8F776D17842 +AD927359B8147FC6E05503A0D0209FA52653481E38E7530D39E42DD57EDB19C1 +C4D8ED8222495543FBA560AA5774BED94A5A24D933F633BEC4DCEB70166176A3 +49643A62599243EA05741910083A0652E39DA7A759A554F48A4D550A933E4ECE +D6D12C6D6BBEC0A3408A9BE220B328060015B3E3B663DF829D93B9A982F4BB23 +F5C8F24DC9CB77C7DD80809D353E336659C5E7C2528D95E521208ECE1AAF8DA1 +D84A8A68E2289650D800AD369399594309A144AF3CCB62BE30669C1FE773F072 +D9BCA31AF45DEE792D623ED6E99DDE9545638A721111DAE7E74B3A5B07881662 +628D47F08A3749F6AEBD13FA11312CCCD8E06297A5A698C59E139D52EE5793EA +A03B23583052F10AE38CB951E533623133568377A7F2FAAB301C16F957A12E82 +7D2A9451DD123A725EFA3C3D93838581CFD60E69C772647D384BEE1A312F879F +940EE9E91E6F7883B91DB9D4F1C5D1A941DA8F320EDC0FF8E577DB3850F2B5BD +3535917873627308450D8CE2BAA054BCDCFF9CA964FBFC8161787697FC10195C +6C32FB43D6891AA1538B728C34ADFC9DA526E87145693815F6C17CD9C361BF37 +E788FBECC2905D57DE7C2AD8D03AE51C33210490395C00ADFC0CC1FB5F5CB3F5 +994FBBD3DDE7DF9A1ECBC87480EA78770C35E7DF78AF2240F7E1412F8ACEB501 +FEB03A131CCB795EA51A6FF5B188B5927481C63B82EDD1542512F069800249F5 +A8F963EF9383342C0BB584BBE323069CE631D985DB8C4F2109A8E1804AAF0603 +BE3A5C8863A4B815D5200B65AE7DF41D79BACC2510E700F390B2EA3F4BE01D89 +BA75972F5354406DB6157645B80A9B43B8E0346A7E20D090B0A37C533A7946C6 +EE2953D8B2B216AA2237E9407DC6F90008C2C0E449112DC5C3C2C8019CC9135E +C136FD411E23F26398F422EDF01AF433D66F60E5B961B6963F5D14CF48F77A50 +8F6C584459FE6887764353E2BE8DAB3C4CCF79A1CC5E1B28C427F520E9139230 +83E2B8C409F6C1A8E954F81F8F8C1091C4960C5132B7B5AD865AE564AF68CEE8 +7924B401ED8FC90F9A222C6861BDBCCBF54D06D1F2B27EA2176E4BD643295A4E +49CBB9CA351F339DF41D3A0ACC6A4C7A33196FA53E49E409413E8D6D69F21B09 +3D7CBF3A96347F3DDDA92C435E1BA4980457D3D9957B800B144F590C136547A7 +660F182BF7162F5292A4AAD4A1E841867EA48FD686C90D563BE6E2879BF05614 +EBC88A6DB350DBF2996AF28B2EBE9415AABA07FF509B9DC0F5F066F6AF30BFE9 +D9800B5708503CD57BC055F5434655E68E322D699EA77974F1A0B4BF47AE76AA +29F0BF7A35312686997FACFE24E9F8C23FF882E36D99CD4426742B6120B67E92 +BB855092A15A7BC5E9A6AABAC61CC20EFF52246334525628BF6F4D7DF5542399 +91D6E985BD244B8A4FEF73A2366783307FDD8960D81648472C9FE19445AD3AC0 +7B0C8C2DF9CDA23301BBAC2D7D32574DBEE3A176FE9C27B78903D1F3B1E6B7AC +AA2768578872F3FC652388DCE24FB5F4D83426756915476C62A386B95FCC7133 +D21B17F9548DBB193D8C57A42E6B76306487EB53A5AA8765BBF8B64188A44E79 +2087928358CD1F1CB7286D6C7BCCEF10AD5BE805817BB9BFEDFF5EDAE0F691F2 +742DF076DBC7FD8C5D3F6B2ACC84BE4E16B1D68C3008055340B1952919387BD9 +D3C45456CB361F3E4D00CEC4F4D289074AE591074BE3C7AF4DB010B6C1A577FC +DB61CC1DAE946C39B1573AE788B86FF95457513681CECC79B5CB533AEEBC98DE +D04DE9C0CD9FEB79ED7143BF3B1DD911BD1999A2F223D4C41F51F9AFD17C9E84 +AAE9B30BD00F460A88C74A27268559754A4E416485F0F9E71C2CDF13F62F10F7 +25808965E37EC3FECD537D32CF915B6F47D6AAC1E7FDC9A90A49DF2C1CAF5721 +66501C306734B40278AD1129CF85E474264E65525F14DBD3BE2C358364F5A624 +21EBF782925A9A271CB4ABA439475B6D52A65EA1D8A71DEFDC476F73099D7EF4 +C5E68D5D0174860D55486F443E0E9C81A86594D28B2BEFEAB7AB9B14D1EBD02D +0CC44A01437CADF55E4FDF86B2CC1762175F11725F292819C97168262C3A2D51 +3E3A45B29C5EEB0E57CDB122C8A5C077D99AA50415E39C44C206E980F06F0ACC +7128ADA7761D7520AECDA4660F2E3382A733C31B5A5BC5DDD782C92E9D1C64CC +F0CDCEBB4699C08FAF77712EC8D58FFB78253B978CC7219D7D79515F8E54A060 +180FEF767C9D8798CAFDF295303E7F0A6623A8C12B14C1836F11F8EF13E426D0 +6713C847925CAB6A2BDDD84344A9F3FC9ED2DBEBED62986E39B762DB093A70B4 +8330414B6CC6210606074CF505197209BD0154CCA72DE4B58CDCA2164BBF3AE3 +3CB35DAEAEF2247EFE9858FB09FD7386EFBC3726E0D8D0C105CB6F39715A9AA5 +75E088AEB767E520F30FDB5B1CF1301EB4CAD57E870C91C11F2839956FC3B033 +ECC34C4794ABC5062BDFD9EE75BF35C7838DE696D2E89CDF370F6942C224090F +6866206B027A9385C29E50DEBC25EC087EA404BC87D9B06D6C9A6DD16FFDD199 +53E5B20FF70287A5407C80F4C29BF1E997B9206333CCE010E05B6C8C2ECB7E35 +486F96890C7A4F8E97FD7B42EEA6FB4FB3083BA5B01BADA2164C3E71D2438FE8 +4B4D38EDF4F1B9BF8334A34F42C6D093A56763498F359AA5AF15D5FD17868C80 +854BD80EB0F1ABEE40195B49FF7E9E04FD5DEA0FB07B12E0FDAB3EABA242D3D9 +11CF1F8A0BEFE0F6C4CEBC2DE687F7088E3556B95C0EE7D0BEC654F642212093 +E4ACA7C9F8049BE764BDE283D512BFEB784CE3E83BE5AD94CBE97A3C71DA85E6 +5ED201F11B6BFB09139D8FBE9516F1CDEBA26868D60A5244700875C72BC399FA +F5D8B663B4BE7484E46F65EAD424D7EE440E1DB7394CF6BCDAF07DB43C86D0EA +E08F34C56EACCE341389ED82C4485E53C3273F3F7FE285530D13A9A7D7F0A298 +458A3735A2B84D8C2AAAB2DBEFC847AB55CA7B74D9364AF272C76A1E9FE5D64C +9F61FB670F5521FE8386A332BE4D5083A16C705E61FB58D7D88ED2B540949451 +46A2514F38AF7357F6CECE334C83E274A194A376BB5F053914C7DF83E411BBDD +271C782539EE5CE86E3DA2682C634912BD8637BE31FED7085282BC8FFFA4A0D0 +2F9F7B62714D3F5B0F594983C9250081011114C0BF6BFE683261BB901A140656 +7FB4D34B2D59D4B2A37952B2150F7F0BFDCE25FD104A664867D9B5F9134787F1 +BD1AE54E3E1F8657DD5094CBE001A79FFF7A6A29C25B50376929504155707993 +5788678C618380A2D114F65D064435D44F56D8C2E969D054F3A5CC369D6772BB +94805947ACDB934C10CB78FDC3FE572D844AFE0E8CCC0B25C67EB4BE8FA68447 +22DE142AF0D17C8DC4581F65836CC100525220925067A5DB6831DCEFDA4C3409 +58D49AF007E13958E64DFF010B99A9B2C250EE05106D80C7958AF90A2CAB61D3 +6EC40568FC2DE10756E7DF2C9838EC534834CA2E6342768B33CE370AFC934FE6 +57DB8DB7E490EB547D817E717959EF4C3124C9B6DFC6F313430426A7CE5011A2 +B8643B26857188E1923BC0C0D722DB3495C07B393D5CA15E71B1163114B4368B +1041D31ACB26D732FD54BD27F7E0DBF1FEC7D4CB80130F3F750E0B9574B850DB +675B928FF95029DC848E8975132E46A07F4E4FB760DFE3E599C8A84ACCBDC7B7 +50E2E7B44B12315486B5E36C10031E4FF14E1B8C2C101B9616B6D3F1F6DA316F +458D0F76E00AB6239173B13DDFEF9E5B0F0E687957932E351D6DA95504B359B5 +F7E5863B601EBBDE3A8F858F8D226B02DC011914865E009C6F55AA1CC4FBED04 +0C13AB5C954B2FE695699010F5F228428DD79C3D3920F2B75631467487FA8486 +AFCAD8174F32B55897DF2610EB5173CED6E53534406D78000826DDFA40459E0D +FD81766CD79277D950B1615599634258ABD320D8F1E60750FC5D839BF5AF451D +DCD394129C099484D808AF2C833BFA65B56B8108ABB795EC97AAA0DFA912F306 +4594C7CB096546AC99646BD06A66B00AAF37163831DF857D9BEC11D0AF565073 +3EFFD23961848DCEDD747B329B1C0470B7C2C88C044DD6153592E6CBA21A015D +4623C290DE06B357E931155942D894942DE13D7E1FE94D4FB03A90C684FFA97B +D7257106C3C71B8BBB70D322CCDDE39DDF104CFFFC3C6A4ED68FEA52823AEDD2 +3DBE10A46C930B7874050B7D4A310C14451C9955E7D02EA21B09EA974567A655 +DAB255D067B913C8C8BEEF0F747F9900806D7618867341C49F395D78909B00B6 +CFAFCF12CFB569C7DD3357858905A89C09DF87609A0153471300D032B2CACBA6 +85EE4EDDFCBA9B9393611CB6398160A6178618F53DC8D9A26BD12FC5BE10D99F +16B3D8A44009CE664056FE03DCB5938255C6450A6EA03F60DC577A1DB34A8358 +C48095F42E3F59308B51C402724DFB4654944445C655F68357E6303A1F480E26 +337818AB5B12CAD66E41DF871C71486ABF5217658A34630968B3ACBB5ED31971 +F6853BB51725FEDADB0107090C1FFEADCB70367D01655BB43FED064F3C59BBF1 +CA9059AACECDDA6A93107A72BFC8C43546219FF4BAD0E2BA19FE9FC6F42772BC +4EAF6FC8FE96218DE04D77E00F666550F7937F610B037D62FE873001382384D5 +371C5B73D690A5EBE7355AADD29205F7381D3D758D655DD72197445FD743A1F5 +57D7807A98D1E8FE400C6E741AC6537CA76BEF0A74C24BCBD284726DDA89E7CE +4431F4AA32844896766FFB8569B70D3AAE67462AB13C25520560B97F1670489C +C703998A80E8010D509A48CBCC48EC52D619F7542E1427470500624F1F50C589 +6F03FBF17BDA013A752F4CE279E87112216AD59910E1B9D0957B6A2A3D839CE6 +81E311273D4C2B9A33CD0C760282F37EBA8CF6356C3D31465AC73DD9ECA31EC4 +5AFB71B52BFCFDD2F8A4410400A2FF3547B80B65C397D4AF6B314BAE4B5FC408 +D697AF9AA4FDA94B6BC540410D270A5317D9AC13F075DC8E3D5A2424ED57EB81 +C9CBC37DB4C6F453BFB5E52A1C30EC66129269B583B04A0A6FE60CC5694A8056 +14F8A81D7171653B491E30B236D39CCC40885C7B8B57DD43DAC6C32C95481871 +3B112939856B2C6A16E27264F4F65F22465B0015782E1553643171C469A08D35 +3F351E5EFAAA5A3440FCD03EFAA716CDD06454DF556F027903045D850AF30425 +231E67D59DCA6095F1A8005A50D8B0F85B6EB4844737C66A590BFAC2CF9AD141 +658B674A174C6FBA8E57BF6B34FCFBEF31CCD3658BFFADF331351B1818494C12 +53FFD05FE9677DCA63E4AD2C5EC1983E045DC861AFD71A696FC606B7C0AE609F +36C0A90EB386994A007ED9D2349EFD645265013E717BD94A66D6308D1DF01BB5 +F87CE336C3EAC77EDECEB76F173DB9E1BEF481B7B02CFA679ED2DD5EA04EA512 +5D3F45A05E681B9A226B0701941CEFFF253DF8FA7FCA4C793985E6993ECDD9D3 +F3D0B2F267188C93C9824B92E8AAE50BB63E4F0932C92592097425F9533C747E +9F9338839396E6F5C6AB0834600AC2478FC80D4756428C5E8C953DA74BBA67E3 +CA1E597134FAF54121D96D3EC56B04E942C0CA51B9579669E5B0BA3CD3163505 +F5A18DAF3E10EB1A9CB666B811154FCBA7DC868C9A115812329ABCADAF9C17A6 +467A90E949026BB37B2647A7D051DBDAA490723C43F705D7A53FABF2B91E9417 +39D2070ADA25A7AEC2F5E7612F07CB51A7E8729B059C0FFD0E11D77A1EEF82C2 +84319DE43E3854368DC488DD65D2EC3B8AE92611C1B74CCFE301B9130B31C8BF +8146355A86673AD5DC32D0D00C7FC33FB2F1FA263797411130E686373AE3838F +A42AA4F7BBEFF22F7CC829A95B9018C232D880E6441FD6A2E68B0640E0C74709 +C4E1976A6499A9D07D862881D0D063D2CC215D4825573ADB72DE36F8FD7E7C07 +807E88153F4E1261BBED152592FB9E306E43FB4338C7FC7E584B148192B03003 +CC5DC0E2926C59FED544A5D9A8FBFEFFF43967568B595597130BE1D3806FC034 +9E769165B83A05436E610A3E2ACE24F3E6F6FC40F1B9C7DC049404F1282D8A29 +ED19A320E30C2E66D2B133C585AADBD736A4950D77B6278946459ECC98AE9A53 +9BF64A9BF5CF9B24F12BFB5ACF91AA0F13AD869D7F61CEADC50BDB3EB949B706 +99C99B4674DAFFC8D31B96A1222834D8F7A81389A583F8FE7C9BB16023E8798D +C5C8B3BD2270C8D9F35EF54A8EA8038A50018F2B8CA0CF190BB85C7D135E436C +3ABBC9C76086B6A9425F84FB3E6EC62AE49CD54A4B673DFB819F37847B0D3E2B +9FC5DA3C384DF99112160808FD3E15FDF82213859EF0E653897B64415A2BEE47 +7B7BDC1882292CA07F3948B7C26A0D3B2A57AB664F5A0C399E5697A2FB09D1DD +B2FD96F7691AC2060173B7457287C7B27B9DCF58E609623631CC0984DD4919DC +24B66FD64ACFE2D15BA049737DD142A254B6F2F4222034E26EA6C9F6832B958A +CB479806632C44A5FC3BEFFEBAD867D1DBA5C0EA9AC82CBF56D89B4557C7192C +293A693759CE35359055A2A549040FC43F58E48495CFD33D7CC7DB25480FA8D7 +DF149E8E3ECEF8328991923C4B3FD0A4D0B1C7D5E1EB033C56A5546A711DE5E7 +A2F168EA594A7EE68BF805D039CA96CA9C033E11A20F8A6A3E1E7400E86B3F89 +DB506BB4936A300008CA2E3F5D28C71E2FFB2B5BBAD18B950C90974EBF01A56C +5AB94077D6071CAC8E45B0EB9DF22A3D896D2A45DD6474CE6504CA41D3562F89 +A034D7A2841D810D8B9E962625D7B9AE806009D39C6568F3B86F87B86F3AED6C +6A42F9FF86F3CD8F78659FBED4012AD3C903E140981577E9E9AF572E9709DED7 +2633035EA96932A6A9759E5A39A8B59CACDA37DA21F64EF56E6683C166D5751F +132B5A99E5624B81A364861495CD9208A811C47A594534317D8172D71DEBC579 +B7F602E3656C138331A03C1D66E02A19D68B80B6CEF1A30C36FFB21A8FA8DF16 +5190F44EC79B651CD09A96A9572E27EE3DF890D9FE1666710134288E97C14357 +6DD606516778FE550B81817D4D29EF9C1048AB62C5161347B1239B5F456A917E +EC333564922DBDFDAC3537BE348EEB932D2700855C1B38E6632AB42688EC96E5 +E70B6E21597DD9AEC0C66CD5BE04886842418E5D7026CCF8F3CDA2560CB15D72 +64FF100148BE72752ADC59C8F19B039954A66B5D17B03ECE70228085BE334806 +FB49BB79CE8082CE9CBFADC30179B303D64C34BBCD9BBD50D0773B7EE72E9246 +5B01B90848A5ADCC95227310A886872DC56466A02A3A9A5F720B7FE4EA511BB3 +518DA5D1EB43E13429BCB41242E8D2908CBA3FD3A2881C911BF95BBB667E8B7D +612A9035BA2602D6BB6E44C66138FC57776827BB7D6E19056EEF9D1D01CE27A9 +02C6517FFE875770123508F5C5FEC021C2BE78AA71F9D9952EC91820874B0A93 +AD291A3032F4198BB8BFE80EC6EEF6DF748E37316383EC01CEA99A64CAC75EC6 +1BC2997B1F2856FF05FB6772F6BF07764CD4751CA4FE1657A1ECAF6D8C5AE8F0 +8C9247C4F2BABC32CCD25E991A387DB42B2DEDA9FC2ABC3137D87C9D54778164 +7EA9972546C794D69C636D58859035BF8CA3DD17231F354445FA10DEFCDBDD9C +495A261258876CA0380917962C18EFFCBF89DC4194FE9A1CF72DF12AA04A6084 +E631F9D152775E93A4005A19C1FD6A4EC47EA032C6BE37A2B78785370405E27E +6CD97AA308A962761D4B7FCA5F042615169A97F738D2E3DB6C4152C6FDC5D5E5 +5161772E44B4D900B9EC705103368DA03F5E062C2936E0A98D310608BB170E0A +721766F9D9A6764720624C1A735DA3FC426FA08BA9FE9F9375A3CD338F0E8E9E +AC95AD060D67186CCA0576C1BCD646981D38BA1D3D33819F9548E468D9A8460B +ABABBDC0A2D50B5C4224C722A681A9BD8D7F5DA2D4A343D1BC9029F1B9BD4B7E +FA4817CA039BEE3856BE4B367F942B1A9FDCD1B804D69A132A476F5DBD8D7253 +E11FAF4B04BEDB7CD483BA74CE27B2C4557DED04E0A472F4B745DA0CFB86A9F1 +8AD4206B208661CDCA7F7C7ABADDECD59EB566F647A9138A8C5376D034878D66 +B4F4B241411B9489A2D9BBAA5D69A6F075B790E42FC929F4703CB5993D7F2A5A +233C307CDD20F07756AC73E62E3FA4B599A19B7114033A6CC6810F1166A06F2A +B13A9F2183C9B05F13D80BFBE21F47BF5948766D82AA817B5DCEA8C3332A308F +72AE7EA0CDA16227B77AA521C155CEC0AD88CFF8F8EAC7C6CF91457F050007C6 +FACD0E8DE03F5A484920787625CDDD132C551ABBDDEBB1F7614D5B84937A03FD +51DC15EE0737A98368B12D24F6CC11F6C6DE487B0FB803A2322EC745443F93B1 +C31C452CB55AB657011080D77DE585799101C012ACCFB55B0E0DD7788B6D0BA3 +8C73441FFECBA1924D322BAE3B180D6825A4C3D4E0E72C2446FA448AA84A0FAA +428D6784FE0DC862229A2A4432B21F3A4A9C6CE0611606F97603609792DE3B44 +FB1F8E62327ED68CB6F372522C05A857E059337AB8963C9B74458AFE461803ED +0E49E0F9B522BBB7AB20BF8C80937F41971A3FCF31D06F62571373E097558027 +0692E476E281AC8009A400AC26FAC8D7E8FF65A454ACBDD1462A89E8B2E7C7B5 +394DE68607953A7E3555C7471750033EEC5120731EC09FA95C9790777712BAE1 +36730C0EA143778E476557720F32848A0DD352F1A909AAD94A17EFE08EDB3D34 +E2CD67848B90525F263F480C47BF4ECFBB1B74BF2A905127BFF26B3E844A96BD +470BC54684FE137B21821358D191B3A511B8ED334E1FAA089A43897C1DBEEF45 +D9FC57743DC68822F51FB589DE48E0A2FACDDB47405E56ECB39CDE9E501FF1AC +0EE82A440A3F32DBE2396C3F78FD4C591836913F2E60805CA398377919C31E47 +030E4561CD6C7FC45F0ACE67D79473624794C8696A79CEB837700F3EDFD7A8B3 +D1942FE8090CA16D616272E8A3ACAA54356EB2052767480F078B395BFD7B0CEE +182D6D01FEA66C5A6941F74D1BC8DEF650740B2A2E9848262290D704AFAB96E6 +5BA9515184B323E2425356D38E85D137F79C13495330F034FF7BA30B02C5AA36 +8E0EA4A6A10A56E4CBAFB2A0043486426CD20A168118D5427FEA1264777F8543 +4A415049AF307F6E4C982FBB3718E255F947C1F2BBDE78BF7C08FDE37C4CB6FE +BF88A3AFC4AB9B077516D7898EC3C87A4FB2C2CA4E89F6FCEF185990509F91F2 +1C85F09084E3490DCA8F96FDD0CF777FD4FF021814DBB471891F8DBD584C475C +912EF1F70CC389A390D36F290A544F1D3303A5C2728DEA320843076351921FE9 +323462B251FE732D2EC98BF1E4ED4C3F96FE04CCAC497AC8330C4D3D8D3AED08 +3B7BA8E51544DEF22CBB7FD126F7E01D6E3E6DF0D2F38E0B059637D90E2E9DA8 +5A1A404BBECEBE1A0D5308D992AF73560603476754C6BF79126C436F8081AA12 +BCE6E8FEF3DD192ED812E7BDB1AAD1F8D14C169889B6C1E155007DFD98140F6F +37AFB159DC12A9E05A272C8C7655229980B5CDAD4047D89FCCB41E66DED71F63 +F07673212DE5D6FE3262696586A92EF04561C101405E21B341424B361928FA74 +D1F0F4B36B01FA6A07A7E45443AF1CD8ADC0AFED6FA8D8AF2C8CD5272A53C28C +AE944B9045DE6305CABA0B57CBFCF07145C297A4BFA8B4EA532BF6E6A0D7A452 +1F2CA064ACA886650D27E3F605A27B8FB827BC68BE30EF1707E819BE9F90FB5C +D305CCA3C1C6DCC1F1A1640D04A037977721F14F49F449D00CE1AAF040CC2FC4 +7614798B64A4BBD1776F9A1F958C0364C5D87555CEDEA1D979AE13F028C1A79F +5232C1706CD1957E6B772C89DC78F9E1F2D4B4CF9C3081973726FDC294698D7C +5B133F141499C32F8A466D72047ECE96EB36F6CA3AEFC2DE54D25DED3A3E5A80 +D02DFCB3A5E366C0581AFC853566B5A8FE47871B3E283257FA60C5AF514EE72F +97E44BF870ECCB515A94ACB1BCB22D37D563286B2F5E484555C5E94E56005A86 +A6B2AFCF2166929C97434E72C35DC831162CC6F484F36A130B8FE1BACE568210 +90ADA920D96AF14E812CED41CE8DA5C50E9E7B9194BFC59E3697790DE569A6CB +DF2CEF5A4E802CF13C18826C26373F508B6972B82BF855F6908687246CB307E7 +38E9B07F8048063A9BF4B98B8C064D1F156887727D430BCC27D5A0C406DE1AD5 +140F883DC4948F45C5FEA6518EE06CAA2173A4DCE956FC96F1B1A4FDE58FE917 +F92BA13F1A97BE8F67D7F4E31FD190E48BFCE942219AB34B2471E3A1DAEF0391 +EBFD2D7E6B21A8A7E14768A51A5FDA4BD00BC6655F16C8186DB3AFA1BF4B117E +EF707AFB48006BEA3A03CDEA5ECE604C5EBADCCE8DA638FB8C7BA7C62C458703 +31799FD9C1D86BA345FD20D20819400EA4C5852EBDB2BC24D93349E4A0F83B13 +F00FEB05C4B9EBF60944CF77E73B7B02A4FD77C55E8ED9CF5F90B74AD0F7B31F +45008D57A1CABC54D17689256648BA772B5C5C4187AA81C5BA8836C4FA9ABA57 +7BEF8291D50AACDBDA73923814A2B3E7B42ABD14F3A14A60F4AF671FC8DE5ECA +A91A3889B81A2396142D56AFFB120C5879E5A831241C321EF41D4F07F9D042D9 +7B70EC2AD9B5AD42ECE4467605FB8B7A51E9EF319684FDEDD446C5058B5A7C5E +0CBA92B61A69E6E3C86F927AE51CA81DAB7192F880BCB408DF63BF96E7F0CF96 +EFD11A84EDF771B51B13C68E77F555AF327FC45AD346491162CC3FE0AC38869E +A4AB1727C8B50EA6025FC0799CE6CC08DBEEC0F159D48C56DCFF08D9DAE3012A +F9AF6C7ABEEC3DAF9A802F246923709BE64048C9E9F409485A1E176E62DA2859 +315677A95BFE35E67AD99F718D44ABD943E5B92AA0F2C59780C718EF1B26A631 +233F61E53C8A197A0AC2AFC9775EABED3FBB7130081B3D0C9CF4BBB1D9A1B67F +AC2F993BAD45B51CD67920E4F9637B69F849E89844991ACAA1E8790D19B5DC31 +DFA36E3F855DC73143AEDB781072153CA543A2DA531EF0DC4810FF92D9B94FF4 +DAAC1B0DC33836A54820C7C7F5642F0D20CE07AAAC77AC4FA51AB8B736586F65 +56A828EA7DB2E6AF374D40D11C30BB974D7ACC1C2B27F947178F7AD8B35BF2D8 +EFFD2E20B8C5BFE5D8EEE155017AF9EB37DE7F5544097DD2470F66AB07CA6382 +226C92B9537D287A0A1E57AF6C1A0A18DC3764D19D0A7AA3467FD97AF670A0EC +BCF0D4D42F1A493467C4535E82A258F95769C7BA6531EABAD7798E22B6A0AA63 +4AF47B8197CFFE4DA3FEC29CA25CF395D601F06B39C89D7A3C2FB110CF59402E +D3C89808BA8D3F0302F82C7E66E1DB53D7B02FC5DDE9A050C2CB71003807A9E4 +9B73F7B945929F9B1D8C4976CFDEF099B1A8EEF3389797C90CA68DBBC3816567 +24D0C57D55758F460957705F1620DE8306256180F1DD9E98163D499F6BAD893C +73A29F57A88C79B55D644C37882C7B82D16CB15473BFF847C60373880EFEFCBF +15271BB52855B75762CDD566E6673DF95BB784B578353C1BC5B56AACE1CB6944 +6C79D6DA087565A0714E5EEE2D0EF9D6E3FF7EA0331DDD7AEC7DCB441C81FC5C +12A3DBE217C4C6CF893B0D3DA4B73DC2F2BF130E7813E659A7CF758E73180635 +D5C9EB39D6802EBDDCE71040B65B96EFBA434E55F0D62274D2AA44A21AF5B0B2 +839A93A97BD9A732334EF951518FC8A0B10C916994BA16DA6D4CCB190DB6D252 +7A837AB66DE254292258131256E8924AC7A0F1D1AE25DBEE15545D26B0D675B3 +73CACE88AFEE6A1102501F8BAC82A5C49429B802E81BA07D03321DAC1541EC5C +FDE0C08B796895F2E1B2C82C158FE38F1DB46C6B525C693253045F9A41C99162 +5C59DD1A955D89A9A803AB1B386E563E97CDC59A89F7ECB733951C53B405D0B9 +FFF55AE6A92FC524BF3627690BDD7CF51C91702ADACBF25FCA4472BC9EC24109 +3A7E7F146F626FD04B1B1310489FEE98F62094536EBF413D7A14F4630CF0049F +3B06B0C0A9CDD4145844ED7B2A359DD3F3E76469A1E1F88D5BA08D98BB152BCB +E82452EE2678CCAF2DF565205F1EA4B7152DE9267890184D2643C0EAFDE6A10C +6D4A118B470525AB8333793D68CC118FB4C2594C9634E174E40A287BED466AE3 +EC659A1C817622EE74FDFDEBD0C315026E23F246872822EE91CA5F54DB10D82F +34CFDFFA8EF5E7DF28599C76C3A5A8A8012845667C3AFC8778CB308A7529DCFF +946D662F2985478560495F401FCDFE110B652F02486A31205CB3409BC2445E4E +4EE5DA2608260D1F0FB9F19479CCB6E3FFDFD9C0AD22D05C71F85253A8A09AAD +5CE32BB44B26A5E0CC4DE00BE9D053F69949A82EC43216A10D33D971CD003E3E +05E46A797D07FFE2BE809534DE891063D91EF2AEB2CCFF995574A4A661AEADDB +2901F6390E93E1D40E98C7269B5D0376B1D556138B84C668A3F01FFF41563CA8 +22496A230B1744C5E9BAE0716FD4B20FE26F31F982E8E15F366CE98AA78711C7 +E04BC14426245E073CFF01B310EC370CD7A1D12442A302DF741536CB81CA5AAF +7E1AEDAFA92693552810E5E9A30070825694B374AE6A71C2BC836CA76CCCAD00 +ABCDF96D1A3743C526FDE299FE0D34D2A02D61C4609A4308E19B7BCFFC4F7468 +141592B2837E7508FEE49BD3CA0E7F00EA0339442D5FCD0D613BA8935D73B22E +1D04364D7CF5B2884B657BC4654DACBAE1A96F281123179892C21127466243D7 +1EA15DDB2B6EC1BD2FBA790EE2F3A78CFFEC079558DE093D4D5D673E0376BE27 +D97737149CCB05FC15A018303C8197C6E9341850886B9BF902B1009372565BA2 +156D4594856A834EE39E1F4F4E97AD97CE3142E0315D0DA4FFDB85EB20C1849C +A202430CF6AAFEF97F628D7A605E4E321B6F7338E5AA37FE94344F98CC48F5D1 +480C452EB80C17591C6DE1D3BD4128F0A87EDB0B4E6BB00C0DB0DA7552C98FEA +1ADB74A24041B574EBBD78AB937751A3C5E67F47E90FBFA0D88CA6CC7A8F06CE +9FE37899631D1C4175EAEF9B0D206F218D72495F0BEEEDED6B736898DC7F5BE8 +886C6F1F971BE694023581596CD92FB856770236CE273D67E589DE38FF09AC56 +54FF28A6229C014184100E63A58313053CA2AA7178AD9E83799216DA2A533532 +71491192A6BAA0AB61045CE0BBF1DC3F97EBD47939442D56D60BE3C8769542FD +82BDD0C82C59E12EBD65FAFFFF9FDD1DAB4C2DCA793073DA6003D43AB34D49DE +6BE4984F46469246C696D0DAC8CE1540946D3E1E3DCC62DE19C0831A2459B282 +0B3856AC04F1C8FDCFFF85FEAC4F39EB3978DC78A39A491F5345E76737F6D744 +949BD6C007C1355644E5CE8F5525830A9F6A41D5C4CE124BFA22D934D6CA17E7 +A605411CAF6FBB973412C0D77FCE528C4D8964C7FE38AA2E5DC90266B29B43D3 +5C5A25157C68155609D313E7F15B055FC0D94F2C5EDCB633623168D4A430FCFE +AFA26C0FCB586A81567FD0F442B373F2C2244648E0560E0A8E2B250F6549BA36 +57E2B248920DA2995F735FE19502BE2E8E917EEB78DCBC7DA169D8A9CDE8B839 +8E49BE238E46CEEE2FFDCD4022924196A92BA33BBD2631A7299FB77168898816 +12189825E564FFFAC9BA9294B7355FEBCE3A2656F803951F3DE3703987BA1C65 +B70755A7A84702C1650E6BFDAF02630057C81DE4739FE219742C9B7B38799431 +77010C455E31DB824AC206466FEB06DA7EFC0FFCA5388F5542F93C56F9311088 +EFC400535CA13B64406CFED124CE07658514B0CD9997EE7BA1ECBF9F208A5842 +48A6559A124253BF0B7FAE1A572FF4ABACD0EEAA5CDF41731983F2AF1C3480C3 +6A702AAA1ECA89433F5C432AE2BCB78B762077F5885154A59B1BD750D08F8FAD +1B239532A4963508222BE34ADF98816F358DCFD5F81ADD3C017A808F9E8CEA8F +FB112E2956EEB689E0F7BB4BE12317FA352C08E74EA43CD49C200BD19DB6EEEE +36DE5CE0E2C648212F1991F8CE69D093A792C8C16A31E40C436744E47B12D24F +69F1EF34986004A83720144B5DD8C92695818BA4D9F95CBD1607BF768FF81F9A +457B40E7C7C8218FEB865A23C41BB84557B5975F386D48F20BEB92E9B164988C +426BA43F1F30EAAC3AE65765155B94555E2A5171DA4BB3E243DD6D50DF5E365A +A54C5C47F62E3472D363189FB9BF00C15850225A95B2A5F85AC26758CDF14058 +7BA3F07245800F0E1A195477BA46830353A6707A63EBB486F1A2E628764849ED +6A082DE08DA495EB5A1CF5565A0DCA7826EE7B800D4000619E90211C19E705E3 +D667188571622A904C468B19E515697B7D9DC650C1FE08D18E0452BC32175CF3 +D0AC419627C323C02CD6E23BA6C0B2E95EFAD56AE1C8E750CF210BE153986563 +5D15CA3700598BFFF0CE909C921ABAB1001F846D82C5BA038D314181B534D17E +36EB7B608D2AD01818D2151408FB57D70EF005857BA884F800AE2103A18A1BD8 +F507E08944D6E0FA6CDE0CD3CF6D07898B8887B2A21776A198FEE71B7A0FA1FA +5B6624E72FE4A672EC528F7160F23F837DFF75F7DC11A78B505A31E90499E92F +A29D9E9D5E385BEBED4E543D0B0D92C271B9D517C82ED234AEA1DBEE24DE3A17 +C341549EC96164986809E4648092F6ABABB5EA4F9031F89D706F3445E2E52250 +4BDB1C62D2FD8A71BFE834C787C603609B62915F436D56A385237B84C024C2BA +450E64CFE43893B573415FFBF0C18D97908CC3DB39DBFE5322DA82D4AF6DE21B +CAF619898FFCAE76174518C33E6EDAB7A2EFFAD5EAF8FA4F7A3D021C55A4C002 +DDD96D014338A5FB2C214B43B4C6B733BEB957BDBDDDA16B762C82C4DB7CAC2C +5C66C8C248C6B48A5AF78D7B718C988182F6C56635B24FEE045E6B5428A21833 +611058A27DFBD824ABDE08615491A1439AECD10ADFF051658375263C4C2DAE8E +5FD3309FD5565082C64060ACF770FC723BD76995154D35D182DDED00B80AB6C6 +379C42D40BEA5A574E489B263FF2A27E12DAF300D2E08F439728CA0C1370E6F5 +C32E0A1D5B7C8C199C53AF6BF8905FEDCC883E3BBA883FCCCA6366384DD69818 +D9C4C2FE0D13A8F82431C2A4964D949850B936C89DC34853D7070AE0824199B2 +EA0787F3ACA846E37E9DC39DC89E106204F6234480E07E2DC94319BE1C488F67 +9E984848253BD7DB8332AC0425376B6B3F07019B87120B0F25807D6770754143 +5054374D89E7D617213FC9F782D34730F58E916F2DDBD5319F0A9BBFE78E253F +BA463950D5737B84CC250DDA5CA4A9AE3EC7034C78AE09F6A05BA63E8FFC3175 +821DCD0275020A68EC05DBCFEB123D114D3967C7D68D5A71BE5090C72472EBC5 +472FA95F07C1B85B91B03BBB90B5BA9263138807B5139CF5C35481666A7ED675 +986A6305DBFB1E8681D61D17B903F247CCD7E94569F598958685F487F413BC05 +90B76EB550A20CFA7576E3F9901C1ECDB60142F578FD684382B0BDE1C8B8C40E +70E200C825E4C853D1DE36CAD6DBFECEDFEF4FF8D9610535722E7E92FB46AF92 +30C9CF8547B36B788F6B464D0403FF830E75FE5C488671F49EFB070860EEB9EF +59A0663919E552FFCB7DC70A9B37039FEA11F955E0047D4C51223B29AA0AC2EA +49E41094B59A554D3F6B89B01ADA663A7239254BE38061D0FC1896AFE32DD6CC +9B7F45FE6CBBB251604917CCDE3217439C4043638B9914151283B1DC4FCEE80D +2851B13BC5FFB868FF564683292BF51F2FDA82587BA89618CF171347CAA34671 +020A84C1235E7CD9232CA37438638C26AF281B1437D126B5848EA474E61B2DFA +887AC50CC739C34F9759ABD50D4814D9DDCC3023A307ABDC42DA6A5B11D13E8F +7DB330FF224E96FB36C6FD432CE957A0552893EF638DF8FF77225DDE7F2FBB6B +961280AE30FF7A6A2DBC7A06CA57F0F53FCAD4B5716839AD1B1C959535AE4888 +125A1995517B77A52783D0155B2779DD346E873DE3C6D648D1A7C9754C29C343 +D9F8C81EBBE8F59906E1A610AAE958373D315BA032EA026F22A846D421D29B5F +49BC07D6C056B61B34293BD9FAD4F26F5F4F75C1AA67B8EF5B316ABF8277F39D +C3E23830EAC84627EE1F023A670D25128907885ADF64828B9066A56AEF4D1EAD +98A2ADFA5EBDF80B3569D93B60032B619F7A79A19406C04CE33112628AB098B2 +609CBF3D2E63F64AEB9A68526B4C9696D602A0DD4747AA230DEBFDE27B1514B3 +66BE6C0B6F33BA3A990F14D0148B7AF706B95F4677A8F0E84164F5AA9888FA91 +BBB46D23B89C6D9B3276AE7AF2DAEBB0658232ADF4BAB4C4D75BAFF7BE9EB97C +486F625F571F41D950E521C162E4FD8CE1643E13156A74D63BE736BAC443CB59 +069BC06608C6D958A0CB4AD2F5CDBFAE0922ADA57600D753A9E48E82AE08B34C +F5582BF8B654370663ABFCC008BC20A004F5DF0FF001B225AE06F0805733CC40 +DADCFB49CC90404F387E9D126330BC4221E4BA6A0E8A8C496115DDCC95D5388E +E10C2FA48BCC7AE21CFE7CFF979F91EDD80B80C18D877BD93D0AF3E02F79DF4F +981FDE508492B20F7F37E9D35B69DEB6D1F8AF3F05ED411D61FA89F8913A690A +A3CDD0D72D529483734B05872038744F17760690EB6E6B8167CF2581B13521AC +0BAD559B9C1024083AC6AAA885DFDE9AD7DFEC0B0139754215569281843A5073 +CA3AFEC3E265C457B628968C44A6AE9A53FA423251A03AA270F51F13BA5F9FFA +80DA548D56DC6D0417F3DA517058DC9ED756FB2E8867B74FDF70817C15879C27 +0D8456CD4B4E39B41B635A8E10DA744889CDDEF45B406BC6D9831F0DD0AD77CF +13914D7FE112EFEECEE1F881F9C375A9BCBBC00F0F3D0D5F9DC58CB26B2C63A2 +20DD5A5A1DCB3F49F29073957251FE88D9DE640BCA0978DB287357AD5BA5069F +B7ABC4F5B10C9FC272A56490B24E0FD2F5BC3FF60CBDA5EAD0AA4CBA59E6F951 +F5FCA03546F7D242A0BD67804B580345DCC9C68445C213ECC69E1E730BF6EF06 +05AC8128F5A4D3140A8844846D174A77F0D4ED59F170238F0876EB4D3444A080 +44262048710F00D7E218346004BAC79802CE708BDA11BA209FC9002AE1B694FD +3F616199C5AA6590761585C12B49F795C9A8D00808697A437F00921C66CE6D86 +C68FEE49A62BC6787680A27A0DB318F4CFE0891AF2EB26365BE68F2438E0EDC5 +75DEEA0C73886A0471F6053776C786453B1C092A553B7953AC92B2B10EB1F8E8 +EA68D048E35E3EA92BD0BD47632FD6E13BB4DA00F55F9199675B8636AB23D634 +06EA2A5C58737A8E30EA12F22EFB2B0AAF180C3130122D385583FF417202CA9D +588754F5501E5368BD33D79BE01D9A2495E7F409C9DF4288FD55B9076478B41B +B4085CA5B8D8B6701D50788124E5656B3E9D7500654730006F3A39B4C76ADC94 +9FE02603844AFBD18144BDAC7DD09D154D6A047A230D44CE62F1317B2A3B783F +C13722F7AEEAB2F9150A95FC8FBDBB6CB0415D5409A57795F5083F72D1FD79CC +FC1FF965FDC61297B4F76D059C493656CA6F0965F54229BF23A13F794B0F5BBC +D4C4D0351A346DA55D4221010DC9A458902F20ACD56F01F409518C4EBE896B5A +05CA57DFA78DCC9DB61D0C477D131CCF4DF3C2DDED4E7573E6AD6D5A54536E5A +007FB21C25639DB2AC2C5B618325EFCA183E89A7FA85A0C1D6812F0CE129C5A1 +F3DD02C6181728CCF87D6F8CD5606D113EC79899621ECFCB29F8B4C4F08E89D3 +E7988071DFB3232C7C21D04C5A2F5AEAC737A1392DC2F60D88BEE9ED6E882CE1 +C7B42E43709F34F68CBA4F352B387DE2DC06E471F98B310D0BD3E994FA0FCFCE +B4D97C49E494F814FB09835AF83EA1E18642F4A4C32D04BFAABEA46BCBFEA0CB +F8230E404ACE57162F9F96CE7ECC10F782140E11F23F4C2BFA61AB6E1ACC9496 +012837CA40EDBA0C62E1230A30D5C8D2C6F478813CC3D0E8BC6ADBA1E5238837 +DD5C6E4F1675C92E41CAF10749907EE81DACDFD8A65A9FDC4ACE2AB457925E68 +8DF970BB7927FFF2E957E53B966C2A5D8EB11D43A8F10DC21E3F8D2490997229 +3AFA58573E7297834E153A23A61E1380BC0C8B157E3D52B9FE1587282DBE52B4 +7D021A4F83CBE165E8F7E25F91C78F8177DD0C5FFD35B497E519444446F0E24E +FE29CEB06666E1F5760C2D2B5C8153659DB7AA36F284FEE3951772FAA4E9BD41 +D9CF7968CA215273E88FD37F1A64B7B4AFA2E239BA6F9C463A8C5D0CDA152D44 +E61D6524E88D940FDA1B4306B1388863F80ACF9FCEA03C88ADADB7C4FDE56D14 +2192097015E0C4F622C4118EAA3823248E6B9CD5C9DF3517F731E17C1DEE88E9 +8C10DD9482135FE1581B9F9D274AD2A4F4C4AB82687C897373786FF3A19B5DB1 +28D5A3B59455D17D2442BF44AE3D3E37E5635B3981346782D169E3860E6E33DB +C5777DE21CB2446D3D53E25C1C3E4A5319068D3A4EFD2D1616859959B5573B97 +446B9CFEFBF8DA22FCFBDAF672748900A1986D6FF0C7DDBB737AD8CCADB39D93 +B8C0B42AA5811564134EEE9E1745DDB5D87D6336E21EB806BFBA21F296F3620C +77C57F9F2F1535C1847D7DFE870D292F1889B17F2A1DD8122D646D4B5ED89A89 +A27B55E5E3DB0A21BAE974EDD145ACA2D3DBFCC41E1442E4C71572F6332A2BBE +1F26951DD76F7E9F1D21AFDF2B2F176D5FA873A0E87927C98432469A5719E87E +61F0AD048A2C6CEB22E0A274A2E24739CDAEF7E741785098969714FF22FD766A +AA91BAA4F2E148AA2A4849E44018CA3A56CB24F661BED204A3228BCB34A71328 +DEA7E832753F683136EF071596E0E1553FA9B7C0FEF063099155D11E2B4CF246 +01F0BCCCC30D72FF73C88DC2AFC3E2BFFEE8455BBCEB9E130D528E13BCFD9FD2 +A0862E4516CCD3407C7C7EFECA329194A48BE68A099F9CC80CF4724252DF4D2E +BEC248133C357C7601B3B7D76D040A3EA0F3727C4479F1F781F9EC9EE799A795 +EBEBFCD07D218B1C37351AEEC49D2FC2133127ACA717FB1E3DF5C553D7B867F2 +984659D466BD116A607E68A3D7776B10E62DEEE8AC4E3D019C65567E66CE17C0 +5D77CA70FF0BC2B669673169C842F724BFC7DBFA4E056DF12AA73D85669610F2 +98F468FA0BA593C51040940E87E2E7D3DC8C2E843DA2756D6D139F410F146B05 +D18180CC1FC0ABF1EF9EE86901E87582641E7F09BFCEB2CD5089A3D6B510C792 +C60E635E453519CDC183DE287C8B2340D731E4A792CED7174B9AF9037DF5B279 +8375003A95965124AF855AF2CF04812782E1CE0B1B9BF7C188A53C4B86321301 +F023734419DD8F8236B11F4C7015080B3990EE63A22D721EAAFE702856A5ACBC +ED1FB74F68245C1DBF46C33B755777B983DDE8D41590E7248AE8DB259CA35197 +FE3ED93CB51EDCF280E094B2CFC61F53FB5A52CE74702030A3C90CE2AB3B7FA6 +59B305765206591B0143B4DA04D625B22C7264C261917A02A2750BA492C0F0F8 +114DF714AA6B003B9540001644DEF7462C01F7B90E2FDC0981E79E9763A10251 +FE38FCC2FD0AE00EA22722F96BBC059C371CE5936C634F2D07BEA7D46CD3CBEC +0C7862B368988A95BBF0CF65967E54EAA99F39A23FAA08FB2858D70CF94E865E +F7D4A937C06917E8D9163A2CB42CFB57478EDF9E6CAF70DB5477AB1550E97F12 +E55CE92A01EA26E55A8BC51A38EF2079B0D7BF46376B8FF0AF901B8227C936EE +19B7AEABF17F242544350A1D0C28CD2E526A44E60A708221302E3B16544E9E84 +23CB9A8057A7068320F1D53DA24B308389962B9AA889DEA3A71C10E4DB41B967 +2C2B9121844BA1C256EDDF8EB34ABC0B1961FB40B44656693EF0C864971A3627 +C9C8D89E73445E684A49BFA4D3670AF017A9B5425085FF8CA94484C8D06F0C5E +46302D06D1EB646019513472C9FA7C2296085E208C6891EF2A7E3DA75E2A5140 +F5BEA92C2A5AA6F44E6B2C1FA1FFE434E58BF6CEBE3F90E0D299ED043EA27EC6 +3CDED517A698152C766B56AE25BCB8FD12C27F0AA3F50FFAED672BDE0E14F674 +5EC2F24FC0C84D684DAC7F10B2CC4808C0A9F91818DD2F05E364D0D8658449BD +BF598370B5FC48ECD85DD9166869DEFC21707C30F7B7CF99A34ACF26C62872FC +A15EDE09F554E21317DFCFE0D45CF7E38A72DD2E8F6AB44541D85E0F95617224 +CAC6E099E08CDD956DBDC49F1AB81DE6C6DD6C48241C0985FD00952B453DE19B +2EBB3424E658507F403FD0BD1C0C5E09F15CEE4A24DB327DDA8D88D18A41DBE9 +26761688A6666DC33A6B0CF337FAE51CF9337627941B818FA53001F639D488DC +C10873E21F3BD0DEBA50BBFCDBB76CE071151AD2C3B54E7DD18865BE6233F95B +69DDE72B7679DCDCD24DD7DB3732A1E8B4C8024AA5251A4FBAB4FDCE468774B3 +8904877FFCC902C3DF9404F3A1C7A1D0F49A3E65C7133B4C1049A6845A57638B +A9B10CE7475AAFDCC84276DFD61369A1640C76C2372EE95A0EC399DCFDA9133C +C593E499E24B5B2D03A6AB3E43B4B73E233F7F41FC38A0FE60575245327A47A5 +41E2EBB51562EDA317BCB5E207ABDC58B74F28B904DD69D58D534662E95CDA5B +DEA467DA01B240A3A71B2624B49B71DB8A81A3BAF67E15F4F2B57ACD1F1900A5 +252B680D17F0887F613BA5B9081CCABC851CCB4C37A8E147D3466526B407A4E6 +19EA389E1D5ACB3B494BC5BB2104807977E5D773354C9AAEDC1B84A92CBB706C +C4247888B0E2EA8CF8AB5F7B89834C08AD34CC099A59CC51264D833332D19422 +36AD35E35F1518AFC233A4FC35CF30F94A8518E299B6233AFC100FA3B3657225 +88A43DCCF90B6CA4DFF9685DAAB56CC40B6150C27CD76F4AF209B2385D41BA2D +02B552C436304431B4B42C4C94EB36BAAF23740E36F555989CA4BA8B4C17400E +044C7B7482F0683EDE11DBBFC36642676F02FE0BFB74FA890DB2125B1EC34561 +77E3D7CBC9BDBE1A50662C9118B78EBD96BED8BC7F2661AC6E39696CEA072E9E +485DD6FE282F02DFC87F3588DE87F1E5B4ED84E5D98883DE09CD37B421ECF443 +F3FF7E57D32D528E5AAF87436CFCA1A0D915E1FFB734D14F81F4629400931E49 +E5908D1D3BB86B3E02D69BEFB614E5F058F715935AAA8A9B03FE6BF82ADAB9C8 +4C382F364D128BE5558747DFA3342979954B0C484B698B663508923650ECD360 +E75A9FEF372951FFFEDE0561CEA80EE29F015EAED4708616478E4405D09ED7C2 +6221BFB22BA42401FEA2966161A65C08275E9EBC7966E560E69AC39CAE196BCA +DADE8D7FD55E69EBC1F74E8E0CD632687DEF2E32D02CECE979BAC2694410623C +E89C01C905EE4BE92DB386768475C054AD40FAF3B044ECFEE1167C08592B4F6A +038B20DDD4F8C70654A00C0D28107E45BF775B1219DA6B884F7728E0FB23DEDE +A79D8B6F80E1FDF72EB717620544E58D042BFFB2A89F01B7E2573F6B5DA82DC3 +5F9ED7B644452FFACCE761382BE894061AAF0ADC92B218D3F30AC8B7C2B4474D +740A9661FA4F44EE53F2BEB101E16102AF3AED740A0486BE28543BC49DA90282 +88E9977720ACC7720217108EFBDE37D013FF19B60744D735AFBA27C49281CFE0 +84E22E30D2B418CAE223455679F7AD9A8BE049562B8F8069B2DEC65E6C07752F +3AB1D19C6EB11903187DE9A2B5ABE817EF14C5F3CAB32B382A4A1AE10E9FAC76 +57275CB4A19D5E4AA90485C91DE7D83846A309F908C26E3C98110BA217ED7A54 +F0FA10F8CC083189C8ECFD6D24ACBB7D14BFDF7E8EA573F01938E750BFCE841A +0877F25A4EC9AF0D17DD358329C5779E3C4DC2097CCF7B2F23A3670B3B67AD31 +5428E0A587AC2806A9634B15CD1AB20A0245B4066311CF8271F005F66A22B102 +04DF7C6E1BA88413155201BB2CEC6FED892C8F812CA35EA384FCEC3DD8D5BCBF +C1E676896DFC2D34507BF1E934552DB0C1BF2DE3881D42BEE94FD8B1835463A5 +51868CFFB3BEC123D3AACBA8589DFA7845CB99C5881FB07E97834E805686EF4C +50B71DD309E704EC56C5B4C431CBC6A9C9F7454ECB5AC64113EE5D90DF8C1ECA +86386B38D6A985E03B45448F55D39E07FD4696FC4A2DBB2B911583DFBD10264B +9EF54217156384F8C0D5C99D0B6EB62B88991C5158542D202DC1B1365456BE94 +7233B0B31D541D15143EB4D48AFA929E22ED2E3AACF090B9E50E320256D95223 +2E4B473AD58805DC0020DA6FE8CEDEFF339569BEE59BBAB8A9C789A4D1B1AD24 +07C995B974AC8C26728E25C49CCF2F54341BE82892B3D3C1243075E500679F93 +7F120BDA233CE416FCDA2267AF799EA4345FC4B932CBFA61B588BD7152996EA7 +D441EB0172E418E22A0120D148A4C1F73D95595670BA3F983C7D36EBF68B0916 +407D8083877311B5F8C9A72023827ACDD925B9FA7FF7C1F629FAF23BB224EB30 +1322809CAF5DC40F883929D1039829938E19FDE2559D2CBD001A8AFDC7E2B716 +8118701CDFECA74D2F7A82149B3EC4101C77A0DFEF11F3692FF2B3DFFFBC164E +BD71DA2C7005F942C76C3454A7904EB717C16848A7EE8B67A7575F5CF156438F +0D54C88F91412C0A6D87AB253B6065B997B84AF1FD24B03CFDEABB2EAE85118A +E0A35424667E71F732924097AF22C28DA648A2E8A5BB764E5DF9072E6C503A9D +C05CE851FD964ABF5A2573851F7216E613F4535FEC10068E88C26E799EAABE88 +1BB6E4BA270C2744508F8B68EF9F551E7BD3247969CD3D53569723EA41B32538 +56AE9E4EF636C1299256E1D1E4ED108C14A69082900F5585906AF8A899A22450 +0DDF61DAA3B3F626DF290EA31B1F37F6007F207A78C798F40853C40F62DE362A +08C0B06386E1A12270C528135D3C2602B14801C37323B53887FE309227353E7C +A02D6EFD99748B9CB2493612A80A936249BB17F4540F93A750C56918D65FB485 +693F169B514B077E49CE664C619653FB7BFEBE77A63D1B2FF857326654F7A32A +87970F775C3C57AAAE98365D69D3CD9AAD6CF26ECE04A9DE4E3DAC9C9ADAE5D8 +0C7C60C62F69414150C31AB9E0567F53C3A8F575DD994CE0F520262497BF8DE8 +4D52C3D9DD349A062154CEFB784AD62F625163CEF7F01690C711D4BC6FC53DB3 +A84187FAFEAF5D93D0F06A25B4EC48341EE39A8D1F8F7387E5A1DADC00F2D83C +4E094BF1FEB09A0A7E6F0BE30284F743040264442F3188C84D388FC01332DF39 +2FA2AA98FB6A75E926749781717D2AD92ED2E14EC42866EB5046F7C8CF86D298 +0BF6C520EDACF09EBAAA43A477EF416E8F1088D31554E1CFA4552E1914B908F5 +92513A2C5416B76FD56C12535E2656344D0877105F841A259EF69927AEE6B1D7 +BED8DD0F6CA7F6D5CDB621E4FB44899CDEE60B8E99F3BC198912E3687636221C +4CC00D2A8A80F196237A54BCDB1C1ECDE659D183A900F544205AEDF192CD8AD9 +0FE31CE9513D298B7DF9E2ECEE56C10DD81E4175DC2966504DA5B1EAB0D88400 +3A43F4330C53D2A7506E240934CFCF65ABE9C39DF8F79442D3B8872519D89ECB +766F57344FC42D5611B0B86EE4CCF4BE6A550A7E32FA83A8DEDD10279A1A5CE0 +63F3DFDBF95D2A60323399469F72C76FB26B92D95F1ECA6F6D4CC8ADD207D69C +FD0BB3E2B00F3944C4606941E723D904E5D7F55D72921DDB383430CD0C4EC291 +B6BA49B1B2FE99FF849FA2B5A8A898C8179D0C2E796DE8E3C4A0F998CF4B5433 +8099424A7C76C3A498AA6109E46EC9E6AAFF45E10B364FA41B7577457D6CB5A3 +FAAA3EED89269FC270B1014A22C4D2788FB425396B97FA3FB7A959823D5FCDFA +2911B02A6A856224F202B50020F85FF91C1397366AA94734EEFCFF1D66AECD97 +B4A443F37733498F4B8175703FEC53547BA08CB2FC84DA76076B1D49905A36EC +E8AB606AE53986B8C0F26CB2FF58A58538511FCDADBC5F51ABD0901ECFE06707 +B41CA6329128DF5CDD6F3526D41174DFADC2577E4AEE525D5B01B0E1E3327A95 +B0E4050946D347C0EAA483C2B8F9DA33EB687347B6A0CF28BFFB11BA7246DFD2 +84E721312CF19CD124AF18F3F8C7DAE99BA5AED0D951A84F4955A218215DC5E8 +EA5B2CE36C5E06196966B65F4D3AC37F54FF8B2E5568C234970369E5732F324D +6EFA761A777DED5C806D6EC15F45ED14D58FDBD331C9F4597199205FD2AF2A30 +2C41EB17F71AC38A085AB87F6BBB37BBB8A40EED15BB05FC48A99859BFBAFCB7 +2F84944CE2FFE95B4CEB21DD43BB323362BE4C8F2D6E016F3D69FDAB2BF5DFCD +287DF42B7672E4FA8AF34BD9E257A34E388C7B47B819AB081EDBDB20DFE86F72 +90EB77835924F2FEB9D7F1516DAC09467D720506C419E94E44B79225C6FD001D +461B64AB5AE56440D7E84D5C551010865BE4CABCB6EA62DA4503C7A73C22E05C +31EB5B7D480EA9F8BA4877D7BF8618D88C7B56E208215B9B50EDC8D378C2D835 +DB7F3AD35489F6F3D6A03C9F0490956ACE2D3878BC31CE5445A7C63B13086C28 +9C9AB643D12CA41C54A6A98FF8C550B00D8035FF7E485CE380084C80282609ED +18BA58CF164A21C80A65B235A5C10730BD6AACF33BE7BFCE7371F647D5D73708 +2791C584D5D19BD75D9A9882B70B8AB253495CCCCAEAA74455C61DC23E257279 +EBF501B3BA3A249C6F0215C1810D02B021E90ED3946D96066880E8E594B0B125 +28B7F3FE3832E3BA37DA65ED789F3EBAA00FB6F43382BF83CEBB70F056D06896 +DDD48B5278A27EAD5547BA2F583CD0961A5A040692FA8158B0C83275529AA118 +1DE0670915C269650CF843CEFDE6F896E0E897E12899E591F6EE44AE743E3A04 +AA7F2B41CA6472AD33C6114561B3A15EC8FDD3595786C52F5889D3BF0B20AFCB +803E6D199DAF887509A9A7D663840B15FD7DC05EFFB27B3A30DEB80D7BFC1406 +481BCE51C2D6033758F2649EC81044097F039C448B8B91FBA5AED1F15CF17347 +96C3F938EF0B212A707F4BA27D6DDB9016B07CE699C2AB314DAC8A99A004F43C +92C0EABE8A0E13848850ED528D5269C353243B20EB4C1DA88AB6301137032E54 +0BBCAAB039E216DC09694D2406D82C1803D26BDE251899012A7EE6298D2C2F52 +E5D87FB42ECBA66A40437B754C0E57120FDAE35481382DDC2A498DEDAEA9915D +4B85EB7A313C73E804D425B79A2EE9FBDE556F745F5DE31947B1331D7D965179 +3F6F66D3F4700807BEA5232CE668137CBF2FD67BA025D7CF37ACB925C5651337 +2EAC6D5513DB99F6BFA61B717B33796D46B47B68B3E5B937C170E37F4EDB7B66 +E3A8417123B7824569AD515E47CD823FA8F0A2944DECA5A257BA2A71CDE90A26 +985A9D46F4B4EFE36BD46C8CD48FBEA4B3B98FD33A050A16FDE2518E09B7FDCA +346F6F01C7B441563D64341D29CAD327F62AFFC3A59675EAE1ECD2D0670AE179 +D98511AA514EF8111BD2812041D875BB9A198133D3FA17319BCF8F9BD838DBE4 +D0BD072D92DA296A9333250EA05A9796BC1347BAD789B803B317914EEF08AA47 +A05EA5C5C5B903B7F33CA520502CF3E8E5923C6AF86488CE2F05A1A503117762 +F49765A64E4CF9343E937CDF79097A9E8ABFD5CA9D31C8979B8F72D80259C4A3 +F599F0E251D2820A48B01ED48AB4BA7E474CAACCA2F9773285A049B66A0E75FB +77F1FFEF68D6FC457C6C0AD6630266FF749C58A021FC1382BEB1F400FF4BBC2B +EED145F907CCAF9C8532EE3F447C64D28334ACC54B9D4F487A1BA4CB26C0274E +73245199C085FF391245126B990D8CE428C59F872F86EBEBC88D0242486BB201 +0076F1C5ED159CE403D08BD278DD21C917808E20CE8B23730A38E172F537383B +410795C3915BDB06D922C3604E68656995A3452CAF4BEEAA176B487A39E24149 +05D0E6E6FA2EFFE71D96617E5CF773E55165EDBB37C63E700F1593221F866189 +CA8DC2EF18FD9DD83D312B1B3B159656679DAA25BFE2B54ECBF532ADDF3F7C4E +BA23628D7FBF19E6D4271F16A91F751357AA46776D1F874FF4497EF50F6465F2 +48F547A8D00FD9022814F58A69A8643AEA9886EFEA87E5AEEDD35652FF584AAC +31901B459D2BD707FD79F629C68F94B471FD95E4A4BA996AFCAEE15557C1B167 +4649CF28A5C8BF857C3A63754E8CBA570E4235F179CA3691E948ACB1FE92ED28 +F82D2D96E3CEBE59FC117570F19F364BD092070E06C69A40B6F53F5912841BE9 +AA6238E14A774BDD8E13060B20BC8498014F3A5511AED7544BA9CA3BAFC4529D +27F430F14C6016B7A5487FE6BA6EE10545A0342C8DAF5EF6D6FFD4D55F74F406 +49C557FA75E61BBBFECCF67C0A512C23559CD71CC67A5788ED0282B2F0B8D6F0 +3FA276675CA5F2411929D6ED8E1F3C3B6E3011B46CFA2CE18AB291C7B3A7208C +DF161C0B2C23A0000819848C490EDAC1C320B5A7E60DDBBD93003387298D04F3 +1EBCFCA1B17E3C136A9D60080DE114697682E4AEA88E2C61698E2EE9E38A491A +5E10BA3E6AC61203642C2EBA3BDD759E15F36C75B4FC4D58F33BD9F4E1E2CC64 +E1E88E22F80F0F160F4BA00ECF5866717EB3899617C21D1ED5F98BF2AE74DE49 +F3BF8CBD0F8C68759C3D4CF56EE723B12ADC58ACE93CA4274A89C216AAB3419F +78B60B263A44B1EB69C07BCB1F77E2CE24EDFFA75A88D5738C75424150EFB5B8 +9D128D3C20E4A1517E4C085C67F1EB943603F4DBD591A617EC740373B5AE2DDB +FBBC875171152C79AD3BD887291433489521D7F6B4D762FBA6067EB6AB5996C8 +32B1D3179BB3CBDDA8A23B7238791E2DF97C654B8A8EA305EF4951283689898C +0FB114A5EF5F29F9045C7817EA7D8E578DD48D8806DE88B68DDCB879A0AAF44F +415B911131E45C4CD5664A1F35179A3355B4430520D5C5D08F7B63ECF99BD920 +7EBAD74476FA147B94447E84AC4FD7CB8F850CB19F41D18210DB569D5687FC95 +0CB2E776FCC5BE3AB89C611F488FC07C2F8A77DE6C008208DE782D24395BC158 +5EB7FF2D4AF74BB0F10D8EF2F1ABD2435CF699EFFC1E7CD37B4382BDAFD2A83A +23419D5A7DE1F19EB03D7FEDB30D322BCFEF3234580A91DA108FA4EC4F2091BA +D169DECE3AEDE61C07E2092A80F6A8D5A8E4F8C24106E0D76B71E9B63F9FD9F5 +3F7A735CD61228364E76D65077B2EFA802E15578F4785708DE8A509CA8A329A6 +9194B07F1FDF2FF3EBA62BD318F0ABB3ABCD32B4F77870D8C4F964AE4FB32723 +3BB395D30BCCA1A06966788E2F8FF5166985D83D0BBF0C0DE778E246B3B724F0 +2EE098B24EF06F6600BD6EC4F109FD2CD765F85E04D9C95DDFC7B9EA8D14A892 +AEC2C060A7356B297A3864FDB434EC80D577FA82EE91C8C43A1D5C6DB5120316 +048075EBF3A7D88AAF3CF572A1061617A075B0861474D4ABA6749D14C0272156 +4B8709C55F7FA89E47C8348E8181BCB4683A8F3AD1D9EBAA9EA7CAADA9D8E939 +0422BDD77C9C023E7E1DB7AE1F94FA53E8C9F98C6CF9A9F11D99F35F2310389D +B468F37C3F0C856B9CA592915F91BD94DA48DD620E1B07DFFE09E0EE181EBE44 +75228558C1309B0ACF02BB225C7640F1453E89F9EF8A81752F66538498B835F4 +06DFA17EB45FA5BECF212C55F27E038FD55C6BAC12CF6589A150AF8E61F1932B +AE29234E26183D4C05ACB111BB0CB06397264606C3B9043979785D77B17B181E +B6749BD23196CB92A90CD96418B7DCB67C6E361726573735EF5406CE233A3E7D +045BC9FFF1796FB53AEFCA6A13E8E00EC0583E5CF1546572770BBAC0F8E15F29 +DCFDD2EF48CEEDBA6E8DDF847396BD03631A20CFFA2D980AB6A8449F07A5CF5B +8B21931B2019B4E8EA928C26940EA741038A1B7522B62A06B78FEBD9C88CEB72 +17FED8435A7EFA0ED35B36742CE23C508B0940A362C7AAB5C3A0CFF8129D7085 +12AAD5A82E3759AB1A700007A16A911E25B895175D3286FDC3E60B038D6D1E65 +4E0AE7CA2A93B482ADF9BFA97B46B314607D2D4227391DA382D4C2E0A853D2CB +A9DE0559A60ED27AAFA24AC31726E19A213654E8DE43098F329C107E71698815 +86B7C2DF663DFD34504AA2F5AA848D3FBA32A8C21D3726A14626F8E253F4503C +2AE03FDC57D866882DA26B319C3DB35DB4797D4FE14C8EDBB9E26B130B9D25F6 +42B006483B8541F195EFD48890729843BD683E76C3318701C0423997AA40E8FD +214D5C28D6C37FAB59AFD4E9B17C142302800B02651FFA7E10B9EB88C993F559 +BDCA7958B2629DCB21C5AC2F139B5341D0795B594C2CAF50CA3112E030FC9E60 +EFDBE4D5CA899E0ADA27410CF1220E3C100148124120E104FBA6494CC9D8BF39 +6485AB8A75E588FDA7BD2E8F0ED89E87796F52AF8800C9BA3246C0CF0AAD955C +15B545540748C11F32B970D7CF9C16F4BDB2908485E27807EAA51A3CF11BCC86 +DDBEF33E2B13994C109C7607C4635CAD863FC7D1E49051EB501E47D8AF8A96A8 +8DFC6A2A908FE78A7846016C2071F930FD2A3E5050E19FE26CA09246A350839C +C7A06F69EE29B4826409249B8687744B1C28B1E4EFC4423EE93403C4C1DD054C +28C48DCE81C21EAB792BB74E7C173EB784771199CB163783D232A735F74D8430 +5E488CCF55B1550C2E63447F0622B407D3B680EFB8EFD504E88F1F7BE09A97E0 +217565473AF1E7EF0594256AF56A4ED17781F897AF7251ED8B1680043AA64B60 +1D7A2BD9DC3F4A9D07B0BB2B3DACBB2A9AA3F3DE8D747016983BAA7C21BADD68 +583BC8A37D27DCD643CAA653C50AE9D4B40719CABECEAEC5AEF9419A8A370DB3 +3172E5DF5EC198F7E96F26C4EC7107432C2D8C7D280039031096196E57A0C3D7 +4B91EA0194685B4D933FB898F90BC9B31552486F1918653B50B28FF81369AD88 +39F875864F938051CBB1D872B193338E68135091DCEA243655FB323278B92E09 +D87D8CD4FCA034AD7A218B864A54FB13F39491938E0094E46CE16990BB47DF69 +D236799B02699BE88B54FB17C80092DFD628860824F789000BE4F2C3BB2ABCC2 +4447F49BD36B1BEEDED6FA3B5CDD935126835080FD2AC78D04A4DE3A153F5C9E +23D4598C9CC923FD9AF0B6E47D50403A6566E68ED8655AECBBB4D4D0C0D70287 +D02AFC5FF37C660EC894A4ABB0614FC165C256AB968DEAD57414F06746D41E0D +36AA18F73629BEE12532B32F93E5EFA54000F251BE4ACD610F5168D32E0ACF1A +98CF89170C4D2D9E4F057E38E7E5DFD61774709A823581B0723063F88E217723 +54627C11E53B904958CBAAABE93292A55067B04FCAED977C016EEACAFAE4B8CD +09F39F4854CCA7E6E7E7C1B9702060C781ED45C8354D3AB3923BD200BB2ECAAA +5D767EF34D525398BA831973D9BB67903D9580FFFEE1AB2358EEC23EF38C426D +C433391AB6229752CFE6EF4595299E02383FAB46AF8B3E3015B6CA441839DE46 +4841FA63E8A7CAAFD0DB875B0750AC00A4C4615EF8784E0B70AE0C00BA83532B +98351D012A8994CCA18D3AA36C2E7AF12A051A8E166B2C57EA8A23AD2D66881A +EDA79F565573C76F1249AA10C1DE4B60B51220D6B946498D9800B8B59BE65271 +A8EEDDB2DDDD19B273C48FA601CCDD84C5495F77FDFE22F609D4C8FE2DFC7BD0 +F108AA16AB5B34224C579A7E1BC8AEA267C44100BDBED6897528A799C2E9478C +DA8F6ED505AE1410F0E4071CF80FF8D3CB5C1CE1B44AA7B2F38990E65D9814DE +D5F2CAF8DF24154B0E54B58AAA2473F4A27F712A0C6690391138EA6A07CE358D +213C6D1B0CB9DE945762F18BEC50C5E11DC0A0DCF0DC8A02CC2BFEE7C4DB0BBD +9FFFF7F3C79F3A991ACE3BCC36785FCD072FD159E2CE9AD429A27CEA146BF182 +10EF72E4B329EAAC8B70ED717F0C8B4B2AD31A0FB0434652C01D42FE29A2E0FA +3B529643E6FA98A66189E00CEED4A4A0D9A583FD9D83E8485C7569875F9BBD5C +270B0859EF041BF4006DB8E2D32FE80C1C54C49B1906E58576EAFCE3DDA41AE7 +EA6660CA549BE72E06666D69F82B26222BFF5DB21C15B8CCA4D8193500FB0520 +F7FD4AE3196853618190C578F485DAD0D52D7EE45E47890327EE8A2387E26413 +3209DF5C93760B565625378FC1DAD322EB0373525447170919D40D12394CB0B3 +72859C51197352AD62F3417D147D88DC59C5CDF32543AAEFFCE63542C6E69B96 +1BAFB6AE012EB227A066AF9799C58A02FAC1227327FB5C0A4C3A83D105275287 +8CAA7E21AF180FA6181643E10B72E0139BA78A03A4FA97D3B64D079A3BA8564E +14400D92A3794251E68CF55FA7530B64BBA2CC4AF800769D6F1CD59FE767D129 +D84B4CC327B4E27566B60B8505119C2A5967342B055274C793A624EDD6156478 +0859496478997011C584BD20CC9B6E950A129799A71BB917EF6399D60B62E6F2 +1BC2C88A955A6054DC6CC0CFA8EA2384CB34D381670B034ACC7B74954C6D3871 +60534C777E1E2193CAA62F14937CC9CB4ECE9B5F23346EC280F06B7A8FC53D6F +EC0A91A2B5458D46763D6207BB6D7FBD8CEBAA2D028CB9C256EA1A9A04AC75F2 +0DA3B4021CB3F872AAF7828BB33DD137058B6CA96E9A371662CEBDB0CF2228D8 +BD567C88D9B813BF74D5B014E34344BDFC46FFDB501770BFFC22E3411EA26866 +8D21DF54406DB95377DB2DD3045653B25823DB046672CE0095BEC20B8F0A6136 +374EB7584F372B665C07441903E19E61F84A1103069F7DA211DE645F48A3F550 +1C42CC2330F1BFD8913A9EFD1155F2C87DC62608D532F4F5933A226322B91B5E +CAF2A1061908FA76A09DC057B582119E526B5205CB52E77881A9FC75059719D1 +A0FEC51FAE6971FA9F981E7CE7A2050F426A8C1D9EC418825EE8EFA9D54A6C5F +628205A912ECAD23572E3610DDA047EEF4457EC7F68CA82D2E0299D92ECDD09A +BE7C3E9E81A9A72572E3AECF8AAFC39DD7FBB3DD56A1C8997207BA956809913D +881A0B818F235611FB3CD8C3735AEAF53C5B6959A9CD7608FE2BA5C2A1027762 +83EF74740E37ABE827E61519FB78994F28C59F5BFD328171B825A4BF80C91E9E +10ED9D71094DCE44B556B331B4DF9CCBFC21DE15440F2814F58A69A8643AD72B +DD53A2CFA63CF29CA3DCA60EE2C558F3F4D0D7F6D1AF921D581FE434244AB4FD +01C32682508A964114388582C645F32458FEF0673FCEF009CBC27FFFF120C57C +0C5A9294023870A510CC6B5FB5C54F98FCD27CE5575ABCB1CC6F3930E3CC9895 +BFC7FF80C86E2608C3FEBC861C71F34C1F392B7BD86146590CEFF7CE332D8797 +BAE8FAE23DE40905CAAAB4FFD115849754D2B5B3A3B9B726BD45E0935E22ABB6 +CA298C9D8C313D83AFDAD44792AA29B814D2FDE9D8209FF3FA4DD21AF52990CB +E0AE5B9B7024D8D8E147589B496771EDDCB46A8034B6B2E7D304B5299D44616D +114328D7327730EA360AB2213EBA21A32930F323992973EAAC24BBF4097EE98D +2C4BC8E7278923E8B726FC916C64E6E746F1E2DCE24EE57FEC432436DC2E0028 +375006996DFA4CBB077034D588E27C2DF082E4A4115A849E8B77FB3CE4B9241F +E747E4A719CBF2DC16DFF86BD74F536478261827A4C9CFC96806731396036CAB +DC301B8979F7D1B467323E0FA501905F0DD3075D6F2F859A905350285F8BEBD3 +C86186D8B644D7C07274A7AF96761464201EAA4E0694ED8C091326F7D2D0F464 +9CFAB448A108F376CB6BC533A3CEED71E6E995E33F8197F23ED966AB0595EC82 +4BB3BCA4DB7BB42E6593EB0933CBC7E404AD72061CAADAE15A94602A7554E6B0 +294F6DC2D5FB7929426DFB4B4DC90FCA08331AEA9D226D8EB21CB8CB2A4012D2 +027EAEDCCD4F4C17CF03484A94B824388EFF176962C3426A09979F84608628A8 +B8504D72E5040573BA7AECC13EEEC54051A31807E77FC5F480C8F30373B67E7C +F9A45DAA5B97030E16604EA3A24337537D60638577913280A130C6D25C8FEF7F +439EE76E361B3E3A46EEE9F6C61254918C666EE7A94969063E7C8E5023D8F354 +0CB1179A4BF4C009C67B8B10464C38B2B631DDF0801177681B7E7CFB941FC926 +D4362E86944ABF77E2C805815CD93DDFF46D574947A100854AF5BE55F0AE51CE +AE58EFEE5D00DAD282DBB600935FD6D3676D4B35872E7DBF2E5D164495CD93A9 +E3EDC2A8D06F9CD7E6BB76D655CB563F2B709B1FFA45E486C1E2A46A5C2EB5F4 +3DAD30D0A21F3FA4170382DA80D2729EEAED59FA99800458B6E8C2BE642F01E5 +7181BE0C35DA1B3D85E49E78C65E7ACA7CBD3EDBB07C59D6AA49F89BA36F9C10 +E141D9B7EED632E1FB544716309F24651BE47D4BF099441B763567EB6156FCF7 +E90554411216854A74824113F4C7FB626A91F32CB824F6BFE607455317DEE718 +A0C49504B2817459B0BF87319085BFF82F8C2D4E1C7DFB0EF4A9B8D53C78FD0F +5646B00130AB9F22300B69F3FA222971386CE71B4EE23006914F73B6AEA13422 +39126FE987F592176DCF482BA5B61AF13809512957A15EE3A1298A8BB5A11AB6 +314434BF61067ADEA42FAD97CC02F0A89A62D96E9E6C7B06088C3E02044E78BD +F479A423A44754865C36F54E154D663CAD44F635AB03D62447E25F5FAB14CD4B +86DCAB14B68003A6715FC145A62A8CD1FE60230802E56A5D906465E17E8E1384 +EF93A2248C92AA69B30EF1958459F2B4E073EEEB207CAA1C2C81ED7EC203D328 +080A7E22E41386A49F7C50C7C3484E118CFD08F4085553D08F95E9641F2F016E +CC589906448A0710F3D46F2FBDF6E11014B71D5B000FC8563300F3DB14F20C88 +1777732B61850770B1292132357DAB822EA0E82CF09069DA6067E8810DCBA80B +E038AEDC46DCDE18811BAF4CC2BDC823FA0E525E4920AC49A13FE1F0BCE09595 +6B0A80B68659521ACA8DFE71EE72EAB21DA362841DAD6F1F50D20DE4D53AE3D0 +3F5C96727CCEB1272DECDA82BA27E018170F55EA2D94660037E05207633556DC +4C8F0108367FAE02F1409DAECD5D0CA9BA47558B8FD450EF3C332E655D3222B5 +AD96C39A5F74DAC7DE60E5352113B3A778D97A49569411FF7B8502E1B27BA4B8 +741DF55BF75E51AB977C3F0DC4ABF7A654AB21C603A7CB63CAFCC87B5E60052E +E091065CD32CD1E15237FBBE40B5E8D4C6C34AB13D1EF5C1CAE1093824FBD5FB +562B809BE191A1C4E6CBB8D8C619536385C76FE5313F186AEF625C4D7E159151 +77F732524F5300DCBA3FB5EC9091CCC533F9D8D617D02E93A80DD924A9F8FC00 +08F1B1D0A1F78B36785C529C35301BED56EEC11F4940F12EEBDEE487C8AD94B0 +6E14FCBC1BA8AC32960AD9FC1CEDB320D53204AF69A56E4EF6B28EEF0C703DB8 +0604DDC0DFD2296BF919658C28D9027434980456A57577ABA0024E3CECEBCCEE +BAFE230A285771F1E6D56DA431AC0E06253F141CD97988D7002598D4B14849E7 +EA30A6ED6681C43E5169F2CD31BEDEB51F29542D470C3D90E87A7DB4F11A9D07 +B740EE90E4A39F4CF3586C2C723C3139F33186EAE49A3FD6F11A79626E422CDD +7D7825DB95BAB0C42AF78CB0E03FCE914A5489E6AB2143AB4D2B516AFEB3D4AB +92D533AE294568FC498E5AFCE3C131A7762C43C94BE1940FBDBDC0A44087FAC1 +5F7EC321EC0E7DDB3925C94BFD150FDB1D3556FA8456FCE3FC3B12263DF3EDC9 +C184528E75355BFE6D88935A666F53A53C1606A019E5C6E328F787078B15AE32 +9F49454CD025F0D601098FD599642340A59A5D2E9226E4E468E77B240030479C +14BA84F04B0A4063CE396D89EF3091467D212C5FAE02730A17879A1520D3BF00 +BD5E80610A75E4C3581C53674B4D18E3433B24841C20B7CD7A63C99511366927 +0A117CCC8CCB519DBA75940D75897C664627C88B98B4EF7A34CE5A9FB212777A +FC65DA6A4E1BB920494407828F19501A649850F6996171528F5A9E0740DC5D50 +DD72C991663F1605D53F7D64EB94AC101380718313DB47D43F2F465616F7949B +E46CA304A89594023EBC34B252867541C336D2B534DAD7AF58653956985F0AD2 +D24E9C4B75755A5CADAB35E11047510AB4517AB2AE659E42B7C4E27262376BC0 +43B6FC44E67B3A85A9442EBAB410EC5A4079D690C3DC2284A080A520327DD98D +8B9327C6F3B24B0B445D09030E07297E568DFFA76EE5B8349161CE403AECED8E +1B539A2B8414C0C45C5D99AEBC72E97308F6BA250DBBE6D924591A4CDC18D6AD +E9988BF0EE0FDD981A674D98BB066BDA43F2E38CCA7BC274F8B3DFC9F2AC5235 +01FEB0CB145AAFF3EFF9DD7884A228F417C8B1F62152915FF43D09E3BD3FF648 +30B06B57033983D6976E635939D746F194F3BAA218B2A37C6E27FCDC8BF8A0AE +5B077E8F11A5A9C23C24E4E0F28902FFCC81DC60B243E20C6789BFA50A86C25B +EA4B440A7FCDCD171331DDCD591C83A512B2B962B1FEFEB9D334987893211AF2 +C2A6F2F6BF83CFCA266AAB342A7604EF55D4A94A0B9BA8247A328697E3D633EB +4DB8EF437A559CE366B7F84E3707C6957C09759CBD4C3432EDB02835B16E6F76 +5DD95A0DD812B06613EA5B80EB037010E9E4BC4A73D79B6EFF0F40E84BBE57D5 +0399F85547D3BBD324B30C931C8D48A3575124BAA6AFF4C0A857E99F0892EDD3 +563B4B441817EF65B4430591DCF7778EDCC73080CF9BEA32ADD6325D5DFF6292 +DA21601B493AC7A1619406B9A62F7D1A31AEF62B95B3ECED8E12AE21F66CF90A +4C82CE92C5EDF3A29006D9960B110F2F732A0407D2291F4F4DAAB8E8F2C7FFD0 +EF48EE5901316D4A1556E16700248C0CCC984B728FC9A89858C4830B5CEAE115 +9631A1023078363A0A217FC53BB20791AED526194E1F286666325CAADF009D9A +D7DC8E3CD65D635134B149F806BF27B10E642868B5E26E1A8A59F6B0369B8114 +E1BDD480038007155224BC3B593E60F4BE8E59363974CFBADC8A322F13DC7FAD +F5A63B0699F8FF5181F2CAA5B20CF8545E63E7C034337C748B3BF5B61EB34EF8 +2CB3639EA164F6F8A981138701EDB82ADB3172C77F3D01BAC1B1F6740BCE0FC9 +2B09BFD6BEDFA3CE8EBA804BBEE1258CFABDF48C296CD1B57D4A938E2EE41B35 +CDC177E6EA0BFB5BD493637C4174476CDDEBE2C1B6F4F90FB9680907158FA53B +EBB6B96EE573081C420A0C1FA35F7E2A5EC39E7A915E466FB7F4A750148E3CED +EB6375853DE4180252E790FE09D57373DC8CA5BFE68DF4D9FACE3A95C2FF8BE2 +E342BCF84C98F2E07C6449732D7885050D9326172596CAF8D6C1D5FBB1A35DD6 +927367908C3DF2155AD9B651E02E56341EBE697F5856CC2811E58DA6BBFF14E4 +46094DA3EA6ADDAEBC29C3FC83A549D883622B1E02CF5C0C780BAA5B3C84D895 +39204F12F590C1F84947657EE2AD21473F766CEC0802E662797DC0322D13FE9F +309982171134E7102DB9FA3245F906CDF1C2FFF5208852C7C4E9F7BC95803D15 +F7C2717D78D75843C3D5D4AEA4507956954DAFA23DB15D43B26121D03FE5417F +2609A9DF71782DC41990592A6E81D9390838F1F753D9A3C003B0F2516E8D0689 +7BD5269E48D8BCDB266041F51E8BD54AB37120725945F25769DF62B8F3C24000 +C38ED31E14974A6F4FB99C87B2DB02A4563742A0FFA768213E834E4029208966 +BB4E4AC13F8591A02C59FC1DAAF725341EA72CF61C8F1EB6343FE99A924581B2 +CA0F034285758D49CE07427C96528834AC2C99F8BB4A9223AE4D8D2B113E769A +5DCB1ABCF2695477B7BB30755346E970FA500A6575189E453C66DFC966F4C088 +B9DAC012965BB890CCC132F4E6160CC2B113F5C908C621AFA34F1D95F3DB2332 +AEC26440CFFC0564B57B4E40B484D93CEFED8768DABF83A3788F5B68239C40D9 +0AF793F5FEFCCDA7383120660A4451A9ACC99D10B232D25075EAA46D39A3D8F8 +80FC17734B9363D3FA70E30F3CBE102BAAFEAF854C1BB4944CDFA73A74BAD32D +5D0760A5971B86735B2F349970B0311D9B36A74412F5F7235A497AC3EA69FDCF +9F8AFA9812353B45ADD205B5F31B2B9BFA46D08FBBBD4CEAAA527B45679B55EF +87DF44F0539987ABF6CE2E7088DF7AA13A515ACCD17BFEC5626F01D97EA9CBF3 +3DE7E57ECC531119B97695463806D889853FC8AB6EA6BAA44BFFF796C29DB97A +FD6675ED1859C61CCCA85D672104B9F20384D2973797BD8E77FA198BE97E7B88 +D7EC196CC296EBFA08A048C60005DBB696033E87F4FA8D50423E5C58CAF32EA9 +F0669FCA67692291D86BEFF717D6C5A1E0AD6A75C0F7E3EFD2F7A5F5AD7D92B5 +9BB4BD9E7B6E7E337ADC6ABECC3C1B41073FA3A25A2FC1640DE3AFD97BE7BA03 +95DB5026086C842BCEC3A6A1C3DAB1D50DB50261A8B19A7CDD7B7891475E53DE +754050D783D64029006A5BD200B6C64D18EE7576C68E30E1D6F762E9A90C9566 +D90FE497B27A9B52223A5DEA20D7A67FBFCA5907BB0496E10D87FEE2FF90C895 +CD69414B219900CCF5D5E73461D0948FD57B8681E8E598A25FADF80BC88667F9 +C871B4F87AF7DB9797A98B40BC29CA48F614F754442AC9F5D71D55D14B93BA67 +180B01E51B781345F1AEC0E68CBEE1270ECA7B3593BF4E3E4046CDD4FD9703F0 +59822E8D30209D01BB0E404EE693ED74480B179F8431E0BF3FFF6F404AB6803E +782F592E87FCF7B811683DEC0F6DDEA4D5BCCF19F1842D5E08C16E4D61952D46 +2620AFCD1DCBB1D3D2E38539537B40E291FCC6D69667C47DC77742A8C01149C4 +DD0C08470FCF10C1D5C02985AD632A55C8C86BC7604D8438DF27DDDE6F773051 +38E268C9D7E72C12EF3C02287D229AB27C864DC7A90F6208DFA2B2EA0027420B +13637FE2AAB2CD0E90C1BB3D58C1A1E92112353C994E4A3B1FD71781CDDC7237 +A97299CBC0E704ED11FEBA7B3ECA2A1CBE15F38BCD5999525D24200B0B742553 +3FB0065C5DD170C57EC79E9E04D46BAFD0FC8C9FAC2BDF17B5B756F9B0BFC0B7 +B505E533CBBB6762A076FD1D6140C3BBCAD87AF61D1FC65613C84FC7DB3E2260 +45C8A31C5F4E98DAFA54C7730454F66C867143D2A81D841400ADE0DA5BD9F992 +58C51B112AF3674B454C138B3B087FFCD596D5F8C23A5371D955CDD247F87229 +515388BC8CA93925412DBF27DC507D29436A64E236465C3BE9C5EDAE31EC5CB7 +FE4A32CB0DD86F5F5FCDB616F45FDA945A26565818F62FB21B7DE86F61160A6E +BF7A74682E9EAC5BC99BA5709D96E52733F71385693E6B75BFC0BFE73B8F7F56 +690CD5BAE46F2E7655DC840ED4B1A8E1BEB7F956F586580CB3C73F144872D838 +72B7A58281EDB4576C06815F79EEF626A1269FA5A899B6C2B67CAAE87E737DE3 +A60AD91CDECE2F5FFBDE4D84179AA3A5A84CF55132C7160744A0BC0B30A59B8F +31BB9CA6D079CB016EA257EF19FE7787EB73158D1589DD2CFD1E6F5CB343A57A +616111909DCC5EDEE2194B0648D58FEB782562D469BFB04A55B027A567E6931A +4ADF8ED23D57A6C2F7CFC24186BAB1D1637520B2ABCF18D78F69F5BDBF4D1859 +27340FCDD8E09A247752C05ED51A08B063FB3A21150ECB022AE818E49AC126FB +B0BE9023C87E2F15A49B751D03EB78B55FA135A735926F6C08627D980DDEA027 +17ECD8798B9259D1073AEA2364F08F75DF3F3039C2A5268210941212638A9198 +2B9E83C5325C1A87EBCC577FE081557F252EDB8DCCADE7D92B6F90607D635CBF +B1CE7AA040121AC48BDD09EB9A78AD2C004C2852CC208844EDC6C63C0ACEAA1B +02006551B614463B87156ADE0E336773C7B364175ECB202EE9823D2C11DB4311 +A872159D70B91783BA0D47375222A677166DE6B2D727E8FD119769BDA354947D +B4AA82966AFFD527D160DEB0E5589C3FAE2EC11A09A41F9B04A947453CE96A48 +203827A9CFF9B84AE9B0DA3F +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l047036t.pfa b/ogclient/lib/fonts/l047036t.pfa new file mode 100644 index 0000000..fb500c6 --- /dev/null +++ b/ogclient/lib/fonts/l047036t.pfa @@ -0,0 +1,1361 @@ +%!PS-AdobeFont-1.0: LuxiMono-BoldOblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Mono Bold Oblique) readonly def +/FamilyName (Luxi Mono) readonly def +/Weight (Bold) readonly def +/ItalicAngle -11.3 def +/isFixedPitch true def +/UnderlinePosition -48 def +/UnderlineThickness 96 def +end readonly def +/FontName /LuxiMono-BoldOblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-29 -211 755 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078986 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83E1F4276DACACA37DF93 +6E81F12A36C75497181154EAB28226DE282D3F090A9E260BE05FB75D62F0E576 +938A5E3E63A16FD101E72F7A3306261230B60339CA66A60A810D6560F2BD77A7 +B4702D2F9D75A595C875E823EBD7C94797B3BC36F98FA25220790470D2A38DB9 +0E90AB4F3609A1A013CF93D016E544F4E385663414AB2B2927BC000A9B3E0544 +00B18DE5B168D06372C55EB16D6D952F716752775B0B8BC63CD5A2DF27C0E0C8 +578EB365ADA6493181D9AB5D7B8AE30E2B499F952D65877C8E38EDD7DB29F957 +9D09EAE5B1EFB3F29CB94FC40874DD2248AEAEDC411B39AF2D35822F0F742AD4 +DAD1049609EA9CD325557E8E160E64239BC87CA11A7E215BD050A87E55EEF494 +6198CD3AC7FFEBC6D44FE051179BB739FC89B74B5183CE255C10320DD7407CDA +65E13878AB431E7B99F49D2E6E1B39D152BAB31A5BFD73BF6D298C2E71EA710D +E094C139EC016D48233AC2C25E8E60F168DFF50892EE10F66894C471861B784A +BE82A8A08C9BC8FAD0FA2E2D84406C5522CF6B9E46ECA79BFF1678DE26FA6E29 +2C3E13C38726369542682E88F4F3C0596C877E0040063BB3962ADFA6CF3FE9AC +B15B289FEDDDAD64E40AC82B3D26B1593C4C8A90B99493E33C453933B127095E +835FF7B340EE9EF89A0C792D4D0DB38784BAD3F484CD951F98B89F93824B729F +8C93C7B931D025983DB5BB21D2560E444528DF8EE5A07CFC5B5B82275CD64CF9 +926EFA32B59335B1B6E709A62D8C17D278781FC619AF66FED15922229ED441D4 +008B81578C0F30866E20841D389875795F9FA5D573A911A573281A1051293A6A +5C21938DB0F7E4508CED69E67D1F4C2BA55448BAA255E0A28DFA983C55260E54 +2E01F5372F15F74B785BFFC7502DCD104D2270B0B738BED86DB0F1F680F67408 +A9A806F586C0995A7586822B656B620E9B392D3BAE3AA5EBCBC86358CEBA1256 +EBEB0D9B5DAB1CF8F45D1FF5229ECEA379729F326E85A8CC963AF8EBFC9D84A0 +F5D7D4B3DD19142D521D2D7F96372E53EB54527D6E2EDCE42912D0B382FBD266 +4BB5E5E8FEAA8D4EA4B63A6497C0B276424F50A5E23BB17ADC8592E0A88247EB +420D12CDF7417972702B41738B7E6819476362466410CB3BF8452135B16E6F76 +5DD95AA1C99CFB3F988F1C895AA4C434076FBC66297C8BEEB146CADC7BFE4038 +CC6860C0ADAE8C851BDFF35EB980B8B4CE3BC9C2F2994C4B76C25A3811336B48 +7BEACBB256D0C91BDF5B94EE65A4032D238B59DC55D442C02553C48B1D4B8ACA +2FD1418A19576FF0CB0A58B41BE33D1810D691836F064809AED5E819D30AE1E9 +0CDF269DCD6CD605AD27E3262D25A2245933A08689A8FA2C7910938615C19CCE +8529DAB09A8CCB71847F5A79F8546B054E6E2568A39A316267E1B0C145DDFD6E +199C481BA1233D069EA926B81F1AD863C9784E281515F7CECC2B4845634D77B3 +70AC75FC74269301F562AA2B647AFF0572FAC99DE472A9B8154812ED7D0880C2 +E5A57DA12F51B724056475519E205047F52655AEB77EE422FA3E10AFF782CB25 +E02AC8572678232A611777FC31914196BF83CC82D2102A5BDFD5317063918EFE +10B43E3BB2368B7868C178B1F940512B463F0D41B85D6275EAA75856AE4A5CE2 +5E3B7079EA624D03443222496D6E5F28752F3955638A06CA42AE43EFDE812EB3 +51B65581525C8EFDD17B0514F3096D12ECF2FB417DC4F3FD866D7F3A15B7E98B +078A37367794D00DA2C72512A788A68AC0324935A25642C30320885272CDFBC6 +89F87070581BB8E902B500B878936A270441FDF0731517F86C512E02699911CF +2DAED27087013873CE750708EFB2DE9DDA19AB4387E4A5E09DF05F620C7E4519 +43A4E391BA3069202557823519C6D07B4AB3D19CD9D081CF8AB9C8E3B2AACA28 +A6A1977A7C8609019A0A716631E692AECC540BCAFDE9073E2AA7C6BC1F9AF124 +CBCBED06053F8B176F6EE71C6D804F5CE9187A2CDCE9A5B5CA28A07C8C94E328 +6D29D9051524A60EFFD07CEFFC39592E14D6F1460EF90059129AF3D989144A5E +0DAEEDF5EA6D1E7F7212291541F0E1A1DDE0CFBBAD2DFCD5B367227EF9F13F57 +0EDCC40844358B9C95764FE0981D99A793DD6260BFCF25A3F660DEB9EC5397E5 +D33D526857E454BF2694C50E7558A060C292050D534F7212AEBCDBBB622ABDEF +F31E6B6BC528B7AB99169BD1DC4070D883BBCFB69EA73E05AFD18DF56F31B251 +A1E8C9748915856FE50D441C0F968B7240688CA6CD661EC9964D030BDB6BEF8D +3FB25596A888D7530E767B60FC3C85932525DED921A63D7CB8D84169522B336D +368901BE9754CC72DFCA2A1FD4F21C2BCB512D6B97D07F9902EEB1338680121C +B2A6DD32F54632E44943081F80998C0674D640CC003BEB0307B51593BFA99CC5 +380390D36BF36A83618064BF63EDB81D5347C596D9E43291AE0D6083E6E10ED4 +7C78856F1F36C5B5C9A7570A654A86002EFD2D757CE3D59E04E2FDC681C3D297 +C8B8EB8FD5821FE4AA3C35B2B4EB97B45CB0AB7F8AFF57C861DDA0F78FC053CA +B0F01FCDA6EDFC00174F62B4ECE8914AB495804E9793DA4587B0A295A8626A69 +64A1B3C9B2D828B60BC6D18F19B604AB72D007FF0B571BB42FD6BF692C887C66 +D21540E2790ED44D117E1C942FA69694067FBF198FD8DCB22FFB10D47F75F445 +59FE728C24B0968BB9EBFC74C1BA3D42858DF3EBBFF8C27E4ED19C4F2ECDC009 +EDF6F19E1EBB4A653C5E0FC6F01B30E89BB1D5D4D232034E8D1059334DB204CF +6C75B87ECA4995A322BDE7A2B9B3F355A191E86A3B23AF11B52ED596A91B46B3 +8C03B34F328992BE927DDC4B153B615F2C55224167A957E4CC442C041BE4B961 +9EA06EF6F76F093FA3E672EF104FABE172545E51C4666C0BA73A6F08948D05E4 +E54C4496EDCEC0B33DA14FFA172A3E2116F1E10A04BEA1269E38F396C857DC74 +3DF40255BCA91906CD2710ED5806C6C6A4688BA557B78F5F81FC9764E06D391F +EAE0DF580AB7F045DC04A3BB886BB27AF53DDEE38D38AAF35CA96CD3F5C869BA +2DA4D9927809677025B7007278E0916FD8B5FB793BA74DD627CF29E7A3621EE2 +0951BE2D39031BCFA002E6FEF53EC0283247145B2947BBE8BBD3E7D5C49D9A1E +E8B6C05774B1A339A469C677BFF0B30CCF7325F9077349C96608B60F44C18101 +25E03F6EB91B25562A4F3738977FB3A463C0B8DB6B771B3145D44CA360E54E7C +697750053AA18EF9E9A3689B6248F124A75C6DBFBAF5181D8AF35A6152641092 +320A21B984DF101293A365918C113542819414E0462B6697C0993D8462A7F853 +D22DEE0AF329705BC81F362C13CD8FFD411D53BC4FDD03A3F5B95AD75FB29B08 +D5DE5830C69B2DC4E6B8423118B1069A1275CB6414D09FC27CA353B8B239AB41 +FB8E8E68E175B3793818C22C394932CDCE1E17FDA48E8AA619583D5E27A8D06C +9176AEED7FCDE33883A4509A5C8D7F81BA4F517888265E57D756314626BF3674 +F0F327380828E9D129D8BC8B352658BEFAE98218BEDE1C0E9E2FD95D595506B0 +70169BC18FDFB2EB5B4F216D07D878FC92B08DD94F5D1E06C3B20A15B5772A29 +79B770D5C82EB260F821CC53E97B5FFB84FC936D1452A11912C9D865B1C4966A +C9192A0E1CBC421619AFC16EAD4C75ABFFD0F801447D9E197A3D8049B859855B +E61345674D6D4BD99C94B049CDB1253D45C14DFEE7B17B8F7A8DCC9B26296657 +E7F033CF55ABC7A703BC755504EFECE597F0436B98491E0A8B6B128C8A4E9B22 +924D33B6BE65CD0470871835C856E25B491A527B1FFBDB8263A64E7DA5914C24 +1C4B7798424AD3AB0E7D97C0EB3FA94215F98A2172FB9AEA3AE44B04F4F14505 +C229FA8974641636010907CA68786D1C84BA5510A26EBF0D9C23E7A0EF4C4E7E +837392A223C16C7092BB2677A0E6C3BDD718F8C16DFC2232440EDD967B305F1C +85346F4F5C109A902DFF10E990732992CE920D95F999C97948BD254AE64AFC2F +771306DFB8454F8BA062AF715F50C0CC1C0B40C039D8A36CE350CA5C858607F4 +0E86B74DA44262C3F0D2F8E19D6E3D93683D204F9D506481C3022A281D465DA0 +2C33F3CAC0C9E357A1B96C24EEA1E4D6B3CE3B61E84ED48342BA80DCB95515A1 +964537E23E8368316790E6F5810FB266DAD3DD8F72FC219C7E7162596B4441A4 +1ADF396127473EB8FE164B52C251F3C997B726FE3F437564A1E5F455B595D20C +F38A1BDE3D7A61691DA09F7D8698950883B397A9AC908D69CCF461892FD9AD5D +F17B55B60B5378F9846B7570803990AF00BE3D92E40A62C9EAC215ED8ED4F12E +10BAAF1BF1313B88FBC92C37292E2C431D9C5E7D7A6E8B1E300E0B8C7E6B0137 +3DF9B8CA1CBA01F68FF29F608572859251008B3CA544521593A19BB470E35DA1 +9749CF4B5BE790810DD78DC9C28C310F15AEA54D23D58B2449E93C5044D70229 +5EA791A06AC3DD5F512401400561419EEAE9D72900EE6336B6A8DE9EB91846FE +14BDBB2A318E8FD269AE8862FD5121E402D85CFD707F844F02818F003B4A7C71 +8C03A18E097FC460ED1651C34B2C83A08DB246AB16389CD1B73654F222A16A96 +132EE0772CEFC1001FDAE643F0077E393AC5E328654F06FBB16490AB1C4B1016 +5DE8437C5E1C2FEAC4DA3E73F84266CC47928502B1FB5DE4A160A9CDA7E876F5 +FB512D043832F0B3C3AAE969C5DDE3515C19725D7573E0890C2A0D64676DCA80 +1EC2E72C1D93A08755E8E6AE34788A7EE87B0198FD576B798841A289C3E4B18B +89438BA3EE74BB0ED495FF8F2DBBFBAF532A14B0D75B90D6533DC439F65980BB +F081B537F94B4C48FABE0873D12EAFAE4CBF3779D34306071814D2DBEB3CC5FF +0623456154368D68D16E478358590539195654C70C9C8C814F0AD6BDA45AA546 +3F309D22787B7DAA56F60D65B953A257254FA3054727A57EBD5055FC96BE3C9B +9D5B11BD8A5D980BF5C1E1611D0EF6EB000D594491579ECC8F45962ED6228A9C +AB2311B7E09D3F846ED366963BD57A5F41F54130103A97401FDBBACB880A8E96 +70F230922715A6CA9D88B33CF4C9CBA196C3BFF1521925AC49E514689B094159 +FF60C59D3D6963F72690DFCCD6740A1C0D274CD047A83F7630BBEC073AAF67DE +E484787A78C170FB8D900ED4C8351FC64C75BC7F09089EC8D56C11C575E22087 +98B3FD21D1FE47D7899B908DBBB80C0CCB0304D491798F5090173264AF3F5622 +E97C4BAC6E22D336732CAD404D51CDF3B2C1F1F098244A8FB998E77BF689062F +8EBD6631461CE66217694515BB0BE2F5A97ADDE9295001E5BBDFCF1CA8DF1312 +2D9D444EC1438AFB1E1A146D14A8D4D1FB554D8A8B7DDED6D01B3D3FD2D408B5 +6CE034520871339B6070567003255A7C685CF7579C5A9612D5707DE094D3DEB9 +1253809352F9170EB020BC26CF69A274B31F99AB44386C01A02D0F3E4EE49BEF +7D85C07C685AEC301E0323C9554AAE970C5874927909BF8A2F48B553DEA37057 +D39ED353AC8F7EC2279FDCD395AA162354F237BCB993AB3311433B6373B555F1 +BEC82D844D2D51CD938EAB2CCE3603A46DA3C9868C3CD586559C403F21925AAA +51C60451296C01AEC7604C7CED9363536F2CDAE99A774E2ED95A60787872E132 +311E1E8412AF134BDC094597C80BE0535D81ADD7464D4DDE57DD2BB020D0B57B +C5527E84D4A7FEF6CBA439FEB165E0629D08E7BD41C138CB1232A2B992540D3E +9626A62FAA6F64961B56E454CE4C918B57560C08868F0F262E79F43D7EADADDC +6B42DD8DA70AF5AEC0966C0000A93949CD8B402017EE23B806ADED418B470DA4 +B7732B8CEA6A2464B35D3850F7B57596E5F6AB71CA9DAEE51B21C8D093D159A2 +10F4752F4410489CC6734735A4CCA0CB0E6124F38C5B879715509A99A5FB7F8C +3353A4DD03B43F41117B9673E1B8470579AF8706965AB50CF5F402848A603E9F +60FE3B123838A090E1CC6938DA3DB19908BEC6D92BB5A0E2774206CDD7EC2969 +186EBF848BE9EDE2A30DAFE89349062A111B53346E44CCBDFDEA993DF7E4D06D +0C395C514E3C9BCEB7F2C3B7BB6BCA214F7DDCC1A0BE92BBFB04601563686CC8 +13901FB618CC2EB8B07E7568451B63F8D294881CF4E03C492871DD81C435D92E +8247C5D3D3501CAE89D690ECBA5B0FCE995DA9A1A56B4A0EE568281C44589A46 +0C927D6FA7873DFB85137FC1A712C97771495C98F86B46968C3E9C62AB80A93B +C5DCACF6ECAC4E0827809FC0A0C6B588170BACB25B3CB1E99A38CE73DBB6D0A2 +43E5A0626FA8019557FFF1B27B4EC673A3775641C4AAB7F84454191383E77E96 +3D309D17B3E74998CA515D9B80C329EA920A7BA8E0097AE066B5A2F83D7A9456 +78738E0CEA73B15A4DA0259507501DF35F8AED1E9CB8DAACD2AE0118428B06E6 +4CF0F812B618E7070F36C4A9832FC7348F2055BF55E5E25853F669BF1415B67C +FA30F3C3BB89A96985E6B82461AA8016A93B8DD61F2AC7E607A86D84291BE847 +11A0AF6F40AA08BCC6464468CFA7C9B0AB741C3CC01C14BB26F6F7CCD561DC7A +BC38619F3D445BD4BA31607DB4AEF620CCFF5DA527261E7C7DDFD6E22E7B1AE1 +AED11E8DC5132A1C58B15B82E65DEE25FDB5E4F53403C99E2F67FC074412DEED +E83E53B23C4A571828C79AC3FF17D5701354A14B83969FDF984BB065FC0A6627 +1772E33637A3D303B652305DF8DB459E43637411B04312DD2F7BFD268B209A10 +2B2B3482C84E4A1F27430B729CF6C3A25116CB81155832670CD8EDC17C9FD068 +C07475A76F7F37D84C905CE96B5ACFBCA703A19E35DD2EA7060A8A6C6BED4209 +5620764469BE1ACAC422E039D35057F5FB68E446BA6134FA05EAF51D70809586 +44B539790748F9B7C0FF2698FBBEEF37D318DCA12FEC1B32F88BEE11A91E9054 +BEAABD1723857DCF87B13D57AEF68E6CF2CC31AD340270607EB6709E113392B8 +0459C10C6D06A3BB7C7F6252621C5BA73BBD8ACBDFE20D7146B0C1CB96E393B1 +25002DB37DCCF2633EDCAEB9A86F618AD4B3A985A83CEBF0D62B31D0D09082D1 +6CC0E355D4557C8391A5F2716F8BBF01F009235DC8070600F473ECA33DA726D8 +EF411D558D5A8B80CABDE111AFF83C0F9C058AC2B9D053CCCD1DA44C97AF4C7F +702B162E4CB347CAEEA9E650C076DF694ACB8F2E4364C675263D3A677A754B96 +20B67808EA3D015355F0888C406D1B0DF6448F2E08D9A164F955940D517A38DF +F9677BE00C66FF5BC8D722BD91D66D22AC2AE70BC551406C69F9CF4B2FE69870 +634CA58D8FA15DE46ADA6403D52037684CEA2F5BF8E589B23B402C596BA54825 +9A6B0365E1958886E26E5AB8BAF31DF7FC9BC809E8D776A42E7E8DE876BD72D4 +C226133F690A08F11E249AC083F3A984B1D3C27AE4486A4620E14D9D6A361F3F +38CEC60A5178D8F91893B91AA2D5D8FCD1326079F29E439C5D2C7ED3F5F10B4C +A29C4E97C111E18476731E0013A0ECCE409EA27077F35E7F0505B9D49F2F36B6 +4DBCBBDCC801645163D605A517866E71288130609254E5D4BC3743D7A81729AD +501A63E0C74EED7E1AB6D1328C67236F9780E50146A5DBA0BD8A402FEFD5A6B0 +956C11C68D14796CABBA701AA133C3432ED4679526DCBB089DF0F4C6780D16F0 +E90029530125B39047E4DD8CE1EFC7ADD58BA85DD905807468446504DFCDC65F +4BC08B27AA069C5383128B36FFAF4A06EA758C511F6048D9E5389A2F6066D7DD +D1FB36F91CF9D555934DD2342322B725EED853A189C698331D26AF00B9D600A4 +EACA6CCB05E063BB7B9DE8AB01CA4C071F31279524C18B52A9F92B7F2BE7A2FE +FA88112F9D534284418689A7E5A8DC2F7E03B43544BCFEB4B98CDD23C4D7A48E +457FF99CF93866B0BE306783205E3C525D1BC42370ED0C0643C57CCE4ED2930E +6BDA7B6539D9A4BFEAC4FE186CBFE3C728D1DAB5D59D8E542CFA2154FD2AD3A7 +64DC84114D21E4549D8F6E4E2BA469C4D86987BA339C9906EA3408481198E71E +7FDD1C135105790A81918A00920B17A56B11A78605571933BF450B408ACC11E1 +6D18B2D95188A2E878BEA4BC99CE430F3336D11B4EE22B72D7AC4A095E34DBD0 +14B96FD5A7CE5851AEECA990F98FE61214104B1CED07FF1648BBDD5C9E9F9BA0 +EFDD2F3F5A9CDEF9D514AC81EF0194BB22796AA1A86A04F77EAC27414E94D4F5 +FDB66069026628694DB03635737D4F51ED68BCECD50AAF6A24DB6E8B02D83A6E +6C06A2126773A1898855138F8B98E5368486FEEBE7548A968DB773D3E2B31056 +F217B22DE4E359BD03B38653F959790F3CDAB6CD89DB03B025438070C1C4C3DD +33F82E6793C7B922548AC44BE5683E28948218D1DE771768B4E01079113772AD +6A9C99F07AB2A10656CF381D58214C821846C049DB3C4D8327C1C6ECED879CB8 +54286708A843CF50D9BC0F665CA7FC81774C8E4FF3DD40DF528EBB1EA735B3FA +FAE0AE213414C3D527012BEE1302C7301A8E20CE45CE52430CEF71DDBEEA9CDB +83F0CB20D791183B6BA77076BF912A48F200EF883CB1A28944F6AD9E19B139A0 +39477AF27ECEE71A9CAB3A8CE15F721E65AEE8D97D281BC2D1E8700679C46D37 +FA193E8C3B307E013AA5473E32E1307F296AE7A69B467B502752133624A5D608 +011F4AE60E1BF61463E862D182A6C782C4B0FB86D6028578F317E5AB05D2DE98 +ECBFD98975BAF5C7A30679179E047A1E382B8515EC3F41793BC3A9F8C86B2B86 +84AE948763AABEF2AFC145EB1E978EF2152F8927334486F9A9C9082BB4348795 +478E42B197ACF9AD0D51A26F0692E9C9F7C802ED28E9700C3F5AF42AB9AE5983 +CA8A47B5E286F8E47B05F344DA33CB13C65AE17884A929F5681CDC218C128AB3 +601EA443AD09E8907EEF59F83D52223EA7812EECD8E5A49A8DE58AB7300838EB +2BFC53A28EAF747D4D375EDC1B904C705F4A100476F6E06855452E1E7A89430B +643B6ED36DCA4E4EF4C9B637F7865303A5B32701CEFB270B2301D97A4DA4DCBB +6695E94D42952F1D135403DF65D025E6D86299C4E56BACD22BF8D8418436F380 +C34C7C40E583B8FE3D4176B905828D6FCE052D0363F2C525542E5F0A0B25ECE6 +DB7C70809D53562B48A65AE5D98E299881F30FF096E53E8876B2C18C88706363 +B7EC370D953C44BF78A10C9B76904191465F72B1839940FC5568EA58D62CF1FF +A986F9B187FD03F8AE785B16AB08A5E4C37022B79E96250B31D55BBFDA0D8B20 +067CD1E1C8608EC14B2A1B46B3B7F6A1A694FB5001091D797321EBFBF1708097 +D4AE6AB1C315FE5BAFDC7BF2FBDF894973BBF91EBB14B0B850551CB23A4BCC39 +0F5F6CB3FE36DD2FF66DBAF8DEC16F99910B7D856D0ECFE608E3D8A5B018FDC8 +BF9B929F25DEB245704A546A9A1AEA30062141DA6CE80BAC951C432726C5C91E +A5A23F31596799F6E675A932A0338F0CAC2F52331442FFCA5B1570A498ECA353 +C18AB67E8164B828A21E9E4FEABE3B94882B2E819543F4E723C59C964A267DBC +A2E8EA1D48018A4D4DE7608A7CBFF01C29C4AFE44B2662C0180F0C686BE89B81 +30A280D61C321C67B2A6ABF1209D03F16C05539AFD90DEA6ACE3AC539214BB0D +10E39EC438C3C952399C07A96521C42FBD1EFF57971D7B06902D9BB9C9E32629 +FE2439769D67DE7103138B5C161E8D58C6B01884C93C2D4FC8DCF87DF00128DC +74F6A34F7CF4719524FC8D28502115EBB86938CDAFF00C61D70EE4E1CB98D1AF +436197CE8670D99F6CD73828CB3860D34C9B8B49089129C71DC3B4BCA918CD9C +C8B978011AE713105AD89529EBBCBABFD85D629F058BBE9C14169B7430C835F3 +6365DB92E8514721DDA91B2EA0BDF9C9297BE12E2897F59F5C6886BF8EF6CD90 +62F5364E2D4363A7A20CCF26B24016C260F4660DD823E7995F575ABC3048E8CD +EB0E3D0EDC1CEA4F86EDB1EB6F46EF5CE226AEDCDE6D7A9BD142F87053581082 +168FB0FA1632F6304772F83781D5B797631E3D8305323C28F8096AE577001EF7 +CF4B69C7A31DC24D9A22EC0B9352A35DA0284E78D342059B2B87E186BCC06D0A +C2B459EE7B3506C9E79C72E4B3FCA87AAE77183C14FA5BDE7BE126AF47E16A69 +2C1F50361E8ED35D6C77B0BDAA18C12F219741838E78E2E721275100BBE764AA +9CFD95728F9CD3BB344B40ED7F23B0E89A8AEF47ABF898ED6BA710623652EEF3 +9E9FD89221B624C7B4277A4AA45FFF8147AF3F68D5A7AB0C8C06F122DF0F9733 +38B1A96D51633848FFAD7DC260BD09936BD1FC0ED1BBBF67ECF2D2CBFFA77D88 +82E4DA43E68A11690B477A7D3B2B2E404790C1EF1A58E898318A360B72BB87FC +F5ACF9CB294A091162A5F0F9A391C8EE2BEE9A15C36AA99CAF216C1506B1171D +E20E627B22FF9C685ED7D9CD8924258C4CD490F72AD5A488402919E2C6ED3864 +2B9C54EFF3C03DECB50DC1D48E1479AD4C6B5471103E1903365BCC84DA4D04B3 +80AD01F15F2BCDB2E341064184474466245E44DA617B24AE17C49D57F2CE26D3 +2F7175D78255F7195EE48400BFFD86B99F7AE62D0CB70E72026AFC38F1D2FB8D +CE7DF49602D24BC8199199EF5D9706FC24E0A57F7270B70CC5976B9A6EFE8F00 +B0CD1CD7131651D0230C17C02A844CD9F4BC13FDA70F5CAD18CFDB6C62FBCF34 +E56579BB8D47053A5C3836C87A047C99D36EB2B66F89D8887F3CEF292EC6ADA7 +3299ED6C5F12ACD7D952E6E7824293CB993E8A68EA874501D84BA68A264C82CC +C9A99FFCCCAE6702C9D37B9C9BD9DBC1471215DAFFF6FF1D0890733E3838AAB1 +31D94D1719B35DF54F41F3C1DCC65C138714C350825746ECF14A4C5C80144E7A +4A91C57217C2BD91D6869B38E6FE2D2078EDE5266A3CBBDC8CC625FD5F1575EC +FE57CB298FB7490111DC9D89F6450D8DFE17B478B0BB2C49EC8DA7B66B2CD6D9 +6BA9365A3CD1E90D2DC12FEEB38500CF56543D1AD5B9E8E1CC0C9A2E12CC988F +47B5A75A6FF8C047C678A2AA4E8947F1C96F9C0BB8C2B9589404594731C5B18B +EC8E87925BAEE0D39BBE9D1435305488DAE9BFB681558654044C27573311E2D9 +B0F5E4F16BAE74ACF4C5F76C53E2212EF9F24B36BE2EB027015860DBCA06F0A7 +569F7C5AEB098039038B90D2D5BBDB69BC563ADBEBBB65F09EA75E093D92FD85 +B94E5E495C985B406F7D41AC91E8404D5CCEC7F0A907C2600F5EFB567C7F2BF7 +95A755C8C121A23F7C91A211D454C004CEF93AEDFC906E155AB5E547F0C48010 +B410F1221EEBF25F4088F72163296E956AA9E7CC5E691D4B1C40A62F21DE31E7 +E3D78D51EA7704D0A2820FDE922964D51ADEA8D0B1D855F8B6C35848938E5E19 +AEDA302E955B25BD58B2582EA770090567EBC1607049EFB639A4CBD3212CB220 +C0E2E11B5694599C82A40C1EA9FD1C5BF91C782A9912715B2FB534013822E28D +04F7C089CA656D77960368217E0B9D485AC80226495D72F4E29706E714227C4D +38203D69653566A26033946E71AC51BD78A513FFC383FC3128296FF68026B46F +6406FB931C699C0EE832519471EAFA2DDBFFE30EC2A34F0B7D0C2D87B34A6ACF +57716BF296006D7ED48935215E98AF8B79568027DCD643E0E67E504AC34F5F0C +93795382DFB9E1FD1B1BF12FB5342166D48188B84E30E3BDF3BBA314DA4A62BF +1E8971BAF7DCD7A1B515B265FC0105E2E647175CDFC932F83DDE00AF9BA09C01 +FB1AFF7CE0CD22A5F5FD4DE0CCD0449735C1E2D4292D4F9B781E94C611126CF4 +772743225EC58DA1100917D45C41819D718CA930786377B236BC0B1EA6020EE8 +ACB3D3BBDF25BD5013A7A61AC75BF1668FD77FBA4F03F62119CF0737ED0B0419 +76308D50194F06B47999F6C354D08B0627D7319885FBFC69328416368815F09D +DB26EEF2563129A4C8AFDF106AEA2FCC0E6754CE0F71F7DB6F559A70C683A5B0 +03FFD10A4284C9738039ADFB937A91D0C1DE16684B6D1EAE980EAAC05D93D5D9 +B262567864671E796743B9D06C00803B6390D48644914BBCA63F28C4562FF8B6 +20B8B5F28AD2F1D3E28AC217ED0A37FB310892BCBFEA9BD5B78DC8E507E14233 +B4B08935B47E39D976A0DFF3C78F35055797F80D7518184642446941857CA803 +86FFD7E3379ECBFC607EC5B03CC2EB13CCC4A1C2AC7FF94032D005662B432151 +27D3CF031A878AB01EBF4B1F99D8C9D682857399A88481B7B4ACE2F168FA9525 +F3CE2C2C1293386921DCAD7A0888D8E9934D4451BDA74F91774D2FC1699B6AC4 +22BB0E85C1503FF692B48E43F445959F599862D5445EC97F6B9543BB8DF87A5E +D0F0BEAC996E1355CC2C2812D617842B1C13440B9710EB705419B7E9C7364219 +BC005310FCCBA5C410639DFFF7676D44166848ABEE84C5A14614650BBEEF7996 +91BA6AB25B3D3FC0BD80FF9FFB8CCD4D27160C14F4808AF0BCC62B288CBA9B0B +91F266295E5148DC34C3D89961C76DB1BE8213BFC9C2259CE3E10C52DEF4331B +4847AAC71094B1883BF342ACC37463B7E16E4769F3591B426F2B4E3DCDE31B08 +BA838A9DD1C9968204C777034A745374C96B13C5774D7F46C7DFDEA2D8EDD79A +E678BEE2CC407FECEB38CF5A76F9EB8D67155E5212F77FE0FD17AFD4D7ED1D2D +CA92E8538FD5152608268CB0A5A6F068F7C0D589F6CEE36634C81F69712726A7 +3393557C824783D5915BA5952131BAF40B28D78A7260A24E399BE1467125B7EB +3C9E7988E993DCB90B1173D94007A31A87F35AABD3D6986B230EDADD193503DB +0843329EDFE2AD82DF632E3CA916ECC6AF1E9517087660173939D20AFB2FC8F5 +30E028382687AB6CA543EE1BB120B29A9148ECC9EB08E580ABEC61BBF833876F +965B1FB64C7A11616D8D7CB6A0A83F08ECDE0499120853371F936F49B4C03C29 +C0CFE89B22DF2705ED6518A0076C045DF47D08C708D13559F50620B00743115E +301528F33A7865A028D6356DE6B73147FC05DD30EB35521DA418A1DF70E06326 +FA40451E91D8737117D9CE45F039635061F2F33253F865D60E7EFF52C1C6D2B2 +CD3646A717134228CD910A22C256710C8E61F8D0676AA54A94269CB103F83854 +FB64074E1A5D4335EB72B37BB1CACD438EBFBA04D9171CBFDE77AD0C9E12E4C9 +FFA191FAA899BB448B1321D2D8D99D54DD126C4EBD5E70BC9FEAAE644E79DB91 +167A89F2C736DE4E4A760B84109F746F56CD32CBF8846692DC46590479B4102B +FB1F8A64B613277CADFC500BBAB0EE49BB24B134A5B4919163D15DEBB8E914FF +A446A5F9E10538DF344392B75CDD5FC72C2CDF999A285C11C431B4F71612779A +ED983EEE2C397420FD7F92199B2086A5DE50C6152F4EEA3E27C1B8CF908F2F3D +11C654DFDF2636CACDD571BB10C94F2434D39D6D9AA97B12F8A1C2F5295C4112 +3145DA333E3A5E21253920B698A87521E4DC22E8353FDC4DCEB771D22781C30E +9508B8D30431483F12637B271AB8BF27FF28658F62CC017071B58634F19B6FF1 +26703703E29FAB5F64B5AC46539BE8F3B8E11385543B3A5E997B6DB4EEF4BC3F +08251E1FAA50528EE2F35A22D36444CA11CD8F0D4AD0BA9158D300E89E6C56C7 +2E84628C68CC84AA6607D9852351B43CFD29C6DCBD7E7A98CD838A80349031E9 +C8C30D7178E9DA6FA7709901D17AB300C946327F2A59F038FCBAEB5FE6477115 +411AED37A43BA69A99663FD1D6A1BC52F1A5FA757B9DC89AA452493786809D25 +9CCC6A177DFB1FE396A9EC6F1513303D16D806ECCB12AB4D160B857AFF1F36E7 +E2C72C5A4B29B5CF1FBB55B7FCC0ADD70438ECB5CE4961091D096AAD12166590 +A8090AC848F0442E952509F2059ACA93E6C93A62646B06A9CA2F27295DD72025 +61C8190EA2D782A12D98AD1F59A7087AF2F7E6AD183A2A8B131174BA12DE822C +7ACCD50426A96AF76BADDF9C7E958625324FFA804319305B7C5E5B745AE14215 +517B1B1FB791E9E18E5D9DAC6DECC6397237DD6920D00B308E205493964BB46B +09A2B35579AFF38D6394BAE736686D89495888079326F42CD18454AF18000942 +AABCA5694EA2B965206CF24A0971C254CA889E5A50CAAB373809D9AEDD7E2F49 +7ECCFFB3E20258D83B93082316E149A9BC3F1952A541F644A91D830410474264 +CB8219D66A87111B48DA301286472E62F68D9ED53A80461ED91A90CA5B74D7E8 +C715F2CAC2B8779E478DFE036BD8228DB056DFCB5E59D0DF7218034573352C36 +C2100F4D8754C41CB15AD0FFC7C5CE5D091C41B7D4E9FF4DAB4908EB2D5E289C +FE228B98B3C647B12889739F99E9EAAE81C406C71D9BCCBE030FC5630134FE73 +6F462E6725FC49A9461015367EDBA48FED070CBA581C0E75D20ADDF2EEB46A79 +ECF3B1BD89786130D6CEB0514F294FAF1E253A5F6C359068E8A233E0069C371D +EFA85D0C87012D04CB4A53BFEA47A148CA2B4530A5C40D37BCC73C6FA2BB7C9A +AA3B6C5DB69F2BD36B1BDE5B739C3645C60ED7D37825F691D3BD58B8ED63A257 +4EB7BA091C66BD98DC9772179B0AD2FA4EEB2EA8D61C332D88B7E60D4D2A7C22 +80ABEBB582F7E1813E1448000CDEECCB85D9E135D7AA2E28D867F2A87F902F28 +36155B7D0DA50E56464765D7CAE2232CEC8BB7278F69F8631B33A40B2EC09384 +4DBA8F6999DDB77F55AF8E1C7F7646C66ECB86D4DD869491B457E9CB35CED2D7 +F4173E894210E65EA08AFD1EB2810EA4972658C21CEC80330D7DB5F2A07CFF6F +343C3AB0930F392612FCFFF26CED13A711E63C591E0A592B00E2453F982219CA +5C5ADF76C4F697E9A73C992D1EF01162D36DAD14DD0F6D8741C2E08FDD51A915 +B964D967EA8752012546F5D2056761F7B694C3DF915432944491EDE756D01997 +FE85794680849A613C1CE80F8BB514864A0340CA0AFC2BC750CF8DC0954B6DBD +A97B1EE3D8C2A7DD7285F2CE0F995F96BCBA3365F2247AF9F6B924D80192A70F +7EB242BE6441482A83D441856B528AB7606DB5E14C5790140BE1918EA5FFB306 +10E08F80C9E9524F73FAF68D5BE79419343B3DE032706EA272603056DF6A821D +C78B5F703CB38652482F5D7DAD5D5EA7AD1F832596423EEE9CFF1DDD2998511A +C43F3A71CBA3A5C14B3B2297A77DFDB49B940BCB3F33A9C4B99F26CFEAF818E1 +5D37C5D029C9DB979D89DFAF55D253E0E6629D9E2E4C5764DE4BEA3CFA6AB185 +F62E1BCDBB2CEF688433229D07BC458C4DCDFC3CDB17C8E288E7586BD7A4DE29 +E8A092A0DB26FE23060477AAF5359A558B9E79BB6436F2B181E8B53C4174AC79 +5796F204189DDB3C0156E5675151D09BB73DF17134F7575269B3C22BBDC58104 +12ACA2F40BB9918FFC1D77160991242FCC4AB7044F7C01282F166B3E9B6C6B50 +B805C828695555413CDE6DDA31E83000B76C5FDB3D30085E6F02A8F2CD1A8213 +2ED5E5188C18852BFB629CA6237F7B6C634931D90F5C183FB880D96B8B975DEF +A29D427ED88A34F09267525169EE575AE043FD180E1A793372A551E0F4DB7EE1 +4B18B770EC4EB043067D12C17D147207190D0C6BF8723DF89AC1668B1953608A +F1C5EF65B80A76E34DF9A77BEB0C70699B75F519C80468313CC2FCA9E3CF42BA +1302BA6B3970C3A72655648C240CCE5D75EF67F49A2EDDF8624A2B7521B888B7 +AC27EF9CDAE54040E6E7E797E18A3FD149F680E6BC5192E0F067CF1DF6969D02 +CFBE9CDC500ED58B2A140BCA75AB5822B2F1F34D8AC3B3ACF2132A0944D5D912 +33923BD27BC6CD13DC87361F5D03186727F4FCBB03E24BC1872CFAA635014882 +0F3A790BCCD88F22F49F4EAF8C56955D3073132CA2F1FF89F12FF67A2AB9A80F +02C257BAC189E1907300DED6A5D946A217AB4372DC64CF596DEACA9A85833E9B +1827EA876EFB89C94BF9FBF31563169C31F5420F6D10D89DD88CC87BA46FCC87 +761E9A50E32FAC58648CA233FEA7EA1C3EE485214E0AB723CB192F3C46004010 +3F9CD7382CC394CB4A85034B2D0D7C0CE9DABC0C73FE7BBB8BE5C4EA27C2BAE0 +977C4C730F2A37981137D23657218BC8BCDEF4B2806AE29B135525C17FD4E8B2 +D5673C58F6DEF3D1F11A7E8416268A3133882BCE91A97C3F4F07B8560C918677 +C9ACCE4AD07653638F9F03BEDACA787535C2DFCAB3DC3A4303F7553989AF6FCB +8D4A958EB5A3A6FA666E7A1A7AA41427AF986DB990336247DDE616914C4F41CF +5549DCAD6C3F8A80A01108069974FAABCD6A372E7A4DB8A62CD1E052218308D1 +3335F3337E097B266D683A5305D0343F6813B0D1F26B118ABBA30983DDBED252 +36479186AE5CC91E4FC060EFB1FE70F9E8F1B450893D30B36E6C5CED71B45DF4 +E586FAFA0D9AF57647728ECC16025916769E84F870FB9CAB10ED3AB674F765AA +E720DD18D2FEE1DCA40BCAF1D3F8D0D54B20B12E1DF52D625277B49355FEA41A +8366EB9C6336F2030F0D9E7E467BDD8FA7A1D4BE6025E33DE99825D9CB401164 +C2EDDEBCCBAF38E74B4E41985087BAB13883F205EECCFD674203504292518548 +401E83A377D3E7E419C2D4F86456C059A1CE971B02FFA0952F361FB758F413B4 +5D9E783B6B9D5CFB6878EAC6A75CBF4ABD3BECD01F162ADFA2987DCD1CA12F0A +10B7B4E153743E3B92D13E6378F770CE2937CB185BDB4B53963D54E1421DF5BB +AD6AEF0F6702EE22FB980F24B15CD5F961D74D20D66340D37F6A8EEF4F1F19FB +2529AFD84E67BBB1BFF305820F567697F675F0E002F4972A48B8A52AF5A98B5E +71811A929035A76A036627A64F5BDF97178B83B1B9156C7E52D278DEBA318038 +8E59DDAFD2FDAF44F80FC1CE7E65F328EAE820974C7FE1BC0AA8DC328FE1C692 +5884ED1E5C19B119DB94952EC58139BD111086D0C134A9B6C0E1A291D5B091E5 +59D406F60AC58B82B6D0A523E7E94C53F6813F79B0FF1267B751FCCF9122ABAC +72AA9F993FA42971B30382637C2A8EA8BD1567BE6F24C87350F581A0F0E3854B +2893C37A5B7195AC467155C57F7A0C94F87102F98EB370D6C16D4CCAFEC2B258 +62A53DABF7A892D8ED0ECC1BCA5D78933BB69B9355DE8D7A3E297FA4AD7F1CFA +C6A0C8E3819BA20EAF56487DF5A9FF545B958F3C9F8B1DE57C570D64D97C6396 +AE325AC12A5102A49D683B78A1FF49D16AE237886440B31B80A5BB3A15ABE827 +6524120CC5E432226F2B74BD6B24B2D285D95A840CE3BBEEF7FED24C2FD07D57 +6BB486645F60BC180DBE5EABDEF926E923F405270CFD781C2205D7B68E5A7BF3 +AA20A4961C3178420CE6F76ED017C5B23CEF6C66125F5642EA872103911A2951 +01DADEF025A53FA3C798183ACFC3CD6C115EB9717D36D1F293248B94A5A1B1F1 +DA51EDA82C30FAD863E0AF8DAF85AF76B7C49BC10ED28BF794D8122A54A5BAA2 +D9AB4615290010FE370158A640137212E93BE4FCAF685FA6C257E350E3CD021E +F8E51CC1D4E89A72E63E6B798ED0A4C88F07B994EF8EC79FD3559DB99DC9E501 +235474E224DF5E3EF7B72C7EB5FF2533DF5265E2047323F9E073C4C098F55CC4 +F291C9B403FA7C04B0ED802F2868ED917EF69F45E4D95600BF425B8A62968D03 +32F5E19219432CC55891F4FA758943F337B8685DF269425F97ADC08EE9A35C45 +788BA07F0914FF05591B82EAE3DCF106975565EA089D1A7BACED9FF13E29DC06 +4F3CE6A1E3CAE3258426214A3D98F7FD59B78BC228B5D26EE0DF1848C2C135B8 +365736967E5F2DD98C468B5ACD2E1C5C51A961C98F7B043C47B0586D54EF8582 +7420BB57D4C6C7C670D16492A757D7B49ED54A3D1A95EF635F35E99F21C250CF +DFE05FBD85576E9D7CF3942B870610526C130FB83736C0766A3F75D7EF20AD46 +DE70D0BB071A6156C4A4CD1EF853A7DBE6F0EF405D97515816F305001A0B9067 +D9A4025585E6CD0CE6D215C3CC7C10B0FCDA876810A20C87534FE9818037F824 +8D3F10FBAED0D281F6B455FC91B7253EA61758E318E724ED441468A793DE0020 +478004FAE5A78FF9B6F35AA3EAC21527A7C1E754DF332CE26EF004111CA4D791 +0787B7C7539A2AE35E48D7D6C28702B09187557EF3097E06B53AEF62048023A5 +19DE2FD4FECCCE4B945F7A90E38DE5C7C0E1A98F8294271A0234D735EEC3BCA7 +9544B1A2F7C0A934B04D6F2E1F19CDDC2B060F309CD5CD3A6EF9874A45DBD0E2 +51E52E2E2BA358F7D7D7D1415FBC788F230C17BC8E233396F121BDBEC3D2DF25 +FB9BA0FF917AC8E885481BB8F92A964FD89FA52CCB97BF4090896E1B3681065B +FFD9B517D06A0B9FFF6C4E16984AA1631C4521488EB01F645B3BD1ECA92952D7 +229117E36331EE347A81A93A61628656D50A2C6C149DCE418D4B8F5FD8E68042 +B3A25C5B2A310F793D479E39F31BB5AB901B7513BA3C61F891DC1CBC2613C777 +E47A60B1EBB29D3D1C695950C365E0C3F13994ACA6F79C812D3DF88576EBB0EA +C49A0C4C94A4B28CC6445A4E2ED8D7880D1FD473E2A62AF441633CD7B880DDB8 +22A0F54F963F56A38CC334337ADB163F5810DB8B478D432B99864DBFFFCD9CF8 +4764661D1EC2090EAE1A05590C2C48C7851829738234FB4C8E36415369E85719 +EEE6347675672DE97992B294BF1E501046FC1BF0EF48B746EA2BD8C277C21773 +406D0821424F52F967755A2CD99883EDD26F4A2F83138CDE1A9DFC3D85580E60 +350CDB143E479976D252AF123C9D03A7B3068641C950B90AFB26A9625F1909F2 +700C5113CB19AD7556BD54EB9BE6DFBBF4F4926C193802B6F61847271661D56F +A4DD2537BFB0E5274CF71C0B159BC2A624BA9EF265FB55BC2806B5A91DD33F1C +A6D98BB3B5390051B750383B707B2AA6D6DF26FBC1959A3438E3687E75E29376 +31FA652F12748C3B49B43C1FEBBD00687ADDBEBECDCEBC0DC1A940ABB1FB3F32 +2D46DB5455F3204FD1AE17273DDB24E6DB85417184C9935937332BDB8F115E08 +E8F54891CD1D64C94951541C296AC30DF00CAB27FFBB3CCE8402DF81F9CEA1FD +6E04991D688114D018023694668911E06B29E020FEA094577DAC47F10ADCE816 +899B93115B1AE91BF47129A7AA5CB9C11654386EF9819B666CFDA0773A19BD32 +E2EA8E225747899DDBF6A10411AE29447CE9426971CCE0A5BFF7B0F3B1885B41 +4887CD11240ABF1F9F390AE922C049040C5C7CAFEB76BB0C1833C68D5AA59193 +D484643C90248AF23C0CC645045BD0CFE07A8FCF4F6CF643E5EAF566AFA702C3 +8FD22DE496E04AB1C4234AE5B7B7088B92D2AD2AACBB8D1F21D896AC099E3A80 +CFD75DE424F8AADF45D1FD52D240384A469209A5AFBD4EB47F6F391C5DBFB7E9 +36D6C9B923B43458474D510E4FC8F206353ED27101F9C5AD395FC7184782E80C +0EF532C0AFC326D49A5A363E4A271AD388529B1B3A0DA25E27E116F282D87ABF +320BC51CBEABF7B580F41EBE8F35B6C6D04D0A8ED6384B8217175DEDA617FF41 +E7EFC2C4DD7EE978E45495656C39614F9C129A75B0A8DC6A801BCFE9AF5809D7 +607DFB1563B49A2EC7FBAE0CADDEBD561E1E6C5143A22DF0DE9DAB834B095D70 +532852C47336F8DB56747ADE28315C5877E7B25CE4B3F9EB3B6659EEB0875A8A +D78C8240BAEABE84B14ECB5C927B3EED837A9A6C105EA0C3ADF011474DB3ACB9 +2C5106FCC4CECD37AE11669188B553B8D19BF69896DE8F8974A73798B900C2F9 +BB6A1529ADBAD84A77EC86D7E1EE235586F54B6B6E12DA0432E4E6B15F9EAA58 +54ACEA0F332CB4BB133218B9A1EA0982FB1E8C2060EBAD881D8E0E89CDD8F1EF +9A2B346D99DDA2347402F60638211263BE2EC6EBBFF8286E9DE03C7044CA2664 +C843692695475D60D325C46D8E6263125B70572D5B6CE75A6D55E7F02E746581 +5210E04537B45EC6B3D356AE83E64DA24942633EC35EEFB29AD01520956A34A8 +5F188CC020C5B5D8809403F3AC9AC67D1FA1919843CFD83A8990E89E45A07658 +F06D8B34392C44DDA5109A0BDFF6038A421223B0DE8604A188B40CC0236FF76F +213BC77372514FA46B833231057BBFE73A2C60DF37E592FB8387B62150E089FB +83BE288AECD13F6B9E4AFAB9860BCFC54F567DB1A3A992296FA72F9F7CF1236E +CD4A8350FA3718C056786536C9585F8EDF06BC8B228C684452513CBF13FA5AB0 +6555D628BC5DC83C5EFB9D4E3843618EC8A1C2C80EDED76CF2162779BCD9E9B6 +AAF63DB3797294EAC1D1CFA70034CF6504EE792D4AEB0D268B31A09B12D39BBD +B0411CEFC45CEFEE106C10865CB7AE7B1786F39C0BB93AF3FDA169E556CE3010 +E46EB2F6EA196A0C91EEE784D372D9EEFAA4A4E29ED940E97D1FD4796315FE4E +5DBA57EC20895C32F37DA3327128C242FD357F68AE8C17C599BEAC615EC07268 +78D4E2179600E0672EE605787520E8B370567658078A379CF6437A7D2D6684B7 +9B9B155D30897740E4696E90C5C4734115153849F10D21B5D031CA61F1BA5B30 +C22DFC777CC5D5056B5FDDCCEB66EF1D37916398FB231079281D8BC778640A0D +417BF9DD81E8D1DD6FFBD06AC6F7196D12F71D3E34BB9251EF2A4AFE4FA321D6 +F6227A4EB3660AA19D3F96DCFF1C0FEA659FB7DE881C15F7C65B76CAB9194B56 +BD1AA0A2AEABE2B5CCF260D74926831663A9165F95C178DE64153FE87C323C44 +692970FC8EB7ADB1FF6D3D4932C7D17D000B42BB579D1EB057C63894567C9896 +38A37897AA765949AED2BAD425F4F68C51E3E1AF0CB1CB0CC3F0CBDD72EDE2ED +E50226E68EC8FB46BBC06BFF263813FA7B6E564DDE31DC482031B19180ED957C +B68B6CD679326C478D5D9A9DB92B19CB2C662679D6B692643D81760589B7C211 +A71F69228B4A6EF80AA4D3C816525E1B589A15F825653201A8230C66DE7EF8A2 +33B3DEA5465FACEF0757469521C59FA932955A321AFB159DC42DF603BB449F19 +BE418B859D45F9FEC1B218465D6850E8F95F1DCE44708225CE2893DABA8F651B +FAED8FCB4142D9BABF7FB71CA8B8C42B51F8BC79F5DF0BD56868C44624A6243C +532EC4412C580ADE86D74377466C7CA13E6EF1BE45805791DC8C25D7B6FC32B9 +2021C842497995F60B67309CC132DE74EC422D7CBA71A1D0DFDC772353F08E73 +D333B1148D2ABEB2881D8FBE18A49476566F61593DE423E11AF90909B949D3B1 +0DFA96D77CBC1CC3330920AAC7CE2DA6456DFD8D0510981AA923C399FC3DEC55 +2CCC5CB34C81D21B8C6E78E529B6979AD17547B164C1D1D756DE7C9170A44396 +B5183E2F47B265EC4F5CBDC9C3EA2D68198772053DE5FD985B4B9912399F6A81 +C4C37724FA73FFAEDBAE3F31BCD6269FCB4E3CBEE214E9D46BF1ED0FD38BB385 +72225D7CA6476A2EA62B9E5780FC5AC3DF591F56261EFEBF59B567D0A9C81B76 +D88869088CA4C1AAD0DE77ECD53461B5B370F93558290AE7FD5563D16402ACFB +A635A73EC6AFECB0F10F0F67AF7039B3F8E2DC7A03B7F3C50FF6C3CA4DDA95BC +7416FFCC10A615B1FD4252DB7DA19833DAB0C79F4992DB442F2A1E20A16B412A +211CE3661D04FA5E6C9BAE3437B7E0DA579B176E1CD6B5888BB4ED30B66C651A +91EC753E6E672847FDB5F3273E55371B247F38C3F863B8391C7E6731C25A10BA +E939C248D83D5466BBB7B868EC3B49DFE4904A796D26C0D0EDBF49BF0627BE51 +DCAB5D752D318EA1484DED9C7E50FE4C5F89F3A39DED4C781A17501FB5159314 +D26E72AC51F03DCE4A1534233A0FBE2F18E9E812D57323A7D463BC4394A721EB +F4A7AFBF4127A3EDCB31BCCABF8B6E38553116FC15FDF323A7899AFCC3C61A31 +38E292BCFCA7833723239CDED4C31F8AD1E91B1A46D51D7480834CB6BA824EAF +F468B832C6F59254C144FE56978D68A00C4D9D4FB1BE356543EDB9F71EFF7297 +D689EDC87A558463A913D176881552360C5322BB70698F8825D40790811DFC07 +CBC54AECCE432A0F97A63E71414964B10F330AAF531DA36B0E70364066EDC970 +A52637EBD8FCA59AFF1744F5B46AE79FCC86E31BA883012AF7033ECB43C8CF2F +474887951DE88E3288936F9CB63ECCD381F906644CD4036D3EE056A6E26D52BE +C23C2102AFFB461943D393967EAF80E1422E51478448C211A0D62AA97A686DE9 +6B21CC05DA1CE1392FC7C22FFC4CAB08C60CAD17F8DAF5B360F2CBC2F1611A62 +E704671388B7B5B8DC1405B3239085C2DA2944401276904B000D46A5808087FE +3B7EB5AB33B934AC0E871117F8F9AD77F9D4C3C9ADC104BF7E6B53EFC37BCAD5 +7B73A3BC2102FFA686E1EB8C784654EB18C7AA971E30CFD598B54BF11E1574A4 +5A6E3C7EDC4B000EB802A90F9F2B8A9E3CB1476382542E8BE4745EEDED3CC1F9 +2E757983F8837517D46350DB7B463E0AF5EC62D99F161E2E6E2D5D31C9A67474 +0C33287741672DA6D25E4D12569BB09A57D05D77C4507A36BA534833046D5A58 +88DE60F1E3B475BF6645565FEA080C918E67AFBAF673B83A89C866954B2709C0 +98D93B44FF3379952A5C3E4F063D3E2EA07F67B2B5BF9F7202F4AB2DA5543DEF +0429F61E4939CB9C41B86099F8EF62F5E80FE38139E9A75F9EF4B946F775CBAA +D31654675CD0EA94A63803B27B72911E164560D5939111A1D1B579F80509F8F3 +A3A591E530F12741FA5C4673BF894005FB893C2D725CCDA3EC41429383A4D6E3 +0E69E7DD7EE8481E237F5C3B3C2EBB29165A7B672C8D9740E07F10FD04479236 +E6E61691A73374537DFC2DE078BA3F4692D06FB08EF2493633510914649EEF10 +B6DF07297D1C28BABFFBDAC287F83D9CDD071831E1688FE2A62D654463C3BF1C +574EBCB7CDBAAFBFF43932F944D130FFFD11C37488E452D616E745D1F4AFC58C +5417AF552DBAC64147F87AA28A04F8C1A3762DE1E9ABE6CA61AD64547C637D68 +0A954DA58CD646586933FD73C59B124CE7DC09A32289E13ECDF617084B05BBCF +8ABCA791092C9D2AAA654B40C9F3D3101A47B7EA53FD3D3ABA444ACDAD67F9D7 +2F6CEFF3F06C5436E0D541A145DCD80E0DB56D966C563A2CAC59D7B64AD40E0E +8BDB2952F66A77C6C2B2F59F59E5546B67F9753EB7ECF59099412A91A5E02DE7 +B42D80C851690AAEAF4ADA1785BCDC63DF7A857C1DF503315BCB9A48FBED6624 +C04373553329C2E2D7EDA7FDD877EEC15EB9CB4C32BFB2AAB37187E6F7D91554 +2BB4036E3510176A4CFEC4A6ED7AC037618D0B02F7E4E61862A5D8C89CF7B69B +3CAC808DB6F582887113DE7E70B0A833831A6250348F19493BA4619D4E9AD23B +356FA36E0576441BBA4ECE8E15F5C4AFCA524FF9F884CA6F22D0E8457EC0D7B2 +89B16700323B125633B5E78762293B5FBF0A3783069568099377CE17A2671292 +FE5C91CCAC9308C94266820944001038809ED5CA1B80C1C5E5FC35014F7CE5B3 +94E5C4C513DB75BCC1D616A3C952DE3370FEC7EA89AF705A1E035370E3695233 +F2AC4D0117290BCC7C63D930187290BF470C9D33C980F62A79862F5B722A8DD8 +5744A2271E7D2D5547E0685E046AE1B99FBFD83FAC7EEBB576FEA7A823FD665E +FC5FE7C997AD1C6149B8494C9F508A1F29E64E8C636A0B570650425D4CC6F803 +5E8060B89ED4171442ABB578BC9F7DB9F768F110BF55B63AE8B1561650B6F11F +974D2E2E2CA973C2599835523278ACE31B11CB208AB1BBFC342C653266768B1F +F11C9D18A3125F364237560ECAF6918C66AAB987B0028C4AE5FE72225755269D +A2A5C843B134E7602AAC47A5BC6881C111F4895CB6314F12AE0051B426FE1F4B +2F6916CC6645CE8E4A636BCDED8F542679842582DAA3C10E7FE83018C84BF6CE +7728F9FF32D39397C4B73BBD6EE5D9D13BAD2BE727A5FB89654767010A8E6380 +959601231774B9371798797E1AE5AEEB8EABC2BC9033BFA440A6895E090321BB +2B02349DE3178B6A6EF649644C6DD4B5942881F6A35FA2D71081028F1D504AAB +123ADBA4F0A59E8CAE2565A62E21C13464FCBB0DE37957F3EC66332DFB2BF4BF +943BD3280E406863C8BE266023959B99C969C2C2423C9F7D814B82D56635761D +3E026A163E3BB32C0A97505B9A87CDF5D08EE112C00BE377E170618E59897378 +A2026BC33EEEAF1F902194F17837E6D14273C1B23A97D080C26419F5E68F8378 +BA223CC1B29A0E488F21C47462EE2ECCEDDC58D4D6229CBFD7999F8552B21B07 +26592F5D4BCE67F427F54DF72C87DADEB1EAD4684319EA39BDECB65EFD9C67C5 +EFFC1C9171B05354BC769B4E0609E10884735700D01D3421295D75D4DE190D83 +90BC3F9EE03E97BF8FD273B50D3185BEF5B0EB32506F51335D8D555872182830 +1213403560F935CBF17B30B53A5B3F422F770CF3E0AA964B900635519F486A2D +41EC65C342EC235F9DAAB07AB10D7B0A15A231538FD107651A4964B913E77C8D +BF49CFDCF4CAAE0B2E3EE0EB06792C600811EE8890DFD01598B272FC8E6686C4 +FC425EE1519C372D02B0BBD58647D5E39E243AAF08D90F8092A424E2167F7BDD +45A95EA8E04E1B966429027E6467416C98C89F16F23EE1CD6D5DD6856927E845 +20FEA2128528DBF01966CC8DB433C9FE3E0E9EB13F23896F84E369A9AF0E80FE +D193C40C072D71D85045E7FEF3913094D71B84C8304154199B7FC2C7F278CCAD +899A3107F56687C26A9F60557ECB4791CA4CE7CB6D7F6422AA1EA6C67C2D57AD +2F09B3BEF09D36187650743D8A6A0FF16E88CE09728EC77EA0507EC8817AF105 +6399158B4C7AB6DDF3505A20880483579CCC027218CAC36E5AB7C4EF83743A03 +EC38E97E4C4FDF1B35D8548274DF1713E509BAD45BE78A49DC41D9341AE68D3F +D9C5720ADB1D7077223F85E73B7EA8A18EE0A44856906C89842A0E734EE7D3F7 +5C7E6FF3524DAD3EAB6060F37CA8DFDDAA9D7B248F3ED84D4AC20D3D7D23496C +61C7A315752E2906B0CFFD0E70D1328DFFC890CB6D77A9D8EF8C205E3E52613F +08845C54EB98AE98FA5B7099211542FA54CC5D6F75FE3DED541B7565C656126A +68CAD216C1A3FA9E8F72DEE7FA7C5AD5136044BB161023C701B55F483BC8155E +7DAD9D13C9ECB613CB6D2EE48C0FDAB9FD2610B7B32D13B27E023A5975C776DC +265DD695BED2DB7F63390B6E17810C6C84CC11748E49ECE00AB18896726E9C1C +2BE9ADFD635FFED6FD9E3A319DD43560DA9614F896D762062C1E29A8408B1642 +C5FF316F6F919335C06369D9C4A83EA7AF7C30BBF5126760647DD964516E1BA8 +E24EF01EB04F20764837F7F5A7FCCED77389848E276F71F05DF88C655AF17437 +774B95174BD8D8B77064B87B9FAAFC461331EF0558F3B48E2004C5541ADA5A99 +A8C27FD3A67B18E8EA02CB2C28ED4CA3ACE3F456B509590BFE9F74F73C5CF180 +4323C1255EC01A6D90C5F25804E066B4497843CE0954133D363BC2B224549568 +1660734AAF2F36F4310DF330BDFBBC7D8A49773481CB4C9E220D86F33A07253A +114D59D15851E63826920182939AC067D72A3AC13A279460F7C45AC519C8D413 +C8FEEF16ED896E8DAFC0AAFA8531324315A736793F0C6BEE37E9F856EA90375B +00BEEFD6FD020C5C867950B8EE72FB0313B52D405817C4DABA49C44687FE6C7F +8CB2D791B8268E8E6E84F7444A2D5611D96FE06C8D26A200EA644D7112BAAB4B +2113F0B88EAC26D30E928CE19F1C0540F0A0D1B86B610A34494231FF64939F1D +774BB1331A19BD8362EFDA7871B334F20E3421D7A36B38DE952F20E98D74028D +5D076873146910CE272F9C22072AC3FDD68B4FADD7EF802375FFD8493AA5C52B +54BD781D1B8252655F51942526D1415340CD45F9BF03ECB5F04B645879D617CA +62E9B669DF2B2D6601AEA8F4207C0A5C0037EE3803F809BB12AD45D4889CA54A +D60C06FA1577B206CADE0FF82A43D64F4640A98153E8518EDF8835116D21A87C +F2406FD91D70F27315FF9479BC139C41ECB02408417E82A50A7A369D739EE1E7 +92524E23CA98C9706FC6007C2602B526AD5D4999C58A45BFEBA601FDE6746BA9 +BD6911DFCDACA9CB5A7E98EC1CC3B5BEEA50D99C33A514BA7AE8760AC054EE49 +5AF381DF0DDE1407A875F507E0A251BBB4929F987DE13245A0694FE20A77FC44 +18854A70B761B234ED078EF1E01C4AF65B426D4B8B5D0B677BD02C178FD0D9D7 +3D637D18ED510C81DF887CFE1B5179168ADF2A9FC4BC2CA5704543DED74765DF +6980462F7ED8A555C59242F229689CE69CF6C02BEC7CAFD901DE76BAD3567349 +A91478177B804F1D1269E60D86154B7FDF152EF501961ABFF65752E91292B0D2 +1C16AD00A93162653338A34A851F64A843E265EBE373858298931361B79B6DA2 +DBD8BC513A6B2BB1EB207261B54047F34412C059DE05C6A2EA8971424BB0AA06 +84AD5E495A41CF9F11A844D22A805385B27FCD507DB9B5B9834EC15C047F462B +63B44D99D7CF3A744E6528D738A3D42AE696191B6B6EEC3389748058ABB8A3B0 +B161E749539CA01169A39B16101EE2EBAD18F62D7D936D2979BF49B92ED08268 +A774B4121EA592263B367F3FCB7B89B35F72DFC85F85193B8EF32EB07DF86FD3 +6E3E8DF750C199322010950F09F9A3626121DF00EEEFE761C19E05416AB28916 +49570B7B77705906630E72BD5C12C99B68C09C00C43837F4CFA8715EDB4128C5 +7267F3FF652C858E3D2A8349B332E3BC2BC3B2F82D4B05EC0E5520B2D7235105 +51EFA9BC01C096A492130ECBCF21389E5BF1D2DD2F51245E47CE04E684A0ECB5 +3C517EF74789773889DCF605DC459E9DB154C3E171E2CB28B171C8A251595F8C +89EDDE44A82C9F6349D51418DA47347DE4C2D8D58FE770574B409A4389293E60 +6E5AD82E2AF14DFF39A7332F5089FB957CAAAB4EE0DEC0C49E1F60CBAC617445 +F22E290834D513B248653D348E0F735BA046895452B2E091259E615C45FB18BE +B00B5B8DE4AA1AF2025EF1FFB46AF12DA219772D7FA2D2D9DA29860B5C0B5C0B +F87D104C167DCE484E1834CCAB2068722B51AA1C287DA9BB041C3FB12329422F +B3B4D3413946FC5686F9A3C028F23305DAAE24901649B535D3A1D24A140CC6F1 +A098963ECC6D302BA9501B4D9CD0AC35D30B33051B190691253C7C82C43ACDD1 +9CC5A439590BBB934FB917A135EAD27EE431A2CCD999062AA58D70289E60C04C +99083B7F7CEE37370AE49C85342882348661B1344790E6B15A26DE133342AE03 +140C5A9D17C96AFEA55747425D19AF523A42AF250FA448CD3E1ABC318A95269F +07F72C14C466E0D2A1EA73262FCDDC95BF64E1904CB1DBCF751C748AE8BF7332 +F99ED128E60D4562A163FEA253F955CF0E61020B03AABCADF923972C8696B9E5 +5965A516773909AE218CE76507E734E5DCCD2CDE4478D956319FD66AEC8C15BC +E421B166D663A1D143DCC8FAFD843D60DFF89D32D9D4AB29061C3E8E7E1FD89E +065EC49781D209B5619ECC2C0A9B0F155E56DB3DBA50B847B0CA06587B4AEA20 +DF3F6E220EA5843DFC65600398989EAD4F6632B923C583D0FD4D57E9723D42D6 +420D9189DF6064E2F7CD8FF0AA59375DC4E1395787AF03FCFFD59FDFCEF452FF +43E28A9490EF824BF80D471F2C5093885AA41DC863EF777730D074559739BB43 +EB84C8CED352384410B018842B453599909EE6CEAE259C96685BB1E5C08B7968 +82A00BCB0C6BFD57170F1DA7EF8FD41097C8BFE09AC3EEF9FBDD8DCC52E71157 +7B3996B93612F4B65FE0B7CEDB5F9EE91E77D7AAA3A3C8E6DFE4AEE3BAD2BA65 +A3786CF3EC4A3DBEA0BFDE3ABA62DE428E032B3B7471BD6CADFA8189FC2D52F9 +21628DE7E96AD5AB9F57ACC77F9B73A9F762E8D1E492BF92D42CFD210F7B3F04 +691F02C13AEDF69B0DDBDC417B3A12B292A8B41CB22D53AC02189DCD5D7142DE +CB7568FD3584F6E1F134FE9251056E4B8FFCF06856B9E30DA50EAE765348F39E +4F6EE206B73B4F399244AD997F7AE0867C78126F070E000859364B690E72D492 +CE00035F9F8341C61F220F27A29F73776F542C939445405CC670AD753248343E +12AE1A2016E87A8861F05B7ED2FF65AB2E823C8D8FCBB3B65E0E24864D97B79F +A94B489CB32EA91176D5C3D170F7DEAC36317AF5800B5BB0DE38D38FBDD75D71 +B2C45D2AEF29EE2F1F55E2C7BCBBEF114F801A4A8F340E3159EF67CF966520C2 +6FCDD2316112BA45E96544A86D3BA064E674ECF9FC71CEBEC0678A85B1229CEA +6A174D115B6E834F74DC0E21BB0FE151482CED2A5E037ACD1262AA3979FA4604 +CF5C2E68C657967B3CDCA1AD9F7AF8E839639320D24FE4C8FF25F4F8CD459967 +E154862952058FE33E16357E2C204297AC81488E33B76DF2D4F93B1FB8CAB223 +B998577B7FC6C8B4AD8B5321AECCA360E98D2E163C3E4DBB01B7F8E02B413A50 +2EC8D14480849B85FC391009C961E2CBB0820A2DDEE153A29B727A4547EF7A4D +40310A9CF65D49D68860D5161A5F4F32A746F8A4FAC234EC6C515608012D6AD8 +812279D4364864582CB04D0DB04D7B80F2B43ED41B46DDAD763AFCAD08B10DA7 +4A1BB1280D22A2E538FC8C764AF934494FE22AEBE6845D20A626BC4F9B0F93A1 +BF02AAC68090AEF9462D1E1517B0898B7607FA866104A60B652A7A2CFB9D4626 +1108C550D6BDA61800E63BA5EC8E7035F1D1CD66402686B231AA87C0B54399F4 +A67BE1C656004E34D74031C046CB57B35F3C32AAC4CB9F7757CB35C6C7204960 +975430B63BA2DD5B951EFED5A1DD645BA4BDBA778FD5231807A42E505D73277A +7C0877821D82F14E064A16474B1D21914EFCF4CBB9A1F4B34E58E98334A0B732 +430CEAA87636705F6CB0AC748AC6EF54CB42C31BC2E9D8458D467E13A6BE6F6B +F37777185D70689D4AA63590FE4CDD91031F647CED0B09FAA741FD90D7C82A8D +5CC25897C73BFFA5D1BF67D768563A3627389FE841D286681FD2B507AF80B948 +1FA3F25EFF61C42E1E59FDA3C6A0F5BAD5C23F2470695660BF2D218F3EAB741A +C0E0326D88691A2BE6715A739DAA2F410F51C9FFF10FA140F18DF3BBEEBAF0DB +0BDFF699A8FB134DCD17E9E9B60AB3A7B58FD570957DEFD4854C2463A823B795 +2BEBDD075982332BE20C7755907C977C9B5C1E50D824748643748BB8B03EE518 +1DE1AF9DD73D9D40B855C8FF3501092E810A47FC25110B1B8B2DA25D6CDF034D +1EF0628227C433E48BD5FC7066D091238228AA83342B306C3691BFD16F2A89AD +9195347B3E5F51F07665D634933A348656C5C563E7843EA3EB7B6897A722BFD1 +14EA5CCFF297471F14486BEB20C5B086FBBC3839EA6929F640A249CB4A1AB38C +45E76617102B4AC6C0A60701EA17B23C5452C03BC49B03592D9C389B41489B10 +A0956B893D7402EEC055A93CD60B0A91B369022281D996ABB7F9530F520A8439 +C76F2A1BE71639DEC7545C8E37C75D43B35E7BA53D52736A5D5B6231D795D8B0 +66A9A7E2F296CDE2E11A95C7BCA510FE3F3DA0B8F4F312C5D50549DCA50CDD19 +B6ED0F3D9B9266706A430EE505535217D0F4C19736A235BD242B044706B17831 +A4E8A51490796F045104BAFAC97ED33961535B48FE7642FC3A05DBD1196112B5 +00EBA4C56C3E0311E4104E50BDFAF7C98B8FE0BB6EBFAB065CBDF71CB3507ED7 +44AB743713804C00A5CD6B1DF6F3AC3E971937087C9E1B82EFDFCB905ED833E2 +A2ECC8E08775EB081C5D16C3B5CC5B25312AA0680FDB74F95B5B98A56D34DCF2 +7B04A3DACB5DAA21E17F8C13F2B358901AB91C13EA4EFC19EE44A06C38AE7091 +7C1EDB90B538E092A4B41F1308E6DE5769FCE25E6B9FFCE0426119D868C3B814 +3484F31941231BD94FEF454F62A56D08F5D319303B2A612AD68032FE7596CFB6 +916B5BCA3EEF33966B845F3F2D5F0BF6832DB5073FE3808BA5F1D9812091E226 +FC2F3F7F56DBD04BA14D06B1E3C77B7A1F9D9B3E81FE843AA08C650A5A7EA77C +D9DDFFDFD4D0992A32915E8F162D52127248889882AAB06495D56780BA3CB143 +0A7D0D416A8B8B408E9C93EBEB2AD23FA486CAA8AF348755111532CBBA15DB40 +02E102A3D1E979190F4506447BB063CCD7862C3E842E42C3FAC628A8D283B193 +DCF1B4B5E5F9A8FE229970123CD899ECE471C1AE20CAE796D638F38180493347 +C06E62879492306E400F6643D5E4C05846342436B01287D915CFEC221881B6AB +135B07C2066C33BB01AA8F6FA3E08747D5705F44C1367BA01BF0882B4128F5D5 +B3D3DEB47BB78E6FA654E56E66BB882EA194DC224F5F156A9AF7B30EA87FB116 +D6806A6A302012E9927D05D4F72E49DF7FCD76D26565DE03B0A2353467BD1E11 +0749F05760AF2FFBC3471E37DC0777E349A5D843B6B2979DC8F9C069A48D7506 +16502F58D9152C391ACBADF638ADB08809F71C647A6C3A2C8326E014215F0288 +D98C51D5875E0EC2C7784FC48B3D5BB5FEAFBF4D6099B903C034300AE4D78E64 +A2ED79053D3E95F08F5FB761C494ECD5E2EC943D8F38086F2D16DD9736D3DB93 +E4EF811A1506AE38F13A9BF5FCEE9F240C9FB139638305C0CDA53F3C42D98A89 +A0EC3B17FDA0FCD8AA28E1555736755EC5B9667E69B1F493CB5130C82B70E70E +DE8B948F17B04E6B860D2C2744B29F6053F0E938E23CD2CB3049CE97430D6F77 +2C918E7CC58237CDC43B5B4BB714CCEA475DF58E87520EF3072AC90FC2A4E310 +C7D5F6AA831D3804E44237E08C318286A4947E603765E7D1E32F584F943BE06E +64726A02131E416B04F0D33E0825F0FBC6D7B1A5BD6D2916D098A0F977D29ECD +B2A6296FA4C182C24FA4356488E81E4144A5A1D40ED97BDE6235BAB6F3CC1318 +36B9B94DFD0C47C3341CD622F4F4DBF5EE98EB43BF107D59C005745FBAC7CF34 +8442F5A76B632CBBBC1CBCEF59B5B99C0F3981378DEC3289211094A4F4D3FA0D +EEE94BDD5707EF4A94776766C76C85E9D984422D4282002D9CCC760339219864 +BCC23DD9E624B3360CA714A9B7270AC4A6F7CDA7BAC441C684D29D29DCB8A761 +634AC269C6809F99B73534AD2BA27210107E49F65DBBCF22E31F828FB0194BCD +5D4FECE626925475B43DE7B346AF10893DCDCD9C13DC9111506FB5E8B41A69EE +3BE7815105A6FEB8DA8C6D7BE2ECD49B7F315C66D212C4400AD81426EEE1C5F0 +193CE191E871D4F9F578518E372033B8121869EE7F874F3513BF81D28B7D660B +B1C59B638E677ACB4CAF561EEE077ADB0CF64E8CEA0930FB294E031C0BA973C6 +903DDF3F33D4E18D0C55CD89FC109E72AE5CBC86C37EF512966DAD266676F8F2 +6198752E232C6F3241BAC082DA14A68FC89CCA1C3C0422D19BD2054D3B91E60F +51AB90BF2317562A4ABCE1C96165F1DDAAFE73BDFF939C327550BBBB5B0FF5A7 +3EED7D777E48E7D337FEC7836A7757343A3C3781E99179C654345940CD55BCC3 +681906BD573C7A47ABC7E334899CFA8090CFF0104B88F74107027CD6412C6183 +2AF6851F048280DDF8BE1A2DA8DBC1F7634ED64C3EF0F1A94E27BB3A3E137BC6 +F4211E62F774070DDD96156815653BDE961D5303A16F67AC4AA7E66477973A84 +C6AED52AB10A57E95DAD8F212E5E25BBF0B45CF4721450894F67A01FBCB498FF +BA5AD16FB1521E3FFEB53E8FE8B2174C76B780DF8D0B1B8B9B3EC6FA9B6AABA4 +8530493A92A904030845A5158D6B3A8247773BF93CE1D59D793575EB912FF49C +13E0FB588DD61D093D3E50EE934563FF44E26728406864C4C955E58756D217A4 +B9506576819E76B74493C7D5EF4448673504D81E0CB23F039BA9F048073C5FA0 +3A47C5B314F1AECE21F8EB9D77BD9DBE49A2B505DDA54C1B787FCC1B302DC9AD +3DC9A2822107BB6023F259B3D44F1269EA5A57C457DBAB824EA2F93B046B797E +4C82F7EBBF47A4E69072D735955576F17F7D3B5AEC2A420C347CED162D7C734F +3B0FA59774B5266387C5CECC7B5D856059C195869ED7C0CCB66DD20E8F70E875 +BF607899DFE6E1A2858380317E49BFCC0F331A75B12D646CFEDAA09CC28EA30E +1BB70F720539A60C9348366D9EA597EC52DC4169A8505565FFFAD2D372FA6F3D +CCFFB10831010C190EF3248898750D45BEFB7B444727F6B45B61F1D10BCCF6AE +6190105A1B427D3754DD9A4B42BA65F82A85D0A0739693F52B01B7D1FDDF38CC +5FD09CC00C42529D96579810BF9E5B6ADBB96B8C907E29D662530E2D67BA8924 +C68204FEAF80B1252084E657C7E7C836C65CDDB909B91B9E52E33FD14670C6C2 +B6316D2BF298DA1BF4E6BA9BC2D50ECBAEC0B15FEA65ADA070DA8FCFF3F7C329 +8CBC3B100307FBCE9EBD2105B663A86AC14CA64DD7DF46240F597C693E0E79AD +C2C6B46AB8966B0500F46167C881A88B9F8943CED18762CE708D053EFF9A1837 +8A542C548ECA7FD8266AF696DBE4823DE65A7381EDB5CEB5338027881A29A340 +2C655936D1FACFBDE4792101E1A2F758CC2DA582DB3E8520AB299EAB77CC0E5B +5A3F84F0FFFBE93A35D8D903C14D0CDFD9D592AD188FCA5ED5CC7C9F5A94929B +50CA7CA7EA2B3ADE408FD05AEB7BF322A694DA53831DDAF8299196822D2FC0A6 +91B95D4A3D9C46C36DF6E80B80D6C2982B73DA7D790477083E312EAD31D59AB7 +D172BD52AC99925EE781493D6DF86F174BB6BCB1A79559AB6BBF6B6ED1A3A85D +53BFCB6E7BC7BCE12042DF6071575DFB96CA21FE03C3A9C7BF9B6D48FFBF59BB +83286F95D40151BAB0A20EDFE224BE0915ECBC400A0F11E9B7C1BC22C71EAAAE +962B4E1BB8AF0E7365683A89BFE403880621422684A8A5CC63F6243DC4A1BE18 +E59F1184C6B8BC943282FC3EB1B099A47B3A8F5862F1B159DDFA05A046DD4311 +276D76A13E9E308C28C19A9BF5D6F4DF18DA369A8E9B18A32CF3838B641D8A73 +2421B397BBBF80BF80A197353D0CDFDF324FC2E34143D2C1D5EB6F91DE906A26 +0D11990A96F29B7F3C7735D5F8B9433AF21E8D84C5D7593FDDCABFC6D024640E +8CC8A1B3F9B05E68797064D6F9D163246E6BA5A5198170406640001BE0C441F6 +656F6A2FC0EBF17E7324FE428EA430B6885A8F100D6C1EA6EA3BBC865DC7DAA4 +FD9FB6B6EFBDC86FCDA11FA62C2E76826BBF896846B90F99F58B3AF125F9DC42 +A7036347DECF0693A058EF45535278B7FB440A07E32DA0C52A0C8F2E8EDDDB88 +E6E97458F2FAC03A7D01873E37B3DE6E6A1125AC5BEF387EC2E9BE91246C530D +E52F13CBF94C67FCFE5DE8E0CDF959ED6CF65F327C08A915572FCBB9AB6A732B +289E2CC770A642021106AE8103B28A45FA062E84F1395D51EEFED2D0C2143DC9 +939EB6D57233AA4AE24B347373FF4C285749DC66FC225FBDB3AAF247AD1AED2A +02CCA1391191DA629B0CCAC3EE434B12ED69DCB05A96ABF32A44BE6C9CEA1FBA +CEF2FBCD765BAD4C53929015D381B8562E91AAB72EEEBC4E741353964D003DAC +FDA6F739D211209B40776889B8F208336F24FC402F27A8AAD6C45A5182B1FECC +EE2BADFDF613DB925307006771088CCEBAF0805924FB298BFA9A5AF06D28D347 +8181EF23DE09F8D8E1C8023988F957A740E5A7586C7DF06995D9820F82A8B44A +B8D484561A558B896AF8B5D8C3FADE04B2D6D8D11467CCD869B9C6E8EEF793C2 +0529818E6742AD8B226374B4FE146219BEFD5A13E0C7F1A461A8123CFFE79166 +2EE95CBD7F0B29918DAE04E030A1BFFE6BAC8F5F0C3B9407C4B611CDEFFC9E01 +3BF0B6F50922900C431A0AFB51B32F6A2B814E03A17EDE45B3E33A0E1C2FAD2E +68AE579E8F303E755C62DDC7E417094DA352935AEADD188273BD46E6A9A94CBD +9C522A4197A0B9C40C79CA656396231D9C609C864A21B1697CE532436B6BCA1A +B9370F172FAD0E997286D2806B3521E09E19D9F76311D65FEF941B0DCA969D26 +FF2F6F4E83D52D765D218DEF920D27BB21E270E2E7F31EC1849F641AF0B9FB60 +EBD6794F1023A7676A53E67295D46A75DDF7C240AA05730B045E1587CFBEB501 +BB9C9BBCB8C94A1061013CBAD5ED3F02D180C7886D926181B2E1DC9F3C8E8B6E +FE48EF896AFBEE109300C692D2F94C8A140DB6378D6F294025AACC2E95E9907F +F0AB63D937C1DD9EF1B4CA496E3FE4F329F246A93628923F122C2C7AD0DF86B8 +53653F52D36AA1F67091296FA55B978990565F63B92E7BF7B4B3D043D7F79789 +71CA93A7146A4C5CA9653C92B172FC275F332B07260A573F843B0BB83CC5E5CE +EBA290AE6C7B43F3E5CB10BD84D558D2A5B6ACF1A0974EF20FCC824F5B92746B +D2A517006E707EB44899D4407FDB912BE5F4AF3C4796438331EEA2B09ADDCC96 +F798BCB7749E54F578CF703EB0AD086A6A98E4EDE1118EC76338E3B76A28306E +B1C400DB863A2282988DAD49F337A5BFAE7BBF6E06553DB67F34B3BC115C63BD +5ADE29D5E6770BF0A1CDCDD0637B9F877BD2BB6363062B2D6A01BAED65D5859E +16CE1A4EB86B9998D5D28213EC0E5CB2A297F24250433D61937B607C289DC54D +E9F7FF54BA94E40865A70273C4915BC17D6D934D275BEBDA3BE285E12CEB17B0 +75F6C87759B2E2E47DB0F4A5BA9CDC8673EABBDEFDD2EB781D9121276371656F +795F9BE5528E2F56D7BED80C679F996957AD3606C0B1E1050FF62F6CC35BAFEE +3CDE09668AB4C5F58DD7B68352CACCA2D7CBC3DBBA2B1EC9ABD1AD16A21AD93E +50DA4ABBA9EB945A93CF1C5BAB83C1BC0A1FD2084A42D892B2FD7A9D390CB09E +96610AFC7181DB4D25EDC34FAE3B0A8B54D32AFDCCEA649800DCD263730C2C7B +79EB5117277BA48A4A00806D704C58BE4679C71ED74DD4896A95248B99AC3192 +D01920DA9D284B03D8535DEC11F1A7EEBAB5A209458F0752746E1E80F1096EA9 +B72054460C14CD2DF069CFA77E7A70A366BD3A72CD81F4FC844A386631F2A661 +6C72BD35E2F5568453C1D67287EB4D1F088CE9167B2A9698507CFB51319EB6C5 +2D597A548460FBF527F53D1E43BE94B343F5EE15365D7435EFFBD0FF54D5E9DD +04915AAB6426DE0C749A0221FB8E8BD679B93519B817938F6C92392F89446228 +57F2C33C867E0AD824B78A81EDF0FBA93F89DFF8A8A832603E6CCC5570EF6150 +B4AC37603D0126D485BEF2C6AB59CED890BDE0B6FEEE1E3DF069B7E62139AD5E +85AF3BAE0A35F6F428E02FB819EAB7E07DCEEF52A2DC7AFF5BE9C5440EF61C49 +DCE3422CEFCF26721D73F0BB1D07C4F8D74494B399769273C8F3F8E8CFB811BF +5C52C3B3006963ACF2CF0A240F93D54A62DCC8BBCCB2D9FCD29A2CC515A5C668 +9CC2BF03AE1BDCED18E564CE28BC424D8905F2A495BC2264B19B36CFB9606837 +D5648832EB6D7A3806FEFEBCB37232619AA722D47DD4C182E3496F5FDA769E77 +21F50C61BB6D7EA38412C02767010CB9DDC6DF5403EC5883C345BF6B0E49505D +C74B68373429C894CC8051B9041EA12026C99F162CB5E817DE3DBF79FAA17FE7 +60E803A56FB1B25E425D589F421857C40AC0DB303AF7EA5948986EA9886DDF3A +2EF39DE46E24A789CDAE1292D8DCB35FF1457AF0F8EDD204EE66681FD2E0C120 +566AB747A050363BD7F16A94438FA75B4EEC2B4B7BB6E5F37339398F57767DAB +E217F5FB234595BA5858295B3C17B29EC35C5A9B944C9BBBFD3A1754C95166EE +1CE61F4125D776618CF5F28929D708A1193944992FE9BD0084CB83D7CEC379F2 +35774CFBA88FA0460668292E55B932B806127E9953A21234F3DC2ED273715546 +478B16A332DBA4E9FD4F995BACFE211FFB648572B4628E6683BB1FCA63227184 +6C1E7B0EEC7DBC12D2EC7D3FDE590A0B1925C581AC460F873C2A698E4F95DAE5 +D52A2872D795687D3588DBA4CFB7D9CFF2CDAC190BB7B14C25A05852B03700CC +03BBD5D3EB8108760D942FCF0816C642D0C11471864228D073DC6499E9B6EB9D +8BED6D54FA3EEE8F83D47440F6004A62491027338203F8B8FDE5250BAECF0F88 +CBD9903DD0FCAE0C2FA3848E1FE0BED94BBC52D740C530570142D6849BC55957 +DDFEA6A33695FC5EE51D31582F8D65FB1A5006F87E3C92850815411F9A5BF768 +E78B7CDC680787CA9A418C56B5B51442F3084C1EEFB6F4C1F9584C9ED5FAD5C7 +8C7748480224A4B2F2EAD2D64F6AC26EFACAF1C50D2A052328A56DF2D3522960 +4EDF824D7F9E86318959459EE2501B4D395198562E5C9D53C6FA0F8FE9FF0363 +82197B9B30D56A80A999AA522C1502D2FE6D5DF512704B7FDCB041FEF68C8D9C +B9CEB47B15F8D7B74CF7D2CF328B4F02AFEF1A2EF6BC1A3FCF1677944562C497 +46A10E744D45E0DA7A434CE2611EEC8056D331BA0C1E76ABDFBA1AF15CEE01EC +5D43BE452C090D8BCE86A02B03C9D28F7053523608FB56C7F3C865843B0F301B +2962F17E44EA805DD18DFF5D7B323E733D2F0D47476E0C701CC6CEB3D68E6D73 +4FED816BD6BC3CDFABAD659F39098034A97388B778FD29ECEBAE6E46F944DD3F +F4A5EE2737FF5EF2FC6BFC7AC13FCA18F0534A61F2BCB07FE1F3FF2C0A708F1D +5B478E0BD6E28B98EE9AED665B84AEA01E611D2A9C5CF678130C24E86A8ED000 +BD2B002F06420429DCFB092921512AF879FA9D9EEDC6FB1E83464A48D894AF35 +69968A886433EB620A3B2FE1A2EB577B19384D8503DE590B9389F70A0DDDCCC1 +8AB02CA3B5D0822BB6410F69A35C9159CA848B0F2AC5A3F34531E69AC0CB2EC8 +ABC182E05BBF7E1E3EF0AD8C91BA89FD8D8033071B7FEEB1EE932466A7A03547 +31D03B38DABCFD83F4E6FB7C7698FB11892E86B14542F8CFCBDBBE8231BD83A8 +5D9148E6B2C41D20CBF50ECE4290F33CD551E92A28F7BBC7E2D1B4EB303A4AEA +41D682037B8A1EE6A8146C81FDC857AC9993DAB7E438328EA8CC01B6818CFA4B +24AB35E0A6C4BB1A4AB166064B195F7F92A8461F982F6EC9595B7A1E36E72465 +04D6DA6A97A9168EF5A252A1C1E5CD9E9810299A105F59789304AADE75A4115C +EB2201197CD87FC59E5A601C9B66B816FCDC2B23A062A8EA5693289B5256E9B4 +CDC042F366E3DE8511176D560764E0F92BC5E9A1BA1151A64649FBE4C3CCE03C +0A427E27ABA7AAAC6EE305FB1C1DD6983F026C64CDEE06F57A000682F880283B +AC0F18194953E96429BF6A59999DA5DF128503AAD963F49F61BD14CC82266A77 +A20B25BE10094D9D91B3E149B523B1A503BAB5B4AE619552895B8C632411F496 +865455FA98AD63A7F5CE08D08C212CAC5185AAEAB87823282A500A1B0530D618 +BEE058F8D4ED61BAB4CF56CBE19E66CC0D2F0C5E96DF2B23E1E750F050162EDD +5FF3EA8B4A853C5E74BFC67C3B37E44E5CA5188745E5D18D23245450EED4DE2E +2166A9C74A595E6C7AFED61479929F9860597BC486BAD3557C8A59AD38B1FC17 +59A70D61226D0E83F416F982CA5F8E7AC98D35D4401DD35A288095C220AA2EED +4662643FAA021E474FC11C0A9601C8CB1B597AB9BDBFBDA9AD2FAD662A8CE14A +89481D11C0814475C6972EBD78031F2BBB3A96A3C8436FC7E11A3C35654A914D +E7C83F8B0521B3BFC4A98C87640FC8050A95CC740E01D8769541956D2C91FB4E +3E4F5A45F76183A847F202D7B63478358CBAF452CF47F0CC26F82893300D0F87 +A8C0FF3E1505943ABE4C725516F1E52B47EA3232D3EFD5EC0D5FD06DBCEA8585 +5179CE8810B64978B9353C1AC8739B86CAC020DB9326BF917E63E1B4C9BB41C1 +5C165DBF5BB76E2F2E192874159CC287678C20B8BFAFEB61F621CB8185DEA0DD +C45593CD896AB1E3BBE85A0D0957DF2E49E5BB066C6358FE7DD15D861E031777 +D5AB5336D9026AC2C8C3D041B6025E93E60921508C435699ED0AA29C5443FCB3 +63431F6A0341F4157B1DB8A2199C692E6ED6D3964F552BFAF7A4AF424F1A0F11 +5280159EAD178138A1076F51F7EC5C35E318F9B5789EC2EDB7C788D0A6DC9D2F +4AD61CBC193222A76928509CB73986E377123B4ECC99CA12B6B627F3BBA93276 +C553B701C5F879E4B38568A77012B44AD4514EC0D7603E742C842D329B629B79 +BF38C72A3F14BD08CADFC25D7908E0B1D83715A44AD81368629E51CC75586357 +9B702B7761839FE17D47C63ACC701B266AC345F1AC15F3C30F0F5322E9310054 +EEE5C861E0071CF161E47CE6155A1BDB6D938996F3EB83BA923950FC90FBA41C +9248A881226BA32174F85B488F3E710BB7D2376E371D23BE051EB54E15E22796 +675FF7A2BD540B119C78790E0B8C61FFE7E74E2B18FA0D5A7BAA2BBBE9B969F5 +C0D465E11D8F6CFCD8A4ECD536A7F477C86CE7D6561F3C17C4F70D1F7FF4A66C +E315BB44D8832F9AA0B35974C9B0B741E96B8404DD9C835A476239135463C9D6 +09ACADC65D032E88A9C0FBA78C6FE4F625DF242383FF689322796F9003B66D13 +B9545377F48AC0EEBB187564E66F2A56C04F8B3093B5DED8AD536499A921A231 +765CB71B84DE828F905EB87E3A2B86DA1508A18788825CA0FFC5E1473015686E +A24B2CE92F10A199A71FBFD56110E7FE7B4AC102AE7A03E65E8CDA68489ECD60 +E8251072A2B61EF9523BDA385E64EF7DC05DD37730B7BD4685755C58391EBB3C +91D2E04C0840C80FB77B71B8E28F43BE6C7F54CD3A87EE5F07820F927EAA1BC8 +0BC5C897B56B83906F35857C0528044D4CDFE72EF613BD27EC286CA90883F5EA +B50FEBCC77961B3B7B2A3C95127A697A1BBDE0AD2E485967DA824E46E982E143 +A514888D5FB0DDD91E7D216F6B3D8A92ECBA09B2F1493F520D32B16561603F59 +2A3D4F272BD7E802A871A190944C9329D2FA05F16C278D071B00CB25F3F5005F +053683F8213CAC1AFA299BEE16F2BEA5F9EB512D60295D216F39AC080B2523B5 +2CABB71A1384F1A5915C255464AA7CFD008CDC47DC9A6DA83B65B6A5D121763D +61EDEB73F5D1C7556C66D26DF92F853A665AAC14D074EE1F889A0C21348151E9 +231CC55FAAC46E267C623FB80A647FB7C8EA853B1380C623FCCE40225793D949 +49C0434E4604E86F46686EB9B95C5AB739547AB0238B4AE798AADF5D07B37126 +5858C1EAF561017BD4ADFDCF3BB5ED00381BF1638ED5241D6CCC706667E6A00B +B656856EAF809EFFD856BD53A3FC2710DFB05A0E174AE941A8D60AE698C7DE72 +DC63147A6E9968E8F58357C12FDFE37E3294D210019B402A4C37F21CFEB68ABC +E68D16E0E69BBB3BD3385969AEB2E4E16651659D31BB700A4D19CCB5CFE85E84 +64422D11C64113BD309CF149252FD5C0128AD0E70102B3CEAF21792699B4CEFD +14B8219983F1E03F2139256FE52D837E8CA3A010B683D72D041D8055BCEB3942 +8E26C359BAE9B98B98CE6661F9F03EAC9930F8F26CBD4D35DBF12A828EECD77F +66A2AF677147351D8EE322C049040C5C7CAFCC4374FBE8A8DF601C79830FE6CE +2BCE4A1988C1DC1C063CA77CBCF6DEB93F01516AADB40629040B2BB9762239C9 +BDC49BB22D7DF3E3764CFB26F6AB4E32F60367C229B6ED37B3B69D7DC77CB752 +58B17DACA68EFBF15219F8644A06E87806CA9F98C44707F6CB21E91E1342E3BD +7B2659D95B6273AC59078BE16CBE957D9D6B9C24CA9FE2C3BCFEB0A27034624C +02BA674381EA0C652B6128DCCADCE4EB7069C9E67E96EA3A803F2D0392FD6914 +EA87C90AB51314E25C0CA722D9EEB6063AF0484DD6789D8A6FB1FB6021FFE6D1 +A4F5E64D3D944B44CDEE76F449E3A19ED9DD908F4FF6C1FDEE709526E492876E +68ED03B7D07186AD57D5A39F79D56443236DCA1204B7FCB3C57D0D20070F359C +F4CE4EC541CDBC9C3B3467CE5412371FEF041C5E2F3B0B5C2D020815ABFC26A0 +C2E9389C2B8B44D4C628E69C07712659B261BBE1CC681884F88ADFB3D44AD4B5 +F4CF7CEB5584EE640ABCFC226BAC4DBB478927FA2AC5C2968E4838C380D8B7FD +054DF20862804848359518F189C62752C284867B8CF9A04E332FE1E3FC91864C +76CA71B1FDC80B13654C7D19B68AC039590937B75EDD0863B62D7D8D123277CD +4C97B1366422359DAD7155A816F0E9001DF0D1970A345E4AFAF3DEF28F81C7CE +868ABB2CE5B2C145266A71E05DFC1FF79005D9116AFCF4F4C0ADCBE7B9600E2C +295EAE977AF481DD81D185FE4A9533DEAFB4A95A91F32A00DDD4807D31B834FD +B1CFE04F46368E939AC6F1CEF3472F2207135CC700F053F52407BA73E7987406 +E615265C624084368AC04A3666B290599F630C25FEAACFB0F42585F644631448 +79A839A9E8FDAAADD135345A7A69EBF2BBE571DCBF16D6E47BCF65059F71742C +75D10900D875F2EFD9CB7A1905B63FA05DA0A0413009976A176B83B4A62D2E21 +0D86ADD86C4E2EC9ACCEAF1C5A0A19A1330CAAF6C223359A96DECB2F7CE50870 +647BACD3241D90E8850AB5E8EEB3DF8F9AA8DDD65CE046B7E8B29C3931350463 +A715A39482E550A7FC99F4F24560FA1B99B62FE4DB22DA4D3AC30955E2CC042A +8F6E3447357622CAC0C961FC4C5EE16CB6BA958EDF66974AA94FE167DE4AEF55 +A59BC805AF7C6F00B8E6A81CC4820762C25577BEDBC24BFC65317D3F95871963 +B1AF96D90E6731FECEAC86368488B4F08FC7A9B4C23D2D9E96FE4DF19825DEA3 +6D9FA6F70A097E55AAC73D3778671B1442F9F81BD8DF5B80344D2F92CEA557D8 +28C5BCEFE5857B9B3A73351B4CA89C172C881B9BA568E9EF1E008A407D9960BC +8056D9BD08BB53DAF2A577EA903F7E07B8E66FA81D37BA9D9967D43D7D411072 +462370676C259CD1C6C99D42170157A5D739CA097F1BAB77D25B11F63BB897C9 +EDD1A897380917EB694B9A9EDDC1BF72DEAD17BBC01475D090685BBE646F5F9F +048EF97BE579CBDDED5ED2343563B24D73998833113FB4BF2780E6219B029041 +B7E508AACF2CF9F3B2D1C85290E5344B5C086678E5C8D33C99D2E13B40EAB5C6 +83C8213FF27BE85494CE767BADDD084CBD56E8CFE8EDC9DD3E22A625B14B1CFE +0F23E0A45165D0B1ECCDB980281D0C39759E46892734067CF3C136CB2985E870 +D3E696D2F3432C4AEDCF7F2C724CB25913949CC417135CE988774B7B21661B02 +BFB37039C04F20403C057EAC33C7AEDA89F66ED53ECEEDCAE68554BE213F01B2 +0FC9D1AC95EA7720921B514EF49F58BC4C8833E7B862DEF57C1F2C7B10FF89AD +4A78404133D02EC9B4C5D772149B516557A94C342BA907C3AE257B98A44A05EB +48496A46C8E86874E1A4B84EB034F4E23403D733E5481F0F235508CD13BF99D8 +BF26939A4CA00F13449A143109A2C0A24EC521CC6C8C79BEEE2D566B487B78D7 +F8B30CAC371067C70D71A0A93AFD0D6EE568C98AB4559E3976271E492C15C678 +F9AD0109EAF8778855213DFBBE42CA18A25AB94E1F4FB86AFECD6F1DBFC023E6 +F525D79A8CAE50A6507512690D2DADCDA47E5317899284C2D0B2E6FF8A211CA4 +7AB9CDE6DBE438C0F0C076CF9FAA7D28B2D46B24358762E9F6B850D6FE2B3878 +FB03C70BB29D852EFC0F928582A49094AE48CA7D0FA0B1D20DA43A9EAEBB4F9B +5043AD9355589F26202AC6C31EACF8C8C8F22F1C73B94C8F5DB698E081FD3BBB +717DA3E5B0CCA33FF975725075C1682F7A6822A9C68241AE8CC93E97C3170476 +B17BCDA45C98B306FEAB6BB8E97833E70C0B5B314518A0433DB6CDDEFFABB2B9 +A221CEE0AD8E101B9FC42700EE65922C82D1831E1747234EFAB63982D92235F6 +0C4DBA8901A60E1BE04516F3A682438E051743524DBFF410B6B784F740B8E0B3 +9CA6C7029DBAA0E681572624406F2331C30251990B7BFE9ADA2061E4BAD72678 +637F632290DC1D987F2D6301399BBF70ADD40456D212A0BCBEBF947FD0D26107 +01D1037BB5AF3A3119D6967592023D483D463EC7E4474E1925905C17E7F7CE62 +7693A52CC38DD1FCCE98B63554379C03E033768C861C4705416C5E583CF3554B +6BA4A6006C37BAA69FAE8E6858DB6E361DE2DAFADFF82EB8FF4C476C316B3500 +1E0BB925D21C33985F00223797F1B109253E41BBC99D9DE28B98301A77F2FED6 +1C09AB94F1A922492271878EE90437FBFD202AB6C3C8B6E66A80B862DDF9D1DF +CBF60DAA668F88A1A624B91FAA8BD574961A4EB0BEDD209376C4174C55681BE7 +D71C0AD813B995508530F30839DCCC26001243A76F96AEAB5E1B45A182D7D3FF +00124EA41F312422029232F71275F1D60FCFB1B6D26A5E09CE796D72791F3E71 +1B075D016C6A2C119FFBA95BE034EEF1EA78B5F520BCF583B284421CC65992B6 +F319DD039753EF833F450332B056A04A8B3356560C55438755D2842A27281C42 +EDED9E7F7FE3373F71E69DEAECC43A5F585D30F4C7DAF77FFFDDB558D6DA9233 +F8A7504E4B80DF76850BBC3B0174D1F45C3F70869957F82B0DC22D42426EDD7B +9943ED5A17BBFD3EAA7AC9349E6FF6DE3B7E88CE522A399556B1DDC660E89BB0 +07458D0D55A51EA83D00ECBEBF007D509D0F9DA7328821D981F854D9733BBFC7 +79DABAEB9B3CC3AC69AB9D187DBCD03AE29F2C43FA4A0C5A4924C6C0A8A1E7A2 +25682D001C1A3BDDDC1FC4385B9F217EBAFBA7746AF6CD52A5DD24980B8591E1 +827F57943538CF2ED56FD9D52C5766B5A3C25B36DE530F532A795A8E464FD9FD +BDB86793EB23221790692E8F6E4C4D5F88FA8C96C9AB9FCE3BAD899CAAFC0D2D +7305885730B68040CABC1DCC1528C2DDDB37B9C9681B7E021E3190F0AF480ED7 +84E624376C43AD688D8E0FE302A310D1CA0CA912941A52336F85F7429FFE4560 +E082A1A12B75FCE9F1AF0B4642F96BCE0E61EA6798E7F8D0F0F4D7CA90F757CC +3009A5D0897B22FCF894E3B0F1163BD490E8AFBD523F10696534A77BF17FB139 +909C1C7A69A48BCA3E8F2274F2C3063F1FDF0905BE8C162C7D790293DF5DBC9F +9CCF48F98817AA69E9E9BDE280283A137162ABC9B27B0163E67EF310B51B51AA +DF31943B3557785D5FFEAB1B34FC368409334D7DFA24CF85833783C7BA801BC8 +A95DFA28402DFADD12EB9D4B1F6C3041DA1C87563585D1BAD8AB65F0FCD4015E +D21569A0AB4FFDF3265E1BF3F7F1A43FB96CBF13B905CD46C3571EEB02A3190A +613B6FA912368F0099F30E8E64FE899411E4C072CB63E2C662AFB6A0EDC2F082 +1009F5681A23D7460BDA4ED4F9389A2FD7EF64DC2FA9B2807F2B307D44062371 +3AD4C8D327120BB9061BEC9A5834899896A9638D2F846ACA0462C9C8279E0AEC +9FF78C7D6BACBC7D6A15A0F3E48A7E1B43265201F1484ED27410A484B38D6465 +9B2A29BA97294CB5DDF0099DA4727B8527F454F37004BF9C4901A378E1A623D5 +33D9B460D8E182691B4D8334E836942B0D34AF6C992540B4E092E6A883337DEE +A359B9492BE06E8306ABCAB5686C26AA3C1FAD4B5A1313CD3C1B4D0EA2CE897A +E1DEF890B729BDA6DB9EB328D1E52B4F999A0FC3ADFB787EC38BF65A3FF04FF4 +5521A909DC11E204408FAB630386252D62CD3F09ACF2FDF1B29B40695F1836F4 +2ACCE65A6266A52353665E65CA65A9585701D3389D23299D61A687A6016C6DA4 +B7E24F5E9F570B480814923A33193261B00BE584F9A35B92BC799B0FA940F4D1 +5A61BAE6E7F6ECFFCEA868A6FCB4B40C0D7F0D43A42DB66A287D2BA92A6C9ABF +891528E30DEE34C8880AEAF2EAB4826A28E9F7097CC376579CDB7000111D2E9B +66AC6207D5DDD92096455E86DE62ECD4C6219401865F11B8A8EF73000B5D3B61 +0F89405A82ACD6A8D675C44920E281514D16C177882518FC4532B2AAD2865270 +B26D955148B48478631B7493D5D68B590DB12BC72EDCC64BA4FD2186787BC161 +CE587F9F3E96607541C180114B16D058ACC89B425DC8C20165B881368F0E5292 +F6DB2F8350080072E258EA2C5E85D6419A72BA782DC01791A4959F08B2D40057 +10711744CF043A4D5E3ED3FDFDB4A5ABE1D842097380AB8693DB90A0BE28DDDA +9C24F9446632F1CDAB75FC2A6234B15FC294D41ADD6C6E95B13FEDFD3BCEBD3E +7BDFBCAE303B6A8BA181EE4B4CFC4C20432C75CE5323525C671AD4042519537C +C934C699D9E00D605AA1F8A3635116C02BA07760B62DFD50D059CA88C69569E7 +194FC05579C53E8D8D9D3E9C0D43364C99401CA56A0E6DB8BE22D595E2D2D4E8 +6A251F9E9812DF3F355DBBFCA7519C53DD3C4B7501E11455E87D9BD6BD9B91A7 +50AB44142B0D01E7AE2548D0F544976E0172A97114927B0C4FBE9043575A730A +3F3FB0A81906945BBC36CFD6573044326EC43B5D42922956EFE60888332A3513 +0B690D4E024A9A12175E39D5E5955790B9E5AEF3451FD1992079290DE16E36E5 +E6C6347F3716CDBBE22D39605A27024E5D441C9EFD849B02A4E43E4DE5425CA9 +6B6BA2C8EF676016432D4AC709BB0452F072D6039F7E33C33B3E8E1ECE0FCEEE +2F6D083786DBF65E62D3A4D31C937351523E4851DAE2B60C7DC91194DDFBC13B +353710E9A471F2830667C837FF0C8119C143144FF8B392C2BEAD2EC5F7AF5EBD +DBEB4C36781BA28CA854128182F8D21760044B97439FFEF7C16A06778455687C +9DB73A44DEB241F1FD9A5F57CA2D810B0DC8D3E0B87C242B916F68DF74B6A46E +BA6622BDE90B6660AB6AEAFAD5D1EF04BE006193194A295B0CBE5C45750C5711 +A338631906FAF7A915B1FDB38BBDD3B4797B96EB4C816B7F13CB803E2B1DC5BC +ED66B603C68CC23E3125FFF102CA544EF9ACB8289C19DF24A9589147392767CE +F2D9B47CBEC2765B6D2E9C40B67534C01B94E07A6991813BA31018E86803440A +C9DB6FC5AC8B0A4C6DF96C7906DC4D3F51F99AB314959EB94E82A1A5B84DFEE4 +D10E438ACFDDAC92486835C46E120824D0B8ABB3224B94091845A22D15600F0E +5AB1B4C440529CF7957FD36BB2C7362251FE12FE59EE41F2FFA52236BB97DF53 +C29F81F4805992518E02D747E802D38B8E689BB503DE7928634D64352ABB3C68 +A073988A52DC63E1D606C18D68A95BB4F3D1D26799EA02101782CE1154478B36 +F4C0F4C72C032526C0F28B0D49ECA060A031D84EA9F5C58E38DD0E5C36F11BEC +C5D9DC341C9161F092C1602E2BA67C1BC76938569701CEB25780E1D346582C2E +716674ADD519D650E158B257D8212B9734BC1777032AA477429750BCA4776719 +82C313594CCA6F1EE1424082A43699F59ABED9D6416920DA4B69DB319E7CB0FE +73E46699B31917C1453FC158262344098378AC2534954D78EF9B6B73B659E07D +94B187D72A93EEADFEBDF1C7236BB2DD4CD70D79A97A92E0327177FE0A36AC5F +5F396F771608D2BB8D90A349833FF2DD24CC8A46E8EB6F36B31D3E51A060FFB8 +FF66AEA579648800CD0C8A9615C8E2D0550523343657D6D509BF7094065EB390 +5643EA96270B1EC6D338602D8C8C72FD323E97319E7E4CE802CCF245DF7B11D6 +917D32B6B7735C3EB089A1071FE012C72D4336EB2B68E2BA85677F919401E5CE +442F3CE48909B6AA122D9E16236284A571A5A3FA0923FAB58EC8DD172B2B29AF +5A5251BCD86FEB0EF87F77281F686C1A14C734F4E49C278CA38ED3A5C0342CAA +19CF6315677DCFF0FC76759A2E08DA2DCE2783D4B1B9284DB4F399A78715243A +2610A4B1D34E3A6D5B0C42D96F19C4392A63186D941FBEFE74A2F20FA4B5D998 +5ADC9CECB760FDF57BE53F057F726F164C9072BF499BDDA065979014B83E7A2D +DB24B70426BD9CA52768218CC89B3CBF387D550669FAE2FBEC1BA690D2D1D104 +F4363412050787C325B900B54483B7EE0B951626422963A54006802FFEC1649D +476A8C4521CA07C68EA0D74150B1840DE5B9A801E7DF3A8EBB194B11A72E8409 +2772084D0C37AA9A158AB21B49EDC3EF581CCE7AD4880F17897CD61511AFDBCC +8ECAE00DE43CF21A4C69194BBACFAD417C93A71A350CF087B77A96BD7EB9A198 +6B01A0929D968BFEA348475803690EC74ED1CA9032F4E201081FD85BBC6789FC +4466A642A99E8F2EF742E5DB88CB2C8E6B1F15A29A2D25FC3B579F6DF6713BD2 +B25CAB08F81350C31E7E0FCD7DB5B9CBF9EE07778AE32322F684834F2F223D56 +62491EC149964AD940491C1FB4A5BDE45B8A81FE990EC816F9C3BB17F1D5EEF1 +FBD54785D787F6544A2429D7468878F210495BEB13F3429B8603CB03D1AC41CC +82A29B3A3E23ACAFE098BE5E60CBAF6651CC765DB907A81A0C9AE730EE3C1170 +3C1CD8B5E4BE68B705502D97329D231AE9C629A3349F3E88270692E476E281AC +92C364493BFA024B5BBF34C6EFA6995735AE972CB8652AE61331704DCB10C42E +3B944C013734CCE07A91A4016AC624B5EDDC2B49E633F6C7F11A8F3503277ED2 +AFF98C4A3868C67A4960C760456420F4EA8C28606690178CF6335FCC01251EA2 +93A337B0CB1A51A1234DA080DC0209519A1D92CCC2100BEF87597BDAD3EA2B74 +27FD9E35ED1CA16FEFC86C087251BE83D80234B6EECC77D19FEC8944D5C344F4 +CD89FF27CE457C066F5104C627D4830CD57DFA3D4B416444F4129DCC2EB064BD +D94E6888F7664817C3332FF17759435AD4E95C1710D0D72D6A7D7CB179D3EE53 +5E86BD4993A87996B4E793AEE530D6382AA59AE08898DCFAB4151CCD6F99AC59 +DBCA039FD79C24234CB479CF85BB7F99B9FD82E8BDF9776F7FD5D5C03EFC90C4 +4E3A016C7E653A1870DEEC325B2A08B0E636F4DB6949DE052FA593F7125B0D4E +177162EB4E6AC264034C82E33A04F9850D6E1DD28E26476D46CDBA5D46F4320B +01D2EC7EF1E108C82D64169243BFA6AA10A6CE9CC9225FFE15F71E1059D7033E +C49B110FDEA14578DC663480A9B753495FDCE6881940D94C0891A907E0E02F48 +F8B2F61DF35D27493CDA6563FCFF9FAD1A2E41CB27E7A1B541C16E5489525A67 +50314E35DA4C6F2F82EE6C482B72537647F88A7A658DA89FB03373735EB1A943 +58765BD68F9C6644A01FE7DC70CFF3D2FDF5C3A009D37EA018D70BC3BFA1433D +064E82206EABCCE150D784C9DB26FB54D3FDE40B8D7002ED0006FBB3A8D6AC76 +90B4362A900AA027782E6E31F0C53CF90516BBF375EFE5D0A40E27DF4A1441BC +878DB3D53886E0746DFCD8B5111FE0AC0C96BCBA37077381E72194163E92C7B9 +7AB1731086258DB9A87F54CD7E58F1156020C7F72BA15A68F0EAADDD80B75523 +5367EE05111189354281E390B4E86198269B954FCD9EF07F9D957AB2EE67FE9B +8C6DB530207753D889DF381D2E4AF823716BF9781DAC4C7548C385A62CAA026C +CA5FCFFEA7FBF09A5A90AD09DE2E96D03C0D17ACB5940F94450B6C6663EDEF8E +1613B93AB0D980F5AD0EBF2158D816E5AEA6262C4CB6EA4A01D1D81713B879A8 +BEEAD737A0A8684C927CAB5AB269EBD1A65109A4DC373149482B82ECCCFA24AA +54D04084C229C625FBC19BAD1CA67EB23A0F9F9F16EF1566F5A29F8BC28366F0 +3C0164C58BDFA577C564BB2AA923DC5EEBC1A48F8C67B6EB6A5787003C691C42 +FA13C71EA7F6ACEAA29E1A6F0E7233FF9DE42D5E79433B5823AF41A99C4FE074 +E669EBACB04C9E7992A3739EBA956EB6F385D20958FFC2FBCA7E91C36DFCFE15 +5B78030D92EB4822E16EA2D5CFAF548F6DF59BD118987A35D67D67429FDCDC16 +A22EF6745D7033896A09F3DFDB36CD5DB2172FE15D4651EF4E871A9960CAECB3 +70E3FC83CBB5E1B22C52A46F1AE96EA361812384C61EF14EB326026ED0B94CA5 +A94C62E9B9817FA83DA4DCB60CE5746EC37F2C235B6F411BEDA030861D10977A +A36E36720694009ED6BE27364F02A28BC7BEA691A5F7FC5F0610665B8B98F183 +1FC074B69C33CA23457F5925174A23B267EB85E9A9DF7FA7C1D3C3C9BAE34053 +455486562EF6CD906707A4D771E19DABB1B057F04D758112B2ADAFA1EDF3C3D9 +2CD2D77D61557E1BCAC2D756DB060E9D2834B41E6DDB87ED4827324D63988C24 +9440A816C9CC7B59EEB52F89863B27068111CFEA00EA162C2C44494E93E2051B +ECB2577F6C3D9F2084C41E12070A8FEA78FE7CFC3B2AE181E1BB177E2F33F061 +9CBB7F4FEF066E63FC6038E43CAE90A4EA7E6122395BA10C730064E67C6CB284 +65567991D64C5BD47025CBA6EA0E5CAA111DD891C383CBD8E688E767CA0EE879 +9D60F259E539595348EFC1BE7D46FC67226F1230B6E16F59A3913ED0634FC1EA +98962C1641177C618E38FB038CE792B06DBCEF5771D19DB5CD047EE9670F4508 +5E8CE0D6D3986F606A77C7BED728D7F8638087E3D5D7F76E1833F241EE14F6A6 +EC3D76588ABDA5CA79668DDE40F014CF285B5888CAD8489873789493DD3D27D0 +0A9299E68D61EEB26EA367F1927A0F8E49977CA12E4C7F04BB77FE3069130B1C +4566B996311AC6FEE5F66561F5D2CFAF31A8ED3AF8897BD1929EBA5D09D03735 +E3A0157E61A48A05B5A4F1CE6916AE4C51F8E81EA6117D663E34E5A7222748E3 +8E46D64D8D458AF7610A00861A66D1D1BD47F9A37CBCC7A0DE20F66B818D0FBA +2C34E6A560216CD2384B5C58D4C2755C8FA2FDB66D0AE9F5AF647B5E0C30430D +9903489714236607C979F2E12994DA64794D4B4F541B1DBC252F782D007638E6 +14DCA8B2738BA9243D707395DACD052340EE41E0D481282AB40C0D42D0185E7F +AF03C64FAACB36CEB3BB8053D3A8AA6C1D5626D27E93CB0CF2EED4A9FBA8B910 +0A315118E3BB6B7EA84A817A728E065624ED0AB9867019A358FF6E55FC6872A7 +33E8611EC84ADA92E51C50427AD3C22684A54526B48B2C58CF7570BDAAA73476 +CC26A3D36302F349F37DC5AD02A967626B10CF4AE6DB99C18C6F71C44446BF4C +A682CBE7658AE83374D43E5CAD63806BEC29DB228AA1FBA0943C135837A515AF +8B55D087F7A6760120FDF314BBF9F52FBBC9D9F013AE5A85212A5EC501096868 +8DFE1958EB6A783BD5E0935B9A1C42EBFBDC86B7915600303514554DC0B5A4AA +6494EB18C2786DC7F6AEE22D1892336DDB607E9EEB8C71CFD02D3194AD1A73AA +C1ABC69F794E128E5FF380BC01F4798FC6992CDFF4F0EA037282DECF99F45C03 +FC8B2B6B55747198A0176E54E532FC832602DC5027B4CD4BC5C5D8ABE25FB019 +789AF90B8A4BD8182F8BEFE13D6F1D5B13B818DC8C2483955914509C54E1743E +A413E005F5F6856D0C1995AF86829BEDC2CDB3A4BBE45910665D9B520A879AB4 +598781138D35584199E7E7F682A847F6CAC2B3F2E05260BC302602A21CCBFE3D +FEBD33B49C3C3B4218BC76FAD312D105EB6E1BC15E3BA0FCE6B6A95E6127B734 +B994C4EE09AC2DA6C958058B564A958EA0BFC04CC552CA28E75FC4D098E6C6D6 +943222CCC51155F2E3BBDB9901D52B4803BA384FFDE04FD20F5DBB5E9A3D40E8 +DCF6D76DACD641A96BAE0E281B88A9EA80D27D441B7AE1D7BE2ADAAC238D5B51 +43DA970337CCDA3E978F99B37CD2F1B6FFAF3BEAA267BDE8DD5E98D1A2A869D3 +01BE851623656E091696920D5BB24F9EC248A8CA28017E58DD9C48E53A9EA7FE +8C70D4CE0A878D3DA52F3C575576C4F0BCC2CB2D35609ED39326320F58DD8E2C +30BDE298B619B1745D518F2B8716880C813B6B1212D3B6BBA5152F9B792B1011 +84725D9C3F784CCE5932042EF5FDB73ADF28F1AD3912D35FC4B67E23BA84C35A +4F1E524A95D7FC381F56163C02736A35DC7277AC5081D74B32CB2D6A34E7D866 +B92405C3C2D4A897120CD143B7874E3CC1B6803328A3D52EED3E92DBF27450F5 +F34ACD9DBF87DAD9F130DB9D487A67EA1D9A222539A412984207F4AB62A5592C +358CC8F8A786E5461354ABFA8B2E746CBA08E266E1E06DF2F4955C1EF281DE39 +6B32FD4A1398E2C59E295A4CEF7A0DD49E135DB7FEB7F7C663970EBE419642F9 +E1FD36D1E5C197E7788235C81C36E6B4C104BFEEDA4F0C1CF0B5CDC6C09CE358 +218A907AA7E47CD1ADC594B4FE2F7FFAA606E0DCFA43CFD3538423E145C6B2DD +38D3FBA074E97F1FCDF24285BD4291DAE16339AD0934A04ACBBA910DECF83895 +AAAA4EB2924C69396409DC474587C310E3CDBCB8CBFC417DE903CEA643F80F04 +9ED88E90E45562291A684D5344DFF82172B1B6AEEFB26A0964D35E33C0C3FCE2 +D979DD4A1C21FD478E3431BD4D440AF24893979008E0AF174C9AC54E6C7031BE +E37A79D234544D94392796A8939B685D931559EFE19465564C18CD2972FBD929 +1829A64F790E76F4215E45AE0F8B0C6CF74E9BD1E15F5D76EA2E13D6346239BA +FC95D4C89459A86BA6226EA3FAE0B1493FF2B1ADEE14926AD908EE0251E0E0CC +F8D88C3AEDFC24DA6713815385F68E05C60444256819CF07964420F1389319AA +44624B53B9CB0C6844A3C2C47635665E45A9DEF0F78EC59CEDC12D9E23F7692B +5F2A04E3E3B0E2295F593BBBA3B811BC4E33878035A0109F9095399854384E27 +448FC4523808CBE1B095B0D21AD1DEB529D7CEAF5B22311B6B1F53B540031889 +3903DF99EFF332330A1E116729E6BB5EB05AD82E6D047C6F53CC7B8C272E1961 +C613DC557A656D87162316A0BEFE30741A69F1DEF72EEE442D6D5141B856C2DF +5B4AB35B6197545473625FF3CCA81C2DB8A4EA622A5AE80C40E7F2379F35C87D +5F0F264DB53AD10DD5209C3741CB50B2C51C50B2CDA647A279E591C6249622F0 +29C4EBF1FE98FFE5C1E5737DEDB9A348A6C66DC34DCAFDD983421E44E63D2804 +3B4286005EDF109F2A306CE74488F13653DBBFF9F10F36205801E217C08BC803 +AF2CF71D4C447A5CE08C1F7C77D61A1D43E6BEF030E69C72BE027512C9309B11 +902793FBE1CB3E990E94898A8D9E896718B029692678C29F326D4053C7EAA2F9 +EEC0DCEB5AE860D49C49E1F2B974E9F268935A428A3E66C9B5E66DC10518B2AF +6B19F339114259019D6B2907559DBE1A8DAD8F6172CAA69C9730 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l048013t.pfa b/ogclient/lib/fonts/l048013t.pfa new file mode 100644 index 0000000..4c9d0c1 --- /dev/null +++ b/ogclient/lib/fonts/l048013t.pfa @@ -0,0 +1,1233 @@ +%!PS-AdobeFont-1.0: LuxiSans 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Sans Regular) readonly def +/FamilyName (Luxi Sans) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSans def +/PaintType 0 def +/WMode 0 def +/FontBBox {-215 -211 988 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078987 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83F2EBDEFED79F2D9B89C +8EC53816C50F0AE382BCE732EEE6D88D5DBD81066D279225908FE82D1016823B +76A6ECC3AE378CFA8D4858C797172833DBAD7A6E3394F8E694E1492FE4B67412 +7AD6A6ECC7A6ADC95E7AB30E84E5C6EAF70F5ADD2C2325538478BA68B505A016 +4E1EEE2C4BC00D82994B690B0A7F593DECA6BAC94DF9958F8C9D4A1B5E8CB301 +F978E31D098ADAEF1A8B0C49BE16CF963236BC1C98BFABE641EB28E425926D7D +121C3B5ED3F3B331A592397A0118B79F023A1F3427922D646B40F1535AC406FF +9A6639600E9DE05CB8CB72DC1C2315FF3C04432895774FAF2E5BC8C409478E7C +5E14212F16CCB01F40C090BB951FBF5866A7C22C10FC75DB5EF8F207AE4FD07B +10C82861AF1C7831ACC5759E0B603A9D8292CC48BD8720C06CDFAC12C303437D +D3B5D1F4AF514EB57314E27DBDF3FF7C4F1B5DD60244CC8C383F433AC4D74E8A +E0C76F22042BCAF8E576FD489CFE0ABC503C5BCB003992FE159A65392A4AC64F +4E555112A88333D6CF854A48727EF93AA0BB589426AACDC7C06FA3D61049F58C +74416E873A6B6A2198A493F73834D5C19BE517A92C5ACF16093E2F797548DD37 +FF9841B166114296FA9D03CAA6877981EC35D279B3795106CA671228224D0B4F +D4AF3640A59F9E44C59541F7F06DB11535289BE84587C698463286E342038704 +8D9B9A670A0D11A2B5C6C2E2A1E8F4AFDE915A03AE45CE5947909B1FC9A03413 +75AA4857E725120F78BF6CE2ECB35F685371843C3D95512572A7A0E3BD246ADE +AEAE95E62E9775AC24597907A8B56AEB88F46BD4B39018AB8432D9737C5CBE73 +77A82B56AF95293C7D0D847C7A508470CD6762AC896FE223E17730F05C9D3747 +E340F37E7BAF694BDAC9ABDB97BC12ED7B01173D3C713E0A8E68E10DE647BB03 +E4E67DE1972165C1796F5EBACF057A5AD7FEA38443D91ADBE54028CBA31F75EA +0DA41FD14F15496382A0D8C9C27BCE1FDD6A5164F70BFA2C5B334A2D2DEF9AEC +F1C39CC0484EE7F97A39D31A46CE50FC7D2CC52420898E2052896488606A5328 +FB195A9561E9D5A41A4C8117C86EDE60F80B6C70796B90EA9D3BD5BEB05E6656 +A8BD35A2A884BF8677D05A1F8489FAEFED5C645AD23A141ABF3E78C69EBBF48D +14884B29D1A4D7F03A66EEA0D0EAF7476E80EE45A894E706B5D681AEE8B31E58 +935CBE30E790B7A3995331BA9B0FA2F03F9A4D326F249BCAAC590345596F8369 +028CCB95F0D1CE8A44391C0E9526214EE28927FC98B3BF6676B1EF48DCE63F3F +48695A3AC668FAD1ED3B50A1FCD29ECE9E01F8BC3012053AF96B0C7D276749B4 +8CF046E7406621979A92FBEB7B5DD5CBB154ED51C4A9A1C13F6223BB54F6F3BA +326F6EAE74DBD8B370A25A7A1DC320E9A17CA230A868B752FA7FB1065F435BE8 +A3EA5775CCDC33A360DDC25B2891F7D2AC399BCF6F789109CCB37DDD02BF9EB7 +EAED7A9CE82793DF6FA7F68F9D45530A14EC91D71A19A9251BD810FBC9934F19 +FE4FE1BED828FF3BFA6E91244AFBD8B430B53106AD18F41DF767E2DA16F57083 +B8F66A0356F80C30B956C43416BA6E5CB805AC10ABBD18B31F8BEF14757877DF +152D286CB6B478EFD4C88A3DC1745A32A56D845A7E61034C7907A7EE957A4C7D +A6525821611CBEF18947E727A49E0F765D648CFF974273D18A03080EEBB6211C +E96439F86431EFD0BCC4CA2D2D8A4FEFC65C768D28FCE6BBFAB055E0DF961A52 +81ACE5A300787BF4A458016DB1CDB671B4867E5F5103551007BA0F53117D733A +0D3E8802208CE1C54965A28912A03CA12D9C34D7DE9599E6DAB5124713CD716D +916701BE3D6318B19A9E2827E94D4FC3F4D7D5794228DC958B3FB82617CF21EF +D4A5129EF9051745A52DD66EC77E50F35A8793858819131F36413715416D372D +DBEE44AA952C566114C8E3A21EC8BB0669805F48BCB27C92E609905D39C7FB82 +A62A627280ACF84937B0F10E132EF579B69992A1942133DA541F50CD3A51FF2F +C56C10C6ABDA32C83F1DBB4127843928A4F6E714E815E387588478BF941F1F74 +E8632BD28851474673265AF4A18905C07A4EE77865CA41D23069615FD2176AB5 +2595D1E86B86DA9D0C416B67497B6B9FCB3E3F709C3A4E552E9EE130BAFF3810 +C30F41795F68105BB700DE11773B6435AFD59D7815C17D2D0C33C824550CEFC3 +1285EE76EB1E72D6D3BFAF60973919F8FBB4E2904079F53927F7F1FEA66FE0AC +5496A13D446B0FBADA61467346AAB2E5A9F61619E09C929FDE2BB660FF152DAD +AD834A43A906585B1B48E90D2AB718011880AD2A3431E5C9B2AAD5B9E401973B +AA944A69F49810FC10FF7B7FFF0BC5A2FE856D757DA569F34FD03953534315FC +BED3841FCAF428FBF5210F66C961BF468F25A82E0D6868D3E4B93F95F9B04BFB +D9B99488FC520678A862EC1AB774A0CE59CEB043230B6DFDB2309D0FECEFD69D +8D49085ACB83B16034AE0835FE67AD57F38D369F4D9604CE276CBCBADA2F8C0F +3230E3525204E3868B0AA1E8B387DD2567E000CCAB04929BB4F9F5DAA93914E2 +A4C4F6C5E91C51725CC94DB972FD7B8B46C868D6D2FA9B63C84904E9C3EC77ED +FF4ED0FB21A310ABE4C54FC6D6D18CE039B4407F06B95CE7C262F789258D0585 +BEB98AD999A28751FAAC37BF6ABE82331A9428F873E91254E820DA499C11F4FE +85F0CC83DB4763D6B4C6B832D3AE8CFF77C0C883A0B41A21DE36A1D32DC13EF7 +D35F3E86C7EF1D8461B171813160E56FDB2A0232D1BAFAE968A4FB67BEEEF61F +7273B238C3E2371A05B71B15D8E0B460156A5FE5DA20D662247CC36385544C4B +A52BF88B7C20C78AA08BB0FA4835FAB7642F195D29A5EDAEEFD711169ACAEE55 +1350C30E459A4EF0D5E7F7C068D1EA4882230D157A51D639750E2550F96D752F +97B0AC14EA6524AD772E10B6E420584990F0D622598832F519FF9CB6F6A20E79 +6E75AF675E3886621421E2B0DE3AB619E6D0C65AC4B7366BDBA74C76C5F6DDA8 +9E8D11F672D02ACF26766D7CB6185BEF931A4ED03E3745DE92BA86660BAC7865 +61F4A64F959A7B4D825E15FD9567A957B9C672ADADB83070795EE44D7022745A +9E8B7D0C03ADE959A33ADAFD9FC69A0EEE08FEBF24674B0B6F16B31BF3BF0278 +68B511314B4C73FE31D640D6726EA6051A079A7F503C6C886C9DFFB6D03D2E6B +AAC0BAB66F9C06FC11A4D7C165CF97CCF9737899D41F602E326BF02394F6E438 +A579EBA81C049CA9B773C10BC5BE33353775FFE01E3529DB4FDC9467564372CE +1D2976040390CD1F1C0DD3DAC8936854A0E9B5074730AF4736C0E4F040759B69 +5AD6A1C46714E61914180D1F80ECBC33689CDFBE788204DEB11FA4E35DD610C2 +B82E28A25991DC4E55331DB54345E3D11EC304B7B25CFB5F1762444C55AD642B +8095CF31A30BD6C429497BC0904B1F06EE90FD9926125E77FD430AE3852CA235 +92428660C10A19470784FE02E536926779B248650A6315FB8B784DBA9D226B06 +09C6900E5797693983CDDCF08754C3159545042ED401B364A45A9FD7BE0AC6DA +ACD9120E8114EDF40F21D968935F1BF9DE05228EC140AFB1889AF353996B79C2 +E6795E23B5D0CED1E0FB1E6A572C6746958619FAF88C368EBBD742570DB4CB4E +DED4D19E89AFDBF6092D5A0A48372685DD9639A32E4F91ACD9CA3A9E34D64E11 +9AF8E6BDF8674D52F1242D8FE11E19820F26BF1F533C34EA6471A4C96D4D5207 +A9AE99536705F6934CB16165657EE6F6E7CAA7720D4AAFDC6C075346672B3E16 +001BC35A331F03524D28301FE77D9C8B5FAB0BB872D568D5B95B2DEA4322ED4D +0DC15BA4F0C1D1AF924873193FB809B689646A4CF1D97A1660F953C82211E4D2 +A58E370AF2693919EFBD3C1E18BEC7A472B20DECEBC0CF1861AFE3978C993CE2 +3D7E93946083689CD61E6C180B3EFA962E2BFC1D073F7FCFE39EC0F963C51C77 +B2A77F81D20BCAF1F0B5DC1AABD9869D4497CFD90953EEE70993ADE80AB6CE15 +864AC0BA7FA4B666C54EDCA0A0F9F67CFBC21A3BFC4E2303F5849C130B9B7E46 +0A8F60048C57FF89DED4A6D5976635ED1AFB0331370E53EBEF3835107D02FEA6 +5E28A746BA8E0A4AD649E0CC03B6AB56398D922B96133DF7024BF83A46A0EA6B +E4B05CC77A461AA0FDCC59E90FBC96D16DA364C2DC55E618090800BB3E8A2D90 +CD72A4C067A1C107EC6B0A648FDFF3D05C508C4DA9826E7082CE58C2B027C014 +6C001421F42F21B18221E7AAAA092EC197AF592EA3D432175856F58FE7EAFD05 +B81FEDFADCCF38AE807B2DCD8E4260E348E3B561E72112DCD7BB0032120966E5 +5F131F2399D9C89AE65CB33A354903D37A9A5E480EBAAEAA485305462228C88A +16F99457F7FCB1538C2BD86DCAF01F6D6404F02FD91C82562EAB72EE21268867 +CE2C0F3A083719E62205D0090F64F694CEE7F0F38D57D01F3732839933DC0F8E +DF5F9CBB1FED7FB149AEF7A53C644E17A672DF4F8BD4A0ACDBCB32859117ED77 +82ED68468C311C51C8851ADBB6A9212DBBC84EC1B88A4AA31CC6D1F764AD69F5 +CEBBE3F7983C3442FD91D7EBAFA16CA047165BD327BFFDC247F822314F346D2D +D3E28BB4C05C485438E70E62DF3E165DF4AB31B0CF7FE84F420304D3FB7D11D7 +DA73EDB8834AC45479C13BFC5B845AF24C2F1A4711AE4BACE4D60276491D1BCA +E3A3667563FEF12FBE7667F1EA621D0C241E49D68B09BD92D5163246425565BC +FAD5051C5CEDAD508F387E192AD94FFC7184F8BD2530FC7DD585501E34AF3846 +BB1295CF417B218758F11D342792D81C8CEC903D970E51BD263AB1BFD6E9B2C2 +76E1B061522A88930712D2C169877295EE5340A4D1C3F69B9874E5CE3E3C82C3 +E7CC446BB33407B2F2B13722054B9E4286C06EB291D0410964FBF53E079D70C8 +1AEBE7D82ED6C7F95A0F83AE408196F9FA71BCA747448B3D94BDE6B25D9B1B17 +4C55496B3D0480CAF91E053B3FCD02C6140317DD0457EB98BC899CAFA6D274C5 +06FD587285251051CD5DEABD6E5B22A3F42189ED36F3A5DF75F8A1BAA892D296 +13A466A0FD134597DBCB91BBC63400CFFE7B77A8D09367F2252C22EE637A686F +C076ABFC10D88395D376ACE6CC23DB7F05CD6C457ACC83FEB49C6B50BDFA075C +ACF9D01E6DFA07227E28C3F651EB02303A658355BA5176FBAF95414C6A704FB3 +C8025111091F5482A01628F05547A9ACB731A291F1CE05EA8D6574272DC2FC4D +48006EE157BCD0AB293CABF3B6201A4D90350EEE2948A444F59C774847A5F3CE +76E328F3A1AFCB732F339DED374E8FE3BF9B964C9A26B3E1C3524EB27FDA0B4B +EC483B16DB62FAAAB326B862529E0B284283AD28E80F362343BCC66DF8EA0E20 +38AFC2F98F623770538A38698293FDEF0B75E3C5D851094CE5928150C7296240 +1FB139409667CDEE7605B4F16339E2C4A9B94E316D7A6B271182A19CE5DDBE61 +458DA5B24620348E77D1EA20B096050013A299D52E51C07EB68C151F6EC394D0 +26D6AEEA446783C64E15E7C7602522500E789A4D38EDC317AB7CF6765DFC3190 +FF1B84DB7A4A0194A4400DF94AEE615411313DDEBD12786D1720430E0DE1278C +9AB02BF0705A2E75738D65B832DCE7751EFFEFC699B97CF4151AACA2D94623C4 +73748CC15AB6D1A07F5D13178979CE175326C5110B335E47A53F45818FC9E4EB +5F7CB8332E12CB441FCEEACD64AC84BFEF1E858C5CDF1F0E895CF1AC75BF2105 +D2B6B86C14E9145BE2F22792CF68CCFBD007C728E816783AFCA822730EF16766 +2626857E1E7C525793A38955C4F40CFB8E42F86AA9A0CBF0296F9C54626FF1BA +E25D62B530221D6421EDF9E5D7BE7A1311BA3AD0F48771252F4FBE4E55605F4A +0A520DBE08CC94B181952D89633840FBD1F79BFFC71090E918076A9053947120 +70635D5EFCDE3A566101104D54B346DBECEE79FA87EBF54104904756ECF68B32 +2F6F26103CEE3B06A882DFFBB0B08BF9BDAE2C8D9AEF88837235BBC2CCF19C9B +E262B6F8748CD3B0224E2237CE0413A4AB2724B6BB3C3391CFD6E8C45AC32ACA +7249A955656967035944D14823D7EBA0D4FD6F3747ED319A6B133AB8762AF94A +B43B1D03FCD9F63766753EC12609B8CDA51E65875B04A0DEE40F768D91715D29 +A06076D2712CD5BB154CB9E3E77F322008C505F46FAFB3ADAA066285A50F77C5 +8A9695E324B6A24B1D96F4D4197EA627089D71EA7371D0D0348B8893E5261EB3 +F41BCD40EE77A02264BAE486CB345CDEE0C00A98ED7F96A3AC6CE8C534F5CEAB +889F7E3563092DFA96C44A28279AE30DCE4031150E2A4F03AAEA5E2D854D8AE1 +0E2DE62B83B05DD9C7F0BD5ED122FDFB6D4E5DDE5BA1C27E8961CF61119B482C +69055C36E2C3A1DF9165FCD5F24CBB5D6143C9E43A0F93EB260CD66CD4BF54AB +7AD064FD0D7B72E71F51464E7CF407BA9D90368ED4E9A5D11E63EC7F7E2563B6 +1678DB1300C88F3EB77DA3AC104B644C799344A7B93B7925991A065087ABCD6B +4C72F2C60B3AB3E9B1B008DFC201E2F48E47C38ABE247B622A75ADAF193E5E9B +301E0F19B8066429FC8F64E1E5D7822CEBBDF08B83A5E732FB45B211090F0A90 +EFDF2FFC7BB6A847EA398CAE9BD0562F73DBBAEEBF83595E5774C5290373F3B1 +161905296921A55C4C8E9C925AA543338254E7D9855E01803A2EA96B4AD8ACF3 +E4682030B7BA428C6C505C9F6A97567E568029A0FDA0652947ADFCB7FB74BFB6 +F72CAB5267EE86F34D878C62DC81BBF22FFE13CB066760353039995E461AB2D2 +040ED87EA2CFC54F2D5BE13CC99FEBA37333228C7302A34A4F508EE6595797F3 +7BD211BF901C4055641869FEA3546B89D36949EE0FA2CE8DCE71842A52F05DAD +F63829F2B3184CF814FAA64C73B65E4ECE9B0517204981AF9957F1B6FB29BEF6 +8D47E887F8EC987889705FE17BDA506B1C9E521BCA46A10BD728BF9E21551C6F +E233316FB7F5CF3CA15F1DD7B827126C89D4EE7A4AA82FE71026107963523F09 +096FBD47DFD66CA1A69A4D7C076D9A2ABD9D5A87B70DF1016E29C3698AFDF479 +451C57823F7B5250315EC85A8E7B1367C2E9F064E2B716340EECF712EEA14886 +22F560B22B39BC1CF25CE9966AAF766BC606CA93C04ABBB3DCCC7E0BB8F4CF22 +2D37CAF0BCE43B93B2EE318BD72BA502D596EF36562A056E1413DE0700C776A2 +0B4791C90FC8ACA2EDA723CBED95908811C2ACFDB5258CA181AF38EA66E305A8 +046EC71857E31894C750CF59C4FFD7DDF405378FFA7C854A0E0E3C7BCA0AD237 +2023844F8E8D69C15608CBE17D84FE9C0C9404913D68B98A6BC8FB01479E0B60 +E2E624A5B4E64213B4BF4734BD3C8B30B0E691B190B30CF2B49978BEA937BFD3 +A18AB4FE7D77EB75837ECA25ADE86438AB48F6E2A6C7DF2CBA1A3006F4A89AC8 +E9596510EC3FB24B33E24F8819A9129429376CDF5E84D61F79084346EFD83BE4 +55348D8E9BCDA1ED8096A3215600A1EAC278B99AC3FE8AC3BA9AD3B861A492CF +B38BEF7502F608907CD5418B768C795E3A31E7B6971E482FDF8265032FB63F2C +4B9385860945B83E244B19B7769160D3E90CA5E81E39001085FB8AB7D7A855B2 +7F58B5AF4D7A04C214015A5112FF363981AF0C9F3A6E98C391630F839C8529D8 +79B2AD12D38181E9A57642AF6915E8EC894A2592A606753C7C6E67538B22B1A8 +18D836B53E4E775A9D745F4F0C2BDC493A1122F1DCEEC4F7E18445546FBB332F +45A62F4A7D2BDA18491577A7EF07D19F1F48420944A2A8DF92D953AB628D2095 +F02358B542AD8CFDA1E2C739EF10ABDAE3C7C17AFB2F0884175BD4BF29164836 +49A5AE6C7D7438D477D15F74939183B61119367149B32B38C4277EB60EEF82E6 +AF4E94FF0D5DCFD77052C2FADBD0554964066239180611E193CAFED231F7CE82 +381A14BB9D908D842151883AEFA0C5C155184D2A6E82FB943792DF1D1B9ACE7D +3695B87CDA9E22839448241DFE11886518AFA164707842599A964E65A2EABB2B +1118F729EAADCFF6CB3DA1BD784DBC6BC6D41E895EFE4BD8355B65AAE7FCF6FA +0B2E115F67B7F29210611955759DC3C52E6C67FF1AF9B69D0DC3B53867FE8DB5 +E3E9F35BF158340E2E888D3A9DF0160F8150EBCB76D053689128B4DCE663EE5A +DC8526F46AF7DC1629A28BD8200EC03F6A11D2573C68580CC18B0DF7E138A6E2 +9C9022DD9093D3198ED133895B6EB49A5475EB0BB06016E646F3244D76218EB8 +F26F00F8F507ABFD902788EDD8755DDAF9973C40D1B7CFF83E696C2B60AE9E33 +DB98E520A33242F3B367287A519255AE92F2512E3BAA70DFA3D4FAA48B6E16D7 +167CECC79D41D27F714EB1029BF021EFCA5D4D9203062585F1C2EBCE61BDBCB8 +A834CE84A1716F3A4FF8C8F596E5B4C607DF81D25995A76734AEC487BBB1D440 +F1F11D2FC345317BC2928AB4F59091B4B3EED478E821E6A84ECE01C760698BF9 +19163E32D29ABF92C5E2805434C317C05F7B1BE3B47E26AF33FB53A720820B30 +771A2DCE04C0E9914B6E7A2902C4C4A91BC788FCC588C96AC517A2FFAB00889A +AA125ADDC939A6FAE98D809F8DB1DB49B6D1297EAACD08E94EADF3AFF59F8E0D +1EF968E765BCA6FCC3D52B7DF57ACBF89E45D13F001325B796E11A5BD51AAA3C +036C0AFB391EFD7984D3BC6EC248122CE2721DF837E44F58F9CCD0C06C045D2C +5098854D31234CA2AE9C41B901CEE60220E0DEC181BD39A3EC3E3F355CADAEE7 +2BD3A09FFDA632139242B16207428E0578080CA7CD604A186154665B31877131 +4916A2C04C66E01C1B71821C44E5161DF2646899F1923FF90BC203D592B9C371 +58C88945B5D0EBABFE0924D01CF22B547CE7DFD556CB285F0BE5D9CC7AF56DDE +5F61D0C66895199CDB61A39C944664CB438422E7FDFD2F3FC632058E5C8EC998 +673E8BA91DE92E64AC3FF9CDAA34DF107836B121B5259807ADE4324D0CE7B7CD +F2D94F1A5A0D2ADF7A6AFF0DDA5E98F72FC29A34B01ADD8682B57CF97610EA47 +5DAACF94FDB9E61CC14CD2B2CC361C9704EAC1F54E3EFBF743A551FAD5B52174 +486A5448637530218091DE0B4513443C8342CD18B669BFBF241C249BBC8080AB +012361313B220C3943D4F82EB3A66173635047730A44797CD20753F196A19919 +D1F75BB016E796214058908ED982F3C0D9A524C789D7F634759FDEA8C035E715 +190133B34E87347FC6E8C8671F50616030E5B199758E370F4E2BD838BDA6979C +3815FF7625F1BD41B9C4B6BF0C7DE3DE69F1C6C1D3F4D387B9317C530A49A3ED +37989944243F8DF2D60241CC6E4E5285289A7EA597D1DF92640A83360738B5A7 +26EB20D1E52850C829DB87E28B4717B8F2CC3C8942F38694A5DC5A5321DB5725 +89F49CA6D1A2AC555878CD43A023114FDE61FE8B8A08A840ECC2FBBF1041BC54 +FF4681D0B755262384A664C98ED1D1A1A2AF0F1AE96971EE2E4A1EF9E7C0B2D4 +A60B7A6108947C8BCCCEC3946984332F8AFE04AC9345FB60FEC9FD3534DF4E98 +585F371ACA9E10941CB122BB65D9AE82D16F0DDF13ED41D3A14448A83F120F7B +AEE9C6729E8D82DE68CA746554169CE6214842C399AF76CC78415B52508CD330 +0A776680685FEC3BA39A5C4AADFDE2EE53CF53C5569C54A59CB346033EA7FEA2 +3A5BCAF2442B4E18C9609220A1A334E71D0C4F7748F8068C3E42F3BA0D906155 +3EA8CBD989C0C7BEBA367E63C8484A2DF3E8EB27E50E60D09B1D71B8521336E2 +04EE168BD3077E6444266E1506F7D8F1A73254E5422A0FA4E5728712C3217829 +071803C4E65A4FDF9DDA27A2C4220EAA6F7520292FC1374DB4252886600780AB +BB1EB3C5F479E96AA17644BE204357F8073127B57B5058CE06C53475CF82B946 +E7632666847BE56D1E37EF9B4CE247B80E2287B80E7C3DB45C4F90D49E0AD5C0 +BF2B51C79F1D929FC84EC2B8EF66EA213E862A2F06759059D72931822D35695C +82A834F08B21DB8F40C9BDE784C97BA483E15DEAC3552146AD67AE417836A024 +2F388EBB7E877AEB04C226031941BC5E00B62DF4C833303E8D09360345DD3DF2 +7C05793D4B8954D01DDC88C7852B722546691B0DE58D03671CA23B1F8015FE7B +9E50DAD5AA41382C4E9CCB98FCEEF7785BF174171C4D386777DE16A4329C831D +FC04CD5AE48E6F13DEB41337FC48AD7C7B208CEC6587585768C24852122B70F5 +DD3A54A92F38A4201C6D75C8DEB955471638A9EF4B81BC38DF39C4E4E6CEB929 +0B06974A9D40CD5622FF02A7D3CA2F25249A40E4F0B684E8FEE2A839FB365DE4 +50FB988F97B992C9E8AC58B74F840221865C6E48B044E0A1A4201490F74D82D7 +5383AB46CE69ACAD4B4B09F5FCF3C66A637DC529695C9442F19A15C927569161 +6BFEFC8CD1B7A7F3F9C67A445F8B6DCD2EE53FA25F68817012105E420A61D35D +3741FBE996F921C24A4EA47CC5D2099A314183F55F4B098F3CC567E9DA4EB74F +9865A8019106AFFE5C8BD34EC67228540A4F49747678FA79DAF3ECF142A4F3EE +07E5B66F004EAF6FA3CBDE4782480D9541CA6E4BFDB69DAB7C72C607F56630ED +2F3B78B7FCAE17BF13D3FDA9A092B0DCA9D75AD9D6EBB9DD649C3B032AF5A1E0 +E18B31810E6CF3D26702B480D1D2F16D8A6BE47354FE17AA318AC16390AB1C4B +10165DE80EA293822BB63DB8B72D78E94FADA203B0CE078A929C5B9BC681D560 +B20A2DD69CFAC03D8F2EB16FAA431AB0E7EDC77DFC40AE2C8ECFC0CFD4A9E236 +15BF356CB6EAA90F6630801CCC05B577EC4A33463182DB9F40AD504669655370 +11CF974D7536EA8D8BDD56C268F2362E544CBC1D31E25F9E5D6F490D33026575 +E45B367739D77DFB4D079BE7C379235C8095D6D4F52C8FF0FD4C6DFF2D6C7C0B +13DBBAB39AF732C38348A4B170978410668CC1A2189A058A3EDAC1B08C09CD6B +ED16950A2DF3893B96CB35F551D7A8103380F1264FEEDE157C641B4783C6581C +790DD7349D6703D0B61AC8196A0B787A9A1F0BD9C906CB00439FAA0A9C9CF7A2 +0F26A9CA013B8A737C921722C76B167269A8443FB1C894F35F7BD37EE31DA899 +75B4EDE61F409D8539472CE9805623105FD5E67E6FAC734A6E83151BBF93BD01 +EE89EB5D4021777C423461554F2C2406D35FA6F94824EB29F88E20BFD6383C6B +2499DF337517DFE6F01B0CF4E35C4E05EADCF5684E34B7A646F3FCCBF3811790 +EE1B34FCA03BD9E6F65916C15C68D8E7B7D2306FBC705B90341415DB1262D49F +A6BB3BFCDA817AD7668A2528A76CA62AA8CDC02C9671D254B8427AA2F0CC354C +C9F2B673814A0637DEC6A052F3F279C23391148B4C9E761C5B811F89E737969C +79E7666282A91CF9D865F25A1EA923C85660404A914C90C9CA6ED4EA1E552BF2 +F03A64AD507EF630E917ACDAAF2CF94A6DFE99BAFB2309BF05F9B6CC991664E0 +C477E1BE53A422CA0C85ED03933D3B210D6716E50022E0BC0DB4E5D5030A9FDC +4DAE2DF78BF602F524F138F682A21CE9E1B929CAFF0F1006F289A94F5F0C9A68 +A2DBED5009FB809985FB0E9DE0A0CD342366A329B0FB96601624415392B0CA13 +F62538B0B96F27B6E24E8DF136800885C9A3CDD5615B8FA19529073873BC725D +DFB03865A17573CCDEE9572D13FD100ACA9EF2AAA0FDE0A60A3A219778146581 +92B520565791410F4E515A7B088C43D514B8B16BAE2A658E0AEC9E9A6E7849B4 +4051FFBD37916E095F56B93D56DF69B39B3AA423CF3021862F9BF963405DC9BF +2A13467ED56E1EB1A8A874BA6FEB5E9B72ABF43BD10C709CC687482CF96806CF +8BEFA8F7E7AD89186534A4795FA08224116ABF435509E9A6773F88589EF40C87 +7EDE77FE457008692EC223B98E0EF858DB4C8DFB275F6E631FBE611CF31D319E +C3E946180CD64A4D519BF3F311892C1A5462838271D03D5CE7C4960D675EC73B +18D41303945FBA3504E55798D86E174BA38DD8B7B1D4F23109857567256AD067 +AE8BBE62696CE29C95D4326E1BF4A5DCF73BC0C79E972518C558654D7CD8BDDF +67A3E799A95B05426A1072ECAA116CA332E1D611CBA90BBF9D15DA7739FAB50F +E31BB619F7513BC6BC72617923EE35A2999EF78AB74EF7B3DCF32A6286EB096A +920DA01F6DCF0693585165EA80543E74646D2DA147F9615D4914EB9690ABDE16 +92FD179A66FE9A0290AEF99733F5995943C88EAF7FB5F8B7E5CFAC2FA77EF9CC +4F678820742A36D2D0AE01F11652063457DBF0A4C535708D4AF777D37E5A33C1 +C3FBEE96010EB3112FADDE319A17ACC1AB36157CC1A5BA41B291CAFE448380FF +B11C7CE02791D702D70819E83C2ACD8939372B7DDD08E98D0F17940D94F825EF +F759BBF2BD70387DC2467AB0B21A536F5F50F2EE5368542AA42BF43008D17D4C +E9543A490AEA3FCB360B09198D649966BA730A06F8A2441F5408D5A7095B1A0B +545FF0CFC72E831EAE74B4E3656F413CCB92A778D154F74E05BC0C1623EC926A +E86BBDFEBFACAA94B9A6127CB16336EE4A412B32FAF19B7C79942A8A399D9C15 +A621EDED310FC33108673F0D6290FC882CE490FBF3FC65B26BF47A9FD3AF6BBD +13539E842F08928531CDCF19DBE2CEF56C1FE7F6F617099F18CED9AD3B3B7C0B +89DDD37A3CC1AEEB69C54C162ECCB17D73FA18405BD7F58B0E78021BEA22CB81 +1357F69CCACA5E090E658D1B6A826E621482991101CE50C62B343132BCA7E586 +ED3DB34DFD1562D7AC57A088375B145F7ECD54BEFEED6791C53B4C0F475C0B69 +F14A2196A701674C8845397E4BE0F13C66A2E28A98DC42EB96569E06F3D923C2 +18ABED5B8FF7B43DC738B9E2258D1C0F5A242350AFEAC5E95BD80C16F094246F +182C53E12CE7B880D1A252999C8EBC6014AEEF1EC179C1F5175A7AD8163ED9A4 +07BE5B2D3EEDEB61826EFE3D65A9441701A76BFB637E5D5053988903DEF41C28 +EAE257229172CE100FE8D5591BCF99F000C5459559B517D3818A9D65A94922E2 +CD5517C8A5927378B580C048FF5D5E60317B469F4EE7889E4461050F2AA1B20D +D8A2F241D25635F195218A37F29112C2DEAAC7D8A3B1ECD4A68FCE0C24CEC87D +CDE22DBE1A0A73614C3DB14066448681DFAEF8D35598C6AAA8F70AF07A7DF0B6 +100113490C2131D5613ADC8ABC12FAA531B3EF0A45D19C72D77ED225F361BC0F +86B70C9B531F4900C6CBB9500E532C5C50BCD2A1295434F1E763AC95E68D7C75 +2444EDA3C23FB50D2867CDA09A758D32E4E30B01EDBD02F917FED439D2F097FE +0BD6B387FF89CA48E624295F91D96D6370FD42AA6A0BE14666D791E088BECB57 +2A391A8E87F2C6E50D188475B74CFC4F5BD1ED8D1EC22791BD31AAB92EAD4DDD +C7E610667BB1ABF783137436279D93A71E565923296866F9704D97AEF3876367 +5A063F8CD68C9223B621797F7070D5BF6F743EF717E754F94D6EBD201AB0164D +C240049723150C45374BBA15E0BD104091781F7CB67852002D31644B12E590DB +82846375410D004AA8129575F45562C33862250858C46F72044D58FFED513301 +F7881208CAB4E4C4459CE16CFDFC75F768CA513523C6C2AAAAE41C0A219B06C6 +7B4AA98F92C074356298A588B571A0A03B566128C0F62ADC9663E0EA2BB9F686 +609BDF8D6EB178B00E121632620CB7331995A63551F8373A22801915C7BFAAAE +652D11CE7CAD9C7AB1CB646C605C6C4F2E42BCC872D94160024D4C0B2DBECB02 +25650FF58D1ACAE991CBB26FFB229D8355814F5CA8620C9E637F4A77AE88553E +E159519E232749E5D037EB2BD3DE28EFC4615515DE0F44BAABE6916F0FA7D61E +2C56F5B0DD6B387A7C160EE009302BD3D1925D6372BBC8D72344100641B9A87A +647386FC7F4A4F16CDCA462B9215D94E8C9068B760AC18660FA125B352FBF456 +C145C0DDFF3E4F6D2C84937AC82BB53D0DF720BB8E0EF59CA0F1DF1AD8A139C0 +92DAD7B59892303822ABFD24EA1A922B09F5B4344290B3647CAF6E7622583798 +3DAA4155916D90B1142F2745304C46BA7E3F98F1319A3F6500C402133D8CEA89 +A10360935E26ECDE1578D362C34DB7037FE312A5EEDC4054DB2CC52A88D2820D +C2ABA013AFD88CE47E09BAE8B40F7CA321DD86BAE6C82B919884C8B855D7F5E6 +72B791936EE754670A53E92AD0C74843D15445AF39B6C7C2B065ED1B3A29B81F +DFCA2F5D4191212ACB7FD331692C0ECEC8DC4F442A753F60024969BDA7E5A010 +3DB640453B353FCF772678C52781FD6DB32BAB10D6BC7DA3233D0DEF0EFB8B5D +7009EB3F58D77C0B02B2341FB3D485EC340E80C842B6E1EC4DF85052FB2AF512 +A48412CDA18DBBBDB5726EC1DC3D5838FABE8ACC5C3D19414DFCEAC70B857638 +5924531C3803BA645F902CA88F74367B09C70A1E8504F8A850100A5EB21ADE63 +3FB038C571150C9EBD3A75A2F670122E92855F6354919189E36374E91C59886B +22899897F868B8720508F9BD5A161797F61EE40942EFB26C155359D4A6B2314F +CCE8C7059E214534FCC40EC602DDD283B2A931B5CA1E873773637BC9863CF916 +1B7B36B008EC1BB562C4FD883A631598831B1559C5D77136AD03E94DCD9C495F +315470097E005FD022E53DCB7581DAB60FC791B4ED9C636E2DE5F5B22482374F +088736F9E02EDAE88C55C5CEAF21EFD64EE282AB84452A1319AA8DA3695B7806 +0ABECD77CDC40FBF7D9FD09E1ACEF73DE682447FA18F45C93C03E7D8A70135EF +2B18D6F397DD2885206DF5A8C52C89BD54B11B4F61376CA6D6342F44A57FBDFF +171548EB957EB47C62C9B78FD5916FFC8B2D9F9D4B744E3D7B784BE985DC57A6 +92352900DF235A531109372BBD46A8B862298EB6967829DC163E55CE85F0D8B4 +D952851ACA00BDCC981DAF1B15E5D53D29F55FFB46E81327ACC6C147B5627FCE +9989428A788A98DC4DBC9DF0904DBFF8DB4C6F0BA3CDE8FE3248F29EF8003878 +132430F063596E34424CECC9C9FF6985D4DB0786EA1CF7D0DB7099A3C4D5E26A +307080C45892678EA66C0A539C32E688222CA098EA3472814A995A5701E5307E +DAEB7C853A4B7B46F9910158BFC4B206F7E7CD0D9B5A1820773CBC23E6E43CD0 +6A4E88EF6F45285E85651FA56DA663DB16D356FEE528772A506397D9D86B3D18 +645D3FBC57199F8FE75913911FD64E03E24C6D0279718F7BBB0C8C502BBBA59F +9B2CC3C21FACD744CED42569A8841D3867CBEBF2ED3486F5C187583E0E6B5D5E +9441B9F0F659E5BE48A17B05F9D3D96F28D95D757BEF3CB83CDAE0E667F3F8B2 +42F4E6D5AA1511D320A2E1B96C3C7CC96A8737A70B974760159CE08941C3E06C +EF4B1F07AB12EAD4BA26C5C3627A231EDAB2197F8B0EB12584C9817D5BB6B39A +B415D59E2112DFC61B10A06EF9ED5252F9C0FF98FA4A2B49193F09F796BFC431 +38B88C7EC80A1E192DF7B6A0E5BA7EEFED908BB108AC20B5816DC41D57DEB1C3 +37E3BFD817772D44F7C1FC4F82F41685FE711220C8175D68F4C73727A6982190 +2894CBDA32FF2B70656B269657AEE710E75D8BB54659D46025405583BD30A344 +EB026D2DED75300342807E34D661FECA07A39F567E0AC9053B3DE8330E6FA84C +10A47732062EAD6DCFE4982DA630008C33823AAB374797946A17678938259C44 +EE9BD6B2DBB700BD2CE90B2407DD6F7B48A62D3A9DAB971477E50CFD4F4BC72F +5405120220EBCDFBF0034338D21BE2FEC949C90466E14DFDE981A70F2F6F26C6 +5F0A35C1ACDF277E7034066DE11C25984CB5511FBA51CA0EF84C1143F8CCB991 +116A2F8BDB68B1EC45CA2D0B3247F93B2905C146FB10A63104AD5F9C4B82C7A9 +5373F8783913A2F925B09245825E167EB08308B1691DF759C1E90FB2611AD646 +0F73248F56E90C86F99093486FD1B5736D4E0A6F880670C37F1AFBBF142C7865 +C846921E34887D57187F0828675AE07826351005BC73158A2BBA59F5E9614BB5 +B9E72334E760BEBF7E49E74F68525F9A017A34A18A1EF40ADC811DCA5D5835F1 +26132E606874DDC48E181F79D791DAF9B2668DDC6A833969FB573201E745DA5C +8176B641258ADC5990C82F9A9C8E6EDDD446843278A83BFD4300F749EA148A28 +1CEB260198F38A5090427A0052FC91364EE8A2DE0317ECC66F676E2F9CAAF3D3 +BC6E4FDDC0F31F9259EDA5AC75B969257E635391539330BF9AE0AF73738452D2 +6388C2975CD9727BF11E0C4E887511B0975F6813E77A08DD27826D609F0A2F12 +3FD49AAE57298D7D814409C4EF9C66F81A02BDF349FA0F4F8D46683A56165B06 +CACC0EA3D648B47D501AD15F83EA655D5261DBD832A6C7131A73F3A25BFF3193 +B9B37D19D2334F29808FE28BDF612DC38172E9F35CB9616CF9F2248B7159465F +FB90BB57BA61B00B4FC957644729F270FF485252643F9F16244BCF1178C7CA2B +CA532F178D44B8A7A47550BF1D1BD89C0A15AF41BA0735C486F61D5CDC421DAD +17ECEEE048CB89F0CC319D0C3809893E441F85E2635CA10A869BFEE0B753FD0B +C9849370A0CF1631DE406FAA5C4A9C97EA07608ED72BBE10D82C17CEB10BC478 +1EA17F6336A773CCF515287E9646695A6A27E84A3ABE2EDCFC49656008B951E7 +B3C0453409A7003D5E33F3CE248C108AA0553D8EA29F52ED17443716EC967F48 +D3C2E15470F048D317210A67916ABE50E11F6199D769EB5C78E447D9164BFCB9 +FA6565C7B3AEFA07018695F7D3D40868AFE8EE320D6BC24D55F972CA66BA98E5 +1E2149F7D205FBFF2E1C5EB06CB71F2F10A61DB1571726D0FC78F584294508A5 +844449982ABF95005A4DDFBE364DB40D81E573C937402ABC251B64F130BFFD0B +5EEC2B739A109B89895F8EF47F6F180A4423ADCA8738735D1287AE5EE35B0CAD +09086479AC06B5D0861D8EAFF2CB0EA7EFBFF7CA03CF6460DF5DC7FCD5795497 +57CC8EFEAF7AC8CF44670B8519825FA30825057A23DF1469CA1C14E4737FE199 +38064FF83880E04C863D4B16292084505129670B11BC5796C4F551770C2807BC +D5054771387B8FA34AB300BCA9447B952BCEEC98C72B7BA65504BF02BDAFE588 +0DCC68FB6AFAADECA915F572740233D78E6D3E652D6F8817B771B1E1B32BD1A3 +6DC2B632C92E6A2BAFD2ECC15F7316FEAB6229434E0FD979685202408F71CB8B +1201512A065271EAC2BBF1B479798CF2E3A05F05F21E123C5644F701E3113EAE +27B93EEA49A478484B91A844F9325CF0742AC676D55C9187EDEB708B4C8D1B1B +37EF1B96CD3B554458B840A8C384B89A91D53E0C8EB72483BBB08CBD9FDA0BA1 +4E124713C547E137E60B37E88AD35B0FB9DCF2A29B8E191A2D8CA785576AF525 +938D5D856049CAFD10E949CAD5F42A390045D90F2CC97C981D1FC272435374DC +3ED1E0E42C04E0984CA1E12960C2EC6BF263F4D74389F1761A6E87857967A6EA +16BB17A46D36F1AD4D8BCCDB8988795D00C76677DAFC702EE863AE02392A840C +03215E0CC08DC8385354022E7DD2923F419501297A3AB017FDA031D6616CEA5E +888ACFBD83145CB8205DB631E632822AEEA28585015695A4B206D98EBD27BAB2 +DADBEB6FC00C72CCA83AC401B367414306D36291AD777747A3C29E52992A8F25 +D3DE12A79EDBF370AD7E9C4612C665C72E57B612FCC81CA23661FDEB7159CD5C +1F159EB60B49085424F078081DC690399A5123240B698B7625AF0D34BFE324B6 +A24B1D95C4BE19428DCE545E7626705A7CAED84460B44256125B829098D97FF8 +FC319CD72C806D7BD7343ACAFD866D00AD8F5EA111E9089EF7902A56B7FFBE67 +F9BBE8853D1734D146AEC85E28D0903A94163C1BA0F0E5220558F85966B0B787 +3EBE0329D0E243970B7FA61DF295E8493C92B30B2F5019D4E4F2C0C775C25AFF +4F502727BAC48067217E5587EA0C6A24918AB20D6A7C7938380D1A342B76E99E +0F12B4C6F5BB424E447A26CDBE25766DB8A1E7E374BAFB4EA2DD58ECBF0942FB +6A54885EDA3D8CA43D8EB86A1DDC6572F468AFA03E20F0E882958AB7EA7E3ACC +8DE675B4C35F6F9052E7850E7205849E8505FBDB8168C26FD29AB6E849CF6001 +DD4FEA81FC83718F4C2F2BFA6E4C0C4FE66768B54A913D4A29499AE406B343BB +450B3D7029E6C578F523974353DE37D522E8FB091EF6106819675179FD6BDBDA +B6A42B339DCC43717C6C12C56EB5C80EE2A7AA2FFC8097EC905DF5EF9656877C +4CEA6360082D500D23BBB0AF4B4EFDF15A33360DEA36DD2591FB9DB7A1501A18 +6A31927BF5BFBA8FFFA22F9EBE0384939063BB305E307DDC3E595E525780CCC2 +D4CFFFD19EA9BA61E2BD6CBABD1CE52C9B93DBED0F486833E7A252D818EA8040 +94213BFF2DB659ADD126AD0455EE85936D6C02E67A07B163DDC10C11B5A42327 +50348D881F4005572D61CC0DC9510C958A153D6434363A52DB4CB9B9E56FA46A +0ABC1939A1FBD632E18C3D250798B27418403610477C6736004B1FBF6BE7561C +950861BB6013CBAEF7ACC21C7096DCB7B99E8F4E17815C5D40BCF2218248AE02 +086353CD1E8B0856AB31A3C2474326F14D0CA9F6A0C52236D9FB89EC842DC8D4 +4857B0DB7F37131137AB222A517CB80C671CFF8A9A5889C8BB2ADDFCBDCADC06 +CC2BC3540F12169D3C46E579E6185B218228603A4B3FA8AD8E840C3761C61217 +8861458EC8BF163C492B748FFD349E00996B78705D9DD932D6CCB6FE7D7B25C5 +A92DEC2C6B950FECB4ADF57C5A95BF7ED12E431787DD29C6D4414FCF3C4E360A +31E19B37E2722A94BCE47087C5E1845929FEB43E73D3EDA981A0FF9C0F757042 +48F6912DD892E2CF8880A9D1B19FF0A197921A2DC12881E913A4C7858A3B3B96 +E9A4DA7FF3598E74D74B04B5F2545DB3B1D84E86E26AA8396D696E667C2970A0 +DD9978187C583D415AE00359BBDDD7109C15547B9A56F978475531BE02542924 +65D23928DEAC21CC7D0C1E1B1BFF850ACF80E629EA46D71FCA2809061C61F65A +B881D56F270E8C776983E3CE0271E3F502818DB1E3EAF30D0C98BEA340673FBB +23CD34CA17648735CD2A532A8B3A530C3E523CD013151B75FF664463DCB0B388 +BF60CD928E28139A13575635F349BF70C798D0EFD52011E75A7B3A2841FC3D72 +65EF0CBC6286367F1F4B3A7EF9F1F4808954E6D973ADF0CB1893D49B47DBB0BA +AD66EA4E84BBC2F1604FDFC7C9FA0E131718053BA1BF946A6859DE3E452E05A0 +0E179B5F1D03659522BF22518338B6C98397F040F0E93F8E6A463D7D504D3690 +142E26C28172E8DB43E5DC2D45655F7D05D999F32B6BC9A9D0C89041C2031C32 +C54C4ECD75FF3A95B871DA7155A73C3B2FFEDB148FD851AD87437BED46C10E99 +0BAED69E6900AA9F66D77F30873A508C6369C4F898788F8204FB5B5EEEC4068B +2C58510223C6B23B668204B2423FE7146B7C5314969349CF72F100FEE07D4B8E +9AF97E9B7B6EC0894C6E81DE8EFBBDD37641EDDE1D241E4C4440CC91F8E3E3BD +E70703769D9AF7227E7A16BE76336B46DB6573D0A195837471D18666342990BA +4465913A45DCAB6420462C5FFB8BF1E546D0C5B009ED19C8B11F5E5D7A41A3DD +4AA97192A047F29E8C8A195634E4778EA5F16472542D9A0B24C8741F547784B0 +3CB68F42169804AD537C0884BEFC4B5C0953A11F050117C86BAD3F5E151FA668 +D83B462FC0BD10664F0962D62E31E163FBD8FEDFA0C300994421E54A9BDD620C +42ADE78FED182C26595F8CD93190C4CAC7F46D7432B635725038A4FF6DCE92C3 +9385912E24C214AE42D5C72EC74EFE2017D4428F4961D416454F41738A6C3D2B +4B59F8F915D7A5E03B6A6A9B982CD07BEEAE7760872646776324BA25AEDC88A0 +38A730B1FA17BE4BBAC909375FAFF664BC811439F269CE71B92CE5D30FA255EF +5F5CD5ED0393DDFBBCA2C4008A6D58A1E470EED8CA803E56CFFFCD581793CE83 +1D49557CB4F47FAE9CEEDCFDE140E70F70D8AAB8B4A851D01F219538D8185042 +46E442E90954118BC348EB5896BB31B185D659503B9214885CC2600719EF8F58 +F006E2EC11EF22C286B7F058E8F4535D7EF5F3B674FF0F5B476E8D75001ED67F +48029504CD633DDEA56FC7750A9F9D707C9D3416430C210089F60B231526F4F5 +3962D40FD4C549EB4E494EC03DB95DEB23A6CBF25DF58F1327470CE13B9001FD +04467E3C1FA4082DECD79B4CFF71E9284168794F2151C1BAFA164AD43CED97BC +A410DC015AD503B270D81AEBA9A963CDA9031FDAE6B51F0C1F3606A00215719D +477402DA2B221AA885F6351EE8C4B17876409ACB320444E69B0DBDE6C90E4D10 +2F72593F2C36ECEEE2F293DDEEA74CE325E806D825F94B4280E94B8F5803A7A2 +3A47DECA7E1175BF08421112A67C59C1187570DA6B60528565F0AE1F9810AE20 +E9A0990380605E0C186092B7F65E9C0F1602609DD44A8BC80376EFA0D406DE98 +DA5E4D2BC78E67543927C6DB57C5C480CAA6D5D81041432F3EF05420341F369E +499C5245507A621789317DC4C294265DB72AF96C7FE3825DBA6AB5C96773F1EB +203AA5092F63C0DC5C8D47C28F86C5E41B280C77A8501F529B1AFAA5B1C64031 +DE2E70D75D8A471E16EB1660D64F8F1000173206D82C807A7BCBE7C318934315 +EED4B9B8403A58E18C1D4D7250FBD8DC638A3D13D1ACA9CB71D805D4809BDED7 +8F8732ED4C08DA5D6F705DC510892EBC39EB623095D6D7CDAE7FD01A9E4F3A63 +64BC83D0DA24AA2333F473ED023CF9189EAD1BFFF702E0B8E5BC6F6484B6C77F +E79842C4F56244E6A5816F0C76A4210F2B9A81E367A7B02CB683C6A19DF10F98 +DEB661CF23424272183272EDFAF0871EC214A6261A93A7C8F9CD1C08CBACD9A8 +048961430AAEBB34A5EF5C0E321CD6C2B0AF1E3D81A8153CCE16C87CC7A24585 +62BBDB75E14CCC4EC692749432A52FF9827F1CA8ED6F47059CEEBBB945B701F8 +7ADE1DAA3C6FB9F3E95954CBDF0883BEC86A6F63C4A794634F503750B169A642 +3D73762550A657BF8A5B6388E41E7C8136062EE343EAF09C07FDB04A9972A91B +6E9B192EF143F9E8D111CACA0540CFB62346A23938314B9EAADB27D5879E9376 +DF4465948BBD6B1E845C90518802D5389900E1B98B68DF86066A90C7EFBAB98B +58335EB75CF3E0572DE2BBA77E7F6AF3E199842DBBB7060ECAD3045E834E1BD8 +64BDED3FBF9306C2912811E237FF9D6CEEE5278F6613E371AAEC15620C4A2A15 +22150F8B1B0C81F9A18D49B2684640E7ED5CFBC31357A236FB1942982EE96B6C +E3C54F03A25C06968A53CB9D7FC3AE8C5B917BF33C2D4181280A0242E823E2FD +DDE615424F9A3FDCCBAF420542AC90A4D9856BD2C6371F75767A6BEA4F861909 +1444B6A5BB066C63E46B32B55F2D26B97D074661CC54BA96497B226A353CE86B +62D435CC24BAC65985A947BC16218E15579F16FC8DB371582A15D3E510558BC7 +EE6169F2D9D239F40C010AD8EC8EA128CE416E21637174D34F651E4DE30A024E +0FBE8B5FEFB5C89772D5230B3AA652D6778299B048C4CB5D68455E18B66DF0AF +851DF300836E15EAE115DBD03DE42716281E531D5B6994DEBB0897B97D21ADE1 +49F76FB3DF0FD481B322E2F3CBDE64B16BB7FFF8DAE55923757F1A65FCF48F36 +E51BE3D300E0D251BBD18AC914B242D71E491F9CB99AE0909D326AE17D9D94F6 +6F8CBEC8421AE9941069126986D9C26DAAA474928B2BB477D14D7CC7A4B3301C +A9B795626F9FD0BFBDC870275229C5E67451D37BF4BF92090A5571158169BB81 +D3F45B9C6D65E3DB921ACBFF42885AEF73285D3BDB6FB4B9B8C8864BE52156B5 +B2F20F8627BBDC08D8AD002440E47A2C96D79240147936CEA7CFD7B09027FAE2 +60AB5109DBF7059DFF4FA0D8B8EB06DCC73A1D1405FC19CE7D23C18CF6B353F4 +FBAF8AEC7E36B738F6B1CCD05A0B9C9A4C13D060273DCF6D39DF922B3797DCAC +876E0635F4D60C3D5A5DB9715D09CA2C6D0D16B62B747BB8BFA0580D0BFC0469 +3D78A9331EE1C9E7D5FEB03C241B47C60E70AF08FCC5A37CD973B4C6DC83C6B7 +0D4BBA368135DB44092579F9FC257EFBC1CF7D915FFACB222D06C52E4E927178 +80EEA6947B47345342D24FC41FC24A90178BD358759247F8102EACAFB14F4BEB +256AC2EA0E6D3446B1F1DB46922790290C38F16317FEB372898EA0854C333A01 +6A43B3DEE51F5A114B90B421C4CF9F874C8AE2CEA867C7C7A95DB46C30C1AA49 +6FA9F53DA9825F54B6653E509A079F2FF1C3615F0F34D04EC75EB02BF0ABF364 +12FB55935F20A858F30F7C86974A3485927694695DD500607183FCB73F1C3428 +C9C24FDDFB844232A43D2C596605C70C9F0F14DE98F222CD610262EF9CB6AD1A +41FE3C37051B2E591A879AA425118BFDC89B41D42E97EF93FD6E50A82B7F82B3 +267FD63506A2208D35FA855BED185FF6ABD8C5B5BC833D5CACF9C71AA6AB3DB4 +992C5BE71BB6DC0596ABBAA03F89A4FB0D77FEB283CE666DABC4AC06741D8B76 +05E80D80C8D95A5E340B8A23733960DC9283ADCBA0C75B0E78773B198C5A37E1 +27B7470CB6E15CE19E890BA07CA1A419F1F5FCC5C1CB6AFD5B530BA03585568E +11063A0050CA5E8F3DCC804E440845869689478CE1D7388C4EBEF6FDFD245810 +AB2C5860CD320AAB722534AEEB9E3483329BC97B693DCF7D3AF4D29E08E83F0F +A487B723EA2ACBA403B03F3D17F8380B2CCD6C269B6D201E465973BD821ED5AB +BC7AAEB05418DEA87619D40F4B1CD70E951CF7AD151A9B8B1A127871BFEB6997 +8A90798D6D075F8C74E1D3375A932A3B57136131826C83F2B4B4159456BF5DE6 +ADBB4EE690FFD3F2D760310841CB6C21509871DF6CC08409617AB94A32FCC617 +632E3E8C98B5A2B3E7B4169E53C3FE3966CDDB526EA5A18DC4894660EC1C4FBA +25BDA925174892535C368720C92C0EDEB4A245065266674C033D90D52009F5DC +742F7289F36CE321838680EB9F8E667234E802E6EBF61B60E526E154F2BF3A43 +4925FD043EB471476117D86127AF7894C44DA04EDF2BACA67120DA53B1A116B2 +B9BA47A8193D791E951735E33498D8C705E67E2986520D880110D35C0566FD8C +EF860427BF833331A7DF3F7EABEE61E25B667BB6A4584AECF704B45F24587AEB +B6DB1D7B6972FB4B4328B2160A91199CEA30020FD62EF0337A4D4F10AF923EC2 +247660A5AEC4D22E976972C71EBE9FD9CC9988D2E272D8FC20E15C68E9CF2621 +4778CD8C3CD42235F7FB33D3DA71F5D2C5CFA17421AB95587919AC1BA75C85E5 +E459C9AA3DA52A0A8714594BE4F2AC32599DD6C3FA3340DBCCD87B8E7D567595 +14E3D254F660EF2C5EAB9373F33395BD7327777E3DCD4A11B7BFE54CE272439E +E2BCC6F8EF22672F81F20318CA95FBD8ADF3E18ED04A4E73C9B32EA493317B99 +E7680A397A72692D0AB3877CEEB916F8D7D7E7B40D97E449F76BF4B1FDDD08E5 +DE37609896DEBDE25CEE302A509968144061ECBB277142D3512485D11003E3DA +D57C8992A310C2968CDBCB65F3D975EC5E3685F0FB2D24B8E03774CAFA785BCA +F6AB8F5B958FB630B7DB2EFE66EC1C446E5EBF86C0F02EB9A96E582471E48BB8 +68AAB996C02DB531A45FD3AF2696E0A459629041E80D4B25CC6C9F60B5218C9D +2BD697F050E194E664AC1F229082656351C8CBB04F8DE1584411800C19261918 +FE7BA5FB2E4C02AB650D73B4A62E41C15D4A92EE8221C51A7C6998CE99BC505C +DA3F3F384215CE8EBD281393E8EFDB9EF91F03EC00DFFA1B2229D70143981563 +4B52A88FC1378607096431F6B8E1DF869CE2FBF2548B6C1A9D5A4E40821E3FAC +9B15907958C13AB21017A3432D57A0190FCBD86287B5E2AF6DAE27E5F34D9EA3 +1B8DC48F1574D9484951F76BF3411788428D05874F0AF0048192CC05CA43EF70 +E0E1358BF692F8B420358C131E06E33394317AD867CD47F5B91A075F5B72C49B +DF756D282F3702CE9F03BF86CFE4F51FA00D186145C002F25D4F897ECE7986A0 +5308DBB80B40B71FF4B776BB4B3F82782A76EEEBBBFC3278DA716868DCBC097C +D3D3A37B935809D7FEC58B537799E1527E7F0094B11490F9999D23D73C129A0A +7048D4CBF9226064A31B3ADA9C19254A20DD1BFACABAF15B3DDB06C4D7E65591 +3624A68A5559C9BA94E47BC2C08AB8C6FA3E0A2494EC8B40F90E0CBF14E5076A +CB91AABADA49BBA79CE47E70955200256475BE67352A65C75292AA82FC3998D9 +DB4D7E5366138B7C516819F0EDDF92351FE34CF73011FD339B0F8380B52D7C9F +B7EEFBEC433B3CC2EAF0BA105559172088AC7BEBED21F2243E7FA81C59554911 +08E9304C1C252908CA315F95A1A896C0C1F782724D3716D3236DDCB129AC356E +06E4043FC93CA6BE977339C6527B4EA54EB74E89CC4E8D42F3AA2F7AA5BD9D3F +B7FEBDC1F174F5F594BC6AF14C89ACF1760ED6F173759AFA80476759CA2E7E80 +6BD05284C63764047A0AB8A545C67868236411D96751FDFFDD4990324951E071 +7A8E17659FCAAE93DBB7E387569959C4A4AE5F069207A13E1D1C7F40802A2D0B +8B3DA376E109A1AA9A428F23B0F9B99650FDEF28AA801C1F9B7291D47880444E +7EE09C0920ECD434CFF5B851A343BB70E2CFF06854E78A1F92CE831BCD253713 +4A92308D405B22D204FB7139CDBD1B14946F2CCAB6242DE87C5C7565EB1C9D99 +85CCA6865CFCD57DAA7291591A202492CD863A98E17F9AC2CD9867EB827E70D6 +B8B81A6996ACE08112BF38BB07BB78C6C879FCF709F8D94729D06D3BAD9CBCEC +E85E1A08576B1B4192FF26B6F923D08EAAA58EB670D84361F9688229A9F103CB +1D43978B1B067FC31CA0AEA33B5B244D7069C29B6BEF12907A78ED5128D678E1 +67C39DEE6E9BC38E134FC55DD7692F5219ED04924CE8163CC566BF6D6B331456 +4047FA2F3B2C10D95F1BA5E7E527C539144B135D3DA214B88DDD2B024E6F8F7C +D943E64B6097E559B860E235E2CD13395DD7177D7F93070B8C8EBADCB127162C +CFEC2895632A15CF1E55A525D342F96B023648E8C5479C6AA0A9BF9729DF2E70 +DC54A2A26B1DFE7BC7669FE938FFEB7582386FDB2104E6A19042FE6DDA8F9850 +D5AAD74050D5318F0F8D4D750A4492B50C2AA395795CD635C8A914B707B14E35 +844DDE1DF2912ED6B078D2685AFFB987D8C4D86A9DCEADDEAE4DA772B947299F +E5A438058A936C0AF23106FAA82C9D8BB8D414EC5371A2AE978F99513B7DD837 +A6BDFF5551C9467EA26AA91C3900055EE65185DACE0D675A8BD6C9D4BE4B006A +FE0F89713E038B7372A86D4A40532D6AD87D2FE7B62B3D2EC605DD00377A55C4 +E8392D8D3ACCC84664AC3E30C18D8C486E8C502196F4A36226C1538C4AFE302B +846F2A87AF880514CE1CEFC5973FEB9E9A48C4E356EC79D3AC1B714E23B7562F +AE7199C0FA5345D37ECB4F371BA123B67CA068CF67BBDA93268F4E08A5427FD9 +0ECF6B33837F8A4F42B37530FA5AFFF10D8D558C9B55A930CAE49172A6D36079 +3F952690DC1D987F2D63015B3DD6E2642B97D7175E345E299FE57C3AF1E83E02 +B34BD8A4244D95F7CB1AE5D501F358051477C15E534FCFE4C637E316E5701EDA +1009743C789B2FD633798171F4E88DBDC447ABFC9C32701527F34BEE07FFDC36 +003856BFA9325A4F7D1611CC5B36A4D7604484471B74EA3D8D5A28E9DE243332 +D3C6146772D773971E5BB3CA34D8EBD37C8F435B0BB57AC9352DFB3D09BC2C92 +E9081DBA9D8BCBEBE3C2C42066DA13188A5DA5939BFA435FE5D2CD8466EB0EAC +4F735302C75CBF6ECC96969E3AB91593FA24BA117BD0BED4E3F9A51384A5FBB0 +BDCC7A14B31D8833C1B796B8667FAE8348A7589218988BD4C2094B1456099BCE +0E925A5673C13BEF4F1D91A72B00B75524E9F2B6EEE39EDCD8436A239FD6194E +02AF04CE213AF8A4DE0BEBE6103A1CA891C90F1F79E34E8D7217B59F1F8A146D +94017DD36B2610883692D55453BD9300545764CA404E3699548992C65226F772 +19066C8DC53B6CD2E378C0773B10F16FDEE74FFD370EEC6963762A9EE64FCAD0 +D793878A07386CDDC0B00A6E3500D50536E7CEF106105AEB4F7FD391C7825C96 +3D1492F6B4431AA74736462D14F63CBCDA4CA2808E3C55BDFBE668F6B1AE5F01 +4A4B8A8EA303C345CA242F0D9CC02F1BEDE134C6B4FFC0231CB3F16D0F5ED86B +56A2D04CF64925215CC4DF3B51F59F69E99DA91BCE06D02872A60E8756EC89EC +15FDA8D54067FEAC2E07483F66B00E8FBD5BAD31BB3DA45A549B205B2525BB6C +74B4762CC4AD3BAF05C4A1A23B50BB22EB8D88603B7CA3052F83FBFF2D7E49D0 +438F3810F8076865973D1A4D2B06F3FC38498935E6CF0DF4DEEF6335403E4748 +611D63BFA4273A823E027AE5868907BA7124FBDF11C4E30446DBC2346B4595BF +2CE8784006D1AD74432F5A3A1E5A7E6E69498995114830D4C7C9057B0AA4476C +A9F5F44B45861ED13CF485B3CAE0E0DA24D805B5FD78D96064EEECAD82FD881D +6046574FB32545B5B9D65C46C7605925054241013115C1B0D112DABDF00B45EB +11CB82077372FED9B125B9091129BEB6F8F71F093CDCC5F3ECE4A9D33B55803B +33758CB9F82DF01DE13A7E8C800BEDEC6840E37AF32B40A412F6DFE46E9B0469 +F96589AD547D14F75F9B694071F1F6F7A459EB8DB009B26B9DC8744E250A99BA +EA1421504C17BC772862BCE3F07EE747D57487DC8A611FEB526095B872A10902 +6839B37E552D2C798F761EC0F1698AE49FD98B8CCE873259B911D61724EA6C5F +5AFB0E44655BF454D1D35936638684A5FA041CC0E1884E362ACBB04BBE704282 +86E87C674245143F5E35B598F431EA3DCCA443318EFB85242AEFABD64B8F1A21 +CA7B1E372748A25ECCA6DED3A7E81737AEC77561723ED57A7006F96D17B8385D +91BBEA3A651B5644FEF22A577543169056230A6FD1651EFC5140F2FDFDD1B417 +4B458D312D9B58176403D160628EAA9E99CB5CB7658DBB9A2217CFF17A3F5761 +39C720A5924739EABEB75FA12277C5389166FE5891B484C4F3317B2513FF0EEB +18DE6D8CCF1306FD85C5C19D47C1C36BE1BC73957F8291A641E39877F3ECA3F8 +25A539CD09D32741C725A7F7520B288670AE6DB55BD2879005599744CB54B1BF +8759C7EFFDAF992F557C13CC77A95FB0778628713ACA9A1A4F0F9B5304A2E828 +43F6DE633DC423B4AE3AFACE6D08A2CB7BA7CF2A0AE3D52100A3090637B446B5 +3D69CD48477185434B35884FF9A965BC434A6AED30C26537E14D7F5E27438F5C +CE5A8F4B01B0375092137154A9937719C3D6874C9D1136DC203C1F5811BE4C8C +9E10437D27586D4FD8B4A8146B0C96A4F13FF403188A9EFA26D0974C731CBD7C +143B1AF2EDBD2A87304C5FA205D285D324BD21C1B8CACB4F5AABDCF81186B08C +19A8FCE8F94CED88BFEACF2A6E237BACEDECE38B60D581CCB5B5B5D86DB88486 +0123DB51D12D11E49379765CC5994D16666C886D18A8D44DD3EF0235E14156EB +EB767237EC9A93606E034375048396DAACA3D20F55666D0C1357222572E72404 +163C6F5F398A73ED1395AADF530282D61879A6DEA51473A286EA7F6243CADAE4 +BA9342FBF4A5248C1915590189A4616A3C774304B6E88FDF20930552BCC493F5 +0FA5DF80C3C72608D532F4F5933A225DE0F261A1D33D866417E49DD3C5CAA669 +853AFB20D792FC6BA87A46049621030AC1B7176156B1D2F49A8DB24861C14445 +4E528E2653D4E4F41681655CAF55E57A8C1D27B60ACE5AFCFC0EC8839CD99387 +880E8CBAFA86B397E8E4B6B286A8BB53EB55CDEB3F8A238B15A3C1E5BD457450 +E3DA8794F224C8EEE4A09CA8567A4E71FEADD076E0CE221A4834B817A5F5517B +5FAEFA742EB1CA422822BB178B19225EC5B90387929145F7690A2ABF9043E595 +E67E23C9482385C17038DC83B9AD1EA4B0D5E0E0A9BAF8355EA256808B55366E +FA65F8089A406983191238BDCA8F61C732D99E204CEFCB3F344BF39E240B8457 +5A6204C0257753542985E7AABE35B01B991AE9B4B10E87B3FC44BC3A14479902 +CFA8572E0D255269B7ED30FCFA1023B8A614586C5A2722EBAEB9DB53E87BC93B +BDC9CABB3EA3BD4938893D2C8F2A198042744213F419C5571540E96741435FBF +6AA57E260D84DCBE3A214954028AC1ED4DB2C6DE2DBF14A749647E1641A7863D +B91A9801261731B65BDA550A199941158AD9827527B9D37464B8614438AF6008 +2B285CD83AF213BC6AE6198208BE43540B76165A5D5617C01CA772BBC98F9C30 +52E67F6E25F7192D36A130AC18B71E38D20A724E28C109FEBA4A3F1D677C8B67 +42F22120C99FA00FC0122F18ABCC0D24CC32B09CA42D428508AC63E421F9C0C0 +87D277AD58DADEFDC187ABC7D79F8504DC1113D70D7CEA1B4783AFDA128EA7CD +C7860C3ABEA3BB53D7AD6EA3C116756E282C509058D599FC34B98F7022CEE941 +7108B44C0A6AFD98A6E79109F8685FDA6C2AFAE11BE2478FCD4E14BE04A19DE4 +822906ED944EDB5B532DBEA395A09C7156E45505D43215863F63B635C5A30F6F +C7E316DA9650D9B5EB90F6A45E36F2D2B2CC89E18A246FA7D391A7728D51B18A +D4C92D0E97BC88A78D5F3F5107938BAEAFADBE744EA9B9921177C86435A6475D +5CB3F71FFAE0132E0F288BD509993DBF5C35A5C3B87EAEE7D3ED71B73091562E +45B022CC7FF481142E18A8D98EFE703B4AC8904D275B08E51FA0DBA6C6FF4E11 +0D0334639A04311F6AC5ED7E2FD7E81D573B14DC0A7F5A6720D2F2F235554B8E +7697BA92F17ACDD426E107A266D8DE4F774EE90C8FFE38193882015FB1FB1F77 +DF9779C16BEBDCC6696915D5E977BB40BE17CEFDBF4BB2340B35610F2BD333A7 +E0BBB08338C5BF12BB103756EA1BC94566FBC0F1549DE72DB4404D703DE8D566 +693DC9A8BD6D0679D54FE8FB5AC0934D2336600A1B528E0BED9F18B93F6CD0A1 +9363ED941A02704BE7C8EDB90C7CEEAF5FE0DE83DE1AD9398E42411BDBA8C9FF +266FE82D375FF6B6B6B42E3C72F9D310A3CE90D112F7F0BABAA8FCD3DCBA9870 +91AA07E001EDB3C1B8452EAC75169E0A23C108FF9020C4CA9CF2A0E2A20E53E8 +42146154259263EE4BE01DFD078472363B0481B730FFF03E6B2322009818DF2F +5B7BC17D57A70A9D02A1ECFB9CFAC92B4C43DA454E97EE9AB42FB800F397C403 +785B59D0961536165B7D5CE598913155A75310B331E633AF46A818FA0431F7B5 +E408BBAB437A7B9B47BBC875F8B7B14B7B46A421CAA505B3C6FCE2D6B98FEEFA +BFC8DB0B5182FFE040461498573AFE9ACC85EC4AEDA3FA37086CFD35155115E4 +0F5EC7170E19913DC7EE88132663A1B1C04521A0216C73BBE09605D3D76CDEA0 +53C53126DF96298813CBF9FC2074167A41E9FAF05868D80CB78C1C114473667F +52E8DA719E7427A6F688C5736E59FACD7B86856AF7AEAD82AEB9A3F3B76220E0 +1DB2ED0049230607E78DCA5CE38DA174A9CE4FEFA0EC187DE2020D472889E553 +C988AC4A918C3CEF06EF3BB4EF02C2725D1A9EBA406967F8A4969694E929C1F8 +7D85E82A434C5C5E1C5D9F03AAB7FDD6DA21D3E95B0F6709BA6CCA5F37D6A7EC +58CE5BD8C82FC1A5A1F0B90A6E49F14B04D8BDF6243CEE499B4303B9FC35E853 +1FA4804F9514F966FC5263567396E28A9F605235C797ABAEADA1C71646A2FF24 +2753C6D3A5348441F196294860D44C47DAF1E50B004CF0677CEDBB7FB842B7A4 +90E4E31E85314E9031A665CC3EC0B3F0368567E154A4A6CC206CD8AE3CD45061 +AD67FA9594C4B3FD7BB01C6409D9C5E232323C60566E0C254DFEF45282E75676 +5BA6FBFAE1FEB9477BA7931C2C47F3EC2FA506E7DF6E1D4D7C60530F33F4FEF8 +DBDB65507F002E7DA817695508896578D84E2124748EFACDD527F4190E7C8931 +D7D30D8A7FAB5FFB4F55B8DEDFE2CB84230DDE12C54106FA697E84B320E0D508 +ABD664C7FE500549229636138BF213EB55CB325210895024F8F748E9B8A85AD2 +D5B1E888A503C4BCB2C5BEAFD980C202A0C580848AD9B7088A53AAF4AFE7EA35 +D1F3E05C7D1348ED6EDEF9D477987420E79590D1EB76F33043A6D18644FD3F7E +E65597D5C699447573F37B082DF8D4527780A5B77A7A1C337759614B6B926183 +83B7585A16886CEB3A8EE1622BEAFF917B2397FD7FA803AFAF8F0DC99A0E202D +795B4FE27345F3D275D29AE0A13C258C2EBEE48E5332C0064B1E08F82E2D7094 +705BE9F0BA6CE2ED4E7C34FD707F4DC9B586718D2FFA05108ED8F7623B9A11FA +01D3A755250131A5BC85DE837F8F6E4C56721747A00830395E2274B7116C3845 +EEA1DDF51FF498DF2F143DDDF413870FF42CC4F667802695233C8BCBFFB5BB9F +C416A5AD416CA61832DB67A517345F041A85AD1455D7B8580A04CED89CBC40B9 +6BFD0598668F99616579A960061DDBC5E4EE436730C932D645839848A1A0F5B0 +B8DB725B2D83F436E23B81B04B3154F98DC99032AB08C897DA86C933ED50BCE1 +4A728A52FE09F910F7E47BC3F2DAF8C22DC78DF9EC66C2664782FA94B3B9B56E +49481B999BC60526881A7AEE7DA30EAD63A32F65D3FEED5D8D6CF94BCB618A83 +82EBD5CB11DD9DF1527112E4AB18BA84D3006F0A0E2C2696C6730BE9C8056FA5 +22D5215932558B28D2CA5CCF2EF5075E928DB301202FFAFB2578BB25DFA6B1C3 +20077C418C1840245F73F8E9EA4C473E182A46A33C3CAFDBC0BDB2B67442BD6C +77F2EDE389AA66AEA8E1047FD90830FFC5A53C05A9A5F02361953A9A6365F866 +68D2AFB36867724E5F1E4E15DB55CB82332AD2B50D1F4FF598743A5BD27770D2 +E80178E01635596CC17D1625C55E7BE5C9B23FD330B1CD1AFC3B250A359F47F7 +25E6A837C96953EEDC5A4F3249F50435432A4268710DD9375AF252C2B1A90E67 +92545928DDD1FBC28971A075EF7F17AB44C51D4F5628AFC8F53B1EA0E92BB299 +E50CC983132C0AB98BE00FD6E9E432876859B25B9835185DDF9F88BD9D1045B3 +3498F720E9A146FEE51225A5C72758350B48938E63D92D16EA5E700C48EA5C75 +B493C810D5490EA12FEBB381ABBB5AFC1DBBBE50AEDCF797DDA608D4A4412F20 +4C697DECFA4990F5AF13CB7223442714F907D5C3E41A01CAD4744B346327D7CB +2BC0B1CEBD3E711B8E63A7A28A21905488B6AE388BDEDBA2C4D81DB3E8AB4BEC +105FB9C0A25BC6FF47973AAC6AA236B16D6EFE49EF27BFABBB061535970534E0 +04C6851F5129A7453CB74A1E4285B560ADA3D87305E0EA0BC89F0A6EEB2AC5F9 +14520E6F791AB083DE23866A4A84342D751D8494873F1064DD3CE7B7FEAABCAA +EA808E944DC0311ACFB1DF0DE76EA38DE7E33AC71EB7CC7135D94FCE33FCCCEF +AB068A62E2B9D20DFD65B57E7F436DBACB5E308A8E4502C37BA0E4DF7AB021B5 +33C6C93C8AB613AF3D96D7719E56809453BD1E0900E4AA9F01CABB634D972346 +081AF11A1E665F59E4BD86491205F43A6B21EFF8056478293CE34AE045DD7A57 +6C5C33AC194764C0DF930EDBCB162E093452D15A72934141F683498684C951D0 +733DB2FAAA862A3D7A4CB337366F8793A9B865D70EC280CD084E71484805D5C9 +7823ABCAF00585281C5F0934329F3265E38045E64752B28CFBB668C8077C39E7 +53704F2EBF5A95A8F6879E2135374CCF7A50EBB6DE63372975EC7A83770BDB60 +EE4F9DA3CA3DF1E31E5B489AA62E29B92E90C3D95E2C5D9F285CF3800265D8B6 +ED1822CD6F328059DF29C154ADEE3FB10D56D8600055A823E10D9EBFA3778A5C +BBCA59FE3F40EA37F67515E5F947025F64785F172213045E882BDD672F434B3B +2B4BB66EBF9E85934F3F3794B9B320D1ED0AB3C3B68477A595DAC9536B2E4C47 +E6B7057A96359B57E02F7282F35E9BB1A8F7DB62C9809BB21898B6402903487C +2029C7300384B376346424D99E2CBA82126666335FA8DD0B5225823A733457EC +DBEBC89FA3FD249BCCF746F8434B8E60EDE335D0F515A063260D6C6F0B6F5691 +96CF588D856421AD4561C864E0ACF9FCCD4CFDB4EBC60656D66DA3C1DA212A55 +6B4617DEDA813739C6D3D07669EC10F669711A17B460C00AD47359276CB293D4 +79B41F1CA8CD1129A6313A2253A29DA8C2CF46997F71AF365954F5F612141198 +8DB049ED9F3263D3AACA68FACCED6F24BE3E5A9E602F775A79EF90AD4FB00789 +D60896451A39A34648C7CFF8AF04BA351EFD772CD253BD902AE55EADB42E536A +C1E711854932A03A36D7C3863CAEC28E4FDC836265504FF8406675A625644168 +3FC2038FD2F050F8C23233E0481832BEA328A7FC5C45446EA919DA3ED28F8CD2 +D8D93AF013B006C46E1508AAF9D159C348E04AA3E78119E361A34D67958DD040 +DE1781D010C6F15D890C0EA00496E8ACA9E3440860FFF5AC4FD0507983749142 +F92E2DC5B8082A5DFBC0CE442946ACD947E8127AAB82E5A60176735ABADE226E +8A11D6D40F267030B3415603F18A59BF6F546F5C72DCB84B9810DBA500ACB230 +2105356AF679B3AF478E0B0FCF991FE2F2D046280CEB35647F7C63A7D6ADD948 +D22E8714B263952E07716678B4A94B5A5764C69A6F268CD58285A82AA61BDD7F +3CCD2DF266C35605FF93A95A46C44E93514094592EF43425FE5E1F49206F0551 +DD35636F54BCE90746586FFEF34774E43D2DB09BD6A06733DB1D8648487BCCD3 +F1DF35D24638B081A4F04A41DB88609F63CC2B720F96171360D74DE840EACFDD +36E8D3172BDFD986A3F7EE97DF58B1BE6867C306C5DFBC9F625FF2F9F743A884 +16889BC87FC49247FFA31F3234815B6BBC0599A9463E3AEA983346F55DDF8F8C +A19517241D59B502D099BA9A1A254620F087DD37A20AE13AD23123873798DF22 +F94E28ECD0B0BAA8DFD8896ADED992182F78D35FBB5CA8F95A69984FDB9480E1 +3D524CEA820DADCAF0184A565A18AD4B756A287880ED3125581E4F094C6D4AE5 +3B7C7820C12458DA98A99A97DD7F9587E9352F8AF642133C2F9E2A646B97920D +C9033A1E95F5F8A1EDADC9B6E7ABFD29F9CB8DB9365FC60B50BD8C0506A62EBC +EB8A8050C1ED1A9E0A7F975DEB2BB91EE0340BDF44538E03C102627691BEF28C +4243BB73111382D1F4F2C9D328EDF7674C7CA2BFF1570E52C3034B13E805E75A +DC945433E1222B4A711B6508C26A4C3D0EAE6B81A664CC9024907319AA5E3423 +F9BC4A45A2E2A1330D2D6E6D087ABB22BD7F1006C1E8763BE1338E1C993432E1 +654098913C062B102A53F26F4A730E0756BB4A47FE961EED2A60C6638C1EE93F +75FB104D556413B2314375DB036F4225CF86CDCA28662730E5022B980EBCD6E4 +ED29E615CDE69EE00F5DF937096A53CC303CD9A283950CBCE8BA1DC7592035AD +FB215A6E4D2D343FADBA32EF8B9CF34402B89CDC729DC57F526FE3CD4AD46D1F +295BE9B0D53FF0CB06EFF1919E9BA9019446CB33ABE3DF3ACB7EE9F5E02F9795 +BEF2E808CCC7FF21C9EA41C93E9672C035E37B75AEDEFC6384ADFA52A0762E41 +4557321D665719B7F4E43513C997DD56D526C10641CA654C19C2D35AC8CFC0FD +6946C733A51BE65AE583F186BFAA4C8C112F94A24D33B435C8820F99E1D10F4F +BFDB89537ED95354FA009A4ED9F4E3CFBC93D8FCB674F0E1C2C4716A203389E5 +A38E42C10A4C41EF6E63BC0B7D584A97FA508D4677F037CB1005C90816B90E96 +3B8AD64FC8D63E9DB21B4A8DA53C75F4BAC0137BFE9FD710D1B8E5EE3EF21E46 +4C6AF9F5E4676810CC19F9470FEAAB3D30F409AF9BE1BA0D03229F6F5BE5226B +9471585C007D680F356F1F564D723049644039D1D3CB6124ACBE7C6BEFC36597 +6181E15716F691FCE490CB0F05F4E550AD35CC4D345B2BF4E85982D523BD919C +73A974B806A1C8F78507798B5296D48F8A4B5BBB4D7B736C6ADBFD00D2590D3D +924406CD1BB3C89636C55B1C90B69F51861A654D6683A0966FC413C1CED7CAAD +243262B42908A3A16031EABCBCE4FFD02DFEBA01A0831BD1C8171D93635A1F4A +BAB522D93E4E00BB91F7C18B38EE47C5739C6D215E330BA68DDF5A16BB025E6D +EA4094D60332A289053C0380D456924C548588B9A6F0330D351B95E511E00C1E +8D82BA7509A653A4EAFB2002048632D63B9883AF38567E3AC185A82B7DAF3237 +42DA7EE5A95115E5CE652D507D66073850363DF068282134BBB3928551DB1A18 +8FE10A825C388A73C1F3DB270504626154C4D6A61A750578A107F0BA4780246C +6BE6C4B69611B7F01EDB605B19ECBB7A229300893504F5C32E0A3BD998194390 +5FA3CB3FFAEBAAA2175B85DB4B8EB762BDA274FB322FB39CCC73689232CC0A83 +8E1EFA281735FA00FAA4E955348A595240821D120D0C9ACB6CA8CD9ECA4980C5 +4B547873A58BC840A28592C3E66000CB4D7A28CAB1978083EE2847F2B681EEB5 +2D2D892D32904294C8E139B0FA4581782A244742226CA8911F83C1D7C98A2A92 +6025CBF85E82824CECDD6A9E18445BB815FE21E80DB10E2120D14DE94B453274 +E5F65F6BBDB3146690B0B7FE4BDC1C4CC55754304AB6B61420164A88A76E8541 +4722CFFE8AA2664311FB7565B3F4FD6493CA2A30DDEDF03F5749515DF9214E7E +0B219296F094F92637A427C30F9FB712C3E8F11533CF5C1F077E808AF37E3E39 +94D4B0417212312BEBF1F4F03F95A1799E3AA24352B93B2BA891DD6183DD124B +B9833C82F4BA2B41403233DA8ECCD88842625A8DBF00B5E3E83989273A3F7F01 +DC31FADA68CD56C8B95479B21EBC2A295D76B68437B80DFCE037B3BF87CD2170 +8BAFC158730D3B2F695DD6C701C65011720B3376581D6BC79166EAECFEA6F9E0 +40E62651FC8C72F47B47CB2E36A4E7667B95E82C88E20921A52C76EBBCE06CFB +29AB75D051007EF5BA5EAA35FACBF549A85B3B6F37E3D206F7C8D39C2085E3FA +74D3211EF5E61592ADDA9092C0483B9ADEAD2C64B6778AAA14FB6CC8A4FC6EE1 +82999FE543B0F2DEDD7E442E0BCAD4212F38852D6F2183EF8C3DAC77666AF856 +C410454D9F1CDD07DBBEB1547E6718FB9B79D00A9E3F744071CC75C3F48F8BBC +3F09406F816A86BA4CB0D169E473AA3A62D68785283B8C5862E631A9BA78200E +8718AF68C6215B68675C94B43EA901592FB2B8BBD53BFD835356FF45A200AD55 +3075927ECD06924B6DC3F7FD0C4FA9AE61AE9B1C332E2B996612E8D9F49257B7 +10D8C404213210CC338206109F6A0B5C7A1B9AD18E0979A790498C5BB0BBFE1A +3F3249489FAC00A369470B697344E989099D9377DAF483C93EB7E7420DA436BD +0ABA11777ADBB2716927806D95526AA226E1293E84EF76807953C52B515DB505 +7942B890DFB216807468A84788EC815677FBD55C02CACCDB2654585E42DA9A47 +16C0D5DC9D321C43C5E17EAD6E80DC8F3D11D50976FB342E1D16D2BF5C8CD121 +1DFC079858141F3631526ACF733A23E71C187A6E7933715841AADC7CAF7060A9 +CBAC2B04E33B047684487D4BA94B16A4431374A8867504A4EA338E192532476C +D8EAD70E0CC6BD674A8AC75DC18C4E4C2E785FA52F89EFA5F0EFC6F624F30595 +1436CAF9F1682D2FCECD7AD11429EED4F64D82B51F8E8451802D4885418FC253 +41EC5ED0821E7BCAA89BD70A62D281E90938332744896875AA79038971E778D1 +2E350AD149AF542C44DC36C236272FB12BB8690F689C74736C6888E2884BC0C0 +4E105537BCF3C8F0CE8292BC5C044E2C99665F3247AC9330A516A76420D070D9 +0082116A6A43051DA9AC00B71879F1C9C1D43EE163635E87852088A6D3B77A4B +574265A679334DE35F02698EC7884C8140207187933A36E2C577753E168F61C4 +21E2A3AB436CCA9C0BD7E996BACCB156867A89ED2B8F8DCB6DB9CE8FB870DE91 +4D1CDFA268E5BC6A4AFD1B0890998345F2754045257BF43591473F351B62AA97 +D7307BB7AD7C8DB43A73D5EECC987F34CAB192480F570574227E2224A5CD0A07 +3E2BD0287A3C313EDF5781A4D9E1BF2B2B8DF35CAD3DB80E0C5B3972260BF124 +BD3FC3EA966B57D552DE87822AFC04A46291CA66623FE48F0FADB5DD7CB571F6 +F39F0CDD7F541C9503AF6008B389F3B1FA3743AB1774F0C9FD4EF228D1C0F9DE +E10F5839D69560391FC0AA8EFF9D4B83A970FE1351CF6478E4D91ADA69E3240A +B1B09C1F24ABE2B23CF8D74DE43E3301E60F21A12FFF51D03AC00C2B44F552F4 +0503BD7F3EDAE51A89BDE38ED6A4B16481E457517A7E363CCD3FACB112996A75 +771474432AB0F08DB7F5EA12C3036697CE979D321B7AE1E4A0C1323E05C0C4A0 +13C8F18B2F59A4D396182763B94A855CD4CE21E4923B6B9AB3F7A9127F5F5BCD +3C4550F697B4BE1ED870525BC0EA67F994558375C9E6D28D618E9CD9675CBFE0 +BF24A75A1B90B73079E2C7222B866C89D4D0BD9A041EF0FD603AAA9551A64C2F +EB53C41DF2CAC894B78F8C84510C79F11CDF8518D585A2A5018A55CB8EF9E30F +77DE2200F679F9C3642ED792137130083C0F516C98B6EF34758207B799FADD76 +E0939B3C1AB3AA12543AACC2B9BD2642B0FBF48E0427B64ACA02F1BFDC501413 +83E32E59F705BE89284AD702CB6F9BBB88F223ABE70B4256B8511EEE6E21E048 +148E8B4A7945A5A67D9819B632D86D6FA1CA5E0D040994D8165A5DC175245D68 +42FF80A82575AAB2B91C0472F97FDC8B537201F2E551D18CA39669DFCF0A1586 +370AA32695557CDE598771E158B023404861CC76464E098DC4EE83D9EE9B5250 +FAE90B4E0B2D46BC459D99B706E8740DD701F4C5F5D1DFCF365B261405541665 +B1E532AA3F9F03ECFF018E9FC36BFBBE50589308137B120975F70A3965582260 +1D975C394A11304AB7EB5A1448FC02CA062D2DF50D3611C2C00179501089BAF3 +E57DB91CBD6812C695B0CFD658D3AA7C2C32713B18D420AF945D00850EA7A0BE +B98096A00D9AD0ACD656D4319377700D0BCB6FAE93A54BF27B3976B8353A6261 +E25402861065694F507D81D099BC6E4EA8D851277A8273E6318739D74BBD7344 +5EEECC73CFAA72DC0B7EC2A8794A5DB64BA9D4668E3E9F330DFD7F27CB83ED92 +C0A8480A15DCC3A16B7EABC23C594309845A4595164711333B2FBB9F877D8A9B +426130F95F3D645A3336EF17DA63109B5BCCCD0EA1FD390E6F0DA649F81AFD8A +1973EB6C74F7663D0BAEBBDD9B0738DBFAA9B7657E7B291E803D14F1EF7EB1C6 +B9306C771E3A5AA3AADFE2060D2323A9758412BB6E44B95F82DCAFADDFFD1A6A +7F194B3E4F67279EA49410DDCC1F7DED6C0B34515D5E203BCE36F8755EB1C2B4 +8184AE1B1B570817B73D46D498358C4ABBC349C283DAC96B3FB23D2981E47337 +DCAA2F7C1010AF1C4FE80B7C22C534BE4FDCBBFB4731BF99A369E1E3D6231132 +F5AE9D2A1D701CA8B9F7AD88A5E17BB90C305D6604986C41058C6CDB78CDD043 +CBF6FE9D482363293156C6069C0ADBCDCF3710FC904361FA0CCAA012D3879556 +066E179E09FF5B001B52E838735AAAAFA899E71F2928562DA997133756576127 +CD0FEAB3447B5EA57BE6C32701D248813EA8B93E869F2137F65D5C1A0AE5D5E4 +21393E16DA6FA116864D07D17B1C8F08560DA2532990E2FED66D0E0FFEFAEE49 +55418C41DF71AAE21318D1CFFF5B38C90F7763B278DC825CD31CE53CCE9CC805 +C5A11B3CCE9EFCB43928C1E8482302CD6B66A2CF7CBEA7E98294F7F25C490478 +3080E7121F2ECAEC5F3563BA632F2E2019398B584284DF9EB96666FDF10AB2CD +2D348D416D29200EA47B9F3CB5DA356DB357E0682943F0E5FA543987EEA76020 +F633FC4553F3D4E2FA6B8666374200BA14F12E9384A8099712A2E17916C61934 +317D443E56D8C3B5B11B5ACF389C6DF35125D399D19EDAAA53049E119EB110D4 +201901CF7D967B9BFDE6A5ADACE2222CCD624B6889D3574CE6E94F956198ED5A +0245956F031084B7539141D01C5B66F6DEBC3C4F2E90E7756FCA65708F755E61 +71533842008AF59B1A9AA5372FDDB7D0CA18BE1EC8E399B4787CDFAA931DCBBC +2AE9687D973DA7EB4F2F764B8EC359017E1877F4EF5B81A4A7684F87C4F91BA4 +54644E4C2D45F320A4A58592AFEA5731D47A118C814136EA91A00BADC6946669 +5EC507D7854C1C3AFAD477A1D844A520159FCBA8AD708B522B2FF6FBF55D8A0F +6FD97F7BB4C4F61DEA1237DA3B8E42409936DEDD8EACF155766889931C4A1740 +4C3C646904268114676AF5B0E5E614930B0836BCD5292128779645E2D8743D5B +75D8442A911425C3932B61F14C97EAE0D895B97C957B9C0489D47254A4ED52DA +99F6C27F314E03812E6B45B690890743EDA6CB6410952E4AACF4EDB38CC22C89 +2E569D597B91ED013F696F06BBA6E6549C4B74B0D6DA6C7251E744CAF092EA4B +D3ED88A4E5F8873528792A2549133E25C27A77F074142E38D2CAEFA2D83E7409 +83488D979E5EDBA0AF0EC16BD4D5E27E624765A93DCAFC7911604CD2530F754B +C64F3F70591B8E91B2C28DFB8A4DC3534C6C74206D562DE3567DD3C2AF1DC5CA +52C91FDCC57B08E23D47A3F9E55E1CCE984991AA4701210857FD85A8C2171FAE +6B08136B3A5A1D1B738D0627F2FBF722F64ACD86A083CEF02179FECC90E2E6F5 +3567678D46B877850E30000E2061F68102B8B8E92AF0B9183F250AAE6C1B7992 +6AB521E20196EE31A08892167103257B1A9671CA14DE2079CF8770EDB83BAF9F +53DA650828761D27C50DE9FAD629BCAD28805CE37222CEAB505D9508558FB660 +04D5550F42CA25880E37B395583EB95891942B443DF0B3B8187D5715EA366766 +E59E29DD4BB93A7D0876E35CC891EAA996CEE283EDAB491FCE06AE7B04D5A0DF +31CEDEAC4FA7E7FA52A9DA00067A7D3BE15C0AD2166D5588B879E6019504F633 +95E783463A8C8418659F3ACA7DA1EC997D7A04D09F8D83784702EA9ECB3AE69D +C56A063B59A8FCA9762D3DA187DBDF3DF719778F9D2578163CA01DD9B5B78DA0 +B5D9CF241A4B8ECFA244EE22D3B59BF9ABCE7320DEFADA12D442EAC7AECA3B40 +8EE795F3909C603B80DA8F2C1DD9441F84F9A41273ACF33D03F111FD78259500 +9BBBA8C3F021C09AD376B170C1C5FDCE2F8882593219D3955D73C0F9827A0A00 +262B4D50A92969469C1A3399F8580B67BA618D99947CC2D6001749FF6E90B2CC +07617E54B52DC6C952B5CBB975CEFEA8E4FAEA7BC4B019BCEEF05729FA72E585 +001AF774F0F62C33C0D9C085AB8952CD7C05F0C4B63DC1C1C2EB91DCEB7A503F +F0627C145467F95C8E9DD49FF2E8513A3691B4EA94A96F90774B839E6A7150E6 +842331ED976434BDFFA7526B4D3B4204BFC3C550B68F8EC23C735D3C23F97796 +4F07C86CD3E76AB44A4883B21A75A70E7C10404E6EF46719B9D00772E515BB65 +7B28F43986A8BA067C6686E4BD54EFF94038750976D74D74833CF394D6ACCB7B +40173D0B70757EBEF5FB4D30C487AD7839EEF48E78C4550FAE0F1DE33D6A472D +CD3031B2A3DFB0D743BA0FF56F6BE3E0EFF3A7471A74A1F55F4F4C1998BAC995 +3B5B456934344CE6D634E1F2D7D12523D1EA8720A55D5034D99543A80AFFB0C5 +D352E32A35DDD0320956D21442B3A6E82E83D81CAA47043944FD10CE1B505B97 +D6466083F1F5C6DC2B2929783F12658766898848C1442487D0091BF263CCD603 +52F2B00878D567075D442BD8731ABCF5D2C83F36A0F9A1E6513774501213BDB3 +CD17CAA600F19DF66E0CE30233080DC6DC9D554D95FDD1AA2BD681D1C992AC48 +329206615E6CE9EB6DE557FAD1B93BCE7E629962E42E542996231E4F5DBB96F3 +C98983D0F5AA6A21279618F524DB66C8863937BF8ACF9EE54C403A7E4F939388 +76F64E7201FE28C37D3745B817F282D9F85FC68693EC7532EC329DB55D4E69DE +30F7515684E7F0D0EC089DE4784617BAFA338B369BE06ADD099DD7EAA13AE100 +6A36A3E098E41ED121FE71C1958477B1B592B32F9A772BB15A8CBE00C2CEF494 +4984A9C5C590BC158EE52960D641FBE2FC2F8D5D47E753F67C9581811A51E4F9 +9A4EA2F413DF149256CCC0F0F3A31207E8E3129A0E3B26A0775DF6FBD0DEE987 +3D30C1F5186B4E26F574B0CFEB2DCBF60DF97E82AFF543A366F9DD6696851741 +AD6AB8351D633BE824CBEBBA9C5A98AE6F1E23B9587F171AAFB43611DC5BDF76 +2BD293B37EF19137CE825A6B8F6413A22ED5E46BB4C922AD40E2650A6B4D2277 +47281F7265F3ADB31C432B7A6B88489D10331A923B403310BC0BA06B85F48785 +72D3259E3737071BE8A118D9549F3479A928FEC0116DA2B41D12BC958D0918D4 +4A8C9CF30FEA2149B200FDFD03B4D0CB0F148E89C344B90C59936A4E7E290654 +81B2444128E79E3D5C8B8A4A4BEB8921C504050F4177959B25F33FD25744080B +4F05595644171EA0FCBBE047F31BE2976FFC586B38B9982CBF76E2A67C8C50CD +3C594701C91398605EF946D3FBD80B96ECB679CF5894525BFDB39690431FE060 +60689DF26CA49C37041EA77CA90E89EF6E78C4BAD0F4ABF33626ACD029FE4809 +C409AE68C321A594E19A081D4835A538B63FE0B7AF8EE3B68F34E2F7976D4EAB +B865510896B0133C287A3B8FAB4FE04E9A9BAC9865A705EBEAE689D0736D39BC +5181AF6B84701CDCB7176BB0F9107FF547299AA8B8C8E8058D6B7805F084CA22 +CE4FB9F8A520835695A71D733CD28991F6158DCD0C43A09314BF520BC86BBF2D +179F0AAD7E934A586F31A196F2A0718B30983D13F8DEF42C59B7F2FB0F8EB3A1 +F8B519E9B9CD59E18B3D5240F9EFC306BBEC014FC566445BD8B76E5AF0252FEA +372DDD3DAB04E6D574FB30653EF31F7D2CF6B6F3DFE397D84DFAB299B7983BCB +8210FD423D64A0BDB250DADE971A61D08B78EDC48C167C579B8926C60081EA8D +9BE64490D5A6CE67CDABBF06041AB535A21380D43ADACD1B5C62664BA44FAF70 +1CD47EAD956DECAC0115273386EA8F78B268DA881EC845EEE5F3FA5B39B0A258 +E475B58AA506B250DBAA66059F7F420E3686FFD482CC9AEA884CB9DB881B4210 +A41BA3023BE3F62F42744379A82B140130FD6037773E62E4ED9AA6DB831B23D6 +672115DF51AD99C61696594E9750E3F9D73B215345A1EC45FE47F8984C4ED919 +B09A00582B00E72E38D602F5285C7F266D95AD1FC045E63BF653C8E781AE40BE +84271632E81777B0FFE8AC6C53CEA0C785E4440D84216D2EE98D8A589278E06D +FC7B5AD41D3DAD85FB465F63D773899CE58DB1991E71F15FEDE9183743F20933 +3CFC0EAF71B9711022D5AF0030016F28D7D5651975C5ED9EFCC7CEF436464F29 +39332330A92D8F8225475BA5CB2A6FBABBA28930BF747396C2F2DC0542BCBC3B +98ACAE77991DCA7C81A3EE50E03555E9578D516C511FCF7682C5203CA9E83F83 +ABB3D68231F4F3445F8AAA41642C47E1400C48322E4276400D9CAE1A62213F4D +55B854C7C255D24FFE8B20F3C67E796C7E8146330E43167FBC56434E40167A5F +9B8A9273FF702A4F2A48B85874D309DB3B4824692E756981D7E53AFF26A1558F +5D7BE49021311B18D34636D3C2572F3B0859014DEE1519D5FC47642A08FD5B7A +CCB41475ACFA477D496C491739D4F32B6239E220A742EF9479A6C09FDABD580E +E172FE89856018DA055DBE38097073833FDC90D9416B81B3B397C38ECB092D1F +98831F1463319D89E2F978CD9F7554E6074FE7B1712560C5BEF1C7E1EA5816D0 +B10C7309A4D7C13F2F5D88A0786D283975F98A4CB847B51EAA2E65A2E822AE1D +1FF5C49B42711E1BF49ED933E1485717EDB08612C7B86B05DEF387C2B2951610 +626DB79C36F8CB5181768B4C297A5FE8D73EB470594CEE2D0B12659D9249D1C3 +70E9B0E02C5B74D16021F039173A98507B189ECF34E4C17F982738B9B48CF9D2 +2CA18E2405D929A1F0E75094956689D7B9407CE9A8B392E1E4212FDA5810FB81 +E66BD56AC62D271947D981A459D0DA12E0FC520A54C7369AFFC40F698BBAC99D +2128405FAC517E8E273869809965D208642C73531F4C670BCDF69847ADC008FF +087487565C3353749DF7368566850EBB3E06B9C79D27E7792E48ABA5DAD5967C +D3F5FD33DE4A39DBCFB1AFB37DFEC440165A03CD0F9A0B0D72ED78A56A6A6C78 +CF1E06EF1F4416F01576045A26722A346795FD4D4D76AB3A19660018B26C86B0 +F45D403864D6EDBE6231764590EFA528FB31BA9ACE331D3EEBE9871F209336A3 +935E8842954CADAF5386325C4BF2A87969FAB335E9FF3704929E0D0D5BBA1D59 +795A5328AA2CC4FB411C0B5898C092B1911334948BA2109432AA5045264EA67F +5126164BC3FD96EDC09A44809091872EFF39CA0EA66EAAAC6314C61B505141FE +A631F8B5862B04B1A4DE1DCF607286B2A3987922E0CFAC1D88FEEA2D2C027C7A +121F76F9433E5314BC554360874933FD7AED268986B789FFBD6D6535772134A4 +52B2930E0207B273C98BF26A0F6515A4B42F39A4935E10F1BFED78D292DAB6B5 +105A43E5AB00181A6E3F035B28C5C3BAC2B6E9E6B495C08910101E47AF030DE4 +70208324CCE7E0421173166BB245B544B9BD102374B67D02E99FBA474E9C96FA +963CF1B714340AA83F9AD5AF75B468A6DAD13E1F7420ACB51B0096EAB900C4B5 +2AC1D2866B273BF011E2C7C07F6FCBF0AC334A8A389D0F351D3C74D403EF66D9 +39DCB12D7DACA0F5EDC39F2FD220CEEFFF2E1B9617F305CDE3E740C066A0166D +EA8B7E08FD185D048CBAEC8EF574F59FB4F80DC8382AB91F56388F586D7C4B4C +3823847086B9EC3CD99DB118DC89066090B20756EF990678BAEF4498694C0884 +FB309CF7A22CFB79BBE1D4064021A647A957B773052A0CD872AFABF04478516C +97F76772B6F511FC2EB58980103DA0FEB32E61D0C83FED84B967CE31C5F19D85 +A566ED750CEB9C8BC798CDD9F0138BD650943137394BCCFCD97EF2DFC435B337 +4F45AF417F9388037B4C5FB681F5E11F3BAD9450632E1C2DCFB263EA3ECAE66F +AB78AEA057C18ACFC12098E0DD71D16EE1794904252BC427298F69D9FEA435A2 +F00A5BD09DF5C57254EA62FB77B0248873AB68DB7A60413A96F53850EC693B1F +C5D2BBDFB6B197500C2CC5F35597D452A501E812C102F8C235542FB2E78278D0 +E1C1D0C96CAF2628B54C98E3F32DB8D62CBA3441A63945A250EC21C4BB97CBA5 +4A80F71E30CBD8D974EB3FDD3ED45EB008ED54D76BD01766FCAA8F6753402C07 +EF04B9B2308F66D56CEB917E0848C72ED4B1E290BF4A6FE7728CF68A23F6EA17 +3FF37E5F9574645DBED15C540C0DBA3C61E9C02697329BA57C29F3D28B5D76E9 +9EBA8F527DFEC6C96CF090804EFFB25E1458FC5897CB9E269BF2FF6880222F28 +1988909D794620E260521B65CBC1C495DB903F916F50D15F36034506E0838CF1 +D741CA25C5C2B68679A056F03F65C842BD628A2AE8D73203876665372DE0B048 +C2FFC030F600E500B5699A7CF7E9DEA818A5653700143FBEB970F2D51DF32730 +FAA372EFAEA1A4E15E6C2096AAAA5AE7DA3D9C05FB11F83E853763DE89AB47FB +89411C369F036A03D881664AF026D76B52742B74F6DA12469E8D560D3C2E2BDA +3357A562201416BAD3F046BBBF27A5ED52C606C96CF2FBE7236F0D76E10097E3 +03ED4F6A70BACB2E52F00C260C61B66040946AC7A5B4866C61501A883897512E +FAFAA687ED471B7CCFF704B4674CBC082B07179B30F0A78459B6D23A16C49C07 +BEDA6A23F17F25F1166EDEE0B17F43AF8D897DDBD715B9D9FB540949EB3FB4B9 +8B749FB156374E73FD7EBD72EC9C4FBE54E24F17AAEF29B1E846A42C84D3A1CF +27E2E59BE76B3A8828A1EE70887CEA3DF74A7C7DE9A239CCC9E9770740E16E87 +84EDFDEA5B34168384C0F429178B7AACAE1D37A731AE1629F8971811F032A2F7 +A88C26E73311F6BCEC83FFC99B01DE9BC5FF9F34999DBB568199CF8EF8836704 +192CD77B452622002C3DDF0D5BB06FE822B0583E00A425D85A4B29633B1DF56D +9F5F7CCC9AF8C4333AAB65841CC7A4FEFBD07ABF367D0E691E22384362F43AC1 +4EF4FE416F8FB32F29EDB2A20BAC9D285D78F8DC79F7677DCD002E4A30C98DEE +4AD9EA0B00AD161BDA8B6C19922E9840B3C2E96CAC90369FF71A3E5311A4334B +10F53F90109B6C218EE7B8D23A95A766DE4D4541ADFCB4A488D8F913F9D07D35 +2B303F2518E0BE70549BA0F0D8D33EBA0CF23C610FAFE29C1302D7FD008972B0 +D8E9DFD0DA84C8CEAB1B160056C2B69F7EDDDB93B069C8E4378C7777696A7ADE +9DFD45125F9609D8403F72905B73B813F320B6AF2C9D62532328C65FA25FA75B +9B57A65347488BCB948FCE4E3843E9A195F5D6CC1FC91CC9D474AFA91BDB9F0D +457D08F869F21A78800D1744957848AB12982157748ACDB74814C05F40C5C630 +171553B9A547AB9650509B4C8A02740182C0E902120721DDEC1EAB1AF4F9EB81 +2EB8B93EBF9875D368D11696BC7AC7631C0C357E4E90F121B58009626C101972 +BC86C45D2444AECDF6C734A9D14CBF243777B970247A6587AA078EB820DD9131 +2D729B6B7BC569A444460BA522284509F8F5A70BF465F20EA91733A07648AC0E +D7630DB0AF9FCF9FEBD09D8847C8CC6CF63424A784937F00594D311AEC11B55E +8AC43A2FDC85DB70DE025FFE25F1D314CF06847BF2DF90EC2F78116EC8583A3E +52D8B8F0C8EEB01DE18B3F288710FB14DD0E10A8A4E7704662CEB3CE6E856FE8 +21AA289801B84CEDC7FCBF815D2852247C8D06922F8FA940B93421F256CE37F0 +441F8095E1A3481AD60771C65113C61D844E489725EA5B34501709463897CB5F +B01CAAA3BE5109B4A49E +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l048016t.pfa b/ogclient/lib/fonts/l048016t.pfa new file mode 100644 index 0000000..a14e724 --- /dev/null +++ b/ogclient/lib/fonts/l048016t.pfa @@ -0,0 +1,1269 @@ +%!PS-AdobeFont-1.0: LuxiSans-Bold 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Sans Bold) readonly def +/FamilyName (Luxi Sans) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -39 def +/UnderlineThickness 78 def +end readonly def +/FontName /LuxiSans-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-224 -211 989 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078988 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D830D512B6FF3BE2CC450E +1D74C05D938346D8713E75C290B6906D919052118C8C44FE8218A20F8704A3AA +2AFD1790F3C31C39A443F7CB470E4FF7E05E8069552396C1CFACCDDC1C77FED8 +D4E7A947701898A3E50351EFEB35877FA44F29F04D5E5DCD51D55B1166E650E9 +6DD6DDEB0B5A4C018BCCE2D2FB26C42058026C5EDBB9FB634954094EB160B402 +CEF86BE7ABA16B63A88F1FA3A87A267C8AFD876E1910185D01FF64026182F83B +5D30CB5CEE202C27B727DF2E31EEB447AEB941B2FCAA382353FEDF664D72D31C +0C3D1FFEFEC97E0F0DE0352DE4DCD8F4878D9F677F89747B330FC1582796AE19 +B79B28EA2B74ACA2C127E3B4A3ED23A57F4A48260D2A401F4668E48BADD96502 +E7F1239E705F21FBC7C4FEEFA3F9F938850077D029227236D0D4F3E1FA17958F +36E21AF35E8C937E6D0F988233C8438BAB6019020698D80B9C37EF035238364C +E57BC9ADFA77D4084795CFA6A236CF1E0DB7095F4361AC525DAD39DBBD9D3D32 +08AF35AA38CEC79C2BCEC3B3AD52C93D4F14D25535A391290532BCBA80A9EF67 +0387B566C065825FA04BF4998AEA0942AB50727D74038FB6B602BF5B78C4CAF3 +75F946BBBAE55C32E858AAAB72F9BA53CE6725835E5654791953D26F7DC5EFB5 +5064F3DA56BE3C0A7E6BDB57D59843B0AEC11922A53B1243479DB95B43422F05 +95A1515EF0165589E6D74398C0D2C9BEB6E516304A4AFC8F76161A074969107C +48FBDF8EF6BF7EACB8CCBC18D39ADC605A56A048CBAA3828854D358D473A66AA +DAEBB2FA045514C5AA1B99A174B2E8148ACFAA807038B0A8751EC028E89CEC7F +6D30099DDBB811888C900488E09DCA1D60BB398DAC1BB2A39FAD166B6444C182 +8E8993777B38A3EF591FFDAB9BDD2966BAE15327808E560AFEB82941B65E7B3C +49B3C59330E2BA07204301F845E32EB608E12204EB511C09D06AFCC2BACD0654 +8B70A1A15916CD5CF40B633F3626B85366E1DD3545D14D71B21184CED78AAD6D +A7B16AE3BD38FADDDABB38EA2BDA49EDC3926B1526C57D9631A664E872610478 +84D1DD1A3E6CA785B5630C31ED8EF22BBFA07286E8E446F1DBC37FF4A4925A99 +DDAABEB0BAAA3DF5E60C3ABDE27C49F5483FF1C9C3358D3F1A37C2DA1A4A53A9 +F4DE466B3375BCBCAB491663DC09CF549A191B4E53B533D4DCC3D65F0AEC3E95 +15CE5CFED746E12CCA4663FF4B93B36914A7688F13BED3A7A4B62F272199B8D1 +01CC86E75715BEE99940BD3B54DD82F8F3C3BD993723E0F032A89A46E40D4187 +EDCC579654DB07E4ACEAB6C1031B35466250647F37A36B1FD73CDBCD9ED005AE +855D6AC8C5560B7F498FA3DA42D510AB98D922C364410F36D3AC8F27F0CB185D +004AD2B98D3AC972C91E47BBE1C2766F2A3480176645B2F405589F151719DFD3 +7E40DF255EB133FE40C48966D61B175C9C1C422D654DF914AA78E6139E2EB05B +D3F4DB9CCE46D7FB174B210C45D7E60B2DB14145DCAF2B5013C53BC002762DD6 +DC0791C4FB9031CFD24C2236AA61AAAD8AD8BCD9045EADAC9CB6E6DBA94BF817 +C78C0C686A7EBBF7B37BCBD484393F5D53EFC93485C0FBF6331F3A5D0A0AEEBA +23BFE63E49B48245557B7C88B478FCCC333CC083D9D5F0CC2335D5D908413AA4 +8F690E81E40BBB674F7E2E37F37DCF5EF9DC6D7CEA3F7CBA27FE86AB62F65F36 +B2F0996F7F1A33BA903243ECFDCAC2756E95C19E4718AE188CC7384BACBB2200 +ACA8A513F352B241EDB68CCD6A74273F5204CC22D722A00F9930E874515872FF +2244342917B787EAB3341439041E3C83667441D2CC74FB58195E474A55442280 +75BA96B201E789EF394C54AA51D2E55EE43257442880FCE2676A7EF904B01921 +74C50502863BD66DAAE2381309F33A3DC0F055EDCF96B2B6C9ECE80F151708AA +750A0F2BCEBB3ED6E586340D9DB7E78BFA775366070A9E7EDA869815A4AC7B17 +3F139533B2F721832B5E846AEADC4E952C709B3F6DC3185A913D0820EE1933BB +0B4AE2A6AEFD68C99B7AAF6B11D8F012EB816781A8A0A99C2EC174B0B6869F2E +3D373E1CBB2EB3FFCA74B5A3B1667ED301AD1380A02DE73F258D2B99B81D7AD6 +00AA0E604200A17BE9AB1403086BB55B80E6B693B64C48A7AE2217ACB82FBE70 +3EC1F87AC9FB2B637D7D943EF4C4F6A49AF445A76A1BDF21F67493075AB227B1 +F36A743201A64A3797EA6539AA99A864A57DF2B651C3A77915A6BAB4B17E191B +576C80E4023A77559305C25CC0D75E6BDF287298EA30D2E916F97ABF092CCEE4 +FDAAED0926B95AC5090C01ECE24D507ECAAE990D7808F294BDC0DAF5E74341B8 +3B9406A60C3CD4054DE11CBA95BC1C4F57531636628524311AF3018649CEA3D2 +1174EA1EF50985964346A8AAFBB7A38EBC9F01192D741665FB01CAD36BC34457 +B0E2AE912666E96B6E4F61160966AA3E2B051CD61584D9DA998FF702FE01410A +62DAAB390155A045DF241FC47FE824E49A5E96D3BB3D354DEFF8F21498FC4F8B +8906C6A7E3CC692EA39013DEBE53EA53780AB6FF1CEEF8A2D2C2930DDCD31398 +6CE78CBC84EDFF1B9C0C1B6DD756AA5B53B83BBB765E88A8A0ACA6938021139F +881FC91A4FF6F1AE7B2BC81AD0068835D69B465196625EC7F1A5D19141240C95 +F95245DACCB2E0D527B37B8477CA62E9933CDA5FD82BF6BFBFCDEE5D82F07797 +3F2ED2D86C8950A8D4F2769579F25961EB3499A002E40B3385C9628BA50C7556 +693AE13A9FE9921E3C712BAAF060CCB0AA4CE5F70A9C473CA0A5F53CA25E6761 +D269D13235377380380290BF10467C2A726C096D4FC98BF402E498D91F4C2ADA +A0DC3B235BB50BFB85FFD5252A9727C174AC924DD4B086AD6BA76B37FE0C9C0B +C44CF99D67C9DA1F97158C69D689BD6B0D313ABB5F8BC62AED5787B33749C569 +A0FF5A740C6B51371CAE44B9F9A516C06341FD0A530ECCA6BA769D016E3E51BA +016AB1C7E5B4A4C0AECBD0B743C97025C20D021A92E079B6F051138E5945EC72 +AB5CC8435892A5DCD78EBBDE078033E866859BF0F2368FDDBBAB67AF17B943AF +A1D72B7E72AF6D5AF10ABA4350B627464441DDE21D458E1789635D18E3A51A9F +6A97B5F73F7FAB11B0684C33FBE0227A67720F748C99C9FBF849508C9670CD04 +61BEF83CB62342C4215BA40968213B2BC35E4775218EF4843C39EDD64D2DD648 +462A625DEE03561D0688198DFCB24300DAA7348E9A2A3B7C3FF2119F3801BC1C +450B23D9DE355A31FE26641EAC1C24DC1D452FD17A0DF9DE3016EED76ECDA07A +96BBE3DFDB475675473851E0B6FC5784C065C1A49C88B9EABED14DE2329C139D +8E62A5B152AFDD0E5925969881DBD1E11AA9AAA8FFB179789B6086B89FE4BB84 +736F63C2D2544A636A804D2FD6773B6B760E1493D342E1CB9693AEDE902D3ACF +9765253D70A82D40BF2A300C7FC3C90C5A164F5BE083FB587B9910DDB220EE92 +D962E3B41F1D1D4517CDE42A1B31E1EC802220E487556F5DAFB74F7435C6798F +D300019AA3460321482DD5FE5A0E513AB83021809BE7D502FC1CF70A03315BB7 +DFC2D92D57D026180E03E2F93223A2572FACCAC6E115E84341D155B11B15CC8C +91A58C0F13FBB809BCF649BFA631D8F39C3E4930315D11E95241EB5C6D7179F0 +89254794EEC311CE2003EAE64E7AF47565AD3670753FDBA67806B8AEB8342092 +6C4455FE7FCB11CC99DE5747F1AB6C5E53B805BE44AD49B58B71FCE5E406FFA5 +CBDD6049906397B512151A5ADCBF89DCCEECD0BCF2E42EAF31D07147F459F299 +DF8CAE98460EBEBB371D8C04A7EE3D30EB34E73EAD6CEC8E569C344A4DCBADD2 +9BF49F036E25A722A0D94DA58DA12813A4900BC32E5BF7847FBBCFBB7C78E034 +6D5B6D4C951A74639BF257B122C698114A842431D3B7630C585BF5B4B943A83C +09101C02EF689C8D2CD6DFBF459F0DA464320B7D2993EA5F9CDDA1915966D490 +1871C1537EBB120D16F8BEF6ABA64C72FB1DACC1299174432D59368220EB2EC5 +79B2F9F355F77959D5919815A90AA9C4A0BC87D40A06D860BA9B4BCD89708A65 +EFA0063378FC3EFBFD13003BD1E656A697F3C05FC6CE231015DFDAF48378546F +CB5442A206740766A972CA9B08151D29C70702EFDE0EB1187C1B15AAF948E994 +006F532E9227C04AD44EE22FCA8450D745DB2DD5CCA57AADFBDF081D21EEAE5F +6FA39642F58E8E669262630123488394D37C47FB8110D90521CB3F100873E7F3 +BF89A26B6A51122215E1647ED6BC3604A5B8FE349CBCED5D0C98E7E50DD9975D +8214D3D164A3079DC1E702E8B88704ECBB8E015293E7D5AD7EE5F30BE8C79FE8 +C1E98BAC278DC577CDD159DF88DF799B7B5A48FA9672AEBCA7B54935B204873B +3AE4272A4F4A578C85F3B62B45D19F2475D76A7581FCDF7C6046442ADC2E2602 +B456F96C1526CF436E2470D0D8C83FAC1DAED4536304C5975AD70861C56DFFB4 +39D09D5302B0AC6F33FFAB5F43D465A85D4403EF8FDE2ABB552472FC810D8660 +4C88A1A7C7EF6CF3E6B2D843F72873D43716FC3C52CEB6718F0E714B66B83DDB +B8824156A1EB779ABEB6DE745D2AE5615F565F5A1155EA0A8D2FEE3D9D0EF1A1 +07D5FE36091FFBC8B5CC09733D25C1E872925EACB084C30ED44470FA44C3B89C +7255A46BA16DA37F4E1362A200BE49BA9386B8DBB0C54F3DC801351C083C986A +B15AF96A717DFAE03A391DFDD7F812BB6566B6F3A4F663581B76C138E9372D34 +B3A1925EC8B59A3563124CA92456B79DC0B52613EEEDF3A719B8FBD44D873F9A +9A4053F77E37143B2E5822C7971C9D6CE4129C64504D5D857F907ECFE27729FC +3D3D7CCCE919E50E11BB62E3596A247F5377C8BD41BEF51197374ECCAFD3182C +D07F7A931D0D0B17C956D8BAFF218BFEC60997D00207642C52461F48E9B66B41 +2DEDC7D90051CE288CAC0A8382CB3FDCD11C1EC3B74515A7E6CB157F7B2E2CEC +E5A664011AD2D240BACA4496ADBB2351673E0DC78B3F9618AB412D04AA75CC24 +462D5A925799EB85598559B6E4194273BFB2F461FA5FE3165B5D49620E4AE070 +7F45CC85AF3BBC554E9281C99A601789010A990962BD8727D38164A16794E19B +C62AAFB909CBAA7CA55A17080ADA886EDF6E38D09AA4E6418E8111B33CFA14BD +0D71127D8F95D03FF4C8E247FB19BC9D0F33E50B7C1C8F0CAC0AF3A8A62E9521 +E2292ECA00E69D6C6F94FF7564C62382B1A8497560131D9C8377024A8D629BCF +B04005423D59F2494362AC97BE736AFF562A591454207B1AD52B060987E5018D +7A2A17F790C0854F19BA9FB95F04FAA769B954FDB5A1A5783456B42845357E11 +81DE026B170DD8EAB0B9A782A6FF7926DC23910800D83B169D498A8F3F2B9BB6 +5C30054793B82EEE43F9055CB214C8377E94A020B9098842B94BCADC8C921055 +B1B60536E6BD12554FC5A56B1AE7F96F7547837F6F46AD232D7E0BE2A62EBA1A +87C74C44047149CB00ABDEC136FE5CC1A90DE011C80C87C9AA7431C656EAF1C2 +A9CA320D197746BBFE55603A34CD3AD42776139CD1E155EBF3B3BB64AC91EC73 +FC0E23A13DB317753789E3BF98561A21676DD91B6BF3715E88D9ED98A8E5EA32 +E54A7D84390087ADAEEC3BE995D19B43C9635EB8BD6D13A46019762699E5648D +DCD8331CDDA187AE4D917308B7DFD30E6162CF927F3C2AE9666C8DCD8FAFC272 +ED1E75FB3EEF0527935B9C1DFB055F057C998E560B6598F1972A8829E57AE99C +9D3389EDF9A7A8A3A43EE4713357396C62A27401EBBF540AB2A29D50C1DFC3E4 +4012F882A6089D57D97BC2C5DE19A81B1DB98EC4E8D58C547A5D131B84341CD8 +9CEBAEDF1165E8FAF604F0290892B813242B6584BFCCD68BF3F01995BD89BAAB +7C7B8AC166F5F78AA84659A45D1EF4FF658136CAB8627405EB36907CCE200B0E +3A36E0593B40FC3CCE029881B0329ABB1A948F5191750478F46A03C3CACC480F +070ACAE4B6C06A911E88D649D297907DD631916E60603CA49F35A2B3C8D478C6 +9F1C187C315A859AC464ED353F09C964BC171580257A31EFFF445950E2EB6106 +7EC224409386B3CC2BA0819B6CF9C895586B23E740C7EF1A1814A26117C868C9 +FE8A5FE3A8DB9F53165E0C62CCEF9F3735EC18C31E0C7C743B0DBEE893DB723F +D1514A59713B273D4C9395235A126BB9155B14C9F47E20B8FA8880C717D756CF +CEB12CC6C82FA5D3F4CC91A39BA398B920B5CBBA3B55E02359FCD284DCC3DBB1 +63DA4BA07C38E3E9E64BF24E74B62A6DE5F1521D4A1DC6657EA507E56207726E +08C5AF790CC07D908750D852A0916861B8E67D78CF8ADDF16CF9BC6322274AD3 +8101E46FA56CFFC505B3D6C20920F13D8B40CDE364D8FA91E7357E5FB218A3CE +40F84B5E537D90290154C68256015C5B8BBDDB702DCAC1FFB105AE9CCE0A65FB +EF43BE91E7737533349E0F6D227B30E52D41D2E73EA55F52D1A065B1669F97C2 +0B4B1C2184C4161820220A52E85D3A0EDCCB2A5BFA3B406A2F675D0E272E41C4 +E6293BE2CF58E8536B0AD6087E5A89DEDC6C93F981B61AD9E91ABD1E4B2DD4F7 +5F909701A0EBEC140EB7840D69F2428045CD604A590F47821CA8D51DE41E07E6 +C69D97C54D21A64CCF2E914D4AD2C444C129D767B285EDFD21F8A1256CD18D3C +3E5DCD834B3EB61B39FAD0579921459A1D6D52632A7CE0DE74D2FEC0A91E7FB2 +AB4C61CD334B66B27263BF8FA80456825DEC46D7144CE5888A73F545905F5B51 +0AB1C1D8FC967B23741C9139C2497899A500A0F568BB22272D360267AE36BFDC +37022427D27F6A5AB5CA408E2E925339DCF18DD3663A2C088943A59B703F6BCD +B4DFF736DB3EE64B31F93BF8E8E04C51231E453A4264DD5CB3EDE03EFDE84C6E +EA04803556B2323197F4F0EFF3B4CADB6F645DBD3A80E094DF41DA69E7DE2230 +FA155A5731DFB74212F26391BCEF10568C12F3B63ED608555E29356A31DA7E03 +6630A630BA93CA08FA4B2CD93425B6B1B166E64759051117A5CA57375A175B58 +88CAFFF8058A6620717E3FE9B0B3199E201B99E29F709C9A1BF56E775F295EDD +FC347391E56FAF1A620F41FA2954AE8516A8E7FDA373B6B3318FCA7B050474FF +5043E3C1F6C2ED6B6393CCDD3EA31307CE63487EC58B0EBEE57B7FE38A797E32 +FC1D5CEEA4194031848930C172D98526455C6F7C97350B893EF62AA17684E675 +48FE4AF909D9D42CC82B801B19777D99ADD0CD6CF454A42AC60B6D973441E4B2 +EACBFFFA2980779B87FB9DD3FDE5DF16BE1B67AA40A382EE0A5EFB6BEEC313C7 +313CFE4522CA12401C2236D6BEE454693A7AE8275633D580CB578E4EC4B5909F +E549B79860EB0381B8B2C60A8B729F231FF0BE0595747A6934D70274FFD50E31 +ED10F8B9B998956B9B7145313D667336D28C65DE14B92B5DEEB935200390211B +A871FD3910636BFF0F9F3D932C77C412343DBB318F1C1863A71B0321D8C3BAF9 +8C8A851E1B210C3AAB8E4E92A7CB4743FDEBED828B8B40C18588BFA45C4972D7 +E25707F2C8F0F295D08E9D56C6C565467C088FDBEEB4185AC9503A87A3D0203E +6913E3196A1061E4D788BB04A481D513ACBA92D5C024B51F5C974B14198E9C95 +564CB28A446A2D5E9EB79BD08DFF005D23E80C68B59D97B4B8B9D407885FF333 +B19B30DF7582E296838D7D68823896EE44C2E82D136840E72FC34CE6F718A07E +E880A2957A3B516FA90BEEC49AB0BF5626609752BADBBF836E38E066339A2D0E +8392B31B7A0F2B8256311727BDEC7102D7227584CD8F96FB0F218E7AC4B3B407 +61F6D338D99C1F315D53FA5176BE6563437533439020C2D967F0BFA4013DB08D +678445D75A980B2456241EA5E20151D12B5E9E573FFEA0432EE3C55AD16E8C2B +251F17F3AA1916A5F4FB99ECF340AC0770A763927BA3D5A03D777C84596FC8F4 +FEB2C582705B8A4A50E6348522DD166437DDB2BA6B029637DC0A189208FC51DD +1CFFD1409F17A5B6978D776439D702691A79412B6114A9EAD17B2776A791AA89 +9CB426B20F18F45093EE66A86CFE232A2A9B979074D2D77FA0EAD9BE8A7C731A +E38675C5E1D1FBF36AD4440D616817BD48C294E387F171FAE366474924E09855 +9839690F0D2BC32A0FEFF7E0A5D77C22BD692C9EA0557ADA09044AE6069475B8 +9D58EB7041A9C9A4CE8482ADCB3CCE1CDDCF21D842C619813D830ECF67B0CA67 +80E5B5CEAA3219E7D3055663F34D9BC549FBB66B199F36D4C033B74EC374CDBE +6EDB97CF2ECC5FACF8A68D9A8514D49014716D5920A30E85908E232A8D8ADC5E +4306F54550CD95ACD81AD9A997F0D518A14FCAD5997C892B54354CCB94BD7256 +7AA5FCC78175EEA5E30FC5AFB22CC1EDC499303058D767BF038273E6E3FBE028 +D514C87AA9A57EB739DF5C60D943FD5F13BFB6EC3179ACD638F3968CC3DA84B6 +E4F72FCE3DDB95ECB75C272BD790F670B9DE0D38F506CB2554FC55290CD34DC3 +EB2FAAB05A3429EE46DF199219A975BF5A55B7E802445AA7F3722104E7608F84 +D66A70ACACA0B4AE6CF96B4565577031EA3884766458C090D5E088B00D391D1C +DD5F456F17E32A00F259AEA00A6419BC21DF016E538C74CFA23B1739B485A150 +C57FB3C7C4DFF0C2BBC03CB1FCB80AA0A8ECBC1F76A371259ED8AE2B92BECFF4 +573CC1B5B502ED6CDE7A17E20E8CB77C49F47DB74A64F66B43F8DBC1D4E75089 +440C1FFC5CF38A3F498CA3A1D226287CD54C1F5CEA7FBA8DF6D1448D322774EC +3C0218D5DF970A012E1F5D5499F2B9D7C427741B518A7E40C05DE156DDDDE625 +1A0DDBC011601E7ADB83A38B9B988FD3DEB78B0E9189A6CB35DB3E12169BF0D0 +04AD6AA70E2E26DEBFECB88A224DA21AAE268BE352F7B591274F7B85695F5FF4 +5DBFACCE337F2220DA9246138706A0401C7709580F0DB5642F24FA4EEA4982EF +4F221DD7686A0902E70E64DE739819B4A34C34A8F5C68A591B2F169D3F9E57E4 +409EE3FE9A19EE8CC17D6B23F836DFD6D053E43178F72C8CCAC64E90D59C6E7B +F8F2C0F92CCA49109409E471F7D59743BA1F9756C105E2B3A88431E74525029A +5D791598E6757242D6A2BEDCB07568DD3EE55AF3C2FE01BF49BBA42F2D669637 +8FA4AD2CBFC8335BFA14C486A3A80F5682F51719C8C5050E78AE3632B88113AD +AA13AD85403489DDF471079F73F641A4DBDB5F829B69F9591C13E947C8649F20 +F4035BFB5B872781E8DBD33112FE780667F03EF8BCC1130691EC49A4F952BA27 +01CCEAC81C98E1E782F3005DCD160C5F10390470158B11CECE9DA5A140E33000 +801CCE2D780F5624CF5367ECD0F037F7DD4E65C282110204A16E258129615E41 +A8EF65A70DDF685028858C523806517B94B7936B87A6A63E5302981E322C3940 +CC320304D5C861FE2A10675005C9B824F2B23C1F792D79F6C21A79E0AE6EC01B +13196E92DE931E84C4B731427523572F1FEC80B1213F8DD279FA35E6553472C0 +E5DD18DD2179BD5C5C386F8F10180AF0037E0C5DFFC6C542F3F54A1C8012AEE7 +3C5B07953BE7867171FF6CC743D5E470C8D1CEDB8B417EFD8388C510D7036255 +2BCAB7A81F4BCE4457FEBE1B643D11FFF23F57832BAB05A6B5595D1BF1AF736A +7E0BCB97E4CC17771AC4C287F7D9931F87389E6D54864BF991187B4450B8B1D2 +72F78B4BEABCD93F81E5FDDE93594E34A26DD7FBEE4D8EADF932EC3B46684AAB +D88CBEDF312A4079B5FB0D28629C0709C9838D31942BFE7CA23C619038946E3B +59BF1DAD24910B65BA4B93A66BA05C795756D8C6B899381B352A1515F06EEAA0 +668103569EFC81EAF2770EF1F0C275E176683A19BAED35F8C4EB4FC415CEEEEC +EABB976733FB60D260292631B8317D90AD16F149181CFA0F39381233F331F9B5 +5544F44E3B2F2C544EE067A7259C19F49ACDD963E79046E45337C98035097F18 +5E7ED0E33FEF28163473E8F682A2DF99FC6B44E307ABB5C459A0FD18040CFBD1 +8BA0F6583A609C5CAED532EB0CDD21714971E0EAD8248237755CE81C919824CA +D88FB1D0F29A00ECBC76CF62C63857BCBBAB9FB36EDA51C5C69F3B766A8BF388 +8FDFC8BC575DB2FEAF388B75CE1FCD42E192965A2E21326B537DE3EA765022F5 +7CFA5CCB84859396439EC1D6DDDD38AC4E9F06F138663B9D1A4909293CBE7861 +93228D6A7527BEB9D7A06B90A109BECC91EAA1BB23069024AC95C58FD2F0D92F +0C9A23F9F98A8D26B7A1E70E081D564AE0A7A80BB84535D7583983161F4C3801 +DED0939FFFA6B101A9EE4004A6800354267881F0DE62EA5C32B4A107609A863E +E16299310CCFFD62A7EC33A75F7E366B9CCB16A9905C5B965E66AB0A82161CAF +BF3DAEA49CB8689752BB02B67C12095F38A837A702B1A7008B808241CB3E8952 +77367FCC9D8D8020A70FB767B1EA866C8F0A6F1C5CE1BF0BD0369F0BD94883C3 +69243523E0EF6B8BB94FD81FB9FBCDB3F536F6EBDCD64BE81E24BF77A90AB41E +1E682D022993F534F5F084E5AEE10D831D1561C3F05024CC81FA5807ED64420D +479D0B05266B6E93CFB2B2298073C5DDE4DBB1A084D47516D8A59C7D8A3B6FDD +4CC0BB36179162C61AE84F3DED09B5880954A324C3E8FAE9A1A33D38109D8D6B +F9A471E8F90FCD48604E265BC789574CFE5CEC36994951F97CE0BC88CE51FD5D +B44907874A1B286BA978537156E589EF0A1D087F435EC06F1691E51D05B51926 +E78A55C1E9A4039185DF20C68E2E4701C4F7C5E18F045BEE53B3991A3710BF3C +9280A1A369CE41FAEBF3664B056FA83F8DFE4C4000F7136073C49CBE894C1B55 +4BE63B386FA539476FCFAB0E10BE9F82575D59ACAB276C35F800FA1B33646310 +F635AE6153D935E901E0EADBDA92DDAFC6B1471053D6A3ADE4E74045AD693A7A +F3609376CDF493EEB0B2A69449CE541BE697FBAD39D86B27A785BEC81CAEC54F +6BDB34984E435C3DB92D10DB49DC6C135D9D65AA195B9078D6E8944F2031D521 +7264C22CABD2634EB5683DA871696E91670265BEAF792CF81E80383A82459741 +29B9F13C24ECE80432CB09DCCF5C28DC545ED5E356A5416CF586B97ECA91BB27 +B07DE92C1178A0AAA216D4AC235B19AB5A62BFFFD114C4F49F7279C94DA0E6A0 +6C71BABB00469C502207B97A7CF0CB79D68C2F5ECFCBC94EF07D0C37F222FB9F +FCA9B78A445E28D686F36A6A517B88FEDEC5F00D7E83C8571AC06FD325808921 +CC7CBD648E7CE9C1A4ACAB26DF540BCED76950EE004B457F4BDEDA23CA8B7C1E +B4F47CCC42AA81045ECEA93F8170706A15EA93F5FA78B1A47722681A6073AC3C +A2459CAB0D5DC8AD079ADE47271875F6F3FA540CE8F0A5097F12782589577F54 +58EFBA5D8590CAD95A6FC2BC78227994B43DDC151F5D2B7B9AA85CBFB11BF6F6 +A9FF8784909B880F6B06806CC8F830F92E551F363882847E215E147CC4B38EA2 +B29D70A9D6A9558226DC92E57F0B0E78C95CA0A2BEDACA4CD0EE68F753912E6D +D252610CC37FE89078ACBBC215BADCF61A29263E81C2F429E8948B926A877C5E +17E51B64E0D3B325C1E4F29B92B8770C90D1D6A2C809081C612065A3285DD573 +C33DDE2196577F6D463E8D19ECD438F12C339BD3CE6482B33CE6CEDFF0109521 +12D3D79FECC373EDCF9E3E82EB3FCC26178202F42AEEB61DDCAF57CC4F995B32 +56E41B2FC6D6C675FA363D1CA2C2601F311C568C224352EA2B89881C8671CA9B +BC0C5C7548A74D372B009F5997ED4BC5C0A2137DE941588A6AB1000EE9745108 +A64F2F780043F4CE9656E3FC2E8777CA1E3F88A99DA1A69A0E79A40EA2C6FC6E +E0C95F573BAE78791B02449F75E9607887C0EC9B3654233707C6954E07D9F742 +F637D965954D2CE0CE474B3ACD1226E4E9CEEF1B8F73F7CFAF10D83FE9C4723A +37BCE2F2C78054F4EC5DD881815EA4B884C7A88AF6B0A78B100FF7ED33D8842D +6728D98CA0A0E3D211A0638BD2EBC392DAA12E01F76B4B5123A337B5B3885FFB +14DA87DE71AD3A7CFC662C020CA6803F5F1DE8D70283B61CB8A049254EB8627C +C2BFDB41658742FE18D0DE9772B9D592CAFBB761A5A9768B4B02DC6627432260 +5DEC39919A487C019BD77225970F1386B156F85AF55B7B23AEA03957B898B1BA +16515BEA6294D26F5A4722685E7FE08298EC331ECDD7DC824CA60F19B7F03D1E +683899368E18FA8499A2336FA880F6B7983F368886C6DD31F7535691974E47A8 +299D8F4BF4223DEEF07150CF2453C714A0CB5FE7ABD5AF5FE47FCA3792A13977 +C531F2A8F81672564A75DD3BD50622F94DFE38EC8E8540CAEC171D690AB803B3 +01C80A9F4371C59CC0E0011743DD480995D5160986DAC3DF605FD473CE527CDA +CF9C10E819F769132FB73C17399C6AF0692EC445CF768BAB03DC70C1DDD793D2 +CBD3FCAA117F019EDC56D479EC56914CDF19FAB530D0E2118B20E735E4D3898A +A95329E98BDCE9DD94573B27564F8A1B7D075AA0AA6AA6008438A63BBDD174B1 +34BDD06FC334D97670568AEA4E7F762723064BD4B56CF0718C55DC8F435946F8 +9951D65A1333CF4C8DC70792546C46E3AD6353A2CD596FF2173B1CD5EA8903E9 +D1593C8B5DC53A42F76A233237C4E34DD339F1D789E5E8C56E3C8C37F5990732 +47799BBCB3E2C0A246EB34192F226668BBFA48CBA95CCAA6A9BA5C543A10532E +A6CBDBDEE5E662BC1F8DA0D66AAF39CDF436966FA58CB3207070631E8ED917E0 +26489A16182B29AA0313E0ECF6479DB4675FB0576610A3A9D5617DC8807B61DF +5610D4ABA159BC25C3C3F678D52DAEEED03C31F5DBC876952F459609915BB5AF +1C35AF1C7CFD30D8F39E3F0B9072042CA8A2FC564EE23D45181544ECE19C2056 +E6DCED4653F6B1E02B203942CCDB6175463DACF0A1D56568A248F39C3B6BA054 +476489539269FF2E88D0A463FB60D52E0A29086D2F86C650842674E0D4DE274D +941076913905096454C72DFDEEA33F2C7F142364018154475587DF2B766AF169 +D424EFB12A1E04CA32B1ED4F9A844F95EE708F7961D01080E2EF3C2125406FB9 +5F000937A6E5504917A4C2EEB0EDF0EE2C19CE2142E875AD64CFA4219072042F +BFDDA76F6A8933616E2D9C14622C17940B2DFC4CB124E33D1C7FBA5D4DF91230 +95F75B3B2944BD45292226DEA4128D14B094477B804163830CE7A310A7433382 +53D9F5E37DBB6D1EFF6D699585993424ADE9BE7709FF882F7F66CAAB3DCD9D2B +0A1BA066F3A43BAD8D0CF5D608F855E14B252FDBED8C6B944ABB3EA837B2CDF6 +DCF730C7CE1C2A0A63C652DB8D822E74767B95F5D7F20DFF654644F93ADF8FE0 +8B4C393F9815D4980DBA50AF43FB5198246C91D9D1558E1951B790443F4DA185 +B9D71EE244833194B6E9C12238A613015B33668D7300F4EABA5D7749D485B9B1 +1E2D27B5CF779EF39EFB94851A0A7FAB1BB928D05C4E38123934CCA47B88C007 +BA2437937EE3D46D8B469082905C43849D54E873FECE86A7068C32F4698A1EB9 +3097D47D8A14BD46DF02FB5A8D811A3ADC43FB362381634A4A95CEAB4F43A0C1 +DBFA3EE3721629FEBC8565BC17C850FFE3F757D0CBD3FBAC0F4F48AFE89E1941 +60F5B4CB76B8BECA2A734DE84DBDA0F33BCAE440CC5E7124076363E37FA7486B +B3A90F827052429DBE0BF5B94997FDCB3B8E896C0B8786DAC25D2368FDDB7E8D +311D6E2F50DD30639113DA11A915B3E36F450AE6738FE3E93C5726AE8C9CC8E1 +7AE55F17082C00ED68C7A189783E5D955077A2CE3C2854834AF677EAF4749882 +C90B37F66C7578C534C773D7AE8A1F27864541006B747D3B7580E3D808FAC8D7 +47F29252F83B4C4D2855ED5E9C129FB90FD85AB248BDAA33BBF956274EEB9AFB +46A0E155FA1C006A66D408F32BDDDD511EB4F5E9F92231D7F3DB5AAAE0287A16 +688A9BB19C728267E13FCF20C9E635F1721B555C2E08A340503A75D6EFFDC772 +269BBCDC68CFD48AC1772CB37F9AA24DF90494F782DD63EB3EBDA77EAEB2183A +2F2E9C4750CDE2E047A842288A7F430C77C010C0B7E3CC1E02CF51DABBDC9C6B +DDA38147668F56416D782075F98A337F4314518A23F01C37E47244408BAEA44D +BC156F429A9DE240414B25081B956638D2E0AF490E92CF18E44E666D650641A9 +A1E5746E8155519298DEE328297AD4EEC55FCDA7ECAB8C6241F8DD5B0959F9BF +4E1F5B4E7E0CDBA1204D78ED01B95AA34AB90C8B3553693F7B18413E51843D46 +ECE2BFAB532BAF3EE2DD93B2620F96F907EF51215C17297F5A77E058AAE1A5B2 +A564C5C11ACB92D4C58D29EB2543F454700EBF7F350647406B306C2B9CC29B76 +AC75AE82065FEBB75CDF9D216F376215633A4A062191891371C8C165D47371FC +148CCD1BCA39461E5E915C7C5B13F04D5BA7CB3B6BEC4489E527188B13E2C06A +E393DFA9B1BC17A141CBFD2138C7CED07D86C0EBE50A8A6E48A0FFD11F791B3C +E3455ADC6DC8A02EB3CBAC56D879820AFB2557E361A0A208213C0C2461E6CCF3 +576AEA9A46514266E2850B2AAA75A10FE3CE609A591C2DBA9545098FA577D89E +35F48FD4CD0EDB72B9A7FB7873D01D683DB3DD2DB9342C23C8CA0BB681619B52 +0A9C6B27C726D11B382146FA8D54D556FA6EBB117BCE2E4D53089C9292C769A4 +37C573E7C7A00DD95FB351F20BD800A3CA17169BFE80AB0E6E2FF27A78BFC3C6 +9E416A86BD22470F4293C77B0017118639866BBE9D08A44A23C7508271FFBD1A +AB76E5E655BF66E87DC916E0AE1447DD01B8D11F82362BA55B50A4FE5FD7D534 +318EA499A1A4924170C3FD81EF41BBC66090F7F393AC0CFC4ABCBBC4255BCA1F +FFC45010EEEBE12B78C513C1883950E8D3E5429CC5BDBF05B96D1B6C53C7793C +D79A82CA916C9EB160DEFCFE32691B44AAE98BBB3C3E35D3C871BC80C7A4677F +76DD0CB632534F18BBD47F961EB620BB805BA2E5AE46B196E3B907C42F157B68 +6A3FD76F75AB344F438CA0661FA6243064303A7DF12EEE75669151F9E297E812 +78CFFA5ED9DEAECCB330015782093908846B044BD8C7740AF44A0DCC1F9C8197 +B15A30DFE0826454E68C9D80C50F2B1D98848A143134B3D19749F7E1BD5A125F +990811AE2923F0BF502285C55B49BFCA0DC5E1CD13CF5A42E09C764E3CE54AA7 +12957D7B267213BBED74B278B21EE4B16D0C58152EF52C293CE44D5F4332877A +AC8032AA8CAED48B5A2B2CBA52AE827F9260383D84A5C5A565BE1D1C7634FBDC +5F083180351593A272342F08EB1BA76A321BF45DC01F0DC73F81E27B6E4FFAFE +696B3D57CC50D1C05AE1FE053B0A513985B5A0113F1CC0922E3407376E339204 +27F8E293D1E7A4371E60CA2BF0E61ED2B81B12DABF5371D03C19257614E99858 +5B93773F057BE3212BCB115345D43339CE2CCA48ACB413B206BEAEAD638CEAE6 +5ABDFCA4D1E5907C1CC8BDC7ACE59C1A3E27DE3B006EE0DE0E76E72909F3595A +4202696072875B42D51FA59473C75AF17BA7EEF32BD822A5AF4556CA5D88BC53 +2782DC0AEAF8F66B1024D73E07E0A26B90FBB0D583BAD7326C80BDC77E5330C5 +5C854E5A81BC3BC45BF9DF2677B9C89100251AC18CDE331FA79A1536E1019D49 +FACCAB95EEB940BFF44E4ABD1C0BA262C750E8193A38B8774CBB92B873035460 +D75CB085C3FDCCDDA3D04C963690D2F5EAFB3270946F69A65346A6A9EDF973FD +CCAEACDFEAADFE6B2A99D14AF7A210DD834494A4C4D22102042A6213E556CCB7 +F645930874E32F95010393ED42DBF286CE565D56D5C80C96D5C88547C09070E5 +F17A395A3E030362B943B61DDADD60F7D5C4192777D6714F141BFF9F035B205A +DEA3AB2A307B1F9D16E62969C1FEEAE6C5283DF2DC414E904217945AE629C91A +0FCDC9BE4459F5F0448E6B2B8A907E6A000B860BDBB3BFD0F8567D6777415601 +267D05C6C0BCB3FC969A22D34EBD2B3C90EF8FB95E7684004F8805A80EED2F88 +CA8C552887A6972BCEDC0ED9DE66E7A2C8CB7E8A884D1693CBB83B5275429BCD +5D3D846AE8233D5F492D02CB5D63118E647C17F89B3187459A0E4E64738632BD +35C37B9CCD46499B7163FB436BE8D42CAA9CC1F21D12D7F62EDE4A0D88A4E09E +F0CB44634407025ADD949A68633115C3C5569DEE891367A6624833ABFA6961AE +6B34E438E76FB2ED7B65DC1A8515D9C7104587897815128A3A6210E08B55B083 +3EA57ED782299D70FBD8D12534E74F1B7658D61B999E0C6B67FA4DADD78B2769 +430C12161171250BECE14E7CCE85ADB0070ABC240A237AD1C2C3D7E75C23015C +E145454CBE80DADD25B3FAB08B2A2FE0A3A728FA57261FEF8073952090A5892F +B9A64E855D36F775154FFA79FE7ABB4A89D7D581F5762ADE506C2D0270E7D64D +3E8E6F0BB595956B468833842214B25BFFBA2BC8818FADD58EF206D88E32379E +2C8FA4A3A25D51EE8D8ABCB9C3772CF32DFB6E85789F5DFFEBC252CE9CB768A6 +28E09AA133598A0A664A401DB0D19674EA7423E1BCA26BE4BBAF9DDA21454FCB +4C2B509EFE29AFE2A9B01CDFC872A32D175EC93C5EE5BE3469184DA910D449BF +1038F75546A1E37F93169DABD6CB7EAFF6D30DD12975FBC71D755F29DC3C7795 +D150C63563DA4A6282BA626DCFE3D360EE153CC0F7928AA60405AB247E9FD612 +C77688F9B4D84115E797E5924E6B40F23825164AB8B23A0B179CFF6D5A02C500 +8C8AEAE9C9724A17A97B164D0B3CA0899FAD42CCB7FD52ABC3BAF5E91F64ABE5 +70B05D60756664262B7BF4C8AF85F17B4C8F13BBD6420CACA0A324690A307E8F +DF1586DBB5BB4DFC46FB18C9C4DEFCBB8937EE5BED3DFC1C1243A4E6D743B26F +CA9ED9F7402BFBE17B7CC477D4E79883162B4ECB3598FA99C53536EDED81F607 +B677815418063F64CDC05309EC4F50C3B49ECC75D47DD5159D24178277543814 +1E9AB69F495A3D0E03C028E81E74722766E868A74675747BE974D9465D48DDF0 +3F1AF3FAB683559DAB50A977CF47F7C4C1BF43F446ECA5374E2B8E77C23A3F57 +33858E972578A0FCB261E1C889BB8C972AD5081FE67D82BD8B929409DF9ABFFB +BE835C6DE98E32112BBE1883EA92C023A73EBE61FAAB85FDE475DA8531D17184 +82C7914966D4331774027BB2AA9022A0843321C85146A087E617B126A6A17FAC +75174D5854B40C08EBBF562A4C7B04A63C55A2CE2FF89E8E1D715B49A52C0EF5 +88C0ED63610A7268FB0C9F9DF4527E6CDE90D8AD645C54E26B7E7225CBFAD29F +80059EB920AE850C60D68D5C8012B1ED8E7AE12482DAA3B5F674D4E569824126 +ED93DEF05AE9031440E88062F475598B4AFD463C144385359AE4B680B2828CAC +014692B1C29BE6D84F5434A3BE10A6774D1493B466F7623C9371420936B397EA +CCA8221353E6B079468F08130FF0D3619C4CAD9B8F2821986F91511EFECC3B95 +15EFC8A7E9EBC936D3860809CB265367DCE2850A34D673727FFD65D31E2EA8A9 +45E747716B12EB8E7B7859AAACD23E04E9AD85AD1E5E9A8C2EE7D535150A6AB2 +48ECFD5AAF2C9DB97A5E104BCA486DFD432AB386B4B31622161BE0F92983BC15 +50E454658FC2A987E2812B8CA402A618227ADF685169C12A4F0BC371485C6D82 +AFF5509CBA35D2316C6DD808E70FDE08712A1DD141399F925E8447F3EF8FE3DB +11F0333E5CA2FB92CB762E46A1C27CD7EA355F8F17798AFB0BBDB5417E6D3FC0 +4BA77E9914A8D37EC26D6009FBBE4B080CD7D0B4F35DB32D4B7AD26C0C79B130 +D82A5481D024538265AE6F9F6066C3E4D4A4C45BF168F8D8CAC1C703150524EA +62CF558AA34B80090CD22FCFCCA620F671F98E61909014DAAB8C93D36463B6A9 +C07B33058454664347DA527C7756EF50FD865F3D64C8AA8BEEF1354099FDCFAF +3408FE61855CB91FF1C9DC778ED2784B3423B9779308EB908ECEC25D190D5233 +F88C60DA18AFF88C880777D581F369A750C6782001767220A84B0FB874E4FE35 +90063FE863173018BDC7B0E97A1715D74477DF5EE7490202370A838A5F15581E +C98893DE26F75A2832A97920333F97214284F3291D83D41F2BDA3A74EB4724B7 +E5AE936863AE5758D5B6D4E0CCC9703D045931FED54F2D98B039099510BAB2E8 +804FD603E664663862E0AC4E957C7E65CE9A63E72F635570A068C7B696D800B5 +C245BD650BF0627C063678A88085F961B770E8C201418DCFE03ECB74776406D5 +557C37493855E1774F4C87B9C9ECD38BE306FB64016D1A54A848783821512718 +CA1A0BFD0188997081649F6D21A00F341BB0A843B0B598EEC9B18C7002F76150 +7272B91A10148713B64985FF6A00C75C22C708F2265EB223C200190DAC8457BA +89C4FB61D095F6C2FAFD3F13780F75822F0E26080BD7CD13B31B8C82A4A007AE +29D450326D79CC899BF3BA9399AF4012AEB18EFEFCB829B40EB8F2FC97225212 +A7C49B4D9C5E362D2E64A011E9891BB02075321E1315C1FE219E49C2F4D2C8EC +587BBF73C35D13E91F4BDD3C17AA023E0B862BEE477BBE257910369DAA330AE3 +64B05486B6A13D5C3927EC6A591BA7DBF5CD81840841B453AE1832D0ACB35935 +9DDB4E8E88D45175D4D9A88D0F77065B98FE59244DA1B24A0D2F04FB3D11FE59 +C69BD19C9535A0507DA6FD68BBFD9023144D99A71EDB1D00105CB59BAA1EC8E6 +8E3F4D99723D87831482DBB370FF8E4099D6EF49A562C5151B948E529FA84147 +5B80BBE6F9C4F877BEC307667C6868B0384B98763A849B47C889A62E69E833B6 +04A60319B227A40368B11D3B0E92FFCD15009B654B096D4E09AA0896B70F1677 +EE32339A931B387D6476843D91DA00229282D60F04932A644B22795C7E86AE6D +EA7DD4AF07E3D8AB4D585C51E8CCAD2DC043AAD95517E97BD18D688A1DB92A8F +B70CAD704FE4D1CDA3310BC7F3C8245E18094E65C82C9A7277BE922334E410FA +93D5D6087892FE352F03D536AC06EB9C9637859093538BF0BA676208CADBEACE +AF9EFD10C49850701AA500F1600C42D1E635479BBDA49C2812357728BB540683 +90DDD54F4193883F2F8DC8849E90F329A9234F79A731263BEDBFB01F996024DD +A95D5FBDF7A6B4ACA2BC93E3EF299B6010E203B59D24EA8E05DE48906B3E91FD +7629A1045E32639610ED53D78236842B3B44DDD2F36AC347F0238E27182486AF +A6618501CE34112F848598A2D28CE97A18407F9C82F2FE39EC4DA96801E1A23C +F3BFBC09EC9C81086E2A48F388EF5692E9E5D6B5B7440A60D4FAC21316BFB71E +01DE8CA6AA0496097FEC7809922553E6C7DC24136301CF15AE3A07CEB934CEF3 +61ED9A944BCEEA2205773CA1B5134CAB75E5DFAE05B79DF8DE0A30012B50046E +ABFD0F4458746F14AF71EF79283E570B4FACD9A6FF5A309CF795520A812233F3 +3F97621D1603BB7878354C04AE66319A6F00F4ACF41FB459E90ECBDBF375DBBE +B205EC6A89494E4390560C121040E8F4DBF68240E1C77B673269CBF10DBA8E16 +88F18C662CEA332147C7E17F88B126F209D2FC0262D7F1B9C8E42A6D56FBE9F3 +9AC64901CD5DCBC9E120C7FE424C5865768C9CB901EFE55B0EF8C363F0516A05 +EDC6F3195BFAE2338DC6BBFD8AB31FF7D2B63A7EDF197ED12D51B0342AC43791 +AE851C12B9FFCED87A9A0A66490A126293CEBDBB12DF32BB27DE30FD02A961BB +9DA36A32B0E9E51DCA92EA7C9E09C48707728774542CB0B1DD72601E30DD5A6D +22F1081F30A8F5F6ADCBAB5071834CAA362B0A586F93A1E2C08B4961094A6060 +0E767F90D241CAA689FCB364048D09C6E61277E23AE3D3907B5DD935DF1CF941 +ADDAE2D173EABC5C1DD7E13DFE00C4DF73E2CE2EF0E1ED9254513D20C87420AA +690769FCF932DC6075577708714C19769E39B8171A7A771A5619F5CF9CDC8388 +082E54DEA0658E8218B2CEE1F8E39FDBCB057E7A728204F5DFFFA9E7EB0D6F46 +3A6328C32F4DF1BC54BCA3800F83AA77D23F9EA4DC3D78F052EF49C11DC8C3EB +530C3AC4F2AD8C861C09FA96BF6313C7195F634917D2F4DE84F7193A837F9936 +25DED0C42D12DCFD281AC0DD5879CBCD46D17EB87693B269D8ADBD935F66AF0E +8C2FC7412D541218A57F6D9D9763B51315EFD5B1BDAB6685D8F3759A98AC801C +21B89D3575593A0865A4CBB176C9592EFC8FF47BD2DBF34B160EC8FF8842CE94 +F44F9A5DC66152B2980DADFBADFFC915A95F98F9406311732E077E8C0BEEB6DB +6709009FCF541F514CCA4D0427D633DA65800559760771873DEE72E395128FB2 +53C856D3C48F8D8960F3E6281B2B4172734FECC78F09EC23F34CB920EE884D28 +41963A47BF3544912E0AA19A48799D894CDBEA789C44BC355763C5758F0AD638 +38C6D5492238EA2FBDCB43B1214B4E740296E3AF9789773A918A26E09A6167FF +8CA0150EDC52D4BF795C8F294A0E2061C6372716FA0311F8A3017570BE24DE6B +3F59AA1C888C121C4E2DFC2E504B014DCE8D922C7CD1C4DD31A53421883A63C2 +859D73F217F3C2B0EB6881A2B0BA479C5F826BCA1F6FBCFB672FF7CE4557E2E1 +BE07CB81D0D4F772A635905156711F3836A3C5919A833E59502FE32A06650B34 +44042BF4151827589B6093DCFBDBC97626490687FAFC9EE3411B49AE64F650DB +4E9ABB16A6E3A029BA745BBD0E305EE5F3C7F9D83AAB3EB3F549EC62730EA472 +F7C0CFC92C72FCAA1319C6F43B3E523AA831E4419DA26019B5CDE3D14C264BB3 +55DA4D1C9CB74B073EB2C80843D55378C1AC7ADB2BA6B75F4FA7891B605EEF03 +A3D9DEEBA8F029CFBD4343E57D2FB2EFCFD5B8499275B74E39122F00A0283138 +758A19661381D508C36B49D7E1976BAD40690EE2AD29F49C499B66FED017AC75 +9EF5E0DF28EFC831E454F8D0EE9810EB0991A7083A878EEA81B494437D1680F6 +3344196F46A958340C9771BBFD7E9DBFD8DB8B19E15294311BB67CA78ACB89BE +112053F96F97685DB0D0DE8D3772D2699CE60E5CEAC18083300AADF886126D0A +9DD38E90B5A99F2A24EBF47FE8BCEB5E258A4105E7123C4174AABA79C0304B94 +506F89D3C11CE7EA02A7C3D2B32EFC7FC7AD1590B544D8F1F846ED5BC371515D +82E17D0E200D026E05653C983BAA7C4B2E4D0850E3BC5F5BB62BD07D55510C62 +2CA31539137DFEA988AA24AA2B203F0D2256A8DAB677BC1AE4BBD0432491CF43 +346668E6A6D8258747B27898897B3B1D404B2F2473951AFE38A563754ECF4F27 +D9CDB65D357C5678952420C9EDE68EDDACFD9136E06F3CC2505B3E192F20CFB5 +C6AE456E1E8FA86B9E85A21FDA36B349BB98503DCFAC96873471B2AFC43F4574 +02BDDAEBF5ED48B959860BA93570D6389382A085A2924AFACC2D582A5C1C23F4 +4174EB5265F09C78CEE6858ECD88F35687046A178565A249F85F2F12EDE73467 +38CC89DC5A980864C877B4988C862CF44722E5B9C79C79B2D71548D28D50215C +4AC9E316968EB5238484DAF7E28B79F72816DE3233BA1F2F01702AD28564EBDB +FD974DE6E4D29B25E5D6C285257386905BAE46872615256546399CF06B80D0A2 +282D9E10F14F01D977FCE93214725242BD69CB5A7275785410885710D956F242 +A71389EC59A8FA694CC681EDDD984123C10EC191AFBAFD911524352B1E012DEB +EE56767497213386FE17C0F5CADFCAF35AC917F5423C092EA86214C01CF52DB3 +70DD3EA2ABCA0D2C5160BFD7AD66A24B9725BB07F08DF833B26912731540F34F +E7B772A43541E28959397CB23136A205FB14B5D98CDC692A17914E322114098D +B91397B4CB2713BC28A75B846E1CA0FE21F3E936298F63D057BF943E5F6666EC +B62A6E76C2478C480392BD50CD0CFC312250D8DB942A16DF1AAF6360FFF78687 +3B412DE5CAF16348601775E2A6EABED350E16D810C11C56D1365DA81125AA1E3 +6F0F53162D9D1453F2A9D3869FE5CF687E11B14E7B043F8477DE75406360D233 +A105B72CD6B28B49D84E62F148D59B935D4F80F93006D1D43CA1887146266DD1 +CF8CCAAA1460F59D854762BA4DCD2C72EA3B883355010834C167789742D0C886 +0E40FC7E18490AE6501D75479690D7A67ECC65D749B69021F8E6D86E98D0032C +FCA0341852E051A31B948411F8E27AB7E23E0D9F6B376273A97554248424C0BC +4CCEA57AEBB28E61F46FFC12365281A763229B00D86034999AD5ED76E9B7B5F9 +D8EDC6BC419A43C86C2013985EC8CEF1B6F251F6EE1F37E6752B326D01A2F486 +55F4469A4C81594D1133BCE884B1438128BA4592AEC98981ED6DB57046D20AAC +D9F9FB14FF8E3549FE9A43F3F9B0C5ECDF97626EEE5B7A5053BB1E55E7665B40 +85C2AB287067E09BF68B2A97310D6F018D5EAE8FF29514194380729719001045 +BDC12CF32D5B575F04540A4C428D2567CD66F7DA4FE41993EBF6FB032AFEDFF3 +0CADBC79AC90241C71DBACCC99742BB516849F1C8B3A6C60EDB04D290F4C9F47 +4E3C8B45B18BBA98FCE737D05079940E7681C587175E13D94B676C0F29434DF7 +53D0D9757ED0DA610E69AA32B5977ABEE045EF8ECC9D5F9EE464683ADF39F314 +7837ABD6353BE90831A843AAC6D08DBCBCBFE5615F88774F47632799FCEBE8EE +91D0CFA0783234042F66CE7A198017A867BBD6EF6B3077106B98A1CDCAAAAF91 +B5431654A8196FE452818DC97E9B64A48A20968E12A8CA92E434EA61838AAA3C +F0501F1AF7DB5DFBD6A0CF7E1BADA364DFAB8B59E076A66AD0CDB95C13ACE06A +D7CA855048E2BBAA48228BBB6C437CEB366EA93676F8790FBB883BECB832DFB8 +618120164630AE23C2515B6201CC0A637AB5397D3FD8F575230559F633654BF7 +31E0774D2CDE9457262341BDF81E24F69A72351992807EFD05F5331F648571BE +824520CE7537ACA3E919694EE5FD274207130E28D716B144060FCADF613B8379 +693F7BCE8433B319406BAA89D577841E55F73F8DDCD9762875C18C2509D826DB +4ABEB7AECEBA26BF2D06884BDBCD98DCBCCD11047BE8F33A766C5B5C465CA713 +BDC2FEA07B34070354687C2F5F0DA72C50904F37FA17496BA812ED7C556709BA +FAEE9127BAC4E7425EA5584D317F6D4D6287CBE769C21099D2E3075171158BAA +348477A37E790BBFCF9D214CB2EAB7167B7B9672D84C984FAE71FB830B914825 +7E789F50FAF9CB889C12B2D7237B8FA90123695F0111C4965802A7FD73809EE0 +E48BD07721C48D81FFA6FC5FD14994772D3A39E6F91EB962B0BB15471395461A +577684BD8DEC293465B85682221EEEA16A02EB1AC65D43BEA067591E90D49660 +1704167CDB94B046ED3FA8225C15595EE9E3EE4ADF486DA47F269E9415B92403 +49E9CD8929544444B5AFAD300B274FAE8F3F722722BB5EF87E2166F084D0D18F +E29E46A3635D2A9778382490F636E236D70F32841D846518AC83775AFF5913A5 +164E41DDD413728A2A7F67131167822E255A5BA9905B41D33718D506D4ACD872 +9C96A9EA31D639CA5B627839105D27A3FA0487B0453765C5475F2069CB73998F +CE3B287C77637CBBBE181F003418488179A198D7DD76FDA0803CB5189ECC87C1 +373266E75972089432DE229A9837C0DB0C4F4A1C0FC242551112811A94227644 +EC271AC874D9AEF2F0A19C3E52507B601BB51CC4B063D7DB56272D4E064FF026 +77DF024B3EC16BCB3C2C573DC4B55D152A0847080520EC9794590776F8D1159F +CA7D525704CE0773003528B2DA05CE92C37814295742DE3C5B85E72D398FC549 +8C627D97F4B77B17D0A0FA2AEE9B35B4BE1303515C2737EA58EFE3E8C02D9A5E +B4BE134695380B10F9D29995FE9BA0F1B8D725FF40FB65A1B5E4497F6F7EF1F7 +C215E98F2B230FF2C1E77DEB317F405D76399A87858A4431FED2A7E40B444870 +000A2019680A7B179FC7E336ACB8B8050ADFD9256E501D716A64D40D045AD891 +B9BB7A293C0010A3FA8172743F2D84FD3A7BB02EE6BA019FE522761F5D48B06B +82AB108F46B361E1215F4146B9499BA9B67F4CB7BE248C0F452366401C4B1EF7 +6A1FCA84C3806D14E98CFBB5B19A9E9C130D20CBAD9EA9D55A8BAD6BD22DC210 +CE6EE0C806A3707CDE7AFB920F87636526309CCD2F7C71E9F41691618503DDAD +A1AE1FF5800EC16ED9BE08D0CD304939975E8FCD8EB99F8F408C2F9CC6AA0F68 +AECF45C5AF7D99B18BA291EDF4B99E01A7F3FC3271B8B14A6550AA3893C3BD99 +9CB74268CA2076FB23A1C93FF528D2A3E28FBF2B9696622858BB4D6621AD5C74 +83E08BE6C12D20D08105553DC668F32AB7699783EE9C5482F1EAB146CBBF5A4C +7D5DCB7523479EB24CF2FED6A503570C210FE2BBA4370ED880810D952F4D603C +7AF879D265332AED31F96792AE469D8B42B83931DBF557150CE66853B6B999A1 +11CD84C513E2A4F94F67FA8F95DFE5746C704E80920BA0521A48DBFDAA615D27 +8DC65DEABF16F1681C2DFEF912222B76D449F9EFE165428267881523733F8DA5 +C34922EAB8ADBB0ABBDAAC668FCCE4157FC5A41E6897EE4D7C8AB47B0D1F8947 +604FF9BB1034E652A091830B21E3955B49F43EB6BCBC35EDF5CD081CC4786F1B +4FC68F3F95D209CB2B74944CD9FA3F78583063DAEC648AD231BCA52699AB888E +2EC4B31D79F9016BFADDC53CBDD785E931FECFA07CAE66786F15E95A5E68E0DA +CB1F7D2B788C9276446AF1353574A1C31BD1B009A9A4FFBCAAC540D5A728D555 +C19D50D543709AE3063F122F39AA2C1217975E12C08DBD572D242B6668089F50 +9303ACD75A32FB183BABEA1B4982B65C3F7AA3880FE5BD719295393EE246209C +0929F1DC19844EF3556DF49CD11848BE88D84811C6686F56856DB0CCE63FD473 +BB08A721AC03A2275057214675BEDD7DCC0FB1BA4A02E5BCE939392C350DABB4 +4D81DE6629C7713119648A025183CFE5E8BC3FDD518ECE2A3F2BE0314FF8D073 +FED63CB458626ECA9525B2BC255AAB91B9569FCEFADAE921575CF439D4829611 +7E3B020B9223A6C4A622176F1E7C906390D4B436ACCE1B2E8D9C03E31EA0CDF2 +49D6F2B1296716CCECE5CFFEE825B1DBCE083EC16384935A7C1E654B6ED2BC5D +A8A077DC850551C90C75A044BF66713F21EF2E6B963BDA8581797A833B1EEAC7 +BE663EEBBF0AA5779A508DC2CA40830ED8ABF4A05536B56CFE94FC10B3C0056F +607C2F3625130E87C03E7201F293E62C69B5FA6E8AD2E870D20DD70CB689DA1F +A955797C9F6EB85CC96505F409556992CA2A19E9F3835C0C3A77C134C6B716D5 +952AC896207CE3723AF534897740E4696E90C58025E8629895A4ADC0DB1AD6E7 +6A89AF91C2A6E39134434F80D4B50D0FB4BBAF31BCE787D3F42CD0B3C328B6CF +3EB7D5DE10CE8CAC478E3340C549A20843857B65649F842B0402CB0CF0426600 +6C0C7C280B7B23461F4E555A40FBB0750E077EF744EA3A8814EC08C9FFFC4FD1 +2A840A1C6988BF0652F623732EBAA16537D2D88077B5BA6591844B42374A7506 +73B04434912167E8B2FA443BDD2919521E7CBB51EF56851735AE880DFE196687 +BA36E944F2A33C00168D15D83C51C4E500A1938A427CC97B35BC08A0AFFC0252 +A66E0F11C26F03ED84ACA2AD9EB4F4913D7BF8A548B8D395DBC847CFC3ACF59C +A856D945FEFFC9E89BA7C441C85B718B58BB70886BD6AB9430D3DB53C985C8D2 +A59CAA7EC7B63976D36DD9719B373AE58F09030DF86791E4B8FCC2807D30307F +6C83981D93095832EF7B6D7AB9717CD19C1F3929C31356B6CBD7B147464ECBA8 +ECA45DA761FCD20F61E49E496AE4CA1BDB5AC7A5591D0FA9439F19B136D6F9F6 +DA7FA38A69AD6251E5722C47DD6856BF23749DC3F0C339E854B4F84C4301417E +5D7D4A42BBCA6DB6820B70F0432823B5E3A95AA69365DD34330BA317B27B4E9D +9303691BDCA22CC1BA832224188F575678D5E7F95B3A090BA8CF1F57DF504C3F +AE0C8961BF0FAC6CD00E2566DB1D502C8E953FF06049D00AD5C22F695DCEA09E +37EE1B6F55BC691789350E0EC61F699A6E411AE0096B71AEA9A51137C0B1A0F6 +39D8C4B3C85C034057D56D235D68130FC3AE064B6F54723582F06EF00D110B03 +077E6FA25BB5525D5220DE4F8978D3C5BA050BE03B4A715910352EA58E625E4C +E435204F0671AA1F2B58A5CE2BF58EEC8CF7297E8288823C64E9918185B87283 +93F8E3DADD1EA48FB267094948CA0448854729152FE6F9B81F9C734960BC02E3 +F4CD9659A1D7F9F4F2BA9CD7809E1233DB4368752122D756C3DA26E391DC4BFE +4F83FCC871AF08E7CD5ADA72021562B233BF268F6D4B745371D8424019B72A90 +C124F65C29B2C15EE8C0EBA2E70A3DDCD6D9DBE25B3E3B80D3E9FB1D19A182B4 +902AFB63B7D989756462AC1BA9BC6371B5C6E1481E57F797693D19DF869414A9 +D314B0D0842EC99E5D156EFCFD20D07C11B7B5996A4DB5EC85E5830B3655F84A +FD7DF060593758A6E7FCBBE97AA3AC1BA6C358F26F018E292E50E1DBE44FA436 +617AC91F2341E1E4B92F9F8AA179E6791BEC0C5782E283C73C4E9EFEEE734F24 +0BBB7B5CF26F8C6A61D4CA18F8FE8C39D33527879FE08C5BBE9D87C3A3E84FA4 +F61B6EE1CE3AA0B364656AB14533E527A55D89EA59BABEFE2114204CCDA3D247 +A11562DFDEF7E36B939A9341121F4CB1C61D2586AB147C17DCECF23FA58962E1 +11EFED42C6C90A0FC71F87939659CB868BC64C513BBF688C4802DA63D3AF113E +6551D91D8A91461888073F8D4213CCAAC483B43B3AD158C537657F1D4D22E9DA +804369D6308B4AECFC5262B047280C9B40BA4B53FEE769DE9140C5F262521744 +54DEA4B4F639CC891A1576364BE160434B02049C90225454CDFE46FC89CD6F84 +3F7B1E81D38743F469768FD6F17B3BB79764E72BB2BCBD8D9BD966E7ABF7D5A1 +B5816A8DF156E4E9EF48B33C87C03A0F00EE23DEE5D76707C6F123775265ABD3 +D93A901B7407524CC2A850771F4B609B835A62374DDAB77C8EF7B9BEB6867029 +537B4B34FD2354655BF0B16F473130084959670A0311CE512A487EB399253FF9 +03E9024BFDE1099B16943C88627DDC20C7CAD23F5BCB669FD448DC6DB3A6C4EF +D2AD525FC42261D6B25C5DF42FAC5A9A7C034CA3B44F7A67E3AD200F9A8A4154 +A0D85D385D8F07763AB004C0C71E5394B0B509AA237175F5036C1AE4BDCF35D9 +56F7F958D0A600B28B7DBCF127E09FA3A4278AAF163FD9C8E576ACC5E3282A3F +2F9167C68744E6D9ED2E5E76A8EDE76E6324A03DDF92E3E329CFC4E2B3C13D56 +77352C9CD47FC2FA1829C03A97ADB39F86ADC3FA6F8F4D171CD2E69D016ADC20 +7F088462E2A724E833B215EC6DCCA694DB9490F00449A11B83BA6DDBF64F6B9E +4BB753980470E28ECC677DED274DCC0DE847ABED5968EE7E855976820BB417C0 +1072D132D7FB33592CED1661A8D1A476FC179C1636915BE6FCBFAB688EB06742 +424BAE841C7F675E524F376E16FF60489DB9EF1C7D95C50C4BAA18408BE32CB1 +80E85C1BB0F7CCBA1AF6D62EE471EC44EC434C85BCCE76F90C2A9264F9B03983 +CE2BC42A2A22D543398021E7905CE5EFA5E0429B19273C134E0E6629A8616DCE +24C857E518F95FB64383F4D1339EE65AEF89F9798BE6B5807404B44AF398EAC7 +523815316CCEC391026B9759EF0B1696934C55DBE1992D458927AB4119C939D2 +2C186AD0B2B90951D14EB9333224FF343B0F8DC170562B3EF981442CFB4C71B6 +3041B81491BAA4D0C4BE442586D6BE61C78F64AF199737EE5AEA8CBC6F36919B +9103A2FA390B8D1955EB6FAC1B7D4FF549AE12562EF99DFE37AC5021250FBD02 +6F2572F2B26D2F29C2660C5F311BA809E8B3094E8EB21476A72BA4FC2A02765C +98EE0A8AAB56D511B5501F53BAE9EA91EBCE96390CF8C8EE43ACC8704B05540E +DA577F37810B240AF659A9DCEFDDDA2AED43E7F7059F2767CC9F095DF20E9288 +1BB6488991DB85793C046F4BEAB2AAA7DBA69526E83A1628E09760CFC9068321 +087129C318D6B5A7A10A6D5B465FDF366D8E9C7E418DFF90534393FE1D48ECD3 +8460C02B9A7C98B52B2E9010B06DD9C73ABFB7EB8E74EBA05DF5B4CBF72232A0 +5C8349817CDE593F1856A84B2B7692CE5E831D890C325F96234218B9150C3638 +B5342980C1928BB5635C949B9902475E6CE9C7320EDD66442CEEAFE824146C44 +40F95771F064230C2567C747BAFD5934D9871CCAE206C13F8A5722FF06CF0591 +DA9576A35763476C59F4CFA638A5DBBC21B4C01190A58718FCCA959A501A6C83 +3FECDAA23E59D234C372D07DD420DEF9A0B23B4D0D908B907970D32763864973 +1EBD9CC5A7C53C2098D9A380F1CD63E9AAE74948B209B91F77D1C19DDD26CF4C +EC61267D2126AEF60A9496E3AA26A1F2A383F2C854D709A60454B193B3149072 +67938C33E570D5149158FFD40D8D0592C934FF2AC5B6E0FD93BCA7BF26DA95E7 +5A381E94CF9C880D4EC4C8915C60B4430469EA3D6706D2D410C10D9E29A3CC0C +1622FEB7C9F59E949CF40ED21B322985BF448C24D54A7B48A5E10C8CA48F6B18 +A1AD2F09F6788F95D29816A251C19A18953A4EE9ABD49DC93425D90DD80869F6 +858286097FA0CD44AB0B5BDF2A371B02BC8FA4B0A4AC48F111DCE4A32A856EF4 +D10F1B777AE2B9ECF77AA66E3EEB5DC82BA69AB0DB3E536B08E6DD8D32302171 +4F30B69609C9FB9B0F25D26E4E9A8F94785D5D816634697C604E1BAF6C4C67DF +FF0D2C9847A27440D92328561541169C3AD45ED863C8A094ED14D1BCD713790A +5E48CB225DC501AD7AFF378CF8E94B3F5A61F52487B5FF4510C1E7525031D39F +63D9A9F8C81F1A4ECFDB4E3F1942DEBBC6DB124E2B695F6390A2FACEEAEC809B +80D04EC03B4D3110E93F2A2CE88BE76298F3B2E6CA79FA4240154A41EAF28211 +B79DF626D8A4C541199BB9AC1039802917451967BC159176BB6F1E17A02B9E1E +9D8D7AF8310F2F7ECBC22DE47F1B9BEEBE383C8B9730CD61D2392496B7239B6E +3CCE01BAEA37663DDD4EFE1A6FC6D2F053F74FC1FC28D3E8DF2C3929F64DD2F0 +6570C474B0B4BD74CF4AF6B72E5D5B7A079E6B592BEDB76BD3C0584C2ABC4E2B +0ACEFE33940EF69AA41C721F401460581EC1E4A61F665786B6674D2F0044BDD1 +2E2B115EC28A997E0B4DA476C09617B1CEE6A2283FB5064248D096EA5B0FBACA +FB41C2781E2CADA452F82097ED5D12AE2A9DD94CC49E90B12731085364EB162A +E404983B1028EE4FDC7EFEE7A430C715192E6A9FCD67BA58D77B3EC7179418E2 +9F44BD60D81ECD7805566919AC8A1F7EBE5CB882771808F32EDDED24DDF21A93 +EA0A872F229895B9912E65FCCCB6137BCE3E0980FA96AAE4F8040A233C5CF826 +97ED79A163839CE10B23AF1C6C48C37A7BD711DBF61F6CC713E37757D3B63955 +515B692289C3D22EB2D5048BAFF9E63865CC3C4EA26F356A448E4A6D93F153B4 +40DE89E06B98191899E1F9BDC0FFE92AC098637AA564E954937CA4758E3D13E7 +A790C92FC5064818CF1B96F9C6680708E10853F50E012F75A2136874340164F2 +800A9A0F7F7377FCA81760F626DB49D6A9285747A9867F423BF079DCCD22B46B +D730DAE458E3DAEBED7A85EE3899B9D55965464F45FC4D2D99F766C95B9F6980 +307CF7E29C6465DBC4E2ED023334831BBAA961E4493D917DDEB50D0B69B1A615 +AC19FE6143F7294CBCD9B2280B3DD739D9EC30822183F644FB1F53CAFDF3BDC3 +56135C7C5A5365B3B767E6F77FE7BB353BB137B41B3F3258CF9869FBB302377A +B2890B01E41C9197EFCE051C394F2206238886D69714E96FF6308772F7668176 +33A22E84871EF6B37F45ACDB7B19201C2BF5E3C83F74A58D319A9EB523F86F89 +C4ABF2C955D99B3C2F14A84E1A9D170FDC1F324C8B2F3DDB868D47612FE0CF75 +0279425A46062CFE4AA23FAE2A4EAA427191F42176DE3FA5A60A1C3E50723519 +FEAC2098A2955F13DC65B855B65D0879258D9BE45661FC2D1388D6670D5BAD5D +48B8BBE379B90FB24A664A29C66A20BB26C4FA710956765D637B7CAB2F57D4C8 +D1CCBB2C48AC19E1C36E8B5DF12F94766805D0D8886515DA29354B5F4394384D +6D59948D2B028619D130AB81BB38EC2FC7713D4D4F6B29C4B138467F8ED7DE28 +DF41B3746C00266C4DE9AAC4E71CDF8272152DF2310F80BC959107CF21814A73 +6EBB99F07B92CFD4E167F53562B04065401155ADC4BE985FB3F2595E835260CA +797059CBAE17FC381AB62786EA902B5D0AAD92602AF851635A6C61B1D9EA8140 +A93E8BF8E24A688A23B4C1EADFF3CE00109D86DFA84005DB0B4E6B9EC75DFC89 +10E92A9AAFEF65F2ADFE1F47E8AF72E97CDB1AE17C4EBF861A7706A3754A6303 +308192CD292B1B1BCD12D1F69CD6F609480CAEF16A569CC2354D7B725C81F7AC +427AAF42F2CCD1DC6031C0699C60AA4B0CFF2E6257E0FD316A90B9C034B9969E +D1D25EB23C33FC9A083A84E3AF380B6EFA30D5B825A6FE68556F6C517BF5706E +4E3B070D5D8F5DC452608180B6A3A7AD6A009CFC3AA5F2A6DC9BD12785B655F1 +DD5D1D6A3F0544D6EC661B9C1BF7B2D2585C0E74BABAE07E453796044F1B2768 +B08111D0FB75F0CF90C8E3B52665D07D79F99EF0435F805A95EE4ED0D9E88DCC +8D256D7A67A96EF18CB707AB91902DAD348CD514772E0A649B66287D1BF8DDD7 +E1CC998D0B26311CF5F23BE0DE0A7CA089E0259EB4399FFDC4379157BDFD7655 +FC5C2FF95DC94F2FF04C1E465BCBBFB8E3BFE024862D85124974BC6FA083C3FA +6DF2F92D3978A998904B0A16EE9FDF840195F817D6D40A630463D73F544CA551 +15F8784F4E52B0CC03528CA24467E1C3D6E1CA868AD2EC482C85CA111F814D75 +FC2E92124E29406E92DE5205CF02BE28F64902BDBB7AC3D3763FE78159B4F143 +7AEE808329D91B034CD438823E7736AF4135C5B6A38769FD9DA821E328018655 +DF6412118D8832ABBCBA583A55A66C758A908C2F195092D87B6887E9A5E036C9 +CB4BAEB7EBC74466E5410DD289DFF8DDD5C4ED6D478FC4715E8823264E9F861D +9A9C9B99514565CA025360188AEAFD7A42FD1F319C46502AB8D81DEA78A95D05 +457E477EAA201F67BC40979F9B86E086C7807DFBFA7E4A2CC0F90D87B2A3EC2B +753BF0346EF5C28AD1F96E4F5125BE9512886E70A232B8AB45B7D2B8FA190D72 +86A5A4ED1E542D23344CDEE87EB7FDE9B3957929AE3B4ED9E7A407530ED99A1C +F948E2689B7FF456E82D8CBEEA5FA4D4EDF577D37188FE7B22523F5E7DE71480 +46506645ECF7C46862F4ADDAC3D3F0D8B6D6C962236F83DE4F930FB8B23A0B02 +978C3B9DF395C0DDAAC6417E96A3488833CB7E6FF68F0B67C1702EA81BC3D6AC +E883CA0953D4FF48CFC6966AEFD6821E5FC91874CC51BD4B98233BD2164AC5E7 +802DCFC0CCA34E4511C4E68D89E711C0CCAF195E9A0E93217C5AAB30BAA40543 +BAE734612E4B74CD1D6D6DC9C794604C3CC678E04F8252678E18E61B292C3C7D +D02AE8A6E2F0C7939FDBE188151F8F41E58435168E28CB4A3F33CB49F294244B +69C4B5347D7443959F7267F45894165E735D00CDDB1C34980A9922E097795AC3 +1A3F5E45C609F32308310931BA9C18ACD083F8A63723F7E54D018DFB08BAF692 +4F258DFD971BACE3A13A863A9C951826499A814D984AA870A8FC75162E4C860F +7B4E459069DB0E5F331EEF074B3481FC2EEBAB1103B075CAD3200E94D080F3CA +66C9703764BBD33D05558BA4693AD855F67451118798CF236BA060F7539F4FFC +F3B1E8396EC34AE1D06D51FB678E2FFE110223FF341DA23CE45E58097E4E7F6A +99616B1A3AB563B342C5FD9DD9B1DB3B9544D0ABD8771AE0A858B8F827B5E27F +3ADC25B822A6190EDD69346EC9D6460C0BA25D52B906F6E37CF8AE26958653D9 +96E6F4918FEB6DAFC3940E40F692836B8C46169D978D3B6361F720AA33723C22 +B7A4C1BCE4292F85BD581F443813DF12A02C5B460522DB1E7D2D61C79A4064DA +10BF9B9DF9B347381DA932CBD3B152FEC7F3A0F7AB80593232F091CEE23A98B3 +7AE07929FB8D6015A6CD4B61EC26384966FFCD23034CD6820D426ACE6BDC79AC +9C17E5E482D61D203126D5E628027130684D2F26C4986904482D6C1589E1C704 +E42947DA81A5B507C31ABAE6AAB31F5AF65E736BF281EAC3D9E6194342B0AFA6 +186D427BEA12D9AAE1FF0D34D52353030C5E670115A719FE28F830562887FD41 +0A5A3336A51F0D752382B07125BBAB85CF54822B0BE9D926A0DA846DD11CA7D7 +94589C19A6B07D977FCCC211BD35DFC09A4BDF028143FD057C3DCD6F6BC34B28 +99A1B03C506CBDDB4D8345B3FA949B8566F9DAA7F958A7B05744C2D8EB7E980B +6A6A7E92C536995B673E2385F654CDD0A80F1317573730364ABC9463B77E3224 +68E4AAA461806CCE47861E9232A95B6A326B32C429D817AD5A3FDC7B2F5D472C +E8DE7DD2DDE194FBE7859302BC76030576919474A610E545B2E89BFC30416298 +014EBE7808197B3021E6C000A12647EA7E90A7D835C1D1F815E175B944302A3E +014B001CB71EAFD0363E6142082DC0A00B0DC19E740F33EA62BE1F8450AE3C9C +1B184D3C3CE5839A0AF3229D81DADB6D93AC7E7BA27CC3B768A430185172BB97 +EDC7C3EB4B7611858F7658F604C6E411CF05662702124E6DC1A333771B319FAC +9553FCAEED75C50A05E7BAD92538EBFE401FAC35F5CF8982CDED508DAB81CBB5 +2558C3BF59FCAF06D266BCE6B647BAAD2B0A2A2266FB6A97782BD461EAD173CF +884F1370C9AE823C85F5C392EE21A7217E603FF66A87BE77004C67E600AF8BFD +E68BA369C571B42C86C51D15350B9B6ABA774E10FAC7DB98893B62DBD832063C +93CAD111B5177CE7520F95179DB50F512AAB94E321684F9EA35DCE472E607451 +A8DA404B573B4C11CE658C9E7D1A3AC07F0BF8087A36859762904A1803277B45 +20840FB55C7F523246599E4930DECDDDF53961999A25D2A78F3C26E328A8F446 +C415A92A14A46397CC5E1099EBBDE57A5556887137305EE31399E8E928C7FF3F +D24B02233C82EA0F0B52F1B1EA91543BD00C69498E2288CB6CD5E8F4ECC2E314 +D463C085482F6C8F8E601A06F069FBE4FE891E29B73A333A4E48F0A384A59C2D +A01D470DE89DDE5620D6D20F94437CF558D96123D8D451F609CB7023C246A63A +145C16F1812AB2F82F7395A8F966CF3706B9ABF9D5FF13897930E4D7D697CBC5 +77D3D89709B89D5D83814E26619972C241A654B145A9B63E20A7D7394EEDC424 +3A0625F0515C60D54CE2A5B4D0506B130218A9C83C1824576C537A64A9922DF7 +934A40DB1783C98D9FD20E673CAFF7B532647689F1F2A5AA1C28E2005C1B9A82 +1B4A56D2F77C8B71D9945FF9898B85A0AD49C8079EC601FAB664DAACDD78E63B +BAA581FCC59C0B23D601216EE8AA69B63738FB5D3A461DBBD635FB18A4CF5167 +45F612C2498B80CE2F8E3BE11BB0F57CB712C4C0570B54FDCAC81640E6ADA1F7 +0835A1B7E8EB31E9DE3C11E0B1AE5CBDEA7645E764A767421B6682839BA8484D +5130B2F6EE7B997926B1B2600781EE5FEC641DE4F3FD213843FDF14A781D3643 +A267B7ABB5527AC813C367D58DA95380FC828D517AC437603F87EBFA64EA5E08 +3DDCC06BED850CC08EB8C61363F03414F9A23E99BC005124B5C348F422A67BCB +DC6A5D865B2225D085B249B7A483153FAB21F5043FE55024BB5027BADFD52A69 +46BA5647A04940348317990FDC91DB0C1E493E83972F1CD01150E8A2705604C3 +B85B501748327D9FD8D8EB4A878FFD72A0E8ACD033E03C1DFB35B8B1098BD2A6 +E297AA8E65E765A9D92F7F0E46E567B2F0179EEDA2F674EEF2ED7EEDFFD9B922 +29F72D9DA808D81C312E823E83D506F50650F7BA2F94B94C40D58A00BC11FD44 +880CF8918F7C4C3D6949A7CFC770ED162941980EFB918215F6CC80A7941FC467 +FA3D65538B1DF061BB3B5238126E01F319D3937A3241F02D0985326FD56D783B +24123E58FFFF3CDCC50E096A71A944C9E471BAC8F2DE41F430B319DD1F7F3ACA +400DC2C0CF75CD1258E3EB945E42D9870E774D65DC1CB182E9B7D0FAAEAF8668 +84C1077A71E5C95228915EE533BA686504329DE2480D36A0B13501944F900D98 +230D0D0EB3591C23204D9C108C56EE2920D21F4871E5A8824615E3001300C447 +44AF734326CB7C742222FD862729938451DB670697B79CD8AF1B00D9ED7D0002 +3877A35CF39C89B4EDB3BD0BE7D12C0759E8D6A35A241473CA9C9D9F74EDE95C +8D633B7DB65772E00D194276307C10ABF809750D2A8DD375675645E17A36AD91 +1F85F811EF4D5970C2A11397434642D495F67ACDB0B6CCEFDC74ACDD0A59AFDA +9BF9194542EA54C24C9F622525E6D2B8EEBCB8F946EC7906E6163517B957F4E0 +C0C50C8E2989764DF98287DDDF2F211F546387494A2A44C68505D7CEC67E5390 +CCE4D3D6CF672FFA80B2DF81766D1F94747824D7AABAB17667485D17F7EC5A61 +77F04289FDE1CFD903083F5CBBF0869F6E5414C4E20D63B967165C9D7248BC27 +82084BA13896A667728B5C71FCAEA6416951EC753717891D9F90674733A05D50 +D5CEFFAE43BB11B72B8F16C855BA5F0D26BBCFCB694C667E507FF94133927748 +5681BB4DACD9BA08AE6630E7A742D3AF1D1DB04A6C13DEA51063F3437A6E36C6 +00D592F06EFCC6C485758AB22A957C6C2EF0BE8FB16621F54EF9BE7150D45397 +9ACEE4DFDA63D14B71B1ACD42D67B9D862F4464F204A25F337736547C0F3E697 +EEA0459991E492FC28B75B25CD8F0A188BDFDA900480BDFE67F172F61A015292 +405A576326E63C87BD7140E76601956826516AE66730E6D57F5FD43C964055B8 +6BB09EB0DFC93F5B78A15BE0B7C4533518847AFFF483F428F7675E7234A0F66E +D9DC5426BD143982599EC2EC9AD374822E428078E8580837BCED097844C979C5 +9F07E4D5F902944EE1F0A8D339EE814745B4A520794D7F4DD9311AD372559AF2 +D1196F10BF336731499FD3DBA03EF6E49AA0AFE6C99F5DC9C99C8E85B1A972B6 +390176C6B6EDA3DCF0A3334B1971214483D1082789BACA1892A3BD971AC9ADD6 +8817F031AC322E16029C689971D06FF45284C0A6900FF5769B5991F290B2D32D +1C7156FC9401A11290EF37C41B82B902221724AE447DFBB10F85EBDEE66110BD +CEA3DF2351DCA1E65C972C81F2B89D6CAD1FB987C29F02970E41F6F2F317DF6E +CAFD9E7F02D48B5AF58307320C0F95B28A8295C2BC29B689EEFDA81F1FBD52EE +38057FDEF58BE337072D0462A4AE03F0780EC62F6D8AB4A242EC1534FD9C51CD +70C3F94B538B4D9AEF1BD8F7427E647B2B8C5E19ECA1D565761531B52935B095 +A31B00B40D07D4E6963399EB3291F47F63C45C5E5E29518D9759E31FCD861518 +DF0A34C519A18B9475309AE617C8A456A4D6CF01D8D4E6482FF509A5CDDE8BF4 +C2FDC963AFF50E8F81E1F644D11F53051AD7303D15E633A5180114F5704539CF +B8B50E017763CE474CDC35834E5AAD07A931A099948A6C848030ACE5837926D9 +7FD9FAFB25A099832D91047E0BC5C37BDEAE93BA64ABEFC831CB67AD8EC8A1C2 +DCFF7E1C18FC9A6EDF35F7B9642223D82A657245D3204DC8733176E4CD8B28EA +BADB93906825BEF461B8A29EE8F32CB65D18CBAF517BF1E766BAE940F81197D2 +95A97CDEF6439C18716A8DF5DB91EACE95F2CEC2800D9EE93AAA4F12C642D0F5 +78618A3EAABD4A9DBF0295F5F61D1E0A5DC4FCB513BE81DBE23B733994AE4358 +91668A7683C8AA5E74253CB614CB72A002551865155C3B22CC20BBC234977D3B +2264187531CB2AB2AE77044D7669139CC1F1E0258A355F8D7E45DB084F43E5BC +BE11D376F1B040A9F2140904D15AEEA4C65E463AC396DC2F8CF642803FD2CA08 +6106863AD763A5762B413C6098EE985699526C2F10B73D5CF5A5C8FCFB00A75D +8EE04EAAE2B1A1376AC4659C75DB630BC9D8A89EAC3A41DC65486EE0CBEBA09E +E5127EBA7F22FB56E11DE85EA3FCC5EF86C61D035D55F8A211294B66ABDA4735 +370C8909D3AD3FB83EEDA6DDAC31C7211F55DDECCE2A76D518EA3EF7C18F1D74 +E551CC3B9718C023C4399B694CE556071D4EEB4332499744308695D7FCF4007C +6C001EAD49D7726AE17109A8016038E923132F80C75F2B3C850658C69309E653 +F5E803F0F524AF61E8F70E875E79F32A22EF77670993C12431FF2740DA947B41 +6AE7C9D90C7712BE19666080CF3DEC4079B0C05435B1871ECF35ACFE8007113A +BF7C8518CE4A114BC62126EA623E5138FDE2B573B58F30757BCF3B010BAF8A67 +4DACBD96367DEEDFC21731BBE6A28E4EEA2A625AA682979B88D37528DD8D6E64 +56A2530BBA7700DEB84AB34C29A8402F9FB72E4A2F0AF1FDBDAD266E799455D2 +B5D4D3AA9B95BF26D6B2393B876ECEC41011C4636D4F1FD195E95764D627690B +A5236BA4154CADD7F34393FC514B1D46CC5EC334E0CCD0CE153F370CCAD25DC9 +F432BBB12D3101EF5B8131F8BBDEF9306FB49444CE206C0D487576DAA936A65A +4AC472BFD5AE7D4F0DB1DC8BC7AEA924A8ECA1361C26DED2339B427FC6C52A7E +6FB778423F3494CB50E41BF7DB32C1A0DE1621C04A609CE77F62FFB50180E3E6 +ECD85E92CB4D1CE6F5ED9AA0D0A0C3585968559547606EF6966CCBF98E3AF59E +FC505D0FCBA8A575AB0BEBDCDB3053FDBDD987DEB7F5D6D3AF920FC6B27CE0EC +3EFBEF16A5D809F604767C0C07D17F14636ABE98EA17DAE9C9835B780C78583B +FAC4E38B6BB37E203EB776BBADCB416A56D7762B88F78D5DC9BD94044234C492 +10534455972606A286EF42BBD52005BAB1F5985E653A4C1EA3A22E72CD2B2B39 +D42689D41F5F56304423C3E346D82F39EB4AF398A003FFC0EE4CE90D801C5CF2 +85D7F4A894B2D42A2DEABE0A19749EBFDB6D2548AFB150735F33FF200335B427 +ECDAE0800F8549EBD4B6ADA45A4969A58617617F595E10FFEB0FBEF422767A93 +E95CC12E99261389A80BC08965F9315B286EAEC4E543DB7143353332A8124B11 +B0E1A81939228883986EB56A641FCEED024A10C67BB874A379D3AA3988F8926B +A351FFCD2E957A06E74C79E17378CE552CD09483FC8945BBB64D67F8CF39E986 +2D1A5B12F15CA11F9DA9DCEB4966C178AB5B1943E9161DD105E62D41D14F1AEA +EB4999D98815FD9D21013B2689919AD238A66B0B12B4C6F5BB424E44A771484D +E67B57326A207217D6D141E267607D4C66604192A2B0ED182413F04C37F380DD +7550442AE3E0F86563AC34FC580CBAF52D4DE3530FE96B2E2869A2784526CBA2 +279C138C1EC9F3016955D5E0FC2DA6ED47D61F837FC2F50A9EE782541C836539 +1DB89268F6A80455724585AFF4C8617B20EBF9B9664712F5F7235A497AC3AB3C +6917218B2D18E57472F48CCB599C3B4F2892B8157FD93A4B9BD5A719888ABEA4 +914DF3E56D33582504876DB0062FAB1CCA694B9D64A49AFE1EA99A149B6E6932 +5AC364E9095FAE0244E648FAA9A9E1CAA5E94B085671A1C012E267B490B5D2B7 +52379A959E35337FA0C20F589C89C859D37F5502BFA3AE84BB9D81C56E8B6F0E +76908CD8958E3A1CBBA061DD0CCC833BE7C851A09B341ABE106C619714EF14B6 +DEA21DA0F2822D37E783A765F5BDBFCE8FB5BC8F75C56E3FC04AE8FE03F600CE +10DA2C120C1AA9C79DC8D987A87D1B1F7124AD44A44EDB67E785DC2A4FD7B5AB +E6BE85122340D062568D207A8729DA26B92DC7029117D29FF071D8F689F65D62 +7469AD8DD1F5E3CF1EFD2E0157EBA8F41ADC76644E48AC74E202D10DFCA98479 +49BBF66CB748C56FE70202C02B5ECBB1080D6834B8CFC8A8488BE8A502F0C0A3 +DC346A1EC38B172277B244DF4EEC610E50E1FD9C6A45F5099BE894D060160A5E +7481F3AF11BE4A71C49C4E089A12FBBEE7297360CAE36E35E6CDF16D9CAF3A24 +E680AC8CE756D3C945BBDB2139063062C9C4215EFCF77F2E7B2565F0A0ADEDD1 +F8FD0C4D7A4C64704B568B3BB66721D105D3D8A8D814CFFB5844DF2B3DEFEB44 +D3CDDAE7642EE75B59D780D7490EDA093D13833FF102AF7A186EF8F2A8770FD5 +69F98F812B29024DD4BB8F5FD49E0927E8202BACD9F773A1D4EC9E4A2085624D +A7566081270F322B2642CC758E2B5CAF0432E78E331FA5BF0E025B953CC08833 +7E80E535DC3EA12F6D8B0E73E354E3B358633139D5BC3B37102271A2AEF65D8C +DD0100DE27C285D228A4391EBE70428C4974E3BF16237C503BF9F17CAE80B5DE +66630F26D6082728D84EB505452ACE002D3D96A3CE36F0B7DB93B6AE1CDF773F +8EF4EAAAD384E7D28A0C499CC38903F7EE1889AEDFDDB6FF180C2776BA7DBC33 +975B0BEDEE2B02A6E34EF65AF208212A1BC47794823FBCEAB57E1DE0D5B4D132 +D31404C7E4E7B7E8AE1B8A90B078C6565143EDF7C86EA974EB2D84154C293EB1 +7338C5BD8F021D40D29F646CF31DD9AA14BD090680AAC8AE481099F316EC4749 +BCF5BC65E7F9A4F856CAF3E5D3CD9B06CB7B64DFB5C439CD92E4E1D63D829701 +2CED8107B4FB6A80E8DEBED078B3540BB5E055250FA529530B0B035D749AAB59 +B2205E1E405363DA6C0B16BE5D41F5FE3B16289D983B44BC6D3F589C4477F592 +3CD817EBCEAEBBFE6CC9CF1C0C94CA39E7EE2029007893C40CBF694AA88BDCBF +A0499F2A22760B4FF01EA292F9F2BF0060FB72421B5C4F92D132BF2FEFCD5323 +435ADF9299EB3606BBC7F1DCA88068E9A8296C020278C65CCDB5FB0D41433326 +D85B0590D0B4594B3B6897F8F51E56F8882FB8F37DF7BCBD41509233297A11CE +368FD4911BE32552CC2FECC9A98AFAB72B9CF21062B5B56F37E35457E6E27EE6 +9EA25C8B8933E38293FE178BD91D18DE69966E068DFB263CC22392F61D765538 +DA54523707A62EF8DBC323983FE398F8DAF8FD95F26F4032AB1A6E3EC76AFB2E +1279A60B8AEFEF52DFDC605DA9CE091F24491B7BE41177E2872A851B4DD614D9 +5EFD53076DFC5756509CACA9E69EB0380634E586E9F06B786609B625022AB77D +97922B1F2DAB9DD033BE2E11443F24F0FB85EE66A1985DCFF9D8AA93A11D0AF3 +9BF24E33FBCAF72BC85E6B3355F130672F0630B8A1D258718EFE45A51A522F66 +DF6D779B654150041D8F557A9565C39FAF1EB01153A8ABC4D05524A4FD160551 +2E09A4B4E1B446F5C944FFD0B770F7DC166C85886D301AC3483BC21496B09642 +A11915728923B01957241F7FBAB8238E79BA49B49AE2154F71165EC8EEB62298 +578BCD5050EB474A56839BE37A67174549EBC4DA422B4360D50797BEDB115C85 +3C3526FD46B7D1105428B68AC52680A53320AF24AA12D793D1F14E2560635501 +85248DB2F251DD3423D6C6722A1F354FFFDEB5006B599D47C7CFA26CF96FB4B6 +8057F2B1FB82E5119BFEF70384997A19DC261F62CEA0364D93BEF6DBDF85C5C7 +8C515EB0850D909744DE8720060FAFEC8F4035C3CF065BEE291599C5B82410C4 +ECDCA99D957871B1485E028BD5D837EDAE9EE2615F29047407DEAE94C05B3B4B +37EB9B774415CF8E6D759908FC40CED03761329355416C055C21A529F0E89700 +ED9136B16D9971CF1A0299D3703BDE044A8FAB6FA4CA7D6B26F379211AD70C47 +A8280E919091DDE0F9F2C9D4303CCAA9DEC9E6A41799951C6AF62F0DAC1123CA +2E3FD3046438002673938F576A96B2BED3E5B2FD39A969B638C1FC2BED379380 +6B86F68A2B2405A010F02B796F60D10AA97A835C6733C6E969CACDE2194680B8 +D76B78275EA088E01E67DFF1BD081E5F9E7C3DE17AAE4CDFB4E4FF98A22299B8 +BC3DA60C4C02DDE93EE6821A8DB3DD1B17022589A333B7323509CC2AF888BF6D +EF902CCE0D33FEE46BD8A476D27C3DEA65F6FC9799B40391544B8A42AD5591F1 +3E8D87E933AFDFBCC0DB880385A86AFA73365F6DCA9A1A8836579FCAFA0ED18B +7F2A42FFEDFD233767B7247455E6D0CFFE193B5B6FD6EE0273A32DA45DAE7189 +96A2FBBF5049380345BE379B84997C0C7B72E34791FD65E38A44CE1CCFC98ED6 +D1DF926C4455FE7FCB544D687B70CF416A547D94A84C9DF64A61034E43106093 +23A4FB1754E274581CB7D01871A8E00AF352FAA6C1B24FD27343157B5B2709EC +625D8F85192393C682B739EBF65FA47BC8FA5DAB1828F4B0F7699C1EAEC74E55 +2645C3E7FF03710D24901FFAAD7BB14A12003ED61FBE2EF0EABDE9B02FB9FE16 +E0638DF3ED8DB8A0DF8EE978368913D3011BBFCB8DF718FBB78BE8C0443EE4D9 +774F5269CFEF93D57667F09BC73FC37DAB996CAB3CEB19BE1966BF7735F5D8AB +6404B66C3760BB3AD191DCB23AC2ABD884D833DAAC88DAE232218AEB006B40F9 +9C0BE61B420B0EF3111AD76CD972EF61CA05F32C450D30AF955EDC63A3D70EBC +D76C66F83B7E61A149FAC77884C78494D576043E0C44D5161E29D8F482484494 +395202D50B9776B54A9944F80AAAA81E6E3FC8D6FF478923E4975C8B591C9A0E +094F422FF675A1C04E736A827A6B42C8C91AE861B46F490A77118ACD7496C339 +1A2E16CA94E34E2C61245E5D54DDB5A8AFA3B0A0C04F462057BD72FBF9CC85BF +98808D73A036C2EA1DC6DFB3C98239921F322C3C3BB4B05952D9F055466EC977 +648752A0E9F8C126BDCFE2DDCE5A85A5B57685F3F534A6460F8273F385BA690B +FB3EC6F19B4DAE1DDF8E3CED5788350CBBD3832EE84588184C88426D82687614 +42B99AC324BB7D51D716B0771281A3D209AAE3AEB76DCE73093375D4E9740244 +87C7117DF8EA6CC7B99898363B1B407C0B5CC18C597832F1557E154C7D4931BA +79BBBAA593F473218AB0D1798964605C02A2A60682289BA88115781A36E05AFB +213DBA60AD771F9D9C332EE58CE4104B4E3213D6C5571D09F4EBA3D85926989D +A8E96D143CA0364C780556E59E39914E4AFC988A7BC7B1EB352D02F753829F5A +C6EFF13BAAA37AB5A8B62510D0DD373F5C0DA7DCCFEEE724F0D7862BB73092D4 +55C7E0FA43FBA607E4EDE16CE1F875571DB09956D6FD53FDD0AE47A91BDDDF60 +4CA2129A9EA729D41264A039D4B841E207BA5A2E8B81F5E866F7944E2E432C93 +BEF83BEA1276266B1D37C2345FA232203536A880BBDAF573B7CE9855AB7A2574 +0D58567235EDC86C82D073B8AB94BDDF7B8FFA4821791D5E68CC0AF581773F02 +4D27367C2F3CE426E28C2FE6C238BEF5F4277111F624F1FB2C0332D464293AF5 +81765D8A0DC5B50915DB1155A0453F1FEC0D432FC5868F5851B888E4F1B7FB08 +9D12B61C3EB0C8FD63D92725F2D16604E12E3ABBCEEADEEAFE7368EC205B4861 +3896CB2A9CC7CD3F8D345BBE5A0B2A96ADC7D66A8A241A652A247F555BAB37C9 +98CC5C16F7E6C59373C15C4197A03A43609D1DC9E210629140F440FBC85C4E6D +F120EB3E2397A760A08C8825E53A5D5031C3E200CDDE60A29992A76E3D70115B +809445837F16E1F30BBEF48DDAB6900107E371318BC7A96AF47621872ADFE5B6 +01D78A37DD12EEA29FCFD3E9E1DDF86379280062D1D3A542A3210A79618702D0 +5D8A2707395A5D78C698C7FAFB0D1345D977278210E75FA8A9D611242A07CE8C +7F68E96AF1EB5A0A9EA7A73E044638639BD0B1E0F4F2FB669DBF6F0CE59747F4 +CF7DB5F4BF5423900AC729782077F36373EA1815BFAC07B281B4D4460F583887 +5FC0F99FE28826783D5A1080F5C8269A54A9C15D787ADDD9BFA8CA0EE94E292F +4F4DC1320F29C6EE65A2D222C56F468D80F96153D2B57D83FDFA444D34076F2D +6EE3FC065A7428452AF36B19A56DE3ADC2936E1B6F6DAEE66D6B577F1A4B32F7 +4BBA61620953F8457F7AF03011B76AE28940FF69B61DD4BEEA2A98999D335595 +193A8189E521588AD09C7866E86B52AAA822F1C58CCD30A67F2CBECEA8126582 +066967E4DEFED674CF19BCB9C1D72DE685D8618368A1BCB59FF49721A55275F9 +F1F8A6D5C58C232708E56C8040AAD633347378E7F60E30AEEB95D9925EF69524 +AC0348583C29402388491A01138274792A1C728F6ED2ED23491180AD718A2B43 +7F7691C09E7008ED1E8A49229F41AA10719339CA4EFA44FA24C6D1393ECF41EA +7A1CB96A8F4EF84305C9999BDFE0684EEBBB3B3A4A9498D89F3CD588D31FC00C +6AEFB7EB9650C2BE752B819D2B68CE36D79F538FF203748B6C491C51610F04F7 +43BDD86DB26A2B905FB8E0601EEA9F7CA1E2B26B005AA8FF0D451D4F45C3E6C8 +22B79AA3FDE7E7D95B91834C3D01E94356BAA6164229AE7A3F82455D457F2EB1 +DBA0D7FB8F79EC435B59F25EF6F9337C635655EA13A8A04F5073C3B6353A0004 +D9D85D824BE17A94612A3559685A42224CA59A9F55058BBEFDBBDA5CA519451E +DA0077345ADA9205320586AD3B5568DAB951D8C2F998B0BD8C1C01D3270AD982 +2D391EA3C8618293FBC09582F21658C8EE2FDCB9EC7FF8504ABB9D5803483DA8 +A31D985490FC989E75288C5E8EB1A3CFEE35777B2C64918AD3EE6D2FE5F13B50 +9FACA93C0645CD9BE90BD7E48CFE25AD2C6DA42234D7D2E9DA83A0A0271D2110 +00B0A9E149392AE7072ED5D31B088F7C1E4447D3E5423C29B5546A26B0D4C1BA +7B8CBB26BEEB492F6EDA6B03429598B28FCF3F27AFCE1DAF8E7CBAA229CD836B +DF8BB45825DA2858BF9DBC9BCB30CF660C7FD418EB3D7ACA2BF3A38D304A38F2 +127937A9296041925BD54796FB2BB1B01F0E3C7C4E7304C87C0CBAAE4CB713D3 +69A10398CDF5C40E43B301BE17F0094EFF2BB3527F44C1F0ADE74549FE2B290B +E84B679A4B2D5FA09ADBA16C14EAFAFFECDBBF13E9C395AD367EAC66697AA240 +DBCA20F6F84CECFE2742FA6BA9E9597B65ADBE892B4747F4C0C59890DE22391D +469AB1F8DB6B962DCB4F3AE6A8F7BE07DC903D0D6C1C00B1A06B51B12A418720 +8B03C294EB1336319BD0960040AC293459EB6EE4562BA6ADEFE9838BA89305A0 +20E11073F479853A856B3F994F717457416EADE555F569D7F9024CA0D2486BFD +BAF47F3F006B149DFB328E836C3AB71210E42A1269A7588CA3BA2FC80FA64B42 +91B01A1D58CFB9A2125B161988E7DAA519907C73843EC08FFC502022034ED1D1 +3A27F57F94FC6E57F7B24348D66D198C48114E4E936EE6D2456C5D61FD509182 +A18BADCF9F6014823E6915885273D91C173CB58C1962F640668A86EE2454E318 +F5CCA728BA2035EA749CC674E832B90EE789BC9BD0D93959B901C006D4A57642 +36ED92B5AE29D8BF29BC8ED3011D4E2E1A180CDAACD9679D95F3685CC3FB907E +53B1FB857EAEAEAE33E5B87F1B53D7432258055FE02EF80351F8651E169DD121 +14654E913B701564C9DFF335B44EF9E7C34C891E8D5B4DC8AF49F1E8AEF69C2D +181972F3558AC3A9EF3649C5A8F62DDAFF9E15B8540AEB5D665FE8C58A7819D2 +E945305CF8414E4C82475C6C7EC10365322E0D1251AB032D2B53986AFD68F5B0 +C2E9BB2BFEB6A1E1BDFA8DBC4183DD875B6E09D9D7653C97569AF9160FFD0177 +3D23E21C59B0330B6034F8BDB5854B6CC73463DB04BE06AEFC170A9A0E356537 +99877948CA4CF92F1B24267A1BAE1B5EBCC70D92CF76D63CEBB004B77151AE63 +BF957222499C82FB04A976118FED7C15810F7CAA98C17E06CA6712F318405E8F +E40CAF5568AFB6464B10B409178F6C2FC5F2E1659D5370004D8319B76AD4E24A +EFEDA214690C5CD3E0281612E90822632770CBCA36CD5581410F0BA737CE5581 +AE466B3A4DC73EB951818BAEF2718749B834A3A4C7A7EC08C123069FBDA203DB +DFA7B49135B6C7872B51E25F4210F282BC6D6F429C14B26BAB2090EABCEBE2C3 +C2F58AC82C68C557C63CB2B4EE2167F7B52B444F917DD54AC87D21730761ED32 +561165CB25CDFBD83C1A718BAE119AA7331E7C99534DC68AB0996A39AFA5237D +FC1007CFBD84917E667F53A49B1BA38998F29056A0E8972D5E6CF04456F63732 +6B0656B515C865A55E7508BBABD5F5AD3F3FAAE9C2081E2D32E5DDB16C3B4ED9 +AB0F7B3A0929E7775B0FDFE576E15043A3A9D61434FF0A5379C2266BC4A898A2 +A77B5C032629C85724CC1B91608539A0DC2CCF7DFC55021C75350C0EDDC79D50 +0A577F2F2960175A90515EF6F58771CBD2D7DDE0C78AC263AA2FC00F57EF85C1 +50ED7C5513B0E7960D2AF0B83BAE0D9B696DE437ABDE36D128B618B872AF1F6F +959D1871BEC575BBCBE847622031307858B24B041DC8D4221F1C6DAAFF7AFE5E +C7064515A0FC41A267943125A71F300BEA8175B85668632CE8D65D99C75C3C6A +3CE8CF0165461DAE6E57B5C92A2EF499B3B657B887D05F8E8B56759E23F6807B +8B3143BB22299DA9DC600CF907D983E4EFCE3DCB42275C706E1A7A2D47B5A9B0 +F3DC3D3B279ED66EB955E2ED9E64F660050A9C1629646252924412F639616A27 +1A6C4FFF63BE6B0B616751A5A80154B18BF152F53D153FB21A6C269298D54774 +38331BE0DEB93A3D42831ADA931C653006BFAB39162AE1D97574CC0ED7BF5C44 +610F6C618178CD9BDE88E101BAB5F278828B3622EC01DF8D4717BA72F5DDB4A3 +BA3EBB687C866EA3405D8C11BEACC5DCE3076FC8508996D51DD1B2AE89D37B12 +83E11FC3E41AFB8B497F676C5E1D161BAFBF18900D50C03CB6CFEFCFFEB649E4 +198F1453DE0BBD03ABBDCB5A075CF618978072C47C3B4A24043B687BAC3AD657 +3657A9A9B3813C2456D2DBA2D910D7DFC0B55EE4EAAEAEF8BB07204F0F537CED +B8F67C2738B5456BD9F0F22C6E54EAC7CB905375C915D0D662060360ECB10C10 +F30039B9A5606F671E0EE132C5788655E4671F2E79D3AF39118AFB95EE5FC061 +BDB869E0CFE549BD106EEAE8EBB6A6DF727FDCE35F0375E95B27DE211FE1ADC3 +90BB092E442046A7E5DC902CCC3553CBA4912D989ED8261539DE69A871F82C99 +06282FB2E8105107F9B443245FA74FDCD2A47673DE6E2F631D3918374AB6236E +792D5DAE1C76F3FE6A7C73346D1E8CB2944E382E7C31F99F6BD5029DED9C3E54 +984492F4B99F10FE5739F6D5F6F05426991B8495BA4B8B21002CACFA1FF45A51 +6B76D1469AE3874D97517A32B9BD998D2E4590862803544E33330BB869C5E3B3 +60BB9FE9B9756D3FB048C5A01A25B39B8729506D0F392350136C3DF46C9BAC76 +CE450B346A274AE22058339C6DE92E6CDFD584F421756E17ABD5F5DE2BAE2D7F +547DD3CACC6AA10AAA3BEAA1BE9651527E3B7CC5F11737FFFCBC52771819DBFB +4E6D3E71EE6C4A0B24AAE5988F828CB5392821FF2195D3452DBE0408D0B87669 +C6A630B6C1E00D0F1CE10F1000310B9E177F6253BE09247DE827B97FE02F2413 +AC5E94569BAF3635B4C5936BF1434FD7D5971F6286BBBF3102B3CFD68AD25993 +B69BFA3C89F4F4C777BBF3190D1295957F9ABC24BC147E8C95202A6CCE6BCB05 +91B821B1A27A398AEFA3A22ABFBA4227C5D0E0E138FEF04391E39C66870A77DD +5D2CAEBFBAB1C5511BD62849EE9963D536461C0693074DA942864438278C2778 +2A49489EAD7B43340ABCF99A71B9836A696995C6A459740D58DABB5AFCE96C08 +B03B0D403121744ACC6F475E194E79A30AC2B165BF302CEF914D34777FF1CA88 +46EF2376889244CE73C9123542D3759DF83B3AB2F8E5D4865FC242058AC4C337 +96E923EFC4FA1F23800DA6B51D6187EF9F1764D15FC343C5989760998C65C642 +C4201ED35171BADFECDF52AC6CDC58A0CA988E44FEE389A599BC59395969C211 +DDF7969C5922950B0CA4B0D9C960AB1E16A60BDC44B9F90D309EF1BFDEE1949B +87B66449FF949F1B935DCB7B492D4E1E805167B9B5FF1454AC7D5409E2C8BDB6 +13B3DC21A3A3A834A64BB9C9FF803E2754EEDCCC140AB0D8A38A4B04F78B83EA +7BDE25812DBBF98994D414F49D560B38FAA060E1B8B5BF985C04D425CE9914B9 +6EFB14ED4DD7C5F5CCDCA97EC2AA2CD6994A140004D12F7EBE5DCE90183592A2 +7F431A2AB72AF8E4F462C020B3166583C05F3A1363CBBE68DBD024ABB7F99523 +E89696A976C173D373E4EB4B20671F010F1F7A186BFFAE0152A8A38F0E41BAD0 +8543042253DB5F848324A27D0E681FA810AFE80151BB2A7A97594377ADA7CA6F +58EA91BBFDE300C547F762D6D0696A4C1A145191F410B6B784F740B8E0B3B855 +56613610441A509EAE3F7585272FAAA54329831524A5079F6D78093B3EA3FBA3 +12B7691ACDAAC0611499FC658DFB64A1A7B0D048C82050D8912491FA1F5AEE1F +E02E423A89119C25AA0F89EE27882697E60DCC0156A721528E4D449AA5B9AC21 +9F1D343CA479DA22D4DD4DB7EBDD46D7985428D4E799D9240AD52ABF2AA64773 +D4319BAA29ABEC21172CAA7C0761F78756D3C72A0C921EB3AD83A850FBE9A583 +EA1F219428A23FA044BBBC6755F512F7A8996DD7C793CF8BF7FB2277DB8E28DC +BA3CAA878C7BB8D04343B7B9E4079EDD1ABD862B8D65FE1E305BE631D3D03700 +EA13375B58FE76453947CCE3A01890CFD4F91F5ABC705BBB15 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l048033t.pfa b/ogclient/lib/fonts/l048033t.pfa new file mode 100644 index 0000000..a56b589 --- /dev/null +++ b/ogclient/lib/fonts/l048033t.pfa @@ -0,0 +1,1267 @@ +%!PS-AdobeFont-1.0: LuxiSans-Oblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Sans Oblique) readonly def +/FamilyName (Luxi Sans) readonly def +/Weight (Regular) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSans-Oblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-219 -211 1101 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078989 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D831E44DCA3B6490FF0789 +636294029DFFA55E327982DD4A2A67A6FFF480E29F5A881EF13E768B43D431AC +37F159650C27EC72157C59E1AA122FF145C863CC787E9A7DC23FA008BE85711A +EFF0F8EAC9648157D8211D40578588623322CC38EA02A3880326DF2645BD3F64 +08412786DCE5E604A2A62FBB694CCA1E173447AABFDD315C766BA891E3D75393 +437A58C7BE654E8B56EB2FCFF72BEEB66DA88A528F948A1278CD8C27422AEC7B +96BE8694A1B33CA185601D99A08AC4905EBBBA42E7751122791E5150EBEC7423 +ECD39B2D6D6A8D2A7B920E68E80ED6BEE52083684530B8484E6475D0646EF488 +BB1BAF858685DDA12D8D63B4D35DB9F9E5C0459001B27DC28E98E154771B08BE +055DE6C18C9DBBF7892717EFE2F18DAE3B714528DF55A9BB6DCE3604435E4E82 +3567F359CACC0DFB39D23489E75D582DE8FCFDFEB6DAE957065CFBC65CD52E90 +ACA6024498AD723DDA921826B6303C7AF6121273B3C87372CFA8D6D7A2F23D4A +3B217CE35D2546E0B4F34A2B53F780AFF950AF527184D475FFA61133B9E1F3B2 +8612DBFEB7D7ADE93A68187E35865E23165C9BA77C899A309DC736CE27DEA6D4 +897D93B9E5FAB92EB8DAFEEA2E1C8A0D4EA9820860F103331EEC52FD564F17B3 +A6998015B9ECBFDCD47C10FE6B1D915FEC61720051C587E36D4D4C4BD30DB959 +8F0D1F67850B7342E41125F0175B287DC0984BBA8870B2EBD237852E12869412 +D864BF76ABAC386ABCF0D8CA91CA842D6D4F8450DEE0D405DD7B5965F69B0B96 +309E02CE3CABFD2038926DB8DFF48618F83DADFE43C6759F21487EE741AE2E56 +ACE575512F6AB199BC9C0098A082D4D4E21BE5F66A54DDEBB6CE8C00DAA5D92D +51C6C0CD9D52E07A2476A92BFAA6DDAB6581E5C5F83BA2385B852FE2367420BE +66C7455A817DA5D1484BD3EE124847B89F1451912F4A759D0AA87D1EB408C340 +D047831847B5DB5C943BD2D5EBBA1D959BF559D2BDFDBB69BA0DAB927E1D428A +C401BF5F2DEBFA016CF35B31F5BD00883043513928144C4A98A745D08D81478B +A5733CF67EC9FCE378C4940303BBBA71CE104B525874E93DDAD5ED06EC4F5E8A +917C2E46A4DABA795E3F72FBBDD96C88817A501BD3E639B0FA4581782A249F1A +C62D58ED43C26BAE32FD2E592631D9336CB4D957105DBFCE2D22586255E4D643 +A0C3BFD1EDDB43B97E8615FCCE2ABFF8EAA14702DD7E5D2795AC181014138B5E +314121F572A72E0EFDE33814F6219DEB0B31AF67F655FA5B1C28DBD78E322B96 +A1DFDD81E3F75EA43A7C1BC923344774F9A06E8323CD1C5A3764C98A95F78290 +C66703AEEA967DD717B6C11E2BFC4CC966D38D7CC05BB9FE5B98A59D0321BA6B +908524F664695D6C4AC6D36DC0650E792993B3C8BF3A5F9BDCF1DEE23469CF3C +9D174083F0666A94DCE183EEF39AED664EA96F369CA87C365BEFB386FA3D1C57 +855BBEF5FB778FA0D16EDF3BB714C5A0085FF924036170096886992647B0506C +19AD3E8183E108F85F22474EEF2FF1C792F900A7DED01E37DD0A0E5659BF98CD +FA278D5DBF3C8BEFC72FA3BC09B646D5C229439C3E3E835CF60BE09EB8DABBC0 +76DDBB693716754E3869C0FFBB425A3B33CC88681849B22F31CD98FC1B7EBE30 +76657F699667B51B1EF8E3B550CABBCA69BBD090C92898AD9834772DF8465C42 +4856D3AAC91A29A3B67206EA3F99A19DDC78433464D8A6315679916C4CC1F66E +F6B43EF15FA032F4BC45336D4119131936FAEF8A440BFDADF0B6F076DF1ABCDD +C3579F02E2C40EB55CF31782D8BB8B070C3BD4F48D0BBFCF331703851266D535 +61FD82D986F1D33C5CF6A9EACAB25D736AF2A1BEEE35A765BED58A75849F0068 +5210A5E110BEF1741A96C2FFC63C3F9D8FB305820203C1B406F3DDB54D869961 +E034946FBFC4D184CB3481693C579145761951F7EFADE27ABB4A0003847AD885 +FE585EA13987B334332EFD1A958CBBE3CB21A4F1C61AA81465BD4F524CD99E79 +35297F71EB9CA7C9701760857CE95295B397976516378EC7A570126DAF1CA3A1 +5095186DEF18373FD55DA596EE7688D86A367E02FCC0A36D564BF7DB6B263546 +79F4E1276EA549927A38DC8383E8FBA16BBB17CFC6B2833C90959FDC6B3F7266 +32F177624A9E26835C7C0E2FBEB1656E246C8BF4EB7803FE4AB0F9DDB77221DB +E4F134C8304EB13D8AD0FB57C4766133AF879DBB7FB52F25A555FA74F145DD3F +65990835245E26480C90E25CE74A249D9B8388A27A4BD2F63D72E383BCFF0E08 +B9EF146B512522DC267836520267ECFD46C68115FEF3ECC655A1FE092B9DBCC5 +412220BD4EF12017FAB9C51F198725E8F225DBBED24F56239C558D545D353632 +415F5688D0A85519E8AC25F27E20A4F7B903F62D9D2EAEEF33ECA60EAC68E55E +2A50DABEBCF97404687089D2B569EF016DE39DD953D7C458F77FCEED17ADD98C +C6AAA67F4F09E24BF7C24968B44D1B489726DC2E2BB3C481C676B3BBF0E623C6 +E649C80370023502121070725DF295DAA8565F5771AD8E8E2C82F96700D896C0 +CEF869F7EEBA4D2DAB7C4E455C10EB229AD97B669781182BDA58DF962823F597 +BC8CD6BDEA739C255CDA232E4B2256815DE91D09CFAC6FDBD8657BD9DCF730C9 +86315332754F25B6B3A913D786A2AED4EF78083F82FA1EA8EA16C0A6CCC6533A +0135BAC54D05B4553EFD04D1B5BEC10B60E1A621050CED2CAF978B057225CF30 +2322C543CE420CCBB0A24988653589B431FB84646945114A37A6780BF1DE812D +31E82FA08B4C0716E17F6831F4DBCF7EEB127855B88494315A98C578B5C5C03E +151EE2E561D90DD354E6697425A49E5B5ED079FA28FB845E4ACF4D447FD0A560 +5BB8D71BCDD40F657184F0005B40C2A51F9C0B3782B8B984D0F5552537C37BC3 +5864EF3457143C4F36B42E59B27AFDB623EE36C82EA73A1DC27B52E544702659 +AA4073FF40AC396F1B2D19E30A4A69A1723A5C2492BA056DC1B7D04BD4331E99 +B921369A7E502808FFF67C468440ABBD4E9379C0FF2893D2B9E96F32F9E2A304 +BBA87F43DB45BFA9B221EEBA8F65E0D97385485A49FE8C259000C6E2D66120E7 +492347BFA4021115140252CDB140EC68E2E404C35FD2BADB2A27D36BA2E11F15 +D300A92DB828646F12CC677EEBC545630FA2A8046E6AB14CAC5A6ED967644D32 +D0D915351D39913CC43E4C2E379C59762DE62C190657A6AB262F4D2CD54EEAAE +6305BDCD3D240FD8CC45CEE4291D905C01C05975FF24F77EF6DC03471E9BB834 +AE38A38225342FBAD3F20E3AEE82799CF60EF345BD46DBB56BA7217C1C887F89 +581B6A9BF199E4EF6B9DB643C2D0089E0AC0DD291D4C2A0752B7944EAE45E0C0 +A3CDCD4D5266C7C8FDA7D5D1F84E6C93348CA767108DC279D961CAEF68F8A496 +492D446DC08D83A60796EC823C1BD78872704B08D9FA16094D274398B4B3CEE5 +15504209BE801FC20D7CA94EF3571938E17168A44B36FB9674ABD86A83306CAE +D9EAB6D8325852DC6B10D798B95E56EB8FA973A2BBA555000D71F7D997142E36 +A93CBC654CF5966B93D599405BB73E5473EEF6B961452F14E0865F44FFBF0797 +C5693895A9E33620B85DFA530C480ECEC3D773DE6AD42EAAAE6ED9DDC951533B +635E40FC95A015974764B7626C71A9FAE2D672B158BB1557EB24EF575ECF5FD5 +3BDAA7AC6D8A5FBC83AA00F45F1007D1BC258AF9A672D9E103A74087C041F4CB +911F8DA6BE3CEBA90F205384E9C509E13D7B2B47286F459789FD24A838DE07FD +ADACC111B894CE32BBDB391242AB4FED699F01D3CD324F1627B6C6734795D322 +D9CF128F25DFD154B79304FCF80893C922859143320D0D9EFA15F2E03465E5C3 +070D93B1B8A13271D90437185C6772A7B3B87B196AA179FA45E7C0806AC25D21 +E5A085A0510B197C7A5207F5D56ABD5601CEB6D079BC26849DB73EBD4E3C802D +8BEAFEAD9DE346E7AB231F70318B1F0238C766D61943F81F94EE771042743947 +77E4A94D282D61965A8C2ED87E8439C080B889BF255B92FF7B61975A1AF63EA7 +DEAA26B4F0E843E7F4A3EA99AB6FCC3D9EAF6160E3BD2F4354605EB04DBE558A +A52FB6D8DCA009DCB6C601B876B742AFC3A23E15974F95967200EACF37191675 +2612AED74EEFF9AED8C10CDAE9EAC4838360EF1CA65674752F40B025A003AEB5 +A5919B705EC58109C2CAAB41D8776E02892099B9092A6D457ADBFDA01E85A140 +703575A7733CB865589CE31B02D11A0C00A947CC9D9AEA8BCB465AED57BC4ADF +061E66BC22D032CFE50538610836FC4AA481441FCC43007AC96BEF93EE9A3A34 +4EF8100E7DEF7C6A000FCDF5AE879D1A8DD4DA585C9A71303E43D48B16FB83F2 +FA5C94590FBC5EAACE4B55291AB239B5DFFD8ED7C872A8A35B0C82EFC57F42E2 +93E4A0A517FB12D9317B6CC10A2627CFCC61D350D5D0DA9E5359D97B7EA1321F +F63B3991C42F2CF06910322C780E5F47AB64AB236225724FE7552B9D20B80758 +0380188728CC0D3CDDDB0EB24112C19122DDB20F74117A55EBF797C1FB3BDF24 +F2008D619DB7C4625A4B057AB3BBFAD0DB7CA7BD269E30E23AF79F55128EB072 +F1230F61B2F2335E4552933EAA4E2FDBA83B68C4B728BE38FF1DE4D3BF0E9E60 +B3B1B5DBB32C20988804C2F8AEC791170AFC72CB1314B80CE56F3F73A4E660CF +A37AC1164AACC6E4FB408F222758ACA11306768B9563D26ABCE6712B5A8D9C52 +DD6B23BC73ABC37DD6FE71959ECC1068CEC2F7932C3097B97660938717DA89FB +7D5D36DBFE675083324354982253BD5397F872299E6E1CE7324A65ED0E36D9D2 +F4D8782C0F73F85442E0363D3E3059AC33E8BC80164D5DA72D5C5A45A02552B2 +EAD050CAE6B0568943DE1A68599EB004B2915CAF6A1CF0C847178CDAA1A1082D +A67CFAC77E43F21E5DE0B4E0C67F59113E98AA0908F7D84B4AB5E52BCBF44D2E +7742591D365B208AE0ACCA84DFF546069D8D3A8A7007B09AEAE51C00248BEDFA +48A4D06B188A51E9FB585694A79377E1F03F685C1E901D1DAB35E37A3E4BC240 +CC1203D603EBE53891ED663DEECA562214DDE8A6FD4145CD70D5C11FFFA2C160 +3E855E6F51F5702C127348920EF8128B32C7F355C491392075143FE94B8B9B9F +9D692E4937B217E4023F20CD7E215EC36AD550FE802D12014374F2B71C66491F +B36A3A167BD8DD66B5AB2209A161E45B377CFB13842198736A301B6032E48B45 +89C83613A7D8EBA90E721C747C3FF4DAE1B0FBDC1832FA1ABA7AB8ACA5AA0AD5 +3EE07D977E8423EF0EE73FD074BBF9BB333107C8CB8EE34C6453A92E8F00D97C +AA32BF9D5C29794B97F94B299F2B256225F83749D1804BE657C1AAF393A517B5 +A299757B0DC2927975118FCA733BA8D1AC62ADF30D850F2F0D15FD7CC86DFC9D +FE51B94E5404FEBA90C39EF938AED93E3D871780657B4B3B2089CA226A6C5BFE +D558B6DFD466A8AB3FB9B1EBF7DE20A58D73F7169F9C3D74162097245072EA76 +57C1E0CD95A52F20A9696CFB3A0C9B5E291AE98EAE099046459FC79DFC035FFA +2226C3484390AD5453CA6AF02EE6EF557D7091197D9D6B4A350268EB383A0E21 +432C9947F0406246D8F092D7B4E66C4F26022F23764C5FD368199A55043ED876 +DB5153DE7AB4517BBAFE8C7E2E5F9A8009953CC190CE2FE17D8A4A9F935B53FD +B0A7E99E95890FED19FD4DBF3037CD343F0DD60D976DC45FFD226BAAA771F8A8 +825BE0896EA5FB4F1630E3E094F4CE48BBB77DF3B3E02A4C87DD3DBCCEFEFDFA +49366A42922C9D6BA8B158D5CA984E39747767D90406F265EB3969458A0EF64D +3068C11E9AD68E9A7CC8D16B9A7D039C771FDFA7A53B57DADDC28A192E855F08 +53C1181C71FB478D99689750BA59720B93D59A6A59BC01E31043E0746B31F184 +4484ED2190B3164E5DC9611F4866ADFD85A70590F1E10D3342210182D774DE19 +69E8B4CF605F9DF4C801305406F5D6FCBB9980D63521C12AF90CDCD2C0A728D1 +FCB6FF4E863DA97B067C95A66DB6CD3793B140F62DD957769B62E5CABCA270F6 +0398DEBF12A0920735A29CA5CCC9E713A772E5F49715EB6940E4A9F06CE317BF +7591CE708F06D58EDC3780472793D31B359ABD417FC8FAA880B39E7957B90312 +0964AA59434BE4D1A758B0AF818B2FDECE8A66A7E8D5330576145B60FB56297B +70365939DA78E35B2B557012568991AFC0C30042E0EF061ECEC5718B473C9D00 +47C519445B354A2A80A161A49E893D787BCD72AF0717C2F77F8AD5883433EE6F +EF9792F7DCE4CDAB9C63E13CF9B5BB241C5EEEA9DE55737F194C2F614E80D0B8 +B52B1972D6FA1B08B00DE7D85FCA62277DA0BEDBBA20788C1C6F30A81392BB8A +1AF5EBBFBE30161C99A168DFAFC67F3A32DC0E31E5E08B89B0E377BD4FE7016D +8F65AA31FEA39019E03A5532DFBE38754B6170E0A1104AF8A31B47254FA38987 +90E53D9688161537F1C6CFBF189C792B2B3E7817CDB7072E1391457DAF548270 +2F91AE044394B948B167AFA7DFE2EE15CEDB3409095D19844E623CFAF4907DDE +965ADA237507174C60EE9869D7E5E8ADDCF44279B0CEB596DABFBE6D2ACE78E2 +46211F05BD34346E31D885FCF6BE36A2A643205944FF48190F448087D93CB30C +3E7FCE736771910C808CF27BC1E5C0960987EE453BF73AABBFA80108154E66F3 +159104B535BE89859557D664DCBDBE24E6A9B9AAE1EC3FE611BECFD8A0BAC2C0 +861A22799746A3F8C75DDCAB438BFC31431CC7113AB6360D19A91A275CD45503 +795765EE75349C2BB62ED8F062810D3795D653D4C3E4FC7AEE0D09A156F4D683 +BC9DAC716398B877BC4F4FE997255B26BD15132E963BFF80D6F74B102160B97C +27EF76D963C6F54668D47D8D28CD4CD8BF8A15E34776D3342BBD5B6331DCF1CF +8C960C7EF6DA0F04E136CE2DE3B338ED4E45C625BC8EE55E30FACE1700323489 +C7DFEBA8382EF6CB5E6A61833D9E92E68C8C3EA2DDAD87A3F2CE295D4A629F88 +70010FAAD335D042BC9D465C0CF51CE964853A3CB5CF28A1959E3C865A074CB0 +37508C4581F632DC9DA0241D0558EA26CA4F1FC705E5D041843E1066695BB5B5 +8255BAA392B820EFA34754C408516E11AAB38CFC02FAE7FD63DD7074A6E184E2 +CC740327F503868E5E520FCD90B8A35C82AA7CC73CB7131DB9884A3A5807A640 +AA44A3DBCEEF922811D110103202903499614AEEE640F3FC59E388063977C9AA +A9F8EFD1011B373B255A97FD7B78ACD5DA909CC4C93A1CB43FE7AC05602460CC +D1C216CB1CAF35CC28EFA959702BD3428F7D632425234F0F576620EE6B1AEF82 +20BE109D25F84EEB9B63E0B73D821DD4E61E6818399CEC44CB0EF3FE1344994D +B1DBC9DB8295A167EF8E5BDC1EDA72F083892ED899985AB0A3E18498A45E2B59 +08866DF7F498C3B2F7E23DF363253F9E98305DEB607409E5D0AEDC7871C40D58 +F23B5BA04228862950727602BD83F688C922D3A68DEB7D232FE494DC1FED59B0 +0D466C25DCCDBE438E03D313E569FBE1B6876622BA9EECC2FD175489A79BD995 +351E2C9CD01347462221D7515DBA4AD2C9C20C266973409876EEB6CF6D6EC08E +2E7A63E48B4A67E5855FECEA3C54F06F726DC0F2ACA724B448F9C4E2BA7C6938 +B6B3C6059DC998EBBFC735C9663F1A247697647E5D26FC8389E4F6FB5F69A18E +38EF7FB2B36238EDA100BB2B2C455247CC08127C60B9A28D024C4DB20C80EE0C +CEB3C166B6008D6A907F24AE05B63C9B85B430E35CE927A6D13715B65F5C67AB +E2CCDE71EEF21AC3FB69357D5916DDAB420EBFE320A253887CE8299F546BDA97 +17F45CFE9FB9B44D66993F40044DA0580276D975D803A05A027FE197C3E69D59 +B0C603D5BE4BE783BF55EB89256353DA6F7DCFAD6C82EB09720475388F813717 +7E2483F98490A0BB7646648F9412A4C4FBC5DE09314824BF6A43D101BCFD9C49 +365EE33D1B763EE47AEDDCACF09E3E6D9641FDC4F9E284FBFF5F294B5D0D7982 +A9E545973B54B2D8C9D6BDE55FD08AB8E694981977C77FCDE79028F32C83957F +26BD8CE3831EFC042B0451DC555F7E9EE0F2D40D2CED487607F48893E8696F8F +82CB5367D9FC51A77ECF7E5DE6B8BB8C626EA7FC74B0244A0BD2EC1FAD94A851 +2539C6AADEF9353DDCF498D9733631464FBFA298E9D23BBD041773D482749836 +38408C5D99794F76C6446C22FAC277F8DDA658D73EFDC46B2554CA6086FE7EBC +34509F5B1207C16727B2BA222684395FA168CB5AFC620533B2F96B75C1775BD0 +441201D19F2A70D8ED17863A5475DF5D6A5AB72770F1A3DD16B39E8144782FF5 +90E791130097DA74E731272EEC9BC60BA75957A5CEEBE835A0D77A4780346A93 +CC984FE0C9C46C069BB51434FF0A79DBCBDD5499F48CBD944693E0B9D18A143E +5441A3A57F34B00B5B8AF59D97B19425795D85109708F66F3A37E88E291BA6AC +5C37B29DACCF16C44FA4D77AA0DD573AB26DCF46D8DD8C33C881776A4FD6B343 +4719258FD5B4718BA8DBC94882C530D8F47B26EAD4E54B19848AF2D897AA7B47 +CFA178A45E213BD3CADA498F7BB93E3C74A3598C62C28C5ACAF0EC172F883BC0 +79376D48F6E7BAF85A6823D839AE7AE15458BB33C33E6FFF63B3BE3D76E02B32 +2A207D6F113E85E66112E81177C3E72A5B7F902B6D1B8B7542D7985D69DDB0E5 +97F03187C939369D10A417C300DA1FD0833F338232A00C85085354794AE9A087 +B8459A999A576151D01F30F45CE06180A55C236C5C3588AFC541DF83F444CDEA +779B7C825B740D7B21897818A5BB90E728A5F1E915D789FD3E8CF619283C1599 +ADB01CFDD7B20F4B9FDE8CA2413C6F1325D5E39A641E638A5F212F32651FC540 +CEF349609A36CD64B144BB229B28B167355EE604084E480453478F271D93EE51 +41D289565FDD80C24047C5DA6F6E63CAEEEB361039CF136F6BB6771CB997F039 +D8011DC0882CB6E07E419E90AD2E1BC3ED4EC481A2437C1E960B86E413C54264 +4B0D655C8BB8C1EF0B2A584AFEFEC63AB229B037AF7FEC78D0C0762B250909F8 +84A3937FE5ED394B22B1A4F7172070CE1BA5EBE02E93389A6451711D2A33172D +8FE716E279CBD94F81AEDBCBE43829536DCB6D816B5348FFAA49A335FFC47016 +40D65A9C2CF70ED6F14D294D7F00F94DD5E918704CE7BCA42214E9607686FF1A +61397C31A3E9D28589472CBED26C2B8E3AB2CC5DDFFC5936D1CF3DA9649A489D +32B719EE6DA53A1FC5A2BCE8CE665D5AE01EE561782FE7B3200A132493AB290E +E77BE8561EEC178552D26E0BAD490BAE7B2B2D1CC2AE29BCC85C3034F43B3BBA +513BC8375DF221D42B25F5558D19E12D70402A1BDA81C56BBFEE60F99D9F152C +6437B8D268FCD49673024BCFD4755E1A0A3436D12D2F6E71CA0BF0C3CCD00D38 +34EC290C7CFFAF3485C8FE848A543DAC0172E025CEBCE2287E958BC91207DDDB +3734DBCF73E7EB9E6ADBDFC35FE75F759EAD1D341C576F047106AA89CE30039B +A9C4155E3EB571E700F8C0F04E24D4841EEB8D99A1BA05E3291925820C28DDCE +34CCCF4CFC655D49295F159733DE276D962A8C5CB859886FB0CF642903F78E07 +FB0995EA336A63EC9CDB5D2EEF6B32C81B13D1848849F07B653887067115F113 +57855931115AE76D7147110B2F3C2ED20D7466B19CF8DED751C15F12C730CC54 +C86124A03673725D1331E75DD9E4A84858EBF5F2DF6AD2B0FD5842DC6372F5DE +F334D21F312501E790CBCFBA0EC9823BDB1BBB32BE5CEF2AC5906A368D6C39E9 +D913191C0DE05C20C24B10048368362E7702CF6E993E6904A85693B520CCE666 +7F7DDF2FDC2195CAC5CA89D230EF1C383403DF6E22B64EDAAF6A1ADE3086DC01 +1849B6865F7ABA165F2895DC703FC7536F3CB306CA6C3375F36CB5C7BAB8C78E +DE37462B465EFAE538C52267E0FD152467BA4EF681512BE295D3FB2D5ED98B37 +9544A30798D1571B8E794A4D3B6D0D0F2F630E2948B45B187EAC18272506E2B0 +8029D9ED7C5C82CFB5713B0FD929DB6B718B8C3A1211C9A9D587DBD58E54E0B0 +E05B89A429FBDD4BF4CF309E9C189A21BD42065D007DEFFF38387A02B90EEEED +CC4C5CF3B8788549D626CC25AA246CC022C8C1CA9703EF945139B8E10936251C +80C21FE36821D75D0BAA1443C3E119BC08FD153CCC20A52074C095D2680AB050 +D203DC0CDE27771081ED74A2C5E0718B93364680F6512BBA43F1357A70839CE9 +C7D010B2B90DA733C74E634BD0FA1D281D40779E4FC55139CD11170ED58E71E4 +A4616EBF68B805122D4AC069B9C30F7F9B8A204D740C17DE428781CABDABAEBB +02F0B018E812F00EB92D5D80D91A5E9755176BFD7625B80223C2E69EA237D8C4 +08E1A8B51CD142F48A760EA85D01BDB66284D61120A61EA87086227DD004CDAE +FEAFD1206700187B602FBB2E3CED6F333E6DB5425EC0E604A7478C017CF376B7 +D7B7548FC9AD882014F7598408E31000BD53B0A7D17A8ED5EB220D9D7C9B0022 +24DB358061C415A4A3DA467579F663357CB97509ACB840EF5C7609B7B8A5E1A1 +14E23BB75597312A45241847AAB21DEB166BB0452821C26063A14EF05B628230 +D63292B46CB3F53B7FEF2070D4C4D613479CCF39888224995D02369F5E3F1DB7 +27390BF482072E7DE300F0425DD301869878946C67DE03E713B69DDC2BED58EB +1E8FA154A787BBD1FA64D76CD35FC1502CF01CD9476B5C1B7A623F221317965C +AD3838AB18F185A9B20DB62391599043F31D1B0AA90C38C23174C7B018EB576C +B1C7D583F723420FEF9AC11898802AA768B4AB70748AFBFACDED99C1789700BC +A662B71CAA1855B83A55CFD1174DCF8DB001BADA69E45340FFDF0202D311006D +996FA17BF67209A51CF06B84BEFC6BEB2C60B8669704BC51BA6AFD0130F37076 +6787C7E5119A7F1B4D1CCAB950A4621C794A128D3971759E71922D9FB2112998 +4C50EEE88291107A0C519F68E411E47AE4EDBC9A269DB4830FA3B2914B53AE1F +A58B33B223C20BB614BF2E63405764A993CC250A728E4D420BB85F5829A862C9 +DD58D417A74FE8A828F62DA4D1D31955E57520CE2F7DB2E4F06B6179E55EBF7A +289335B17E77CAAAC62C6A8FF7CA4CAAC6BFA1326B5FA32FEFB991B0DD0B38D7 +71EE06380478EC47549B91881C3D6E1B0C66258423B3C69C0FAC17A802832D06 +0B9AB3088DEC73B497204E5CC44E434647E320C5D83F8EA2A7E25B5868957E9B +0E5347626A484C986FA5105920F079A5F520F5DE92AE530DA801E329C8592FE5 +5210709E8CF735F74F9CFFD32746E3BFD54A40E4C08AA4EADAA303C66E4417F0 +8D5B75ACEA41CB1A41A6788BB557420A9609400F6062AF8C3BCE7F603B73BACA +35BBB418E0802B22725723E12B92A231E0C35B37A05CA9380CBE911C8895F380 +780EA4E04A8714D90EA911376541A2CAE1A013362634AA04504D98DBCEEEBD8C +6DF498805612B3931FF721E63C8EAC4C74C0AC8128468348A2DB56702FFCFB23 +A6F78B6F7DD08E48D44E4DA7880836CB949BA8E915393E6B62F58F9D34568A49 +2FDF255FB29FFD0DA9878C19F2961BCBBA487A9A578C36476E6A49CB72BF980D +D64D3EFD82077CC0663290BE95C13BAA1C5C07F50B74FD00A1B50788BE98EEC7 +F0CECD0D9612B59E385BC644B0728EB209FB5A0BF334A8F1772A88AA0E4138A2 +518FBCFBA956ACC6F566FA6BCC66AA2CF374F0D457DC7D7A715CF066B08FF1BB +561BC5F6CC3C48E857595F9986829E38C6FC8AA8573EFE7FD6A95CBCDD859778 +AC517A3CAC168CBD3B9BBCE9D00111B3241418BE0B2E690CF4A737C816441862 +E25529374DE12E7361ED23E542BCFEE4D30EB8B746C2D133DFA2A68A8D2FBCC4 +6934E2ADAE482AE22DFD714F77E228F95E934E4C286E428AF5766B5AA22189CF +DFECD70F4D98ECBDA9FE483FC30EB5FC4800D0A5205F23F863C21CE0E4BF6C84 +1EF9E77C68C99AFD3EFB879EB1EBEA8ED7E8C4C7CF7DEC6C2182901EF483B76B +F83AFA9C1827AF5C3F6A29C36723E3A657C0E5DB55C198934FF5A59119DB5536 +F69CDB34DADFB6F596ABD7C5885103CC95068D113C3C17E9CA8C34C0B74E7463 +1D5C83DDB5B45D8EA510C279FAF577840958A13CF2B13741D74BEE4941A1C207 +BDC5EBFADB4CC01FA3F12D22E431BA17527C4BFC940A6A08BDE150C6E47D752A +5FD943C4B7CAE482FFB7AA27371A6C45E2CE4C31EBDC8337A1B853A74B2A17D6 +BC607BA9D38B71D86F586A33D440B616443F58A103521AE1D6A1755E74BE6BA3 +05E45006058BA47601191958463583E8D2F0985D6356D9868E84C538654AE972 +D59C6F48D9D3B929BA4704DE684A35438FDA0CF60B3D2E1610642D87F690A3E0 +7CCE4A5AF8180114A8EE9D360C8F0C6A033F2331C546D34FD1B1E95B9E7C914E +0074C40A105428550886A264C74306F7CC221D78352DD53E39BA99C1AC851E9D +14A3B0B9CCE04806615D7D90F377FA3BA50182DAB42EC6E32475AD56B8B1CBD1 +D265458CEFA79C68853CB11DCE026C339CD3ADBB44259AC7318B39EDDE33FE33 +E542E4BC5C64B36B159D68F59A9B2BC55C0343EDA853A4D9E6E3E53176F46EA7 +3EC1D108D76588C7A80BDB8DE432DE32CA3AC3C74ADFEC515372B0594EF82832 +CD7075AF87CCDFAD82D2A570ACF179B6B6A318AC8EAEEB99B34DCB1A14A52ED2 +E35A0EA8C1A5449D63695FA7E52847B7446C4489751099B0D2103FA57ABBBC30 +A77E6C9682D560D4BD9AF78B0798FD89623126945A09BCDBD5789F6551B679F1 +52EEF0A6603ACEA8F7B9E5B58C25D760BC078943C5502E3230A31539DCA5A7B3 +14562F1283E8FF98361D23CAA48BC78267F46B0255C526AA8E5800D0B570D3FF +C6C79CC39C2CCF320006298AE4085BB7E3C57ED37DB620A2D8B34F1E970E7020 +4C5D676BDF124E2524EB93948ECEB3B53BB3DDDE062293EF03670EAD36FCD0B9 +001D87FC35F0EB90B6CE065AD2040770E4CBB96F020F665E563DF248C12C95FF +C07EB290B8ED0AA843FCD2D04BAFAA0863143FAAEB275FA8321DF73D589DE07C +797027BFA79A5B29C03B560F41C999739CD272B01FAE34C0735820A9A78D75A8 +F89FF3D929D1CBD7B76707BB236ABFAB615FD25F4033EF8A2A9382C58A8C3617 +78CDF0F6B662C3785833F58F71115ABF92195968F87D49762536661699EA32F4 +E8B82036F147A0C8726FA2181EA36EE6D627F2422115A66EFA13A5AEB1DC6743 +0961EBBFE03965204975852DD634AC09B0C3C167F53C34EF7ADA1D0C1A09FE1B +EA96BBE639FDFFE69A5DFB097BE71FBFE695DECA330DC168AA85065345124FEF +E37DE2DB9E927F58DA629D912B31688B51B4BA61D9B8AAD2C552CCFB36274DC6 +9E6CBD67698CD4D16E75D1119A90A32373982E631E5B8DA9D648A5CFE65CA188 +F27778BFF26E6A55DF01A286E8F6376AB5A472FB3B2E779E79D55A41AEE83A00 +5D00E9CAD77F5E6018FB4C59A2F114A65FCC20EAF2C8E026BB97D1B94F9E7686 +B42A7D9A1A1DBD41DB89C4DC7FEBA4BA24613D0FC3931A05E39C4C6BF4D8E92A +11FD40EE366783E9BB2EE55F57B5E2C4B9C62D3217C83E28DA32D9C122149036 +CBA8F707B7D3333517F283612691DB9A335A035A77B5C4EB4B4FD5511346341E +99C55CEAE7FFEA94BB8F326BE2DE4C8D280FDD633CCB813B56F4E85FFFADC926 +EBE5C08265413E93C86D6F3CE187B09B0747EFAA8E25A153167A140E2D49614E +AF270C8B6FCC854DBF52B62DC238E83659B138CFAC77F86DF19FB7D5C3FD4DED +C688799A95A559368A4CECB79B7CC1FF10CCFE9111A74487CBC153A2248A9E66 +C6EE896EC885B43B73C18215CDD7CD8355BF63F81E4C8796502D4CEA494AD600 +49C684E376F5844FB4D02707A1F96A5E942EFBEE3359C77ED930EE904361B0CD +01C86D8DC2C913E7644821E9A30714D18BC6357A5FE23CD8C9866C8E8F5729BA +A16537D2D88077C7143116322F0ABC5C980DAF9FA8F13BCCA75B02E5CACFC475 +801A43107FE42A0CC87AE1A78B0F839197C02F2680F9094779C3A197574B5C76 +8D48F3BD89EAA1A1D98D6B63BCC31CEC0996BAA5F7E0057C2447E72CA708F14B +C458F47D91F356E24D91049EDE3BBDB7D1BBE32C4ED5AC7771CD321C3296D92F +68B6CA333B0060E2A6F5FA71D4A0CFF0453A788C1BA661DAEB4CF87557BBFADC +7BA7D7D2939FD8D63F29D5FACE40BDF71AD0353293E80988D111FEBF46719056 +954162563E759F0314EE7A0BD5367CA6D2DB23B8E33EF0A094B77C89E1DCB645 +8E1B168561D7925778E38208CD5970A2E43CE2A5EBF52E87273D21E7D35A3869 +CE1F1A0E07AFAF4C2CC21B80A443BD9851D8D527C1343E975EEC4512950413B8 +EA9F99D32A13F42A432EE52489EB370AA99FEDD2330B75C47DC86A9106D67FE7 +80192E2109FEC77E00F60F1127501F4BFFFF05167EF94EA7B9CD14049AB7AE80 +2AF55490FD8DA3C80DBF9ED6FEBD0FC03CC5D82194F950F902966279C4E84D83 +A7CF067E1D1F07EA1A31C93B8FEF995E65BD7DC1B3B81181F8B5954C7BC4B62E +19DC9B35C23652C15ADF50C84B968A12CF882D426486C46D3FFD964F5D6CADD5 +BF4500AB9B4CEC2A1AAED512CCB64071CF9FCE7E5357915497ECC259DA2949CD +9CBE29B3F9ADE03E939B636146E8A4E8AA19DCC0F8C7A0DC9BA422BBE4988A37 +6513EB6774F0043EECA9F241E6A827095FE05AA6BAB09E66D08AADD69EA5BB8B +F813CB9DB27C48F68508550BD494EC3F16589333B7E4A1803A5BE00C40F1BBF3 +835682C6242C479843DE30D6EB9088A48F115BBA988EAD5DFA2FBC018400D176 +840CFE498BFE4F06367B74B339B2317362897D6B4134DE01BBF9E9D9F980911C +441EA5D6F6548F4E87835A7B566C8471A03C53136CC7D6A58E77A702EECF4327 +89D008FF5E51A274BDB5A00D3048039287C11B51E458A4DB2A9481679A2C7FD9 +A30D9E8FFA4A7220F36A187D02BC85D76EDB1FF407F33E5E1832AFF2ADB9EC73 +32281F6DDC48EEBA894FCD14741BFB4CE477EA93640F8F7C7E8BD21E257477CA +F7688681DF0D3954A6C6794AD9AED1DA0C570E04CDFC4D3933D7DF89AB3CCDBE +E268AABAE4FE28CC63B84894DEBF941D3F886B0464C111B698856873F05910CA +A413A719611582A91DE699BC47E9C13B7A0F0B3E6FB816D5A03AEEB88A82ABE0 +106DD301196A40FB17E79BA85A6D5D4867E7D057B246BB24DB079BF42D1663F1 +B20A7E4017EA26B390DC39A57CF356C81851FA5775DB347A0DF1F174202CEA7C +E13CA1F2713381D9D9FB3A64AACD69C0B48C18EAFD68C6B6B3C088189E805ADC +D1F58F03E0B1BCFF4229CDE123B1EA5E026AF1B958B9C08ABE3B5D3E2F821ECC +3B92CF0F3AE909D1EE1E5158D1D70E0891D888E385FCDD4AF71CA1EEA06C7BFA +71D584E9A0000D508DBF6C18D30303666B2DFF6EBE81B9EA48D8D794763471FE +5FF36DB90E8C6D2FF2B7897FF64070F8D1982DF106E402426AD09A64B7AC5BCA +1C6DCDE633BC4DE9E8AEABC46E7559E349A0E905322F4B7E395EADFA8F8D959D +F0E28E01DBA51F7BD55163D95412B7E499C9B480B6638F1CFA2278CFB3B99555 +0CFC8821F3E79EE3362947A6406B58C5077A75E2ADC6B61DBDBE9AF3205257DF +8A7D6069D7B2C9721E50488BC754E94D1D8A4FD3747239724BB3C8F5CA2F88D4 +F69CA5F395B8A36141E40954392B5D2E3F3E49936F48E8B51CD931E53AADD3CA +32B241648A3CEAA5E2D53B8B0A8DEE138E3F4BF88D1BAD2988AE342E825889B0 +38B5F9606A6DC3BD767EBDF6DA984E28F9A203F015DC1B17E26CC038DBA71CC4 +6A3D5ECF75802A02182AA4DC7FD34438E59960BA78B9E11755B4314886681B17 +AE05C263496170AB1B642C34226043809F8F8CB80D30A3C3C97F07E9EF849CF5 +FCF99D9797AE8DFE2644F1D597A37BF88FD02891506EB46E3DCF1C4DC905B39A +568ED960C0CCEE30C5A075244E2DDFA8B568133780DCB656A537936924B7BE2D +30D00FCB4A82F0C6CA1E7391B4ECEAC37EF8A32DD4FF229E31D8982D1B876C47 +924D26DED97B91661E126FDB72057412C5DA49D95A2FA3676CAD58E01ED9DE79 +162BB27E9F2005680D82967F953A96A11501ED68DC6157894C3461E1AEBC38C4 +DDF4962D9E09C66323FB6323DC88AC476ED6FD17025A5FEAB7B6C6A1BD4EB30F +97C6527D6D836BA80E4F2A1C046368AE6BFBE132742EE6538DC48C918A1EA445 +A5651759AC5E5ECA97F21EE2DD6EE9B77B406DBAF1EA9BAA64AA075C57DF68B4 +119C681608ABD57E5A6E99251B000CD846F2C72519170A7750E01C1BF79C84E8 +0C24B2F74C73E3939BD161C67D2DDFB5451488B8EF6EB0EBB8C8012D237C9ADE +B04820C893FA30A071C8431E028D33D656ACC12A83675C598C4E5F1F4162F113 +75D9D193D32EB3B3266DCA5B2FC27AE87403191FC06DE4BE6B40950D60CC2483 +E9EDCE3525E6AF91CEDA7A7BFED86C6D2F5ADB3DD0CE502EE2440D6529604ED9 +0CAAF7A0B94495B5E3472B9B4E4E72EAB9C899661AA695F0E1DD191597C35CEC +11286CFD8CCCEDE2D696E60DFEE518FE2332532354EC36D4027B9E54B5C1AC41 +5D9087477E50D0074E93CFC74A8B2B4040C46D926982699A02547C6E5A95515E +C906EADFE24EDC658549171DE19D95CFAC7A3E49590A741E0A872F96766F7171 +619DE1436EFB3E29091DF36087E573ED4C72A81B41ADC7FB681D08CA20ABC35A +51BE69C85474E53D53F684AB7FBA6870930D72B2AC917858348C081334478640 +BFD6781387E5F9884F5B9A2F3F1377AF5FA2CA52EA68406AFAB6C91A888F47A1 +E002AA927D2CC11E2DDBA648960495CF1DBC184F6B4D5A44F1CBD67D8EB6FAC9 +76E386AC7DDC99C1D872500FB355A3A0AC805C1E00947F8B82B918A84B1AD2E0 +3E881C0E82BB047E0275CDB9E09E1580DB2EBF20FECDD095910DF6EE017D79CE +6E4590FE4F14BFE554C625122FCDF115A6C8D9F6FE0E9AE6A29BA1F7B2311716 +E37CCFCD0E972F8CF909939007CD86D2AA045ED816AC1F330DC706C3ADD1D239 +D3FAC4AB5CD5344994EA1978131472A279EB0A8F9B9380333CA610DB402B679A +0773807938FF12E8244ED2F0D75D6C5BF2C9AADEAD23F8D5BE373662C8485AF0 +66A33CF74C47C41995581B77AC05E0165E15173A956E59C6DF4873092C27986D +ECA1916C2E34439E1952CA26E948E90840495B9698C2FD3A729B83DC30A0EBD2 +DF4270B5209BF65B841617AD963AAF85FA87CBED7158A4268F2F9C8A15E9F4F0 +C665FD784CDFD2FB1DC812AAFC7239315E7165A6B09E85D55C23E7A0482A6EE6 +E3F7EF9C479F66538A7F8FC39336E6CB09A3198E701F8D9C1CD3FDA395962097 +DC645A28F27CACABC767CA49D2DC82D41FE90279348184E415ECE21B1A3756B9 +F7E10BE0C2002D2DD040983D479C5E1F8A95DD7EF37E795B7C0DBACEFA209C14 +A295E95EADEE1CDC8A35E72C77ABA8DC344D00E2186091CD6420651F6D67900E +67C6D42D0AECF3906191DE5996D7A9E7B78FBC03D5D7E9974DF81F1B203B6D1B +BA18F089F2A40B72E69C7317D753DE2495E9EEC907D099F22EBB8AEEA6D65B3A +D7EC581B0A8004F4BCA4067A66578D68CB9C0408C0010DCBD5A40D51494A19D1 +E586028EE13A0AE09BF2B52E4CDB383BACCB87914AE039A38A24282DBFAA40AD +76D344F1F86950333AC92AAC28EB2B07DD65C15877AC6268091863E89DCCBF46 +F7796E2668AE126B9A74244BCD97445947031D6AB1C300F271EEFBFCBAD1BF92 +779DAA45BAC4E773C9222E73F14F1EC37AD10E663F836BC3E9C6DD70330233AB +D8771658AAC8C8805D661334ED1DDF293DAF461212E88D95E53D5C23F3086DB6 +BC1BF93B1F0A90C0AD5C3321225F173D0E407D006BE11A963DA4FD5A1F189E1D +04E40C2BF9162ADF3F8B672CE9991EB8C422B504F03C1B253290A000AB95DEFA +6EF50D0F27CCDC324A7D8BAFEB8C5491377809252CFE69536FA3641090BAB758 +8DDF49F33CD14A87245F29349A09DFF54B8F9A743A5C20DA6A8178CB4FCB06CC +EFCBF812158F6169015C38D0003E9D06223D3BC56E4585CD6A74273F5204CC13 +14CA969003A6D705CC923E268760A0A97E36A2A21EBCCA8ADB66C3798C08DC92 +7797F5CD56CB80CC88D00E789A677106F9D612725E5E982DD14E5EE696DC8C11 +12FD5AC302CBD81E03089865560659CFD4B4B770BD3CAD2D8B7A8861E7A625A0 +078977713FF4E8502B21B15AD68CAD7284AE50D0FB611980B82F99CD8882AD82 +6736661B89294B0DB38F4C65603F9EC45A0897400657BB67CDA50A67C94EE235 +33AF76525858D303CDA26C14E355132C92E132EB84B0D6297FA50620E36895DC +B02B2C8562486AAF6D073E80CA875068774037CA16C01C332E799AF99DEB62F1 +2606727A6E4AE8715B98841FA84228DFFA642AE1789F45C86C8245807835C584 +BFE5F7EA749402E94A40AC9C72FFD3AF52510728ED95030C85816A117A6E4A7F +B223430CC9A9AA7CE31278DD472D71E47A2D0265EB47773D14961888020A0259 +64E9E24B35AC6F44EA51D1F55CF7C7F3D7E4BD97877EF6562B49A842F6ED087F +1B51BA1F1EBDF4C6443F4E778ADB0E990E5658A97FC203C6D210C16294C74B54 +104C616A58D1B0551CF94C6A9A0D2AED37A417E7C105D4EB2F45B4F547B814C7 +730342AC615286E4ACEADA9948C237F2F3F268D5DB47AC4663D485C60586245F +E25C0424C4E6F56FF33EFFC35BA38B0EF5A4B2131CA9B516F6586D63D73A13FB +867FF248CF66FBB2074098C05B3B1CBB401496A0D6B0F2487D1FEC7799AF3402 +00402CC895168C4194DCA7DDD0AA150CD2743DDBAA19A0EE9CBBFE6D6FB15C9C +C6EC08DB9DEC8B5D3F1883CE2143843EBFAAD522447809E38C1FFC492B8A7400 +6C8DE288479664226DBBACFA3D29E6A63221BCC6939604DA895617A7FC99E15D +72F4FEBB96EFD77D31B13D7B0494AEB0D286058FBBF013DC8399056C7F222332 +CC93202FF57BA3E51E10A873F20FCC95A776CC7EEFFB46A920E00A5B34FF82D6 +2D85C3A882E187199812BD1AF4C08FA09622A66C1BFF2AC1B7A8E36CC2C0C720 +4BF8DC761F23D8630C51AD13E55035A7AFC0BA10D87123FEE5E51EBABDD9CFEF +4ECFB3530DFF83347533286C93C4C728054785E7A60516EF699351CA4392626F +4697A64B3CE9995C57FE35878AD42BAFF0A4E511E18C94F740689D0C37850727 +4C48333BE8C6DF3E45204A752D791DBB8C972DC6F2293C46F8D4B06DC7B6116F +3AD7A9F944B99A92A603C57BDDA29E77F9419E4E9885280AC3270352A38A84BC +B10821D43020B2FFCA14452F8DB602EEC9201BCA8E538469605F5CEA321C8D43 +59660CC2623E613071B31A51FB9A48DF6238BD2A0625D74F3ADB1B67D51754AC +E5DCAD203DE36E54F93728D88DD3A9684078D04CF9417A79894597921E636C32 +4B18C4C3A15712B9E765D8E53612FD66CC91C6B6EA4D2B93214F57C7BE19428D +CE545E76188AF078C1CEF02D078645039382229BAE21580C5A309B61E2A7CAFE +8A9A5E378FFEC21F36D2DC50674A7DF0F542C1D81198EA7861DB611F93E50E41 +B1844C0E761CDCC7D9A3AA3F11DD2B6524CDEEC67936C578A47918AC9A12221F +6941DCB91587A1BA4D407E4CC7DBF883A4225EC0407B03303841994D254F04BA +A725F0D9061B52D72669FA70D694E843A80BE0D8543DA6DE39C3EEC5FBB145A7 +8A41EE0C62F2F67999F4BFD255D279501AD97B94037E9FABD4997DC02C2ADACF +82BD90C64883F4BEA139B8DA0931CA0C618454A19B639747CFF20B6741FAA7AD +619B8DA6EE7569E6FBD4BC8C48E5E604A1F06C84C492150EB01BACA796F111B1 +4A10F4B95B2148AA66104BF95D064960984BC2A1FA25C6BF7A8B6C9A5A062122 +B0D1D705F4BED1AB70D5609CF5930D48E0292C1F8E07C50411F8B2980E36BC43 +10AC3CE58127BDAA32B0F771119C98F8FEE653B93BA2080CDD5CC2F5A2D96316 +2E40D79486B2C9DC53A6A92F523263C0D789EAF5A2EDBA95F5BCBE2AC4E53B97 +9870800E256D67DF46524B6D09714C3802318C52B7C24C2A37832E2238487362 +BA7DE4301CF1459801F03C5D4D3E83D502BBC21A4B0BE461FF5DD5E3570C8DB6 +6373ECF760002A8D36EA3AFA7B513AA886F44070E6BEA83A65F1103BB33505C4 +A17B2EC8639359548F49F5005107BD2CE0A5FFCEC5C2ED08C9905C5D31C36247 +961A0A1638F3E8553D5BD8CB1E8273A552B2BFA3E0B20024D0D3E2C710BAE20F +58E952611A8937E30E1A3E57DE281897A638B4620E485A3D792D650F07806B12 +EB8803D2C0AC01B3DD975B461BDE462A5063BA108DE6DAE031439764C95C9A28 +84BBDD4AD3A67671883623EC2580ACAA99051C344D3CD418C583044813554C5E +0B27B7F42EECD3D54BB7B57A788CE239F0B076029EAEC2257A5C8EF9B1506B71 +289FEA35762F47EC6D30254499D4C2AE0BC6723E560B0F6C8C137719F68DF348 +73DE963A4F912227AF342F82ED46FA1FE7EDA82B59CEF25EDAF5764C66A899E7 +08B0715CB21C10B318EF66E5454FF1A7B324EF19E226EB1587F8AC0326F55D03 +9290EC6B01A9EE33A1ECE1C3E2FCF4E3B7563D3A77FB4D40BBB8FFED1C858042 +8D4A83EE2DEA47CA2E9A9A59570B0C8448AE0F8C05A4C205BB4C20E37ABB860C +82DE3869F24BB6882E08F045DB9147D6E83D82D0EE5EE7596FC89B23553039F4 +449C6E2629BE1E78BE116A98E435CEE7CEB3D70D98AB93F766468E307E11FD41 +C26FB0E90F6D00455E229C987A128FB36D50BEE7953192FF409E5D72980BD49D +32AB7A064CCA9431BB605E68F5EB862218762F7C3094CCD0206C0383108222AB +EA8129A384294BB9179F412E182ECE777D34269CBF7607555AABAF56159B724B +67EBF49667E47B7988E5C81422540766D26462046894A61EB9F764746062F06A +34C3EE2767798433263E6D3653FCD6E4C43E6A5F0BC762E77D4174F95E7173CE +A03CFF3A204C72773A7F6C301AD3C418A93042A5C479200D13EFC4229BD31602 +9D4ED8CCE127A1A900B5CC3F9B292301DA6CD4AD0D5E1465BCD50C11FF9F4727 +E4BC06013CA5F0FB6B4E26C5636217774935F63584F69D7797E6A871FB51B3A4 +7E3108E160D01C4DA87DF33FF40B452E8A23144649A72A04366B1B3B026C749B +A897D52C40808BA52ED82FAD0A6DAEBF41F24D5B9C705C7F3AFBF38C923DD3CD +1DA764DB623D1E0AFFBAB095E9C6FD5788E91CF697FBF57B1525A0164E536F82 +20F532DDE94CC1C2DEA0AC7A41D75C50E875D605DFAE0FFB07009EB4B627662F +C1A17A5F8AE3DBC794023639D4E4328C55067A8AC921EF54D272E6F6C60EDB41 +AE35943D366D41F12C2BADD1A2BF17429EB871204A309DD6A3375992111D9AC7 +902E0E7A62B85A1BC6FD35E11CC132F37EFA0B96A733FF668EBB8778FBC2B799 +33AEC8E08E1576545B5BF0E1BA5D5766F22E29E51D404C25F3E54B77D6882DA4 +B491536CEF9DFDFE15362DE2FE5221D30D2D6F15158E57CE561C88F277FC975B +616887F1ACBCA8789AE0B854DFD86FB544192E0382BA380B79076A825EEC0315 +35C892FC89E778A71EAD7B9E578F849E10047154FDA362DC45E5FD1865ED2D5B +F701D7AC0A35626A34BE036EC912E4C4C2AF61B55E75B1AE8D8FD27767696AE3 +AFB440007C6F73DAA0AA62C89081D7EF6B02751CDEAB00488A591E8F2E79EF94 +53BD8FEE595A98A986BBD053A3CB86DB5B039B0F732438643EAA64E5DAF3B6F1 +9E6B4EB430B9E7D648E729EE569871AD7DCEEDEE1851238DE9E23BD10E75B7D1 +B7E02CE3F22D27D7E262BA786D74EC0123DD208030553C0C5E1D538604F7F438 +858D3234D566EE22C36C2D09009322AD41D99A5D0F4404A8939E217CA32C5092 +0E72E2FF0991FF7B882C70F56C7B40003C599A8AE5D95B74F523248B1E8A0566 +872871D3003EA4885DA511FF01181DEE541F6795BB2D1F9EF7C3DC229F153A9A +86BAF08D4BEBCC0D2B32833DDB4639226DAE13E120A99C5795083E80643C153B +12744DB8D138E17B3540E971192EEFF244BDD5E799862023C858B885467E9E0C +8D2405D1DCB579AC44CCDEC5AE5254A017C6ABC65E4B072DE80E9683A9A9815A +23A0B829E805F069A98FAD27F3383F45A111AE854D512777FEA721804B019A6E +E16F12CFDF017093A2CF52A4A92683E3B225EB0C99EE5AE97BDFDCCB18C5A674 +F48DB9AB89038911E912DC1190AE495C6BEC4907D0EBCFC1CA4E153480285B87 +E5C03D8742A43382AD893B58CF1CEAB04AE2424164AEA7B3479205A0B2778AF1 +44663E61F1E8B22F2670D11ECB8C8A901557F382A909B274B20725B1562CAB3B +C57C8F857E9B99E033A41979E4EF543FBE70074F85072866D837954AEA7D9317 +3744DA0394C9412457E1C2188728371638DA19CFFA2A642CB0D2DB3A0D56F1DB +CEE646B9407645BAC2A3CC8F14581E7175B1EC76B0BC82EBB69F9A325A6FD630 +BF9FA4967F7A42322E2A568B9B6D9878FD68F2254908EDC36060F474346BF78F +7AF59EDEAF883489CBCEB0671CE77FA180FF7998FDCA6C4635785D8505A45824 +7EEE6F60384BA5AC06D4A19C0B127E15454A1ECC70245CCB99E271E83E42EDA7 +CAB83D34ADE335F91DABF3F0CE8A5DC8D4C0EF7F250391E51CBFD1C52B92C43F +CCA1A3B71AB20E995E5304A031060FB78B663E939470E0F0A9602A56E0352280 +AFE8F87758508DE73CBEE78EC452185854B11B280AA5EF1D2D3BA7553CF54FC8 +1B73EAD7E3FA7FCA7E8558FF72DDF68B6F7E50CBDB1B51D3D50866F1AE4AF193 +BCB3D30C14172FB5F9E8A572F83311F1C8DA3C8FC589D01F32B7F96A794812B3 +E581012FC496FCA018C5E9C35C0C2CB6CC2E03F7BCF993B8B58AE58F3EFF9F18 +C49B86B75F8B33144A1D4DB7CD1C5F7B1A2C362D1C7E2686ED7DEBE396116230 +FEA4B66E13A90CE9C61656BEB535691E3F3536EEF300AF2B7431770DBA738220 +CEA26E86305F960C867A56F6C071F41CD6F5A0B768FEF7B5B29E75FCA8F336F5 +FF0135B4A715CE926A7B78D6441053AA2515C96551A08CB94B77920C8DAB9C72 +08C6A760677CFAF137665CCD19366603811CB5CD52D512FBD763BD62931BD5F7 +DB0BE87955C0AF863D4A7B7150F33222E24FAD730E0D29FF7A88F5BBE2272A3B +69BA5BEB0AD926E9FEE21E8BE08DB110657546284DC9E724BD0C79EC3361C07F +7EE42824DC1CB72ABF5FB3E3DE9CD4EBC1482DC3FB57D84EAFEB307378EF4B16 +7EB0832E5AD1D1AE04CD5590CD3E0042F528EC79E292A67E38EE3EBDA2335B1A +1FE95723571C040F7AF835DC7493AA5B49904EF6F1947D26FEE59628A5331DBB +4EC4A21D07231E85941A435A74F7DF7DE42035FC3146FD7921D02F20767A9797 +881B24164556762476E17D0EF873F17CC4BDE322E3A5241FFECE04EE7170E0B1 +835607C7716AA603FCAD9EA5FD2AB1F718733B58F31233E37A3C22DF2C3F52D3 +4947E041AC29A07EBA98F0261E5C9B5E280B7038568E470DB4D6DDE3ADA5B12A +69F715BD02F4898F9222A0DD58647A31EB890F2592A4AD7DBBFB7485BDE7066C +1EBC43C9873052644138AE98A18D4902960F2B709D194003346B0B6F810A8AD4 +21D63E3142B7589916B3B4B56C62C1C0FCE1713379EFB8E760EE7295AFE5E4AC +2C38425CD1E4056715ED2F9B4E31E0F05AD10E6A52F4CBE25F37377A4E9E08E1 +16131D26CF7432D5F289930BAAED1E3A444E011653ECA7B9076094B5B72571A2 +D29E7BE5B062B0A69F7AF0D20CDB6F156B63DA9CA564F483395A88206EFD6569 +48C59535FB7AA8942518F0E85A8BF56E0E8E30A35F47C948DF5AC6EDF01AF41F +A14D10ABD45895C907DE950927DBE09F79D53EFFC6F5681D715649BC42E8BDB9 +86894BE664314DEDC69FEDF7EDF2347DFCB070CF591CC8F8F14C04D7E665C0D0 +A413590A72D242D6B619A83DBC75754DA87F980106A17B06F299898BBE8C51DF +70A6DBED6264DED8D4977BA25AB7DBA3BCE39AF7ADF8744170E7D4AED20EB63A +EE248A5D3009C47700D73056995596A2DE0C316785F2CD4C12B442A6DECDE45B +9C0F023599FE9F3FC5658CB23EABE96D597812EEAFFE50F9C82CAD33625AE0D5 +FC43ED0B732954F0058942C1BA515120E7D77A61028770A3CA029DB5FA12B06B +DBD4ED00AB9D53A705215898CFB295D53B38E5AAE8589BC0CB1A942D86DE0FB3 +DFA195D7075BC0F01B4EE3A069B115D237DF36E372B650903CBB4EBAD1D6379B +0429886D3ED160743BC13EB1C5F3AEAB78D1C01A27FDEA6F1D977B5F53117326 +2DA2DB70686F72280200176D138796F7730C9B883D56B8CA95A59AF0D7E943E0 +230D25BA4B738DD45E7923E09DA7D53B9E20CECB40247922492A5875D4EE9F33 +01251DC67C2D69895271F9747D0DBAD71C6E1BB31E734AE795042A285AF9574D +63913566B3EB07994867850236FAF20FA42EAB0535D5FA5EC4CF80BB2B13932E +7AB189A5B680852DE51A2417A70AC10DA02549E09CC96FDFBC49E39D1874A93C +2A28AD92F036B9CB36B5563EE2992268B1B02D11E4E51D8F3D6128DE0133BC48 +909E0C6156E527C9D87EF5C577B5E6789D4307F2BDA049B17A489A32DB9BF19A +A181375F10E7AEB96561662DA0F6748D37B99D116357AF029C6A25D761953BC8 +A91C2E06A070AD94688BF7954EB3D084EB4E3EB03E1DBB91AC3F3A14C8718981 +0EBCAD4DB31BFE5ED25382BAED473B29F07E225AC3B45AE131478E544BABF7AB +C5C59D01188347A370F0D0E937D8F4562F2450B77D871C775116DC8B041C0AF8 +FC8C9B67C4474A8723ABA7D4CB318D941BA18DC07373EB74822D41D1C859DAC5 +F14A7B1956C000E545D6F617AAD2BB0D545ED9FF3851C123A32AA012EBEED2CA +D81FF7FFD29174655C42DD6545611BD3B00F47CA4EA2D9D0CE4A01523CDF352D +6A8A2F201EDCE2E6CC5D6DFA6DCDC12775D5261EB120056D88E080E5F5CC03F9 +F17427E7F8A02FE5C8F3B125EB22DDC9E79640EEFC4B643C915734D7684B873D +51940066B31876F5A58A3B7224BC067C7476B81210CBE89E0714449CC7ADC971 +42EA708B18C60A9895B6CF391C57E815D05D8FD40A12B6564C812B371CCE1B9E +B7876C9274B6716C8632F07302483B124CDEFB9E388AED5E330E8DD89BA229DE +33331F6345FA3505FED271BC6DCD0087CDF347DBFFA4F35666BFA5C1FA6DE923 +97A056410CE3055CA869D9C583D801930E1BBA5BF6E6F2863F59ED54DB785010 +9F2AE393AB3C939BF8AAEF7AAFA0BE486855B4CA5E3430F242636DCA37FD0F38 +0315BD038B071C53193CC56934A5D428BFF9AD882BB5C3C639A3FD9693721E3A +7E29412AC40F83C609ECCD2C6B52D93C8F5FDA19E1BBFC88CE8D0867D3A611B5 +A4C86E617E6ECB65C4AC34F7C40444E5891308703A88379BD35EBE3FA6A65EC2 +2A20EF94D793591F1F6EBD5B5AB92BEA002E9FC9C665AA1DC0AA52F4E5FE4E84 +F425217C32B82D8EE65A9D74B74EC359A9F117FF6E8D4E0635512FE4F387C6C7 +9B001E708417A717CD007D758CE443C0992A12FD65D06AFFE668E7A8CC2FEECC +7C06025509E5C8E89D1D889480EEF3ED695FF92E7907860065C632DA306F6F29 +C434C5B6CA2A230F5FA0E33AF207EA5224B8603A554D5B57F1D353AC785FD431 +71A1473AA77E5EDD11FBCA16BAFB0057B12A30E3272164369F36542D813C360E +9E1A3E8523A1723F786F34AA8ED9C5E0E79BC8489E65CC14D444D43EF65E52B3 +9937BB572F745603D59070B19A99B575DB41E09603F7A1F97BD603656E7B8F93 +B5168E3329AF11BFF6DC7163E2FD545BD213668D9BD3503D61961CB6F0CD1280 +CD3C349AEF61C49DE74EAA38502A51A4D5D0397C0F04979399A24C1332BF9236 +DA1A31D9481C13B1263F48A8D06351E2E860E7E7115B1F4FA8AE0E970EFE5CD4 +96DD7332EF2371FA5A2CEBED96A0BC563018CC42F51CE45E06CE5BA442FD31FE +9BBF37A952BD37B78F06858BAD0B5B6625D943690E22A1C3F9DCDFFDD1630992 +A684A77DAFA50EA4D581074765779C4B2A41E3694FB0CD14030B885324120837 +1601DE07811737E429CFC59B8F4B859B2630FBBC2F46A2693DA6D1AC17034F2D +68966A6798BF0B806F6A9A7FE369B501DE71DC9378E2005B5300E7E03693ADE1 +ACFF88AF74F27AB46304727A54EDAFC01D1E80A7E27598DE8D634D80508AD1CB +0A06BBAB366C11D4FE2A15015FE4E85358EFFB71C9ADF211914A23083F71838A +85FB2421C14D308CCD77A13E767AE60383F6967C877B299EE7A8C7413ED80D64 +530FC64CE65979D77348049D3A6F38ADB64E811976069F4CA20C8E39210921A5 +703B878F6C147316E8DD47066AF2D551161196B0C9FAE339104EE8E972932592 +CB04F23576AE3A61727E4E516FF3044724346D639EBA08111F1D18A47EC2B48C +8E71F694412F029C85E990F099CD44D3BA1C5D3F2D8CDE64A3753BDE633EC0DA +8D84255DBB77A07CBD3DD87A3993A5C3FA8C646F36FA02FF808329922028FE03 +1CA83777099D4FE72DDB0A14509865CBB53B44191937440509F542F3EE5DFB1C +C124A4D58C22D8C9CAEE5214E05AFC330B1BD639651644F3C5E45B2BCCDC9AB1 +EAA1F69A5DFFAA62BD117724B278907AE755E2F9D30E4FCA48219D7840B2E799 +7EBBFE7CD2D02132EC89DE5340858DE4A670E931969B808E5FC8E1108EB3EF2E +01C8E758532E78E6AB5E5B1F4C59F974AF1F0AB5F2FE1BE61E70F71920960B09 +1B5668527F343DB865947B284456BBF00A696353047B812834C59A166DBB8BE8 +92CE57146E59E8DD2E1CF1E356614AD29BF34D6474CEECEE1F90D3E776B0DF8F +CEEC8D6F49714CFB6AE2CD7F77168E8977CDA9191C25CFE7A726CF78BC41A535 +09E66A3A97139535AB94B385E5B614EC835DAD2756F4585FF40483C65086AAAF +DBC5F9A5AA28174CF307A4223D27E10720EADA0B5620C3C85D211D00017BC843 +B3F5A207A41199DD72831ECE3CE0F674F5F942AFF93D541651CD027D82E16179 +8ED292C0E2E5D4489471F860C0300E428217BA5121CC668486B35EEC259EBB28 +B0CF1AA02B7ACAF293D22B618C537A873247E4911B2ABA5B784728B4167EB1FD +066712437790A213DA5A370F1896735DF6FEEEE02E2FB0C7D907434932DF650E +65566124FA36D25812192E6B2349FCAB5AB2F78B5DF4CA8706230B78D6E70F9A +3CA5D6CAA0CD72D2269D74A4473D239AE7E68E1DAE8217F890A4889396F86299 +1E1A3AB1C1298DF1C22A1BE1E665C6D4079B94EF89E816F4FC07843FCE5199A7 +20CE6B6D064051B9A98304E3C97EEF2F900C010E06EDD686CAD64F853A1E22CC +CD9E47056A63A4E6CDE247A8903A2309B61EFF86E302858F1D236C5403F6DCA5 +9ACE76A2F51337BAD4A4221FD721387526DE8FE12FA25DC7802A111D96E6D974 +48944AA7A92186241F681392B54CFD91466EC39ADE17F24470C44DEEFAB641EF +C9F4D45E9DD2911E9E50C150186F4D3395C2684C6045DB59FE947DC169D2149C +A591690091C7ADDBC50DCB395A16334F68E73F3E222661838B1F74C4FC2DDC25 +7F06CF877B94E1D859FDC8CA40229A43D03EF76649A6AC920F73D8B3928F161E +168520554BCBBF957883B7112B6DF94E62408E24C89FBEC3ED02561EB664DC8C +3A72E91B03479C2D3CA8311B7F42F13F6E95D772ADCEA91A6A2C710E2CB3E833 +E94D5E817E2A8E440CC6A3D75C78487391F1FD8B85FE14C22C619C1AB4792BA7 +0B96FA5555FA29A0A847202FE1B32287D172430112C0787034AC9733A09391D6 +B5AD1A920951804361C8E8A4E4364C3E7FA0D108D4BEAA2E5370826A919D6C9E +AD7A77D61C8ACB19DD62AE544CE5871FEC9E99A90E7DE5463FB6CE253AE40C78 +3523A3CB5EBB7EA51219537716643CB1B24B73EA26F34A49B52DC14F8441E496 +430DDD5EA1A7762AAF938C3DFFEA1934A6D486F9A9057B0B087FC35B7D97DAC1 +E846E39856B07D81DFF0374175FD94ADFFA6907BAD05820C519120FB80D7F5A8 +C08673F2D168394FDE83063EF080B9D1C52E9CE5DB537ACFC3009B39005F3988 +ED1CB1DC24F9278D1FF0F91D2FD9BBB5C746019B00C77C9C90EB833D42610736 +07AA36C7737ACB0DEB210D9C6DC10CE47005E9519C69D6264CA1160818CF0FE6 +63E9CB5FBC59542DDFA431D192C2C6ABF694013024190FC8422235CE88C200DD +18020DBC11C9E41B12A45D23EB8B56FA7A4BC772B14257D8CFF8806DB05D3F7A +AD6C71709841942300BB018CE63B35400F979AE4F37A787C10B8BF36A41B8FC2 +1E2940FAA7EFE3BA8BF96F5B9650795132B00D9C8DBB52BF0D182A853350467E +EB02FC268F4DFD4FCDAA1BB02C9722E88AAEA3536C837E34B53BE9C2837BF188 +CA19639F2974A3AE40A8421DD5BA1DD903DF9B63E716FAD3E9E03DC6234C3988 +5AC8782612EB6F008DC80D0C758AA75D4A3909765831B2068A170AED234BBBCE +DAA91AA0ECA9AD4C14330A168762D119A3C2AB0D552EBA73196333042B2A2F95 +0DC37909D3E3C38FE9E2BDB8B2CB77A6DEE2D146D777628B35894A538D561983 +55E8F2E37E00E1A182090595C7514EEB78E9D8AD37859077F102AC1496BFA3EA +E1790FEC4B708738C8AD9C3542482D75E5960B92444D69AC6EC2CCCA945D23C5 +25CDFC2DDC08D599746B686A1485F474D151C326CF5C0C62FFFA4ABBF5353E09 +FAC520B165577FCF2AE0B7E623ECD3B44A0E7DBA7B0BA5B4172C502727283D3E +0F4B4EAC070DA76E72B911AE6567411B7D59EF3622B213FD28AFE3645B061065 +ED44E30EC1D81A1BD801EFAB50C2AB27443AE9D256D4CDDC907E852BD0B5C8CF +DF95B90D45EA2262EBD8BC29FAD72D6B1DB7669B2F33A6368FA260A407686AEE +5C622E7BD7E620BD735A5AD6CDFC71EC5CEF80324CF59D53B945F9CE2EA42806 +E4EAEF0D882FF37FAD4D28E4A68D221A735061A5A25AAD9B73B4EAC3455983B5 +B717059B778E47E00698EFCDEEEDA99C754F6C61D56E617DD78352FC39F927F0 +0BAE0683DFFCF55AEA0E7CBEDF278706D147B6BB099950E1D6410A1F70CD056A +C79CF45A2F03B522D95CD9056E31A51B4C71A10591BC5AB0CE178C529CD741BC +0F4C7854BDF9E1930D2D597B444CAF59838AC30533FFC1D39B74D99E82E2DA11 +BF169929A097A4883B7CAB01C37D073E230301F4D58396D428F541354FE82CE0 +B360D5DDD4EAE075395DE968192606584ACB94493670C5DDA0DB8D8500A27786 +FDD7D908CAF14F86971771C604EDEB9337DA9A7C08135CC60D7D5CBA7DC822D8 +81011117F3B156360691A4353C84AEDE652572DEE12790CBD357FDCCB36DBD5E +0052471DA8B89500EE6BD0BB9994FCF9F949E8FC9B92660B8FB66FA182447EB7 +7728AE2A9BF139C9AE75C9327257026A9CBF8AF1F80D0D6E4BE273148B2111DB +5E76643CCE284E79FBE70347AD0D5D8F81E6944BD01AA02C3ABF66C27BD39E78 +5B8A035A17D7A8DCD0D241FB65DDA12357357DC0320C0A1ADBA0E17112A87682 +24A37F48F45D0870441DEF18F885FB7DE5726D545D91ED71DC5744D9B81B4EB5 +6CA17C065FFA80815D513A50C5E6762641EB969C1EFEBFF6F022D95F35AC3A5B +9DE915A45BE37832AF5BCB8FE8ECED6566802185492E24C348D88D7B2AE14D33 +BF71D8E692B0857D1E744E75ED367B1E792F258F7D29F69A2277EF81CEF1C8D3 +D84C989219743476CBD75F8654CB76B137B8249B3A86513AB2374FD12027520E +EF2707F9DB82CC78E312E4C5E1B52D50E6B21C37F796B40E9CF27E98080D3FD0 +F73FCB06B74A82D5C4CCFD484E8BAD2AFBE25A5B8F1CBF25412B160AFFD6E425 +86339EED833E1485508E6ECB2471393636E58ACCF1DA80B0950A3AC134B324CF +F7D80AEF4ADBAB4E02DFFFF5D4EA2F87F667142A6FB5EA8414ECA68B302DF431 +AAB49CA5D8120C95F6C4E82BBB70DAEDC7DE821AD4B5DF4796E23316E5D20606 +DC9567DBE6F5A06182C3B9848DFF54E02EE26B6385A6F7CB9C5EE0DD0CCDE6FC +E6F98D726F64F190DE1C523B1D4472378FFFC6F7281495DE8C36300F2B696308 +B6A69407FF6247830D3E1A6AFEA8C8DFFD63A737CFDE9B9E1780B93EC4244420 +9DE722676A7F64EED5F13BBFB0980BECEF18E55D12A34B13A4FAF0A10F74B88C +59A45F668BA03B900D9F2D1D8220E647132604DBE8B06E0EAD7670A7D7485DF6 +30E8C003AAFCCF7DA4C3672EB8B76E56A9F7F0F5EB631008234A046205C7AE83 +36BEC5CE37BB25861DDBBC4539C38E2D99E6B17A0497C919D5F3309C30E43281 +C714450D9F883CACF058F8DA7B93192F76FEB29EF1BF10E262EEDBC797D85936 +96CD3B3922F727DA98F359DCC2347FA95A7905B5DEF2F0B3ADC90301405974D9 +792BAEBA9EA0070FBA6C842D40497DF039F975F6D85D705D3F8DE8386C8DF996 +39EDA645F3D1F7DA2B87EAB5450F40BDE12B26D8D4A3433668E430988C1F7D34 +0748FB4D4F886762140314F3F2D1D16CC6439A033F8068F048179605C5FE9023 +9BCC22B5D7B4E8E9A1F66A5A9D3A888257394C353C835BADDD00B2BCD94D46B8 +DC3619E4CDD01FE753166022055ACD7ABBA49BE217260A47843D3E7666A90ADB +E3ACA94CF7AB1D73D6230446F4848E5111E03A5C7DCB1CEE340ED84F40660D75 +6FE5D691F5327A3314DE7622BCF2DBB738ED7C7B3BAB9A975CB2E739161DF51A +51B1902F65E6E68D77F2ED65FA45B7338AACBC2D6536BCC67B965C8A2F32B576 +EA583CEBAB347A5BD4CCE61EE80200D886FBE41913390091C747D12372DF4A03 +A2B68A79007FB7A8A87CA0E7247F0B36717C95944C34932B0B5E758ACFCAA071 +4DE4E88E5B97EE25E3503045B366EDB477D362C34978CC1C66D4720DDBED2983 +A2F6B75572F935D08E16FCFCE23A32B9C4E8BD895759B96F64D4B1509E0F50B7 +1F2190A352478EE247BB65E5DC605436F58E7369C2A5ECA8744FA45B251FADED +388F1974505305A520E2B39B9B390DF9170097D17F36BC0A52C59D25BB5D0AD8 +52A9430750B489AD524F7D3AD811617E37F3628FC6BF331B6A8A3C1A874094ED +5C5085554A5B16D60679E9825FE8BD11C4E5552D5AC595745396E0AB8FF21EF9 +6BDF132EFF5804B02FBF46225B2DC521FAB66293B1BCBFEAEC26DE6BC7BB58F8 +746A67BEB786E5BE2642B24D93A46C31EFA288D7D0F3D54FE578F0339123323C +75F1EFFB112F0A4D711CA88946E0CC691EDFC3BEC310AF1354817736D6F2D5AE +D361466EBD8F52F0D4935608FB2F520A49F771A3A19BBE9AADADC4ABB9006844 +7503D94FCEC7DCBA66D258A76E8BADD54DED70AC66F0EBC6F052937A94C13A35 +734578911A9B39487E51B0F5BA48DC09591FD5A1D45ACC368D91C3CD3B4A9BDC +98FF62111F1EA93313568A1162523379CF2BA6A240AC489B3A8963E42D08A8FE +EC22C16D4CACA1B43606A76A9BD512A9DB20A40C3CBC9C35C2784E4BD072C04A +74B267B18ECCA5F59DF84B74A361F5406C582BF99B99F69AC1A4F57839E37DE3 +B8AD9D537AE12C66BBFEEF8E7580273201FD665EDC1B594055B8D312C303AACB +E07365CC0C78B98A9A62032438D806340D1BCF852924854C4E50CE53BCF8562E +F632AC26B18AEF9346E29B019A19A2ABFACDD303AB7630CD91CF68E229F5EC79 +508ECCE0E44B8282523ADA80350D28B3646B62005184736B434FF29472B67D27 +27BF7DF359BF0B7A8CE5BD7B6F49126E8C5B429E57910ABD55CAD54BE35A0F15 +6E50601498CB9F0AF7C88BDF21E6D600638ECDF5F17AA25E25F4ABF98D91E1F2 +2AE15BFC7D8A57924F019506D82083D87A24291B1DD99CCA652ADBA3F08F69C7 +5DE09432CDC283A3F139FD16B3CA7B15106795D5309D918C2D3302548CECD9D1 +2CA6690DB242949D647D835D86C94709BE43333D81F800527DF0EE89CF11EA53 +C5FB7B0E2A5C97477DE8AD164228AD96A646FD9BAA1D497EF07760BCB2CC2C23 +2502F8BE7F8AB201AA730FDF14038E60F137A5BEB60D9A43EF3DE2D9417A4DFD +136EC1709DB3871BA2287FAF13674BCACF09CBD5CC9050A06989740A1F9E76DD +12D8CE4739CA3E15C41EA616D69B1FE079B4A26C45279A105FB53E75E0C49D8F +B84EF948AFA24A920699BB185FBAA8A85282F97710E82AE77AC3F32174B754AE +306DEC0094D9E4A48C9F91C2D6662E68B29C56C9367E7980B1359D3DF33A2D1C +DFE766DB2FF85CDE7E591B991D135BDCFD8CB5EADB07E3519C921C6614D5DFCB +1990A6943CBDD41ACBBD5BBC0B897DB3E0A89DBF059FCD9AA77B2E418A118721 +AADE7767FED3BE2929C192165DEAE40640040910AD1E205A86CA27D586C4A9E5 +001E56960B9D4905F60E8A7298D615FE09DE4218CB463A89908B6DDFB6BE54D3 +745F090F39333A06017CA640FF1CA7F09B563EA8FF89627E679294CD5C727D25 +86A4AB9AB2ABC2F6AE5D0C65EF16CB93C42866DBF5CA86332526483E49651277 +11A5D0F1E6A64BC17A6E76C8767A125FDE537D12FF13B8D274E35A3CBC2A89E3 +9E8C55C2AD70B607A624B0A67E0BB449C56559D23BEFF4C2BD99F67FEF973C1F +90F938CD1981C7DF56AFAB82C7CEA98AC7216E2B4F80A26D68C491116A6BEEE4 +ECC054F7DA563F07C4A18EFCBD45A5FBD566EF722F5E71D5C95E0FA2A33ABDA0 +07EA5CCD03D569DD830BFBEB88C7D5DFB6B301555B2A14F15E565CCB4F12B60D +E6860C297F90F9B8A0D39942888CA8A3B8200D5368DEE25B0C0432377598866A +88201A65C0716A3DA92B2C3D05F20A0143C841E54279AC22DEAA33A6C75ACFBC +E0C803F82F6E79D871FEF0F56D7B018172FD281CAF06D1FA247201FB1CE5081D +3CCAC6629676C1FF1B0E64912311CF8196860048DF27FA097CEFA4C257C426CE +9C61967EA4AD40E78793F4992E30D865257AFBE6E3411547CE3117868C7A0D96 +887582614E2D8A2543F9408B69BFFA44494A9D469722486FA1A8E84881443843 +4CE118ABB689CFFDB6233835669C2640A60C376866A9CC1A4846817CB26A2862 +CA8F4F5DC66174C7C62F853F8704BAF1B8BA8934451B73C9D23F7857F53A845C +E937BFC1DC27451FFFE0C75008FCB9A372D1E4EBD771878BCD05D9B3C598854E +33D19ADB2A50CFE4D82723DD4F94BC6880EE00BA9541069BD5E6A658F0BAB38D +769C47CDD3FD7D664A35F9C0758DC060415B5514A31C6BC5E0038E2B4D5B6B9B +C246FD9A961E7AEB4DE3C4DF0CC1F3D4CB0852EE3AE72CAF18AF005AD96224B6 +7D9462A0C747679B00D81AC906B64C5B8D3A500A8A1577553E25E1A7D91AEEF9 +FF84203A025933E56A0ECE5735436323D6FDED9B4FA26274D650AC3DBE4B0AF0 +4ED960E495203FD67C300619125257836C9DB76F650AE523401EED4E5824898F +A1B77C521C1A070A5D20BB324C90207B01A0B86A6F42DA7ABB1B2BB2F8F99782 +4331894668170332E3894E80A5C43DE08AB3AC4074B1DCAA5B43BB354C54B749 +82D17D9B53CC5B4018CE4467D250B4F98036B0CABC0B149FC7B2172D60FA5188 +512E7801FF83AFD47B0E87ECBB64281E3ECA9728A30A3B98681FFDFC8FB161B7 +D57F511AC4BF30C2D548B9D38371EF4E3845C5726C8A33B20F2013833BB68268 +A326BD1C199E3FE776EAABE066CCB4C80BED3B558BEF58B6EDE92A692A8F90A8 +45D322A2CDE3EA8DAFB316B510CB1835AF292C30F58861B61CC3816DD5953673 +2AC0CEA62E52CAF6F60FEF21B726A41CB42CB7202E3C605DD481BB7072079903 +8F5A0DCF8142A83B2D746ED1E11521356E57C07402843B6F34D5EB212143B5EE +7D49A9CD2ADAEBF0F3203AED4FFC99B05A05D74F8BC7E9A7E0F3CC73CA87CB1D +F734DD7E6DE90680D3DC54739DA1783ECF3DED371BCDE79B86BE61FD0C25C656 +89BC9B059AF6359719A55F1E095558673B2B6BACA8087C729F7CCFB5570631BD +B87A8BCD4B6E1BBE918A44CE8FA4694670DBD43D2D87A8F04722310F2893256F +6C9F2BC39723FC1504FE00753D76554776E370385DD79F72322A8FA32F1052FC +A6D8AC2807EB52000FA90FE1275C8876ACFB3EE0D81589920F00E00588EDAA3D +A6F2C43E8400C13690D6120286A3689F217C6312F8ABCECA44B8E11DF75AD509 +0420FB5AF0E18F7BFC7A69C20C9E3FEFA7D951AD9724F425F38502EC29D32E28 +9407B9E3601773287512DF1D279F0B18B856367996317FE0BF47A30DC0AA3A72 +F1596681512189F0D954A454A16C89F0F109CD95E845CD1C06BB122E8D58D71A +EF61CF589BEDAD6ACF19B30ED3431E93F73C9391D3A31CF94DEB212B4ACF956F +B2A859BC2F96A5B52C6F5DDB104FFD2EE135484C53E4CBF8F4C9208B53E64C88 +68CBD15D46897DF78E2A0915CB550EA70103C6738124A0639FE3498C95A8A1C1 +3BA81BA5D5DDE68DAC731A5F84044D94B22462F47DFD7BB38B6AAF0DBA52DAAC +086434027B5058AF07D1307D6350524029E226525E8FED9835D9D60F301F1D61 +8E458D0E2C7F243508B6ADA892224766897B70B55EB9E6AD6BB39B1B639E6B8B +66B73B761C81CAFEA2EA01E1C3C64BAC284DF366B24415DCA1498377599D9248 +A5335694C94E134BBA10FA0B4B53D2ED32664C8951308966F5BEB37E110E2D99 +EB8752F75839EF2B602BCCBBC7BA8460332BE43327EC7DCC8F0F57CDFE262AFA +EBB720D79DFD9319BB889BB0DE1E2E0D064641764390258215CDF0606855934B +7C8C0BC1AF945AE45B40B970FF4713086769EB30BF30F272585F6EFE48525474 +0C236B1F4710977AFEC9346C8A920D4A8832015D401CC2A44584643DEC473950 +811A3B476B3D42EF845657E45D390B873D3ED65C8D9C3F6B0C189BCEB6B46A11 +E103B9B0A0DF61A899BA5CB68CEFA1297F156CD242BE975326849D2C21DE504E +D4FD3CFFF53A29F671A5B3ECECCD598010C52CCD451620AB99A917C3DA3EE592 +98D726DC6BF96E9D73EEB778961242DFF2442D8791E09E80853A7F16FCD9FDF7 +DDC4186E54C200403DA07294767C219D161ED55B8752793C8FE1810496C3B855 +CD797C653DAB010CA1909584D6F42460ABEB8E04B8A472D177995DED8ECBD456 +99C7A2D42C6A64F8CC8B14FA0B06C98E1573AE19A086556CA062268AD02A3C2B +BFFF7947BF44979A39149E124C564CBF1E782E55B219D13E87B790D90F0AA463 +E2107C5A76CCEEF736A73ECD38C30BCF527AA53CE75B6B9DFD35288143610D4C +4954585EC5AA5F9DA22A5A9F0AF66BB8296283053685AF292FB8C891F0386ABD +2DE33BB1F86D984DE21DB7129D28B06DD6752877F78F04423447A8D65255FAEA +8A6AADA92D06BA150D7F4031639F3DFE149916186BC2FB0B6B616AAFEB7455F8 +78BD9E857EBC914457F1C2927BFED78CBB77401B776C698AE100116920383BBB +598E41582E679E99DEF5E5E50EC75F20089C70209AE12D9A7A1F01DD7B815CEA +11766F2B5B82D13AD78BE0CBD7AC82DAB46575CD90CE59B2FF705F328AAD4BFB +B60839735DA8648F312AAE70AFC24CA58339630E430E417D4469C39328FCA6A1 +9BB91791521E7D43ECC2FD92399E250443C9C0D14AB1DBCE22076F81C286D61B +136A956E57AA9BD12B548474134736DC80138C678A437BDF746F9140D39203B0 +C79F51F3E31F679CD80B1D98159874260DE5A298FF11B5ACC461A567E1F7EC81 +F4232A80CCBBA20F071F0BBD6749CBE8DB8724D14D4DA2DF0676E182B0C165D5 +397252C6DF93F7C2C52FBC3DCC24910929A0272672F1A94C03172994E4FAFB47 +76FDDF661F13DBC3E0D3882B5D576BE48F2C16F5CC10EBEA40CF90BDF4DF4997 +E79D92C92B4D570AA930F0C841144E440AF24893979008E0A8D2DB3FD81AAB59 +426A49E8FD770654C520289B2D48C14B35A069445324E37F66AE20BB0EB1C27D +4C23AA633834A3193129BD9C9FFD8F8C152D9819F852A0522DAAA38BCF1687DB +E22E3EF59EB2D3831261A88106E41C86490C32785858538FB9FFDBCBBE186DFF +3964C03DF7FEB945B1049EEDC856C5F4D51A8C57ABE0F980FFA7E9BDAD21E476 +67976A0DC9AB4D84EDA8E9926FFBB302CAF28CC3FE6C58680C26ADDC361FA10E +42FE75145AB186214E03558CFF881EFF28DFE535D612243C8ECD8C3C2DE54C1D +14DBE7DF5200AB36C47064E7BFB0C554A5F6A03B6406C13FE6D724AABC071504 +F0C55CDC2F963DAAA255BA3F91208DCD272D395273D98D7A0083301D0186A37A +F2D0385CC5B0698C21A197E57145B1D32AA873D851664DBB3B672A84A1EDF6CA +C3EF5EB58023FE876BD25AB9B8AB1D4DC1966CFED8EB3CDE280D81FFF60836F8 +68D3D51813E9BDEB6F54FD448F6C6123615E12514DFD986532530DD65E84986A +5BC1C1E3B0E760D88730E708270924E98890115E3927EFF1D8DC891314EA205C +DB1F328C8000CF7BF21AE594840F6CD56B6CE4DDE05D2FEA79A1C037BE44BA87 +D9B4EEAC6D044464A719D6674B0249E512F4C3BA6E6CD5AA138BC1C1B0C2614E +5CA4E7CE5773FDEF44A0248A47031B2F8D06EAB92BCB2157D4D15C93139A800E +6BC273669BCAA825AC886E8F0B308F3E5E7B6F528D99A1B6858BAE807B162ADC +C02397B3E017260C723ABB24582A414CB1793BB5F4ADD3762366F880936D2906 +5D8D0A3C2EC31C3B23FD7C5A92246E0FB2DB50236084CE103F56B00511CFF8C6 +5C695FB66A1003DEDC5BC43ED31DEF5D2320DF77D2B712C5DC53F32978E14177 +0E95FFD8FD13E8BBBBF030CDA5E4F05BCC50F4A7AFBF5510398A373FC34032F8 +5CD80440C7138DCB9A85A656F0474D070AF48198CE2382E92C855ACC69EABAD5 +CAF94D8A4D76EFB4E49953B8EEFADB557237F495B0DFA5C3F7BADA594348A88B +973E5CFCA5783B20CD3DD05310B24F9539E4C30689F636DDE164861E8702FE25 +2DBED89160E815A617A4E7B1928FD84851B40EC28C8DCF9BD9D95C5DAA4DE46C +EB78E0902B36B389DCD3DDB8C8410D684D003A989A15906A38F2E11F4CF42324 +DF9A1341ED9970A25C4ACBD73F8E68AEC9266C539A920EDD17245EDA202F68DD +42CD0F2E1CF99E2537E4432546DB208EFC3CE2805BD937220A62E692D0B8293F +7831E4E5C580504840B4B5C01B2E73C6BECBA5BF37CC2657A2CBD51A828A1D82 +12E7CEE63847B2A80DDDEB8376EE7E364FE47FE1B6DBF0C2B052D7978FD529D5 +FC880C219D892B1ECC5617D30051860C482B2D6EA24DD5B8959372DFA8D2AEB5 +C06860466A2D22891EC71BB7640449CBA679E67E6C71F44A68AE7739744AA4F6 +D4FB1F74C20B301CC545737F131E0DA3183F976ABF85B68BC4AA63FDC006DD65 +44A1C122539EE0A1C07F29EADB687C7AEBCC92FE2E245C330C10A9B2FBA8C9C1 +0DABBEBEDAC3B91FD3F6D51D653189152897963E8FF5EDBAA5D92381EAC86ED1 +C896B4379433DF5212C843754A3AD3F217863353C76153D102359D803776096F +BA9D4D6DAF5E3F2CD47762468AABE5AAE4387C54C2C142E5A63ECB22AF0914CC +32FAD5435E23F7395871AD8CD2C02873E7EC7900CFCD021446487A9E6820BD63 +EE0EA22F8C82A90D59246E110F696F2FD6314F65E209028CE4B211B7B58A22C7 +C6B82C5D0E0325A92123947FD8305924E2BBFA530C6E2C335268D2442D3EE9A0 +5453B3D87E5BA383071CFC4CFA7131D24004ADBEAA6A80040EE12619B7010973 +627EAA9C69322997E06B8F3E10105B9FB004089344F9604D50E9CB75FF6C1B9E +208347262D01ACFE1A26E6B6A1724FC811A0B602F9C5221BD2359AC1A27D641D +B1824E3EF3C6ED001DEC8328AD41FDF8F8643D5AF1EBA51CDABADC151A16839A +9852BB2A8FEFB5FD0F236A17293DF1391530A9BFDAC288B4BBABA3E8DEBF68EB +61B820678A2C5A844B41DDFC96773AB21207C7403182BDE878BFBDB02AF22416 +7FAD6A039256F0321CC568049E80522250E3BFE9D841E18796C108EFC61049E9 +91890A11488944BC18D63D911B205B8DE16D062052A7C97108CDF5BBA0BDE087 +E0B31781C257679FC8A18C945761528FBC7D8E61ECB9417D0AC43857C0B3055D +F1C3DEFEAB3D9ED3B357926BFCAFD7796994E28799E0CAAC3464A6F8A2203D9D +F006C837C8929EBB2483D13AAA62008D790B81D0CC90CA55DCF1DF78E855849D +170D5F0E11B5ADBD7682CE233E26F95CCCE957E16C55EC3397DEF52AD7301BF7 +B8E6117415E7EBA61B9D64ADB3091AFAD3F969E8D28630538AAB1240EFB4EB66 +84766B4DF14C48DF117072E62AABA7FDD41169E098249DA39E884724F89C427D +F60D85125F31DADA544BE2426690690B8EC4E3F97DA0F2EDC2E1E76F6D28BF17 +A3E1DF62C0AB685A0F22143A5F1BBC26EAC1426CFD4D9DF7F0FFE872E0C9A06A +2816EF89B5D6CFD470F7D6E0897A27CF607EB99099F8883D9E63D7354E8987A1 +B1F995D0C38EB5CD06D62B26E1B4C14C59DB4C3BB22A796C161CCBEEC0BC74B3 +01F218784FAC50F1D8D735F623D8E568F17362F26AC3511DA3177D5E5C18713B +FF1170C0FE3E1D71BF5CB13E09582A51112F5E73C30BFD6D7D40CA7973C4E98E +3B503F6B9B74F48AFD91BE0018F855B449F93BD9D28CF4640191D4F8A2150345 +77C29EB8D6660DED45A25FD769AC5DCEAF43A62DE7FC6144F1AF107997F2BEE9 +0ECFD51B4EA120BD74D0514CF9F704FF7699574144B06A3C9F2485472A79DF7F +9FA68A82D377F7870F2ECE5E0DFD5D0A182F8C5D9BB8280AF6DD3A66DF28988F +C4E7BE36C95DBA103ECE133E869954D87FB2D955B3BCAB1F3D25DF55B1DE1D32 +145D39D8F1AC1B5EFC1F77E4779699E8C8B93A78B78BBB181A279631E163FF0B +EFF6F7B04D4CF8873708AFAB622B2B3613DB434698DA87B8132E1F3E46ACA7E0 +B4C03EC12A51D0E8EDB1FB1F3633042E15E61ED677D4B46C287CFDBB572C8FB0 +64974618F5AB0945CFFFBE67C5EDE351258C528C9633F2C9743C3386ADD552C3 +DEAB08DB72C254EDAEA678C405DA089849720B68AD9FEF4DDB7AED3D21CEAC9D +73553FE788D35A46F322838050C9846F4145C4A2B89072C4B00514779BEB8FAD +CFBBBBC2448F0E9EC25FA43AD956274CB6CCD5A4FF228A61478DD68F50BEC3C1 +B580F32BFA52159F33B554510F29386289EBD7CCB63169C859CEA82A88A3472A +C87FC773C20AA63DCC7C64BD6048A1343439A9B230C05ED126866A54C84FECE3 +87332796F8DA7A91ABDCE5F9FDED03B1E8DC5C61BC139F33D430F0990EC5D092 +B49D10AFE3F993569784F2EEDDAD5FA6E10762D901FBFDCB1997C40EAA885CB0 +52F4CD610296E8C297CE215C7CF23B873E67F6A12B495C415CFC27A0013ACC3C +FCB54D840677F056886F7A0AA5DCAA07DCDCDE4252B9977D3CB3DAB09FEEFF5D +B03FBCA4DD809B161685384599625301CC35166785BA66B1A18A4A9564139D16 +D33BC7C0731F6E0DAA9BE2EE103BB8C39E958C3F89E26C2644128BFE9A3CDD18 +1115429D6317BF9A35E980044E9A2D59DCC544D0B25E4FCA28046B71593423B3 +F9E27BF3239404626C495EDAD4053EDD0A601BA04837549232AF2C54B02D3C95 +2CF348F4FE12AAEE0DC4D545C935C8E0A8294B4CE56E026C5CF2B36EA1F2F904 +AD8D130D6105BEA237207209A1795F3D3A03FF1B16A7C3163B99F40F079D3970 +86E64A758BB2A068FBA3915E75FAD7D7455EE272C6D48DC07138172457213537 +3BCC124302C549A43F501A5E4230F8B0AA54E7FC3A644FCB42E12DA142862EF5 +1315E92F31A29E92B3FC3ED944EDE66685B1782238104FE41A7A039D9793B810 +639256B4E1229C87094C0CA19A16A5C5B6C648E57A4CADB955E162B82889DC72 +FB8B11A00C6885B23C0ADBE5C8FCE24DEF5AD7814BE49D547EC42E312D795D0A +49C06F90CE9F29AFAA258E9BBA47FC2317F45CB73F246A277C0F6F85CD926CEA +8B119C613F7427969A4D7241AA375205EFA30482C5ADF407AD692D5993200D6A +A8A7DABF6F9AC7482F70557CDC7E09C3CAC4EB3FEE98605212D9474193CC151F +43F630ABC8335B4C91E8E64283EDE6A46F92D66F1F25312B41B1254EB6A44BCA +5EA1F881A8CE2756358AC4084C6311A41827D70F224272C5F0B78C8172E05E1B +128DE2205D27D2EDA3CC930783879123520ED5F52D3174477B64ADF595C398EC +6EE39AF98E5EC04CAB0BCC122E5DAB540EB9EA7387F6B3BB208A3281E657A2C0 +F4A215B2B1F5C5F08048A0A357F0B3F4ADE8D0DC91915B78BD6B1666A05C4985 +B3D45367A6B7BCC24D0093AF53D9FE8C91D7CC542C7AAA883A26757FF373EF88 +A79174BFF975687F693BD51DBA40E73FCEB8A18FEBD10E8200A29F475ED47F44 +ABC9F2A6F66D768508FD3FE078AB46ABD69B79A6ADC471AB866D326C4A20D9BE +8A15DE54C80945554AED93AA561465178B6F38D94769D5447D1C267519059101 +F9501BD996B8DDEE625A74673D13A647148A9F11CE99E7C6BDE7D1D507017648 +8173E81909387A04A133CE42C4643F9E5D69BE24E48116B3590E6ADFCF02A21B +88ADFB0F070F666E38F260F7A0F9A99D22433F8F0B436BC169868685E7A144F8 +DD4C3FC1D1A554BE8356A18ADD5626450A29E80101A8164D0A5A106B7313FBB5 +BAAFCE2240A66E18BF06EFC32A055120F7DB77B269C285C27384EB0187A135E5 +8F7E926D9C48A9DD8C2747A5B367CFA686FC1294C0DF48037492C1AC42241469 +CDC137863CFDF8CAF8B9C8FB9A25F4CA4D517AE0707F94E8184386E0138C9098 +CEB7FB05EBA48A2F10D38F62B950EE4DBB2973D23D8F2C36FD315ABA5DDFD03F +BE64C12D18F9EFE17A0FC0CC57599826D09A45D3F5839CEE0FC0BF726CDD0195 +924583C8C4E5BC06FBE89DB34EC1E2A21D09A8D40EE8FD72F352161A25F7DDBC +F4055FBE67201414BC725815A68740C1D73CAF7EDE42D5863AF0EC9F2F29A2D8 +26822706CA8119EC6D0D9468BB812F48F61E0B528F48730F65D755A78330BFCA +B38406E441453361EA517BBF57051C499BFE502049F5B869CBD63A45B26DED44 +F4148C9F523681B5316B33F261D9F854D58F301B04F46631629903B5C6CA7C1F +32165F3BF96494B89614E773E21FF582D2AC54DCC559604378E9C6E87655B3A1 +66D2DF34D531F89942BE2002903071947F9600DDB63772D73C3625C969E86859 +3BB872F0FF0F3102A043302117900DC43A5B295EBFF6E0F098694CEEAAEA8F0E +336A33F31E7FC4836DFF317A8E5C5185B931B49F55288790B903C5F709AAD9EE +7CA77BA4B905F1094126C8C2DB2BEF9D47D9764BA02291B61D6F1111571C48A1 +18D7A3F4C4AD999643E77DCF067D59442553B1933FA1C7ED31486BBA13E38BB1 +A5DB843011ADE62477C8D700039407E4BA7140FA57F0CBF1F592B0FE9B77EF26 +1993A02BC2A06C9E19BD0AB9BC6785DF07AA10C9D23F1F39CAACBAE7A06A9D2A +CDAB181BD867EE80FAF7DF151B46469D39E3B146C90D0EA389635FAB3CEB30C0 +40CB74D4C6F4BA399FB084D3648AF356B956F9CAB3C3F122530AE112CC872B7A +7010A34B1A2ECCF920144672F8315633CC6B50B3D3288A922C8E8C1482FC969E +59060D86217EB3919DD8BDB95241A7B089DC1456965AA6807141F2448C50F8C4 +88BD54017534F9236C4EC812E2F48F13943C8B81273285BCE02FF68033B70CA7 +0F38511329DB041A8D38CB609B93A39CF98470975E9AC50C5910A936722EA880 +E840E82DBFC809DD5EDE3D9D896FF879AA47E89403E5E9078BA9FE3B3A2FC4E2 +C2FE85313B5D53A05DBAE54CFB25BDCE29B4F5D6168549750C2457EEB109CFAA +A14D71A996B2CC1414A8F89DE240EFB5C3B13F216396ED83F09388DEDFBF2CBE +604C08D8ADEC0E3116E33443CF68AFFA4513B1EB0A19D7EBE845D1A0516A9EA9 +03B7CC5D17CBF0E1965CF2A879146049318579081323FA8A13755D51C939FE1E +7774653F6610F5A542E30966220E69A4650B00BC6BBF8A09C13EA3CAFEFCE3D4 +B2C4E1CBBADEAA6DE7BDCEE8795FD31E1297113230F8670CB316B5F39F067043 +E261567E08179748C47D32869A686B20F4BC5B78FDC9BA35D1D4F35987F357D6 +3BD1325EB529B80F88EDD4E0EAAA54F11ADD2CA20640A77D96F627179B39EBA2 +8C3A895D4806568A36CE0B589B2C29A962A8F6B6AAE4FAC50E424B2EEF4E7B47 +ECE15B865381E87FFBF29AD1D3BAB2F6EED94B874ED3A975A0A5FB54E2729CBC +FC079469C3BB4AB361A7257653289BB9E353BFEFF7F8982162CB641F1571D0C8 +9530B1D6252C5FB1DDD8C29EF848D105126703AF7CE5DF4B87488F382426F583 +34021005B87B8938DA00725BB75F548F15E382CA1A57F8A27A81B5A97EE26244 +E739D10A43BB170D5C64BEA9580C3017CA5F53E8C30F129E0A63A5E9C391AF5D +A1C4B5EA0EB4722F6C9D187CCD4BC71A063D85305B14CDDE969D9835906B0486 +5D47D6857E82A3FDF068B81C0A747AA0F3D5C4BC089373FB9E9C54802AA63B82 +DD8C82CF7B941BF0714E80EF038C1B25E0E5D47AB1BF04755F4C29B712D8B668 +0554E90DFDF8D489833CE9317C0EA6F23ED270C8128FC8C95CB187B283A730E6 +32D0A11357ED48C36D5B681777CCA3D56A827C5AD83F35469869A4F774B9F2FA +4C437C95DF2DC13C8F3B69DB53F4DC0A1980762A9B736C4F1E435D92B92E7840 +B382109C02A5DF71DE910533E4925CA4FAC2B146E67817CEE6618F2C3BC9B828 +74DAAE72B6BAA987EC03CE66EDF04462B72104FC3941351EDA8C1D7E5273C8FC +C3E4F2EEB29C2C8FFFE88579C1EC41543A55C6E9D5128FAF3414195A8C7A9352 +0667E7ABA457A75D720A090069B396D062200E5A2311535AA241CD8647D0242A +0EA4B1F527C48F40D79FFCEA636D77DD07ABA26FD3F878DE004B03A2F95FF25A +1BCDC1D87FA05B201A4874325D3FAA4DC787D8C595E3E8D11FDF381B92FF830C +0AA70E4E4F65C7587BC5D6ED535A8E130B46D339CDDA5458BCBEA5D2243E4C18 +0DB006C0DEE0468A24D1DAC167A4D8174C296BCFB00439400D0939C7EFAC5BC5 +F62346A2DAE415684F1FABADCEB476B46D821F5E4A28A1F6F51B67320374379C +5B73458575162583150D0B8BF816CB57E08682A3219B0446AA940D0CF43CC1E3 +7566EFC3BEF49273128E9238B31A9244C2001E38308ADEA60BD86A89E1E3C0ED +D4EEEA31131AFE60827FBCFC1BAA348FD183A5CEEBFB472CEA0800FF18CC2616 +F43B04620E74D3AD95EA13E15B13BE3345409D3321397C77D2E612FF5011B90C +3A51DD8C7CD3A3A46EC0CBC605D1484A9C36FBE3A18AC54DEAA2282F7C037856 +B6511E5C990E421C34FF668EBB8778FBC2FAC1DB3F88282478A52C9ACE31128B +2491C873A3B765A204907B5EC4FC6A94AB9461AC8619AFE24C2F0A4BDEEB9D8F +D8405A05F9EB13EEBD79B32763DF402E0FDDCFFAC142DB65DEA80B5EC6400B9A +00A78E80FD3B9F909E953814958F2A1AAFE51FA01EE54970FBA5E41384903E04 +1440C92E2EFAB3E685D730455846D97C2DC7D25586052401264A31F98382BEFC +CF9049E23208EBD952DF7D4A5F0AD7CB2688D77C2F3496AE263430000D226918 +E3CDC6C5EB23B8611A14747122DCB9E016898F69D4314787EED886123293FA5F +01C3FDE4F205CAC20FD19471E9C8FA721A3AFDE78156DA287E8FF14DBF80315A +B56E9E875CAF0DCD3A622134291B4C42E7921F6AD0FD4940066229B892E57554 +4CACC05DDE1F374CFFD453817EFA9DD7A6ED9079B32EFB148C235EF50F26E479 +6371A267FB33DB00F0766B00F0D43992386062F80B62291F623BD1245357B2AA +FB3B27E7BA6CACF749C32AFCAD322510C8A13449277BDBF7C221D63B96D99311 +93F461C677AB372FE263C5C19D87DF70134CC0AB6B1FBAE2BEF9F847E30932EC +89D7521A16AE1351999AD4D4735149AA2892CEA8519F619DC0653D01992AE7F8 +D0C5635C4BCD35708D454C174CB9863B83FE504314A9FFAE0D7535946F0C146B +9D507E1BFDB6095A5AC18DC2635E1DCBEC393DE1D8D3CCFF7B0258CDD6C00469 +D3B94BB1E9E4397ED49FAE2C83103484C1C24151046952E3B9816101FAEADDF8 +8DD6296AE76BEC4B00B89D319115F5F95C568DC54FDE1E0A07AD3D3620B86C6B +96166C4B9AEC2DA6D2B2D2EDAD08D4F58D193278A99FE28ECC676EDD4FE3A624 +3FE82562852B0EAD2A6FF707789799A1546326EEEA08A5AF24FC99F1A6B15E91 +CB13F53C90FB93669B1D7CD4882F55258CACB374088B0B01886155E2AFB7F3FE +F4DC284C5F2D0C56135ED79D8348CE3C1F8BDD50627589E806E6402A32E69D1C +D7EED5F9DDEB91496AB5DBF0D3698FB728A782073D64B0C4E28967DAB8087ED8 +491C3778FC5916953C235A59BC191B8445B118AFB64C3E7840B3756E02ACBA77 +D1269ECCAD63C3FA7C162F3AE317372686B1FEEAC57C8CC0637236CA01DA6B0B +83C40F977F766962E15349F020BC048136E35C678123B4BDFF5B154E234CD0A1 +70AC976211A99B8CB8E131D85532AD7A72072F577B51010F21C6334006371A3D +AAFBD45E1E76550DCC6060678F94E0C7D54D88D066BAB5BD21C254D9628F9502 +5043E9205ED0FC7025C033558FBB3784D2CED521EC7C9F7D6BB8D62899D0E52A +A0E385ED658B1DC84DB76635FDCF0CECA2BE5919D0E63BA75850596A3CB916D9 +55F856AD3075D5C57686E65AA912F0A6E9E4A778522A630D9D9AD3732629ED47 +BE694C35221FDAC7E8CF5C381CEE23E29AA749B52E68D1CC2554EBF31BDB5CE1 +FBE58C5935D06F09B46B96B94CEBC92981474F77036F0EC33C2149E6D945F147 +44CE2B86399056014CED967E976EE7DCDB4AFA12F1EE4D486549C14FE1052324 +ED70C3A6955BF8CDCDC7EB01499126F0C303E64B4370E83D5687E957DBD1B374 +7600EE0E0DE2C57B37CAE46734FEEC0A2F3863CDEEC17265F1EE104BB143442F +35329A81ABA8D5F1B7F8CAC158E4DBEFAE91C2BFD05389F048B3BCCF5B0F66D2 +4A40EAAA1E7D913DEC4A44A9A382F53EB1EE3966EA18BEB5EBD24C203B95476A +0E0C8568E08C357FF880600C27BCDA5623C8034CA1EA2AE24701DC7F1ADD2302 +100F16EFA05F39A2DB15D091F103259FC3C4CCAE4A858B7F72309ABE6CA45067 +EF46BB3C4738E048C884293EA5882A2E6E3B3B3C100B5FA02EC334DE2B68F4DC +2CD866AB8F83BB0DCAE954BCFF8EE7C3D1CF90CC51B295D02F1130F09B62CD05 +AB930D97F9875B9E65106C4A8719DA2C75A332C038E46F7E82BE4F69DAA8715A +1046DCBAD2DB3086A1CE04C8904988F7A2C9891B3C2BAC759B20CFD5BC8FCDD1 +03FBD0AEA3CF53E7B1896BF003AAD60870BC9AD50F6D257AEE013DC166B0B448 +D56900DA44885BE5FB7F3273C15DFEEDA5D6E895773F4435C3F2A684987FF31C +4DD09CB3B2CB9369704CE85FA266676C25FC30B98D74451CFA0A3C0E99ED6CA9 +D31D34A3566A5BA3EFCA62168217429089E61A231506779BC845BBBF085085D8 +BEBAC6370E595188B74C1CC2D9D15CCFF9220BFA63A2D002E7D7F2F711837671 +64E44FFC9B07E092C2C3BA99354F163FB87655EC865C3B2DF852031A3930A148 +9A1D29BF24604E2E635C9ADB770A13288A488F4FB237FB1CAB2524F7D33DE2C3 +F2C5BCF05F7C438B28296F842E86F8BB4881A3B4F89B4352AD50133E79A70154 +7DE8C607A98C696EE1D254EF8E5BE67ECBB7C1220C5FE367EE2DE9D8AC7B01ED +47AEE18CAD10A639B038972587B10BEF449E7DB2C97F4D97FF55099893616BEF +4DD08E57DD9262ADA201C5034CC56D9D34B34E2E1B6DCB02F3971302060EEF2A +D942D62C270090BE5E74572C751A0A6FA081A6DA4430A4A069499A2ECD39FEF0 +AE78E58ED3A64527A70D5F8801EEC47BAE1ACF720369443A0B3D7AB4543C6830 +098F2E44D895F737B26D090F9706D9ECE37CE444F652A5CA5522B0F836201376 +89A28AB47A1291A96EA418DED49A829E62ECE80A311BDF5D1DCF070D38D9C9C6 +AF40F5D93824E089A7B95E4E4DAA830860F2F9A1E3BBA08E539CA4B54EF6E2D3 +DF247E11690FB99A7784D7105F0B4EE1509D657497BD054FCD0EBF0A9D3B5C39 +6E087FC344F636C26158F742D14A363E2130C0EA0DF4E0DB891ED797B63A42D9 +1FBAEF469B0C79081D2C0031E09A3776F862AB8BCBE8E80FC837AF15661324A2 +7C4CDEAC92310EF54B9A24E44B04B5D265808B3B5639018397EBE66F21829F06 +7D0E6BE0DE08E5961848E93669D607F60C25725B7EE8FA83011A5543EA5CE260 +A4 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l048036t.pfa b/ogclient/lib/fonts/l048036t.pfa new file mode 100644 index 0000000..4ec846a --- /dev/null +++ b/ogclient/lib/fonts/l048036t.pfa @@ -0,0 +1,1260 @@ +%!PS-AdobeFont-1.0: LuxiSans-BoldOblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Sans Bold Oblique) readonly def +/FamilyName (Luxi Sans) readonly def +/Weight (Bold) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -39 def +/UnderlineThickness 78 def +end readonly def +/FontName /LuxiSans-BoldOblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-228 -211 1098 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078990 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E671B3988AF5066E3F90 +863D5BB633FB30AE28A6ECF53B5A2F518BA91BAF2EE70FE3F56243BB3F4C04A2 +FC016CC374C654204EC90A7BF559178EE8015AF532372CE4B4B82E2469BD5401 +63B4CC74D7623862E31F62F9CAD70643A7C39877265EAC7B5D71744C4F83BC05 +E893365C941FD0FE135013335FA2213B42226D6B522A41C5A6C11780D38E624A +F8BB54EE866274FBE41FF83840EFDAEB7227809D506507E8322CC5B16FCD97E9 +C441FCD253585347C705C556A3897EE543648265232A49B9D545B6F618870554 +03227116B9F656C288F9C0E3CADE4544BD1E749D80072FC0D0163DB84A4245D0 +41460C3566BDE66E29E0AB39F280C2F229583228198C7BDFD5C07F110E0D5CC1 +BAC768138F8DC9F0974EC7C2BB9F5DC97B5950A1A4E33F2B20061B22196C7FE8 +C82856D93A079270700B11CB7A6396A4E3FE6FC04D6AD49FF13D1A2E1FF8B07D +FC49258896C83AAECC29610440D2BA2C0D19A4E8AE287DC0B8DA956F2B4F5607 +A04F0E366F0A57561CE1E06CF7F3A70E300CBB077F9C918B099FD178493939CA +0D25A808F335DBF82A11AF2D6B2EC8E4456B60DA9F5B713568A34E66F4640C81 +69F5023C211D301FE810A6B6AEC197CEE2B0FFB4CE02B119CAFC5449D8F12416 +989A5A22633105A9750581969100BB65CFB052B5A3FA20A0B4F61A4B497487D5 +BE89F7D45E1A93BB28C6778B39FF708CD041FFFB50B640C93DBF1EFB2FBEF63E +9292124E702138A914432C50435D796B22106A34C1BC3EE1EDF873F60367C580 +7A5D98032EEDED53BAEFEB69414B714E9EFEFF2B1FBA659081577F87DB8BF212 +4C0E77A8605C1C1FE19483320AE88A041EC9B95D10E89CE673E4BDA638184422 +742F4CEF3086B62F5873A1A3F8263EFBA4CEFFDA958521274263467B9C485EE5 +7D8AA17A8C364F517203A2D9A66CB18201897A6223F5EE5F7ACFC3009B39005F +61095364ECA6DDE4113D8C39DA710A4716E179812E79E9B01C3D7B00ED2DC574 +63AE485A2AEA55611672E1AC489C6D09EA559B9E8DAE17DCDA80FD287DB8D742 +D4DCFA54ED2EF42A988D72A491A4FCB9BCD2AD4F225E23932C2779C3B008AFC3 +4D2B158EB9697B6598672BD99C91405B5CF668F3A4F21347549C1150B0FD3EE9 +6EBFFA6F54F44DDD229818D109E7FFFA337D80C83852B12597686E29A0B855D7 +D548EEB2FD8AC5585F458D60F8A18F33CF5CDB9B45FB4A8F61732FC5A2EE6F4C +25C2B903EAFB4A0056764C4FAE4278535DEBF80DB8A9B5C8C471A62755CEB38A +A05D0FC10C4136AAB774FEE2C6CD57CFFB88D9266696C390919F94BE439677E2 +E8AEED7B8B4BC2E422F6C9CD1711B496E57D31637BC0CD4D6001D0E38F54402D +1D6B7ECAF0F454219AD6CBFB857D7165D1217B7F5315DE5EF333AADAC59C0CD8 +290FE129D720FE11B2A16ADF49FD140902FB8D8D33FAD0EF0A79AB30319A9048 +F7C2A38D5E9333A5F0F20D12A73EBAABDCE13D9B38CFBBE20408959E1F506784 +761CB0A7C72A220EEEA74FEDF0158F7F36EFBF9DC5D83AB22C8756F42627A51A +03C6590FEC9DB77B790A5672158CB32C9ED1980C4CB369839DE47BD57CB4183C +EF55A34C70996A7E00740D236550AAC8CC6471BD00D8E3F5BE3727A9029F60AC +8B0C06076ECA4D854E4A1372610EF8FA0FF97D3E637CC8580098961C24735991 +349C2958B4E7C4F67625859390B9567ADCBFB334DC7FF5AB1C0462DBE72CA093 +0D7F43CC5230E57824ABF7857EB2F856841013C9E06D0DF4BC9171A75AFDA802 +4491D89CD7D2D65515CABC474AA8B9BB1177A502E4B94302E1E40D6C8FA974DF +C6496A7C1DC202A79E79FF0D9983E48F8F66415610F0174C5C555DAD5EEEB9E3 +FB5EAE5F9B5307ED89700DB98C7031DAC8F371CEF716BBAB2DE3DA113E69EB18 +EAC7A1756A0340248142E95538BFC1AE4814585AE16E397C3D34736738CA5A26 +6E761DC0F59CC2C3DDC7AE6E801DED28695E7DE6FE9CD1E29FE636391ED78E0F +C450839D27A01CAAF1A56073473A4347098007601698AA2872EBA4F2F32CE6E6 +3A9EACBDC28AF4E8DCBFD8A0ED978058FC9E7FC2A676500E19337917EB0FB8FC +3C37E3903185C96C4225436A42C5495DDD49A9D072D1FFBCB9C2CF51739AA6EE +CC537EC85C9F316B9721F9806F214EA9D10C35645C0A05CC242E668C9B60C2AB +DBF148A8A1E8BB212A272FDD180480BED9988C9AA3C99342EEB70D7EF76C5282 +3D10C8C811418DDF1516660CBEF817DCE1BA41EA0AC8356B1573B9F0272472DB +2112A2D6AD1371128E62FD35068068713F82E2FDDB721C253A378E284175FE68 +8F77FD876230F131878D76D91B43001821A4DAEC5A6C30742864B2F0A1E6B434 +80FB5A969A3C3D6471529E0E1972EBF27FAFA811808D374C5157D8A90F04A4EF +34DF27414E217FF7DEAC000537131429842625464D0FF55BBE51B7048B964D57 +DA20A4F579C86D81B3186CF6C503037C83CDF97349E575F24BDAF5C2B16290D5 +805E88F22B22C59249E9F8CCA25DDC665C2BD937CC6C957442626EF81BFD7640 +78990E9071638880C0AECFEFE1DBC5D86EEBE3E8C181C3DAB690EFECD7C291B3 +882F31F29C281C21DC1C5EBF2975364992B3996E5393CB54C4E4A07EBC183617 +DE1739F62531F36C19404E395389B85C893F5F8BF72AA7CEB5BFF1603C144D69 +25D14B3D1C4565E72E0E64282C5398BB07F45EE86FD19A2C20792F06CB6106A6 +C4EBE8289ACA36D30B57F62A11F90CA64F25A15ED9A187D255E532490F74A885 +9DC77B2D12EF1CB9D5CA120B45A7C05A7945F83F764F5620CB01BFB6C1B68AA3 +FF860DB0A9A811A6D2D6862355A95DC11CA108037E03BFCD8D527A3985546876 +F38487881D7575298C274CFDACF1D190103A9906B08D6415E14857594CC90BDE +9643A556543EABD0412C8BF1974F4A19BC80F638158D5CAB73657BD7395840EA +458E7345E25BF1EEEEBD4CE7687934B5BA62D34E5102E033A9EFE75CCE2EC089 +E62093489C4D0F18F6ED577700D5D2C9A74561848322BDB46828E39618A39D32 +F13F6CB6E9E5CF8F004D6D37C02FCCFE227D75ECD3E4BB1C50440858A3CDA4D3 +66BADC120B31CA9CA8A42FA9853309A1AB649E61F45351E2946D9808BDC97875 +6F08E8C2931B4740800142CD15A25DFFDE8B2EDDB21FEA1F251ED643F08D744F +F7DC5E26064B6A16FB4F5872BE9544E8CEAD0DEF9C52B1E16C7FCFA64CAD2B9E +5AFCE93DD0F8B460BEEAEF3BDCF5660D99A6C9DF1138BC0DF400084540991574 +6F59E90316FF7A74B5979828FB02465D96354BA5757347FA0F92D41C5659196A +FF6E24F615039D949E6FD374243708910E145CE8E2A2461F5A30A5BAE30D5445 +7C10BAC56E08289FB57C1D4C9C7A87CA8D24FE421D4189540B6CE0190281BA4C +9F3CCC4C095B86F076BDF504F24E9B422DB680624D2E452734D17F0416586D80 +B3BAA3C782475811191B857C19D1C4C5192B33997E1368786F9A8D3A3500F7AD +988FAC17371E2A74B1FEC5CC55F9E64649D01230A83D28FE63D1175297818C48 +29697A12F925F189D1A162AD1A71FA29D1706F047540BB4730AFABCB6D3BCED3 +4EC3B8C028AF3E09A9D30AE9BC82D8031D8E00FBC591B1101253809C7A733B37 +4C39CD97E0EB92C5DE19499051EF9FEEDEEA7621C0CE69DE520587D990024BBE +87D6E8E5D59E66502FB01BB368CD92FEF24A618C1A987A898AA3D23CC543D7AF +49C8D30AAE8B9434E491D98E8D4D68DC8D6B741FF66B9AE193AA685864D542BF +3BD2C156D7050190A4D4535D5B840587EAA6AA058317CCB77D0471D83D1D2724 +3FC905BD7F771D0F6D8C3A1D8CDBBA2461A709C004F2953668FC3D0F4B13FE33 +A9AEEC634A3F9A0850D03BA733F6DB834DCE4228883308EC70CD5EE550E51EAC +3D35A3AAF9340E2624683083F75EE493318188E58286F1A4B879C92569DC7960 +538921AD7C6B3C89F4D6C28F650C7C86688FAFA81FF4635EA3EDD855C3CF4DE1 +FE6C8D145BF56105E416F5F9064C4129A0277251A46A054E38E6ECEB327ED45E +1BD5D272182A1CD8A8D0EF92EB46C55AC149D29A4B7000A7ABCEC1EDADFBE735 +213E93C0C251917221DD8926F3BFC5CC9493941B41787936FA077F706E8C48C7 +2430D26CECF90F6086361E3B09D2131963EC4A29FEBEDCDDFE69D56AD538D258 +C3CA85AB0E7CF62E5147038FBED9F0F834940D5DBA99D2E2DC2158BC1898BB3C +57912686C5BC36A015228460F7F1A0BC47BAEBE092D69CA9848E389398997613 +5B5F1F5492A02E35585864CE24860C1647113B53203BE4702C4B09EA377C64C0 +2645A1C416E4551FC9FFD6BAF2427DA4D4853E4B2F9B59E4163FA3D5CF4B1831 +6C51A54BF8040D96BF17EF31A6C832D55AA3E61DCAE57F91DB30BC95A30F8251 +4919068E31C8A678D8FA6423911FF90F48F3225EB2E7CB6A58DDB1DD58AD1272 +6C69DDB5F50DE8718E58126289F883494343DBD4A215FDE54548464E8A6051F5 +6C3DA917300AE09ABA0EF4A4F079A63E1F15030EA41B1EE8EFE18D98D4A88912 +7A790989F9B20E68A81A49CAAC1CD91CFB9401F60C9DFF87F2ED944006432CBC +2CFC078CB5809573CF15721E20D85EA27541FAA4949BC8FA6708810DC205FA64 +28B84176BA868FE351B87361F8832D742A5FC3BE6B0557AA3EA5788239D1FDDB +0EFC4CEBD4D736054C77CAFD5B1453B65FEEDF7FD01311C2C582B6B97EA70687 +8E287CC3A451A190DAE2CDE4708400A48D6F7BE00704CB3F9AE8BD7B4B04A2CE +3C3B8E6D34E3C3C9263122E10F32656166B2BBCB1EDAECD6500C4CA655ED6B8F +037DFD3485443D4B789F3B591B350B9F411FCA0617CA75EA728D0BA4313FBCC6 +B845ECC9E23E497F1F955A15795F01E4A6BB8AE113B2F64DCBD2C7A0F87EFFC8 +994F130004DCC8F2503B56BD9A773C920D3D5A5CD0FAC00763E4E17683455C90 +FA36D8B76DF144C8BA7D2EBBA2E4D5751E7B4E2C675E37714A3ADBB0F17CBEBF +518E3B60DFEFF14230B2FC48080803B9D05B13023B2BEF22311E91C8181355B8 +CA3C3680786B74FD8CE374CFA68A19E7AF2CB998E329A7219859AD23390668A7 +3C833BFA931829782F61C50E2F91A0B9D8EFBD8A6B2C024D5E8E10A4485F922F +06CAF23E970215328465A347A9E283511B92A442D9CBC7B221990D4F679B04AF +112B05FCC1C323CC94A73BB4267655DC61D2E57A0A013DF17D61D3E565AC7732 +23BC046BF8B812CF67AF115A80C8BEEB632B9E87BA2BB8FEE8251B9A4B4971AD +B4982DA27005E24C78E5470F5664BC1F2F48E7D46F660E543BC2C985D2F2B5D1 +8D9C43B976478634A91027F47A5E6F5F89AECBB1C455225528E6A76D4E5E0333 +56C7DBE3A520C8194C27AA32C34AB0AC3F5326EFDC65CAB8F7A63100D0AB11E5 +F3ECFEEC5D9E39760F0B5B3F227B5675F6B782DC03AECDC1C94C16B4CDC1A1A8 +F4341DBC38524D47306D254B37B7CC7CF4E8A2006B7CF3E97B38012CBD63706D +2BA7F279218EF039D9F2F1B1E1A59FEA6DB6EC02DF73061D2CB3C179B3BBFD4E +2CC03CC26F4A4136EEE04F991CEB916FF87E1636740D020721257121F938E0CA +33C265E3C1250D7E62ABF64DE8B4E38D871CB891AB19013334E5D91A744C9EAF +AF9510DFBCC3D2FFE910C4717549E818056DF04A965140B505BDC08AF8A15F4A +4DF3EFF98A4F1FA538B1F121166A5C250029861ACB23F8C619481982F6A6A5B3 +F789B519D504B8D94965217BFFD62719F7E8B8A8A51C6637DE5CBE7A2FF5554B +3D08019194EA5C2BC5CEBDC53ADDEEDA4CE45BFFB9F16A92EFD9C8B224549AF0 +E77131EEAF05BC082EAED8CB6D9DA2A3746510F00F396E66A90C7DD34770F4A3 +A570BB3805F4CECE06731A46151DDD1971731049F57ABF174C5766CFABB72356 +50F03E186424F00A0DD7158429158487223DEB5BFEE53B4990E9DB0E26BEB6E7 +EEEC6CA0A6EE8A8AB949768B21410467A8ADC90E30DA2D8D0E8834B30CD25CD5 +210825E6AFFF42827C99A7E89FD9ED7D11F1795392BBD337320E4075855C5B37 +BEA02800C4F9D24B95E43CDFA3B4B25EF8BF41850C0A0FA8967F94F75627B6EB +FE9751B0A9F14A4454104ACE3ECBC77F62397C7DD731C0D0D754F5D8975A2FAC +2CC33806A516E9FD1DAE386456AD8C5D6D84FAFB2DC08710E285D8BC25FD0BC0 +CE84C436045C9DD14C34768D04D17D62A1CD97BA0DE0622AA0F01979B2FB83D5 +0814DA03FC088A4849EF6F85452629634B0BE5B306BA56DA0D95E8C120DAF5F9 +C880729E8971E16729996CEFC60E980B4BC0F734C1DB840ADE2C735E97CAD49E +CCD3FB38A9764688A52FA164C08C0B9B614771B51AA4E6C95622562ECA3FDCD1 +1C1EC3B74515E9B5303433551B82CD1DAE2FD07DFCB96884BA912A1CA6253747 +28E81A26E46B3169B461943AE9273307E1234636DECE2E32F18CDDB4579C90F3 +48E64E999FC86B7361B8DBC95EB4D1B4B127EB81AEF5B86361FA83085F8F2618 +6AEDEB2345E69557E992535F7B26842B02FEFBC4994E6BE410137AD8CCFCC8AD +76599D96338CC250F9AAE458B6A274EABCBA497DF7ABA3FD0C21DCF14EDC1613 +A0471FA5A3436E83323CD33074ED47C21EFA96B2035DED6D0D012B6306E4DE0B +3CDA126ADCF1F6BA4C2B814A658668B44BFE5C0CA3355D738459FB7ABFDBB0F8 +786B00E61CF93ACF31B60707D674A1A0285AED6E4D640FF94A0B0B02AAF27F13 +5CFB88D3C5E5499A13AA520F4A7889331CA9B35A5D2958683E872AF2E51C1BE1 +7A7DE58700B791FB8FFA6E0F249681FBD10BB62BBF56B6A8B788171F0C72BDD8 +E55CADFA6E7C913BF5644CC759B59609756DBE4BADE6115B6E42A4E15A5D764C +AF80ECFC52EB05FA03D4A87B9E6961F54491FBC6E4573C7A4B960BA6DB2EEDC5 +22742279DBE770E15ED5703D20EEC6E56A61C05D508A64C2DEA63289A8DB4225 +05E16B7D9B915FA7D94CB28426EF0EA683C543D173B22CA22E174A4B3EB88C1F +AE3E3056F4A3173AED92601CE514C957C7E5277070A72169E9A58911678F9EC1 +3F39BB3E1EAD8390126F8587CDB7F8A2FE06B06732EB9FDF9625ADAACEA23A04 +36DC51D828A5FCB1F910DBFC74E1D2B56FD88EDD58B9F2EB0504A2F800FF3CB7 +502C05AEF78B333E4EC076541335C1E3EC95AC70943127B5632954FE3E0F9694 +9147B51E0D75976878FCC4AEEC2661CA4B19BE4F93B07BB7CF0E835FF18FF48F +137AB9AF59CFE1C925CB0D548CEB2FEE5F5B7F25C730E9FF2D757391D1310E4F +EBF025DEFF64DD04D9A06D4B5B84F915CA4810499D3B8F2E3065E5079126C181 +BAAA287430C555E330B53D21FC9C08C1D1822522076A247EC3C322D163FF492C +39D0BBA3DD100EE943FB6E94E4C9686DD0025A04535538D816ED742D70BECF10 +0D6105BEA237207209BD25F7DE0A713B770CD0DCC988952F847BD8816E91CA83 +0BCBA7A48E9925ACC4AD0B1D1C03247DC912BE14909BC7961267BF4DA4DAF6D8 +01A1AAC313F6977BCF8232199DDF4243829130679FEF1431BD6C7BFCF2BCBAA6 +08F6F0D9A4AD5D04C9109CB5AE6013648394C6EB83ECE2E39D46759AFF128924 +004DA587F7A3D6C7EF7A7BDCDD0E1777A0265B1B4954A1F691BC61E2C008CE39 +F4AC7EF840CBE9FFF366A71A1940BC4D7A9AF68000485C49DB2DB1FC400FA036 +71C490F52C175C1315297D147784383759FC1A0029200E7C6BE31462D6D6BBC8 +3F5F67ABF810D460D157E94DB0C1D7965DA58683759800211657E3ED552C586D +4405243E51052A55135B4DE1F10248ED310193E316E18713372DB893ED164232 +85193FF7C88FC96E091B565BEC36CD6A757B6FBA76B54AE14C2EF6B65ECD8420 +3D5BEFDBE6A4F71E52506FC18BA2C02F8AF58DDB285F1677DED6F10A93836A2D +0BD821A5AB069A85D4338FC007AEC8B21FA8CE6792BCB01727990280A57183F3 +6E74CA7520341E95BA611F600D5056CFBBA755B302DA747B08208D21DAF7B7B3 +F2BDC1FA0EB5A05A917FD9E0834F0DA72A9D3AA2AB0A074752737C7A5A6A5312 +CB40DA86B9BC2258EA09B5F6DCF4CB791963D4570D4E89F4CDF0BCE26ECC79A9 +444447D97B32C2C06F48A963135AC0EB1B1D0888BBD1625C11CD4A9F40C1D27C +E6993E6992E1B21CD0FEFC40BFC47AF469563AC79BD433E6FC0419E3564CD4C2 +E3715ED41E6166696E4CC4FF0C89F60E88691AEF06E800DA26151216C0FDDEF9 +F04F5919E3FCD1972F6383A60AE0A56ACDFA018988E01AF9D8AE9A8EE4B401C0 +1867B3CBA3D9E7EA775BBAEFB8FCC0C22F904421B20B640D165747E180C15437 +92F54D2EE73C22A689BD11E70B5A964C1C7DE8BD98C063C9D1348871F5801694 +06844033834CB512388D1CF765AC08824629B541F84E20AD3C5161A3C232CFD6 +07AAA25A6B71B17D0209EBAE3662041FEA4F315A8F8294A4036FE161CED4707B +32D2B2BA3848FB1BD93C6C420F53DD1BA44DF7BEC87659CEF2FEC38BEBBFAE92 +392D2B0671FA00AAA30F06602415C8D67E5252E04E91DF5F62B615E71A46A514 +FD2C5B43DE43DF612C36248B8D27E2D7D390FEA0C56A396F591307CC5BF972D5 +E9D7AA5D65332F178F311A8E08E4911813E3D201B3FF4132C83EF21B5EE08864 +3711EEB51C401B8AF91220AC05FD576D8A1EE80C3891A8AA792699FF784C0953 +94C4E33B8D02D81E2F5E85AA049A89141CCE1140A9CFA4C78153531B1C004549 +8D9DFFD86A271DAF08B85F942D93037BF741258CA94DF4296AED020B131AD485 +DEF39C8DF7451F81ABD667E103E9FAE7F4AAC9D567192AAE7E8EBAE2E46087F0 +A83E7F096FD436AC87978A596AFE55CC09A0C329FAB21A53492A1C23B6ADBED1 +D369010199BFFB00FC6554DF5568F04460311FFDC67DCAECE1E8CA5710B0E8BA +315DFB8C6276B8FB9CB9C14D42A2CF94CD54909E8873FE58D18C274EFFC29D09 +F744357EEE5E12C5A32AD69098A1BE95C6C3713C62A7F86C1874CD274589AC11 +40545D2DA1BF3450680DB402512098A4FD147D47D11D3E9157570586733D24F6 +CDCB0762FB61B16EE2C85564DA2B9A089CE4F12DBCABCF8DF177AF3B1A6F1EED +D9DF8509AA1DE596EAC9AAA062AF4E52BF05E243C9536086565B71E3D9E78CC6 +430105D74B754836513CC837E26AF3423701EA7D6E816FC7E796B56522622D68 +D750972A781FC96854CB962B069377D094C861736699ECD6ACC998C1572775B6 +00E3EF63719E34D4950D1D674548248B7693866A4738F837EE8EBA89B085AD8A +78E2F223F7872AAAB987008CEEFE8A8DC2A6F6C379569696D4B2FE9B174F3BF0 +27D331E30B15762F52F343F1CF85B237838A5AF84AF9BDB7611EE38675D76AB4 +AAE4FA7FBD5CE49A47F5F52F42702905B1B5E3C754EC74DF3F7757E7DBC56742 +318745C387EEF697D14E8013C25763DA1A160A63482F8462F806614957E0A5BB +B32FCCDB28FF2C7C93EECEF415CBEB80B1C0A8DCFF21F6702ACA217E81294879 +AC7E90D9460A39F58D255AEFBC5EC674277B7971B7D272C1F8C1C10AD7B27F55 +90EEDD1F14087D002719742D7CA335853E8641B8AE1FAC60415B83E3160E3A68 +C5B2F117B4503AFEC26D8BCC0EE50750781175FD616AD7A4DDBFE60666F8FDC4 +44BD2FC4C5EC34D1259B578EC11EF75944D0E1A531BFEAF7898965F28306C015 +6D572FD61B31F35904CC6FCD85A598DE1BD812DBCE737DC93FD91079341FF963 +4432EBE341D447F08FBCAFB5C7389833FBA0F47E716E6790DFA1F486CCEABC78 +FAF007EB9686B0C16990AD09DC205662F51BE300E51273C543FB072EF77357F4 +F5AECD3FDB8ED5F316099B380B0335CADD78193F60C7FE5CA9C6695D887E4E89 +123426A47988C2B5F3460CB005C9E139C59E2D377F6F1760911A8FC2E1325B63 +C023F62AE8D2D3AC3474CD637403D341C50A3E380EDFA78FA0C0679DD04F69F1 +3D5F0C33F19D1E670D377652EF5D35F1568D2F3769214B3053005ADAB1C73FFD +EE789CD271A8D8BB800DC4A2460F4F681F3F1735F456D8B9C4B62780D2A9F372 +665352E8D7EC353E7D81A6E29ECAC96F50700D8F1E618918ADEB06337154845C +C1B7EAF769D54A3858D8E4F81C7B201F4E8BB74751B8EE4304BEBD849511368A +D405ED3942A7CAC3E61B49EC8D32E9364BFC20A8072564D427E3892165F7B0C5 +9785EDAC494D590658F226E84B638154DA935AD664B9DDAE7C8344A157C36A57 +5752AD98198DFD97D942C38CC5716A1864270085533519FDE9C7088C7FF9E0B4 +E1511BB6291BA896F40E69E2AB7EEB740778442D57E4DF5D17E7C0F6BEB99666 +4695C52D1A884284177EA3EA6AE6F061542B21C2D3C87714EF5FCD5402E22220 +709E610804FDDFC7C9231D7E85F70CB274F42A6B0D2038613D7649C74BFCB997 +10D96D7E1C26F7E0D58CA6B79C7F709E8893FDF9765F4C53B8A13F28EEC8929C +55164D25AE26C7B978103A593E17E49557CA642F72F529A5504C6381060C3EE2 +181E1ABEBB12B5148649F461C7643E1243A44C8D02711888A8726AC744140B59 +7CE5BE248EA280D802F0F6B7955CB1D4D0FB36CF8960BF0A718B91FD2D357DDB +484739DD257C26E01C539C5BACBD92A8D6C97B56EA6DF85B1E4E384295BC5A82 +4178CC59DCE00C6C75139FF17EF33E4654F806D81698E2C35870EDC52AC05827 +7476C4ECE666C134CF2231EB498555248B1DAB1C4654E4EE3B5455D2C472B36C +958BE6B0D1CC3C87EF568D4D2060C0FBC17DB3B8495660A47423ABA7179EB6C8 +7C746071C267A20E51E231A127874CA2517826A6A980CB51068BC30B7B3937BB +61940B7F361C06644C1B2472EE1C836F9F9B8A4E33ED8CE8ECEE0F5E09AE4CDA +088A34153CC840BC895D6D947A57B76A9A6C8F81339CC12682D4CDD18989F936 +3D00BB0BE992C50DBF82BCF62926ECC17FC680808C5E802258FB9EEDAF8287B8 +6788B4D3C3CA5F3CA6ED288A30902F3304A28F40B92A5A6F987BF98F777FEF94 +CC8AD2F86D76A7475348AD3D07CA6CE80FDB458DD8235B852B90950DE333A444 +0B00C47921B1E201D7033832ABE2ACA0495D0FFD3B22488552F43C8A423428A4 +021471B6109144E03B6FF5148B699DE67FDDE6FA25225C6806650754F82BD446 +40CC9FD2D90E8812A6E08CC935126C8612C71F4CAE97ADC75FD58115E212CD59 +6614F53AAA30D9C8A7DE2A6EA32395EDD26713BF8B6086225970D8B4EEAF71B1 +D3B6150B945878F806BFAC36C33B2344C5233F7C35B8D1264EA12DC081914E60 +78CD9F6AB21585D3297452BA7EA1CA2BCF3F39AB49ECCF8BBAA1A22883C161E2 +699D3A46B51E75E3D80A22ADCF6984B6B67BD11FF7E05C46E0516B434792FBDC +A88DE35EE688D35ABEC1B8945A9A3806C1C214D80D0B60DC31496898B73E46B4 +8EEB7B9D2C3A8829E041663AA48E7378DB18079F4D76863FB08405EE7B8F3D9C +328314A3DDB55BA7C28D4ECC2A4E23A701B88A80D82AA2BD4824FD90F47AA702 +014753CB1E8B020F9A3CFE47F6BFF747D257F48F3507494ADED3BF179FAC674E +2A372DEC39D0DD73AE3F932BC5513947A51671365CB6032F86BF3D3D0F1E8CBC +145782A2D8B27FFE77AC5E07493BF2C423A56A37FEAD71559A149637F8054AB1 +5F76AB661DD116FC5C55ACEC633447343E30C555E0042739B9629D712CBC22ED +1B725451BC0217964F3482250C473C77286326EFF965406FBFDA478FF4E3F4E7 +A53CBEE24C1BB2AB8A79D88BD7BA1A7B86C3650D2D5C7F23119719586BC11C6A +04C0B90489CC46FFBB2C6F6E8993DBBAFF62F63F79EA27C6D2B1FA55AFEAEEC9 +705C0A22B7E0E94CF9306452A854EEB6FB0032E442B5B3A16364BB3ECAE00E77 +2B845CAAB5966A5E78BE8C5440063CA3BC84A4B0A07BE880012DDA7FACE5482C +0DE438ED79516FF924EB0713A68124524D74730A6318E359B27CFAD218DDD03E +5EC4EE23FB7F94D4C88367F6299372BE29B5A4059D1F00C0C2433F79DE287A3E +60A5F5B1C812F1E12809A07F9623ACC0C0DEE78F0981FF701AB187FAC2004BFB +73B0926EC097237B301C311B478FFA455B8B1C1129FD2E4A62D43D2F79BB693F +1E88E5DBD5705480519B874F502197C2CC30D8E716A5DAB4EC24298E7DEBEA5F +095EB5BB78B4D7847B9C25F2D462C86A5033B7EAA136BE3B3993F479B76393FF +757CDC548E9093D916A40045AAB54413B0563FD905451E2D0BD7815FD377E00C +7DBDBCC6476AA2C82C52DFD027134D8154734342BEFE176CE8AC20CB16C173BE +776D5089A4C080D07196A06AE34496F04C5B3945BA8403B2B408EE150BC0269F +CE8A1C1CBDCD996D75705F6CFE6D487025D924208E6304791CBEAA62DF66C80A +9557DF93ADABE4ACDDA1C18DAC4476491A84F8C8D8932E6C02FC22B7ABDC397E +AC155EBDC6F8DBFC3A2064E99252D3122685753C3BB839EC743D7CDF9428CE6D +0DC0CB52F218CF1D9C8412DA2CCF13677FB55F9963BA89A47357DA9957306F70 +59685DAE5D0A70D180949B206D8502489F82D89AD159B969ABFCD08A746B8ACA +538FE5E148F151034B6A69F604AB09431787DD29C6D4414FCF3C4D04090F17C5 +0BB65452A3EBC75DE088201997025F808360A7DCE5C74F04617E9BFE06072F7C +D3EAA6FAF4F5CABF9D87B851CA785CE5A675AE5DAE55C996D5CEB5F760051237 +F47CEDF612D326DF900C771FEF1AB9CF00C5B29558FE329E88C62FDAA94EA598 +FDFB4A27216007C73B14FB5FCD9AF42F39C0879080463A9EFD11614105469C73 +F38A92C4AB2290459238BD513895FD11B0234A17B303A1F55617EADCB41B7501 +0FABA82CE8A8C5E98308B5B655DBD6A63CDB44B3034A2E20BD44947FA1F52217 +01B16A2E6CFD35527363C5981CDECB886331092AE9DBB2403126BA0EA79C7356 +7AD019A16D9957B2617B5F4F9B7F82E75A718BFAE6EA4BE7D8561361DB470A9F +82E7828B10C718536D6DA7155FCC1FDCCC2692BF147027F9DB207E981EBE36C5 +EDFC37B83290541EAF2514891728F4D3D17730396614874BEEA92FC26D1DD076 +0142E42962897F27700D4F34A946571D2AA7F5E9BBED708A9E1D0BB2F9FE0823 +A6D026E3C9D4D92320570B87D428F98BD20A395BD06B600B34E274A9FB42B0BA +4430B56E5DED6D014DD78EE54522C25429E5F6FBEABD61CDADC297ED24758E2D +85021DD2E900864CCA07616BEE37C74B379C279F554C4A20C195176787EAAE66 +1466F8126083FBAACF3E774843202587C09AAA172DFB89E26761A7398E9A9997 +256301DDB5ACF882349D99539BA40C38CD3E69464B76B5839EDA48508A3D7246 +FFA59703562647B680288D2944AA440599D0B9BCBF2E1261F3AD23100219B1CF +3A1FBB617606892DFA5DE1D7C221C4A6C8608566B92C67C3044CCE7FFCBAE2F4 +100445E92F506306C2553EF320325562284B579353168624EDE9FB921A759BFF +29F65445AEA413844E4C9E7448E47E7AC8E934D993EF1DCBD153537282E28104 +DFE7BF8601A2F1544FA971B9FDA521F228BFC95495CF5BB48E4DB9828F64769D +1C7AA777D2F1B79E054C1E6A03D3D27CDAE3594D6F37F8F03572778058A6FE9C +E8E9AE758B7D204A02B5CD228029C1909656F1A784A3120555C2705370C80B6D +6F0F9A0DA15870FC79D8C451FFC98D8BCA3AD6865ECD906B2D8B9AA6F62FD013 +9B7D59E9F9C84976AF2F142B953A76748C078A1B32566CB71C808B4EF5B0360B +60000145951DBA021F16E090FCC1137C613A5C488646FE8DB564D5686D49E0EA +152390D5AED15FA44C71C4A829E250CC5B3E2B708EAFECA4B324FAD72A5FA2D7 +CB9BCF155F04EB6EFEF4CD2E38A6D435E09178D26B9879DE75B7E366DC829DC1 +A7E25E4DBDCC29DF8AB10C7FC617481FFCEF59B60ECD35DBCA03CAE19A9804F1 +758EA342DA058363A1AB7210A73045411EB5EA0C97C64C7D89162861C549778A +F748232138F5BE892143DB15AFECBCC6E16646DDB26C7122D7FDC60D530EEFBF +32F9050BEAE6A683CC7702866FE1E6D543FA8866CBC92D25772C79E823F6BE83 +F1F4F52F8C851F7F92C1E81A3FFAD932BB8A35C263B535B3615DBE8ED8770B4D +84915C479D24345EBEE99B722DC5C169D04A908BCC3D0585BCB6C96DB29A469F +32689E30797076DC2B096E1C92C8012E3134BFB2CDC67E6C389B93018B42D727 +88FAB5CD6F4A4262F4F45D72346645B64A393EB960F6BF1A26CA2FEC965DD763 +1276D5168664E29A51BD7B8A10CB6F8EAADF55C9727DB220749073D3E1FA31EF +9F468511A80615D35F26A05FF01C183480D2AE7E729B9B04A39789730E5529D1 +180942E68402D7407419F2622574E55777A4DAEDB7CC9F6CB605AA428F28CA6F +C859BB79A649578095243268D594212EE8A80BBE4DB720EF6B3695F8A16516D5 +6B6DB2F9D93EB1598E06879AB08ADCAF0DD75C0BD31C9B8F44041415E6EE47BE +4421A95E6B80589BD4CBA6066C1092D76F97EBFB971E38B986762255DAFBF5DC +7F3A28A028DBAF10AE5D8210285FCAF35E22E68A42B3DD8281D41A657DA2DC3A +7107994D7E9FF61934E1F63186B9E28962AF5D783458A85A84A5EA3676AFD039 +F899DFF2319013F517A0D3F36EEE1C42DFA5B1C3B8E41A5BEFDEE21136F64A74 +0B2F3D8F2E64E4F106DB68C3FD4ABE346FD45B90DEC25D1B705EB119B08409FF +3769266F3A94B030B57BE670BE932ABD17800AD8115BC513329CF65557EB4E66 +788C2481A74AAE555DF0B8C1746FCE0349BCCFC76120274B4414F3E860295696 +7A94B5BBCA7F31D3DD01A59E2E2E188A323F1FA8E1B9EC45589B444FC7438731 +F4FDE301422B653FEE01C38E0B68DD30B1B7E2079EAA2332BEEC840AA36BC3E0 +8DF770114A53A01DA1F4F2BC6EECC92160E3EAEB18041E2FE43891778A89A23E +2FFE2A64DE61CC651CF2B1C44EE9677DEB492438756A31C9A3E89678959EAFE1 +B93A0A25B64712253BBE7259844D4988A574FB1219C96915A7BFAF654DAD6BE6 +B1A88AD6CF09027359A681FA82AE364D430AB261668897C5414511B9B31DC31F +FFBF69F5C1EDBC0187EC0C658770EA19697D92D1A35E1A98BF60F6CCFC3BCD51 +EE602EC8A919306705D61579F04CCCF587C6A5ED9B056FFA9FA84FF41AB30EA5 +28D5498ED5207B7244EE46C84FB5BABD2AA6B136559500CB5BA0FD4BAFE45AFE +9E0AD540712C7759078A5C257C1B542BE3DB37BF0CEFD0F18C336D5B4C5BA34C +9E09B8DA0E388BABD69F7D1573A86E1C52AC315719A5179E7D986430BD34CFC3 +6110822B15779B121E917FAAB2510F9F280AE0D24F25D7D6CE64DBE1241C3CC5 +D9E14F5A5B8E3B16957E642784246850E3644C6ECB7954B469C1CD954D0557A6 +6F04BCFBA452A34A6733543D8321405EA12C1658EFE72CD0D2BDB735053D38CB +C72446A5C57FBBA56345C1B00B4E0DC9BF4BD5403B1E1BD0A890A95316BBF90A +C683E7C352E2D61B24E84C477AE559D5BB86BAA35F235AD4F32D7A9C9FADD578 +E3FCCF6BED0F7DF1E412B8A923F7197DB936E27230DF61C370318052ACFF31AF +4709AA521D561A6F1B4C8C425F6638A138EEA6A8CC069559AA3E35C7448A1ADF +7445039449B49621781D2D5E969BBC78A0CE5FDC02A7E0A76828FAD14330416F +B79CD927968771EDC913E875C5D11C2F29CD9DE992F652DEE96685DBA857D0B6 +0A2F410B2B46D779B25BA538E0B0145ECA0B14BAD0927FC63ADBCF8EC10506F8 +282DB2D07172C19617F95235C7AF6E1253C8405F53839B54C55DFF7C46A16202 +BE0F0587471E8D83E8E91A3C9F3BBB82BFDA98811803945EC85607FFE3E94E6F +7E26CEE7A306E4C4409DCDD8DCEA89DD1F08EEA1F0EADDAC133DCB1931255F63 +5A22E592DBB0C8949ABAC62402CE17DC7A18AAF815C6C86BB341E7444F878817 +1590AC436E3CEAB3FB79BCDF5A12F2413A82579DE9E5E36E92B47E465CB3CED4 +554D1E308769F56B2C55CD8029696786C0652D7F042DD0DB7F24AED531753E9D +82F63CC50A1240F87EA74381D61D912C8711F6F6E9C0CD3A302D0F3687EBF024 +C97CC23D4E08514D6BE8394632BBA157A6606DBFFE884CB958E2F876525ABFC0 +F0370C5C9FAE209F10F91614475E9EE4972E95D8880F5714F0D414272F3AEEDB +EA181B2BB43631C15A68C0CAA12A8B9202722EAE1D0897657A1A8C57CCD0DD9B +F97C68EEAE1E098DB56203C994904A400D4750C150ACE554E7B45D4D22563D0D +8879046FD0D8DC9EA5893D5A58C85E81C6B2E13A89C55ED399EC11B5C1F80EA4 +53EC27FAE17E582B3EECF86CF73119A8972F00D946ED58931A10586B6B51D39F +72D17CC529105D5F8D74534C2CCFAE412A516CFD4CE923EE8072950A606224EB +229147A8FECFD224E4158BEA0DACDF53654232A1B946711DC8D20146B4CB7D23 +CE3F199B1E2698D626A28CBB039B073DFB33F29DD00B58875C28C700A985B0C2 +92656881336BF5DFBEBF01FDBBAF1D86EFD6F6ABED59FFF6F6790E94ECC70B88 +B0CFD30EB7D4677AD2E280A65CD9D95A35F7EB0263EF3231AF61A1E81F2D46E3 +D84C94044861630FD92006B7C0AE4667F0D23FAEE1285CC1B9D6541349015E38 +8D57858099E69487015AAA314120CF1D2C23BA28CFB15F11C12ED21EC42D3E73 +80AF786BF3958C30AFC42553C77EDEDF143B6F05BFADB6089FB93B9BAD0EBB87 +8ABEA058ED232D3F24C48359BEB73EFEAFC4DC43C6A1C4ABD12FFEEF73CF2649 +84E08AA367F464A5E009D2BAC23CA90A1B3F8B463B7EB947A25C9294E188BCE5 +512207D22E67150459C694156A6AB56EFC0637C661E3ECCB5D5331BBC268284A +8695461785F63473F18C9BE89D9447CE7EC2CB9AA325BB56A5C7FA6D03D9CBD7 +6520F3D07108DF20136AAE5C1D3B0BE03715C7660F767846D85548C3F6B5FB61 +19E0E43AA7FF6CC70789D3B646F0DE24AD23FF3ED668C6E7E25FF7130859A5F2 +3392D7F16549D755038CABCC821BEFA442C8079A33FBF042FCAE80AF0FBF8C96 +6E759BAF5913D55AFC923B065A752A6E47CDBC6DF8C5E3685D289220CF593255 +E509311E5D26BF43CC8B7BB2A519C274423089C5FAB6033E17625C953E9BE3B7 +FBFD85C879B64DAD56EFB9F0134E5714E8411249B0DED90B9AFAD6E40ACC3C32 +2FD398BD0AF07732302617909BA907AB22062EF8C849CED6C30A392BECF6383D +E6A3FE99D6E928CDC000C08511327BA7A0AC713A78A3D515E07396AAB5147135 +86695C077F211101014466A2E7BD0151B3E752DE0D255EBE1D2D56C5D11F778D +5FB60C8FD628814DA7F9A3B7F95CC77CDAD55477364A8306D2B28CD374926E57 +04887E6BBAAB59107A7B89C36BDB46E5704EA401C4DA6394D3AFC428F45465E8 +9D01140F4D783E3739AED22E0D871D5A4017D9684D2E55A47EE953FE22B75522 +6817F37D12A1EC0976441C94FF787EDFAB1E409FF9AD3201D73D24BE56C7CAE0 +43A73CCED4313542F4C1112C35141808CADC4DE6EC7E832A4AB4A580C4F26B90 +5B37051CD708D6B2D770364C04B7546244474FB9574E5ECE5427FBB29603F543 +3D41C97C021348F027DE6EB0A658750AAFA60737495FA80D6E1F61F1737FBD7B +0007EE164DE9F5877DF68DD8CB10A8F06CDEC0EB86280B3EC29F9DBEB1B91357 +0A51B254E35A72593862247E85053B922581A1840399BB254403D721AF75E774 +70BA7AB160BD5C9CC6EC08DB9DEC937712328EE8811FC9C917B293575A6439C4 +8147D7586ADD5DC23C61D1511DE64AD1F5A93A4BE587A99DB617CC4472B1F984 +24D991FAEB3F6CC28A21ECE4DF9175CC0CF56EBE2D262D431D3E8E7A1D220FA7 +CB18F1493A97CE32DCE1D95149C5FF848ACD3B3B32C433064AC995006AA2B775 +5C4BCE15748227CB3673B7A09B5DCD00631F91CB0A157FF1710A9D56505CF964 +DC1901FBC364BB98385F009C20BB41F96CDCA2021E36C3EE59863D5298497915 +3BA4DA380C705B1D81E07187A3D4B4191E5F22116FCDD21A3EA286C53961ECE6 +BD7D029AC344E7A5A03823B6A13A763C946C41229697DB8EF67007A934F27F7E +07BB63C5C5FD24CD241EE957F854450097D5E6E291812CFB9EAEE923711BB88E +B74E472FB4112EDE27A893B34725C9DA28F91F4A91EBB54168E327C1F9AB7A80 +96FCDCD85BDAB9ED36DF209620395F539FC7184D88BA680389BA9CA51B9A5397 +BD0120BF40DE8B99D6205FECE2E509EDB0C39BD75F29D6D97E514C2E3683CFB8 +FCA479BD47C8E02DCA2AE350529A568F66A7733528CA14CFAF4E792F10A11C3E +CEAA08A97CBD6D43CBB43CBFDC7FAF22E87EE9E008301D60083FB7002697B3BD +EF38EB52049C00F157558B3A8BBE5361C82F049D4566A1466869FF2584F6DA99 +23AB74F19AFDC1B6CE4C4AF0299F6AB4E57AFD2EBE1AF260EAD4B46A79ECF3B1 +BEBA4B9154DC2390AE0061E48D002EEFBF44ED6BD59317E017C6E42B2D8283BD +58B8DB392C511C12C72518A2B1C4D185E1D0E5068ED5F4C73E771A75F0BBEA45 +428E0D31C9083ACD4842EA136FB12094F786DE99956EC2EDE1BC9D3352E68CE3 +4CB3994988DD766F6DE69C5FA907DE7B338F22FB9377E20B7978E2B0BF39561A +F526141AF262AB9C6853BC1A947D79F8A6930232F955C6C88484791460E7AF48 +B235E17AD4507948DCE6A29CEA6778893BA825CD9DB22F9BC36822EF4E98EFA0 +628F8190C1B4985DD9A11F2879AE248E2D4115CB01446379D9FA1820B39A4B39 +9B1FB8E33D9C22EED5CF125B37DF0B7A471A58E7CF6E516DBD5F54C609517F00 +D40B22BA5BD7D3EAD411D4373FE4BA22A93E2DCE3F7666B178BB881AB2138076 +87DC7077CB5EB50F0CCEDB1786E5AE3753C4023E9C6526A57EF2C833CFC36CF1 +C818DA36058631F2E7D76A8573ED0BBCF641034A35E3B7728BBDB3B8CC9B81BA +71CA28E2FABB0714271E3CE86F5762B3975834692C390A3DDD31C7A609F3B850 +FC284EE819E6E6A4A8085A92155D502F95B9A5C7E5D02059D9D0B7D06F9D5ADF +85091858CFE4C7131562507C64F8AC607AC9936C79C87DFDB9E6A4E2284A5BB7 +4F7BAB56A319EC9D70D184F789C5BBFCCF7B7C2B91C2581E8A5CA55C8EAC26F7 +CCB524EABCCDED72C187EBB1F6943A992E63C0D46206251BDC363362A7A37081 +9D58205CB308A33E290AED466DDF02B1FE375669B08B19376CE9DD152E0064DA +EF925DA958D560D86FE710D798941601D996C655C553DF0AE6C0F3A18E54817F +7B30DE1D156861C9529A281DFC897A4B4746FA7AB6A95461BCEE458DB6D05332 +677619D0BD96AAAFAB4EE63912B703029AB349AEB275AD79512DAA4D7212C101 +AE39F00CA8DE02F438686211D567EECE1E42FE13386314A94281F014440D59F2 +6E258D72363746144577C85BE389F65676AE3C3D19CD2CB8BCAA75969712B8F4 +7629698C52DC6001E32736214349690EF8E57A8BF50C9F56A4A0493FD66A919E +9875835511AC63AEBEA6BD1753044BFFC98432A7EEC9E3AC68880974382B1EDA +7E01A7FC78EBA3A38EE6BA20636CEAA56E3FE22FD60542433EE5CD688FF4018D +307D893C2021D03C7F59C9F1387960FB843E1AFBE04A2F6F406C31CD5DB4B24C +20739D6D74C7BC11B20382DDE8EBC1098E0B5521CBC13D346DED4E5C41701B96 +A8F8A382207C21582BEF7D04129B3AFBB97455EC964455C85B3C177C41675699 +77FA7D7C2E62EAD5C151965CF3B4184C3BFDAC859E1F096CB050BEEC459D7317 +A088DDD378A476D46F26C048BC4377CC1BC095F688B7B7CBD3971AC1F050714A +35C81786288D82C54D86F5B00ACB50B0450A2EBB9DF94F0A7AB1B0DE394BDB53 +5C7BF36E6CFD410056591B94C351C1544BCCC77C06EF80A9D02026BE1D6B7889 +212859D0998B0B3E5DB66E75656D69D30104DC613DF83C7CB2C8F9D64646A7DE +372AC87CE3394DDF99D86BD15EAF56B06593F04E47862141D81D66D83AA8806B +47D3B43FBB79E806F9DF2288D9E6A2CDEA497B854C743DD4373017884177AEF0 +B44D4661C0989492EB7F9A5894AB8DDC93D21DA24338E7E12EF3314DF207911D +B84D6CE001EDE032D12416286899FEA12724AB45497E4A0CB868E15FBC144CB5 +ACE3ABC1B5CB2BC13A220F93D9990DD9B4CA9726CA00DEAFBEFC2BA9EEC3D94D +595582174CC45D726E8B961860CAB4C611DE70769926372F11492FE2D4693C05 +9AFECAD80BCCA589D7964DAB00C5E123933F6BF2331091E81E67F0DC0ECF1707 +0BB1C5E2DE5B1C88FADFAE9A6594B5EE9E9706466F750195D2D1539F7C80594B +531DFD2DFC0BA2482D86F2C8C3EE068C3B8596742ED27AB960DDE361827398F1 +CECEE6F2C74F944383CF07C88BC80448AFB946C782FB232CC3FC17A93E7EF7BD +3CE53C6EC2D3D25CF63A3CD27140B8D17CB74BDAA4BF2E76CB2AED491E9E1F70 +800B380CEE1A505E612E1BB47B07CA030F9E22C8E5B559AA42CBBA8C36E4A7B0 +6F1879675332B6EBAEE398CC34ED9E02770A3CE0560818B77EFC03B0DCD583FA +CFA3251AA96C0193B195DE6B37E89F2279603E17036B3152A111C54D0BB8EA57 +32CC5E5EA68254075A7133AF0EEAA153ABDE61032E6B4DF6C057DBFCD5981449 +68F39B3B1FA9EADBD8CED34E625A23BE959347D92158FB083FD351BC4AB0961A +2FDB383CC4AF0F4D841BE9EE98C60AFEDE729630E558D54477D47B41A63ADE7F +BDEDED305CE9A874EB2CAA040DECA194FABDE66EB73F69DDC4B4542F035D26A5 +26ED690F92548CE93CBF174EF853217C93E25A68B7C6E47FDDE19627AEA88A5B +5075A2EB5EBC4F291D8D47BF8B699B4B3617731ECD998002F003AC8F48B22EE6 +2326AB694E4D985154F4AB6F53E2023DF6A2705CB3C6E2122422A866AC481A30 +9B9DDCA04F7F5D3328AD58454FBFC63790F87C1947A987F740B02B8D19C62A7E +AEA6F7F7C7D0B1EF9A4A04094891F1613D3485DF031D4016E52729F0AA3BCFF4 +A5AA7C714B957C6F20EA9DA162785C4F25C37C0EC00CECA092B74C9BB69B3CF4 +272D015F54E607FD3BEBEFF03973BC28EE73685E037CFAB19FB5000E16E05B41 +23DCE6A1B6C3C6426F675912DB1886B8FD8EF3FC186A4E8581267B5289BE404F +1757296E1E0D67DCD01A0BA71E46824F962A5220BFEC6FADC5F3911B1F13829E +41C92272767398BB235DBCC3C192136AFAF90729EE25933F761582FEECD8A2CE +4EEEDD25A50F91DA79309E039FF2D1D8268ECEBAE56DC01E66CFA97039B96FCB +7BC9B91B6349BC9866EAEBD1C3982F5AEA86D38C3690FEDC113DD71B5BAAC063 +72C28280BD462003F9B8BCF16B3221550552720741E85066694CA465044FA504 +2BF11776595CC01926639215CD1258F59C16514BAC7A0E0DFA9BC3E6465F7495 +882A0C8B8E37DF36F890A2C4760D38490C031B61231C3E2D8FF421C3E70F7F95 +82383BA66DA2890FB3B6001C69713E84587537C409674570DC75F041B3232416 +B0C3483A2A724ABDC5AFEC995C1F32722FB685388A162BEABD1EB092D1105EA8 +D7C03E271937FB18A65E259DCE716A5C0878A01ED4A275FEE7DBF6634F3F3BC1 +1364443A9AF6697EE9DEDFA9DD67FC0AC679498D8DB38816D3D51EFB75E9ADFF +6715121DCF5B071661A9BE993CD9BB6E5549E528701702F13B5540AC1A01396D +84BDACC73DA1B07CCA3D213AB57C4D8F1DA01AAAE6C92BF2A197CA39C992F855 +F2938A0C8B6B112FCA85829FC4EA35943B6CE0FDFB766308ECE21566A2E59A23 +449FB9BAD4CF2B6460FAF544FFD5A0304763B6D61D91CBC7BFB91D6FD3559F6B +89C91F3AF46F9B14203D2813472065DE22D07D828FA2677C876652AC40AAF58E +C1838D8A74D192964BC8127255EB00951148CD288E84F960867BC49FA2702E2F +7C8023C3E86F10C63ABFEA6A328F1B9FE422488834E4295AF83BA1604D132A05 +6A68331BE2809C17345746B9341C97B014614B266090D5FC73CF8D2DC45E0F19 +EF046962391AD19DC55334C72E3C131B502A63A8025443F5DF795D0F2E99D749 +DB028C621902C64E72635E9A4CA28C86D59006A24A65A6BBDE8C54B8C433DF38 +9C93E3A0A3F21C223D300167C199FE2293BD5ABDD9F0B4CC092A6151BB6AD061 +D79F12F437EE38F6214A9C009BE720377AF0021AAF5783EA1511004B1238ECCE +C75F2CF0032133C84981A7FE1241C65DB91D449618EDA8FFED39D3066B6BD0FB +7DE0542C491202D694922F4FA4C4BF2AF72E4F74564F2AC3F54A9F72BF693675 +400F251F863683A1ACFD71981FADEEF3650B387ACA8846D7C57A84B5BF5AB913 +38A4BB4FBE788E9A856E366895E36329189BD5802F95DFE821C79B3B8841FBE1 +29DFEB3A465E36E1CED694425C1D700239DAA5723C916FAA77E91E781696C8C3 +E5A4571CEF70DBEC17C494ED46BC095486079ED8443BF0894B26C39D492C4802 +6CE5E89BA641066EE9993E5919207B12BECE4773591EF3B48EE224CF18843DCF +3F346BBDF9DA3B8A85A86C0B8F498AC5D92146BF9C187AAF18E6CFF2420A1816 +57EE974186F63E5A161375A822C588E417746972BB1A31B0FD68B95EB128B7FB +0CC33F2778C6236FF6B588B1A9D24BFE552BF848BFDC9C275F4E6FB1AF090EEF +9483A7AF6A6D7D8C285F535669786F02F0AD230DD9594A351D72950E7633A28B +ACF784F1E2CBD036EFDDC24E9DADD0C67F33D8F5C87E97404F718437D3F768D5 +DD9B9E81D81C0EA3445BACE76BF67DE5801FD0AF3AB7B0C40CA1412631DF8DB9 +34C640F23C28B0F44DBB92FD79C254F768ADFB59567D4341B339F9C9DE47D299 +3444A3E8A1392122F8FCF9B78FF2C2918A3FCD1D4D642BF89D2B12995735096D +A4B65388D6D8E9500674ED399DB7A0E35F7A80DDE50841FFFC19BD7434320230 +4E3EB457EB7724138BD8A53FD10F5DA01176551136B004F4CB535BECC7C79B52 +1DFB022DC76DD3FC3DD114A6A42C89543196FB5B85B6F8B9C9D9EB55752F69CE +2EA3C2230A67A15AE41C93D6904580A26CECAE69E12E7744CA7C1EB558A7F4AC +4243014B5694363770DADDE68740C483F4740C97C861293B2C06D7577E63F5EA +1B3373EA993C1C9BB452988A474D56D40D4B1181DCF2802B4822CF34B0FCB29D +56255A7DF6BD8BA1477F786502F55A31467EA9011A71216B93BCA4032CBCF8D6 +73BFD93A21D8102E4CD8FE5B9039D7AEB01708BC4976A5CCE0C757138E433568 +1DF2E3A2CD93DC5D4A83C60011E7807F206E0C13AABCC4A2351BFCAF4AE66971 +75FAAC7162E84CC0515A448997A20878CD4092777668D3806FA0D28488478110 +CD37E011C61FA9F98F495DDBC5C43B6CCB794771A954FC694EE1CCDB92560F29 +C4EB9F2CB61543667B95173E1A36D50F448187D52AD351FE8635A95AD9461966 +AB6D6FAB28DAB949B79724912E910DD9B78703590C55144DA82BEB8775855C0F +3C8985283167B473B3B2D495BB913B12EDFFA92889E5109C50244F3005DDBF89 +2583BE928EDE0102B0F7A40E4B0EBAC9DC01DE981BFAF286E04ABE3DAFC812F2 +D066DEEBCA2CEC8913338335D6297114655C844254175128C13B0831693ED51D +C834E442ACBA7ED6A2B3887A19C58B113A7BBEC794A909A1B9053BDBCEFA2098 +218CFAD30A617246BDDE096F066A00BF81F8FA0551AF34D98F50A16FFB09533A +E35D98AA6BBA9F845494FF985D83EA8B7888D9B058BA84F801BC9F78800F2CE0 +8FAE86FFC77A085603AE7002E4F6BE5D66DAFDCE2B355086B0FEF5A7E2A87316 +DA9D535BFD88B835C7CBC60220B6C546AF6F8DF890C9A582E47EA590307BB5E7 +A37299C66DA33CCFDCCE4E289E19A4DCD0ECE5CB3445EA37FE23053433FD502D +6CB673425C5D9DB2B0AC5C56D6420AA9E7598381A4BC05733F6479F24A9DF669 +FA4C9CF602ADC5C4BEE77BB61D8A3260ED88823D20A9D779BE6DF977441BBA4E +CE8E15F5AFA9ED9AD93737EB6BABB8B32379AD3BC714A6D1152AF18B4684ED18 +E46BFF0725B90A4886CF93FBD29246F9A79D7B41432F598B54602304E77DF101 +C414CADAD6D520FC84406FF20622E60B45B7BB3E353BDB5D4AA824CE42128847 +C11BB4DCE8A8A0EF76035908D50386546E45A1548124FC24607C397EF14C6ABF +9994ADBE0C74129E63E76BC5BAA44BB4F42B875AE8D756BB8FE5153ADE5244FC +784CB936E7C2FA1FD6E6300E423A4238DB8D658E8F1B17C39F5A1A33C7F44330 +7FFEAC4C1F9B8CED5308BC43E4C128FD8457B89BDC493B9C68DAF7E76B3DB809 +F6D3152B676DC1A1E103C465F33F087BCCB64583733E3773F7D6D4C994BFDB59 +0F7BC03897EB3CCF914C1FA400CA14CD5294B779B7BAED650CB2C8D486718876 +07B60CC3D111FB8E5DA6DADB3951595CF9EFE458EE412082A35EB390C9AEE0E5 +237811A13BCC85F07A245EA22650BDC4A9E8DA0575AB3269A4E40034013BD348 +44424AC74B1F6628A16533D8DB6D14DFF72E1845416611D45CE2BCCE3F34B1FF +86BC076132556E6C65F2248E073825D2B2D0E3DB91EEEF5D33B12B0ADAA304A6 +6291DC109F87E7A92335767B3C711F92F105B0B6AD525A6F8F72FE2644F1E180 +4578CC1C66D4720DDBED3CF91F1A46A96F5619A6D762E012053D14A26A88D6AE +87E37882423056FFB32531C99F2CA89175FBD95EC4A9E678B440D82DD77F9C5D +4B6D97D1BF7B2E24038BF1BF4B8327091EE59491D91DA01D8756B6F83C28F203 +572983E6CDC9C1D5C865B753D9B8820A39858C389CBFA4DAB82E2D35B6C5B332 +66A239F5BA78A4EED07507D2FC075C65DDC391B1A93A051F559C832CF36324B8 +B7909C130D20CBAD9EA9FD1ACD079D7B95401F72A950D81760DBF8895876FBF8 +018587D37FA6ACEF2593364C21F8BDC34A27392145EB2F63ABA3771402316E6A +2A30C48B7EA2096BF6E53DAD2C47CBBBA646816DD1E6EAF631F42B108BB2FC5D +BB808F1BC7A8D3501B2464F8BA83303AF8C43028368E6C814541E17717B397F8 +72034E115CE0AC6EB5983237CE8F604A9549373BDD938187A39F6418A8461705 +A6ED43F775595C7A756D9BC1501A440E6E4ED43B01DE23A206A654E2FEB4A2A6 +4A2DEA86708FA9CF218CF933DBD13044E82A7CE60182F6BA33519BFFF275C2F1 +6B6692E841CE26752200DF632FEA9C93BFE0267D4D5A99566C1AA78DFE8FC63B +2917E6DB430CEC52D19DF490FA7015D9796282C3FC78F9CB2F2D1CA2A1302CA0 +C6A066ABEA6C871D69B5E5EDC514260193C6C29C8D308AC4A6D38C962FB7FC67 +EA268A9395414F7E8DCEEF611D1AD784E9D56A4F71E13FC7B697408C1924AB70 +A62BBC66F38ECEFD60BDDDDF85F849BA956C3F3BAE422F9DA0946100221556D8 +404BA4327E9ADF31B4AA708541C46717385C3F57C3D7220C59AB272AA94C4F1B +62136AFF190C4AE70F287D2336991886EB3F14D2F2CF9451CB55C162F494A261 +1A88690D9308B80A3BFC92EB48FACC0C7975FA1F262D81359C88BFA3B5F91461 +EDF3E9A7764304AD3EA1B51DF695C915530389C7DB27FDF73D37CFA666E6CA37 +389BB54CEEA60324D68423B33B2A03BC00E7C890FE1A276A3741C4E133802C69 +8BC3692FDD7B0F837AA060A0C08F8A77976E0C5695D16CBB07AA95E8E4355831 +5B43B8C5F9D351826A537FBE9B5F89DF32DE754A3763A75CF5DDFC60258C044E +B4AFDA88104390CC2894EEF40DBD766A481C5428592FE68A6530F1E063F013C4 +950A3A30D2F352B6E547EFD81AF86ED43E0BDEB8A0B5B7F61DABC796A21F3990 +94EC45D1E229776B9357F339F6148EDC74A2DB064745749A936E1028C8BED9E5 +5EEC197EC2F23457A690F377A544648A9F151917046F34B672C00C2CA89CB8E3 +26AE54ABE1ABE6C6C697E08B90DDC90F54E32C0982299BAE9A7753C07755A6FC +CD5F7FAF5BBFB9B93032E1C176E568CBF93303F38BE9D78846AA1384A047E530 +E7497DAA12D294DCCB1747411A94EED2F231C5ECB8E8A43851F4840066C25E51 +EAD18EA9A3199BE80429EF8298BF6D473F1407777D857075A3CD41AC7E62060C +54F97F65A8EF5CE6FEBCAAA7223E2FA0C6A2C86AE5D82B0C80A20F16BB8768DD +E778337122FB7DF527B0E9AA47BD792C2484784C8731895528A30F7D1B7429E7 +3AD1E59232438BEBA5D065C8C4FF2E6B0A84233EC5BCB2E2FBD7031F1B74AFE9 +E4301B662DE9B6E27F62BDEEEC1A7C73ED4CC8E4191A473728CC5A0A35D2F3C1 +0F743792A11663F871FDA8582F7EE0B7C4C2CEA0AE1AC74A73314469903488BB +DCF92439A3AEFCF1621488D7BD8BB25318D7196D459EA3ABA44546B649BA0CC1 +9E29B9586D948282EB1D8DB89E4CFD6DFC16A005922A7BFE071819D8CBE15F41 +06217264D10450784FED734EC809C68AC760007A333E4132DA48201C02590D40 +BFC91E614F145502C9B27DD7950C46E6B25D4470CE79CB2DA192336726253512 +CAE6D87ADB60EF451A507CFEA57914F241A8C81DFC8AF788963F2E2EC722F81F +B2E1D28C07CA64D5E9EBE8722707CD91021DD64EF2700953D590A62AD8AFCC85 +30420DEBCD42A684B5C527BC149DDC14C4FFE9B350DB04B850245A1650E749B1 +B0C094644AD43AD83087930CCA240ADDC2975E05397807DBAB4AF30E6CB15F7D +014771BEADB55CA911E29A38D7D2DB1614DCC0FF899BBE9FAAD2513C27BB74BC +A225AEFD85DEF96AFA64F89405572FC5C3A40BB24160D7F274ADC4DBB260EB87 +BCE6390588627BAD6B640100D58212467736FCA465A4EF71821C6D765F3FFE41 +A030BAED3FD7DE667BA4479D5316588484F6317B88B6E91018F3202E8625B837 +49A64AAA69B7B00FE37413D1E632B6404167A439F9F2140975891FECDAE0652A +1FD5FFF18973750883207300E4CFAB59DD7C7394F173D0DF78DA3516B44B4D03 +C6761A6CC49608F0CBDFBD46FBE6FC6E7BC9558F281A8FE32C5AF888F3241AA4 +BDA43506A22A091D67934D138642141EA39CF627A6A2A5520634A9DD05F09165 +C03C0A3CBEE624E4F59BBD2201BD2CE1981F46C53B6F2D91AD7839579FE7E7B9 +A29DF2BD08EB5A218066E77877915B6E1AE372100DA1BB9B8D0B229DE48ECC9A +5404AC224521D9F648DA7E1C1102CD514F4A4F8F8AF5E90BF78A9E2D90C93248 +D39A5560AA0BA4035EC7B45EF7015A9A97E6A0104194E6748C11C5DEE3FA7431 +267CB641D551529E89571B9D701D1FEAA4F1ED1BF17FB532EE6B6EEAEFBB6764 +4CC55E7C8CCC63C7E4B93C9D0BADDE09B1EC8F31477D636F4C2CCA1A817ED12D +7E2A904EA8888C20333019E235870FFC51A17504DC9AF8ED6B6A462B7D3AA186 +CE76A233003D7A5AE162B64BF90AD0B784E1581E5AC17CF6EA2746B4240D05B6 +FC2D4E068ED743E4CFF9ABFCF73D66F2671978C6E8B440B08F0C18514039EFEA +02A14A8839A203C3A921015B5DA8EB9688632EF87CF933F558E466FCA150DB2A +494F6697334380AEAADE71CF8C532CBCBF70172341A0AF65CAA5D39907AB6DB6 +061948AC7487B667FD546F155E09D50252E2B24C7EBE334527851C8D5164D66A +56C0502EFA0884BDE703668BB25449D1AC862C15D434087CC14AB94788C34ED0 +2390D067D9D13D4D6E7B551B1B3D494C77F4B9576213835A221ED022FA6E3D0A +F44A85CBFD09D8E6D68B43BAE4CC2325DD56CB01A93B84FA68336ED8B2CE9473 +4EA7715DF92EA71C434759638A29738C84C814E13D858D0E23645C8FEB660603 +93EB19647F84B481CC71018766552BA16BDA1A94943EA464E99A0230B67E92B9 +4BB6DA4AF80D8C812DFA55CBFF4AE00E2EC16BA3114FE8D39EF537B4A982D893 +7B25BF1366C271B509E1C16E9632A9A64A2BBE64474D9500E94C21D2C0CF9258 +FAE9F7BA3259EB2E279995C2C7802CCB2C3E946B011043A4D7D2067EE56B77B4 +213289CF677C8F7572C95F2A03A6B7EBC64D99BFCC0615963F33B07FDBA894EC +D1F17EDF503D5BF1E5646E2C7995FB3F15168A518AAA7FD3FD05B21EA5292E95 +BF48F0BF9F41820FEDF9F5DF7BA4C396E4C71DAAD3F209CE8EBBCF5F053504ED +407FAD8BE9CD2EC265524575069CD2820E516D133AFA55CF42B3332BF53DC45A +ECBFC8F42F9A34E5663A6694E48B4EE0C5FCECAA33E19A125FA8831BAB9952F3 +51020BF0C27F175DE97ACC64C74929701567E6CD99A0A9F4EEC88509E2B2E93E +16BE159A8AFA0121AFAD45675FDDE7F795CC8EF9D41202CD38B148090FFB520E +530C701D3CC82A19E587BBB5CCA1EEAE2687486E1AF28A20E1C4C959F14868F0 +B411134AD1EBBD9CCAE1B708772CEF727D92FD864712B96F6B295849968F484B +3DB20337EB5386325B127115487425A5D474766075BA04259A6CC75B34D43529 +F41E37D69BCB9A80F8F9B8C4EB2E65CBDF1EFB70844639F347DC5BE018657FBC +F34908D7D2A25766F1EB5209DF5CB00709321B02E05C48E0363F0E778E0864EE +E65A17394FD73435E9F4523FB580DE5333B4EC4E5CB09F53504CEC5289B18B94 +76B8166EB1AA30A0512A56B675C4E9EAEE695D82B2D770DF175CAE19AB19E0E6 +E195CBDAC59C6559CA9C3620632C0CE3A380B6545D58486080AA54FBC5C4A8FF +AE0D6BE9F96C8E489C0E06224FF96E35F16B94EEAD8368D470E5100A0A731B69 +DBD7735712DD3D882420941F5EBEEBFABC28C3086CB238DCB99C0DA005FA85BF +4E5BD9578C0CF27395D29A94FD27584FD96F0ED37169D85D8B85F5BCB5ED8E9F +329D4D1A337BF1EE62628A3D3B81C759AFF5F6DDA0D8742044AA18B93E32665D +80E3DE0D2332FFC076A76F5535592D2ED1AFD60805D10798E03E8E65C17DB19C +425904FF83587A0200B406D3BD3965844289270ABE86A5D7A9BAAD43CB1AA363 +ED87682CBF19B2ABCF8E4C9AA701017F06A4346DCF7A000E40A00BA37AE5601C +AFE7D8E529259D1F57D7B00FCF5F246C902E920AED62751D94FA41FB9EFD25DB +A86F9B85B634562E96B8EF8CA5F5B77FC1CD168EACE9B19CE7D56CD99CE70197 +D80A2508F3F31A5BA5A8AA8F7B833C2481BB9A6CD8826475814F0B74740CD443 +83C3F266BAE4BA683636FA0BFFC57D71F8D13F91F33D368810BFFF77D9710902 +BFD32D9DD2E94C1C06026B3BFBA5F8A71518CFA31220FD245868729B88390774 +EE063923474CE8D18C2D34AA77F9EA37A92F7530DA0F67A05B2C11C3D9942AF4 +386DE7FA1BC11F0028D5EFE8A3474A5ACA8C1744BBD24EEBAC3BF7EFC12DABD1 +C4DB771E7617D4F5C4B759E84F40426E8AEE3BE6E334A378A3C56319FE296114 +047945896F2B8F8F925F86CD4755CAEDB75017A9729187C1941AC6A9725DD547 +197F636F0025E63FDC74ADCFAF0ABCD64DA1F7512442EA2D2E88726BFBBCA2FC +AEF3D4B56DB882F20ADE74063FD0AEEBF62AFA179E5AFCAA443663B3E8594DA5 +F4C4454B08C461F85142AEAE2BD3FF04F9A89C9E2C9519A856C2C32558EE6A1E +63D565CB3746C9FB6C9BF7494099ED1BABAFAA9069BEE833D13F3ADA35B1605D +2368303ABA5179DE23EDD6E2610BA46BE4B3CFBED8D80A0B8FCB27F93287D3A2 +33B9C13577AAB8B77BE80C0466255A693FEA8F2D0FC2DC6951F6431DE0F8FEB6 +659C8E985D3E02378DAFC9DAFDEEF0012FCB5ECAF17AAB951E0C6D213724B6C4 +E5AC05B554F814499271F37A4A0924D4AFC9960045C7E4D7546FA355016D5C2A +74B78E6F4B92BD1A45D430EEF88DC034CB01905E0C26460D401F44772C260759 +8A716908FEBDF9EC4DDA187960DFD111B73587D5B8E84014560A14FE1B46C152 +DBB6B7EE966712F3E8F27DAA9C758355ABBE19F067F140B522DF95ECB66264CE +B2F6B7A1DC8B3CE934F8E8B005DAB5D9CE71ACBEBE51FAE0E689429B3C0048B4 +9DCD4C933F249085B0EC1281A3754456CF4224329151DD2CD391D35ACECCF6EE +B03741D088A36B09AC5100A068F58D71E71050DB62D8029AAE834DBEDDC3C012 +C70D090A3A4F1A77797E73B93779928B824A882974004C16981AEF1FCF6DC7AD +34E68B09E69063B253447D6F461D0FD38C91EDDB5496040787C62161643B0B8A +B40873BD924BD5C3EFDE93964392B2503F5229F91C5B6BEBF6B977FD1DCB5EFC +EE8AF1CAAFA81EA2DC1B77D565C69001DD20295D5C4576F6EF44CBFB13601118 +F55B5763EDDF93C0994720CC32BD01AB5D50CEEC5C3E762F8E60311D2487D143 +940802637DAAE0CC3B892E566BAD6DEAE8A9006D71233C4A1C9E96ACD5EB7056 +DBE34D18C2EEEDFD73C771301B9C2EBF0DDCF269E05464790E36A6C124634374 +CE6B8F5D046497C80FB2F4390AEC41026B593693A6FF9E7196192FAACB98CA5F +BF6F7A10F8C78C07030D3BCBF0DB0CAC4981CF3550077183EA1F6C6C093F3A3D +49215A00FD60254AAE82C26AC7E2B74405CEC4EFC19E5C84595E88817AFD9E5A +B3D21F906F757F037252337BB6552DE24B4ED3665E588CC9C3E916CA1E2DD333 +85DBF273ADB790E1087E8D4994CC038D4F5C203539D1F5B72FD4B2396E175102 +82E544BE1AAF2045777071CB4D0CB8B7999FC2DABC172CB5200D01EE76D90C85 +F5BD6801F07E825D94FE5689C2CBB18727B84C0793F168D0EF39EFA0CE317D63 +AAD99D61D9A953A60FCD905AAC01232ACAC04D0F164E59FB59445F4E9C9206C4 +22BCA0F75FB6EEBB3AC6DD055D4751D6F93424E030CEF9ABC9E9C4792AF2A3DA +1F1D98FE0971C2B6B828004A58FBB2B4808C8BE492F636B13660839C5B6F9B94 +6457A0DB83D0FC4F05A993F6F70FC1ED418F6279DD339790006EC4CA34B34011 +8F4F922033AD1A70D2A3CDE0BDD6A0C0F48ED3BB61727EA6FE093E393C8E1A7E +D4B58BAEDB50B5395BA7D95D8921A98FE44F6D2DA73259560D815C82E435325B +D633FB6161FC6F82B0EBDFEF76337EF416952A7AB4FA74090DB78F02DAE15CBF +A40AF9D8BC81C164C581302E70040581314E8FAD7E0EFCAD384D8A7D21A18C6B +ACEB44932A14F6E5D05CEEF88068FBB44D81F2149ED7C294C583B3A32AB289B1 +C660E734972BB390708A87829D527A1C9608A16F6FEC6BDE309CD440A0197C79 +7682FDDECAD867C49BA02A0CA7652FED17F411F5DBCC61A910C094DD249FBB90 +8D477DC7F10C7D03157D0C2822CD3F3F7353A7FF200F0C20C04A395D66111E6E +A6EF63B509624BBE57A17B0AF22E67F33E32FDC20D24906A5D1A698A675041ED +76EA377C33CE7530C501F1161DE10A006ABADD053F635408C51E91E089A83242 +B55AE77E0C10F6F11B53AFA57A14B7F23BE611EAF1C8C3981AD7261A7AE81F0E +D62976181C4512FDD4A397E375D37E2A127AA5B2856C82AB99D770623F36EF3E +DFA5B73D2F8C134DDA82FAD11F791B3CE3455AF3E4CADA2977F240740D1CEE12 +5E60A4A290A8185645D0F49D05E5A59909EEF7C87D87209468CA51C352845C08 +77B816FEA743C2BF5296DECEDB5569EB87CBBED1E2BDB382C35ED191D451CAAC +7F93A34A219E6752E5ECD3F2CE819CE9D46E5509AE8B5F18D85CE2AB87273C7E +E067165BF75291EF6E744D6F5C7D199AC1758F2FBE9556CF9ED6245A2A9EE591 +E78257E36BDFF553B6E7CE515732C152A436EE59E219FFFD4D0CF148A5919AA8 +9986C04CCBC5D91B180529575BCADB7E34F94E2E1528C7A6B602D4418FDF1265 +9CABAF85FDC831CFCBD1449C8CD48E98DEFAF3BF8DDEBA899CEAC532E30F6D36 +B891F0AC6D74393034D49BA5F96EDB94ED8E1F10EDF985EF757BDEB967959038 +C18C05EBD2F27D6E47F4FB9602679AFA54E5F2810D69DAACF96DB0F277B8CAD9 +6C0E19D9396F94B1025C4DBF871C99D579C9DDD4DEEBC28A01661013CAF907A3 +4FBD2F019EA42FC201957DE80C7240B799FE4B199ADDD3C8078BF40E5F052CEC +01B7D3993E2E61B89DA8E539A09508576574CE014B530D13EF43FC8FFF1EDF3D +BDD344511B2486FA2D4DBEA3D6E57796A6788F396939748A957E51F01BCBCFD2 +DF91CA7FE81A054BB15C1D3E3A1062ACEC7EA6E4089913BEE42E1491DDAB0BEB +1E77A608F72A5D43C10F6B022695448C76BDCA33076A02E5AD60C7C247D2C3DE +85C878805D882F452B782B3D21BFBE54CE2961759F8D71C17F0C952F8D38AD4E +6B6AD1F498A64FA52524E62F37ABAD12E6D5F7649DD796E031BBD951973DA19D +C6DF66F38F0B06783B4DC6DBC15CC689D80C3822D5C3DAE96FABF9C0DAC880A3 +6F38992EF13D0C3AC162C9AB38EF2B8A4F176D8AD645E982CACEEFD28947BC07 +BB233FD9ABC9F4AF612F691F4A52BA5BD67659B8DF5D68894CD3DAE4C724B238 +8314DE16D901F3B63D8D11FC1BED822294527CEC6F31DCA780031F485A906311 +9D81A365928EA38CAEBE7C450BBA19FDD76AE8CD81A1CC6E38312957776A2ED8 +CF258CCAFE221200A03F07627ACF8B979F361C0A160E1E5635D0E30BE18EAC55 +DEE7A21FD8F9B6A53333C8F94DC6C1A1F4DF0518116402255CD84CC302991A20 +789689C51E8FFF3D868C73E1FB042C30C1EF54FDA77E03F04B12781C572DC4C7 +8D60E506C6FFB6422AC0DA6CFB438D0B5687A1FB63C9A96267630CADA9338EAF +B0F4433F014A7D37840496D8F9AA0188F558D87CDCAEF0A7F89F7400AB143F3A +7268A871FBD6010CBCADB1ADEE40104D9BB6DABACC4A7F45F155A352F10C8057 +B025F9435A77DD3BCC4C131B3DFAB32706A46A9ABFAC3E5C30CAD28F3F9D1ADE +4060EBC1F26BB60CFFCB06AB4F752EBE4D00898E99ABC6A77BD31E0C74E34F2D +268555785724E80B9CCC165673D2F4306045720CA41C606E9C33611C8DC681DD +0E8AF0E4BF73D39374BD5D36E1E2A95929647FC82583BD962DD149258510DC76 +6F03DBCC2E142EC8344964C303AC4EDCF7C1821623A24A1DC88AC09B60E1970A +312EEA27B9850401C1FDFCAF3A9BABE622C52268ED778475173E1BA15CC5FD07 +C1CFE4084A5C1374FBB7ADED6B89AC09E9FD125FE728CBBE52BEA25B2B0E0E76 +A4BFC50EE334241924F6A9750731736139FCCC3BBFD99875E2091AA8F9F33109 +7640F7A0CDB5B1783FA24E5C5434D732318A5114BF0080649C1B5CB4A06122E8 +F592101C09864AC1FA6F9DC9DE816B1D6D7785A6422AD5A5CF997E2A5B683CF2 +BFD6B12AECCA317236D4DE5B8E11AB4E0C0A40ED4D7F2F29D9D5D6F97C79A6C4 +3B626C4B917E2E2144D7A9F043B8180E45B433838BF44F86ABF22E29E50C1551 +36D56E3D89ACEC791CB407A7959F66A0272FEF1FF4ED642EBD735CD954FE2C01 +F0DBA979E80EED581BB0E1E643FDB205C86E89C19A149F4F978460C716F38749 +0027EBC1437B8B37FD4F9D7BE0720437E61747D2F16742076773041403D85212 +294402ACDCD82923E24860E0F807FB0D32298F5FE9076E6F07BA9BB380F53F3B +39288A33519FEFCD75F540B597324FA43FE1A8DEE64A756587419F319B8C6F1B +A2F29F17750953CC9DB864DE2CF3B5164C093769F6FDCABAE1F6D9616D8EDA82 +DE6BA7F8D24B227FC4AC0169F80D0B2B1B7BCEE7ECCEE7475E7201164C8B45F5 +31FBD954BB31D060E6E32BDDD035DBDDB5ED89FA955911D8B747AEAEA01327AE +3C2D04BE4DE78B313C4414BDE5F06FC0AE5ECA638911F691A1FC86FD8BAC3956 +C1553875B45A80098F377AB2DDC3549514ED658A557BDB939AB6FB2479F98BF1 +8157AF4D86883A19E9512F87AEE0411C1B08BAF29549F663AD5476C50C96FB5A +356C85B2C52995EBAEAAB8096D21EB470713A567B58D680A37E4DDC3C1A52BED +E01ED7897410EF6334A75217FCA97ED5E299C5FCCAB0F92584FA37A1EF03C7B3 +A2E5A3A278F3ECD40695E55F6072058BE81ADA6E096276E250AC662BCD562763 +863C4E7A7B357FF231E5467E76394FC47B591BBAF322FF9A94B2C3F2975C08C4 +881CDC4D7035E2385615B35556035791A00758F33582153874B3E6B05BAB6D2D +659351CAB34569B8025C7C51F915E30AF7EF8D48F3D42411AC8261AC04216FE6 +B543790196A571B4D28EF60339BB05BDF3208B8F9D1BE9E50F9EBAD04DFCE8C3 +8A39ACD81C40EB4059A9FAAE9B422536D090A4E2F757D3BBD8AD6536F000AADA +EBDC6AF9115E067ABB4269791C40A0C8EA696E851867186DEECDE350E0121003 +60563C43AFAC8315BC7D87DC949D09CC36FB081715E959FC914E931D80D846EC +44C3178C212B132BA2E64043963AD0C20D56175D57D4FD4BCCD30D7944E613A7 +BB863764A6AF5EBCE17C1179D60EB17B9C4E61ED6DE2C7CCCDB6C4493C8CF326 +A53E07C83A01726A19EEFF88D46EAE48FD5FEA1024D229BBE7B48332DA245FCE +F2C1CF78F1D92218BC6967ED2DF365E6F47FBB2BC8E9AA0014155348BDF54A91 +471FD23B5F75C270BD3F654F3815C43C4860AB4B8984829B238C614D7CD7EB6E +6ABAEB392C23196AA2ACEC2331FCF813AC4D6B5A076E6D6F5C98454C78135384 +2DE08F8E66A983B76B526C42C243CF15852CBAB77BB11A7EB644590254C939F5 +CD4FA3151B7E12483C75DCEE22A88D9A1F1E0F53E2579116D3FD82F6A55BFB92 +17E173A2D9A3FA4CD85ECBF1C088D45473630EDDFC84E94C36041E06D68D0184 +DCC03474698ED646CF7C636B2181CF5BD89C8E939AFD0B11A233A1CF2A7320F0 +D8937D68D03579E5C8CACDE90D37123944D7247E4C4440E4D29A1872928D87D7 +6A10AE04ED4053FD0A11DD5F588C4147E3809D071305A3CA695E181948CDA1F5 +A30F95AAD47D95138683452EA8A9867EA220E9597CA78B2F8CA09ECB43E9AF65 +2590E87F1A24AC721A9CA3AA88F0FE23A2263E279DAD980D7E752BFBDD172BBD +162741DF269EBBCABBF7575BB7C9E7B42777DF8F464D85245A5EAFE6E3D10C27 +0FF95542793833E95C8089F4025A8BA1E5E884541F0B33065F93BF1D30FEF287 +D7C73908A027CE521B7D6ED4DC2E77619854E10451D4ECADE3BC7AECB72AE698 +4E4CA0ACEA0836F87CA309901C67ABBC6115110F2B8C7433C4A248052317B283 +DDC1238D40E3D00E4D236112319F872BA3288AAC2BFE2B4C723C0C3239B7F95E +626EDBD4EC068FFDABC261E02A8A0D216D5686B005E243C95360865605316BCC +1A2EE56693C7B54DF2E68E6288C0DEE652E76F3D16791EFE6B7FCD744384311D +31527E20E4E736996C67331CF78A08ECAB6B5A720FA6B8C8FD80314C4793502C +9EDA72FFE0F66F303E84495B00DFD9F8F1748311571A52A1D965EED5B0DD1CB6 +003B902E1FACD61472980C40DAAD23C7D35D0CB00BB80025467A421E36E3FB35 +DA936476C87ED2BDA7F9681BF7050BD883DE8D9798D3F680CF983941FDFA3129 +18D0054964095C068B7A2E520ABC3B88F079A90AEFF5441256CC06D169A6AD8D +84D8D55E99DF4D756771B9EED972ED8A5B858B429216ECF433D4C9901B0AA14B +A55DDF1592764567D919988F21BCAC5F6E2823C374BD6150410F5AE77C3CED4D +5AE61BF4BABC795EAA2816FF42966CB2FFB2BD2CEEC59930FBEC3731C5BDA5AD +32B4A19586248AD9D3422D987321135DD57FB8939EE3D3AA7309FAA01F2474B3 +52722950F1216BE421C280C1CE4F5B6F2931E0D723E8908FE53A955EF5D6A6E9 +4188AE3DB1FC8E98E1946B882F27A4D6D46442DF31221659824FD9A68340452E +2AE390724AF5B78868FD734D7812FAE570EC1254C509153DA4A58AF3B6918F0D +CD439CE41A00234EBDC94B9438C2D541657DC3F840F485B2687BBECAF841C0B6 +C8418D6B0A342FF41CE90BAD8F8BADA85BB5EA094DFCA987AE5269C651A1C4FB +853F5514439C159CF16CAA9FE135AD70E5CB37D76EAFFA880E8B0B860DCF2DC5 +AE4A04FF5C9F3A4188E992DD1C25BC8ED3011D4E2E1A185147DD98127B37330E +DD0091373135082BE8B0AEF51C75BFEF9261D6FEF8B61179CE5DC17D12F1D202 +437E5B60EE9B2189464BA21E4A1F44D82A97242B74B6BDDC0144B44736C20B14 +238F49E81C75FF6585ED339D47FA62D94B6AD30E803BA4BEE3E75B255B2C0FCA +CB72A26D596C70A43C5DC401761FA38BAF249F2B9862A26045C122E4D27C08B9 +1E476E46428080D75CDA97A6FD21CC573F9B20FCDF26D6EF973000928FB4EF6A +2899B87F867C5E588BEEE781E24B670351192E4C479A66DAD5176AA8287CD1B2 +C5E81EF0C515AFCCDDB657FE0B2132C0910954045BA122A58025E616C1B90BEE +3C46C5D48DDD251B4E545271E4BC8133BAE3F601038D5C794EF7710CF561B19F +64426B0789FE6F8A3ACDACF5628E10A1114B447C03E201958404F76ED151258A +1A2FF8B5702C702C01F89DC17F7BF02BBBA8F78DFF03078C892285CA880A0EC4 +D27AA9331C674E04D085508D69B448D1B54298133A680CD67BCB80C334BDDB56 +1904CD441027BEF374ADA8D824F54473B7A090BA6318728E077A84989A4A4C91 +E8E648B51A68A39E16E4A2C5FA61AFD63556158F9DE92107B5ED054E240048A9 +FED04273519548C6773755222059259601C960A8D06AD11AE943D678BBE344B4 +C05CE0EACF18130D7470BEC987BEEF661DB3B5360B822D898EF70E5320E2D8FC +7D1E8B8C4496F2166F30D5D8C607F52FD5F12349593788B09CD9A0F3ECD80683 +956EB208E3B8E1FF7530EF6FFC96701E7FEA61D8765C7D3F1212416166DDBEDD +78DA095B29636A9AE2F854BDEBACBEC7AE41CBDFA15DB3704C46122EDA7F4170 +C26A5F3F26ED74E21A50679B40CC077E2EFBC78F3ECE60727283EEAE9F0C7396 +F318863C392AAAB0A24473B0801AC7ED69DDE14DB1462E4F988CD6143E9BA70F +C2BA50189A83AB577373E2DED9DFAAEBB2494C738B006C40FD81209C09C5D25F +65B94F71E4B12630C2651431F32C7B3D9681FE19089221A15ABD6701A2B9D345 +11915E70E6C18E0AA0C1587F4DFCB904A75CA357C34155CA5C712CF5BAEFC795 +0F95D60D91714ACF79756DF293D5E0557BD076DB63954B714D498E8244195173 +0F59833143EC98BAA06579E7E3015EEC4E40BD440211563971328DDCDC3537A2 +EF85F45EBC83E00B7EAA3272C16341E58E82BB3560E9318B512A5CE362FA098E +30FE2696E03B63B47B9D06A1FE63E336DC7B7FBA04422CE1EE9BCE3EF55FBB09 +4476FAF98151B50828F2E894D83F0A28EB417622AD150C5800671E32326CFBF9 +C7718D18D9E787C0670CFA112671D93A6B1F7BC1DF303A6E40C0A2F409917E91 +4212953AA6E5C67F3C4EB25E1B71A096414CE4C3455EE9A596A52473964E02FF +280A5037244294582F7700C06C5CB5E36CB4C4197DCAE062ABF1FB454E9FB4B7 +8205B1E7EAA27F177FBA6D621B8B75DC81594DA014B3864F4B1DC3E1C3FC1FF7 +F1528F63975D949E5A64479F408B24DD7A46DE3946A51EDFC4AAB046CD2E17C2 +130502B2636A631844D6E659BDF0CF6B180035F01F710F91F1573FEEBF8BB630 +506EFCA96CC5DD19AAE89054E3F29F964E7C6CC48CA3D98590C3C637B4F98FEE +BD75D9141D40DBDDFE318BD5D6BF6EC9A95305A959C34ADF2D9DDAC6FC6A515E +0B23416C1A7FEBFF8BADA0F36FB7E61342A8658E15CC052A94494F60844BB93E +6173C2CD93CEAAD8CAA61F53E70554AAA173868FBDBB7EF226F862C9EC437A48 +853C4F4D9C95F1A5FC1F6B25CED0DC33F616A04AE68BB9C0E869DE7B5A70F781 +E2991EFCE385076FF7ED839E55958D9A687E50ED4D4868B3BF5D92BE8F225F8B +E0DB1AAA3ACB072A1040A66BC457187648E7B668577DAFF15B3C2A71A5FC8786 +5DD8F0B26C0B51B3861B394E31C831107E9DAF2A5B4E54DE859E9D75FCAA59BC +F9DE63491362749EE6048766F2D4E1CA725A1194DD4E53BD0D42E0358930C81A +AD02BCDFACB892D098A345D9FFA8EF971AF3FB0F41FDFA41D9BD847A6303E83B +14B340D14E711CDAE7D42FC7A66A7FFB6DCE8554F607429010E81AFB8A970F34 +D5E1BB28DF0D6B23EDA7370BDE6A30B91E9F87E47663F89D83DB820895552B4F +2B9552C8069D460ABC93DFC88A6BA2495308089BD374207A3DC3A620099FFF24 +9B6A819B6C9063C17C4B37E875A144415E8457E422D1DEDEC11527132A8039BE +C5331ED90CB75732186BC48E8A393DC0AB95A14E84909B8FFF82AC15026D9AE1 +F4D644425E1A4919996E28567CC083AB66E7A1BD2775601C475D4791082AF0D6 +BFF7C28332439B20C50D9227459FFFF3F8A4739175E0D069B6EDB24E45A86D16 +13FBA0DA2C89AB468C17D2AFCE9BB04C4784C1BF76E61F7E934DA7CF4AF3BA24 +8E5CA0D0E393A59AA84FFD072123220D0523D68B3D177AA7B9055B9D08F2DE06 +5B466DA58A134276FD0EADDEBD6D594D62DF588EA65A2330413F7B143C3488E3 +73FF170DFDFB4878E0E8AB55CDEFD1A70873C56B28742A10FB55EB6ADED70A30 +12396A6BB42062A4713E72C4742B2A879A9ED91BEDBFE68DC1A934B2A1DEDC15 +1175DE769C11DE05E6E97F7678988274CE2AE0C2793393D6ECB1E6D64B72EAC4 +F8B487A1CEA2C817BE6E7E5F6979B5CCC836BC0A9D74D67C5E18F35CA43F1903 +F0A5B7C1C9F2FE48269FB582B57DD89768AB8C7B55E96CAC3CC3D090607152DD +89AF7A767AD4CD3266BA6FC0037A5CF9B08DD8747FE3D33F8D99C89123BFFC63 +A514AF6B08F6192F3EC45F62C2FA5D4F3B80E99EABA309BD21DDFB3C46ED8874 +F227278F654ABF4F935473898A36F306DFEFE8876AA51FAA93D43267FFFC9499 +1E1C9385FED5901799078E2FB3563655FABE1933F1BB5B4A876BE25A924777DC +D1D9C96C8D4C7CF260F5375AAB5262DC78E6DDD6CEF9337A3E7985C0C1875C6F +C06F4BE4E96C8ED6D805D235A1177778FFC894400464219584CFFAE7AEA5A184 +BA6ACBCF04C43320D2C7176D3666E28FEDADC2E73B9782597E947127DFFA9ABF +F8C8A42CC74290E30897D999818BEE47E68A4F672A4AA1225879138375EA0804 +C02DF75B8CAAF2971FE31F69155E56746074519505DB3879BCC50F9216CED99C +9430B4983C1039466E8D5A721BEDAF43368611F3E90C3BDB8B954A3F5A825EAF +D393D5E3DFDD0CB757B014B3FA1EA45892775DD3CA8D176697FD9478CD55A436 +8E62A63F84DD5A26271B502E96A74BB52468FF918A5F54249FA552DF3BC1172A +EAF29CAF5FA5E58CE9242BC04A70CB0527F554BB8F3E9D8A189E6D8BFDAF0383 +20B7390C5263D6AC6781A500A9D97DC8BDA3E156F63D3DD8D1344C121EE6FB16 +FB54B5CA0B7F74B32A32D55415AB5FEFC2E43FB4EE8B3D019C3FE29CE0BB3294 +96C9B4AEB0F8B1478AB7C9E4D784C25187A958A6EC1EE1359C3F7D3CE4577904 +CE2B8B18448ED83EABEA54CC0B5B092F234BA2A2908A15BA4A60851C5B1A336D +7387499E62F1AAB27AA9B071B849F35B99E26547B07A943D5F0020D37AF09624 +9552A0BAA86C49FE065A5E7056E100E84555604C9796002BEA168CD516C0A8FA +46A7329C7ABF1BE99191ABA619329AABECD308088D74C8C47F2E0772C1DFA1B2 +391B53A260A1E28BA2BBAE063BB88B2E7F90E6BC03482B23F3DBFE9D1B3A0097 +7CE9FFBFE770740A19A732CE7BF3314A8745D71E9F46002E1D38947D4BDC3A55 +A59D0149B0EF50411166E00111AA63F4A595F24B52DE94BC85F0535192095A0A +A244B0A292D30EBCE2629765155713E19521FC7FC3E10090BFD1385AFE183BC2 +E635EBABEB69C737C1562670D9F815F28B5FF2ADCA13BBCE2E8B719EB85D52A4 +FE27A62B7D8032BCB6E0C43E184C8B864793C272EEC5752A2533404AE5B4A2F3 +A4178CE4C2404C71BADB724657A956B6AA8C7DDCC3411BE0E49362570A2D39E8 +53AB4CEB466C10CAF6C38B3F3C4084F4C9F9197A8625751037EA5C2920B002CD +413F5F9CDA6FE303AFF476E88A14B90538CE1BCAC35BDCC953EADA6C5C36825B +853797CA70C519BF8A3D1A538FE6E16CC84D2AD7B1F6E5E725EB772326C04E48 +5E687A44390A99A50EBFD4A3D81B7442AB1C8D5B311B051C3B973AA2F2A7A28D +8BB32E72117770CA92293C9551E7A210655243F3813206C84C8569EDD9002047 +84AF2A18917F46115EC82BB96FC868A3E7058D7EB655FFFD15899C00346B970B +0BE63FFDA54A50A5A6B0054F2B9D1C9FB94C6878B04DB10A7478E56816725F76 +CB08B9DE852E377DDF83EB4F822026060D5C517F0E62A6EEB9CF13EC90002B9F +C2212C697D91FA63D619E863981E9F27BF5C092004D54E367A8BD3BF15DB2DC5 +927DB805F25E05C0394B7A6A1F6DA3EF3A480A6BFB6CC63A856776C630746D08 +2BA98EDF1C1FD7F7FD05E38D23BBD6F4493AB0C6D69749737620F4EBB458C2B6 +D8DD2E634532AC2F7BA37CB284767DAFF3330B7E69971AC6A3C77D5C515CBF0B +A228FAF9AA6A095011124379C61FAC642AB282E4F190C9E08F0ADB8DEBD3EB71 +3B12241BB3D2684F59DF02CA0F711B83A888080849ACDEF5682EBFBC62A4501A +EB2A59D9EE46F33362C13C15811B46AF95E460E93B3F50BBA029E233BF1809D8 +B845BBFC6AEA5AE7C83755281FD47F0C3B152FD8AE4B27DF7372860C9A09BF4E +6925ED9D6B1AC0533DD715B68C1B27D8B4DDCE201C111E681859B1BDE65CE007 +B3734F7B14FE748B840F53453252149F463F12DA0C87FD03E900DCB2567B453B +BEC6A42CD0C3BE0AC8999DC889576351750B944B49515AD9B3394EAC6B066996 +1FECA134E160D99B36D3ED88FEFA777ED7D0BA66259CC99C60495B6B8A5F19C2 +C957848A8E2C05698748E50A77B32C223C96C7A28AFC92EBEABEAB453AFFAC63 +DDEB754ABFA689697597A4C4FB90286A715CB31C2E59E37E23FB873E2488F413 +38EB42D55521239BCBEB233068CF020DAF179896E55B5609473211E7E9DE50E1 +65F684134614C82F5F7C163D43460A3B19A88FC1A14282E9DD649573B02EDE52 +23B3073A3FFCDE1395C8302146FE37C3B9971C428ED2B48AF8E120D1CBF06F6A +F4143BD5F8E0CFDB333050E13BB931C9F579FB333B177473717627FAAA0D5892 +CA4A59F46CBD2CEFD5A0C7A823139D3C60A2687B1E0EFF201F6114C047D23F17 +DDF63EC251069EB083C9417F07D0C344DDDC8DF928DEB6DEC372102FEC938184 +DAA203C172BC62111AD329BB1BB1A0F44CDDEE22B1A998939333B1A841AB4608 +51DE28FB8FEA0015CC89BD43F3E37C2CB48F1C0BBF3C5B638E6EB2162A10D6CA +1DDA501B6DA15A33D2D141A32F08D43AE66E23AA41BCE9111707B72E3D39DC83 +6BA1B18178F3942E269C12214DD8557EA6499DE01F74BDAEF75E658FA7D38A0D +168DBCBFCBE04FECCDE6147DCF5D8A577B7AC4E812260B86EF88F13C1B2F9D38 +331667BC7598F4B138CA6F295F565302BF393D67220B57881015F28169E12BD2 +43B4752ED6904574F6C80E5E1679748C4697358904D960DBEE2BFA35CBCD8594 +34346B184F1030D6500C5FD4773525A91D4AC22783B61434D417C9F57B848CEF +E90B0B243AC9B9FB37245F4178E6E305FE7A45859DA1EB02C024BA4784F39E08 +C4FE1473828248409CBDF74E42AC80B446B5455E74B75F5FEAFA8055A3F1E01D +FB21C1D9E8BD1BA09C3519AD87B54F27BD9DCDD18E9F7B2BE7B1F7DA396117B2 +821383AD37D76ACC89AB90D24B43AF386308508F14E36702D86A07AB2F0B7E63 +AA0C1A7FCEAF0199FC99CA393FD44CA8AAF7B9A1E820720EC4658EC8C6D68C5F +101FD9B8C0A45AE5C2B4B8682DAAEBEB686674F828AED86A8580E9D4982105A2 +3E91D62A2E9FAFFA2B3AFBCDEC4DEC3491526066E2A75745775567CB84F83127 +76E426BDD8C1EF9B64CB5F3EB256007935A75E63D5A90F5946D9266E07CB4354 +F6D2A89E2D1C332F3B1D9DE24195547DA0A5A674A50D9ECB92BE482630D37061 +A094DF9C31054884D4F2F89651FB8E1BCE6125AD240C7AA38DAAB1EA0C57A681 +E1352460873893488DA2FAF208E4D511FB2E2E44C8E9D7713A805F9AEDD79074 +632756250E9BB42FDF32C989F81373B75758C5A00167C49B5D881ED5B2DAA746 +EAA8DBEBB0AA0883DC30D79D0B99ACA9C47CD0CFC039EAA053EF194F5699397C +0F69920D974EAED369D532F3BF706D35FA463FCCB5C59BD3867A70CB295ECD3A +DED42339E6918F0226FEF5810EE2CE5FE9994CE4957FA626F5A10732AAB59651 +3776FEBE368E3F24BC27DFC528098ECA5DFD3367CECC60F5DBC2993B1740FB4D +A0E7FA89553161167B1617F698DB3DBB6672EF5FB052332FAD4FA5822C96D0EC +03111DFF00E76129690FC5A7C6A5DBF6E1BEA4371BADE2304923EA3C6113DE18 +7353D433DA5A81959828550A30D5894AB3FD05811D2BD0345DDA38DEF30DEE17 +F63DADEEE286E488472BE0E167DB4475E3C3C248E425D6E32B18397247530C48 +FA60846D3E477C0433ADAD9AA0B0A9AB1C258537415E05CF354C6217993F5AF0 +F89996ABE0EE4D948A42EC554FCE412EDCA1C88C4A171AB881DB725483A62B2D +D042621DC2948648D07D8C9AA493CDF26257E0E38CD820417E61F0C955E648E4 +7B884CB722E677D5DD4100EA6F948A10346B904510ABBB6EC7C5D3E194308A2D +E44821460563B65270700BA3ACB5D712CFC2DA9FE3094487502518C1634ACFD4 +700DC4BFCA3155484BA579C2D2F20C147B60F4C7F55C80A8378A241E83D67E2A +037C59D5E7EECC35BE2BAC0121C44B40AF04881A35F6AB7AB17259B027C56182 +61927A1C8F6CDBF4075F725286C4F1BC8401CF8596511352F310A14C790915DC +E503D88685CF1BB91AC27245F9E5D91EC23A8729BA05ABE5D9EE7AC81BD289FE +72A6BF35B6C2AC895F17EBD812D550227C06991271CFC565E149E6487D1499BB +6F4C93FD408FC31C2065CA1D85A2EEC8858B4ABE7836BF784C0040C1BF3E8175 +75FD8812D699F9BA551C6FAE3226DFB5B2F372312F0081B9531DF453A54E3ACD +2FB15B2CF43F2D83E004B2BA9229FD048B63C6A4311E3DF32CF57572DA953BBF +A38593F4B293A0C315888DCBE6F93DAD0980BF5B0F2CE3878A65AF744AEBE350 +22FBED4A11039F57CB7A927382A9C6F625B5C4B96C17D9741A76B422DF68FDFA +13C670B6A53BBAC82EC45BF1157DF3DAF8B766DB30528877BB8DC77D82E16C16 +3DE6523F9E660D2C5A8A9D5ACFB135968C729B68BF04879820B8D69308458421 +6199052857E16C51E8C1FE965C93CCB85A876F1CED2B4D6428EB830E3E63BAE4 +ABF42C9D77855A0A9ACD246033302AB74CB82359BE91FC947F69CC8738209580 +ADE0948982C8D30AEE3034546E087EE180D56AF4FAEF124D5934FF3F2BA88B40 +AF3819D1D9D2EAE8574049BE8F8776A3F7AF6BCD4F999506B072589062154CD6 +AA7CB677A73F201668C5B355BA59499A0F93BB904231FF29486E60473E87E00B +094B51A4790694507237253F121BE0897A1EDB09E37F08C399597A47FD47C0ED +7A4235821F72F021BAF9EDDEF1E15D285802AB6EBF721DDF8E6A85264A5CCF87 +1B5DE9EB24AA3B0A50E0FE2B195CEC0D9F2B9D12D9B68B5E4E5A8732E74D30B7 +3FC9FB783569829545B6984F5B06DC5E2CDB95F409C328A608276D79B7BE5735 +AD90FF4325DE84DE077D4BD77AFF7345B8FC52A8E1BFCE9CB5DB7186717333FC +6BE58A7CE61E4D13266320102AA06589BF00D01E884D9FF87CABDF4E12F62127 +DAA725186B7796A1AE7CB37BB6B164932404F3017E132202B42599798C1FFF82 +236711D98287A426C44F9DBDA9FCCC662690649A6F4D6DD932AAB5759EF6E481 +FF6F40A980DAADC5850E948B8EC0A60101CCC339F93EB829704A843C79686F6F +F23AFC0D04AB902B602B7E1C4A927D6C752B2BAFBEB8D80273CA0395EB9D4312 +A052AFDB82613CB29D8B9A5DCF2BEBE5606F6E32A577DAD1FB9A9903B92C0B84 +13C05ACFE23AEC511CE6FAAC235CCB47B598C11183AD8713091D65D3F9FE4918 +CB4CC13F25A2A6991C9D930DEC24730637487EDBE1634DAF1DF9B9024F38DF1B +2B44FEFBCB4A64756FEF1E2791BAEAC248DB8946DB44A5674171789701FC2393 +E4C2192981845C5E95834E60EB49BA90C3869A8497E99B3E676075C4EDBBA164 +DC9E9B3414443FADEB59F32E39C46439766E1E3ECFC5C197E031E645CCA4F970 +38266A4F21B6B98A581B838DF1077D8C3858FBDEB2A3A16D8F5847BFEAC138DD +D73ECA92B7F1F5A0177A4C2E899ADB7F2218979D6BA217D8E117DFB2BC7E7658 +A81BDBB92AE722C326065EDDB99E2378FE2EB426CE3402F254BAF1C3115E4ED3 +18A05A9F129B61818A54D0EB53536359FEDEA8D409F36E08CFD272EE7E376F13 +16AEBF9AF354D20FCABE9819643878797FDC9B784FE700F35C60BC70CE72F3B7 +D3E1ADCD69123BEA6C6E17174847F62A5867CD674F60D8EBAA41A019429DF304 +57BA5BF34142F11E328DCD3BCE5253074988DB4AA42FEF1C3B5430E44F08E0A0 +DBBBDF4776E2CF9DD65A42188ED02C62520B62A22D0DF2B6C0D819D5ABFD72B5 +C716BA390B682875CF80AD1CDECDE4E9E57204445D71D55EE6DA675FF56B06D5 +8650EAC74044170B3C822D049E295138E0F327C93A829E70BF3F0B5325D8B65D +12B3108C53E594D93339C1CCD5028EAE72C2B755CF3F069BEE7E9A803AA5940A +5D277F7AEEF43E1A175AFE4D95F5DD641724B3BBA43C131145E3AB2A8E324E0B +39CCCF9E30929F711436A1B315BA636F38FFE73D25848A97099450F1DAB3CA99 +783B23590EDEC75A7BFDFA4C1D70D6C48C57BBD08D6E174270C09933473A4682 +8A4F59B3F501D92C730B7C883826F8E24E201475C4F17566E8CF364219BECE93 +268E339B4408ECBC5B415703FF37EB4896007FB7C21F79DDA664E32A0204AADD +DD50769D15DCF9D35A749C7D8672B8B06E2C699D6A378F43675E92E13EE42F5B +AE783261BDB17CE63BB928977EEAD46770570DE46B302487322B089D5AC4FE65 +E826CF4ACB665CF3847596ABC4D1F36958C0C00FB3D4C6B0F130760238DD2649 +0C5A735B0B4DF8E609698700A080A9330CC8BCED0AF170D4E791C64EA44DE301 +9ED5D59F24CA9987034EBFD3FC3F829232D690DEB685BD5C91B4C6A3D1C5DE80 +DB6CD484B4114EDBCCD69CFD20461F6C12CF347E45D9579C9AE4375C1F00877E +D3A2F2B6051D09AB480156C6A9E86A559469AB63C218F51BA72397E7C8BF37AC +A413B505A11123BA8107A2B40E883572A5A41F2FD07D7E8A17656677A6FAEFE2 +A790C3D413670B569716A1248BB0C507C853225308B6AD39DC014EB034CCC13B +315D7544F5B8FEEF1DC4028E89AEBF12137F9FA617BDAA2298D326A4673C4132 +719F7FFA1C065D5EED1AF32FE1399E48E370038504DCE43CD8F45977032322DA +5B7297726BD995D24BDC2E3B0848E688C157877AE0EA411B0EE5284AC6D223ED +82E6AF4E94FF0D5D41BADE24E636384C8F8261B8E9917154067200EAAA09C6E8 +CD4D9103FD27BD24794A012A15B9C5F0EBCC16ABB05E2EF63DC3A126EBEE67B0 +460F384EE0E07514DD75A6B7B17DC6DDA8A2BE32A9D4864EEFE67EF383EB5FCC +8D756A08DA6601C4C4F6D85252A199B29D61690CE7EE89BCD84ADC9B4F067361 +1B837DB712E904CA57A1A3C9A0F18FC457769137434CFA34F64A976D49FB46C2 +A533EF92E525D2C880B17A935D4C34EE30F41D3D78D1BF013421462B2CC74DDA +F16A48920E6D22A59A6B71E65A8E86999635E9C24145EE1C4BCC54B5D0B529CB +084E14058F56337822EC46C77D4A7875E60E1862598C8EA5068206134E978A84 +7891E62D0545B381CF984A445426D0CF7953C32F36C32BEAAC1D9DA343D5716E +308270DBC4F48DA9E32727482434F81452291D8353F974F5F370A5672B2CAEF7 +DAAEE9BC8ACF114D13A44877B44F87D9107FDBAE64AE9241353203C72E41A472 +53347A67B4D7D4D65B384058792AF2C2ABC08B856628F8E732D208E548C4C4BA +2074697982852DEADF2EDB80DA4A396BFE1F1CE044CBF92ED2482799AF9D81B4 +9050957E97437DB07ADDE068E6815DE3684D6BDCEBDB112B450BD160A63A2B8C +4843D232468361F9B15C829B0628E3DB765FFC1EF181991A7A96E0432E09CC96 +6CFC5CA74BC71089 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l049013t.pfa b/ogclient/lib/fonts/l049013t.pfa new file mode 100644 index 0000000..947a31c --- /dev/null +++ b/ogclient/lib/fonts/l049013t.pfa @@ -0,0 +1,1598 @@ +%!PS-AdobeFont-1.0: LuxiSerif 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Regular) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -30 def +/UnderlineThickness 60 def +end readonly def +/FontName /LuxiSerif def +/PaintType 0 def +/WMode 0 def +/FontBBox {-203 -211 984 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078991 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E73F44EADD0D9361D465 +3748937F491E18670189FD0D6858CBDFA6C4D794959EF9FD6996B4BFE7447FA1 +0B99FBD717D8407349457E126F430570E461A06CD1D4022BFD31D3140B4F9D44 +873A31C28EA941EC9D76CEDC1A71BF7589E11A6026F35F47E4216D7168D7E0FF +7C75BD48730F67FC517E7539B16B14D61185D9EF8D13F9398E4F3881BDECB05B +CB62672DC2C80ED0A24278927395F6C5D99D9FB3F3A1DAA087C609DDA0583474 +E0C5C9EBB773EA16786FD1FF2BE887147ECAA6B69B261A6A61E8E0DB8AFE70D2 +4069C33DA1AD0763306A2860A870AACF636654291C3BC44893FD9358616A1D47 +B3C79598FD22290D57AF04F3C192DC67611A2C2EEF144F80E0BA04888A5BAE0A +AFF6C484103BE288EF75F74A81B453A4D3B3BA25B37C547091D840C1356E48F1 +80E2FCC0C091515CFFFC446F99945BA70A6F868F4EB9F4ACE8AB07B64CF9B7E1 +4A8D5C16097D4ABD16D3573FDA57A646D3DB6414E5F3EABFFE30F22996D0E4BA +07685D5EFC2E97D9BA4DF8A1262EC2AB3C74A57AFE467C7E8130036360EF8D62 +4A2B6D8C290AA2365EA095EEA4EAA7042F747358A9F6151AA6F82F17F9A48ABE +646A9A3F1DF12E7729658ADF3111E52D08E50998672E884C2AE82B893364675B +9D3CF06B6DADFB13C53452730FD0A61A05A44B1FF1C3B0CA05756677C3D262EC +6A9344B80929A6D456F8708C03D4E0B4AA29320F7E3E9FE420397D103641CACA +87E1F114F525B6AE34F61327595648DF8FFB4FB09DC41C0641CB8EB349595ACE +3A65D4E04735BA31E1D613CDD02337D460780E22CF8B8D7BF1BFA8896C343E85 +5791AF4BB99293E9B4E239A2A1C680099BDDEDC3D68BF9F2986D3E0E51834478 +D808353967F7D861A900DF206C52BE7267F70928102B914F39E001632154BDE8 +6626FA0F69D81F13BA8F561680D2C0645BD17BF5828EB43B6C1C443E8E3CF346 +50C103FA53A029A665987560D17F6959D9FDD46005A1EC53E443D89C7DD4A618 +3A114F733C87251276B35BB3A03FE864E0FFC9AB3C8A1686FC5605F5EF9DDB2E +B9F6D75B1E1BA5710BAF346CA720318F32CFCD405C006E4DDB6FFDC97067C0CA +394C5EEEEF2D27AB9810AD25A421FA7A4095D692F802C83CA5F8B2D6AB83AB6B +45469FB7C8613F9E7DD094F9360435D624C67E7306D19FF80424B75968A3D68E +39215E86F1ED20ACC5FBA87E107785B48411A9F5A8250D0E561FCB1DA12B590B +9F0FAAD50D548FD78020FC3C5EC3B7ECD9CA58E88C81FCB7B2A3C3D114E7F327 +220D436632DA6EFDF722D4C99AB2880E3CA577DAD1FB9A9903C5FCEE69C65D36 +DD56EEF77CEABC3BF495DF819FA518194C03BD88E1DAC75E51F23765797A999F +4405E08AC251FBC7F8C462EDA4768D668C93BCA47E035EF0BD905766ADB2EF24 +EA82B9C97A41552F70B0A1EA5172028A917EABC78B1E8293BCCCC03EA281DA0F +9346FD6688D58DE2B14AEF2954A70B3755CA545F4E0C460AA89E4A9C3D3475E3 +26F5133DC36517157853FA680642587B62E71EBB8422B6C9E1335ADB17040561 +50D94FA4FBDDB86C9FD3812B90EC8A44596F9C683A5119DBC735777DD9D33AA6 +2A33CF98754D16B34D439FD8995E625C8250129701501346727F51096C407615 +F7B96061C2E733045C1C3A427F9B1AD26ECDA119C7B38E682C5BFA7B871AC397 +BC063B129FE54E9CF58C6F329390F8F14172ED0EC22A11B49787751A5E47340C +37814F52C05DED2F8F17A4F53250634B4B54D675F2776A867C1AD96BEDA842C9 +B8077DB381AE4AC283554FEE875B64A37FC3005810B42BD9C1C1422B7B104DE7 +D912C5BF74B5D0B4671983F41ADCFB287E40AF8BF69686E407E2E97D4CC14B6B +172972FA86ED76F43ABD480EDCD3437005670A2E785942CCD45023D1B3B70E9E +C8AD2ECA580EEE06993FC79C3B44CA5841ADBC4378DD68B5A21E570C88EF4016 +CD5A7463F1829F1F761D719F770AED1CA8EAA1FA7D166C86EC3C858D8E76606A +EA4AA03F3D3EA07CFF90CBFAA0E60B26FF57AA395AB4225CC19217920E0CE8E4 +119FDE73501174065D1C0DEF1AE3D6A9F0C9E2558030E8199E99662E767D37B3 +3761220EFC66C81205F64B6ED8EB09865046A89FDAA0275D248179208557E218 +40EF4FFD2B18CD1B46E7DF16B675C3C3093141BCF45BA70F31EDB235DE3DCB24 +2C93BD4C3B6414DC7C57383F35D1033E400DD0FBF57ED73514E1E186F08F8E7B +6F836CC6702047AAE17175CAEB08E20D06ABB02FF72BB9839F34F27CEE5BA199 +D9DA8AD3C6262E0B467F9A85E1D84AFC792C55E00156DF5A50460D259353F33D +505FE3ED16817DB13AE355DE90589F85AB977D09547996E06A8F123F655D4BA5 +E188E9E86CC31AE6B817DE4D90D7055BE09601F7CF4306BA04295148D4D42EB2 +E03F73C682CEEDA8C2862FB309BE14C96C256084D6DA1A0254EF1769877EC2E7 +90D0E6A37EBE7680FC0C6325F6772D2516FBD2F71EA193B0D96BD9303B746FFC +0D9456B7B66E849477F4ABB1565BF0F95D6941C6B8500F9AFB561F08F71CA6EA +0FAF63400979CF3F29EDEDA7041C380A0D3A086CDE2A1212FD6017E8E5A280D5 +73BF391BFCAE1F0CD3E895ABB45C025940C489F30D38B43E5506D57043EB6C90 +9798823F6AD59BF33E75467BDD309210803F24EB57E2BA92BB25200527C66A7A +1D20D092637AEA5FE90C8BAA0A75172470D5C872206450164E702861D50FF618 +748CE14BACFCE06A869720517549082B5FF664D27CCCD7920A5A70724C847F33 +E893F9316FF2CE0C07E55FE095061940D12AA04853F444A664E383DE510AC21F +2EA065FA840618B89166BC69C6BA042714A6DA420C38002841A2BD31C35DCD5D +95D01CF0F4233065B48CA98A9F078EFF2148CC0B6B4601912B93F26F1B2BB509 +A89B6AE424FC9FBC1506D8DF65D85490124FA0B2C19D4AD0FB0BCEFCA1818474 +806028D9362C308A707C001AC9AA9E3D604CF91242901AF68176C70122646FE0 +3489B2D0AB026B5F14FD4E8B6DD4983435F8C1EA647C6EC3A30209332F5D9E81 +6F5F1D827D05995B996C589C6365E5D2EB4922807C996EE7D653AB8E6FDFBF2E +450740A9EAC9D97EC4B05955B35992B8FF98065B126220D2FA9FD5361F00E7D4 +FCCAC7D0131097F55420F2E723779B33AFFD9A439B80D2B5A70CF35D9BD62E5F +EA17E2B6911BC219A7D1D62BCAAACE9FE03A28780D32964E25E5ADDB423B67AF +A377AB0E9E401DDD8CB82BCAC58B26DBCC1174FEA59A311B133F897ABE574040 +4CEDF6110B709AE16E63BAC2ADB18B30918A83160B2D3BB8EA25930548C69864 +DA2A4C23339B35188599EB5668AD8F1D5E43D49471ECED568D45BD02A38006E7 +ED0CFBFF4C9E8A9CD0ED5086E663D880FB388D04E665F154E5E3AA7E658376B2 +C37E52A54EA086300039929FAE313573DE586DC6864B07914088A75241A9B955 +B60FDEF10E7C4CA62F04A0DEE650DFEC8CB0C31832D6ECD00EB8FDD4752F4376 +965F0C7318C152697C688EC0A9DF0709F4D98FE9E8ACED5B47FE2E640C9043BA +535550F55C945805685313E95F02D503DA1F68322938A76262287266376C9430 +34A8A7E9A1E090FC84F0942465BB09AB0E885772BD34D23C38655530F3266C6D +A8B703AA8584D766F3140B468CE856EB0D46A9B7660E9D41FD90DADD603D43BF +3E573959254916573DCEB05BA14B58785817B26AA1FFD03527F11068079EBDFA +2C97B82A7C711113561EEE00C10424F43D5E3A7E6A71BEF9B8173A6C4E26B827 +664ABB5F5882369863CC11AD9F67CB687F1A5D9D554962839BF4DF589A5B0627 +72E49732552AA9886455050A00EFD580BD616A0164000E54A898BC9FB14A296C +17ED96A27D3416956AE0A7B8EB477143FDE8D33BA0C2BE89249DBF625CBE983F +AA6763CD284D0B59099390BFD0193881995A522B5B3E689CD7EAE3E718DA40D1 +C1B6B67463B2B885DE1E9D0ABE0ACCEFBA3D29F7F482D393F988A831FF3A9688 +085108CD2BD75DB01CE94BB7B4CE3674937895D6AF2F6659C4A612EB65F8E81E +B9693701AAB54789B2BC251103528FC0A7E7700CF70B81230B65C0261A8584FC +F19B82615DE07D894AC4CE2CBBEDA4E79CA2438B119A8F0F596D0C605B3BE598 +AA3B1B1F58B6184F0904A73640E466164CFD0D0C1948BA56753520F144F1AE1A +015F1402E25F26B0B462F6C4FF977C7561217862A5E91E1BE2BA5E5B5E045B07 +163CD0DB3279C6D182DDDB43C1E15C6A96F0BDCF32C4FC497837321A05ECDC03 +30943D2E7A81A319C58BD5C78EBF72ABB8931921DF1474A67CA2E635FDD45C19 +1B525141980842058B8F07DDBA38D0FF3F17D95F833AFAC787AF090ECB75DCE6 +155969189C4A05055899D6AB35C9B8F1EA2548B596E799876C8A1A1CF5A2A26D +50AC0F7F93A4816A983F82675AD33D409776ED878420262521C373CA48D01CB5 +BAAD873A8006CD8E74A9CEC86FBE4964497D72D92A2837AE2DD223AB101F8C37 +8E2565A1B6FE12208A05B60BB09082028FC3E1924DFF5A60525064A7B004B75C +40FE50FCBF3CAF6B4E2F487C4778C5E6B105DF2962391EC856785F6ABFB35896 +8C5C7B4D3AF8AFE4E6114D241B943E0ED2129D6BFCFE863AFA58F207A654F9F8 +689E53F795F5A199E91F8F76D4C2495BD307CE3B7669EEA5C46E3BB4CA096420 +D4EDBF4044F0E2C79FF6DB09592C8D29587B536B189DF331336C72EEE5C96FD5 +55E4039799465EF1678063F2AE4CA788C89CBD6EEC9DB3B22BC19680CD130FCF +963F30007CDF0BFB436F34B87D59A807189B1FD4015844DE56B7B5398794412B +1B406C318D5AFA5EA90ED303E3FB726A7F83634341123E5CA48FF30AC16D2B1C +6378EBA79DF54B6989FAAC13F076D88C92B1E485060D5B5703D3FE55255ACF02 +6A94FB7EF322798E945E24BBCBA0052FB611E9451F86BBD9E1BD6A143A98CC89 +A9C82B0993432956E2AD3A243CF7E81E23B770F5B576593EE0089845046259EA +797B171AFFBA8B4A2712175CA836D750B25289872538ACF8C3A51E62F18C5E91 +B6CD6249CA9448C071CF2B9114696EB0A0DFF0019DAEA8399D679D8484823000 +DEFF6B14034B064969CC05E0B5E34FE6F414F876E2809AE3B09F03492B5193B6 +0D358C68DD6A3C48FE6318CBA17BB3FA9265235AE417DCEBB0380C30D04D6E93 +B414575828679719D85B9B4E5B56248E52B4C7841AFE7B7C9D6E844480C7AB80 +5C9412645FBD123919936859F61D815D105249DF52687F31B2701321F8DE91F7 +A88A4E8D5C3926CD47F8CDBF8DED8C5F24C5FACB2138736EF67C5742B33A12D1 +2721A47ADAC6AFE384C2066AFFAD2F79C9FE60FC11A7B71C972B897B12588196 +93C06D7A79AC25F2D9D2BEE654AD27D454D4F28E533A6CAE0C9863692E406A53 +C76344151CA587709CE1BBC845340FCC7B3CBED5C421944652E12506193A5212 +A3E384D7A63F0FC0927B2EF40AB4BA66909D323E6079D9DD5A9F09FD1078E804 +4D6633D71CBBFC5CB1E9B3BD13F9600B1157E28DD3226CDDD358B0878503D954 +0B43CBAC43A14D5034F44722B05D12F6EC8ACC66972E3B9D5DB270988E8D8E88 +4A2F92750ED6979ED5EFFBCE0731FC34213ED99F37BC31D0BFD0DA1D55120C58 +1167AE0D33E8F190A163EC437B1E67DBC254331CA1C77EB1AD6B98CDBE95CDC3 +1C7D04211BF48C8F86E34AF2CBFE411A12BDF382AFBD63ABC1A42BEF2825D07D +1343175C428704AEC8C925ED517CE7CAC954BC556690E61278079241FCF33CA5 +AA04CC20D34B12BF04BE34848FEA0015CCA8192D7B6E166025DE3F12B4FD08A8 +5833375528FEB9A4CC7739AC1C6988B21F3CBAED01DC535A0999B5200FBCD961 +890288CFBF06B0E8B55CFC0D28A3D660B9A79A4A65C2E0F23B54355E41E5133E +42990B4B1F4925AD1DC6176919F37122D5B783BB1A18E8699F8E3F48EA0B9415 +DE9376500F1C31AA51B98E9D5012476EA6F89D93EEAB943DEA72DC6B2734CAB1 +12FF2C8391949455BC5749722D280CF49B8FA5F6FBA1D55B332E0BC935E9B33F +F47FD34619FB0E217E0B5D1026D29A3C8C33CAAC9AA86015B009B153B86215A9 +BD54F753B708FEE773C9A040F23D99C941707CD0200BEA970319E669907017B9 +973BC93F89E7229F4185F95A70537935ACEAD61E7D458C33307560B6D0DA4089 +B40AF5C8E3F428116D5D616E4B0DD6CC7FE203885B32931005D517CD021B75DC +A4EC6FB5F0F8E8C43067DC7CC99B4055E45F38F8D411CCC80514814CBCC8747E +DFE0FDF457428445D64F5E1D0811BCD103E6EB290E363BF1A2964C5FBD63A405 +D0394E066E54774E7B05CF3E250FE7E5E2782B06BECE8D97C5CFA0BEFCBCED02 +08879C6B8F93460D1ADBEDB3CF5EF9469933832A83088D6563EF6982E5F1E704 +B0387D5E746D708B7787B7D7F91BB5D99BB4BB2C6646D5AAF8B1D70E0EBD2054 +492EDE6D5B226E2EEB6B868DFE0DFDAF858D7239520824943413105CEA5AE042 +D9F12A6EC811415A257FF2AFA0FC15F64D7C7F21762238B86EDB5AE4E4CB4FEE +9501350A8EB10809B265D5B52F1C10A89B5F5564C8C077C4109DEBDE36F5456B +F6B4F3889DA1AA3855374A39B9AAEB76E26FEF4683821185A8157B392921ADC3 +5782BF866461D525CFEABD17ED262785013A628A017E50EB70444CB1A9E8DB22 +775040FDC83D38CB5C91064997A88C4DCAAF340D66608C4A28A473EEC0A08785 +C765166D9B6C234AA35ACB7A3E676E756C13A67D80C148A2BAF56432F0AC012E +612851ED8B16B2C0673B11BF65904F7B9718E12179D36023CE784FEC7B79D0AE +8EC3F1244A5D293CD4E67C7B58076A6DC8E4168398D4E3653AA7C0B44649F372 +58A5B2AFCD59AC43796B6971C27EEAD8A4E645B78559FFB90A0D2C4367F25F7D +84EF76B89D09855FA0CAB5BC5088C220E2979FF17AE67491C77E229B4668001F +DEFA0E5B581E24AA93CFD0A21E453FAEFFD82A27D236FD5913132FF54C925EB9 +F59D48E16FC904AA8C498AEE94635D187C7FF354F48771A3B730A994E4085077 +53EB73692AE569A52EC4F1FDE59E793357647277C96A080FBCC9B95044FA71A9 +359225214796A4C58C90C47682EF714B21F8C289E3870EA06BB9DA82227F7ABF +DED110C7307B86772F538A937885873BD0D427966DF81A871F1D5F5A2105F25B +C2BA884C9C3D8342064B7C6979EB116A6077BCAAC52EF21BAABC0AC1BFE8DFE7 +3BF35A96077B78E47551BD07A89A2353366F0E3560D495BC906B40102AC68381 +642ADDE76FAA8AB2466D26B4A322288ABFF4AEA43A5DA09F32F3B6ADF22B0409 +3F16A8CFC70421613B04078A94148E47DD1608F1E262884D8C47D856C1DE30BC +C60933D7BF141A433AB68B81BA42326E2935E37217932DFFB28C9D8580886C3B +DA86AA0795BB69DC249050FB9434C900DD3E97D8C7556834DD3F66EF47347B13 +77E60D03674E47CCA9F3D19B2AFF6660420940EB68A843E93BA89131606835E0 +4EC6CFDD92827C56A07DCB9B7C6FF016D3500D1C6F62ADF954551C2C072B0F7C +86CC8295CC7BBB42CDB70DA78807C2C0CBB3C5369AB2BEA7DF33281A1770A562 +A19C5FB30E616743248AE7D93F8ECDC1B081F96F2F52ACF195A86DAAC8E53D80 +CB8883F37D3BB12CC0908422CE4392CA1014A45C7EB35899A8B7694C2EAFC62E +F69D5179D4B6E893C2CFD762CC388C6356D941E89F1B0A8249E8A701678A86A3 +AFDD4B74C16633087CC14AB94788C32FD74B1F01FBF8C7726DBEE0013E576CE8 +F2D2B7E3CC723BCDE5ADE760D387EAAB664A6F4043A0AB6260755868BE302157 +551883035BC8D73366FE63F7BBCEEDF072224B01DEF7651E0CD9EB85BC58C7BC +01DC0E874147E9A1F9A9116BB60A1FBB7FECE53F802BF95E3A52C4202C89C99E +BCCBC7DDEA17AD7672CF9AEF169B20FB20D7F76B2EFF1696674623E01642598E +A86C5365E4BA709777AAFD328E40D3935660CD986FA959451A5D1AD43161CB67 +5A75934F7EC456F55822EEFE030DB1AB048A2E69AC59A50370763A5AA4E11C4A +DCF9B23C9DD7290E73E1B72B179138E514E99167EF94FBF4A97866EEA33828A4 +275804BD9DA8101E6F7C78541D05C2B9513C7B03A4AEB0F5D5646626E8C81486 +610F1EDD9748BC95F93E9D0C859F270AFB655E2154494FDD83AFAA383389BEAF +70A4458D0D7CCADB3E4310B29A262C084F4D3CE3B0BB63A271B90AFC60EF2EB9 +EE6D7F7AB4ADD46F243D94F83154333ACA2358E4F6D53E633C37993587320978 +F407155D27463A47282D27D50C22B7F38BF34974D60A361BC6F26565D5CE5DD1 +A48B580F5A1379231A8B6E90D0F0F770EED72C9D9D4B397455C59A0687CBDE0D +AF1CD3AE0B83ED3DF977C0DDE3E7537C8D03AFA3114D7AAC6AC5870D0F4F03E0 +06579E9A7308BDEF66E5DD3FADC07D612E6859AA57D08E6A4D118BA7DDD45DCA +2E003472B89169CBFDDF8516C43851451DC5B37C32A111D9D7AD1323C708EEE8 +C500D1E8F5D94BE9E6F3FEA2BD8C5A3EFBE1EF84F5C95BD6CED21C8E2218E513 +46BB8456BFBBB143CC7F0D11F74D53BC996C5D5A0A157B2355768DD153DB21D6 +C2382318562DD4D1745DC04A3941FE0176189D8B041FDB0525A24BF5922A5E78 +420ABD3B2AA5E5410025C9F65FB43D0A68262981DD8952002F7B12FAA9D62011 +3AB3A84C5F720AC7D53671F33477E750EF4F700B2DC3AB8B44587E9BBFA1D67D +276FFE23F32EE806D3DE9C138035E0B4893329A3CFAEE28E6992A3834B016328 +D3B1785119741A71FBD79193EA6EB20EE914A644ED41BB29017A20E534256894 +4D9A5DB399CA943AE5351D842154542016528ABDFF55068BFEC1F2B4A6689CD1 +1E416FE8D5B150FC6A8E68EFA4478BF8931F01E405BE2531B64B4863AD649294 +C0391ACAD1BBCC2627F52FA1E07D77F0A35ADAD416E837963A0E88F67C827C15 +EF55E915BAF4E5F3E4C0CAC6E16654331B3ED0991A7D01C93C60F6961A73E72C +A77434491DD87F8EE1401583D48FC38F63C1E2A35492F93B871ADED0348EF0A8 +437B033AAF2C3C6234A1A451C143CF926992ECDA1F1F3FAEF13C6B1040A202B4 +27C545405D90F77C939C3199FA47F647B482B7DEA16DFB1B36DF0F70446B8CF6 +02B33A96F2E81416ACE4D1B53B6EC5D96C1D9D43E501B989580DB90E83A39CBB +E699A7D49F993EC3ABD780632810CB3CEF816CB7501F38D73106C838BB1C8208 +84382C1DB306315AC4662285984F9D431DCD1F2C854C4AA95CE08C33A99B8B7E +6AA0562D554DA18FEF39DEE068E60469FD2DB23428ED0EFF075A9DF7EF3F92F6 +C73E9CF760FF0523522747F7FA0B9C21B9E4826A900B5D943BDBE82330DFB8C9 +C1F7CAFE80F7F1157EFCD3E6398F77CEE305E39C876D42BAE82F5078E894B112 +3292590F08D820E61B6F0454B47A23C78A5B8F3F34D7DA46735BD26A19EE0327 +E9D27D29AED59C044068387BC305A558A13403C9F713F6C5C2D9C6765F8B824D +5C3DC4222ED8079BF0610C8CCDDD041FCD67684E66682F8434A319E48BBF7F01 +F8BB5FA9FC41902E7285DAD8DDE62B484FA5DB359668E6AE0805B48D864B7C82 +DBC81F4CEBAC5A5108391DA129E11C12138D94EC1A407371F70C6B84023DF9C8 +EA177A087632E3EB4ACBB13815B604140285AD93D1E72D17AA685EAA7886B5B2 +E6C3BF45F83594C841954B58FA051B7A9A94881598929A8C8310671932CEDA2F +6DB1F7F015F8503EF84B19E059E8124E4843D09890DE094EA6EDF792630EB0BA +1486947D0A0B484F4E223DCD215EE78D24C090A3C76C550B065225B957C47C01 +9C7AAF1498157177EF2A68BFBAF50A3D221B4320D71EA261C59A5600B55037A1 +8BF30F7479E036D463341CCCA9E987C3B87CCC44E383BB5FF98BDB2730C840AD +C388CA6480B85A9AB7D42A63F9F4B049B45AF49637E9464A2C9B709A7DE3FE85 +10A6842FBC7B4C56D14F998D6D382D31892F7C066C77A6114185E4A573F9C378 +489CC8551D1102C2052555F93CA134FED3383AA3F28A0E11F5D471819582BA7D +852CCB06FCC3CFF6F99338AA046BE9F96186F288D3951F75449C1DBF650965B3 +3D1030CCDC4817BEBD6216943F2DF5EE8B9FEFE6CE4D38DC52F3CB8A7D29722C +990AFC8CCAA016181A26C3EE67AC35FD6119E23D689EE78E05E2FB7EC3864120 +860E8BD2EA388508327C46EC8F895E24998AD2EC0D8CDE2A333719DC03F57C3A +229EC6CBEE7FD13F538570C2DC2F1031801BE075A473A2A2A7C1E01F74B8500F +DACC782033DEB55C23B08368EA6C6AD8E47AEA7119D76D4B9F80252D66F70D2E +6A498A684FD131AE7B22322009A4870CA2C684C5FA7027E1D98750B6BE292FF3 +0EBAF205FF0EBEF7E1C322DC79971EDA361E0597BDC717668F6B1E66EB93EF2D +62CCCA7BD345104EFDC72D1FCEF328857B84439A811819558DA11DF635606EDE +FA44B2AEA013F1FFA384905F5E32057EEED1FDDC33E3672F42425E8520999004 +51EF287E37D33E8F2A6D33EF933A9A1B1B6472889499D5F24BBD442EC57A6218 +2DE6452AFC09388CE79C10C09562307B117171AADBC4583AC258F3525534C141 +6A85CB591C56BB9310BDBEBBAAFA8270A5A179A368EE401D36A07075F21DEA6D +B1A64E018F87AE259E98401E87FE8A808848DEECCE5B9BC45F44A621301E0D38 +AF6B9042CCD89445F09FC971F94007E7CC558F81080A51B3163B7E6629AC2162 +A410F477E9709541D6B4EEFCEA8D2208427D82F6D46A6DF1E180F621C5B44EBF +D262084531D95974D7BB0F098F279BB04725C16955BCD5CB341F14903C5EA661 +7752778CB6A73908D89835CE1D302733EE233EE7099357A243E77833FE9E9178 +5A025A89882C9677467821A7414D970B9F7C0BEE6E0D3F5EBFA3438640E6630F +916E9523D92112C2FFDAD975FC3D3DB51273AE8A250288AC30F0C63DF9C98DC0 +87EF8A135936A2F060405A4B8E2B597137E9C0B115B91F67A7015CB6D895E688 +45D23AFEFB6434789178094B15F666DB49AB7DC74454933692B36DD82019CBD1 +4EB94D1C042285E9D76F95B80FA4901D85BD16056ECDC82F068E794CB4410D65 +4CAE5E1B495D1D14647B4F3CA8EE5ECE7081693A7AA06646594744FC1AE4723B +49EC675530C977FF95B41B1AF51A84E777F1124602DF8F5684F3225AED18B990 +EF1150946A5D0888BCD0C79975A631B147C627514406FCC022DC0875CCF8B036 +653B15187BA94DD8C5B6127AB5069CFB9892C6CB64848D4637C523AC2A5D4B5B +611CEFBD818A1E06BFBBFDC00EF8B2602BEC466D996811B2B424406A29718C8C +F57418415DD2422065C2CFFD83949467243264B16DA0C1508E597EBC4B18EBE4 +4A4354E8837173AE628FD5DDB5610D35F96CD42386C234A9EB05C71322847C46 +ED113F60A988110CCA6DAAEBDA7155A28BC035B803B81F0FB6A05DB7EDC4A880 +80DED199A41F62EF60D904F55160EBB83F40D7125B66750C881F809F30E5F72B +26748422CA9BD09A8FF4D86F1561C3B8AF623DCE26C85BF643700759324A372A +B2510533A3B8D885472BA12963E9C400B81898E6E116F4977CA724E782834A56 +D45F67C46CE5F9C0C267D39ABCCCCD1BBB002B4F7F2890B868ED1071BF8A5B0B +825DB9EFAE17C7BD9B887D75EFABD94EE0B52FC811A8EF3C94EE93838F4FC793 +D38929D6E0AF3F6D624F4BA160BE513F683E7751FAF422AEEF111463F6B889BA +B264156139AAFF7A1B64790F78A9168AC655FD94FB82FAA0828F1B284CC2D027 +CCA9153FD60BF80891AD0B45F0A356A3F7B90B0D190F1CE69398C1F2C5B8E99C +10A2C2E97C530A8614E9203F424A431220A4F5333DD281FC1CAE2F2C0E6EF57E +CB9074A7C7C0B355A1A567CC2D6CFDFEC64401510F29EDFB0DBDFF88D4FAF643 +8E721BAFBEFB4E1E5B2AAF576027CBB3A2BCB8B26E252CCEDFDAF8740104724D +020CE168B39A12E0AB7F4E3BCD05C30C5419A9DAD1C3510CAC11EE4BA2B74818 +88A1320E5FA1D6BCD4B58877927878D9D3A65C38CF9314FEA0E37EDA580CF121 +FCA5FAD167856A8588BAC41CF25B3F9C0C158A253D40B53AEA357806A3D0D706 +BE64FD7072267DE22936D8CD0E33DEAD240C795750299728D41532FD445692A9 +08D8EF48054B22F12407C5846ED8F14F24CA348FF9760008D2F85FFFC514789B +63E5569E73BF23A6413C4C077A7471E7275107F2C7BABF43696B746ACB2F4D17 +A4194B4660E7C797D3DD3785B92EEC1C7C9702F5ECA5BECC027FAD6731B49E0F +08F0486C25CCE8907B68C18DDAE8B42655B46B19B652670790CE1C9F3C8ECD3B +C88890676121A2C89D464D9F27B3CCCB5C5C014D198B5AF358699B998BB61488 +59DF9D0D706B84D457DE5430E8B5B6BFB5124B16C626E9B3774AEB27B3461E73 +0BD7F788F60264CBE30D39CFAC48FFD28ED12D55C7D0F2CAC21AF25FD25359AB +817F0320B766B414547B565B52DF5702B5957A0FB9D7058DD7F803715D122859 +87517638A22E700783EF621F407FF829E19C6B379AA448407D79FD4F76BEE1DA +71F6295803F0E7F2EEDF22038E3EBD6D56A1F0B72D203AD1A89AA7344ECDC16B +83AECBCF61F07C75B07DC7D0D5824281C08F0372762047B3E745C58CFFDB701D +2D35513F4EE938EA93D7A1FF911C07EBD7AAF2151869CA572A225D305E4D2883 +FD885BDEB7876A89AE4858FD2354FD4E347680E3DE3CBC048751600EE94C8DC4 +A64C4ECC6BCBB494A8B5DA6556724CB090FC00BE670E7D023F843CF23D363BF9 +36960292D6FBA48B69330631A12A871E56D9BC8772897F6492EDD55AD6DA5117 +3937DDF370CC6B366555DA1A22700A876F6E535E07F76C28B864064D5474A8D4 +CB2455AAEE25F2CBD6CD19E9B91D1380B73E79C7F852596B97B3D1CF32064594 +42B96C2FFFB054647CE2318D4EBC68EAD9DFA5029ED858DCAA0D5A972B0F8DA2 +2E080D507304905ACF3943644BE25757DADD2589D77553BFDAE17CD50D3431D5 +1CFAB002AA9A493F305BCA941D8CC78B61AAED56E4771FCA6D29CB0B9DB7F542 +AA16E37E647A3D71D0DEB3F18D9E19DEB7DD26DA826068554445E54144B6FDEA +949D5D03EA3238916260DE4AC2152200977C51E5693616977C581508ABEFA156 +B0767661AED9D47675F71455CD143EA30464077398E8835FE9057C6FCFFD6576 +8EE913496CB05D8E3AAA6478685A5E03093A7F62BA5FCED32040D00680141C48 +01DB98BEC6F83FD2B395A97C0EC0617223F19486003374A38147AD0AD996F6D4 +9E6B70187368A368C84FF0C5C2E143CEFF967C279265FBB2F1C5B94DFCE706CD +702C0792DEB7FF682848529C6B7A40BCEE5F7F2A868452665E00B8140C1369A8 +133B5114A62C9983FC3A13537C4D614DD9E513FC9ECCC001BA6A3287D82E9E17 +FF5D88A373023E0A34CFDE64113A6BE7C365D68A64D44F74205BFC5914D669E9 +06D94DC90890DFA84A169AC8D206ADEFD4A281C59B49F12DCFF9D9A2A4B42049 +1509C1F929D2820803279DE83D0A2B20887FD3026604DB42716F32378F996CC0 +792CE403EB698C865C21D26600E8706BFDFF5267F7D9DE38449AA71FA2C3EF9F +5CC34499FE2CC522142C8C1D55D7E6DF5188F9263F37F51AD78E9279A823433F +5755D9F95094B7FCE2F2224236585967CF767461380E28A674E831DC73F979F8 +935D6816947EF70D41D5F64DB5BCA12C184BFE59EE26334C7C9EFA0DD1C6CE22 +D8315677AA321A9B470F63ECE4DDE11AA3604E8B0E9DCDEF721138EDAF421D7A +09D9D6A74ABD55112FEF6593C062EEC5AF3EEAFC4B9C831C7E8D56B332E9844A +FB85AA1EB94C1708592E5E7F3266A037CA3AF551F3679A0B67029B61E9D20190 +2209D680032D5DB92CCA9BDA51820F2185C5678E879176F4DD7A9D64328F1305 +FADCC214B9BB8D9AD595EFFC79D6CD443C2F0B7DA981FBF696A43D4B74EAC3B7 +0441144EEAC59F52FC83D7CE750E0F9FDAED943D9B67BE023367F920DF5A220D +C18432A6AF622F53D0B240D762AC25137DEEEC12AF276246943C4C804254BB04 +9C2510885398BAC62E2F67961B2D24F00C86053BB14200DBE1AF4B9DE0BE615E +127F1FDAAD1AD4E939C1D3DC71FFAD3B9264AE547CB5F11B4E3D93038A95B4C5 +5B0D4F249B20FF04922A1158DA5A7C9B99971AE16FE252C76C21475165CA356F +1F9612552BBEFD2A020635B7E0159E37847CBF22B9EFE07FF1CB9E9129D1AD19 +E979E52F78207EE4DD64287C0A929FB5BA5AD68D395B61CD12C545C6E88DBDA2 +2224BB1751E82014F2995936B6144509AABB965D9947B5B5D1346C1FD14DEB6D +36A559DBE82A31F2DB8830E260C9069613B8DCDEF6E6A88C7B0421A4B99D4EDE +F22CAEA7D7B519A2D12CED44B4F4DD63E3011779EA4B44DCC803E062DBFB6BA5 +098CA9E78832C1E6C6B7C0AD47350BE81377EF66A93134CDE2CBDF0EA9DCC5ED +E38F663F72B1810DA8C23F287ABE369C496902E3D18B718B650324FF7D7434C8 +6B8FB37E30DC7C5B59DB7B8C982194F148B26914447FA86CD95E9781B3918DF6 +5FF76FEB4C8F0084BABF786C5771ECC6F9033C1528C4F0C5008F19D8608557B3 +9B32BC80BB28CD3C9636A8CBFDC7C3ADEED9BFBA9A59904091E31E7AEAFBCCE5 +2DF80869EFEEC3E3B3A5C20B49720BFE300F8D0C807FE3DC3615DA21501AD3B2 +9F602644E6CFF34AE0E34C8DB132643D7EBB7E485F9EE658D6E5F2474A0929BD +768056CF7A4CF2D42B3ABF73B5F9CDF68BCA4753CE33DCD014F646F02229F9D5 +A207A0CDFC782280B8FA180A8B0D26BA629672E6DA6AC08F523C030747C7DCD1 +2721543837EFD203912078F1C21B4C12E1D3D99CC3D41A1EB4BC7A9C7FF233DC +56251E5951A62BBA5164C4455FB7C420B1544FFEEDBCE126AC7BD5259C877732 +5F434F717210DDD55C655AD55C94A81238FCB7B105DD2B13BD30CDF70CF5190A +6B2C723EDBE8E171EE85CE4BA5010E254C217D8A110710DDA85C1C16858D84AA +6CCE64E98F873104628594126EF0B15489D651D8E9FF1EDE0F7147C3E1EE5852 +629A2851B69CBE14F784805C22AE7C9B2CDC7EBA0661DCF803DDF353E2A1F5F6 +8AA7CAE75B44C6187180B7FF519208887DA1C895BC7B8B1783E7EB487D02D234 +4EF2E529CC10CD2538BE4879ACDB5259E694675BA50DB78A91347A4C0E58573A +055A91E73E3A6AF81E890DACDB9589EB34E061E8936D1DF638B35F22FB3EC97E +DC0FD73913009B9895E4C95CF9D7719D9D63C25678C45372667AB85BFCE4C77B +A37FF8E0E6215A718E1A4CE6DD6756BC93A8C1722288FFB56A4082C530D8F47B +26EABA70B663BB51AE64FC03543E7C3F285A38FA416B20F4A73F1442648EEEC2 +3611E13EE34250A248798A2F0B9D6E3658EB1B97389A66C96C96DF1E41A392DD +F667EC2A88C557F4DA7F708A33692B98A8A75212231B395D6785CDA4297737E5 +13C16F5FC9CCB761CC3618C75B259F46C45926F3BD3E4994E6DBB890997E3FF5 +D0C9185B9D91A54E6B0BAD88018DB6466492608DE79791EC93516E67C7C52977 +F9E27B153910EF29F9F24B0C9DEBA4C3AF8C59098BCA325824016E26EAC228A8 +1126E6D8821B379F140D2ACFA1DEB12D434BD0383E5BD448FF624D8A9FCE8CF7 +D843B625CE6ADF6F89794CE54C5B6049BB95EBFA62A296515688317FD1E7AED9 +97A2E7FAA32A4849114921C752AEC2C52B98C69C57818EE73CBF916A235F34C3 +3E05CDED2956DB5B0CB7D51AE40E56085E5EAFB0BF29DF9B04BD66B030BBFA1E +CE3C041E8A175033AA4B4C592575F28775102F8A45E15E3E2D550ADC06CE6514 +B652105633B5E7876059C81527B9512C40DD586CA25AAD144BEF5E587C97E6A4 +45B9772B8D54C2B75D4A716B83617CE59A1E52889613FBBDF5680E676F430ABA +8D80ED90B8410AD5BEDD7599306A8EBDF90107594F191F927C6D44BC816652BF +95C03DC365DE827A1AE756FE769550AFBC535CD3F92FBA42098B2613302020D2 +15F884D51ACD348FF9A0441F3E4BFC2C02EA7CFFE8B388BC0640ACB468F3AF2A +CC50955F7CE335B7E7C8E16F03A9DF18A31B257B6106C3578A343F16ED459E76 +43FCB7DE1E9F7EB80E5D21B7D4BAD5D628F55E1DE0ED07EA926E73FAA6FD190F +796E75D43954E67F8ABD25A6414F08AEE76CE48B180CB1D3458F563A3EDB63F6 +C9C3D9078D20914B83E7A9DBED2A2CE6F0775D3EE4405148F15A5AB53A4B0626 +E24322A78F87041E956C655601CAFAFDC6F3C75B919B4E5A584E9570B6F06302 +99CFD1B95C575E45AC1EE59C798E726F129643964A47283088298D9ED6788B30 +D48341D03C2C1BEB4F31BD92ED5494A6B4039A88DC8C726E053006F9798E9C5F +BB96B002056FD39A7EF2195335D04E67EEF12E0A16E0FE37FDEB37B925144A7D +DE388DB0B4782BA6D48A2084C5A821427F97D22C1938BADC908C772F1A578179 +4FCDC28D435B6BB443C31C4C9BF6CAED51370E133F64A53D0B56334FF57AC964 +B6CBF0D85791D12C68A7A8BAF82CDA61335057A1B8FF0746F94C93D360F4B0B1 +8FDACF3610C902BD03E23FE6FEA2E5935067D10AE5E83ED6214B0BB2D4A4BB49 +F05E89CF47483357C676989DE740832C4E004FF1F2F3BCA3E34DF760ABCD85C6 +95D97A55885031DE77C16B89F18648AB25F9774E495D4751ABAABE7A25CED555 +60CE44A39581BDA539D4733919B9948E2257DDBC67C14E6CA051AB6A2494A818 +93C567A1DC8030900555C28AE6D1A0CC6513C7B31A3F4EA137EF925CDFF3F5E5 +CC9C88776B12851525A920456464431B9385B6D1508FA472B3DB12979DA517B4 +1568600717B7515DBF20E33240405655B3039B7B8C37BC146967C42C4548CCC2 +50EE136F210442A8754946C8DF57016D0109AC569AE4675E111A7D14CA742BEA +47F0629A7EA56D657BDC06D84E4B248A2628123D100F5ED185DBE2BC67BA6F1E +CB72947E8C47E53D91F3A28C0125374D2D78FF3EC984B3EB47A5B1B0421F2EE5 +4827EA2D74EFEF8427FF88BDF27344A82B622327EA307D805E93ABC2DCE0D457 +46C2463F1F5FAFC898D6C7F64561E385646C8C71CD624F6486D9EBAECF04A0A5 +ABEE1E6495CC0B1554C0702ACDA0CCBB7275703F51EB6F10D955DE95727B279E +9F61F19D9D54A638E0BDD27FD15B7DE67A06C31BECB0C800DBB1AFB099CCC2FB +0BDA829E02EA8EA8CB86E97F9D074A99CA8F0E464762BD1B0F41B444BD6BB73B +916DC811EDAD9F9775890D9FEB5337AA6EAD524C1E293A78ACB15BADA0BB59FF +714C43A89459636515E61E73C2F4C648D2916424B688896567E6B53799A79697 +E9DACC8C43A3DDD425AFA8B542ED9614B482F73DCCFC20C4485A67545E241B9C +CAF58CF1811D639E6C79D013C9CA124565D5D9FDFB2044198A41CBD6ADABE1BC +F1B43683A55E7D67E1E00CC18986F446B1AC2FCC22B2A2F0EB7B78E567C3987F +6619BB27788517FDF9B5603BD8BAAA894CBF354FB6F066144931F91D1D8EFF57 +F75B1ED60F4204CF0EDCEBD9252EA04F29712B3907A7AA75964C8ACF7D216759 +931C517183D319B5218AFEFE28F64471C79447A8C96A02D2974A67778DFD3409 +BC4415F8D17B12773192F7485B93E6CF9C99C281514C1E1BDF3628A5F093520A +9CADA2D9BBAB43139F4D067BA7B1D799BD3ADD62EAD68A70C6CD5249CAD7BD87 +C72EF01DE59557A3C3479E36CC872062034B67BB60D8EE0B703443CE7B982E4C +A6714F3333D6780AA342A9FD1D290225A79536F222F2393C5FD6EDBC1325C4BF +61D3D3E5B0C7FD0643DDAC4181FC223C1CDF89A44E542F2AC67FC46D06881683 +4E611D1993F6353E65086553C9D8C415FC809A289795DC5CBD74FC1199E0EC66 +C984180B57F710E59FC74EBE76A8C2CA96AF6A7774DB9879F9A73958A8DAC26F +BD6C2CBA67E3AE7AAC3AE51CEFD4CAB980AC13FC24683151C15E83B23565214D +39600CA55C611ACB9941F78B5349B51B1C489119A4381912AF6D74508A1194F7 +D825C41B88F8BBA571414C69A085CF400D4F7B88D16DA3D7BF554FB6A96BF754 +238680BFE0D23146EEFA3CAF7ACF4475DC40A446758F5FF8FDC0BCEFFE4C5D23 +6DCFCFB0663B70BE4BA681C5689952A7A26223CFEF28D76DF18E6170399EC32C +14B40821724CDB09EFCEDCCC932EE90CA228D888B76A18AE6D94FD69B7BEF356 +13EB8599508321F0DE786EC7A5CB4D6A218E8A62AC044EED391C8F6D4F657C8F +D9E5E8ED382685556E5FC2A8214F93D1AEE16A49CB6A4FFF2EE61741EB41D56D +282C083DBB24FA25D4C765E336899B10EC68C62358CAF2CE6B21A74F9E554C82 +221E8A0414E5397DBF86F54FB355640CB742DC10CF865E0C2E16EECF709B2A0B +908BABBEE0175F8CAA010031CB98818494E670DAC8DA0ACD46959E51669420D4 +128E38F2251F7E9F20F107A450E23A658F3B6058F63D699B4C5135E348CFACFC +58BA180FB43251958D72F2446C6DB69A17BB2416B5B0975C5F01D4B1C29455BE +538BA23611CD5FF3F06278641AF5458FFBC44181D9DC7D4D6188D8A506D61035 +338C78D5B248F2812B3493F890F397C1EEB051D1AB29050F1E1020DF89E192D0 +930A1EB5E35E0844ED2B7B39C5982CA708A33E5164CF14B10EB890EFD606D80C +D08206B43A60C21ADAFC0A57A392B40CCFC7FE02AFB2111F3A20B18AF2F8D64D +C511FD613492F116AD08D2F6E8193F9685568B83A08395331CF44DA500C405A1 +58D1E63E6F36CF298C02D2271A27C9A454329882EDB15736CFFE070FAC32ADD0 +9CA8FEC258CAB9B80C0E4688322B87D4AE222B574C5C599DBBD24505FC00876F +7ABCD94C089010E6DBFCD033DA2476EC01E7D0EEF82D6C761126C42531CB6880 +7D7D887817FE9B688447A04B38709197A87F4C0DE7D26877E08E53F68354C2C2 +492B3F3C82DE586A5BE477D2EDD5A8FFD23B55D05BBAE7F6D6ED28BAB27092EB +C859930DE9BBB54EB2DB5452302F46AEFEAD89721FADA13D5340C7F8CBE0270C +A8861D53170E8050F5C60D72D85E2767D42E7A9407D6864A2118CC70A16C80AD +18A214550E33B636BDFA811DD05C871E9BD39F80682BE56F0E9D0132D5B92958 +E4DC5F4A27BBE2D2508B6B66322C4D2248F09B1112E63032DE8D750092197808 +262715C12ECAC600AB628B03732E6214AB1E2CC952B4BCAFF89D31D186079AAC +8D18BE05414AC7D3433B95FBAEC5186269E8C4F5D01536331A78A3D405DD8311 +8D46FCF30F6A339CA1E0C12BB42BF4C46612F3BEBA9D5822E3978C7E7F24B019 +3F883DE1D353C6BD609698251802B3BB06AE88AE85CF069C70AE3029A66DC96A +2620389074E61FC3FF708B5B9AEEDF245BAD27A66025636ED25A38A1BBF095FD +74D0A25EDD692B863A29E3F224AFCD67CF5FB9EE9E45C06702CDF81EDD74E000 +653C3CA9A8674A8895FCF6922C77EC3B63115CBDD52E8859A7A2F736C9CAFB22 +5A62C420FF7E6410386290B35DE4384DB00AE1077CD28CB6A27392F0353260B2 +8964096063D8E225240E0B357FFA444FD04EFB5B9555A7AB653C9F81D879E718 +E408609E458BAA7F912B8E8587A14B27D38792CF0B66EA0BF6FF28AB27D2F132 +0C4EA7DD61F4619A5131828FF73B622C8136E2DD8516194FA86B91A1FC11DD19 +315B3BEEF7BE8856F36C5A41ED2B8FAA5A35C46332174ADF029456721D204003 +17CC6CF3DE50601F8DA6A943A1A5FB4EF6263738B2801F5816E171020163C3A7 +4A1EFB474171B8B54A62E29A84B8025C0A486BB5871AD62159C8C2C2739BCB3F +1C22F406E26F311AF6D6E5DCF9394BD6E0F2271E9347150B6DDC8E6EBE12BF4B +4FA1C6D03A1ADFE14053F1DFD4086EA3FF849AA0CBACC03AFB2567F9A4A5E3E2 +4CC1DD4DFA6281350643C771672B4E8141593AB7CC1D684307274E42547239BC +1A66D2F9B88FF19774F77A29DDF1441094DD13FE8B60BE3D172E2F03F5642995 +D3B4EA77D4B8C2A5B95E17FA3F4FF3BDAF29D8FA2A1B269839A961E6D5F05079 +7914FFA78F79641CEFA7C1E7029B45CD3DE6289FEF5AF3294DD287F8243F4816 +6963C42441B459C2E47C48D465B3F73117A58E45F4849F7B84A3F7AABBB67BBE +C04E794FA35C3DCB2EF8689864AB5EF05CAD5839A181E6E558355A212B7858A4 +B91DE81B88ABBA4DD07243F9B7E7616F28A294A7A6BB6A91467ECC40DEC2DD68 +C46482EF44B79EC6726318CDE1748366ED8A46995C1CAC6AC2D95DF400C565D7 +8995FD0D12B5059FA90DC42F97176A89A6B77C06E89DE6AB4647D89733F5CB76 +8CD689C40B2BDB5400914EF8F081423A9865060FAF419E3CA66BA378985F9DD4 +FE2A90B6B7C189BF2B9530D43BD54AE78A4E6F6CF1436B5B09165E501F5D03DC +4921066327922289B1642CC41DCF873219055271129C7A1B573AAE9EA60E0072 +DBB3FF4A4F088408012F3F6AA8C85FD786C1561431014FCFDC04D9EC154B14A5 +3FBD7C31E281C866EC9336B78531071144CDB99FE5D9411EB5A49DD0DE0270A4 +03394B3129890428232C45D40685C9741CB09EE1F1382216B1DCD028FC1E0F5E +AE9E6A1339E911DDAF47D74ED9E46908672F505D44D5B96674EF2943F17710AD +C05FEB120520F8E5AD6293FAF919A49051D2B7B0B87C9926512401D2B45B1F7B +818BDCB0F26A70F48DC1B0DACD6A2E5CD23483F545BC78941F5FE1008B487193 +B59180C93EBA03BC0DE031C43C172F4B2FCD30B2845ADE4C96C662157B1001F2 +69CFC12DE72A3901E825E11F5F7B1B1DC9F8A783B840CA9BD21D082F6A9CD8C5 +3CD6EA5E2E4ABBC4AC276CBD9AA1E73FD66FEB9262B35C637F8392A92B598861 +FDCAEABF130A5C21E646B711566EDB6803F1012CE88E0771F7001B683094629D +04FF9CC28D2268C22F8EE75AAED16D4A2F95851E46B9809CC519DB0E39618DCE +C22BDDD8BC151BF4BCB0F7CA35786F6B68F68E8AEE4032B1BD963A83CB00A249 +1878844DB4DB27B7FA585622248E4FCE609E4521602CC6AAB4713FFC6A39A396 +7C2A1A82EF4D6E814B6914F24C5A5AE2952875EBD6CE5B7429582CAD0D07DEA1 +72E65642AACC1DB37E1C51B920BED00C4C6D597B5920A5861DBBAE3B43BC09A4 +4BA3B4C52B3930423C6D2D39C5249F6C2C0EE21B27534EDEEDCFF791A302E5D6 +2D18005FF18C046714B9938AC93B5B8099CB7DD3C142F3BDAD20CF23D7CEC7AB +C64D591809E95EA1788036BAB68B8E4CDB12A0CEF717BEF6340C9CA1092BF8FC +C30EDBE372B3D640700717F98E9912B814D1668A1169259B529F3E12DF309B92 +E0BBC7B6A9C2D4903BD44C4B0969E9E5DDF3B8CA44B8BD065C77CD2ECD3A946C +AEDA6FF655D5F8C94509F27934B9207534C98CB3361D8767D22360F5C4419E52 +6A3A861A6C56AED8F6871DC5671011DF104E31B3D5DE68F2DE00F49673BDA295 +F03EE38F4F2BF2CBE7274A6A6694DB0AC0A90FEA1714F798096B0B47453B9F9A +6E7A4652CEFDF5755A0C9F17C5574FC5E5623874D5360ADCCACE26CA2393188F +A81CAB8D3F35A3FC81D43D450A073474A391A31D7FC994416AD2DAB64AA6D4D5 +9AD3DE4132A10074BD4A27ECAD779F66C3711BBDD7AC92203583AAF0E70483D6 +FE5C76A25FD50101D6DD76C9898E8A996F6DC34F1F22085EA743F966D1FC36C3 +08A4CD8D337DCC8E1DB190750FBCFF37726FD48D1E3D036F1556B755B3C11974 +9F81BB7C7B6430235FED173EDFD5FE81A1815F1A424E372485321BFD6D92ABE1 +C647E7A18A0CDDF2CBDFBD5BC0A1A57855D4AE646D27063179B2FD6E2A01367D +95D63DEB069446A7AD2346ECD9290472E4D057BB82F5B2F86C8C81FA765FFAF5 +937C8EE96E839472E591378995354261EA890AA0CBA33CE29A7CA6BF1DE2E312 +AEF2DF4F66B742C91BCFF17635416598A0CDA87D2B94E0AF915BE7EADAFCB9B4 +5BA814C81CE08C377E448EDBB082987970203A20B2BFE8B58EC3E6AEBC7F0CE9 +DC5733F5A05CBC25152EDEAB6507B8BAB2736593383FC9FC744EDA54C67726B8 +199A3D9CE9DEA371CF1B47FFB18951D8F350DE7FC5D45BDCBFFF8005B92DC257 +DC098528B4AC8BE791F5FC75068506C2ED97CC77204E2F37248A2BCEC9ED4FED +510A7B9603779B68C57D57A94DB76839004E736177752A2A63BCE0900E00B493 +519AC8820D96F9304034D948C8309E4D199A5BF01052C9F807D27FC0C1C20C55 +1AFDC48CE6A0529E32AD7C316A4D313FA9E28D5D68E4692C48A9A030BB275DFA +004B19FD59F6ABBF58F5D2DF093F0ADE1EE44FABEDA97C775643F4616A0F5262 +076FC11E2C4607EC5AA475B89BBA1117182A9CA235FD5BB9FE9B15798658B285 +6C35315A41D5DD6BB6021219DDF2A30C7A695330AACB6D180F53A2C5AD703A8B +41256DBA79173524A8020675CAB62E557CAE00B396084BA76A734E1E01D46BFC +25AABBA5FB4D48A1654E1BCB76BB5E792B2E73F6E7006B6BBB435979C8218585 +C41DEB66A2B9152FEC7CD454B4EDA06A73F35AEAEE33016A2142CF0623E93969 +F86E81D72CBDB19B4BBAFD70DBF0F8EB16443A9987769C532B2A5053A7B55910 +50E459A1098F5467E8175AFEED1354F1C50326CDE9E761427F585DEC3C9A4D36 +A76A9CF4C0EA0B8712E890F81AA6C2A9A81C8D9B061931F75A257B93723BB6C6 +19CACD8CF81536DF0D2A466463EF195AF59B5207CB52D0902AEEDB39D79EB566 +F647A9138A81F7B3300E8D1CA514B6C481904879AF3C99EDD1D94CAF56C61166 +CF8D8663E452270BEC6324A17F6893F1447BB9A3F086E54FC1C2AA2D7F58F66F +7EDE9BE293ECD25F74AA7B10E3DE10513B13333A4224EDE43414EE9F86978C1F +0ED1C404CD511F243A1632663BA338317DC7B684A84C1D4E022D567821331064 +D16F76253F14F91DF2A50E2DDBCB6750D6A75DCD3356AEF7CB5A9B699DCDC80F +0F530B66BBF4A60F102C402DB836D29BA43941AF05680AD51D4F3EC668E6AFFC +CF0D36B5CDD912A6CAF2082B702EF90E16906596E4BC20CC979080CB78FFF0F5 +C928F5EFA8914DF3E56D33582504840071B2FC38CE433A6DEB63E6CF6E808E87 +9866B05DF8116F0972DD25F2FE5232522057A095E311C247336F669BF10020F9 +45B9B454DAE2423E0E9B432B1A2E3470EBA9CE177EF28091EF444045CAD0EAEA +23A3B620D0903FE4185340014920AACE478E93919FF0C722B77A448424D0DEEB +819B8B686125A6D8CC719711E108C6A3F9EC056C4400CE3B5D209696A45F5CBD +913F3A9AB9A6BFEDACD7C207DC01DE4554EA63400489918123741D1AA8843EAE +14BDDCE827785FC2324CE7689B0B7C2075A87520B253AC1C61AE34F5AE34866F +9B68061D1C1D4E4C5763DD68801ABEAD6967F056B8D934CF84081A6A82DC2B91 +2A0F350A5FEED1C1116E3E94A18427CB4A4D1A6935532FC4CECF43E10497C190 +AD3AC6C300A57715E3FB715AFFACC30D4D4EA325AA52DD9BC29FFFCC3646A7E3 +F97A12FFF8E0E355DCD3CC5E68CBC9FBD67DEF5B5157161BBFF5B61C401AB639 +DCACBA6C3F09E9683F872288ABFA4176CB69B8D5E61AAF135B7019CC8F6AE07F +573B897F7AFC0A5FDE3A922DFA3529B65E62372F2CD8F57B6ACA0FC382C148FF +A6CB30FE9E9891275705FFC71211EBB0E7307B00E629E2CD9F4BE16C072F3247 +51ED89B8B087D69DAE1D6EBC237AB8D3483A8F9D48C2F6B465430E12756CCEBC +1C5E3566359B47A0AC0B5D4A5A1B1712457FA33FA5BADF1E302CDFDF655D5ED0 +FA9C6666022302D1DA091F8A19CEF58923AF8996B4A5AEE228D166812A6BC684 +9C89B9E6F07B71454B91F5EAC87333AA9B29B1E83A3FADFCCE5AA5044FAD8167 +F6511E27E444AF65D09B8A7A0312BF78EB35CC34545F9BB06C88A074EBD5BE87 +763B3EB1EC2A4CADBB704F7A2DDA34B013390F0B63B0A618C6CBC2A7156608CC +332AF4C93466EF7D18E85DE5C5B3D2AE50A44DAD39738274E4B1E8D350FA4ABB +0189273E99A3D9659AFB5C29C68FF969D3681D28B9322EB08214CFF9289B52F0 +74E74ED0F1DDCF8011A5D3BC4AAF6D8EAA4643C347B912544026D328BA2BFB5C +ABF3D683F2A0AA01EAE0DC9760DAC0EDDB432415B1221D35391FC5BC5A30AF20 +79469870D85F59B9BA86B928A0BCE261D4A2296BA7AFFBBE7F1AEAE1108CBE81 +C2E5C9D7F0B64E634268C2510EA92E10C1CF3AA7FD146106513F7C1F63823DB7 +F7CECB5A80ECEDCB41D3E91CB4F3FA9C8FBF3F62A0C488933D55DD2DEDAF0947 +0D067211819598DB2CFCA285E3A8F74E7887265847DFE8353C428B253EFCE70A +766A823759D68B665CFF11BF62071F2F8879D076429DCE282C36ABF335E2DE77 +BB53D459A024B61A5CCE35ED62239410C0E6D2194CE14EC54DEDE8F86BA83FC5 +3EFF391C331C78C5C9C754F81D1FE358D76E84F470BF6DDF6EDD643E62680098 +03840FDDAE498DA27306296B282E76A03EF8D593EF0764AEFD4167C98059FCFF +CBB638E477D6FE42537F6F7BE5957B0EDC591363D434D1C60F46ED853E8E343B +68CC70D92BD90958345DE0CF9F345AB7641CBBDF225AED9BF559F6D2CCEB3D7E +91A0211CB5628CDAD748F37A8E49369425CEAB98C9C4F4F0554F263371D2C9A4 +16466A96356A3EEB31C362478D5D6B849E02F6F1F7095F9A7CDDEBEB00524F2A +3191A5B347CD1C75511FB605579D6D718723D3C1E26862F78B5803AD3E6958FE +6777D6E374B40F799F13514A7DAC43DCC6B68B7A5A0F25A57F540FD87AFFBEFF +3BF2D62098BC62B9F111E663E753347E7B40B2430E89C4056C71FB142DA00204 +6D59F1053CD6A1A030B6EA70302114E4480993E3447C926E208226375ED723D5 +B18698957750DB23498A960066FE6FFDF50B97B7C46960DEA0170CC19568A0E0 +371359569055135B47AC83242238F42B29A460798E246A70185B30A026762C21 +B0F1F1EE8F3F309AE8CD042DADE3E36151B3B7929BA6A14D90D924CBA141D1B9 +8DDE94E46286CB6BC7604D84389890C0AA8B97D329CCA87E5889F695920588B4 +582B88B39CE78B8C35836AE8BC5C66A86DA1267E46BE9F20186DC3BF636FCC29 +141302F57026469542DEC1E8EF2B54814EE534C87A1B4699D58D1CD95EC4B957 +802383A21B8CFBF29FBF643E452898553CD5FF01F7D73E461CBB43186A96C66B +BE5910A0F78C730FB54611E4EAA909096A77574AF9F481E0CB8D15AC003F336F +F8FC934023F37DAB1F5E0FD58575440E3FABEC39851905D14FBE4745D11246AC +2EC21E7E547F4E0620EC4900C327E20248F7F6D60BFD8564FBBEC1D36AA9C27A +5796EC4DAB33961A2493EEC2035BA4C49FE459BE440562DC1AEAAA6330732146 +CD7E01AD940744DBD87AFEB4671A0A0ED5CF115E3F4AC466A741F086DB742965 +3204FEE04DE803F0A0F53D1EFC1A916EE0EACE7476E1C173EBBE0B560E95242C +5CD33B424B8BA6C9A26CAD4B4A3B37C6FCF2EECAD1E8227203686172B25B376B +8B03F6B7C6D6184CFEF80170C1E8B97B77B3E7DAE20A8DD97B04FA0D2B955F92 +8994806F6B43944B520F4DDB8B0B6DEF2A4AA7E427F6524B915FE5145C055915 +D2753FCCBDA11C598DE694011B929475D5A1855934B03118D52ED86419047DAE +CAB3FC969D072D0036319B517B51679755B7E5647543BE8C60387800139D5F8F +1002D480015EA8251624DC1442E7FC84B46356200BACD8C99F1A581DD42F5798 +5B5FBF460CF1F10E3125211B0128586D65B73107E32FDDC354541917310B1467 +D92B15C317576BDADFAA7334C14E32C2D811B22E6ECA84BE80532D5FE222576E +94D6950015F2EACCA793406DC18C427864AB6F4E97EAB9BC634DD0B3179B9EFE +2C496C1AA898C2E821E23B5B16E7C3081360CCA50D42A459FB603475EFCBE5C8 +8610E9D856933CE6328DD3EED0C2EB4497C9D7622259AB0CCC303901051C4136 +4A235BF3CE520FC4A6D4E99937DCDCFB359D15FB1830A434CC01FB8A840D893F +79F38DA3641419DCB90165FAF459070A2C4205E1772ADE564DB3E5AE47045EC8 +83FBCC23CC6D41C71E83A01339C2BB9A4E8FFDF67D3DD149C13B8615EEBE0963 +21F59731B52B83DE23808F86523F88464599EFA1E726D3C080D13752E18AE05B +60CA2052E559B00E9F055C692F1EE98A0C0B734035A21D59FDBAED45C5541A8B +839F9757C6D3041144879185F75952B2E1A19B01CA1665B50B7FFC911C4D9D1D +05B0107D9FE3961A5B4A447C1CB3E8E88836D9096B656FA15CB9EE3D19A5833F +A5899996A26BC047D0F69BB9D243328FDA3E9D9975DA456946070A48E641D10E +676B14F21A2610055B5D7711620A201B465EDC837E661D4633AF96F60CF1808B +D32318CA59537415287AA572AA8CE82E522ACA934B9AB564E1648E3378648C26 +01C8EEFE576BA9A308E2C0EAE7A100F57C0DEB11623C6FBD57AE045048D4D1EE +81622AE08EC95179E21AE1C6D5BC9A0463BADC098E282B18255A0414270E41EC +B98ABF908114CA425B3E4609F5601151B3AC79055A14E1A2CD87ADE46CDC2047 +C4AB59252E633EBAE216F9EAFFA55811772ED0B7A75CF4AFE8A7E59EDD252CC9 +43FC4E60B3E47606760D06E3C22C599856D0C5FDFF00627484E77DA4D6F51460 +5412849807945C28B25A0B684E33D02EC26401708C1DCA683C85FAAF9F3D74BF +66C485F3D5F73B785F0A2CE231538BCC1E9DFB145152768C84E32F33CD0BA1BC +36D0B9383AB4333598627553202A39EF3E696C8BC58B0446D514822245D888CC +F013C52BEB7067214029B943D7E93FD42BDD589FE1FC0AF049E20F60A8B03B41 +5E7D4CE78FC1229D48F7D751407CB8ED28258B6ACE47F74E0EC4BAFBB4D3327A +6EE3977D9643A67CCCED9D34A563CCFE8BE6C57CFA39B90E5BF8AF85BFC30B7D +D6E697AE61FA9633EC1C7806636A916B30073E4C215280F73B6BC10DEDB15202 +827659B00933C6486E67F96D81FB80CABCDB9F159937989AB3E55878D53394C0 +C7D5E16C8EB90551B1F0DA4F06B911CE34423CC2328EE5E43292D03C9A41D13E +871EF89008148EAC9C5CAF24729019609D114CA82FBAB5EA34311D5710EBD6C0 +37F9D4A31AE64CA73B1499B39512ED67B605EBFBA6682D0DD96E23063CE3830E +AAA4CE2F1C6BA52DC2523DF4B3EF1F97298F2523123FEDB43F295D84E9F5AA3D +E6F1D4F813CB884E940A216A0C6658D1E69D28F2CFA4DEDE60059F4E919D2246 +9984DAF8A569DB04FD56E11116BA2296BF63ECD1B65B3391E6D8B8A8A8B95318 +8F9C9B88B7171D73E0921E5C9959186A20D01982D38CFCC5A4F91D31E0FA8503 +E05950007B611CD36D3D714BFD49F6DBF09255535579D0E0E01B540E51FA68EE +EA6362213A0B8572AB83BC8E533B63C6FDC4FF52507C34739F64C528A815B8BB +628BCBFFB3CA3C2F501182B46DD1A72580E91BF85FEF40029BA737438729C51A +BF25EBE3882B8351D0F356A6648ED0F11174EA948F3F140FD7DE1821BED2FDDF +8FBA1DFF2786C0015EC2A8437DF5F02AF89CA383E622570EFCF2895E3CDF60DD +A64B152E2F5B1DA795F50C59D80FD35AA7A2CA4B55C3A1E046C3C84882EB8D86 +AAC4750A3A786948FEC26CCF63395208DB2DC2DDB6310B59817ABDE61C856183 +500C350E58D4847F1FE95FE6068508A834B4882D863691F3DE33A9953000D8E9 +A8AC105E3486CC974E06351B1365D157A6948D49C904B075C195277F943C80F3 +786F1CB9D118766439621C23095FA5749C945E94648E70940DEA20F7BC66AF49 +0D6BC622CE00143F979085824A2A1E850D68204BF44161EACE7F8AB0E8097B9D +C4ACFC76E36776BDBFA4F03424C4E286A6B925B98EDE522B21641C95C0D2910C +6425C3465AED57BC4ADF0633D0AB3716F5C0EA050C493D84AA1E0903A20F0E3E +04F2BE6265DA7D2E5D308337E1B50D361D0BAFB054FF5292C58E12ED0A095870 +D39C50CAC7B0B010DB79001816F7C5EE04AA562E11F87CC6006B9396DBBCD9DE +4D25B032C5419D85D28306FB3543971B4384AAD68824D78C4E30C945B610E315 +013151687496006EB9D8E867B82AD13770535C982DF8F84EECA2E8382D1971FE +8C4D0F28D8CD60B2EBD10550F51B3DA50C7CDAC3553F8530D596558B238FC24E +26EFA58FC455D2308625E4ACB5A954732750A03D25A88207AF626534D73D7086 +F21936FEFC92FB0E1942DF5E43A52DBF41595BEE66DF4C66A769D9C3B316E332 +F1B94E86370C14DCB944486E47A0EC71D4169ECCC072BEEFAF645A4CF3B8AC01 +1543972D34F94639C7CE00CB64F522BE3053BBB55E8E7470680BF1F01BDFDFEC +06C3B76ECF3D8BDF4A150ABA5455ACA30AFB5F63998B277BE7EDF9268C07A751 +9DCC7CAF54B1F615F1D03CF3E58A447C377929CFCE75A6681A7BAE4FCE70281B +7E4B69B0288633D39EDF2F69BA310ABAF715E9B1533EF655986811EBF695DFAE +902D7C4F1FCE16EADC43529513B9DADE8F0F4DA4053549A930D311977C6AAE0B +D5A74E1F269D484A3A209B8F87C9D5A1E4EC5FCB83A2292DA43389FCC2756007 +EE9FC95E4072CCD35BA378DB6CB79CF7B27F017F1C78CDA81D887EAD7A9F3BE6 +53A80FE9B5F6B159E32BB7C927B069B0C94524F061C8D05810481A44A6F12846 +31FDEE232C38AFAAA1C81BC3D6DE2A4563A2656B0978DF8D53936C728C3F78B2 +671E7F22CDB339E25111E66AF44DF414EE12268DBF4409B84130157D861727CC +259A9E95B9BEA0D98F6620001C3912E22C2267D7EDB65E2C20680728C4043D5C +0DD01B294BAB0A5AB7936FEA9879682F48B1C39CD600BB8CFEA75F04D937E654 +80225375EF6F2EF5B77857FD79D050A2B20BDDCD94A9B455A09BBC746CF8D5B7 +93D5CEDE3997B1CC75634E2DA7B19788083B68F6B8ADBE69276F0E1BDD33408F +27497492E0624F96998FCC221F8587D30D45E56E5531A730CB08345B9E792AF6 +4AE3EDD27A5C6D8E0F523AE7C97E8481C775922B48E3C91F09DF62E1D41F26AA +F5C72265B567BE0B283D6981EF0AD941619574C4584CF84D9693E0CECE14F76A +594D849968EEE1F0984C7B2A37544FB2EA102B1ECBC8E48113579EAFB12226A6 +CBF0C0152DADAD834A437A3A59D6672E74DEE4806A820477FD177A8967023B27 +1291B58E507B0F68FBBAF99A963E9F90F4A846F627FAB4A2E11507689C4B5EA2 +D0A79B352E8722EBC3A662C84F6A163B64E3CF96C59AB5FE04201C0DBE426AD8 +9C7775FD046E1F2F4FFD1CF5820338C5353506C34D99D474054EF9BC265A260A +630CDCB706D2BB45C343E8918FCC8F65FFDB3655F565554D1D451B416EA838D6 +59A66763C9515B66E20932B41650E01A27E3A250CDD40ABDE0B7DBF60FD08700 +6885C8A7DE9F14F7E8DD6CD85E4370C2E3BC26AD2AA416A36877507DDDBA6832 +58E0A4BEEE2495BE6DDF7C71066FFEDAB5FAD4ED9B4D6D97B70468AC407A9FAC +EA45B5F501611EBAE7CE46F9FDEF54AF912E238315325F664BD295E53A05F73C +5318EAE8D4A34E472776F142C57F34087277308336A511A3A65B4C4CD419C288 +F6E5206D62CF4364C478E9F4C6B64E51D2457CA950B9125D22ADDA4AE08AC275 +8C2399EBECB69E7A5D0E31726E520DC5CF7492C59076B3AA425383A04C653C50 +34E222AE91DCE83E758C1C6DC3005CA2757CA73102F584CD2E799DA49C77FF12 +4911D74BEE8DB74B1F0298CA0A9EA5BA2459056D6D6CAB0A90A68986D492F5B6 +DB37630B7058B6161926BAA0D62C8511000BB7D2FCB92C5922F0519A1C1B3977 +81329801A5702540D4F84385876DA07CBF5D648BEC2030473C5FFDCC29ECEDAE +C3901C5FA181AC12187415086F68D913CE9993D40411810C505DAA8613C80EC0 +91336623D5686BE49074CF8A39E1EB7BEB212F635ED15C0CD1653E692623437F +91314D34CA09C3F66C6C1F11BBDF5F720CA4787F2441B7B9AA47C7FF9EB113F5 +E4E57EA7040314E093B6729CD3ED11D18FEA94D60E1D976C786EB52475293FD3 +C0DFB12695BED5E1562D3EDF6C9A54120CC23CD025D0D3DC32A37C5BD00D6263 +5D2808D9B2E2666CF4CF92002B9F1BD2D3E12DFDB18D40DD52CB427662ACA883 +1190B5A2F9860B20D521E55129E7333DAFAC54ED4783F40A8A7A69F04D7C286C +A52B8F3F608BCED599DBE28AA6F69A0EA54CED3B0A21D199363622352E8898CC +9B5B0355CBB533E6B179220872212360EB718BA0D9EF404E4FA7439891D2370F +BAF1CAAA2802FBA445687E743200FA6B9E85266EFA88D05E3B2720979A43E724 +64F79B714FBCF388EF35E9CDBA1B8DFCEAB836395907A0EBF22D285883B1B3D1 +772E00B255032ABDA52DFCC0BA366CFBCD081156072DCFC3CCB903C305FEB7A6 +D16B59AADA73E1A06073D20392DD17D1FF43C4E01FA6D5801BF3C61887658A72 +32E319AF638CA3D03BE51F832F9BB24920B4E47D0E3C96FB079D771CA5C310F2 +B8B4183CB714383A50E3948F6977B16F4A368C086B2A0AA57C66B30A895B159D +CB63B0FD7990279EAC00F0146D58282A8EA7367BA2885660ECFF69C64F4EEAA2 +F357FBF8A514D1002CEFD82AF39D461E2BE59543321C7A991B9576778C5A7EE6 +34703E9842983E2580DF60DF6EBC642EDEA4A1F1CC34E754327A02DF2E9415DA +08CE3AA32E1A615A484E69E6BBE4A64C2784E27626E017DC0DE42DD71EAF55C3 +E3D15BF87E9727FFEF3A66512C9458E557517BCCA1A2E92191259D1EF91D6E12 +6454380986B17C55A4E631C6DD20E5F87208D2045BACFB6AAF14129108A5B35F +41B29AA518D795C955EB247BAD1D1F03FEC701BA6CF3261EA985A932834834D7 +DC8C65409644E7315D66109D8F92DF5F42070B97A2DE3B69EA97CFFC71511DC4 +24A903C704479F445BE051E96AEE9E220EDFD0934CE793AC43843D88EA12757D +52C10F73BD34C812C1B306CAE0F18D7D1B095B9F5EE76256605E312AAF795609 +94D3FA76A6984C63809F0EB8741AB3AFF516C3D6F8FCD8B1A43F5912A2D98019 +EEC4DD105E77EE0EFF0D69A6A55370771E21851B58AD57332DE44B5B2B2AC29E +B58FA30709128A9862C3579CFD08D85E8188D26EDBA5901D510B258531395FA1 +7CD5E059CAD028AF5AF313AAC4B8BF60966CA2B53DB31F0659898D105FCF4FD5 +DD2B78C838EFC626CB81B32359CB11C5A3E9F8ADB8B1201240E34009BBD2E23F +C624C1AC532746372CD00EC50C92B576AB3D5F086B64119510DB8294D48DDCE4 +49FFFC05594275C796DCBA291312159CA9EE7BDCF3613EB3D962B6967BFE2BB2 +5A9A441DB81FC861B10F910BCF5E80B77F506EC8A64E6ED10839333BFD7E25B0 +CF6FA7AAEC17251811C44031C7871669C3343CCB0D0921BA8A9546E2C052CAD4 +BF765EA279DC4446F1D31ABCB9E6358A11DC2C1AB1CC71C244E57B4852A9CC36 +8309D3B5C0FD91CC6086DF741237ED81F847897FE5CB939AF97C1B9022CCA3CB +227B7C49BDB2FF6AE381E282B42D22BE5C6326A8602BF364BF81FB7367BCC437 +DC971EDB49E8C1AABB29DB90839A1A70CD20DC53DB0CA61133BA0571D00FB797 +13629C59658360CC0472882E8E6F085057ACA3FADEE34BE0832241EF68242F90 +AB650BD7FA6E8EF0DB539346515580E57D3B08BF7F9846911C6779A481D1B348 +D1D0A1265498F0ABCD04D50581ECCDB89117E4889C4BA30DE7155F6177E3F40E +1E9DE1367427C3A1F17C27AADEA655D59CA7B6C2FF4B833442BE50A87B2D4D1D +DB57A8B5C3201433E00728A9D9511A46C3442C3E29F6D9554402A516796E60D6 +23E6D61F0ACE1B60D45CABED468523416532810C10DF9E7C711F5356970D5FEA +FE5D366722FA3F10E097FD16DAA5B68614E7D29636019C4ADC916AA6F45E592B +C429AB5A668E1795DA4F755D74126B6E230587AA57E3F9630715DD6F224CC236 +A5F67B3668261FB2D2550F16A9700B1D997D2801EBBD0F113C47B8A13960775C +6FB40EDF6D6276916BE3198448E020A46BF782B4F02F3B1C85FCBFB2B2F09578 +F90BE57A53B596E9499F9B3E23DE0BB1E159BCD9828A47B3B1256D305D879517 +E172C1E3725C4771B3C03C9AF0B62EA0C5AF7C0D692F94FD1E554E3E52A0E7F6 +835B95866B7F72514098BA1CCE2C3613FCA568C3594534167648E2AE52BE3F9F +E8207FFDABC084BC74DE49FA0E8C61739C28C78CC994AB707C2C04860F0C3F03 +5929D056CC4CB6FB4BC1DE83D2FDF9B2128667B6A2FCD13626D3889D83683715 +131AADCE22BDFCEC3C9B03E50200BCB5321B42D108DEB519A5C9992B2D3A87AB +4725F5DBD2094F8D9ED8835777C2793FAE8FE40F3EC0DBF4F1362A148F890CA6 +FDE1970FF1CDAB096D9355B755AA0D93E6E11E9D3B1F5EAF537E48C401A75C85 +58AB20685E5C29DAAA6A9F90B066E991968475ADEC1F946C522449C0CA2A38D6 +A8789A6871F96165AA3EFB39089D22EE69BD05B4E0853D3C33CC84FA7ADDD576 +639456DDAB65EA50A3C711F78E8CACD7E112035D5D1633819EC419BF5AF0CE9D +40EB6603A55A7A2BDE2D6E9FE476B1ABBEA673B397F2510066D0D5AA650E3D1D +BCC93BF8585AA04228DEC13A6082A5DB015A70FCD1D3EF72A1CDC6D8A9705E02 +662BF3F0F8B318108CA4C9621C01D02EECE3817F9EEE14D30C34EC262CB9197A +377828142C04BA679630C281AE4A02E65604DC7FF73859163F0F0640316D079B +D42F807A41D0D128E010C3961B8A742908ED989BAA0CE2BC9E9C26DD73DCE3E4 +7E31D958F4DE4E3A1B161B2C5DDDE9D1C693745D146C83F807E5BA7E00057959 +F00E3FB89781B4F084F5B24A42113E4B74933CC32A11877B4499A19272B60985 +9C936AED3AF65C3156C8A705AB51749F99263FB2D2DC4F21F8AAC6C9168F8D28 +414A602824BA3EBC3FBCA1A8D29825680FAAAACB6D9B357B437774E6C6A1BE61 +7D146A9BB073E1903B9BE2CC9CB5DF888C51B73C8C5674B172E4BD5286F80E8C +9718FFF592B56E1BCAF33BAA26F5FD402710D27A0CCB1BCEA92D9BCA09983B1F +56701305AD3830A74CFF0091BEEA6C706C3433977E6F3BEE52E77BD7B09C1D68 +37C3A5ECCF06F8CE25F105CF88FF3239DB905472E10CFBFC4A0FBC8F587B1017 +26A6080B364D6C3D7D8988AB1B4CABF6EA6C5531F8A82F99E5B111C81F9C9412 +0C54828BBC82865316FF0D9E8920BF00E1BAA976FEF21D0A10E8FD9837799623 +E4CD5E216ADBD1D76518815FB49EE4AE73AEF9447255A99CCE4EC068959C8D9F +6FE965ABFC53DD09C063BFC80BC1E6463DAFBFD673262840CD9BB67AB5CBFF2A +383079643499FD42FDE13BE2FFE2615152FD8457A547FCBE2C1CE0691023CE42 +3409A9B2B8FA9C4280856899D1590B36596B93282128E6AA6552B8BA7072E603 +FE13711746B110FCDE142E497CB2B623682A60F888B1514F7CCBBD86150B9DAF +24C9B763172C14BB79AC1F8AE60F9847D9223DB0ED5F3B74362F4AAE3D466311 +79D35B1C81A2C48205028BFDE7BADFE708F104A2C41CD32BF8348E206E251EBE +FA68EEC9738CF3D3462CBE7DBE7F725054F08D6B9F1235C525F8E84287381A20 +10D4AC542CB292EF20A215A3BAD7CB43686DD5675663BF23D89E860D392B6FB4 +6D9021EFA0FAB6E04999DBC8CD3E84D1C751B8D24B4DE92C8A80E23488882F09 +D62FD350C636F73DFF5894861281974195F6BCE45EF55DEFFB318001CA8EF32F +864DD1459613772E6B23AB6B68769846BEABADF07BCF11D78E26CD09E76AA9AA +F5F88F95AD6EA652C8E08D1A7BDB31E60B90F31308E223B6B8262A39DE23BA43 +EDCEC76D6C8D82622F980DF095EAFCC83B79C206A314D4D83624B2617BAACB58 +304274ACC6BDF5D2F0529FCB76E9B5BC43EEDFEB149D61CE36DD4672F80A8659 +331AC6DDC433FAFD85BD5A0E404B878B2A34BDF8EDCC7E9E9147219C37C4CF50 +1D48B7F84E95074412BCBE0C060BB8FF5AFA81D3D8F0509EB8D1B2950F5CEADE +51BF7B714B9784C9A6A91AC635C09CAC5BA326D1F5C52A636F2C6B61BF079DE1 +47815674304950E4D724D68B4CAD2B8E641DF1C7B6F7587D258EFE9CA777E2C5 +CF2DE3D47D6EC50B3094CB30EDDD1B31A58E8915A4D92E89D0550D1630E7D47A +5930E1A7F582DB33E1EAF7B15E665BB214F62D336F4D90C6B8F467460BFD411C +0296ECF5019A05553316BA7286B4B9B4D892AF6906FCE7241AA12A18C50B6168 +F299DB45B7DFD3AE5DE34753A0E497B0D94B0178E66D38B494F850BD820D668E +9F3ABC7142C364D5E26345C6BF93B08B0CE0AAF87838DB65834DC4117B3CBD59 +5D315844A0CC89757EEC0204E2CE0F2A2248B860FF1DB439294E9E107E2560A0 +B804AC0CD639E314BDFC7A689BFD77A81075EB673A7C818FD97009D0BFD4B121 +46FC748FADD2A1CADA10A04566049FB6E00FB8B5C928989FFF0AC4A102D00693 +0FBC36B9EC7098BFCBE62E49F317267F5C8FB541B73DFC277DF4E8A049D09835 +ED628F1736AC2E6F4BFE40AB17554271671A348C4CFE13F58D0A5B2A7C3D83C9 +EF2ADDD7A6B674AC1B96BA31A10BE2276F45BF27344636A19E09D78E56798DE6 +774D7FE7BDD3C18770CA1DEDC5C035E4623BF5317F724BD8EC0324BC1881C437 +4EA69508C35BFD66D768A0AD744D8978DFB3DD210D5629A19D6A70DC8504C49F +CDD35E164B973CFCF36DB986C6C618AAE4C58D32E21188F8C5760DDBFF24C3B4 +F0814E471A0B76950A8BFBE86DBEADD5A2662B56A078DE456FCF8FCD25164140 +694844E5ABF924CE7CEDDBCF7F4492AFBDE34610AA5B54E6E5A44AF50F0E5464 +877D6855416CB8980E1B114B6F6597347C432F2D29E4714A6BD4F3FAE8FEBAB5 +551802BF47867563FEA5290BCE8022DF9D293FA792238B7F00F84E0F99163B06 +744A2EE93224CE855C72E1FDD0E52767A30CF3F0D451081EA69D0A80893FA79A +1D25E6F56DFED691E90393FEB1A97061FC3F2BCD4BEEF1C6F56A0514EDE39BA6 +BA4583B7FCEA404149425F6969123B3119AE25DDFCCA3F2F672B98BFC0C56907 +DA2923A73A30B8FA2377F36620CA0392651CEF036AE31F1E5FA9B2DC87F2E8F3 +B1964898A76BB97DCC8C63101EEED39ADFFAB3BE571AE0210309DCD4E4346868 +DBC33FEE28431EE6FD3D64D570E04C269F6D905DD391D40FF03CBEF98214DBD2 +2BB4638F41793E842B07A9CADCBAC476A6FB9EB23795150785AE1032FB16ECE7 +3DFE9AC0AC961CAF16B492C79B669A9F0FBC7F365BFA02C3981A324E047DF5E1 +41D2E85D6F472A6BA1D1CFC896E3DAD437689296B2DF397E40A6102493D09D29 +06E359254F761F3E1E3E66938270BD46C6DD1EDBDC60CBB35C47D6760B17B782 +76F6F472D584A07146C19846AF187267E7E1635FD04F311B7E70C7A33018C6A1 +943388278E04542E454FF117491AE7B56F3FD5B01A31A89F85ED680173087E8F +CE5365E1CE48CD62DB5AA71F4C2369A09BE3B0C134E550E72AA7C299FD3B26D3 +8D3D744758A87ED77EC946914B8EC92136FE4884E30B545A2CDB474FAD36B557 +509C986F87D992FA39BA7E8D85D5EF322ED08B1EA8D90B9E391D47D3FB2A3B9B +CAF230B61E0F987282BAF6B10CD07A23E3468BBF814EA995AD6224FD4C919D96 +A228947D0F2BCBF4B189F1BB9D2E1D1EF59F20CD6A045251905C39431C548318 +9023A4297D0D21E380F93C9FFADDCE951D0ECC25D8A4967447438DA572CEA724 +6B7743FB7D68783CEF142E50212C166D2983DB08B1EDCC59E426B4D73716B920 +A14805FF0FB04DB3F7AB70A1068CFD39DFE12443ED4E8BB832DF520B0A750139 +57D9A8F4CC6AB8935A3C01858A8ECBD75F740652DFDD752F4FFCCD4278ADBF75 +C27537AE1D759AD75B7BAEB3401925949E4EFEB1C20D441996D671C51D327FD7 +FE05253BAB53DA22FD071BDDF4DC3A9D7BEAABF49958249B5AF68B88D96FC333 +FE7D8781FE9EE147E162B0F0B487272D44522D8FA39842C472F9D527149CACE8 +AB0AB0E6E2D88C03E62AD7F6BAEB6E67C8EBBC94F330EC8DF632A5AD89FA1E9B +D953CE17AC117024A9E4671E5FC05FA194D38BCA2737E73D079881BBA8BB78D6 +0F72C39FF3F87C4161458CD8F6E07FF06312B5FF9F157014B545F6F1F58488F0 +E64494C390A6CEAAA53576A32D53CB5B51563344002931AB82AEDD0BDAA963AD +902B6AF937798843B5DF895CD487402ACD82BCC95D10FFF93F71FC4C93B737B5 +FBDD6DA8BA8AC357620F0395252BF8D626AE942B759F18D26C4667C67BC43ACA +FB4240AD7DCAB1A702E3AD59138A1B958D23DEEDC8F24D46CC0FC6B58037F447 +45A537C7B8CFA4D8494E737358151FF023B729C6BD069F980F33D5DAC4E278F0 +FFD91D253C9AB617CB9546F992615C1647123D25E8DC34B257FAC60B9B04B7AD +AE705AB62C31BB5A17E8CDB319B7A6601E8D3A5D144479AD66ACDF016B351226 +80ED7942FB3E3CE3EA9C19ECD870DB4B1E616B0B8C5DF42551FAF463FEF88527 +0367D3C5C0B8D9CC318324D3722F36E62EA52C1C7340A4756C8F79CF1EAE7A54 +66FB610907CCFA40C9DF6C64D2AF33427AC1E44A843D417C2CE47E768132454C +42BE3CCB830D5BA1D535E0E0A58D1AE992C552D3C0C1A468C79438247FE04119 +7D8217AA8E7BD66DB305893269F99E48A3248DD33444CD317B6B13BC7329F9D8 +50AFC5BBCD7F7E8A625C70ADFF0FCCC913945B53DF83468D72931877B664595D +1189CF5E16CC19A1C4B0C8A1B9861593F722E654DA0D166DC93C7DDFC391F223 +A9AF93757B01526FC9737C7DFE7258614F23E9C3FB8DAFBD8BDAEBB411E6B106 +280A4CFD7371C884D1CE8710704751B639ED78043DFD06B0CE0EE061E7CEAFDC +C442688CA7341531833129B28B6A3F012A60EB39FF5CAEF433C13C60A6F1DE5C +C2E8384E7708B86EAB25E29B10E46350E3A0A01F09F3A1B09E79627A2B66F6C2 +7E5F1C526FCF92AEF1399BC65C6D6C9E53EE1676A7BC66F41F6C97A8507615FF +4DCF870DE5CF27265693C26AEDE7684882F920B5A37C98F5B3963013AC586135 +B5A5FC99B222CF400D777EAED21F3B0B5EB3EA34FA5333EB5478D17AC7AEEFDA +368AB0CADBDA738B602D1186D3CAC6D79ADA72D2E1F2EC7107D607B663A9EABB +ECD6DB66E5EF29F60C54928B28A0BE531AEC484EB6B43237652F9756C8C14B64 +FC229E9CF2CE82018A7F05694FE9234D5886366E342384ADEDB53AFE5CE37222 +F00C4B60A4837F6D2B04798360D2E84ED5EA7A8EAD38DDC0C1A30595FEA4F2A8 +E1EAA5B4AD4C4931B17A971F32A07B9D48DB35C083345DE2F74DC9ACFA988B3B +C909264AD0E95EF95E475AAF7D3681B4298F24854CF9E93915530BBBFBBF715A +0D6E9C83FD5E0189D714E5BC01BEA29FBACF253A0A2C07D5774AA8ED1E837452 +1DCEFCCB4D39FF3B748F1EA2A3A02E3E9562814340CB4D01643745A795FF68B8 +7A49AEAB3F795D2887E1339AB5E58E97CBA70D62BC844EBAE6CB0D9ACCC55D0F +22CAF8510023FC9ED3307A31747B1616A87026AF5E8B7A3882041AA8F98C7FA7 +BD28891EFAB5748F93C9983ECB6EE46C525699FAEEFB24BE1226BE84BFF7C967 +0C2826527B4152ACFBC75CA8AA608C83E650D1915292D51555311AC9AE837E36 +1731A90FC77FDF52CBC5E3941188080B792B57F98317B1FF61E92E6B023F531D +7BE4F036DC3DF11711ED1FD118CEDACA9A550CB846E10C93BA7037676CAA105B +33F600DE469E5CD1768470D8A136B0FF623931A8E0861D3A35EE733B529FBFDD +924A21B496489112F6D210E0E4C98EF989FB07DB5B5FBC228A164358B3F2411E +3C2F24585AF5EFDA32325B466010F0273C2FD0907F87B16BE8039196B28751EB +F6DD29A4F455CA05496521A74E3138987C1C2615E049E3E5AB14B54D6E2359EF +DDC13608EC4B7F0713796C312C08775747D2275EB26FABFA3371F05DD11BFD74 +3512C5FB8E8000D09E05F6871B0860FA88E24A7C5CB61CEA9E3A112C53D117CD +6B89CFE96BD9EF0A6B9A24261A8BED518CAF65F0797D6CA6018BD6D5598ED7E2 +148431FA40639E8725FEB6E10B48DD8B035D57CC0E554877363DA6205FCCFB5C +718323B7CA09015029F7C3253FEE03D11022673319FE9FBF54A2F5261C4DC16D +9ABE661AD52A63710EF6C546A3EE8E0493B7B5808169F2D86CCDD826CD7769C2 +65C9253EBDA76C1DC6A431750B69BD3626CEAD87323BDB20189D09E1740A63D6 +C9F027088E51A5EAA2DFD8733AF1870214AF25EAC63C9F90A55E379BEFC17EEE +61F31ABF17512798EBC9B4F1C96A58B15238D3B5BE2BA97B48D27160110C60DA +40FE2FFD4DDFDD4161A89158BEF42CF9E726D5797C91F9FC76CC90D24AF59CBE +60A97A6494F32B95ACAB0D59F24703A2D1350530678B40D66238B4BC48110DD3 +A880FD437C78AAA94997ED8A49083B9CD843937F4FCA9739F940778EED9413A5 +80BE8A47258282C2337E630F6473CF9022011F683B87A8EA0B02A343AF7C896F +F4B8CDDCD917248E37C0764BB1E1DD0FD406A0D80D9960C6C32A81E209E6478C +ACADC1404FB84BADA418A5F950EFF6FB47B6FE500752E1E5923598A97B96E48E +9417BCBEE2F698FDDB9F5CA45568234525CADE3F3EBCA7D1D36DADCE085F2E12 +B6C6B26E3D70892486676191C73A7035A6E4F8124548332A0354457E2B931A67 +7E15A1DB1C802DF3D27208B0B1C8553ECFCD9B0CE1C2F950E26708CC128CC965 +4420238882E48BE71CC52707EDC8DBFAE2563E66503E74F3B71C0BAF3872592C +AC12D490F998E2198C8859342B3E769281EDA05289F8A3A4C4399E6F427ECD18 +A8C6281497751515282506477A9E0553B6ED1AA8C89F2EC6D244267BD358C8A7 +27725E0D288A0344D21ADBA5E498898A284B3A5F2494E4AD056DBE7461FAC6EE +0332E721A7F7E2058C864E02EA3DB74E476A1094F00BD5CE8D85E0B11E150C9F +95D584C11CF6B285E4EF068C533FD49017A51291CE497F6E336577EEA1C39E67 +A19C2AE6E8EAE3A8658E8174D98289DB1AC6DBA0EF27F2598F35E47D6B94C8DB +059AA1D803A9EF242F88A7993872A141F97D76B3572CBB811F34E066412C948E +7B7B22AF31C9030E333A104DCD5F29E649901D9168E330C8BD4DF7E50141408D +267AE9599099CEBBEB392A28F74CB75802B4AC5DC979A0FCA75EC11F25DAB3FC +67DF1AF2291A93D469B3278A2DA9397B018024125A974FD7D79D149475726085 +02F30E996960097F6CB908C90E5EF127E5D2543871139A7CB94CBB2A5FCDAC6D +755A60F53344570C9846812E6766F1E2C952AFBD260D252129CB7C19821AD057 +2DC1737D49FB047C564C4809EE21B6899F02916D50CF72DC0174BB5A75A3DDA5 +74F578245AE90CEB882AB4EEBD1A4533D922197C400A2F651C1A6C5F4FFC17AC +7AD689F45B1722BECE5F648584C778C96FB1C606DE7E7C6799964BACDFF5B239 +A7D25397BDBCA2DC06B27246728A6A6DF1F5EF6D8677E6DC2459472211A35500 +C8315B238FA5796C2DD19716204C9D6FDC7AF0419A8C3A927250192E85FE3D95 +924C818C60F4234946EB58C7CABDCC0ACF82601468F963C968209AAD57296D8E +92797D765E68C6B64DB292C1AC7A779FE7B671D505343A2D32D0898A1D90E000 +EFAAAAC89A3BBC3A92B7224E831F2132824875BDB04C318B018B49009FB4D0F8 +A41C484ADE005751538675AF75314008C6F45FBB3B6B73E80D223935B9D7107B +3D2B8F2D967D7DFCD9F2F9EC3338844F5D1F36E2507B2AF6F33A495CD6701B1B +76630A10878911FBDA1E8590BB83D5A59A5017A0566974818686187205D6C1E9 +4B8BC41BD5CAAD046F99F989F3FFC38FB507ABE17C03B466E423BE3D38B5B659 +4115B2527B2D3FBDCA1A2944F5C107DFAFA5B3FB0BC6536806F5D9BE46166CF0 +F84D3EA7F0E5A904295F84E63A3A08BC02B75C33507C5F09412242B348EBEDC4 +7DC51DB5D49526AE4344C51EB3CA8CDE0F11F9059E85CA54122ECB587BDC5A3B +7EB1B5E4886F976037B0D1131D9CCFE5656DD9F88D7E5B099D4862F78B30A7C2 +02B3ACA955C31742B0C732D84629D705F3C40ED57FA05C368EF688D075E57718 +6DEE8CFA86CDA31277ACDCC66A23D0656B20BE6445021E16DC406BB68D548F3E +1D2CCDC247B2A9171FA02878C108EC0FA6AAC271A82B8444E714360681676A9E +2E30C41E9A40FFC67C7C9C7FBD10AFA5DA7C228A1697A090F6781F2E75C528DC +56BE079C98DBA4D248DDF9AA7B6C52BABC2B66218AC0DE509F08A4FCA26C646C +9972C2CEF664ECFD1D924B5D5D7566A6B859499F6758CE7B762CF986C0736D80 +0B4A4298E5EE920AC718C5B64D5433FF3F9F631E8715ED604D708556781B1539 +882DD8627E2FDEC4B216C62D4CABBB2F115CAC56A5D93EF98E30D058EE634DD9 +95D5D1AB4C42680B3635639EDF9A52E29B37FD0BB0478E6ACCB4C7DBB5F9C428 +755744092BD250A8DDE731265A110615C300DED7F143D52417377E90B91FF8A5 +BAF6324B3EFE85B2AE0423DE309A36A64E4369353E6C2603E802ED31B56E318A +8F6D19FFCAF6627099C0E3C190CCEC20C4A7DD4B47816D529138E2694EDF54F1 +867F0143A444024E0528325ECC148D779F4C98C06FE9E752C366416044EE3FAC +72D8AD35D89400B4F00286191C16E16979D5EDCBF4FF9EC868D6E3BA7D98A83A +0710CD1AAD878778C0A4F0C9829723572B4DF407490D64B5C49FBC047DB49F33 +E824A4343825D756D894B41EB70093103C35FBC09FF55931B81340666A0B50A2 +7633105B04DFB6386ED196F7D540ECAA058C0B44E89141B68CC41FC21BB2C4B4 +4B13E070FF953B88A70B3880561FDBBF309C68F5C159D90CAB88B04CFEA0F33D +A48D289473545DB928964A1FF97B90FB16C449A27E333B56A1E49386AC738A91 +105C3F6DF518A43C97FDC345F5553842D8BB735C33271A8FC7E3BCB3C662A375 +53B8450229EDEC6156E41584971A159960569DE8AA7A959D328CC8C8ECBC0B11 +DA239FB55CBE641B71150154F8A9A8A128F8B58409791B88AC57AECDCCEC9893 +7B3363B091289345EF59DD66D83982931E090B8F2A8CFE8F46F3978A67E28047 +48A7C711553E9846164FFBBCBCF505F953132F546583ADBB7F0A9EF02A6C3163 +0057C83CE31709A61F2B9B09CDFE58F02211CA00C0672CE30572CA53BF75538A +57C1DFC3E44012F882BD50D4A3ADFF64D8E09ACDC5FB80CABCC56102C59C5B3A +8E7D70F350CEBD556CF6055160C1DBCA6411579F959C873E4149A3FDE8836252 +FEEE3A2F3E8BAABDE53FBD71B074FF5F26AEF5A6663E2117BE561B21DDB5BEF3 +73C1365F9CD57FD44C29C00395B7CB0F5A4BD22AFD390421EB238707C3D18BA6 +C7A1B0B95ED985D208850AD1BB88103E7A7837F707F0B824BD1BA350896BC3A9 +88CE5607050B136104344B3C9E999D4299546B7A107E5254AEA34E3DB09AA599 +CBD028178511FF44D04C530ED6AD10EC5C41178CFDC71DFD30B1F856DC2A4FB0 +CABC0906E7682033B43765B5F59F7604BBB01A7D660C3E5BFA8651CFF42936B6 +22059C2BD479060AB78AE53CA8B618F1DD65DB73F507951738DDB94B1B2898B5 +9724D93F9872A79725B86FD72BD7CC1D53061F8B55D3ED5701D99CB24F3F7469 +5D456C51BE9D32D8F101E50CE4BEBF5A8E97EA0580046639EBAB22BA25A69EF5 +D80A9854ADF2C2F754C35F380F72528D1142EE6CE628942F3F98C26EBF5A75BE +C8F6DDCE438A2BCB35A51DECB444570E36FB2C4AE1AF422C91AC39A18DB9AFAF +BA33B7C945743E2EECDBB82C10510C7D8EE5CBB80AB3036F259FF0053E1CD954 +650C4359157167A10C67372C068DB33982CB1101757966FCEC872B24CCD65E0B +E1CA44F1CDB5B42616DEA1E07FE6038A0FBF4B1C314FCCCF8E2C8B96389BB33F +978440D27041708AFD22E3E2E3D944D152F9A5F2E50A08BBEBADC84A7E0039BB +4651884B79D1AE90EF67AAC2A94BC1EBBF38F7E4B3FFC5A421EE7EEAD34CF658 +C89D114027B859850874A5FA5620D70BE94D480EF1D2069F64C9E70C669496F5 +918606F17D2B02178746BBD22FB088A7354A811836B7AC7CF69964B01F7B6C38 +D97DDCFF7F2A5BAA1D509D5EFDFB82E5EEC29F2F12879510790882D7A6554A0D +35394CD4CAB3E352139B4DCB9EB2AD2CD31E9717FE5EC1A5D0CCD89D2A6D9A55 +B0DE096EAD34A9170CDD32D058DB6DA9DDC7A20FEAC9A351B2144C9CE7CCA732 +7F13742A7F0D9A1736A857D465EF44F316F8B165E30106CC22C5255EFAF1C02E +0AE0B448B88CD712E94BE503D0424B6D2E42CE266D35B246D9C92DB1032E372C +FEF9CEE8853617CCE04505671F6A2F421B8D86C775BA10ED922C06950EC3F162 +888C5E240F3A4E2B8A1F5584EB8A5C86EB099396D209DDDDF6239D612330484A +7D1578FD98F395EF6FACD488B64C4BC127C129260C4577A5FEFE60FC476AD32A +FD26A711ADE1F32F869172C4B770C0CC0456730C5090A39B81CDDF7F43189A41 +A830E3D0875FD39EDE7BE3A37C5DE8BD0D53B2AEC076E977835BCD177D55B487 +ED28D26B3CEB6D86BE909C92C4EE1D7BC27BB10439A27F35C405B76B79C0CF98 +21A58E3E4015E50CE027AB45E1B1892AD44477D37E09AA6CC12065749339D505 +D96A72AFBA6A6E1390A6F01849D607E6DF07B928A490A424017C9E7199573F6A +8CD3D62355CF57FE164D79903F81679B4998AC7A65DBED69184906D6A6AD7618 +A93DC4288D72AD42116CF3A527E6F6958AE02E2AB2820C4C8235DA5F8C161D62 +7796C9FF711917AC9023CFD7BC831AA847281DA84FC40DFB8532AA9A6E24118A +F6F0E95313894F71754ACF52FF8AB3C9E48C811D5D19A0B686B8E1DDB9E3DE55 +7669F0BC5BD721081891536D9FB45D5FC6058F768007EF51315A619EB93AF0D7 +74DA6F7C1F0C419A0B623A2DF8AC5F81AA66CB8EE50B69CF20B7CE88282AC1B9 +6A758573DA78757BE583FC05245BC6457EA6D1073FBD3F3F506139D493E56B05 +EE5897161C99CAB23AF97135F18C72D6B0F9802A339E3576271AFC00F077075A +3724F96F7D1904838BD92DD6787D86763B553822D81E63ACB53EFAD31981B71B +BECEDF7DE2AA12ADBE30A544CFF6883A0869631F70F36D931E1077F8788627D8 +AD4868D51502C35C0C3697C811AF509C526689FB4F8139772964F414C0F5B120 +37C04E77902A09414406E447EF46510D80B5BDD17B712A5137869B813F673C63 +988A772C0B49D04118B5D5E5F8D07FEC3E8000FA1FCF06AAB49BB73791E019AC +148BAC5E4269A39347ED188848E503E0C04E548D4C5E0D1FD132A3EB91A9C92B +9218A29580F6A99352F46C747C29F87EEFFC7912B6A60426BEFEAE7EAED1AF22 +C757AE1D228A336D999E620934AE9D1C124E4190BFD280B24A40E8519854D386 +8A6140A79F2C1621D94FA49B4B869DE236E51FCCBA2600BC7BA951EC067E6759 +C4C616BA9F1AA22C72DB3759A24F77B63DAFF16785F0AD51B92DE05BA3634D4B +941AD4E19379CD165BC655EB7519B58608935196F2DA9F17CC2BC1238781D29B +EAF0FFF3CF529CF48890C17CB1D97CE95AA2BF2827B43B39C8C61FD91E7BFCC3 +85A92AC0528C12123EDBD7E9B1FE798EE0CC8967CE01D19276E8BE4014A06868 +6CE0F5FCDE2256B8D2FD077945BFB2BC23342E4EC323FA864567F8867AAB0196 +3946CFA77BD98C46666D80D4C67808DBD53B407E80CEF7DE3E9120E2AF3B27CC +4F3201027C39A296C1406FB76BCF9E46537DF1D3409812DDA774C146E135BCBD +62E1EBEF09C3472DC0DBB9CE13B31D15516B50280B3C09E9F6EDE5B05B8D0B4E +C7AB274068D129951FFE53FA5F0E85B5F1DC12382F11B5225FEB793A1EEEA45C +458B1EE64C7E2A787674140AAED80C0521469C3469EEC92430A9E3ADBA3A094B +73A71FEF38E2098E4B882D171524BE3B4BAE4A568846BA996347E728580F6AC6 +EB4CB545123E55D0EE933CF9CB63EB60EDBFBD3E972B544477AB4D68826331F0 +4F8AEFC29ABA9E1D6EFE807CE2D7E8BF254F153B3C9BCB6507E89B97158EAD5F +4224068DA7A1686B8DFBAEE60EB405CE71F71B4872D396FCDF472EA4CF3E6E61 +7F35278F1E7B3ABB2714E1723F5472821674C130E7301D598A6D1CB33FD3A94D +35F73E34AE11BFD6070CDA2EA1C994C0AE4304785A70A38622C09D47EA08238F +7E497A635032592C8E28814D114AC8D1B9FA512FE66C692F75E42B67E51E18FB +3F642D14C8DC0DF74FD81A594376BB9B7DBA9B4930AE048E4344476943D31F24 +35FE5CEF1A0BFD45EA5C43BD6700A38796626A1EBB23A3BA4B7C64E1B145FF89 +E1E3CD5F27844E66E9868F13526D31B87FC9DF2676E7ABBF3176CB2CC698BBC6 +23D39533FAEF149531AFB05826F48BD2CF8CEFF48FDA67C72EE1F32E41745A79 +C96B8264CE368E6FD3DAD0CBB224F8A9525C6FD720DEE0FD278EF36886ED076F +EB24D1D8B69C456A9543F4543160B6BC57D0F396BCB5F416EAD863C35BB5DA81 +B218D99B5CE34FA719E6C67CEA1B25DDCE2B019208C1DA5D9C105F47A382797C +A73AAA78B4F33F509E60BA34B4D5D55756639BDF4761C9F221B09866291760F0 +4ED5CC9406061F7FAFB0B6F93796F64BDC05277FDD466DB850B5ADF5C6E293E3 +A6AF3C0CE77608F2027BDEAE4076B776AFD67A7BB7123A1F2F1F95609779BFE2 +9C1E085B68A4C444EAD8ED8E3E7F08CD5F90D12C96005EB144157FD1A85F7176 +3090740FDF72AE20B73733DB0A0A9ABAD612F6133F77DB8FC48DA198D73C1CD8 +797C02A00B9A6343D43D1C0B392047C71EC1D62B5308B76936F64EAEC52FB0AB +A53516E6BF2189E657E6DEDF0C680A81282F877B0DB2EE045919FAD21BD4153F +1E3B07E23F7C13B55B47B85E99E93C6C64D7132245FD325E9FD9C6760C01C8DD +61930D6F4BD6C59F880CF11C3F1588E72E98F80140F43DE93ECA43931919237A +2450397829719ED4E34241D30FB4F5C8A85B1A85FAE2305C47550BBB555EE76B +DCEBA951B61B0D3A7240B105695337170A9A56468EFEAF599FEA0CCF01A2DB84 +25319E635B3EEEB2B1A6ECFE58E2E387FA5996D311B87ADD09AD373BE347B291 +140162A7BAA5CD747ECD0DD86807449609C1B86BC5CE2A087AFBA83091CE4B0C +49E6C7AE1306511A1BD1D4FFE475FD7501461D782745128DEE7C1BE525A3B04E +5208CFC6600196DE9ED2E7A7E20E20E29CAF5019130609E1D3AFF1DB46E12579 +1BCCDCDA2A43E93CF68534225DD7CBEF77AE71AA22565258FA39AB4D9448D462 +326182601922932B23CE0E2567E30BD47772A11D59E2CB15B0BD340C0657B465 +733E5D4BE23D731F0AF280EB827526F9050776DD06C6CFC96318E91F821952E5 +0CE9F613F0C595C55F7351D7D4114D9611AEAE733A45A7F6645166307E210930 +0F1E4F7A64B77EA34F19A5F52445EEC38EE28EA988EF3478F03929AEB7ACFA8B +12AF9CD3778F13FD2ED625B825053F2E8532562AD65B4BF0C2631586E30FC27D +D2B5830E9EB43090370C658E1FC9606BEF5FD9CACF8FF8C051EF770B95C419EB +1E21C8D10456ADA6BDAE7069829B6760DAAB8F4772B7FBCF8A96F691BFE6802E +F9EA5F469758411B191623A09A49B22E042310EB212894282C023852E11D1001 +225FBF626AE3FEB4F127D055FAA2F1D6533FE15F30ACDB50FDFEE0BAFB1D4CD3 +FFC9A8CDDBB834E06F0A2009E96E82EAB4364D42897631C46797394A1745A3A4 +45B2551DC83AEFFAEE4B19C824C88804C8789EDC04A72079561B851853585AE0 +E4DC3FE1515E0751FFCCB8747E05B3BF7DEF41CA3B9D17D8A3452D965E7F1F0D +1770F771EF9B8CEFC746F42EF799828CDF99643D61F02064D472E5CBD1F01AE3 +027615C852F4F2455711D642C5AAFDBDEBB87BF4389897DD96F463964E84BA09 +75778F0201C395B006083E068C1CE5EA1725AF409C9A0C9AB1DE481F85511594 +79A3610A5D62625D9177B7DA0E2345FB16178DB9AA58588732C48BE70A5DA581 +EF630C04C61499312B2C456A5AD7D3EF4B6BA25A17E8990B9351A5232F783D89 +CBACBF1100EB449EA090943C73CBFB94AAC0D8C675D84284B83B4871F7F1F37C +549C0F4194C12B2FC3E52D8F89FF2A8D18EBE7F270B786500B3238D7D8100CC2 +613EA077722458508F6DCFE09A5479D450B795A1100FE3ACD3BE0EF191BC1625 +729369ECF1EE49693310F8A241EA75CAF7E4B2FE14A91E9F0C13955496FB03ED +E8FAC0DDC571FCB38B006A186E9642B6EAB0A7CE39B67112D9F83651A6E9DF2B +9F6B6046744A77788DD927DE5C22FCC918C93C7B42C834391F8D9AC89A2D20A2 +1D979C7D6238D4D8E28946FE336A43402F67BE9FEE64B7AA3F4624358C09EFA6 +99FD5B78AC68D5E3F1854767BBD97701ECFE92107F6E51F00D0245484732150C +C33E963DB666494C895F05BECA73B88B7043828D0637B3986372F28F1DB8D68C +0CB56793D0FB42444AF9F77A634923A09102AA77F2A5A36330E8B946806E57FD +47BC5B0CD1605E564AC173D7F3E1E19870DB668D87CC1A2BAF539925C1BEDC28 +ED5870BF8BB79B0D31DED055AAD85A6D8EB98D1DBE04F10FCD01932867FE787F +1CF53587378BCEBB146135335100E2251577F42387DF4517DECE711E8A65454D +FAF19EFC6EA9CF50A4FE3DA6E4902F895702F860AF0A82D47FC7E7C4F3FDE9B5 +091A7AFE227BA45E85679CD34B38B14BB824C7B499590C9DF82C7C11B36354EA +F2A862100807308908B088EC066B2B20410914056F121CCFF70EAAF9F8C37D31 +9C09832C462EB0315DB838D2E2816528FB8391213B9CB687ACE34E6055512C6A +543284441527EA2AB308D7FBB8BF137D201042117527E548909E3951A68925A8 +1F741254040BC520FE89B7F675EAFBCC1C2EBCC6F55BAA59D211572056ADFDEB +3CEB28BA5B9987C4E5CF15A23D558815AEBA5D4EFF8B04D2B9A07F9EC3195A8C +BC8E5E8422BB1150444C5683471207E26BA7B42F43583DCDB2868337362887F2 +8947C359480DAD443D473C61C4AF2E6BE2F7BAD06C79C102586C325EE523F000 +334B1AD5F85E52486C07D5F2B88CB36D7C5E61B421A67F76F1705CE79FBCF403 +FD73DD06D579EE0891AFA8CCA2002D031A2791B5747BE3FA9B7053DA6CB943A8 +8FB3D8DF855C16A641AF1B9E0FDABD84A5074B583202A8C120405C781F2A591F +F44D17300936BF3C77591752E3F3FDC5C448910A7DD21F2C84F1D44BAD9C7EA0 +2C29193B42734103C2EE5A6A0A6B3F9A668D0E58B7450450290C4DF4AF6BA8A4 +EBCFCBC4363ED8209DE73972FF2DE7872AD38ECF92393023354BF50C918F84FC +8EFAC13B94DF583EB1F6E02ED73D73560DCCA4E2F1CE8A7EFE29988616867139 +FD6636485328F32F2A9C2D1A26306936ABA671225CE1685FC633E98F198AC865 +C0ECDAE559DC639FA8D0D9BD2191C97317C07DDF2BEB1B8E6B0A2F4DB30B11CC +FC7CF4D9EB529CEF39C017E332079C03FDCF16EF57F51CED595ABA70EA35E643 +88C4313F914D6888DBE345B1E5B97DAA93CCA097E330D3CEE75B91B36DB308BC +EB676516AC72507CEE7469A7DCAD6E98000B1E3C77D8A4A4A1AA3C31AA384F2D +2BD50F44E9CBB4B5FFD65C4E7931BA8930920680537920623C80A06AA95EA0A2 +DFC56A91E877CDC9E57A201BB933B4B15710CB4C1BCBB88AD119C273D9238020 +24DA817F6E77BF55F12E9F61A1E0D2A9DBC432E0827AD7F023F1DC6C82984F68 +F6F778AB1DA064EEE453A2C148AC1FEFE43E20392D59BB8898459A11D71F9713 +610A22F0DD1797E87854B0922FF58FADA2AB26FE02E9D6838D4470B8E16DC017 +874787097C64EC851AC4BA343EA6D9D1E0442F0A8AA1D6AC71C79443563B1BAE +B4B159333392763A0D17962080B8243A4A6F11FEA2C8D5F4BBD4482638854019 +DC1BC660974B96EFF9C01DD2797B1E1C8E0CA2905F783B042959701A74AA8023 +CF44AD6A3C0B7414D41BF9E330C0EA9230853322C41F8A40E782AD8F4587E647 +EC3943D77A2ADE03D8FD096408B4085690CCDA8AC71C6C11AF690D8C32036AFA +4ECAB5C1F31B05FDF26CADEE15383EA1BBA59FFFE6819D3155FFF76BDBFDEC24 +5BE59C61F3F0D704DD0862546F77DCDBCBC313B354481A9D529C4228E0E43EBD +1BD15B94876AE370FF835434A588E4E8757025F2B1F82CEBF20AF28ADB8ED79D +2412535DECFFE25B2109229C9BD3AC9A06BD241F9284EE8FC77096DE5EE21BB7 +7A7162D9AB3D2CF6C100D66BB240E43992444151A9ACC99D10B232B4E400DCAC +BD38E0FABA6F475E6FAE28448FF34EC8C1656A1CBD27CD6561F9BFE0FABB1444 +2C25908CB3D14B664B3E9BDA6F0EDC8D933FFFEC2CF1A4074FE4CD3C8E72EFCA +925FB57C53202E5F89D8CF63DCB5EEDC1AA68D11F263359B84A3D7F9AEEBE5F1 +4FF089AC97F1222221437833F33C06166B8CA011A5D2F9DABEF2750CFC00DE12 +9D26BF74021ACAE3AF901CAFEF6BBFBFDF7A496A73BC1F495D0F8AA6979EB23A +0E4936B95B1636788C8937078CEF6AD30F0794115E019D187C11D6DCAA187303 +706FD91D652D41AFB4E012DFC5A0F78F435FCBE98D433CE9C7DC248106C5C763 +AAAC5FD1DF5367B41E004489C01C5FD3AD98B8EA7FCC66E1B552A4B6FF2AB13F +93AFDA81E74C7304650C1CC7E0162AEA22A754E413C55D571349758D8AF0D508 +9324F516E8D4FE7CE7D0C2A574E959AD1DD3CD001E95B429E4FD1A6CB65A6133 +EC9893F1A7F476481D209843208146D10F9A4F0AACF2A6DCD4462CB4FC9D926D +D5AC6B561BC9B0CEBC0CA2707AA010C66299C1DB237B020DED71DD7D80C47732 +9FF3A32D0EF7042C4021585BBC826038D69CB48982BD348946F44D80C39C26F7 +C15EEABA258F8095767AA5447F6A9CE1D43D6BB3A6B205B8B9E8CA81089CF71F +5EDE578C4C244D0E35599CD00FAE11024952E3ADEC2ABDEC90D2FC76F9ECD6AA +A6B40D16DF171738262230DDA062E9154DAB0A506DC761E79DB40C7F389C6E8D +71B5BFBF82B224C4113A8E4580355E0B80D408B1D34F55E3586E9E680C689413 +5D584DBAD8258397EB0EC2EDA157621F90CF742E8F98974C36E2B1DA6DB71C53 +02A1E09A7E162F6E9B23F0CC5CF025CC9D13F55F787B2B565746C2AF129F0F4D +3E304C56F314EE80A250BCBA45112194B4A3D8EDE0985F9067493F095520ED4B +7F1CC08F330EE6F17DB5EE43DDC75AF55B1EDD1B41833FCCE5E842516E49BE84 +611BB71A150B44FF998B5866DA29D7DDE99D9D63F862EEB7C935216E5E60B772 +43800ED5868AFFC2CAE01F16B50902B292C2BEAD2EC5F7AF059BB8EB0CB73C0E +EA8F144F716F3565B3CE4B9597B7C0257BDED508A600D3F1968CDE4E3F773F72 +C1AF5E675E3AFEE289515A32C4A4038E0B01410B58AD63AB537FC501F3470514 +A0AE66FC127777C616379F2DA2307DDEB634C5968C1EF03BF7981D9D90C14E37 +AAA1A0C76CB40A95B77D6ADCD43281E3F680AC687F859ECF4AEB35639E1B04F5 +3C88A52BC559DDF82BDDF076E58368AE6C8072EEBE110683B069FDE3BB0F5E38 +A3EB4E820CC8B98E2716D27925F5351C3B3ADF3D60398813106BFB474617EB33 +12C56B1BB2D743E2950677BB680C01DF42517D0E7C7F035D968938CFABD07E38 +A86BF53ADB0CC8715B052FCF6ABB0ACF56456F4F88C8D0E17220D88C82DC5087 +CD762D2538E309B6BF33C1F9B449BC0EFA035DDB9D4ACDF95B12FCA8BC429A78 +FB6CF03BEA0D047832E23A3A3215225CF76F2C213C92D706AA96182368F64173 +AA1D106CD441938A5BF7218EF0E1B73F2AD3AFF7C87C580B7643BF5994FABEC3 +CB362FBEFE73BD731ECE265093411559A49A5CAA01C4B55BF0E4CD7EAED28FDA +8C264B62682DD64D12C7D9BB5119269DB43239AF2C80AE362D7716B5E49197A7 +F25B759B90DE0A436703CBCE72C472C53D842364D3BF567DD3F7615B29F2D02F +C4A8E4603F76DA39138CF8596733947EA65F1B8A55DC91FCD08425B2DCECD526 +5DEB615E7DEF0155ADA336A523D0974D4D441FA925CD876CBE1A85D644831ACF +705ED79DFEE14D519EC7930E4243D38E86CF01F355E675E9BD24529575FD4A6E +2187DB6C8AAD53613FA7FCCCC6146E9F99DCE7B10815B49659D24880A949E036 +C849783186B13EA91A595FDD1FEB4DBBBE58C512F89537B27A2BDC4B568D1E38 +02916E8B4AF4A537C19453F94710478DCB89743D7EE30E15C165C0CE881CA43A +E18E3E98BCF0423223E37C9407A872A996901E03392F8CE81A928727FBC9BF85 +6DC374D2AA3B2D2A82CA328E4F1A261B3EBEB470E5001274F564115691D01E8C +A7480387E7EC74C5CEE5BDEBC0250108FF13D87C71EFB1BCC9C5B8028D70A79D +0D2161380357E0E96D15597F673722E535F7C459F2650AA6403778C64F74F10B +049AAAC72E6A409ABDAFE7C2778154D6E920D5E2AD710CB4F7CF7B52682EFB68 +FBD7DE55B4B5048A5738A329842AF53128E3A9E89ECEDA65B2B1A634EECEB846 +6D7C0E11933A5278BC377C5A1F50BAD2DF04CA0AEC47908DC12CBBFC367448EB +7FE9D1ED7F2E13E35CA8E6FFC9734CFDD15E5322ED7D476A537FC691DF5B1CB7 +9C8396431356B92F4DFE47212F403D0A60253C0F0E7BD7768B157FA239753729 +CF0C82DC68EF1B83B56573BCD38C5D97A3D3889C650AC889046FABAC4B55856A +858896E794BA81BF7D3917884F4989C120FABD9D82698DBF7ACA6FA03B7DE0B8 +DE93ADC29B8FA9DFC15D5B6578AD6CD89DFA21B2E0AF7F0FFE862D1839882472 +809FC43C5255790B323AB759EAFE0928391A8E87F2C6E50D7A7B87E6464EA553 +A1AD7FD38833956A136AAB9BF20ED42A2972FB4BE9186D48C3759D0FA38DAFB5 +7C4446C3E4D0743817A361984EB4CE36EA8837008484F27750EA45BB0481B07B +CBFCAF075117CEC9C612DCF1F281C265177362A12F586DB66B890BFE45F0A5BF +D0F433D8C3AF860D3423F6D7515192AD9FF0B5DCE2F50074BC2FFF95AB9ED49E +73EF0AE628B503E7EA97A3B3FBAD0FAC2857BB8219ECBB90CCCC74B111A74F84 +2960056DBCB65504628C56B8E5F887912C80D8CFAA2226E23588AA243C14AD88 +BB92D576D161A3C23D065EA003369BB7E2DC0423609C2591D4AF74C86D998620 +B7F6BC6162BB2D98CA81222349BAC8C5E6A3F3170713B188FF08B8C40FFE0B2B +DF51D256BB2A08D1FD0890BF51EE599578E189A99787022E19B8F44E8F0CAF54 +BE711062BBD9A270D1FF131D69F1ECDEFB84CEB2CB1AA8A6B474683911C895B9 +8CB36086B59B54B4CAF966749A2D395FBE6F4DF81F71E37E6A0C5AB70C65DFED +CA21D87FE11CB967AC0E11B70CDD98CE389DAE41F21C429D57482B736EF9CC09 +16AB1D0E877AA92557D24375804161A6C1AB7C8912512BA2E0D0B1288A6C6784 +9EE2F3573B32873DDB0AF81C83B9097C0E4E5A62B6E324A02E19393A2A344DD9 +C6FF7B8D8405A6985F1C82FEB248BAA43FA630661F9708A1EB25A9C8EB93555C +5878D5CBA73FCAE33DCBFB998B289E2204D62B8463AEEEA2DBDB450D6DB0AAA3 +A4EB5562F40D56A252C5D76E71CAC523C34F2A3CF56745A909C79A1A202D64B9 +EF5F98AE02CBC7B9B4D6CA1192930C93E9516C7B8491A38254EE14AFAE4C5E3E +CD9560356BF0E1BC7CA29753C978394A4B06BC0807323267A97E6AEF0EF163B4 +2C92A7610BFD6257188892B55B5BFBC1802B0C648C1968AEC2BE35CE5788F7FC +9FA1A42826378BA3F5142F8C9DD8FE321DB0553838FCC28B2191A5A26154CE54 +AF61C72B0867FBDF822FCCCE8E08E9BD728A7D063E3E9AF29BAAC110B817B34C +A5D9B8A61CBBB74DF4FC0A490BAD78938C4694B26F84DA7A8A241FE91471D2F2 +0F1228907E852BC113205EC367D43A6BC47DC77742A8C0117704A0BFE29C1EB1 +8E35DE45C4FB9B4E48AB4E9EC0FA0F0A33C7197C19B41D2526E74040E6E7E797 +E18A45E86F480DFA98164CE339EAD8533F95274C13F26F1433D7FCAC9E28CA00 +5CDE03DCC7AEECF7FBF442840845EE1E17B58D71E9D58456CEDEE36A57C37EF1 +7159E3841F282ABC7E1C66594051DD8C7A9E7BE73C987E1640F345DF66E42360 +65E4D30006179A3355B7F0C54CED3F577A82D30E99617E52C0CE533016DD5B10 +211A47C3FDA4F9F7B54E61BCD46F7812A26D127EB37C047B67D547E644CDCCC9 +97CB89F6FCD4B80C83F15D5D280999772613A4F08F3620894C7C594C115A5FC4 +A0699C5A13F5D846F2220FBF86F2AB4C209F8703659389AF32991377A3E7A38F +5EF88E603CB754D88E536CA1D071BCB9E9ACE9D737B8430ED73A1642DD094D87 +CB2E636ED90ABB1FA9612DD39C767B3C0169FBA67B3946E1E852E33588B8AFE5 +D593AC0BA2A92D76758BC611F252B7B0C00E0274BE5FBD392EFA86EE49473788 +BB5C80A82FFAF17372F480A08459D6E042361ED54CECF42C88523EEBFCA805E1 +E59A1743234BB6775AFD46BF07C533588E38634FAD480E63002927F24680B547 +6C63D3A937F4830D31E7689E6D422662651CFFCE6EA129C04F632D88FE43EC27 +CBB4BF4D4232D3DDD19599026EBCBBF47DA6C805E38AA6C11F1E1857A5E8F1BD +4CD21F360419A0F3E555DE7EF68DE7E081573FE845402365C846F1F6B58477D3 +1259A60869E4B93EDB66C10D6B0E46D55D0842CC47DA05D21C8FEC6CB299409D +7A1BB8B99EEDEB3C4F10A2699458F19C320F3FAE9CC6350CA383DDE889047279 +0FA91175252A42834BF9BF5D19AB0032B8383AB056BBDA41480F476835457F53 +D1083B641023078AFE58B2CA0FAE3832ABF70567D5E5A0EFC39C3FFEC8A3B2CB +3624002DA2706BE3AD3DB339BD43BDDD9BF9D336F25E572289F105F319A4FEF4 +60E799202F759DA96C6489A228EEB3E975BA1EDFE6BB1A13612BE4A5B690C615 +97445B00FCC75097620CA90F06CA1C58AE637D12186D892295FD5FA126CE1D76 +011AAC13442F1DAE04AEC3E7A5AA6DD27F26ABC69EDCF606C10D34B0F32CB8AE +2B0D21CD02DD3456FA3BD023E4E92233AD9F24146B7EB0C2A68C49FF71A01FC2 +2CEA9C5FA57F09147C6DCD8D3A4A33C1A70000B334527716C12052092B10E905 +9F22B1E3048E68EF2525762163421C33A1CE61D0923C75E738EA9A37DD3271C9 +AF4D55786F5BEAD707EC8AA26DD53D88476BECA54403293E8CDB02A083294545 +D4BD7DCBC7A73C480D4F3A903AC85AE133384CCCFDB357FE6B6B341FE71E4A75 +D283D1511423A2596D7543A293B4A6C26FE21040F0A3E8BBFEACD0152EC3F190 +ECD74D3CEFFE9C3E86402D8B5923CA46C8046AA3C6DA39983B645808F97F4332 +D66EC475C8B93982A7EDA2BDD0792B332A9EF932DCC11191E399900EBC05C3E3 +8AEB4B4CB9539D6D209EC0BD5C49AD675409BFF8EB2DAA5E425D4E65E06A2458 +F0C4149361EBBD54708F4B4EFCEA571DF325AF6835652E7C493DCCD8C8C2F01D +382B800240082986A52D925D6F804BE8F048CBAB7C60DD389F7F3501121E1752 +AC0606E26537356594F6DB786ACC6152D194496812C20C5310970505EB0C3EE9 +73C5AB36FEA992F2ADF54BE9CF51B77D4B1E3E63B9A40E2D701F904C5E0259A3 +14C12EDB20B2F5D534ACC7C3AAB655F58C73659C9A177FBBC40963B6ACCEC0C0 +8BEE4D7EB45D68FD74C3E8AEB3D432CCBED396C3EA5F7EF4E40A8BE9353256A5 +25F88514221445F3373BA7FA3B3D360E533A17FA74D1F63EB847F313EF4FF04E +62E3057E60FDC0DCE1E8DDAB7B45678F68D90680E750DAAA3BB7DB64E938D89C +6246C43EEF4F68B65B0A8704B41882495F83742E12B2EE017B1A74DC8E1F4761 +576DD2027EC0F9C65F94E887C1E82D403879FB4DA7CE46B6B64B03541DDF3788 +6B417F4557B029C1A5CA503ED1379FA986DD2ADFE5D1CEB12F1B9FA0B4404132 +FDCBEDBA2693C41F999E5FED058098745312F520189CFCD89AA7EE42F2BD782A +FB595F059CED0AB8D0BB55F65EBF29D89E023070E8A35964F7D8A8D5511941EC +65C5BB39B27168C392FA68D211056BA38830B5289B399927BF79BE6733395940 +DA32538EC63BC1435F6500BBFE3641B96B52D46D4051E393D302672AA30AD51B +E3E6E133CE80E6E9A7D979C63F324C99B5A6FA7B8555F35891AD9F60942D4085 +68A4D12E945BAE908F2C71993851A616D4E69E27F30441466DA68E16C74BE058 +C8920C64CE03667344F9DD28EDB24C5062BA27BC75B924029E5D86636A0E347E +1B41D41B6556EE350C0BC921F11232DA04D5387176DC11C4CC64E408C164F8D2 +2EA268E517813474172B3787747D4C12DB61804D93F3ECB81A52329B87294C9C +DF2AF75BC8AB538565E066992E8F6C2BA4B89D5DDE0CBBC202396D31227C777D +60D7D5905ACF8E02AA26DA2E49BAF4464701D01081E206291FFAAA45C5087028 +AF59353DA8569D6000ABC1B744CCC4C0A8A391FE1FFC415EB4901F950D0B4E7A +89C6F634E5410DED1B428A87EC74BDE51BB5EB54AEF68C385BDD5ABB283D390C +02BE931669CB603C063191745F913756B28E81DF6B3760804300B01C4AE126BE +C558B85BE08C2787A930A944E9A6F7DFC85E7C243E4BE99B57E2B120190708A7 +60138412969D73387995B15583B8C2B3BF6E14DBE22599859EF551E741B04DFE +36E53F1D04E091C840C1A9D43835A12F4244D4D694D46B6D3376E824FD3C50F0 +D889F2D544096385C982B5004268D199D46E56051B2C46BBE23F0D1A3DDDEA28 +1E1B0A24C80A82C2FAA2732A5B9CE81B6D22EB77ED0EE9E3E1F89E2C07167A86 +839255DEF07653976250EE4839BF800EF371ADB3B19F92C34193399E6C2B005F +5CACCAC594DE4B92EFE30C6E891C622BE799804F691EB54BD12E95F8CB57C618 +8FDEA75A9FB8B65F3AEE065B9B4C545AE70F9A1925A0D7BA9187E559E85C317B +F1FB71EAC15E75E1E93AE8D29A56F4DB65684D6CD4AE9BAA74E1C57914BAE369 +17C403097FC47954DEB81B049B99B80B9B2CB80B709FBAC869077B9E5279888D +987639D5CBC79C8102FB496E5387450808238930AEDC3F2A13558E56C9587723 +4F9FD604CFB9831A34A560E2F24187FD519A3F2DFA87541E4DBF75642A4044BD +B62A47799D79B6A6341B2741018FE8640CB8129AB492355B0CFA3B4C7D0B8794 +E0BC808057F439C71057A5E15C1008793A9733A0007D7C95C408443F851CB1AF +B2D2DE86AE8BDD6234002311C81AA07E10B58AB87784DC665E498DBD1F19C7F1 +7B3278AB45C358DD71821ED3428296EB77771E230F82933E71A99662199DFA5B +2A7988C4060180B916EE8EA9F4896C0975AB0B33928BABAC1D7B08C4C80984F1 +3E1EF19F0B8B61ED8AE5B5325EDB72234C4966B0953C463CA79935C22EE21855 +62C316E3C26BD4CB68482CBFEB2BB05C353F1671EEDE4D30162472879F82BC96 +F9C32CAF2AB2ADE3E14D704A1871E193BFE97F3CF8BF9C5E1806446FA2207B68 +A1ED6B9EC3C914689F2AEF2436792D25A7829C2E7D53ED15ACECAF1E79B589F5 +90D80E0A25DB1F40F6C1302B33DFB91A933B888EBA3F58D267884F0A4A0C675E +5CB0FCE0AD0F58B692344E2A3A20D657035046173A346C1ECA438BF92F75A047 +89AAAFD72B7FCA447146245D10B1508DBAC840FA1D52DC174DF2E64D6792E4B5 +874DD42DA10CF5C2F83EDD54DF2045F1E40F50F529CB7F9375BA7F5A57D0A5FD +D958183A252FD7AB88F9E2C099F587E716C6ADAC29A90619CFEC1E9E6E63046B +F688F7DD7843A1216917A0146C248FC12126E8DD38E27D05E8014C7D5614C661 +F102BB47A24CC223EB05E7F5A7F33C554EE4B5E6D16087884FA939D3E56A0B7D +1E3C9E7F6C3CE95369FA6796F24B5A11CF30FC93160366F5C2EF4FE1D6D1EE9C +E21AF6B09F1FE1D076353801D4799A38DEA9D323E8091F591884D471336F0BAA +8B353ECD3B7E2FC36F5F4C49B6ECA8C08078F857F919BBC14A2B51B239807698 +37764DC6C7BFE510F180C63CD0E1A9B001DE2C50CD99D934B71D9CD633F40341 +4C0E56063100447522DC53346428F562E9F6A2B4CE6644EFF13BC5A1B0C1E75E +659F64B4C5D31E51AA2DEA57882BA22D149145FD316F928DB46E680A269CABDD +196FB35A49DDE6F4CEB9D61654CADB3B9314EC1C0DCF0DF00DCA92A944BB40AC +31F94EA1FEC6993DC4E8203E6C850980DAC682B04D2161AE3F9E22F34A874A5C +3E24B6B0C44CEDC23380752B6EF7601670B58C4C9B25728709C322DD98DFA48B +C965B6A283D7ADABEE1789A8BD54E14E6B2D6FBDBA6E19A7DAF45646E036FAC6 +B761AC1BF621780B92CD97E068E50308D5BD6CA17F8BA70AE30B9C5F07C2E8CD +9D4DCEB6844CE6F2241B1D19BD6A1FC5F28848DB10FEFA1F55BED0283AD14588 +7051A33C3854718059920BA88259032FBF481F0F0A2D1749A867BAE63B0F6E92 +8A4CE00F73742D6D07DC31932D8526B78A806B1F242153AB3F358ED69BCB9A9B +EC008CB67844D943E1BD3512F47A81959D74397B05AA8F412A5DAE4F657B4738 +A8B77333A3FB07ED1BF72DC0BA5CA9BFA3E74AEE58754BBDB7D8A898C9B111E5 +194BCEA1DB2035C3B1F6E012D22785F9BA38FF027B3B622FC8F0F256787FF91D +FC4C9F64020219428302102566BB6A8D572450A2647521DBC714D7C886125239 +1001F1C8D9E928873665E89A043BFC9F4DBC8DEBC04E849B1D52B3A9A108FE6D +09DBF96DEB165F0521B90C4DCB60A8187288C400B85E6013ACA8227AE83A8DFD +351D6C8F863197A4D44798FA3A292FC2B21750B077E9B9670D25E023B2A6C14C +A6DECB08D3C3C61FCECEF890F02B6442D0D7C0D419DA2889E7FDC3AD977C5643 +3E61C6793A2729CD435B3D4CF67A92DDC450CA6F4328F028A962D0783EE0DAB2 +4E9D496FA28ACFB0693355360E997D3177640A354CD8DCB8263F18D621218201 +D1E7F6C31E8F08ABFDA261B7A3512C784931514773B16F92D04FC11B637B8BA9 +BAA804CF55C126CD35839A50A81B00ED35C3D32AA64BE73E2D4587025FF23A5D +ECD93B1298492A4FF326E74042EB1DC3E98B4F041F17F341F4277AE117D6E4AA +BD76023649042985D18C3C28C0FD330D6F0A74778787221B325C4D810D6D87FD +8EC7254D1AF3AF46C2BADE5D292225744945CE0248AD303DF4906E0402159D5D +BFC58DB629CDE8E81B6EA2E0D5B50E1C455E7AF6B3368627BB3FA73C2A72AB31 +627AD18658C8BFABF0D7B2E40A9E1490D03296AB1792E160FCCAF4FEF84B71DF +E284C03E87F17D3A440990652A9503B2C45D48D9C8DADD9776238E22BEA1C4A3 +AB05918672D6EC5426E06F688C42F4755635CB0F5C41694DD9B07C5945F6F7C1 +EBA7277B32C92E6754970F6821B217944E09E89A81F325D78AC5AB6E1F9A1FA3 +358FB78159C333EEF87541D46247902155B6DF41F1241C58197825D3E2F8C1E3 +9029904D5203F7120AACB8C012DEE6460257727E259831BF7CD658197343C8CC +9832FA2C62D730D0867DA1A688C38436D26837794BBF6AD78E3A8820867CF045 +C9182C904A87B9F542F4CD87E315C0ED1DC3A545D043C2F337312B0C70144BC1 +29581023FB0C7E114BF72C0D010B3CADFC79E87F303F0AC7FA0CAEAF0A927D5C +A9672235B9E3F4DD72112C1273C8AADEC3A8ACEEEE81927E3F314DAD0FA7F412 +D32ACF1287D1A500730D8BF20E290B2DBA7DA8A778BB9F206BD31E2989DDE5B5 +D5CD2DB85EF2834448364B7EA6DAF3BA0088D9D9260B6A44B0E4C2D3411E3F64 +A748ABC0A8E9BAAEF164732816DE572EA825D945F4E894D7D2E3CB36961EF8C2 +853D2905F11FA8AF17763C31B7216A8E6EEE28F8F3E8A7E9345D27B52EB6AFC9 +33462FD5A6DC850EED8C4F403626B1381AB6AF3D6E8BA6BC7682095B180043A5 +6DFC2F7D7304C905771279E71D05ED597285452E06928E3183F91589774DFFA0 +7344946AB4081EADDB102E205A17F49FEBC1702E33942F5260D87DDF65473622 +8218C9F68106399E2AF3EBCD07B6B58284CC3F4661CE7FBB21073D7A313CDCAF +A15A05658CB96154F2232CD57F183153BCF0DF1E96F1323D1C45F23D68536C23 +D2B141AF03A36182DCB872B6BE7EBD4423A5C048FEC8A6C6E92434A9E1B79921 +333A249BEC6ECA29FA4FCD627DAE3BA8F6E123D95297A9E2D1FCC426BF7E50CE +4842D85C3E8ABA8CA9241DF6AC71240BF1B73F0DCB13E1E9D2D1F9AA6A081476 +6CCAEB851EF19ADBE584A7A50109007AE42D3C3E29971D04A0F5FF1890ABD460 +C0F9C909685D097583ED09EFC536285F752B16A55E31E6B34402B6160DD97563 +1AD5F56A8F1F76A3EEE62A6108C2FA0CFDC25591D00F8896A8DCEED9864EEF32 +23FA25110F6E78C8F18A55A3EFCCE0922A3C733FB9D4C8E0F5952904DD5410B4 +5857953647FF97355F9CDB187FDEB54E8A6E4EC0ACF4F3C13251BA034F5DBD7D +C0F04E856E49FBE5BE24D220048B7D9AEA6689484EBB50AF1F7A1AC4AB251404 +8F62BD7993ED8AA929A029FA4A33CAB57BD9A54749A796DA9A9370E1355463D5 +4E158E05FB99E2094C3B273787D851D433AEE9AEF73FCA873329ABE21E5CC531 +81E7E9B76F347F43D36E16C10C709FF9E16695EAADE5566476B70906B2F93838 +CFEA62C80D0A5FBA21711D45DFFE3AE3F2CAE050648FB91C87EA39757D7D6885 +B7018BFC81564DE44580290F53FB601701342AA22C825C566961EEB9F886D550 +00079A5FDBEEC5B00293B784C5651C747D93149B22DB752958992E64AE87C919 +D97B0DD0851E105E8D4C9FD1792B94E7EE1566A482A55BEEE5F4782065667E99 +FC0B355020548E10A5D7786D6FE53589D9B711D0DBFDE94205667092766B8351 +0CDB4B715EB701B1BE4862B18FC4A26D3A8A680EEF001C0EF439972FAB7F79D7 +18AC641B6D1DD5A613868D67121C0B67012EB27B920AAB6FEC1B5D067B7DE813 +FF1F3CAD1C279036E0F2B02C91A32339E1AA011CBADBBEC510AC628D85273FC4 +956EFE7F85BFD2BC6D57E9673AA1402B0E145A2ADBF33C3567BC47B9BCE16A5F +A049899A532B554245FB468A6024E7F1D6BFFD3F0C63AACBF8AE866C0504DC23 +266A566F4EA034458C160DCA0D860995C246DCE9B8BC76B742AFC3A23E15853B +242CA55B38B3F1AC192CDA70C873363D4F6912A4B6A9D691A53BD33F9AEDB1A3 +0825DF6D9C57254666105DB69A8CD29522FA2F4016533BAE1B75031836AFD5FC +5ABA92E8588B152AAA2252EB8BCB5F5C5936E6072167405112A10DE09EE454BC +48DAF59774DFB93094631DB0F2C97480EEF0006C18766AE1EB1A16DC6C0B52D9 +9ECCF897B2DB4D0F690749F8068F82ED159207E06CAAC19EAF2FE95CD333DD6A +1DFD3F3C2EDF3C0734B14814BDAE8331BD430C963492FF6E7B0BB14D56613FD2 +C27A6FF7D390C13286DE72F5241AE846120CE1DDCC827D00678A3CF0E49CB7A8 +6B09DB2A8072898C89815C8B01240F8E7AE7E20589959FEEC6470089F8415C7D +1BE0D344166835AF7717016826D627AE4204D914A318AE84C6439E4A9E8F12C1 +9D98A1D5E85D00C536811CDCD56640D44C7EFA03E6FEAB29636210534E406252 +A99D75C077CF99D8AAD43644EA16DCC28C6F885A041E0B43981F09959A603ECB +19F9ADD4D4997A07B6317C731DD429A6F0D1D99CDCBC475FAA8BC888EC263433 +0BEE727E2E0B6FF98F982C1B128D097314AC7C696F84F19DAB10DB5160A59B26 +CA44DDCC9284B843425A302C5B21A829BD261FA33A44F339D51B2F95C949D37B +D75FAD32FFF3E76FFB7713FAA9F15FED09094E476382531DC9639FECFFB3940B +E7DAC4BCFA633EAD07643CB27D9CDE05AF6ED670D74760CECBF7160F46742AA8 +FF962C22E1EB0E492C75929625F6839E6190E81E477914979837A9F165B13B28 +C09125D9659BB596B0E8B165DB17965AEE56EEB46022390513F395C2987742F7 +F141E45BE948632B3272BFF43934C84950649B0AF418E42DBF71B4098FA8079A +5F26F81922D97866F8183783DE8289703D0886A704CA6C2FC9DEF3DD9B116F18 +23A11A448F7D8180E1BFB2369B2DA3E6A09AC65A3B7AE63EBF4E388855F85A7A +23E90FFC6965D9643E9FF8DEF8DF0DFD552126E19B92394D93A492B27E4D49E4 +36CCA1D51783E6A2A2ABC9657D5B8841A2F99E6E89F29C2B1ADD7C4D4340C3F8 +AC3877D3D11C28D6E1252E690B3F94704C9FD6B64BF03A46E1F399830162F5C6 +CA081A12E1592D9AAA6103A2C10BB2CA96A7BB2A141385C5D550EAC392EFF1C7 +FB1708AF908BBA2F807284B87764DB4BED8B26394BC24F07D731790A1775C909 +68B17ADB0F4A37B58F55E514E85BE8FFDE0D1FCB02EB75990A9BF953A88FD966 +801A2428593E86E240CFFD0F5A9481BF3E64AB2B3CF8D8A7C6DA10E5D4F96A05 +7E207E4C6F0CE1FE061BD6235AB57F568A664604D913F35AB9B9F693A4B93EB8 +19A583E1057E77BBB0FE596DA83AD659FCDF9F793417643DF22C12CF0152A76D +E8A1B9C890235D22B81AC5255BC024FF69A8CBD1565CF30778A80B56D31CB253 +0C3A1AFA5B912ABBE79D1E84B68407359F72486A6EB1D5095F8323609F0BFFED +303E9A448C3385521D9C6743DE00ED69C1FA67DDE59FAB55738EA5E48FE3165A +6A64B88D8B1F6E033C6209D2BD3FB040C0523A6D0C266758DB2B43B556A6E3D6 +2384F9ECC1BBF49F0A922FAB1E1934B279C7E8754E1C0ECCC831B3A7BDA34090 +31B9B02B8D514E21AF2EF6A66B248EF1F50CA646FA603F9591D4951C22472018 +B5D4C5822247FC61E4201B55CE9B76C0A79FA05A15B85736B7CB5C8421147314 +499706F303606B3A0F75012CEC4A1AB0F30802CF0B5769172FCCD3E057798E91 +CAB106C3B1A022E93DBB6721A3B1386C8878EB7C342D8ACD5C86A30DECEC22C5 +55C18C1DDFFB5B15D1A81CC9A9C67649B555D5BF07FD1BB5DCC7ACCBCB7E8066 +5635FF4F1DDF308FB2A2FDDACA60FD88387821B10753D7DF0AE56BAC14FAB05C +0A38D450C22F13F00EF31F73701F38BF229EDAFDE8C3F6D41DBD51616114FB8E +631C8D64DB1F5C0C359C1C46AD245ACF45734ED7D22A397333262D7268453D68 +B8AD396C05800C05819BC0794148DD20E6D8727CAA6F167F5888249C44BFD95D +A85B651D7C2732BD1FF349E7DFF7778E28C88516C04AB1C67CCD5CF9144961F5 +93A342144450258D359232F11FB19A4AF79A0C046E845B01FB7B5B5D62622D67 +DE1D52D712E1D1B4ADB8D5DD51309F2DABA84D38C1ADB4B31EFE80FB690605C2 +B63BDF89D1FDBECB2AE4FDFE47EE5C122744875C107954341113B31BA1AC4D07 +2166F69F1386BC784D82F69AD51AAB6C22FC8641F1AB8989307F7643782B3FB6 +FC72CE90B42A92156044413464F8634A5B4FBC48C347E8D2CD8A1A407C44ED27 +677CAB77EC2ECF29BD752544A69F46 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l049016t.pfa b/ogclient/lib/fonts/l049016t.pfa new file mode 100644 index 0000000..e47d5bb --- /dev/null +++ b/ogclient/lib/fonts/l049016t.pfa @@ -0,0 +1,1582 @@ +%!PS-AdobeFont-1.0: LuxiSerif-Bold 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Bold) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSerif-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-217 -211 994 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078992 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E494BF284EBDC8877C4E +5D28D2A79EA7D5EC25EB01F73826320B565BFED33D55B5D2B4128ACF57097B2E +BA8BD7BC7EDE9E6C636AE6FF86DFEB5E9BCD723BED1C30F8B20C4086BCF5FC74 +44FD8939C7580185BA7BF311E1E56D7C53EE70ED83BC1615501895EED5042083 +A5A0D8CC28978C5DAF869CEC1F15FBEF2A58A11A3417D1527AB511AA9B6746E5 +5798FDBD24006F12521FEFF4284ACEDA2A6FE84D9DD417103B4B1FE7FC2BC351 +2564D903599E253F6F4BD11D7B3BFCD01EA9DA51FAADA5F18B9F5E5DF25FA0D2 +A1BD84D42BAD716CA9303DFECA5DF05B26EC60612FBE0E931112268B223FFC37 +FA3ABE4C7E429354DD82D7F24B6A342F53EACEF4188937778E2F037B002B29F4 +9A4BAA19E878E7B0A6F326E3DC7949DA57D84E1098506B0B4C1BBB57196B597E +310BF7408315F69854ACD0F8E8640A70F20D4EF409AC0F891554643BD8040BAA +6C11008AEE7BE22282A1328C271E30817386EACF45542EF2DC63856FDD867C3A +4408FFC606DD5937B74882832FE9D3C806AB1C6594AD2F95B763919345E37202 +5C3474453ED74E5344ABA7A92101A287E932E8900F7CAD3083D38FE1EF3ED4A7 +E6C2A0A8A19A2DCAA58F823D354994C9BAFF5FAF8BCE6A50B275F8958E9254DB +32D7BFB3A1F3739B650B9704B7AE03378D90E8432A1BEF6EF20F8F49EFD919A6 +C9C90F60822299B0B50C0EAE5243AB66D9573E257E99ED424D4F7B284B779EBA +1B47D49FFB539EF6D3CAA911911E7CDD9E7CCE13F60F2C698A7E4AA8AB3A2B2C +6F3C86B9EC9EB8A8B8687FCB279B9B2B4B5F838FE25EDE772B77407CAE3C5840 +1EC417A4D627AF14F5E8D5D45EBBF564279361B871A0A142962BDB83EB1673F3 +CF7A34044DAA42321ACB120827402D43CB17607D9C8CB2BC726B8D06AEF513E2 +72CAE380EC17A1A2B0F235FC70D479A606B3360E291426B0C651CED104A39B26 +C4B14949E12B160B048969242BDCB760C123FC89DC73D8A628448CF678C9F679 +99EFF5E798EE5E46F41D1B84A38631876EC8CEDCEDEDC21038F7707A1F4CD355 +81003CF5E163C1DF8E76B1C4BADFC4C887A084E94CA74AA5314BDB69CB0C5F79 +B80DBCF17D95CE7B1B0E3C68652158131D8B776C368203356AEBE5DA210EC561 +8B56C1D5BA9001CCFF14D7AF2CE1175AE66FEC8CFA4F1F2D2C2FCD5C00FC62C9 +98F5FF6209542EEB45BA0DD8ED9CD08DBD58FF8A70C7F1578AB22E25136E31E6 +DFC05DC28A66C6C852092E56590199B2394D5B99D466EDE33EEA357806A3D0D7 +06B658A6528AACEC3682044D37A42E960E1B92E7E064AB891AA0006AFDE4D8B4 +0E61B0480EE2879F3C8455785EEFE3E8C02D9A5EB4EAC0AE01C79C44F84195CC +4724AB8ACC2E93B1551E750DB22D707F1BF8FE2E9A751E542F347A7E54C91D69 +25E99CD65F7A348E6234D1933177E5EAD802D3907161E7A19A3AF41378FDC8CF +464A5A87EE4D83218A9CAD27B1F349E55379DA9640739A502427F52C6A16CA7C +FB8E3F19E256918FEB39D16B6C4734B058373BA35A222B58A6421F7FAE124E40 +B11A646757F60DB2ACBB0E8EAC910698C137FE9149DAA39EEB195ED3823F0308 +A8BA9E889E618458ADC62C8F372B4BE51B66FF0E9F9837494E1E04077959E166 +C3654872114BD6A703746FB31E330BE538EC7C440F0473D5983C86714E002205 +7469E7C388E390068A302F16F7CAAAACE00BCBEA71E1C58E3B59C411965F07FF +04C2FDAE9FE2D314E85C035F58440DC004366307A9173BA9342B0CDF58AD1980 +5C38795CD0967F83E13EBBABC37CDD0155A49FCCEB5233B0031BAEB6EDACA49F +E842B25DD5E791DE4908C94E372B2075F9615CEF9275316080AB9F5E678AE30E +CCCA7B2C9E71571B42A5315849B08DADAD9ED58120D77BC16019006704D436C2 +B36A8B3860A5B63B5864383034B6FF0252E29B409D01BFF9752D9A845493EF2D +2F1DA1B6DA9933D24729E8002E4507A15D90E0CBC40FB562E4C0CD70A95B5D7C +E70186CD14657AE2D308DB650768E9B135E24A82212A99EA217EDB93D1EC03CA +2FE7B4ADE5FE28A21225F39722E0C2144536DA5083965642FFF7438AABD30710 +94D3F4B1118179748A71133050E51C94D9928885FADDA8383EF01BA234BDDAB3 +273FAC0D86260001AD472BFD440009C19EBA1C212C581888FCCE590516767F4F +A17C7F5BE71A2262A34673DE3CA11EBFFC1A971EBE827C4A232E4C6CBF65DA34 +A1D231C875BDCD842BF21E1C00E28AD90C73571F040BF095E28B4F4AA5E3833D +D050545E8B5A04A2F67B7C0EE5B49ED30B189F0130D544912E0CBD25D09EAC0C +334B30759FF0ECD7FC05D11830F0ADDFC9F84028706324B903AA963FA4FEB4E5 +12756E76F8A55E130A14866983058A7FA9BF206924C0C7281E7EFDB384F9F1EA +EC120F349CED13B2F2FBDB930D1A66B1AD1C10B9E66E7AE2830B9BB5A51D0DD8 +0A5A0A0729571B9DB76123040AAC7E791137695FDAB0639FD2F994107145E1BD +A539BA84A3DCAFFCED2FA9A1642FD8123D65E24FEA77CBD299D22AB1DED3AB40 +F0DC657EAEC450B1170CECD360093EC0CC14E2F50E141B8F52A3F5B9D7CFCA92 +30D819A34BC303DB080E7919E573B46489BF79691880EEDD6B992CD63374DAD9 +2DDE4B0DA61C03CB953ACAEC3176B7C474A1A5A351B259098FB2425D2522018D +98C0CAF94E047EE130438CC2AEA2AC11AF18F652C53157DFD31F44261103DE0C +4D582D29B23BCC137849306504F3CFE49EAB54D05FC62754A3166AF5CA301F89 +A1016CD076761A415C900AA958F922C6881BE652F32ECD8DCA3059CC335D3D95 +AE5C4F0DD70CE9DE75407AEE7801B9839A56C3E372F126A22A779D949E4111A1 +7F2E1B2D884ECAC744D2E78C1D16A8D3D67A6E818BC347F6E6DFE71ED0A7F45D +F37653BEF6DFC90D98629BD09DDC53EE1E2227CD0553375AAB4A3F10ABFC38D9 +A55A4D376D18148CE67C7D0062AC884CBC6500E646C84DEAB420FBF64E4B4360 +B2F5EB123D42F0BACF232E9F3392FC1704EA390941491BD97D191F198976EA7A +8FE3D14141E1BDBA8010266CF791D0E700C1F1C1FE69709712EBFB2136026E84 +A246F78B6B713D7DDF9E01745AE071B8CB052B54D5545AB56091E3134306A532 +8729EC3FD25AC305D3D39571C2AA50D4FFAEDECF998BA46AE033AC1D5DC3967B +C846E475352E0468C0826A8E040332D9AF6975859E069F70F624E8A646A65DC6 +1852339A3857C96593FDF7F4787E5A7D691C89396F4B5D4DF91A092863709AA8 +F7D8BC7C7739EB060C3BEECA0631CF9F47BE4854248EF5E88B79FCCAD7C19BB0 +1B745E6DCA8034363F4C5CC4B305FF2EE1B2B9A234F394EBE15B82B5F317EA7C +39183B8D590DA62B3277FF00283C5F5DBFE10F29AE99581F6A9227009300BE2C +2B0E509BD87D96AE7C5B198C8FB02DF8E1E5A648EEA044A5AAE0293BBE43D2E9 +33D55B70F8BB33CACEB5DB36CB9A731B3804D859E020E2FF49BF121A7950B984 +7B0913BC2139A8F70FF6DD3C6DC638477E4092F1179D540CD31C349CFB0AE55A +B0E772894CF02BE0637692FD6574D4EB2A76E93070556665128B99C20296C550 +8BF29B1EFECAFF31925ECBFD147490E3898A98D374904CB7BE2E7C752734A359 +FA107535533B4A97691A242FBB82D66C006A19374AE8698647CE8FE951EE2B84 +0E5836F8A3CCFB6F95FC009F8B5D200C0ECFB0BD6692A8644BA7DA5CC2E80DA1 +10ADA3FF7F79A40AEFCA4B98CDC4EA9C29BC1E901CCE1FB466DF65233B889C24 +DFA2E161FB6366CFF3AECE89C404283546D7814B254798EE928D74FB9B72B709 +E965F4369ADAFE799B4510CFDEFC772ED5516D9EDD5F1AF0410F5D82CA9DF5F9 +5134D9B9BA4984B5A8A3D8320AFC0DCD6305CDF582B08E28C28F0D137F73EAE0 +800469768BA91CA121A42D04A606D1722104CAED2731D73C3304F7C4371A1319 +F9ADFA53A1F7A7F8EE4D7B74E3473EE3C11AB66BB43756CE0D57AB36B5278E43 +B860B5A9C51AF0BE85CFEA6C3D114AC0AD68919A9027DA7C80D5C3456FEF5824 +1447D68ACC05CF272C0D0E62548DC9544908B9F50F5804B83C229F5E9B65C3C3 +CBE220648DC64EFC53C40473A421301F19E768D3BAFEA7FEE49FD3B4EC279861 +D9D751F4D49A64C463EF174D0F7672042E22BD2F55AAF7F531809A541D5146CB +FA4D776AD1AB10289B6EE3E01C19B8A8F7A282AD668D5F8B76C45A68D51BF56C +56DDA612D9E4FDA940D2C4B75593834F882AD142E6E39FFC70744CD9F3B7B19A +1FE25627DCC832F20296F2B4608AAC873F5F7D859D5BCC5C0B83DC569264102E +50BE5724F8F64CB35C8FACB12F460A311D57F4E52B7A08A5930BD56951C0C88D +6FFF6A6A18553FA7A2731F001C28093813676C4ECF8FCCAD89D94EFE35996AB1 +776298BF7E1EC9AB0FC95D6475A635B89F7E0EF16EBC188B1FBE3D105942CB47 +0A4BFB9FA132E1AC19D544423081ABFA1AAAFD91165B378D3CDD2734430EAA36 +B070A780F90863631E2C7CA2079B1EEE7666B975FB9BC62C37DB28EBBFF3FC57 +5356BBAC08A908976DDFCFC1664927E69DD7713A47B1A4150EA0762E9D30455B +F840841688DCD60847AECA495F411656D669AD3168F261BF9C31821EE3E8685F +761276952DCA7E4F21C16D9EF197AE2FCE0D1E85263C738E1CD88D4147ECB87F +7C232716CF20C51575BBB0C771FFFCE3C08CE867F426FC4D1DFEFBFA1618ACB8 +ED40168DCA837A254EDA92887905BAC603606E427256D2922D6FD43AC3A18781 +63EAF11A9102411AA6CEB7119688C106E71364A973EB54F1869B419AA6770383 +9D2F9E5C0DFCD9334CAC426FBA2AFD070A0374D65FF2C203516D9E052462993E +DD2C77E9F84B8299B2399045A09E37744EDD3F3DC1599A2B8901C84DD5640936 +8938E43B662ACBEF2279B10F44600CA2C61647B67C8909097119232BB82262D8 +8C55D939A457E84CC03F2DD9215C78CA82EF556DEFE179DDC0D248A933E9F906 +70850D991D72913C554BA1E71E71CB773020D452247B7B482370C8B190A105F2 +6074F9E154E9BB43CDCFF610B2634061614BE281B1809E7FE0B60D308507465E +13F424FA991810117D147A9D68D76170C75502E60E95D19B30081969BDE3747A +1CD185820B4080697411DE70ABBA838BC6AFF19E11AE35B5284B2AC7A96CEE55 +1D9415C7FB88CDDA4958F9C9892C1119B69B5E2B47B2896F31DE83F6476510AA +CCB73E9E3ED534D7269C8FF23B4AD964AC6A920C20F0CA0C469EA85F6D675436 +CF22A3B92B7A4BF502AD1A94D0A575A82E90ED3CDE6E422B73B6B76C23B1CAD7 +7E246CD8C3FD6A40CFE5E955613118FC584DF75CC434F8DFD05181056CCF0CFD +53BDD45E4F8A9424C3092C42FFF19D59AE1C003D3FD837882D6B0B2A00489F23 +518B48040D40CBF9CE77733823CA610735CEE4FA8C907575F0F0CFCBBA4D2E50 +04ADA5DEFC707A82324D7F288302C99D2ED5009D20FB875AA0F861479497643A +0E041E76CB10B898E1EC007BF8F70444474A75D3C005ECB947B8F8DE8356771B +EF4052F1D5CB3B19853804BCA33E0EB27B418E75AC398E79B1A621F85E4F5C26 +1603C789437477357A69A585BDEF24F8F0C9246FBB04F40AB6498FF72BABC3F9 +2C5D9476A87DB82859C374969A1016D0068FEC4AD30EAF10E871DAB9564EB600 +8EA14C41EBA75DC1D4B4EE36AD57CBCEA9E862542627551B530AD763BE607808 +5441ACFAA3AEA5C6DE659B15F522C10F7719A4F868473883B8D1BC1E40F7E525 +3C1196E9850B6D58F7673D6403BEB6FEEDE3105BC4F7CECB15A3BAC37E77D83A +D802F77B9A4B4014C1FEFAB1DED101A0FE0ABD220965367F99DD6E4C34C6F47F +040B8A1924E7889DC4A131408D8BD1AC15B3DD07315C4A30BD30BCB9C03D6C90 +ED4295840906E3AD448FF83F74257F0549BAA5F0D96FEBF943F07941121908E5 +AD6A27A33BC555B602F72F067273270498410D2089C3D1EE95D2C423223CA83D +EDDB1552B6E121D9FD1D0F5BBC1E9E8269C0CD6515B1428D61704FE230AB513C +AFC088CF436E7121630478E115DE2F5157D244B6E081FD74E5539385F6FD056C +5824847358D38BEF8896B93424F40ED6F485CDA0D9AFD896F921750E331ED55C +B58A93CBF1F74F1B11DFE0E35EAA56580E949130C6D670271921C65BF946FA75 +1B9472F92BDFDA5D71DDC5C3D03260B67E2D94773961664EB4FD4D23D49D368D +F2D8ADB7F2D6D41A019E20654EF4B78D35F26A159E48093EDDA1FDABAC484D23 +88EFF39E0A4C2A64953D53B6039BBA748751F4B6C077C9B66AEE9127E646723D +26F7E288365818F30A38071AA011E67F0E9AB64F4A943BEFF67BBDEAB4915B31 +FB6326BA1EC27EC9F525CD183D97015750C17D2944F793407DB6ABBB72AC2F85 +98C449326CEC03227FC767470A3F102A12C2A8122396D00025D84A3778A50869 +FBA49AB1AA1506839DDD675A8AE2DE1E44E83D300CCC1561210A23D1A97CD590 +FC257FB5367BEF1BD15AB855D07CE21771EC8B815094721A1CF7306AFB4EA421 +DED331B92C7481C683785A92B9E213B04A2E07F420ED9B9C025DC23D4FA9DBF0 +B11D6948AC62ED02298B8F1C6B519364B6140AB89B4B53CF1D05FB954FE7C185 +4C63616799FCF3492ECFE06D0D1E00712756862C3F0C1BF21FF08564BE0A3AAF +9364F4E7DAE16D828E7E5A2780BF6A9EF1CFCF680B4A96CBC4EC5DFE7E64E140 +31968BC00CCE67789EF5BB4B1E7A57D5FB53819CCDEBF38A555EC145FE2F607D +C199E3E514EE3012CDEFEE1FD70176F39B5071EFB08DBF3FDC2DB6E89E2CB41E +5F6B9528C7EDCBC41B3C4860CA7EB9C469BE1D5D1A9E590F6E721A956CC53870 +9EDE2D930ED28AFF92DC834913C4284847CA619D27B68CCDDA91E7BEB15F44E6 +DF8B38AFA1C63C6F484F0001247F6C60043DA83C802E0116A1EFF49EB943EAFA +01412A0D518E2E860F61B649D2AC312AC6D84BD5D7DE93A13DAF1C4336105813 +869D47538CD56009E8BCE20243001E87020BB2DA91D83EBC9E9C98171F1BC02D +56CF45AC7DD7358ACBF26590A7894CA6F99AD01351A384540B9615C233ACB22E +519CDEAF5A0A975B8B6E7C711DD98603F684259B9210E8642D955A4F4D977291 +4C9CA4F59C76E598F7E48DCB42A331BDC8D4427A13468B735FF5D2F58296FF65 +180B22485EF5DB6838A5C049B1371571D7257701929CECD5E1A315AEF62E2E98 +2AAA70C380E40C3CDDCA85A71558E3AD0AA1064F840FF75334059B84A026AAC9 +DEDB589213D45C520F8BF067BFF0170BE3120A8F6E3BC29E4D1114DEBCC4626A +96926AA20AC4396734C91808EC5DC632CFD69ED1D517D9ABC261E00815E1F3CF +A4ECC31B5B0348F96BD4AF2EAAA634EC24FD310F86E5C760A122ED44D2962EDF +06104A5DF36138284743DDDABC2EE689499333EB31347F488311A93DF9AC358A +BA157B8898903AFD6CE2FBCC2A558360D174E2A68015A676EF8A3F0A26021B55 +AA27B65B2755F48A46920C0BAFAAE72E051085538F6C60D0A77295754C755BCE +D30F94627DF2AD3311767D183A22D64480ED1E06BE21162BE345CED43DA52047 +3975C8647A025E2411F15A78368A2689E100D692F23E0FC660D321D55ED4AF88 +01532431864B03835099474C36F1C39C71173A04965719A7ED95995AD5AB40F6 +E8A33CC915D25C2E9EAB91107E89DF746FBC96DFD6FB7A9F020B0E3AC7C81150 +C21D9E5D9EFEEAB4BDBEBBDD705BFC0F3F52A77044831A6A0397DDBE135208BF +1E86FE2830A8311768634E62B589921D1B5B1347ADB167FF9B410FE902ABE465 +2E0C320C3B5F7CDE7859749978D7C2C80E5FE38901EB75FC166287F5BBFA6848 +C839C5FF11FB245ACC7B6C8A74720BAA44625D84C721AFFFA310E52EFA782EC6 +96014134479A15A5C6DC7D11D8256DEA0CC645D9F0B0524D7885A8A59A2638AE +9DB5273E3F3302D1C94C96CFC9CA768F3A1F8E41543A272FBB3D40D65D82EDD2 +EA11E127CF93E345E87E41401E2699FF0BE4E92814DD959EBF4FB412D768361A +7CA5399AA68C6153C77FC080273FF4A987EB649C9F5C4FC18BF106E13BEBAE7B +8DD477865BA85C53A797BEF5F177C053ADAA1EA2804CF04692817BDD0DAC9936 +C63088AA328EFB1B4CAC4079C2EFA244605E362EF8058FBBCE41C2774AF399F6 +E9949214D2EF9B899B5CC5F628BAD3FF2054AFDBCEF21A29783732F56C52D19B +12C2301D5C525099662DA96E0E07CECDA9A2137655A3BE6F6F828C85408913DD +8F31D8521A84FF78CF44DE8619B8E922CC7313090F45860C5847A50792518480 +6CD5C1B6471F14D10372AD4C7CE4FF0E6A9B4D2F627A74B52660794691F1789C +BAFA5D38F92E492EDD7A0DB2D7E860250C0812522FC5B912CF0A39620FCFD304 +D67F4F79FBD079FC05E403651A30489B717FD71C42DD2CFE0B970460F7D12C2A +04492DF55C523C5E9C62318FDD451FA5CD0B7325172B5A07287DC2653BC5EE83 +0B78FF312012FB0AE605575EDB52F2A1F16509C12EFBCFBC070A4F9A90E58F27 +30D5CEBDD6DA1D2D740E0EAB4AB226F245C743D2808C3D843722050ABB626744 +652B3D3CCCCB276343C1BAD5C4D307753FE781FA7F47B3D9FAD9088586FECEFC +E0977B68BBEF19034F53FB1BB7868EFCE3F3FBF89A26FBCB3F8FBF55C12017A6 +4743BD2279542A3B824ED697B866609546A4C27D97DB532BDE215CF8AC0C5E97 +059A761A197606B6285D936096EBD2AD7DE53C8CE2B0D0B4F7E50D5E11FCDD0A +2BF4736B7B9848FD1D4ABBD8A6F3903F1EFE48F0034F9C888923EC768D4DC7B5 +EBE32CE269396D9C198BAEC1076F842C503E546705FD1678E7C6B8C3F5F431BA +1C63CC1198893BA77CC79E5829E39B541962F6B110E9CF545B064E46F3539A1A +CD080E98DE474EBAD440ECA7E820C145955BA0B6CC80E7C4109185A3877DAB6D +4886FBA0D66D6C3F619ED6A81B346F5A196D1CCB4D796E02C35E5301E9C34A58 +3BAA4CC1BFCD6B0906FF15F200FA5859E6CA7F2A21872A51B7E75FFBD92C3048 +9297C015A3BEFFC5B5D13A988AAC23AAA4F0DD4F86FB5E6FC8279C43A10D5C2F +624E8CDD2C03794CE1B2246F7BED4DD4564395FEA490A41E5345C6F86D847D0A +7AD58C606ADBD3BAE5E649998FAE5D0257FE2878CADFC7581C22B31CF420A0BA +A3A76624A582909E209E53B462BCA38014162605977B87FDB8ED67757CC363F1 +A50E5DC6A8441B9406D874A756D91B978415651D91E8BAFF5879235B830E8702 +700D5A797B9E1ED4E04123513DD23604951C26C892004DF6B8DCE876430ED7E0 +56BF36ADA204464C0789A18B2C8F9B212BBD5E8C9E2925D40AFA394F8677336A +C406534E239292FED55B20E5A8F986EA761D33B46BEA1A37DB3E76FEC6A5EB04 +BD38F5B8DEDB095993F81BF12936932E610D72CDA00A2D3CC2522793B7887B23 +0FAA526C9D42B6C087A936EB98B776EBC2BE5E2A3301AE9A91044DD21403B2F2 +976BE40E7374CB47148F8CAF85C16D7DE4CF8FFF13470B2E6925099C3C97219F +5F967068A9E82488FD591A964FC3169C38AFD8AA352CFCF35D3E0D6045484475 +4EF4EEE6AA387768FE9767CCD9F81818BBC7046AE0C2B7B42BEA5FF70C65CD66 +2ABB14F1E1FDE651C260129E2235FF02A7F27F1C948CC500657A536FACA3BA8D +8C3FB591601310A2315920555BE054BCBF4668DD8032C562EE12D2C7ACB9C50A +11CC8E3B3EDCCA00A5067ED11C24E5F0037FB82955F242BDBE1524583D2B676E +12BBD3C0FBE80DB47A23D4EECDD1F6545860A415AC6BD2E852A39DDB12EFC723 +D0EA87E1A454B661249959DF54DA9DA50970BFBE0113821F1CE71670827B443E +6544081B2BE1260270A23E9417E4B0155A1302BD9845A5D62FE9EDF7D1172353 +85BDC4F2DB55CF4FCCA18ADE873B53FA4FE0B58EFC867599891A165631064771 +5CA76573ED070A85B135EFC0B619213E0518F0D4A95490C32535F66695C84124 +A1413AD30D918BE68A3335E65C2BEBEBE4E29DA17A0FED672F3B714F809C157F +006AA925F96003CBE7DB7C7FD7BDC5A890B9EFE60E9915EE7AC3B3FB9EDB2CEB +581E71527907A1E43FA1A06A12CABE01979FF0E28EFC4965BD7ED592142D9F82 +47BB2417B528590A116C791E19A006F274035B74C8401A35952844F22DAC9D07 +EB2F28E3C9BC5B8E1373F1538F67686055D1273C565F536E9F35225A67D53E86 +510F371B7E6BEB04027216BC50AC67B2C0E9F528CD55613195C351098FF6F9A8 +D713269EE95CDA3CFC786F8F28DC3BFA23C6E3253E4E5CFDACF097B862636CD3 +B7C78FF990ED9B7BC27AA51DDCCF408F0EBECC40E555250C8077DDA1646D8BA5 +00697705ADBC54DB525A131A1AE59FE8E7C3FA81A913FA5C6BEAF2FC393412D2 +685F1AFB5C1B6208AB5E4900E29036832E8942550F206D721A759E994814974A +11EA5E5A027C3870A06622FED8632C3D125ABE15C71146A7FA4179DCEA8BA117 +E6CE9AB0DA1373933319CD27BDD4C69CE672491B1F15BC249B7126F141FD1AA5 +30121588773D42E0070723427DF6AFE7FAE3DC6B940EE28A8195489F1DEC2811 +A4773B6594A8BBE4F439EF76D5D4025BA7FE822A72C5D7DAEF0F1C88342EB016 +26203272584C62E26D16F6E1A5B37A65C51553F93ED4EB12E95D6F39DA5204EE +62B52BBCE5F29A47D942F247A10446672FF26C6F710244A237C89A7BF6D86F7E +1889103269B8932632BC0F0F89FE477C24133D8F06C1C74325FFBFE82B59923B +06045FFF59B25B50897E71B8D94395A939C9319190F0D891C24BA6186900F8C7 +9824B378C8570583C5303AFECF6D32A4AA96700D915D0DA70DFF8765D44740B8 +518FE4A6A8049E3CAC9589A3C0752F4E0DA6AAB319E1C21D0A760867602A9CF4 +CB372F3F4B7B28712FDEDABA55A6B24B533FB96701728762B2F7FE2DD070CC3E +7FAA0F6214500B495F5D986D13C012310BE12BF864B7928BE4FDD9DB68EE7C9E +21D645094A676809C455F8AEB85E5B5B33F9AA13ECF24E5258D49D2B233E22C6 +F9926353011DA6B75D17AEB6BA6EC8E4A405181F04A656E0CAA13BD463BDA234 +5F4692AE9FFE0C4240B7F260AD199668D27C07ED34E69BA9C3E09AF0F18E5731 +71C576C4431B9DB7E83D645E7FD6D3DDB5AAEE00A9A3C806FBFFE1D8ED8D8A47 +4F69A5BD9747B6BFA7EA057DF540203AA6030B5932896D1E586A8AE9730B32A2 +8F6B27400E4F0773262505F37CAD309D48B02FDBBDE883E0DA5CEE4AC6B28AE1 +7C7663C7B4AF5EACD32EFC8A8910A3BD514B8E19820CB2741BED0C03DF65DDF7 +ADA651E232059D9AD05257A8B271BA34007E8E2D6BE190CCA9992011EC455E7F +1443C4DC5BDF1098C399877B64E02DF566B5CAF6B8BE73CEC6A2651305E32C91 +2670B1D570CB8F2CAC29D30588D7C6D3D810F660F7BF30C18609D72D60FF745D +D879957E4542F5877A05D0A281BE84656D3D9879FFCE5F667854CF00DC01B8B2 +38D2473544E81D8ADFE49FFC6DBA711AF38BE51897A42FAD78DAC2D1D08A3780 +50C9B002A9EA58E0DF5F4FCE96F3405C9BA1F32C91405CD058E9EB51C43457B5 +62755B6FA91CD94C22297FEB48DC03CB78C0EFA09C74D2E7A8FB253ED4F6769A +E54731333C9EDF078829A58AEB8C1D28D1D7C852EC574B0E2ADB99F2A0CDE7B8 +4FCFEC125944835A8E3F1FB0C15FB669E670D2D8DBE24886AED75A9190BC52DB +BBEDC221D68B88FF825E69DD69E61FC2E37459DEBABF7BCEBC179D4082DB17F6 +12408DA590D1F768F630951D7C72A74E5172F71C97624F2F4DFB37E4913BC382 +990F61400A362D5AC3A29D64F1F1BB24E572832C8A1A8983903D086ED747442B +EC2DF2DDE41AD05045AC4BFA77F83342BC1CE856BA2359A66612962A5A2E0635 +806D70FF2F6FA279F639E5C38B0360C33A170362F5EA48E096CFD7BCBC43B49B +CD4801CCD9E9C421F24B6CB3F793D4ECDF9B1713E7C141934D53EB8FF655273D +810ABB04AEAB956AC369DCC11C17D10F08BA7F1BC47A45B3889068A169A22761 +52149F3BBBE409F8C28FB89460B55FCC0A357A14FBC50A396512CA588A4B2324 +E557EC51138CEA0ECC37980259DCD9E01FAC43FB9D7AD36B1D17656A932FE69B +3D224B98F0E562368682150C9D9D4BA2907E4439BDB7A6B8F0D18F8CA351B446 +96CBAE1B9EC0C1BADD2EE20443E01570A39BE38FFF7A2329CEEE5EDF6B2DAA05 +C51F9F75B21E7ADAF05591569AE0DC92F469675588F12A28E84D178699FB76AC +D75E66C0F26F4CFEC9BD0597DF10342033D0A2CDE6DD2576A651DD1855DC61DE +FDD8BF33FE487AB7CB0FBBD811F413BBE9E23F2C832A654B37BA922AB7F6DD9F +689AEFB8B49DE285E7CCA8EA94A0C45B5431732E81F5DD0FE804CCA7C82D5234 +672B3670A16EB11024C31FF89A5B4C03B28B2B582315307C8CE8686557A644F2 +65C8C2A9CF1C9A2862BAFAEE0E94AABD856A183394331992EC764A3B82EE4306 +2B40848D8D95D0CF561911797C9A2C6D9E334D3F6E595D59F54017218A8E6376 +39235EC929904AFA8EA42EFE54D294768DE0B68B4C1907F61662FA6710682673 +AC64FE11B84BFB0BAC6D1F5F90FC91AA5954BE48868AEEC05E19117B682186D9 +A0CFE621311708B56EC668EB0BCCD9E9837CD7E957D72AF5B562E51378E8A9A9 +34947A8BED94C55FC7A429E28DFF9BEDFB3F28E5D1A2536B84DBD1677320B132 +27F8A8DCBD4AA2B971F2F02817DD7753431BBB210216F822CBAED265C55B79BA +D7D5FE873E093D62250A27022D63D7C0823E9FC09209550DD4BA413E50FE2DAA +8D60AD9AB7E6FCE79E1B6CD6FA41F5C723DBBEE00FFDC8F614DE64DF40B45BF2 +84D3B6F96A1375CFE96E446E6757F31F8FD2E34DD88106015037F4F5B5D381C5 +AFA0D5724AFC260CE676DE70C666B34520FE2E2515D2C5194049F89EFB0D1A4D +10D40A12986228BF3CADEE7E8C9564F9F2D61E094C44310FD5295C5AED950A23 +491431F3EE071FC38FA803DFC580A7F0FCCFF19F3D8CBE0D503057E95A2A7D00 +A490CDD1BDE01EC8370310A869793E4DB867496094D4B54B3B9AC440F304906F +AFF32EB87AAE8075149299798E681B83D47935D93FD3A26302E5EAB671BC2C7C +7E87A4C1789A772A9643C5737084462AF596F23DF9F36A8C00488FB78C6ECB64 +60A22C5D2DEBFA17E2A78968EFD029A29CC04B6E231B58ECE47CC6C93074F701 +65B19F77969B4DE3A7272E769CA00D5C481F5791E559F61A68CA64D4FF88D513 +642E82C48019C5BDDCBA0246448BCB765626462BA0CF6DE0E55F5C4090DAE3C5 +15076B25A8673D89A4DB9B5EC5B133EEE44BDB76AAED2A91FA68632997927EF4 +EB93C9581DA7663A24CCB982D1BCE9315F8F719E20C9E388907555FD27ADD8CA +81B8A4C5F4F7614F15F5A6D3A542E3F22215F0DACD6D78E22209AAC0036AF039 +12045C916E9858E2C07B20B13B4715DBD513DB1003D256811D019BF84EA41069 +53731364B773A23EC103ED81FEADFF565BADC9B698819BE95D6386980B13D678 +A33460A92BDCC24FB6EC68FB73A8ABB4D240DA5146F04B1529EA28B8C47B661D +3A27F5E03DFB5C7BEB8B1E6AC63E1CF7236198487663AC00BEB5F59EEFC366AA +C9FBE97F8EF03A80F37DB7F1D98D5994203FC3DAD6EDA29CE5079E09D504E360 +902FAD0E67257EADD77A989756B3F1B866BE530583CA81610AF81D516A78E37B +4AD1D27A2ECBF67AFFA6914F06CA73AFEC79921474F3BFA2D2C169A7666BD668 +821FEE767FB326ECA936FFF52FC87963027983B23751956C9780F1791595C91F +3A5B497D8107667B12CB2D31A64F16F51485CE00F376DC07CEFD4DCFB7A91C27 +CD8F3584B14CEEAEFB824C59FB4852C2F285159BD37CF3E3880F47658D3799CA +E8DCCD4C79144D1503EB5492670440976954FCF0487F54EB23A1CE0A139AE7E6 +3F34594B7F85379745113C0EE8D05E10A6E740A76CF900F5EF056DF772B07258 +A3206320647253786225D4CC14548B1750CD034CBE4FFFDE56CD84B07896D08E +2EBBB9006DEEFE45EAE3688F06806CABACCB255915C695608A6C99DB3AF5A6E2 +DEF0B77D903B0BDBA16C66541905C737FA79CFEC143CC89C4CA56857096E7A07 +B8A0E2E16C778C5C929066AA567449553D2824B68EFBF7D7184E56470080D7C7 +C847A46A9C6556560B86FC1F82B7231742325E718990E81FF7323084267F46E8 +9F4B6BDFBF811CA84296216FEBE788EF20101B48EED478454F1B238C03A1E0F3 +DA386922D1A038EFD0555799B29712FFA294AFF0312793F2349B1DD00E16240A +6AFBDAD7B8AFFD1AC1AC380F35CB7DBE92D517408EE81517C04D9A82E1A6DB84 +EE4A6EB49650B0F94A64500A771CC0788F0CF8EAC76EA80437DA23D05651F9B2 +65C5112FAF87B2AAF4A8E07DB8762229DD3C2D74C364ED6F41E853DB2B6DE3F3 +9AEF626535EF31913165796AFC6989371B04BAE091F9980448315E43B29AD252 +5676CF2B2DEFBB0702007DCF4F8E2BA032714676CA56CC18BB378D138075DE54 +316D7F4D9C73B08A83FBE43DB11606B0520EB9C929BC4BA925680FF37726F65C +2DE1D25B9500C2C2DA7592A5212290DEE61552175001675E3258903873E9F3F3 +C2D5F7F57B1ED253596425E95743F67145FE18B80AD5194096E10EAF1329BAFF +C5666BBEFE818C9F88ED0A728F5A791C297C97B4B398621E921419358666B69A +63D129C875A930087A889420CA64CCBF0152CFF788360BF88A42464C40D03B1A +1A342A89C26CCEB7014C0A5A1669331D918604AA43AC4A0FBEE0A39DB47028C5 +44074EF228719E1C3CB91FE9F053148F3FF3BAD16CB57DDE5E3E863D40632D10 +68E72FA28B258913E38816D9E0A25616A8DADECAF0DD52625FC5BABDA943017A +3B36959C495A114346E805A9793D2F30C5F7AEC8CD082DBE1386640593ED1E97 +63A98310C1EA703BE2AAB203095ECABD48D761E92D614233788E4FF98C154A95 +15B460EF33121AC9EF0BBAC00683346CB2586ED0D18A62CB0D6DCDA7B0500843 +B07D9C149678BE81FEF9AF9BB18D18B5CDD59188DA9FD6A79822A69CBB9F0A9F +731FA4955946D4363710FE1AF278EBC8792158D431B74327017814D69E5ACDE0 +2877824093AD46C7FE256D4615B6A2EC4997310AABAE4F3CBAB629F1522D5B2E +5B43E931917589434F5731D5418AE96EBB0C07573EB153A6E5442202BEDB507B +4D09872458F184159873E21F91F999DAEBD2E29BE8E82C6B796345B715693703 +CD412195D1F170A2B2C9045A4D3451752FC1945F82E92B07F37828F44EF2EA61 +77F614FABF81162CC1ECB0676E8C121CEE5B20F325993CBD2AEC8B7BB1D8B1FF +85D6D33B75BEF89146FFB0BD73DF334DD1A9396861EC67E447477A00A4276652 +F67B8FBB2AFCAFAB9C3A14B0F7BD3F0C54CBD763EBDEC129DCD7A7DD2D6760B0 +460EB2E5EB3414C87365BBD0500C5FD4773525A9455BE7954C616C3BC0D892A9 +AEBA406B14B5D5340785E7EE4C2DFEEED396DB448F20E58725E213DDD11DA1F7 +000EDE41596161C72151B05D902FE2E3203C3C6458F3B462E07FB0C40FB83FF8 +375942B9C7440A0EFCCA65322797DD2401EDB69D308DFC579403609DF855E29C +3E35687C40EEEF2D02A2239181836DD51D99A366D88C31AE289787211A3D5FB3 +0BF10D01299C451C4DD869B8BF132018BCC45077647F72889EF81A5BB63669E1 +66F5EE6FA504C44096F7AEE1031A39EB8CF7902D881F6AEB66CAECA514618719 +2F4F459BF2E7E6E2462318279F15B1B20005AD6137F3A4F2A810A7F08D3E0BCC +4710DB79054C4FBEBE5AE07CB156BECB6316065D24C92272E276EDAD21FDDD29 +E1F4500E0358D8933DEA0609C49DC211A7A592EF2CA1AC5108898F9532311CCA +37C83333689A12AD0B185747D23E12EB86B0753311DEB69F6F471E0F0C99AB14 +CD4FA8E882FD8D6A17FCE3B2301D85F0FC49ADA6A508FB36ABDDD7A8835CE644 +264A62708CE1742A26ABD8CC7DCD1FA60C856B96F84EDE061B534431E012AB5D +93FAC0808CA1629D45817ECEF15B78EE77BA22CFDF620AC795E4FD1965976657 +DC97A3C35B513C8A31723C902D38F27714D3CFE6AC6F107CBD8B2E99FE08AD85 +811F052B6424524B1C049EDD48BA6F8D98B7C71302ADF601C3E5BA4BEDA0C7C8 +C1BF6E4B8079B303D30D0434B7F2E47FDBB7C46906AF947E7B5DE1E6ECE052C2 +9935D2985B98DF860982B3D044D325306A769065576686DA5F2E552C6150F5C9 +25D0AE2009A796D322521BA3329467B6DA1F629CF9AD82F9F9BBB30AFC68CC30 +97440AE12F41C7E4192D740ACEFACDBEEE4EBDC3045AF2E1E188FD6E1DE499C1 +E1B3EE148659DBD3B4EA6215791813BFC674D4CC8C066771F82DFAF4C5328AF0 +6292773E07A15B213126F96A3634CE70FBFA7DF4067D540E0C951F919DE5E0BF +DC2E1B37EDD3B45AC9F009412A6A237E7695AEF028A8D9EF4905EE593FAB2BAD +EAFDC2DC8455D087E72E9AB830108A138EC1D55D38A040C1A81A1E1E8B95F381 +9B44E42D55EE9057010BD0F7E32AA87D636CB9130F4793DB86131B9B2E9068FE +E8CD989A94FC0FCC144CC99B52AFD4976D651C0F855068753303593FEAD53AA1 +2CAD243638618F68068005C923E681D214597570B8C418C5F1B606D33C0D0C54 +3FDA50E8CD52D8ACDBA45C88FA875BAB5E4690F866E154C525BF02DD103A7567 +70A307E5AB1EDB318E5E32B6B40A6995666657136B18F9D45E0BBACAEC4332B8 +606F8473AA0971E2B4654209B2353A94C5E698519567EA54377A533DBE6B0ED8 +FF2D5BC21D0EBD7E1FFA597B59826271C18D582692614A48A433A3ECFDE25400 +C4243D260370C6D23EA8EAEC41B3561AA399C67F1E558A192B13F258945C318C +8B5ACAFF5793CE0FDCF1AF2A05152489398AC405F24C24C4B377F5D44EA10C71 +2D9BFECBC713A9E8CC834E52A5A9D58E9964EDF7BC4F1C0040DECA723C0F5C4F +1287CDBA5314110299A1CCDFC00E55759606AF2C52B2C47BFD3FF62D892723B4 +110D26139780B49E35D77D3C5FCDC51A3B3E2C64AC161ADD295004B271A75823 +D79AAC2D931232623409DBC3224E61CB529DEDCFCD86EA583C4097FCA9DBF18E +19700118D65A186F94C261762E54AC0A6FC47F4877236EBF23B0E497F6138D75 +0E20474E2D11E68F7CCDEFD46C5D62E81E559496AA830960F6DD379BA16BA099 +D13AA5FF5DA079A7ECA28B701CB49297C5F2E75A1F851008A0CB290DD0EF6E27 +5A8E785398374156FCAD3D45E704C6DB247CD56BCF919E836DE2E52C9FC0A8CF +052BAE14101DAE8C43EB766806E26BD91F48FA455C9269721BE8492FC68D8AB3 +01D638D04856E5D203D28CCD8B702B90F32870D104787F8EB6D61648417840B0 +924C38AFC4B7CAED1F08E34E1A3D46A545E86A4A4542ABD6606672C07684CE1E +D5F2CC4049DAFA3304817E05C5945F70A251873D93DB4D5912CC4A3BA082A05E +1BEEE45050212C93EE272E8C33AAC196B201E6345FCEDBF5143940B5D9263C31 +B8DB7ACB464E0C3989A8AB68EB7DFF28AD666AD3BD003C2978DCBF5602107943 +E5060D5CE3E42F27B65F058839099C2CF9B7F045D1927C7168202D39C6DF70D5 +00CBC98EDFF8837D6CED471DFE0E7F84AD5BEEBB25F619D672D9EB812C3B0FAA +9547AD117E6E27D7979151B2512884799AE8B4503308345680D61CE8FA394EE3 +4679989798DEC5B494EAD4C0ABFA713281DA98522810589A2CE473C8C3E448E2 +57BD26EC6DE17D8A9E1847795597413B1D80675B79D0AF56E8D4031300081FDF +1406B9A2952EFC0F2D086443FAA4D96EE5AF3AA562F67F9AF495B0F9FB438043 +4F955599A04824F8BE5CBC825EABF544158D99FEDC664150D66CE9C85C08B720 +7B33BEFAC455833F57C43CF481DCEF552AD267BB90D0EB2662BF6CF1945822A4 +4EB709E8DE26B4858A75CEF9689EDF05F91BC2BFDF73CEE6B9090A001D97ECBC +7CE94ECD059F992B608A19FEFADCE3B5270A8641DE821FDD3EC1FC766F0975BB +8DC349EB7D3179749B16832C7615DD310F815B71717495308C3902CA46C044AE +78FDE58FADFB233DE8DD6CC412CA9091C02B44FAB96133F0F617584DC2D5C51D +CFE828040673A5114DDE42228F73B42E1E7C9296C51BB657773D8F15B0797AFE +E846B26599E20C73E1C9620FBF224446A7FF87ECFE64DDB0D45875B5CDEF1C8D +36D20EA6F90E09F2A3EB423611423370EED5DA83D5E845051C65755A24F7E11C +DEC48C78F1FBAB97F6306FF2982E3B61C3AF46F2CA65BC15EF35803370FB787A +0831506C9FCAEC8299005C68DD453D2107EACFDBFAD9F861BC46FBB3802901BE +1C6D99EE609C7D9712D9756749D7E8E1FAB8231A9897CB4D7C95A19B734D1631 +71532C43E1E247CDBD404F33B080A3202E23B6F7549C7E8A8F0B050E3DB2A89E +1E30428EB2D2476F5F275DDA324CBA55D3772B0C460D711FED6D6ADC43CE821F +683181028981AE66EC16BE2D7FCC2BA13BFF93F3F1BB1BA32DBCCBEDCD9F793C +30C078A839C27CDA29CB694C74A70C86008F4F2B2B8BACA49ACBBAD11B0DF198 +184A6F107BD42D6F129A7DDFF949288AA27C916694D62C9AEFA24BF172F43B68 +930F7E369000656155A593BD360E0DDF160C273A4B3F538955B11F25846146E9 +4CE0A3DB78E8BE770A7B83E0043B3BBBD60C0333AC55BFB8E1503D03A37803BD +841A19848AC9AAAF32AC249E880BBC04CD4396DA8F4CFEB6BE6E9D261A3FE54E +C3BC8A01257D032E916CB34C9BC20263DF0828B5F94FB9006B09A00AF195AD03 +8665CC1E7A772D9968D35B5721163394D221147232ED6682CF081607D82E933C +DEDABB994359350A95AFF6153F29CD96E4C3FA1FF186BAC26D6B41E275D2AACC +68FBD05ADA7BB1C68EF37508607C9A81151D88FB40E78890E76795009CD1410E +FAB3DEDE1A0F2E63B8835743AB5582F45EA40C86469A140B33BF721B936FD1C8 +56D1D571B04E8CF1D856DED27BF608FD3286E827984FABB52D7579BECD5CEC42 +A0880A44C230C6AA718EA897ACFD482E0B79C46E54F6338EA5C58BCA595D735B +4C1D3C851A2CF846E86D685E6667B8A975F38DC802269CF7B1B0626E5E435448 +406913DE4D10772741BD203252280BB13624C2C56E861FDD9F1E2F9522FFFE42 +AC2E18083D916B54CBA60179AE3ED01FF1792A17DEEF47731BDDAD86ACE50673 +1D8330252BB4D8D4CA0D617B0064FC1F13317F799C1A9F368A3E0AEA888E2BFF +07C78C6048718CA2D0D5D1A20686A7C44EE73F6D749A9F0A6B978A4A522D3E18 +C4BCD89CBB1151324182605BFDC24C6C450E79EB69E79A420B2E271CC1F903D2 +8C1BD054304250E41624F1FCFE70F0509EB8C6D0530E1D6BF45604FCA1FB7D44 +FCB548EE92CC85AE335A8DFB27647879D0BA25409E4066B4F708D3B0C1FEF15A +80892005B4CDF4DCCB2B62AFDB72B1E1B1A172C313D7CBF31BC56C897E8D266C +AC8D30CD36BDBC6FDB790FF6FE1658FBD3244B447404E98BE65368F48B349003 +3E50B4F6F048042CDA62AAE7C6722BF80D56F1EDB47B87028D85081289617129 +15B21BB051833AEAA4BD415D04208A562D73F149543DECCC768AB03B0EEB3CC9 +59C09134821939FD322DA9A66B4EBFF6C0D10C0A973DEEF572AD5C92A12AB745 +84B1624E7200D285783930F51ECBF19AD8E48E709893EE0F1AB7CDA6CC7C1864 +F16EC1D3FFB6B4FE4DB7C9FB1620C3C0861F900FDE317599B4F050D465A662F2 +DA6E93495CFF5DD8EDA52514F3F8E6AE745AB86CD729721E7A3CCF64B0F6360B +A4F8158F4B952FA4CD3DAC4F5F81C4C93710BA738F96DD57595D424F45CED71F +6F35820FDCD31533FBCDFB56F354935CA0899CD8581ED5EEE2F85C135F50B43F +3725DC1EDE43BDC851AEA1AAE8520CF9DD760A42C5D0B3754C7B5C44CDC502E4 +E74830EC45840E287ED7DA2E98260742740D9B904E975F3F8E80D7AB57085C76 +5EB2AC9DEAF38B2E1BB7D50CA137D582B954FDC797845B3CF623E1F243E9B65C +87077E67C43FB6258770D604E0DF9FD9710B6FD6AD8985A07820C47F85DEA767 +F55210F70BD45DE7E0F3D335BC978E738F274593DFE14D6489366974AE4B9286 +EEB9A4C1A712D6C2DFEFDFF7921BC6E31631390B8132B6E62D6EBABD4FE38AFD +DE7E0A7B6F783786976EA8402DED90B067E1D85CDBF13C991B4CA2A626A3C8EC +21B13B0902AD8389C71F14B810E40394EA7D41CCFD4D13FFAD46BF4EFCE250CF +B6CD0B203E3CB540390BA8DEEB217755C284C824DC9626F917D119934061656E +6836B119CC894064B51B9FF73B07C559C366CC952531FE858C3B77706BE21A40 +BF0AF668CC376F042E965BD12B020A06D44815327D9F24C8BFE5D4949EA85FFC +21FDA7C58126B3F5CFDAE27A926E2E45DE062650B615568736B10F7CD8EC20E5 +19773FD4B559D45A18B152315D45FBFB4B57A969F81F42FCCDC15AC1C6890F75 +A87877B75A14D38E37CEED9B5AC39D4CB8E0A5ED6BB09A94E32BD33AE9B894B2 +9757CB08A99818058EEE75EC2DBDDA97A2425754D9D31AB87A1D64700D28DE3E +3748BFC11DC5D134090B50864981DD72F2999191AA0111F9A23E62B37C67FB9F +704C3BA150E4227774487A3397141BFDF8F6DDB22AFF40F61E05BBEA998A2A7A +553071533382226D9ACD4748325C9A90663913F9BD84C40C83798985BFF131E7 +8B3F8DD7214DABC6F29D83E336C337F936CC5092B8064031C5C67AF2563C19A1 +99E220085C7675F59AB67800B82C287908180C25229B856AC5B8A63BD0F0342E +E72FEA35B9EE85DF933DD7FF42E7FEA8580ECFF435B8AE058DBDA697D1FDAB45 +50F396FAA4AD315A892691D39ECCE620EFBDAC6FDC6FD387F3F20038680DF50D +9C1B28E5CCAE7CA4F11797B03A39192197F1F89E080270EA3FA549ACC696102E +3D1B1E762A061D6C772E72EF6BF67293A80A290575990CD2A04A2277E23A29B6 +B0936111C343C67998A3D25E726444CC87E187C602074699801FC24ECBDBFD1B +E9DD025C51EB2B93387A27659569A2E0C4DA2A7C3BB16EF63FCE6BC8DE27D058 +A323AC3A394005F31D8900CDECE02D3DADB7C5514A6AB69AA7041D75927C0FA5 +A9D40AF9433D103DE31E080F65D1D3D2AAA482EE9432F3CA84903CC621E1DD58 +72CEC6ECF9C4C4B3F854777B65215D7909A15260D3A39CAE9DCFF36B6B341FE7 +1E4A75C5F8702378CD5926103A2192FED1F469C2794C0B6C0918F2A85F512C69 +4B2388B7F553BBC5606C4CD3A23C34F60C4BA40904CEA9D7A82DED088E2127B7 +5151C37145DFBE0FBAF3EDE7828EB3553DCC7CAC41B4B4FB522E3EF6153B9275 +F71917D930792C63680E93C025775367346E04C4B34FF74022A327AF9349B223 +DEBD0AA515BC86E247AA4D797EC20564D1CF0FFA853C60B0AFF544BBF6E82EF1 +6AEF5CE96D05F66D650B4722569C2E05DD039F91CAAE1473E811005434D8D95D +C6A2071D47EB515DDCC5D9AC58F36ACCF2BAE3D0907CA43FA58DB14AF6D5BA40 +020E8CFF4AF7C80851FC81EF583ABD9B9ECB4D7E8981EB6D4FF6272C7AF2940D +53C6B3FCF4953344C70616BBBE917A295B491CBCBA2CC73992BBB1C037ED48D6 +CF3B80F5E08EC3447D297A8214872A48FE10A4FAB74EC700B71F2F6EFED27FBE +243544882B39F3808092361C9F7050943AA4F6D569B67E3436C004987FEF870D +1CDD98CB5F2ABF72B6E78719A6A6D95E6C918D5BECAA0C23FC99B526C7C8D0C5 +B9E17494C0995785EFAF555907AF23ECB761F47AE1B27ED80E988640D8854294 +5296708C4E9D46B90231DDBA9A15D5F8F2CD7D0E1DAEBB91CD3A6AB60D16024E +A61A84032B1259BB68A3E8CDB78B5C67ABA884FC908F0E0D0B46F297402737F4 +B8B40A13C9E2B987BFA3C1AFDEE7B962BBF7118E8063F83CFD19107A5B28E0E5 +FB38E0E26BE4E46A68BF0CB2515435A3C9D3A9FD61ED73B3CCD70BDEA56768FC +7E90410470B0087F9B123D986006E729CDC571DB1EA3D713AB3CAC52C42472F8 +A7325408C9416DA581B49C709E1E35C3980E9F9D86E292D29C24C169A4035836 +749A9D5475AAB3DEE92D6A0666D176D9D0C2D28183459001348453241F632A9F +E4F5886355B548B13CA7E9766263E70514F495EFAC23DB6F5970325D079F63F9 +852EFB7B135172F5943B51294BC44CF215D7DE2BDAA35FA62F2358A8307D9C1C +7ECEFC0B93842A762AD1F8E6488140331A7DCF8F85A1364390E213FCDECDF652 +803860AF5FF323B7D0314EC85BA7CA22D6E83AFF66C961C21793601F3D030BB8 +16EB9A3E7C97041C6BF0D15CEBFDEE1C2B48AFB25F7F588681F9B3EE2D5C010A +52020C0899CC36A1C032840171BB439D30A9D6B0F739910D8A90E43EA370CC16 +AA8814F65A26CF0F7492D076115E91DAF6A118133AC18779FF3595A42A12BD3E +B61611A23E8631E780B420EA0944BFE9E4E97F5649BD953E8E2981F3D043889D +F06A4C62B5B90F544BD3E98BA2639AE0AA2190693F4247A91FF8B227FE3FA527 +F11EAC34057C446210043E19E2BFA0C695F33B2F6BBF4CDBC07917E433B4F5F9 +CE078FF709CB1A57851D117954315C893AB0A2FBAFE2290E8AA09ECE87887717 +549876185C50621598452F23CF40207BF4B4171B13E7413379748716BC624AFA +BC6C195173052D303AF74F95499180AD2D76360521F090C99C675AD863E46B4E +E7F7E6F0B09B4DDD286C3F9A742C8B909A8545957D3EC324D04E66AF9F8281E7 +6FDE2A7A9E1710B452FF4537C19778A9BB296F4AB176C617A6F1B1F9076E5648 +9AA802B68AF5A81208EC0F7B829039C5C6773EC3B80479FC482F9050079173FD +9AC1F6A89862DD56EDA4A054E7146975EF106222B6267415CDA5EA2E8DCBD1E0 +ABE3A94DA67BB6F11C66FC5AA8EB61E55792C18CCC945D16BE530ABFCB14DE75 +8DE8D5154E6AF9763FCC5ADFFA0D25DBA667BB614A05E3BBF945B294D64D1266 +9579A4BFADAD351F343B529943CE554FD40D52A44A7180CF894B0781E63B8E44 +62117D0F6EE4D4700D903A72676F0E876939DD77B217279327D372BD4E69B367 +68E654E9F1A2D11EEE90AA49B462D517F76AF2660BF7282F4C78E1536AC5C130 +0C7A4C6E0D698D372574EAEAD8F979312D648177DD0C724CA7400B8729B0003B +CA47E02E1CE0B32F3A80AC9399517175C47F26E5FBF6AC5E73D178E7DF67EE79 +5EA60CE56EDBB227694AC21A0E8771B516768CBE2836A00A14D608D9D32A27EE +E2ACC8CBB9D5DE7BE40B680A7FC804F7B9A39AF6E829D112BBF57DCA2D408240 +9D2B89107BDEBE8F4EC1EE8CC6B1F89E78677B8FF2FD7384EBDE659875462F99 +2D4E62D18C0A8ABD3B87D806FC514B0E5700E83D16CAD6EFD00C79D624FE841C +7F98DB4ACC86ACE1776DF5439E425CBC1C85D489E4D542F504D384B09209BFE4 +D3A008E069B0FA3A71CF68D097FDE55712C7E6A5BEF6CE8BE02A4E92EF5231E7 +0D8905EF4FE0D5198E32511F945E1172182CF690D7A769F8C4F76754E5654BD2 +A9F9F23B6C230B10E3AF6CDC745538D174A75B97A3CD3697814180BB1373B296 +203E523EE5B64F1EFA979AEB8ADB60CAC313F117EF8CC53FCACB4883E26B0927 +7897790E4AABF9667F9A91AD32AB1C5CD27C26C5BBA5DB8AAA7E7514A239227C +D798DD6AF110481A99753FB9B3D570366DE14F6C0AB4C31FE068B1876934398C +EC2298CA0A9EA5BA245907DA786D901579C497C3739BCB6A4DCB2E34E21A53F7 +6F673C1131F114C05FD1D3B37BB435B726AC2389DF866200A75A151725788CF5 +69C1BE79FD6FC36625BF73CE46A4FE5F12E5692B47F7C26376DFDEAF5EA847F9 +367997E05255C7EC67832533922B997028AB8018F404ADDBDA81BB0698AD69A2 +B4C217C392BB250B58BC4FB901F2912EE8EB6703DB24AD7C2CBFAC12F8D081D0 +A700C39130316DCECC18E64F3994E2C6F5E0E1ECF2EA4B18FCB424D9B8DDE8E7 +ACE87FA17D11158E96FD6EAD04B12B8917F420BB29F4471326F54C896BF1A475 +3EAD86C7968818F95E632A852601C07CE9AA698FBA3043D86168FA27FF43DECC +C71581DE33FAEF3CEACC93F5D626FE05894F8FC2B8719A92261A215929127FBA +BD9157BCD9D4C5D62D08E7E690F1DEBBED0A839475B1427A7C91E7F42C3CF6E7 +80E8B55B90566E21214A4AB708383F0A3E0406058E26A1C34786B860EC597A56 +2E33F58DE6C6850B71E88A2BAAAA6CCE519055463B468E49B2FB70CD32D84B8A +8EA3077E49E848149B2A46AFF247D80A42CEB44278A9341B4ADA55162F67933A +3BE72A237DEE6B9CB4826D4584623FC93882C543D173B22CA22E6D8D5CCB02D1 +25EDCD56559CDCB126185BF4128C71F228D7CDD7C617EFF12DF100F64925BADF +39E7DD693362ABDD7E17C3B21A74B31D05C9F4F067BCC1D0AECC6C5DF33D4C77 +04DF0394656DF7F564BD7849A6EC8A2A0007E6D32FDA98F7903CD8DB16D85DBA +47416DCB4806AF61E901490C8DF6A42D050C5C07502E7AEC9C15DB70BC015E02 +9696950D94CD0A7E8D46557DF9226B1369975F6276182B92056065B2548F9717 +05D488542B6ED9CBE2898A37C41F3093C8441502585D607CF07E8D1473C48D29 +68D4217BF4B16F8BB279A9E7F4F4CA461A9E9FA912C1BA9355A4261438E9CDD9 +20B0F7E2C324A89BBF23E8973783C2367AB9C59693E1C90D3466130C0154AF7C +008E052A63DD8EE001FDEC48EFEAF1AA7A7FAE4B10D79C74E0586CB3E9809DA8 +E1946A3E2EBF15DCBC950914B860ABE6DCD273FF45D57246F81DEE176B7DDC9D +C5359E1291B5671AE9FCDB06DDC08FF46607E784084547AA7848AC30A32B08B1 +3FBFCF2829821733FB2CDC11AFEA7DFD97B8D278DA3A8258C69532DD625F204C +81ED8DED59753060C83C4FD0B9B4D09E1C6483637F7C8EED13DC01C2F477DE4F +5AB6D45C17BA5B2C6E8219B46960E39695077D2770AE34FC50510067B89736E9 +D172161F0F1E2A7FA79A400F54AE4F20E673A3D91D892C7F88BE4237F1A3CD55 +BE5D1F91FFBA4A88397329E4B62F9170AA553B0E7BF2ADA42C4AAA6920F8AC9B +0EF3425BA25C2EAB8DE2940857712C68A12B5D56B9EBCFB4F19F63075CFA8E03 +4255EC777F9FE32E47905F950BA371B539D7F9F55C21A04F1AC6D9280E8C5780 +014794256AD7B05A69B84AE84337B5C678E43BEE8445C0F79E621DB4AEBA9188 +2410D0E6720380755B4AC748301CEE5A235FD0C1E2D675C147F3C62037708EC8 +0DDB1C349FC6ED24879F0202ACD4C881DFF4BA4116060E65F17F07BCF2CEE0DB +9E8FB76D0F8BBDBEA799071F08AA753BB3129FDDE4D12B32F5D566D8C9D6A35B +4A69C077A6BD909F1BAAC2A2C62A6AC64E722D1985CE4E8771F53170A20D8543 +29D11CB175BBD9B632C89E4A12663C0941091A1532DBD59A65CF6D44AA4B08E9 +7B5BD346182AD70A34A2527E352FAB0C109AD72EF443A5AC713C005564373733 +DAE20E3198295D8DC532ECB3F98551F84AB2BAB805F2EC2669B01F1F5F9538CF +F6D20E05081178581990783705E24E9C25E2E82D45541E5C16A30A72E2E2A168 +129A688F199DBB9575345ABDA993DBCE8CF4DF1128B0E74B6C01666CFF1A17E3 +DFF06C8D3FB42097BEFB1B33A25F4BCC9024C29B4650B43D1CC0B79665D05D1C +751F94FA99175C257EA991E6B704B75714FC7FC9D5A34A1A3019AC5D9EA8AD7F +6A75CE3ED13ACE632532BCC589F8E94B8E08805C56E3D91A6C7CFA23CDDC4767 +BD735DC2A7FEE4AF8FB251174C1015127CB8F7C8BBA872BE416FEA0D359CBE84 +D915D1E8396E1267018CFFE5447CDDEF6726F47E499613589B40A72EEAAE768C +9FBA53FE832BE227F605E4D9E67FDE078120869E5F71E3F05A31CD37A8E48458 +6BF4BF69736DE755C90D6B88D5FEE096ACF50F5FE5523138DBBC095DB9ADF46D +BE0384A02C4ACE11DDFC5FEECD1E0C4F2554BD6F1F235C8F980D87059DEFB98E +411320060518A16DF3DA0DD8313C305E5355FA2131E16FF6A19EBE17619F5773 +8C626D6BD2B7A95CF9FC6996DC514FF0915A585AD3C6746B694CDD7CFAEAD58B +2F842D764F3D0B6AA582D3CB96632C6A1AB14BF49BB4F3CF59612FC40CF63A5E +E1CC3E2FDB2122FB8822F3A85A4AC58683CDDEB72C34E6E346DDC00FBEB75FA1 +3E88EC10B348E8D8DF2053EF2921E8BE24A1CC861268AC66CC4647FED7EF6ADC +287821A9B3AD7191E9733FD34629DE60C47417167ADB5C3B2ED7BAFD2278E698 +6240EE28358460975D3FCEED4C2065CD0FF3AAD547E1C63D37EF2A94BABF9B0C +9525F03D5385CABC6AB58077F2AF1F9FBB419BE35A8980178C27E4A19F30AF35 +A48B18A129B900CE280C100EE5A40C4E6E393542472014F905C266CBFC75ABC4 +FDAC0228A9E73BF3B268D9736A3F8560E78B48A0D7DD43050A0D7757A4BC7C92 +6C066B399F71CFA5BF090EA459CDBBB674E03757179C43CC5B0FDC950D6C801A +F3D07AD30F08A6D299D1E784152103B54ED264156A97D64AE4FBDAF8D5EE20DE +1B80A4E6AFB427A0C18DA8A43ADBDE1BCE9DD46A75C1A1D15995370F792BF843 +02D4672D4493773F5907A814ACB139498953B52390D84EB4474934713976B9F3 +BF26CF310A682FCB955682E4699ED265B520D5D7800F9311C6AAAFCCE8E92435 +E7681D56C537A1C1BBB1C2CFB94AC92D816983C97614E26B062646E2C8808D07 +5E18B87ECCE3A0213EDC73919F7C9D80536F98DE0B9995D8EA4A2633D2E05417 +AF3DB26F9268647AA646C4AD12C3146745A411ADB2502D1ED58E46B7FEEC303D +87065F9B881907F127E02DCD321CCC580C89FA6B3095F607090B2786E5848D7D +273B36207D75A008365C5F1DC4F748E78A6F791ED81631D7EE1E6D79049B8F2F +B7F38FA45B8809B4BC05CE91FA3C2F6F6AC323B3D304E8EFEC54E20045B6AC57 +D08055CB193CAAA5C53454E279BE8F7F38F949EEBF62795AE7B5DD0FCAD1C3D6 +4AE4FBC6186C750F3F2DEA0BF8B65491EACE7DE5635470EF6F42C3395D7BA0F4 +A0DA6BB1A99FEDBD90A551FB217644CEF9973BB90A7FFF3318499582A93468F2 +9E766C2906BC6C4BD7E300E48C997C474C03E2A34D9B969ADA9AEF04843367D9 +AC4A08FD88BB672F2DFAA2CD0B871DF62A43A61AEF77AD88ACFD112850940CB1 +D74CD733FC4DEA77C454A52ABF2BDFEB9EBE3FEEED53CE6D4B1968F0B2BE90C1 +12F96E7AE2CF62F7C2601B589A92D8B024E00D4E8B1F636884803554E9B82005 +8329EDA334D1DF5EC7384418609A8D89909245737689B1D108186F4C53237559 +EF42502050EFD6E7F822F835517FF93411F08B5FDF163CA1A19945FE51C31F9C +9B1EF8AC79EB037F1E704243CA1F33FA130F8DCC3F56219CF6987AD73627FFF6 +1CBE6C8911831A43827D5505C1289A62C7AF94DC668300057993FCC20F752A75 +5E79244AAC3D790CCBA8222CAB05A953BC9BDDCCC59E1AB9F2CFD3480B836B79 +5C74D384C53723CEDC5E42212CE487EEE190F6B067C322610A6C17E0D84A7DD4 +C3171856FFA19470F84E207DC9BEC7B44C3EF2BB5B043929A5E900750D117A20 +EC2297E4E6AECA011F3D08B06593518515B495DF8D64D3312AFB918985A3C4AF +173ABE8C26318ADDCE1C262B03000CAC5B5B4505B26B26A028496703493D3AC7 +E24AEB4F741A6E4A68EEFA0D156E58CEF880E0C41CF6291D0AD20D299026B9B9 +D09BC425FD7D7EE59595CE14CDBB36CB4763AD7AA8841DF5C17FF3A4099BEE95 +CDF6DCB8F9ED7E118BE4F2D2F5B4D67A2781F1E2C1DE8CA03022C964B1337830 +1E20572FEA296D9FBA4FA416056378BAA8A86C165A39EB148B255DE0E7EB6351 +EB53F4AEDD8D411703A3F01159BD148796A1FF52666D962126FA863C9811B3B5 +ED20ADAF32EA3BB018EDE34276FF46A7153235B2E9D778402952F2C73CDB0290 +3C24E2BD7C74A77BC339F7B421983E6146F64718605DAAEA2914F3C4AFF5E078 +63B7DE54810BEE9F140B9F4B0B84521AF90C462914CECAFC07EC0617A189158F +B4EFE2DD47221780D87302E00B139F47239EB174102E7304F6B83B71DB890422 +CFFB05C39ECC0EA883849178EC773C3F0C6413FDFD1E1DEACCAA89FD71FDDA42 +B206A827F434160AF34813CB02BFB13B08ADFD7A0522ECAE1C57F0B35292DD55 +213A2E2D4E7BA5971F46C438332D85976B7D2F15425CF626FADD7F0193C88B8E +365C3724440FE3A2A3C8CCE159F7508D23AEFC92EE92B0F824BD9A5C44FC96D0 +8126FA6E5F23A6207D079E24E4426D0BE4798B9DA83763734EC13292B5FD113D +D5F83379F86FEB25C1ACB394747D34F0913B7BD34FCFF65AEA28FD21BEDAE94F +CA631856987B7413A7F7C5CF8DBE3C900B7ED998A3141702EC5B86BC12FBB132 +24608C6FCCC626F19871A87B5AB45283BBCA5FF6F1A19277D7DEB93EC5EC9977 +4F23995267034A21F92766D7CD17F573E1017AAA96A61DD36C211DD20AF3D34A +340900F1188A9547FB19761E2AD2E0FD506F17F389CF9EE7D8BFC1106195199F +59FE361A39CCB0EE0D9E3C5782AAB7B6E5473B50E81EAC6A46047F110B155079 +9EF8C17A6BC2575A28D2447E3F08742F4BA6205B5C198BD5B9FF54FA07000468 +19A6A54448108F6F80CE1A07F2A6890AAFAD3CC15E8505EA2E2B3A3B35663B5B +FB6F6FB1492DB5DFD395F8703159A8D5EC1E73F859722755453931FFE63B8D1C +7377F5B64B3BA3B854C245569A731BB6C13A7AC4C6A2EF2374CFFAA99CDD3984 +7BC0A101F49D0837B84BBCC374B5FEADBC644FD8A5E66450AC95E28BC68EBBCF +0E594CCB0BE38C6B50D4958B0333E568BEE976DB2E19A8E62EDFB683B7331EED +3D67E0C0015948B07F6529D2620FA14FAA23A898A32360B5BA9E21BC24DF15E8 +669014A32F848EC36E63348B0FCE5C5035DB8C2234E3164DEA3243633046903F +94EB81AABBAE58A1D2A6EBFCD301BD54F49A47670CEA8E13013DCD9026201231 +CE0687971DEBA09310443ADBDA9E637C2FEA83D73048BFADA322E72F3C577C16 +0C751FBB90641C66042E4487DE1954A2448ABBEB51D1C11B312A3D5A7E1C3D71 +521CA8F0996C2143A0685CFE49C8BCDDC0E5403823122076A1A9EE3CFFDFCA31 +BF6A4BC12E03022A8D423A71FE46E17FC03B333A7F09E879F533D9BF149D1CD8 +B7A8265D47F2D63F6C961C003250AE33321BDF8488CBA52E2AE5924CB1A96482 +C5BADBD45C8E2F6794E265FDC9E5D4BECA1748BBAB6A6E1D37A5902238B5676E +32409C3053B8C8F6E6FE3C4CB1F3DBFE8A920AB0D4D5903D877ACCD0B367E912 +C9C00CBA8EF9A3D9F7E042CFC3ADDDF9508895A9B4C61D6BF0B76507013EE065 +82241B0AA5B0EF9E30A2120E154FD9E844FA1ABCFA468D7B3D58A4C97E433B3E +81CBB8C498B11D75A2E818EBC52EFAF545654E2B60207B986EA905F4E16C148B +CBED6CAE4C7DAF3EA41B1FCD32BEE448325DC5DFED2585676CEE3B057004EE9A +1028F7D0488443BFF30384C88FF25886DDC80A155DBFE1DD0A9161F5E9AD8DDB +9C81A53981E6338E822372062488ADE96CF40007E4AFC7F6602BDEFF3B5DB602 +50D1418A90EF6AC7A630EFF91835EF925CAF67C2DA09A1929301938C5DDA0EB5 +4DF4FA31BDB196091A0B171113FB3E293255F76A78195643CF930776D2CFD22A +8E991888FC446ADBD613AC37999EB3E14B860BD70CF6B77538A8512F1EA8876C +F68BA5C67BDE3249C2C46B91D1C86E153D774B9BDE31FE310F24C69857D7ECFF +AAB9BC4A73FD94851CE77417ED982BE376A21AEF2C167D5858534EDA58F06509 +1C21F5D13F23C76B599873E237A9D0F13F4E93342F601331C93FD12EBB6A3A96 +2B6EC380695D00C55DA40F6952F557450E914519BF6441279EF39D7EDBA95112 +F28213BA6CA883E68B59C546484F76BE53CB0B6732DD19DE6065CABC0F9F9627 +75DD538AFDEBCD2363D39D89D0A3778F7FA728CF375CE8029EDFD0A068FB5CFC +A13E5F2732700EC4060B28B7D7C1252A7B9C421AA6CFD0970C4C29596EEAFE13 +E8A8DCB6749EC08D9B25CA464B7A7F94E518B269AF5E5E532A215DA9640B6E04 +0DD104E93D58236D0A2C481EC119FF16FA1E0F8F3349EB6B0D347AB5A8723D45 +348F41971756CCD0BF3FE5F03EEBBF78B974D1D6CA364C5CE160C8FE154B3176 +3ADA41D6A7D2D1F0003489A7DC354ED43CEE9F121BFF9A85F65225CA38C7DE79 +EB9DBFE2471AFF0F8407E5B8C64565BC219C22AB0F1480908E1B5550EC510FFB +62433B1B36B30861E183E5C2EA573B54F35F2512CBBA49B7BE5BA2A7F290ACCE +FC7DF2AA1E5882A8831F9F105776E9DB60DC0DEBBD1D1E8403704E246EAD6286 +454822A957EAECBF31AC200EBAC45E0D340FD8587DB953D3F9086F082487D2DE +771D52AE8CA7416FEC9E91AA0DA73F969498A9A1610DF691AD908917EA3BDAF3 +78D5A705B156A95002AF6FA3BF3360B5DFC67F1BEB4EFE9933562BD01DE2529B +E044F351F50D51EA139828EDDAB0CF0194BB070ED70B68008258150F5CCB185D +92DA71065C20C2807B3CE00CC0FB725440B7BF52D0F9F6FD58AB3B0FD89CEDF0 +1414D83D25F9D2C91A5FB0EAB5DCF3C51902588EACB5ABF77736EF39DBFE403C +D0B13CFDC488D079A86079978DACD3E4E5CF112623DF2AB161E9A8387A523081 +51A836C2240D7FF33E113BB6F72843B7EDADBEB595D3C0EF5C55C5246139EB79 +28E4FEB7C216B4AC7C8189CFAEFCFA919284893684890F17910242704CABB4CC +D805F4C67DED52E59830BD569B19890B527BD916847C951BEE9652E602AB3DC2 +69B1E2972ED868219023805692F80D83DCD99B5B454FF9C52C46AED905140F10 +AB71305333855E1E8DED599F4824BCD118E789BEE6C260C99CEF1EB36A10B13D +7AEF20B6FC8EE0436D3C4344AE5DDC7018237B440867AC459C5A31F9171337AC +5E8807FD64462C64C63A434B82D3C0BD1EBEA855399DC50E7CCFD487097A1561 +62F5F651E527FB70C0E47FE6680E52015FE2399E25F00FD38AEA37B13EB42435 +C4A6084C618A12651AB94A09793B7B5633C350CA69EA9B1CBEB45FD240FA6D24 +58A6AAB28D6F6C97AB6854A0B04230DEB18303C2D77B3B7492D28E632AB60EA4 +DAE6441B7DD6804C47314951870CC30E662E9FD669CF37E4554474A6CC593801 +E8085F0AF185FE7D8CAB69969DA62A37171FB6EA39487D2BD5F689E6C67D1EC9 +4532C8DDACF164CFC7AF6850F19E199FC0EA6AF11078F873719A5A10DF16CD1B +F6968D78666E0A12B0E8AEEBFC7E523C37595A47279F1AACD6D7C832DF6CE944 +2896FF8F09714D92031E48652BED4AAFA55A84F5F06CF37095B37C6EE05CCCA2 +08F3D27C885B89F62B68768BE01AEC18326634C4EAA7BBABC3C9C4DB5CAC46D8 +85A79A180EAC7B74B3DE2F1FAC1C8BCE424886FB22F1F45DABAF374C7EFB8573 +A9E9BBC6F6ED8A720E174CB8FDC75B81663F4B85E472568E5D5B19FC25976FEA +8A26B417EA52D4A79169FD8B9E0DF0AC600642FB694621007248589923F2DCA2 +2265ECF240D063D6A682B7400AEC39B965CF6522EC807897097DEA226DCA64D7 +36C85D0DDB18E290CCE3F7E1301D04E91DD624D2F864CDDCC77CB34ECCF4AB87 +D641AB6901FCA513685515B023100D735733CDB77046B69C08AC0A0F65B65634 +437E9689D09878191F6BD79C0487EA25CB34724EF394FB1053BA4E6201162CF0 +AEAD889FC81C60601F9B53F161DB6C9A8BA9ACAA7BC29E489122667C9A239466 +59CF8981E1CC278C158D7AC2B25B4CAB265EC46477E7E3E69A98B3EAF47E48A8 +DD27803797671AC9F0290BC23AC56649B34EE46C97533DE11E459115149757F7 +C8050300EEB391D6367C048B5B48078265B5F70C57A9B8EDA8D242FD220EB33D +73FCBEB3E29E36C37D59A536945B1F47FF6B9EFA81F230A29403A2932E1D3CBE +DF6EDDCCB02F4C5243B3C43A079F32329BF852C894F7FC9B4786A16CA9583D4D +5ACC28C6441029FEA945FCC358999F6D7CA5418356A4129B98AF5B2066D141F8 +07F7036B51FF49CBF6878E89DF3B9F226A9C019DECE2FC8B7CD2F7491077AA59 +8A30A25BA74134B01F43F282B121498438AFD69D7618C77F6CED9F0A3CE2ED9A +64FAB7C69498548C51B96FD7F3DF274E399577491300D4AF7956C851A8E058A1 +F49AC57A5869A46BD5B51523361AD82CD3252323899058CCA42EC1DEDEDCB53E +24E289D0095E37B4067FD051414E4B06215350F9FEAE5FCE1479E77BFA287857 +9A9AF5F7BD93FC5A96908208949EAD6482366F796A88E9AC15B6F24558C58F14 +565C9CA8EC72373BBF2C54C97C8FFF8442ABC8E25DDB4FFB20EB229A4031C14F +FE32FF67BE4A28EE0BC60A6118EC3A8D0AFAF472323B0065C670CE41FBE92F54 +CFECE8751123AD3D51198E5EF050D8C751345E5AA0E578F4703340A3EC431557 +51FE351A355FAA778F3EAF00223A0BB03A7DAC11F58EC64F89B2A1C249A9F720 +7C373942CE60666CB9A988E8971E31CC706A9516694F1F968FD0D902BD69B6FD +5E04755A10C8DC057E60C71DCF9D6666FFBA80ECA59CE185AE97F8CD64CC7949 +76FF8D9C9A0FD74835A67F2A34A1229A7D9FB0B9252089BE32C320D28F22C93A +358073FF58864EB4E9BA5C83BDB879C67DC64F591F1480445AF304F6CF657265 +06E758177CE96259B3B2AC1429D549E249A8FC90444E6CE1E96D7D57A5272278 +076C2055BD26144686880FE76D0161DA226BE79D781DE33EFF4F9955C928BD6C +55F16E14A5A2B8306164D863C2537CFC05A7F1B9E9221321924D33E29C95321E +D5603A85A3F3F890204BF7745202DD217CEE21BF45514B8BD3D5018DB01FAB56 +E5B85AA57D26C115F349D826D21785FB2B14B16C3A1C3D764300C6AEBCBE66DE +4D8AAC6484D20857694BD65065BF4BFFFE35D86D6C4AE1A29E927861D180A339 +7476FB6DF1817BC6A077CA5BFB568F6CB759FAD1DDD86F07CF9F6D6B8B320E01 +D9DBD04D0315ADA0A2F8010DA572EE6AB906E55CE716AF7969A3F64097210C94 +7623AD3E0748DC9614F27C4E5F614F13770A7C5B49464AB0E6527CC6FBCE4794 +BA32DC1099FB73AFF3EF8DDC33132DAAA7546BC6359DE8A49254AE44963830EF +7A69566BCA08FD8DD4C0982A38625EE58E39BA2762CCF85A27B037D34BE5689B +880D9446476613BD98CD3DE649117FEABF6156BDBD39AD05F360488C3A80BA3F +C764F11DA922383787A8E93F945C8E9D1FD4CA16AD0958B21EB36B84B524A9BD +C8434B908D4CFAB46411E997E75D9F48E140C50ED2B56723BC43069B42554850 +2A73B211D61800ED608891BFF059E8C49C52BA719CBEA6681A9BF720E86FAE4E +04D5BA274046D9B103FF247068EF9B3F51C22F518AC1BE20B9A00CD21F341BC6 +FC8C1FB5072C69466CFD1F1085A92E517883C037F3A73658CA74686F07BF742B +98C121BF9888160E0DFEC324C208409D876B887E4447CFC4416C9A4358D7B1CB +769BE77537BC8E2771F2EA19EE1440468925D41C01ADBF2484D8B5321EE18DD2 +A0B1F570E0BD0F8B0931E1C6DA0E71F1E995487544B22AE91B8C2B9AF65224C4 +BD3E3BB227FA37121E31077601FC205EF5E5B69458333784B42D07CD58AA73DE +8FDCF30351D58B586C9A6116F0CED2298B7E6E088247EBADF24DD85DC2680BAD +D217DAB604987181047F426ED848CDF475A9D19D0F00AB7DCE4E3C73C8B666C5 +37C09106A440E2421E94D699BA881B53D98395F47808FAB1D594561D46E82175 +0FAFBAB8F8197119F14D789B7E798DE37D62D2043EFB8DB3F819B62238D62E8E +ECFCAA92C967CB2FB089A8AAE36AA54C43C8F9AA5A7E8D88B178BB878F4A7073 +1D6BF3309D05856F4AC65191EADBCDB22982431C86745C3E01B0F563B2405AEE +1E56370F1835559BA096C154626D36C090D3F32EC2EEC0B35FF492A08E61DB6E +C234642691A4B214E27FED0D420254C5502AB9797B273B8C6DC49DD29CF1C65C +CA61944460CC2ED03655E713B63DF538209FA69DAE84B4A3BD89F7834BE5AC7B +F3C6CD20E8762AC2E365548F396D32FDF7349DBCE34D93E68C626EEA8DEA1EA9 +A369A6435B000C4568BEE6FB00BFB2553D7AA6923E3A28B131A135920A43F5E3 +D692FE12C30A2FABFD2047DEBDB4D9037D87B7FCAF0DE6EA92596235FF5B16F5 +80D4B99B2F98B51A350D8609C9A65D0E6BB6CAA01AD47912D72A869122A20E76 +8FFC5353BFB61600DB1851169A8B0CA7461240A1EC10351AE38DD223262F5F1D +C00DED1F9AD9F805F8C13E34E878E64D2951DC05C2F95AFD57F8C1F0316FDF5F +61809B7AAAF7CECADFAF70C607B77005EEB7073BA88B7D6FB714C10C313EE3BF +82D1BD536D7271F012ADE21C41D2D4BD9301305BF3FC46323C0F9F58C3229897 +F691DD00E9C538DEB7532019339406CEB61DCA9509DA08B4E5ECB4966369BA10 +739E73F3A6C527D685900E6A592D25D01EE3803EF8A741232C8B48C2798474FF +03CB68F61FE1065A45C00E86E339580EEF6A90545B04EFAC45E57F0B5E9BABCB +E053AA4FA0C593C1704C58858CE462891FDCEA47411714BD9F42CC66714A1947 +5637755E85F7CEB3F85720CDCFC6594FAACE2E49864514B00860123130D91672 +549C4B4A46F3488F41822C30C927430207BCD5BDEDD48366A1336196EE37CB90 +EE3193289796DC165A51E6C01FA7F87E6028A8CA46E90A47154BD95412C803A6 +97F35D80F6FF9FF64053FC3F67E182A3AE7E72F12FE7D85778051CC8BC847FCA +CE8477994CB78628DE7F366A6337AC42372E54F5809693F631910800B854C832 +090D71B89E09D49256B84F5B0A2BC26AEE76CDFCD9D58F4D739B73530AC7FACD +B66DDD8F3E601336999AE1D93AB261E1A101DBE76C7C9C988D4FF999BB480853 +9D366BC1F0CDBAB25214BC5D38D3383C85345662A65E98851321D776D34BB6C0 +F7E3367D7329714A5B8524213DB65B36229AA4794ED1B8B9B735B59CFD4136FA +ED923B234EFC0F1B10E99B4778F1616764E3FF5EA5ED64D7488DBCDBD8D0327D +79E703E5FBB73192658B48A6E3A50D43ED6F9CB14A0E1767C1624258378BAF01 +B4374C36BCCB1EAFBA373538844F5D1F36E25046722DFEA0398FCBB80B1509AD +F76C2C452C2A3668231F46B8A953C722FFA795A9B25F34FA0484CB72DF2A9E3E +AEF724E2A120B9C9D3BDB7BA2F1688C85BC8B4F3AF3137C3B5AD07BDE5E6DBEE +AB93BA821562CEC2F498A406932E1571A1AC323C894256D19B1256FA855DB4E3 +E2B7B1F286B3A376ACB8EE51BC3036838D9C5C6D275E92D92FB3A04EE15DCEA7 +83E772D8F2EABFE039652049758504CF3BB46846C071E1C834578ADF50ED6BEA +4BE184F0DC7D792825F61FB26B06E8133A0FE6A5A50D804FE19E3C58CF1FEF52 +3A44C7DDAC8C9FDE076125A5E69C61D7ECE569901764FB72C9FFAA7AC49358ED +B49A2F27361196F608636480F5F59E7C501D77BBFF424DC90FFB76A98B10676D +5569395477FACA2071053F0C8E233F6D63B5690F30ABEABCFAA4BB42701332CE +B2E3AA23501DD5164738E9C7649E1B3FEC004775BA90902219C5418411CF3E6A +964C79F23EFF5867E97CD07ECE28E017105A493D1DE4A4352FC0E82966F1323A +06719F6C7982E802385193DC4644C80E0F849A9A9435236C9FD97E7E444A8B86 +531F89DAE02563F58C45B8360F38101B5F27536C91D04277C39CCEE90E7D3889 +80AD6E6377672F8C3D9157BC6883CB6CA46F48E2A2C9332647B8C6BAAA0C64B7 +89D2BD9E096B0AADAE3067BD9789A7340C46B398F4CA1944AF01A383875F6365 +63D143B3944E283A23D54AB91459EF2334FADC4D4B967A8B415841DBA74E7437 +0A7E38218C574189FF14954F1CD8B2CB642F017AE7F226A9B5D6B1887864BE11 +B36AA442F8493AB43CCF30CCF818C93FFB2148EC95F4E53FD2B203C9DE6C1335 +08D0CA053B70CD72CDEAA8C808B71B14BEE9B0646CE22C37B1866715238B2E77 +0ADC53682451FDF6D89ECF1C0626E41AAC7E279AE8335140BDA6FB0F617A8E33 +9D480F774DFB91528FAC553BB0948B94DCDC3EC4082EF3549E669A7A49C83FED +98C6C7DD43634C8321CA5A3BAD048442CC9FAF839D7647B744E11FC9DC7ED2B7 +1E2BB9E82308703FF7C7C8C123D8CDA3631FEA47EEA9045D6DE5BDFE87E92B58 +E5404906E06B417F088F9F9F5BBC78FF369CA8D78F3AF16C21C8FC2F38E559F9 +11FA7F88FCA559E319D63A6EF43CAB1C7E2C50736627674ED172BDC507D7770E +706DA40D79895E339D3DE90C2B95AD62E9882D9C306D58F80666A419EDB2A0D6 +0841DC59C6D652343F31BD5FC75CCA2E69C9B8495C9518AB83E95ABCCF6C5475 +94CC30358A8533ABF1D9A550076A6652C0ED47B6B77FCE29B8CBF2A7A9329089 +9F310FFF1F64AD75CD3ECDFE4507AC92C3448EABBF9ED97FE3D9E10B1EF3A0A7 +D692D0698047F685E6401FD72330B7B5736D285A923360C4B6B271B74544F855 +158BC5FA3F971DA2492E6A75F7A2F0C3871FBE4D4B4B326131FA1FFD6360F34B +9853376D4E9AE399DECDDC2BD6D790B59A0090BB748EE0EC0D459F203604741A +3FF6D964B3BF1B72881924F6FCA5C778CE8CC8513B99DBCEA1A8BA6E46DAD45E +9A6EB90AA1B02FE6D857CC50699424F559E976FCC174BD5459884F8A723FBFA9 +9C7DBCE6D0D6E426742F6AFDD4BC603254FC4A4A53E54352A79E74EB198DA28E +72ACAC529BA702956D1ECC0DDA91F64C822F3B1D564BD0EE11D26642E12DDD66 +9B2FE63051C59415F42D597690C369CB8CB64A8E3EB300C5DAF80E6F9DECBD78 +07AAEA84633498558B623AF42FAEACCD8D4FB005180CC5F55CC4DAC3955E222E +AA4CD5BAA529080F195AF80FDFFA970CB01B9AA321274A8DA701C9A381B0F21A +977E59520496E965447F88873026BBDAC1BE01EB7060674A656918AE89D6875A +83A4A71A8E583F09CB7C7146AC9B1CB5866DDFBA9F6E428A2D315F73F9C4049C +32B630F243AA9F62FAF057BA3D8C042E93414867D6DD3DFBBE9FCC4AFF865449 +B3A7AE8B3665B519CDB7E2372BA6DBC0EA2DE31B04C2A16353A29A760D409CC9 +F5DD03E2C11D29E0D545053A6AB7EB57D556E25401306FAF915968EDDB542D62 +E2F2D772CB09B4723DC936C0E08189539972622D8A2007A3DE1972083A902D7F +E50C882272691FA11D0013D6CF4DD34C6D2062C2F7E62FE3467E665D77A40757 +B16C6136E7240CF39704F49E8DDED8A5D60011C24177467763373E93730D04E2 +235768F2FAA0615532EAE537755434F130B1F83CAD5FDF4092FD20A324B3FB30 +80C9F16C617E2F13F315ABC8B2094F8C768277D629E10A6D0A9ECCFA0821ADB3 +D76C8206BD399FB5AC93AF557E2E982777B6C1FB0C4D74993E6084C1D4F50F1D +F0F50BF8B5658FFD4AE0C6C1275C06100D2DEC016F809CD8D9FD3FE7A7EF988F +8F0427880335F024598EFB33405D55C44DCB1DD147C398D0335E22AF9A195D53 +4AF6189CAA57CBDC5F08272D7CF1B5BF92BF3AF8036EF848E437B50688F49D49 +46F11D87415FD9ECDE418F452EE6FE7A3DEED95A0996BA0862DE216DA08858B7 +524A78820B2A5BAB4ADBC1BE71D69B02B149DB5CCE6C859A38A810C901CB845A +F9873F64E986CBFE0B2D2146DAF2366757C8FA62F7DF8959CCFC78EB605EB6CE +4E5B4BCA9C64258570EA229276FB5D417CF1B1B315148693C5EB6996CFD1508E +67DC8BE993EF72542255F7E323CC182EC88B844AADBADD4888A8C6DFC1C39843 +0C19767F9883749D6EC9D065C88DBAC9D87AE9BDE61B8950A51FEE9E531CA3EE +CB14C95B7301CC5A7A1B22FAA9E1E956EFFC9BDC1DA96A8910E733E10CF2EB61 +B7E324653C797D1DA73C2C081D70A14310D0588AA6915B0F05FA2CDEA0FAAC6A +FDDE41FBB23B5CA3D0CBA1CCA54C6C685F12C1DB1B4E8943AD873691186C7A13 +C29C42C86F1E46E1307CE630DBE4332188CAEBFBD604252EEC001BD89FD79563 +D79B17FC27A5506496576A62D3EC8DA2EF2BC0CDCAEF707B3A18978DC99BA0CB +3D6E611BC0E27CF54D8478853EAA6F80B3A698D179E8660CFBBA117EC0694457 +44D6DECED3C1DC219D63D1EAA09BF546A16E28EC76B7EEC8B01C4EA1DD332503 +8FB779A7243A90B4A98201B51D27E02083FA278BEDB9FBFAFFF82C4772F2BD17 +53AC2A75D9101249F2B0C52F0C565E6D084C1C6C50C084EFEEB5E3AABD25FCC1 +339773BEBCD4671779FEC8A1DDEAA73D2FFA456076F4D3EDCF0267A48E72D2FC +F658FEA7563E4B10908358E5FAE253C5A1A1F19631F1821C3C80BD048CE166EE +F77ACBBBE8F2DD4FB7AB2692E8C25BF18EECD4F0FECF677860CE50B10F3E67C0 +39F23CD146E0ACB5B6D2866594E6AD5A482D864B1A94E0CE45D4322AF6F3EDD4 +015504E7AEE530A5283FD5A934524AAC4AE9A2FA647CB578FA7E85016F97C906 +77436277D984277A329961807060D928D2065449D14FB75B6EE088C7496A0718 +0796B05E1C228EE7E1C7C50106CD49AAB88FF7C5B94658E3D2D8713C061B5105 +44DA4C04D051ADB47161510B9BCB4D18542A0EC5EB66611BC9DB1B4EA90995DE +19F86A76565445D112DB35479C7E70EFF4C6BB3E45307CE48BE52A9BFB818387 +9A0D04EFBDBF9EE973CB2808D9E75694E9C77BCB72EE07943096FEC011FE7435 +BA43B5AFD8D0811342DF88D3C50B9D001CAA23DB7F88894D58AB56B74E9D6E45 +9220790C088D3C2FB8304C4032FDD3129C0B52283AC284F36DE8F89E9E4505E8 +0AF4B25B6342B8DDCA18497D1C741BDD00ABCA6161682D75CB20B3D4C6CA560F +BFB97A5268A8912F873AACB40C9D7E6131BD2C2FB99DDC95A104AA4DD69E531E +1F7BEE6A10F0887F6DF15EE64F3B65061146BCF0F46B5EB53A294960E291A552 +0400BEDF61D30D4E937691414B8C14DADF3D4DEF27EC9CDE862922A8F80A0DD8 +2C4CCFDCFCD568EB78EC96FB946CD704BC73C9C07A239DFD8824F52E22C1184A +CD4BBDDB3E2301C142A6C21483E57A9BE8D060D01F5EA23C22178F3EFEACB76B +45C46C034A27953B14D9A2F624C47668B8700B5363F5C86944A8DEC84D382D56 +0C6ABBB75031683E20755612736DF206D313301FC39FAAEAF05D483C1E93E6EE +E1DAB686D64D959EAA5DB319812177546027092595A5002B151F433289AE5B87 +43767F545F3FDC397C02DEDF76AE6462D4A2AB55867241C8A7EC2293B61AE39B +92B8A82B3AFD65A6AF2B4C7928B4022B9B944151FF0936AACF2269FBCDDB31DF +29358B779C7FE59CE4FA452F0987A6026E0710C4DE0DCE081FA2602D01EDE3F1 +6C29CCD38E9D8207504BDA0CFC49517FB02E78BE3C70E4763B58C1CDD2DF9F2F +BACD21EFA95A59D67ED2DF67366B64369B696D1FB2717089B7E7073A6C778127 +2A2C3250B8FC0B5D8575997D6B8AFAA761E8CDBC9473B29C10BCF3E16CD9B555 +18124E11ABFAF29196579325B3F6C1DFC9AFB4B1CF54A40605D7B1A39A337C6F +4B3E724C02BF2C1DE1B5B327AA0F65B9581533015A7834293AE558277F7E78BB +0EB225997B0CF2AC95698AF7CB0F2AE6E297A7176EE56DE77CE18E6DCC988011 +C51C80DCA3A6D6613D517DCDFBDAC2936139030AE78D70A579048E27CC418600 +99CF1DB94EDC280EA97768ED37D5ADDF09F26FA9CD7C71FF71EEF05BB8F7AD59 +EA1600BB67F8D32408617FE38D3F03D23E3A9FC3921EC9C880F0A08E051A337B +72ED695E9B00DC820E7EF062596B651EFCE085DB5023D14713710BC6E2E98C7F +3F674351BC3200F448459590558A0F7D1FC99B33E69F920FEAD378ADC6F2FEEC +542C45A265AA21A7C5408102E0618B0653CF275D78D13DA3866048521F937A45 +8AF2EBEE59DE62B5AA226BFDEDB8C7FA92DA2A277141C1DE3301618DB5DF7EB6 +AC5BD2226122C26E0AF1A02C253D60052BC8768DE3DAF4BF58FDF5E707347558 +9431C7998D3FC3E63482BF8F31AC6E0630B4127E8161FCAA5AFBEA9649390F18 +4C8E16117FB1AD2F5A125A9C24BBC404A2491B8C44062FCF8A6609338052D3FB +840A905FD9E94E54E6D1EAE195C3C635596D9D284CF7776B2BBD7D786A9E77C7 +F868643441E41CBB50E2294A007668954A0B33F47D470D72654FA58D4622B8DD +90C3CDE66C691A4584FF2D93A6360B274E0E3739A12773F497A6FD980DEBDB57 +1B88A8792964708072AC880AB3331E8625C6010FBF9EA04F3572C737AA1E47A0 +8C5A40B1A3CDFDDF7314D1F06978B3FCCF751E0DFB25F830FD684539AEB02DE0 +856D6FBBC4372D76D109B1A52C8AAABBE455CC37982BD728EA964AC19D6D6C87 +6875A653799A383ADE551C3C55C08840D1C4479F1B97CCD8E07201B4E66726AB +B5FC0504C4253CA50C538EE93D952D148C6D7A1F99EFFCE9C9E066BC77F2C85B +5BA9474A49850FDBAC35F97EF5783D647E2F6B238F7D77B8F494D6D04687B8DA +9179A7AF10A1BFBC50141AFD6FAD87BB58FD1510FB6167E2955AC7336F2038B9 +7AA2683A32BE3DB233F3DBA776AF699305686785053DC25682B734C93F2725AE +5C82CD88B68A7C788D774581085BE2E4B467DD5C5C7FA83D3B159CEC68FF0F91 +5ADD33BA8CCDF3D93E96B0F9CFC1F7A2F98585AEF0DD14481CFD1DB73963BBFF +83BA8D9490FA120F6E4E141EEB1D14F29DB08AE5FB636AA1BC7F46EEEA33E8AF +334F22650CFC2F3CF73BFDB769BD34C3A80694278440C8C7B6DE03C101701365 +06ABF17546953891D8EA0F75E8756DDC267027145042C2817910064AD0D2868B +622937ACFE34406BCA089A50BD5D40CAD02F22BBD892189D94D41FFF3AA8F3A7 +DDE098C2A5C23ED877B7D8016709D6D578CAFA069A3A50AA3FC11AAACA58940D +D88505D217BD6F562C8E435F4247AE9AE65BEA57AFB21F13E546040A1A51BE21 +1D2706F228150F97BDAD799A4823C7FCCD8DFFF66DE7AD2AA661B6C1BDE91D8A +2625DDA0C9C2DEB214C9C41DCE148A5A805ECE8229A9F33AE5BA7A99DB32F225 +24E4C3D639EFB9EEAEEFC61E8B36C2092F3BA757882F94FF7DEB36127E272527 +AE79F0F55F9323C046708C4428389058F9C67CBABAA779F84A3EB8540179513C +75BF10AAE036CEFAB476729A8C5BD83B4C212656163F91FBE16384611069E2B1 +AA843715DFB594523904C3135690350EE485893F3A51CF2A72366EB840EF3CD0 +918D839BB55635BF7EF6E9D3CCD2158918CAB7C9FF74AB701C17E07F2F04A19A +F6BC970D90380809A987150EC0C8AE2FA190759B3D669DE4894CF4EF7F32E3A9 +50BDA5A1B083A21A9B0E1BA8A536302EE71A14E8778CF1ECFE0ACB592563EF92 +D2E727BEC93B5198FFE8C0AB9FA44AA3842B6E070CB4BE0F327196A6CF1F2D47 +A7CBAFD8FFACDECAA76F87C26E561DA20B49D2FDB81C42BC36D52A95BFE3F2C8 +4E4644D6560E0B5815DC0751A92610BEB4512A4614D0406AC8B5E5FE05610143 +DE3A38D11BF9A3E8B0E5A76FA18E99B559DB6C216938AE9DB50591E78FF9FB13 +67E89709CA7AAA17D20D820CD1BBD18B904436581FEEB2D9E5C2BC992AEFBBFC +7129948DB03119F6DAD5339CB950EC410B1064F2E8D471972D60514B9037DF21 +6F42C03932DA11BCF6B8896755D2115220E265469B3601EC1079843E0D27C207 +0D0624E118EB64924154EF01FA65BD93331754D469E61BB34DA3401A8AEA17FE +92165E1BCFCD153617DF82582CF27B8E64BBF919E183BD0CB78753813A01CD5E +D3ED931E4670B05C39B66CB35DD93E934B1239899566EAF7D7524E8105DC2BAB +6C43CB4BD23DF98F3CA2E88F0E40A3BB65C1D0A7CE7735F95AE5A86495C3EB27 +8AC9F070FED1E50936B0CE6E9D3DD56FF394F45646F02AD19885072FF5DF07E2 +2E7B8709D23473FE3E62E0150DB7233D69E31E4AC822FC58DB253EE9737B9237 +3000784F4883FD2BC7C7646F48BE10DCED395D7BB6DB8B1AE3ADCBE3FCC23EB0 +E7BC01AE7960B6B18B65A2820E788A4B47177012F5AFA3E5FBB8F593EAD2229B +0CB1474FCC2039FE2DFA57D3DE16C6612658F7B7C27B5F3AD36739DE073DFF2D +17A9351BF25DD24B4434C5D1B6277EB9BBAD895DCC727756DD588B65875304ED +983C5F664FB658E0DF6D79DB3AC1806EF4D5F73FAF9651E738564CDCDA5BEF19 +53AF4498634A841D370BA07863C8B579466D5A329C8160B8695BEF1DF28527A9 +6DF41EA5016705F903D0A0D2268A27965CC888A8BAAABB5D4FE7EC8CC7816732 +2AAB7557AA7AF336BFB6B298299BB7B5CC89797B7A71F4D61F0609822CED2EC4 +85EB4E6FBA0199D538054B212F095A49B77F664E749D0AA899A877151669E89C +EBEAB8A71BBFE65242FD53244194B5763260B87B0857072B0155000E5EBA5DB1 +68C21BED2AA9B60506E6873997A34909F6C8D5F9AC3B241A1496A2CC9B6FBB2A +1D4084500426B3931F25B42B1422DB5444C4CCE842B6FCB545CD0357DFA6B867 +1CF9C7FDEFD67867D748267BFF9AEFAE4BBFEAF3E0F253570F84D5214B24C335 +947CB1E1C56F58B74F48103F1F690C543791BD85B5DF6344EB45EAAD771A4EB3 +1F0C7765F6BCCBF583371F56120579729F58322314C5C5746C2944099D7D38C8 +A03C7D64532B0FE23060EA277C1D71321D257FE0E07592FCC8B23334A92C4646 +E5900FC9EFDFDA95B9E183C582457B032F0878503E61CF24899569B85B194466 +412E10123D6725395A7BA8EA5CC88C8CF69F5386C0E615B7A33ADDE091348CB0 +966F9EC34A7ED43CAB8E50E6C454A36B96DEBBA1F7AF42A21572BDA70407A985 +6A1F582EA78A05DCB2E80D58B526E6473E3688143E8BCEF811D1D02F7565C564 +E8CF7801E98451A7FC541542F9490B5A3AFCAFE0C0C3989B7899045CDF262D24 +7579ACB8348FD249234092028397C92B3CB69AA206A94D70C2B78ED45534A65C +07C396847EF4A6D9FE1590515C29B2A8FAD4E831BD2E4AE07F1E315CF8DCE669 +DE3FCAAA0DB0A2A518753D04F8DDB7129027BB94A0A1EA990F64FFA543F90FFB +63944FDF5F6E29E821EA00A71912C9B1AA9426939A2FD08CCDDC1DE545B5B695 +09DA575BE8A9BA6D51584309687FCDE29128D7BC355CD03A09D1091C156392EC +85393381BA2C006949DD93CC39B7A58BF101E0117E88B3CB4D954B79A86C632F +38F5475C8559229155CD210AADB479F7FA83797FE211E342DBB6CF3060986C92 +9F946E65ADC67950903B99EEDE3E2EFACFF68C4BD90907ACA26C96E4E5A28101 +3517DA551C963D6DBA3B2A0B4432A6D364CB2BB2FD1B3DDFC1F514D4E7771D1B +C4B406372269021E87B66B81D4AFCEA1316B755D65F7DEA5AE2FD2264CAF1B28 +1DD4764FFA33B22D2CCBB7208D7EEFAF36B86C0225535264733E237E055B58C8 +6FE717E4A6613D049D39E64A7F517C14CFDE8CACD53D96908B9DDE9DD88E5BBD +FEA1DD01A0CB0E8C417EF1473183F39EA6FA2B47BB27D37381433050DF7C5F0F +3FF6F2DE3C7BF989F617AB16AFEA89058C5E325FADF9B37E0F8565B433E82EB4 +F949AAFA60BD424FF49115CA76543F9757741A3C10440B4E5F0CD73AAE7F22A1 +13C4DCA7D6A55FDB020D14BAE8DB2600AE6CE26144CA0F83C82DF67C4E89914F +4C4A89DEA5326DACE14766616AFF2E89FD7B25148819141D464E47D178514814 +E14C9A8A796739DC99C1220CA086326231E9136F61962303686CF360E9E5D058 +915AC25E7B8F56CD1C6092252091E4E25406C5F4B60C4AD01482F41B8DD29C91 +015E19D94A0B39836722CC3F19CB46D73930D06BE314583F6DDEA56A2B6A8B5D +1C59BBBF8EF768F9B49B1BBB38B4F828BE4A73EB9315636DDE3AC610D7E0B65E +32A8EEA63B1C734CFD0B52D09B418F6B33F03EE08A886FB6E52405C0403177AB +A63EB20DA2865AA6441957F98CD7D64857ED614D59436450F33DD43EC7AFF4A2 +D3549DD174338FBCB4BE975E8CE41B34BE93C770940575AA1288F87FA400C650 +A4DDD573BF1F45EB97781044691B78BD64C3305FBCA02D9931EE3B8B7667777C +1C0EFDA7E4E247DBD6C5D92737170BB9A86D862C0534A8436B1295861A7A2BD0 +CEE445EBC7F8251E4DEDD7173A82A39B8C3055FBB90FC42B550CB5CACC2D2972 +886E7AD2AE11626F4389AA07995055AED5AAD317FEBD47B498EB52AE15DB8440 +EAB1D16A826CA1ED54F20A990EB564FE9FBB2784EC4920FA479244CD24C7A635 +574DF33C73FCB1D2B6DF0CE6D214B464761B8B9B2EC88387F6E99A64A0B52271 +2E57D454E5B233F41FCE51D65BDC26C6BC18CE1B901048833533CC08AD60FA32 +FF65C5E06A710C206B78D6B9EBA4A81031BBAA88BD3EBCF1E795170EDD69C61E +26AA502B47B8BCB9D9CE8A95D81BE25116B0B84A92BED585B4248CEC62676FB1 +2C6CEE3B2BCB5F7D6EA35A5E5725958DC772DB3E108F3AFA1CDD4586014A1296 +F92D49A8F9E0D19C80824733CDCADD36E8D6BF728A7EB38EC991B3E4F70BEF0B +5F76DEFB25670F3E9F8833C015B2C68AB4C6D5B490C2A295F038E2A8706D243A +1D4B2228CD1A2545EEDE67A85FEA536C9C32747B45CD81D01767FFE9A8F70958 +409C07CFCFA3D102707D1D6AA5EF7A8B25DDB8A7E416610F2D558BD3C9F1D3FC +A3CCAB935FD1F57D42E2D32610A3069A15A31CB0F5357C00419F152AE3EB3CFC +4B3FEA9ACB01F180495297B4A8A60A4D2EFFD3473C1C3AFA2221C67D90DC0DB9 +43EFDC47484D08335438CCE06EE75C7571007AD9E39E31BA5E2CE8DE96405063 +13BF3FEBB2AA0C997F303E056ABAE3F3C14DE8F472D60B6BF7B37A3488717BCB +C6A20858B52045A7CBF4564806C1D71E6422839222C63598B7EE67A4359869FD +C56BCA71E147E87F9F9D241F06EFD688A268CF0189BB9054231AF7764317C10C +B625E4633DCBFA5114EDD89E44AFC560CF0DD1F8ECB356174BFDE7322A3C257F +F6B9089DB9726AA7313D145A249AFE7EA43C3F1CEB9113C568D2162A515BC112 +7AD80BE6EB2ACD39260B65094039B95E1819FACB18A92E98F84E741409AAE641 +AF35BD026EF7140A7563505567E974A43554883949123C29AD3FDF20602B35AD +3100F85FE00E091803D9D14037635C964A1A92390886B6CB72A915CAEAF847B9 +1ED0F1499BBF1BB8A906538E7F709F962DF50143B649BFB2C5A3719F95362BD4 +A892BD6984CBD362BB1261C5F0C1262B57C441B9349AAEA2995C87FFA20CA0F8 +E7C98D842026CFF8DB2258D7DA536B3609028340A0AB13D4371BBBEABDA877B6 +1551058522BAF2F47F34509275D422FBD83F51BEDF0D94EF10E95FD1A8B488A0 +0A81C7998BD9AF86C1A8E2175ED1AB40C96243687BBCDB793A08A5336F911834 +247462D693993386ECB467479997E7995AA90AC96AA68B78F21AC59BA618D886 +ABC7F0EE019F4146755A55BC38BF5461B1422E62E320937D056A62D7AF6D3F0D +B2A2D09BAD44F46E97316A685CA21CC455AA8A061B88E3E64C64DDF93950E236 +B49749CEE474F8C38CA8468E6167C94B3678AA2E5262B69D4C04E5F36CBEC4A5 +029807DF9AB3E4A1B5360406EC39D519504E165D129B978225D2DD7BC4ED5982 +D67B4F1C134DF53B19CA76B00EC04967E7D057B246BB248F4ADCF9D4648E98F4 +4AA48C9112808A0F21F816E481543E5873AE2331E1B5256D027C48602EF09590 +18602EC3843E98554D304B92E5F1A531E61EF00E5809784C16D44E6783230C58 +4487C0B9DAFBEE1362F65E4555987D8810B49CAB8D53DE39DD0D49FC5C3BCE39 +6D4A8461C9F0B0B9B320365C7425D8503690204D0898EC34BFE37FBB5B6C86C7 +60AD9436D9331FE53A444F78DBCE00AF3CE5C80EDCE9A65CA837F948EF672280 +94FFFD6B176B98D66DE818E27E80327866936389AC4845FF059F996B83FBD151 +BADAF79C95CDC5375FFF1211A6C1C490344AD56BF6D9665B2388FD4BABF6EC3F +3F1459DC589A99A7615D64D34FFF122770812E0E1C5FBAAE90B72F8845A996F3 +3E3276D41462DCF43C02D046EB6AF4A9101EF81D357FB21FC15D075F7BD67DE1 +26DF7DE2E6E21D578051967794B28592F27271AD34C9B81034D62FFC442DEF67 +77D174EC4335CA3552D85B0AF9D4A4011808FF1EB140D12491217C9C6D991395 +6581C91545A69417114B70FC4E021FABF564AB6D1DC37E456AFED772A1441E66 +63AB194A8D94A8FAD64CDA23AC28ABD8630D3B19CA93AE46B6D7F229E36254BB +822529D754ECDB3989F803451F30793F0A8C4CD03F8A82185F484CE910334DDF +F3376FC4AB870851E6B7C1C10337DF7865CBBF77B28A1189494313CD8D112C6E +ADA1ECFDA1441E2F107DDE6BDFE74C50B89D6238492005C7B6AB5B77563F3209 +B6D5978E09ADCE0DACE3990764127584879AC061ED974925252983280A596AC8 +A0E581D4FF1446D3E25DEB2602680C4382605AA1CEF04A5231220F54449620D6 +E6705DB2D554A34B4A51B0243DBF506577753611F28C968AE743A7204ADE14B3 +6028881DC1AC19923B6ADE9DC01706ED6E635AD5049DFE52103F4411829E5F25 +B8DBE813719DC80195FE3707181931D1DA3D58F101E34205A9871C9DCE6D486C +FD8A3764D1BDAA95C2788192C956F3514D28F001DEBF20A7802AFC168C1D3F83 +B5CB66DA709C80CB62E5BDD5094AFBC09AC43A6993CB587D79C1CD2ACA5D3904 +683F7AAEE380181F625CBAC1000028727EDD6D1C96A180539B4DB46A11D55FD1 +9BD5A991EEEB3125C8B022A4CBD34D6AEC5F4582731651D4A1C593EE4DC547C1 +9FCA888C406D3C6FEA0C398D91C8D6B56AB56737158C47A90D5B8311178D3170 +4C00D98282FB34C636633DED7A3D8566D647F2B3EE3C095CB0239B48C4A1C1F3 +BBE15C21A63A9E779738FFF6AE49081703B5716939C90AB9EB4E1696444CD60A +4EFB17AD7FCB2610A9E3F903CCF938CEBBAD41DC25590B35F50A2CBEBA8FBEFC +109DA0559B474A79A5DB4209D63D727EDCA5EA257143F90212E7D57BC1CF6EF1 +D1A1954A4F919209447477DA90F87FC1DFB199C117A434BCEC1BA10653A2C9B5 +9599AC25838540B3BBBEDFB597206DBC2A894D077F095C073733C805E045AAAD +9442ACC465300DB1BF50C14F31F80769EEEB8EF1AC8FA42E123B7F98BE4D721F +21AD4A9DAD63D515AF0EE749497EC58E45683BBBA63D7D06B717D9AD0A593B45 +6948F70A99A42B8A6F2B5CC578389A7D971B21C48571BCFFB16061A43215491A +66BE45983EBE2E37BCDC7DCCC507470FB01711105EBF9578664D855434DBE98E +0BAD017F64684E21FC3209CA6A02EA74E6FD7B3710CC09AC0C213E3226C0ADA2 +8EC7F6A960D7D75235A3B6CE240AD4101855F00748363F98A6DEC3D785F99377 +827EC9B43B5B7FDADDDED1C469812A5291F00705AC26BE98C5E9EF813C6E1438 +FEECAAD277718900E4F5A4B8CDE0BFBA1E0AF5E324CA9B4D9C06A2900B7E3029 +9A19D23E58BDEE72438CD10AACF155FFD0BA3A91E18B9FB23585B76A6D4D9873 +3CA358901612B5D7670B1B2B8911BE871853588247A647FB91C3E86A6F642EC4 +528A7A3C63D6C9C59B46A22340A887E9EA8754F3771797BED0A2D2ABC7E87886 +FD5D1850FC4C525A5CB4354C5F600F3DA2015A35A77841A8009796C88197D9C6 +7F4BC939FE15D1F91DD6A62720E90B7153C4D77A13061F9F6D732E05CAEE7E7E +2EAC05082F0756507E7B6CEF9B559A5CC7EF7AD02C54E5DE6418EBED07FEADDE +F28A240D66F004ADBF2B4C9E158F0FCD9950683ED6210ACFA65F2071E6B72AF8 +92E19D97ABACC701B24E7CDC9D4D8C0D17EB4C64A9DF75B765B1058B485A48B5 +3A92C9B0A1D13800EF704824E61C8D13E64ECEFC2321CC2343A9B59E6C8A0244 +E3C1AB84080AE28A51C7034F3EBF2BF8267E293F61AA10128510CD26C0E54C1E +6C2C7BC8FF2F52AB1A603BE177A6EE39A5D5F77E9CB3F37B46DF0A134F0D47C8 +0B67F71B5AD0B206D3E78AC8146BA70ABC216F4F5CFAF55FE1803E4947297D7A +8949E54FDB2A7246349952A2B585AF440FB9BA30C4A85083E5EA80E134A611E9 +E0275460E58C4680CDACD85D38938AD52D1CCD190D2D87241C91C75802ACE899 +2844DF49F6C532D4BE4C5CA2386BFC77A5C3D49A2D691EFD56C5EB2AA830CB8C +03AF9B30D698BD58C43B20BAC134A895FDC42A0FE5C8CDD1110166A36CDA9874 +4FFA0D573A1414F05CA1EB5551FC456486A72A1B7853496B6F162E6A881368C1 +7C968BDA6B9DAE96801E87FB9D987057E4837E7450ED0C41E1AF1A14109C8F9B +F20152D9E0924BD9723F73E23EE66FB01E2013CC83A25AAF37FF923C089E0F46 +EBAD3B42FE036F94EE078C9CD251A150E28578B2DF64720E7BA84F643CF8E500 +2AEF59F860E7EAD664E614E489E9E1DFD76CCE33702F25F5E6D7BD2734B0EF97 +4B13A1B666CDEEC6B1058D8951D00FFDD44D910D5308135B088E5E2B0B44F684 +82AFB0E87F64251CB664A130D6685DA57DFBAD8EE271002476AA8E0895E283ED +970B130C0ACF264D8314E920BF308A44797572AF9B150352EB261DC86A8BEE7C +92E4C5BE76E66476FBD2BB1B6079D4291F03932E92CE53DC37EC79D946DF12EC +19D5E914C67F883C42BC5FC28FF200DE5A10A3B7308983880A5E5E37C457D515 +58921D0ABB91307DEBFC1C157D834C5F8FDD85589F17E28F99CC42E8AB3A7D2F +0965E88C78AFAD9DBC56B76E85B707321D760580252D175DE28F46E2130EED6F +3101D569B0C2745813D1D8F3C6A30AB77610CD50F5C8574DB097FFBEB2EC53D2 +D4887560B23710BC4BE049749C98CE066079D31AC800091119DE5C45673497AC +1E7BB1DF4867C5098454A98863F196A20C74B8CD778F24AE06E92C08BE0A6A58 +EB7CD34A06CBFE6268A01E8360725534A8DF5F3F1074FC4BAA6BFF579DFD1E5A +3C914F718EF07F4A1EDEF0E9B4B0188CDB3BC478C9202632212542C5CA144F71 +E76BC68F3C110742B61D20307AD2A4A0527A3FD8FCD7819B207B9037FCF53E3F +C81BC00D428CD5A5EEC788BA2C974B550533A30A646FCFAAAAEAAA443B09510E +A9D5FBF1E5DCF14BB0A116C91B4E760DCAD201020F63718AC3A8BE519232CF57 +1D2A077A95A5568D12FE61C78D6C1198D523AB1D604D92D0530434E4A5059F6D +DEBB5AB57D473DBBFB3B1D08E4C1795658DE4D6106A746ABC371D90A6D31B36C +6F950EB16996CA13104C356A77B7652471C811893A359E824BEBF8869EA13989 +3133DBEA5CD1A7447093A4B6500EBD5F434B7736D3BC909E6B51489A79F2D8B4 +6F8863EA0560F02557175460037899DFAF5A93871468F56D341680C0B8D2BD21 +709F35B66B57DE6B1446910F4EF5DDA5DDA3A4EF486354F087449F231326E4CE +6E1019BA41FEB775ACFAB6CFB841FD1EBC0BFAA6BAAC3B72605CD8ED100643D6 +6FBAE3DA56F5B6CE1F66A572B71958FCCFA3D1A312FD8199CF30BF0383EB0802 +2824A093336EED72111148C8F94113DA68C6A267153171B00335B0D7927715D0 +7F372D2F946AB65E1B19CA318F04686891B6E09F0536CF77C24A8C8EF7A5FC05 +61127667715E4CD2A547CD92BBCC219C40F4E6537036BB416783D54CB182380E +87F7E8D7DBD023ABF937085F12C81D92D65F97F70C017FD25E7A218D484D6A1C +B490BE23B603F763C260BF5EE4F9D11879421C14801948F4EB0B613219FFB121 +A477496AA5F5C70025E15B198A54C38E32A3E65B5678944138F4D0FF07970A81 +B23DE2CF7B248E8960EA358A3ECD637F779EC73B614B5AAB0B72ED62B1FD5B7E +45B9C587F327D28B042B31045D641D5B258702019FE50AC6A08A8FA828829CAE +573F6084ADCD362C55D539C5ED40AB1468D037F6756E7C004514A07C4A4205F0 +62324119A96F357702B338446F1E338AFFF143B8CCA5ADBF7BE0A2A66C40FEDA +15DA022E7575D9073E10B9F7A5B1A494FDE2826071EC40BA22AF17275874BE93 +7EEA3FEC5253C04B6060189C710FC7C5E2829F53B1746590B30BEB6C8C81CF15 +688A72C2A05B4D68FFA010A74E23B5B0B28C622B1C8D266100ABD3364AE21CCE +1B3701120B83EAE149792C87D4A074C7F8B4EC81156FB9ED3D0246E2A8A8D418 +24308FFFADDD9D20DA7CCDF56093644F425D8399E8A3A06B571D7C80753F840E +BCEA835E4094AFC6DFDE191E9045A115936F50B97DD73580D3B6FE91E48AF6AD +0F1B8708CFCFC76712BE2079AA6140C830523CE0E58148B36AA7827882AB0ADF +F5734E2AD66088AFFA6ED6A8582BDA670D979F8C23042E07502EB4A8506307E7 +B62510C729590B73804DBD2129D7EB17E2164FED0389E458BA053F5B24983019 +20D09AE5948A159990D9B47FBA323F2DFB7B782FC963AFB083EEF4C01F614ABB +5F588236986323FAF367303458401379CD8AC7F7CAF65816FA4B45F98A875F10 +86581706C369911B1AAFC70B1B1E7D30F71C55C030E5FFF4FA5FFCE97E16A269 +7982CF88E407BCFE450DFB0D0D8270C2B5C91B4523899C637CC86D1542F2DC37 +342D6366195297B4A529F853B5F910902BC907BAE83CD5522F5A0F2E4666EB9A +40083B1AB66C9BFB1DCAB26AF910B174AF933326AB131BC080BAE7B4FA30AB1F +422B0C17648AB95E8188B76977DCB7B2D041847C82347BF6D2F729C9174F1230 +E8612F98D9EE77EF7898A449A7DF889D137D1691AA315E9F6F08046BBBB5937C +529EE7FD23AEFB04603287FC991638FFF960D07BB5FB14F5B56ECD782EF84741 +7AED87F9E4D76F6CC4D01FD39D8AD05757C9B5B1C1775410F9A7BBE4D9438994 +BE02A1C81CE0BCAB1B080ADEA7DEC8EB2A9F5F1F2FCE0EDF006A54A6C1FC70A4 +51D3B2EF67FB6AFC68171CA31AFDB5B30C6D86E4B584B885EBE66344D499185C +7265595A54E3AC090BE89424FC6ED53FA7C30A417AE374E46476169C0EF5A04C +4D87EEADB08CEB3CF5C26B376461F8891BA72FB028B2088B81BA74CE27B2C455 +7DEC6A56DEF3406DD71AD214B9529BC80CD0AA95DEC7A074B785DC2192713A0D +85D6A3017133F5820912523878E2CE0614513137B1D6A0E1CA1B31870AE10F48 +3DFA4E6FBE782AE1E7557D157F4AB92226C4DA3F70AD4EF49D3A19FAF0169B7B +9464EAFFB3270787A6F02E86F8E3B56D00863A00C6C68C2AB375F08DC006FC97 +F060316F3385C66A7389B31DB5D3B7A5C5B73FD1C344ED9F40BEDFD82BAFD0F8 +87F6155F34FDD9BB4E928E5264B8AEF216C7D00EDEEA633E543954BE63A7A3D8 +34468AEF3C79DB66776E4C75A9C61C482B695F6384A7F8E8AC68913BCCA20221 +2A013A388798FD878DB9AB8802504236DC8147443D150D3C85F16E443B860C8C +1D9260BA341471BD866790B288D08A643C3A915AF31CB885B10EED89BE07731D +7936A1FF37B92CE6C953A9A6D2070CB9D1F8B4409E25F0D1289F445F2032D470 +A4DF4FDECA4AFE4656AB302CCE0DE4D9B9D665F56DF443DAC8E5A6F011C77811 +8D6075D72FFB6AD2E63FEFE1B8DF761DA09EF42D73EE725003628833E010CA9F +76D69C341933ABA225A1D448D1B02A24C8EF54917559900C31CF4CF96AA1976C +B75D49A191D647CB4062CD5D6591CF232B1FC7A1792787E97BE5F9F8BA3D4586 +5BB1D8ADFDEBA915CFE0D4585B4C7296B0E0B307DD245F8BC357D3700E187D75 +17C6440BCF624C8751D160BF9D351F49E1283AC4280DB84C36E593AEE0AEC473 +0DAA130274B8771D318283ED32165F26C31CA4602BD138DFA717957AB25423D8 +9D454DE676CC9A16C264CEF9B4038834762014B65AFA9841234FF8D6FB6CA9F2 +F719812D43D78077C82FE60B75CBA75B7C7E664BD116A68C1B92DDDD5ADF497C +0E7DB07E3FBF45298FE4B9C994E55803FB965BFAD4C2BD156D34D79B41A950FB +7DE8B2DEEA4440C93E94C9D3369C7DB4F297555AD10B1A8B003DCCCB94AA5232 +CFD2BBB5C223D8CA488EA15317D8284F97AC5E46144400797544EB86C2F7FB1F +B806596973F2C8FFFD6C26E14C13DCBE138C48DE544CBCDBD16ADCF2E28D5319 +0DC91310740BCC46E657C806A1E3DED637C488384E05615E78C96FD0DDE0F5F0 +170A04AD520E0B9BEC13A133DD976794FD9A63FB22F495BBA2DCC7BD11FC8D65 +8A1D80B2CF25666D444FD09DD1650B542D894DB7547A03BB60A9F1C673073A0D +789A66A3B41678579F42B2421878DDE27D4873D4FEC825685E90BBC6E9631A4B +A5F6149B7C16962139338DF54857B590E9A39926B11D0DCEA8388E7336AF455C +F5C39AB40504792DA3193B21BC793A63870CB7F6BAB8D0D51FF8125FD2BC72DE +A210AAD804AFB1D41B2E8ECF2936E74C53532775F21EDA729AA902B3C8B2ACDE +0578353AF3E9177C7906041C9360740841E64440F5815BD40FB1C41DFDF515CD +D47837C9654689CD118714FD6D8E4CF21A02B01AC9AEBDC75341741DC5ED3C73 +1DD0EAFF35BABBCE1CF9C207C1DC79F47EFDF0EC07D6E85D7ACE2FA8F5AAE916 +C80B1010086AC1E91B957A6A61D91113C98F95BCFCECB3255DC548A03C37612D +F9F47139A49B7236758A419D57E42694B0BDFDBB42EAF30E7F49421FB9563F72 +7036DB2C85AC91A83C37CD2EDE94B3EA82C45BFDC7E1696C76D15EF10141BBEB +363C098591B35024AC9D304B348D028F573ADB949327370A0F6EE2B8C9EA50A9 +9BDD725A81BB626CC124E522E9D164E10671A93BC36DFBE6025C34783106052F +142845026D6B18BEF2011E0BD47D03417EBD88F1D31FD36C61781735B5A1EAA5 +8C8E13BB206A6DE4584EDC53D0CEF8B91B59698106B9535D62BD88D80ECC85B6 +1F1CAC049843A88150359315F12D9940FC65DB61D8DBF588C707749E8823A53D +E19F6C060759BEE9A19A7536599754FB587751047B3723001349EE3A23851B68 +C8F5933E766D5CEFC618C0E551069A00BBEF52DFC94A3E5F0E5391FCB97A21AD +CF73E4EDDCF179730BFD8429DA97711A2A0B3853946026E6E8FD8F61C735946A +25E44B958697B722B52F4DD3BCA1358E2AC87A81840F05D76AD90DFF2756E7B8 +79DD5D43F0CBB873F11A9B753EA79F44F62BCBDEE84CFE171AFAE64C236CFA05 +521638B4F8CB880491BBC67B7C84268106D74DEB6A1BD035D9E4359C9417C14B +6EEE4AEBF574172122ECA13C800E178B7045C2D0B1BC92C07A5351C15C50BBDB +E7703FE1BE7E668BC059F62533786F36820D2EC57668C53B7DABFFF06BFCF199 +268B68430F3FF275EC74EF46F991B3EBF9FEF1B86659F81809DAD9F0C00718E3 +7DF1DA8521316FB2333305D58BF90854C5A9AAADF7BBACAF0CDB9B687CBCDDAF +30ED6E7778E4922B9766C461CF3D336B629980C3BD2CBCD246C0B21D0AFEAB5C +B44885D1F82796B6B064715FA3FC41BE38D338ABD15B7C627FC2D067F96151FC +8AF9EE0CFC15F16F4C8B6427926F17E612C2225274248B7B0809E1B08380FA9B +DCADCD2D1B26D1BF6FEDCB13C54489ED3558ABBC9ADC7A6610C411AAAFA94367 +7452F9260211EF5CF2DDCADB27DC0BA52C4EE8E6F5D98CD6B495755A4B52FB65 +67366EB69F16A3530371944BBFA0C82AB9459D718D08F50C60DDDF5DCFA64B1D +71DCCD8AA01FFB9387DD26DEFD30D97D5F9EE03F5DA165DBDB0D2052054DFD60 +DB8AD8A389940BA24F7F44C0307A9A446E3D53FB99A6E51A18B4700DF8F79D96 +1F3996630D3161EE5D119B6C0EBB57A1ED333DC8F18E35E5A715AC887257D37E +EC3BF6DFE165B62401C3BCF3752386166372061F6CDF94689070432C283C2277 +A5652AAFDC83461E0B5960997AB5B7E8F6CEB6BA0E2D9AAD4506ABE0E7CB5379 +77CBB9113727093B1160DA55CB2E6F2727414E53D8F7F66F45F1B7191AE7113F +FA7E11A2D144F27D3681258866A2B8F9C0BC12782CCC83AD847D5976FA7D4468 +78E55ED04B32B63B2324BEE7251FBC9C93223EFADB8946A267486F9863CAE636 +C602E5485628158238D5F6ED59D996E41A563B5641CBA250BAFADF44B4959C03 +838775AFB5CA6755A3C7DC78F1CB1154E63BA7370C4E0279CCED6D2E34695243 +6460A4F88C11842FF7B4BBD73711F2FD06888A02C0C5759C581DE1716C80DD56 +5C2B0223A20C56196D67F7A6D7B5F711743AA31B3D8B1CAFC649E1A3E227E32F +8A7716BB8E919A4F14F2630FBB1662767A1348055E48050DA6547F2B45FCC664 +8771E58CBD281DD1070E045FA81DE783F831C50ADDC4FE239FE4FCB231BE3F4E +2B6B75C719C88E69F8B3B38D25EA42F2B6A71B03FFB204076DEE53EB22812C36 +62A077A6097FF9687732C4B69F686406283AB883A2FDF4C5FE70A5472359E372 +DF28BB7DB8DA88E2399EB61FFEB037E484264561BB7A905DFDD110C5B110FE4A +2FD2FF3A1E3E1FF6CDA888F2B27522FC367999D7DAD58A29DF8EB796F15487B5 +11FBF4A8F7F6C9905C1F4E5E18C9729EF6C6028D5AE027CA67C1DCAA4CCDBE44 +A7D74CA0F6ABEE0BAA08C4A5A3C35FB3CE59EAD3480307132D25522518FC2331 +A46F67B236C4F51C9852562BBABE2705AB619C4D4F52675459F184FDD59AFE95 +30B97EEE211D690643BE8126130F3FF6EAD41FD9B760139FAD1BFB429C8BCD66 +0D504B64A7C502E476FD6237A1BD7CBC187AC7A30CB39614573B795F1EC2AB5B +47953B145DA8FB5990A80B515B4F9BFD32349F8F882E9BFEC8A321E3830A6379 +7595631C3E2E9B6711374532A8708CB0B554648DE5128FDB4D85445661AC950B +ACE8D7EC9CC3D5C756EF7890041957B2F625075DCD762A04442C0C5EB983B820 +22E64D66C3974D031D6789096E7A7A0D2D2A43FD1ADD8BDC80F9D1B381D67E3B +28B421336DD8812030E13FE79CEA71A9195BBC10EA5BCF2A446099ADF23C4310 +A7C0E296A311ABABE65AB2AF49BCAEABFA09CFDFC6C7B001B9CCAF252D6F76D8 +08DE4E08DD78DEA1FC92A5039BED5FEC5C276A1130EA569341765CC3EA94A4B0 +442244D7DFAA37B2DAEB640A4F014015CF54EA13CFD931517E3CBE786A6C4559 +182EA384C2113DE85A3EBF2B9B4E8356AEFB12FC9CDC11615CBAC7258A3D21C9 +F26CC170C3A3E774273032848D24267D0E7699445061B05BD5BBA4EBE4FC22F1 +9F0279CF940C39ABB756CEE674528B1E78D514C6D319F88B02152A425D4D2062 +7E798DDEA2149EB6D4F35D435C3777F9C6257D2A82930F540B119C7C3D0807AB +E383C37AA4E09F708DF1FDFE2CC8A3BCCE624A0E0DFE6F7A8D76CE50CDEBBB1C +6B61F75DBD9E52B8209495D00B7C01568F13AF0B5D812DEF37FF9896F83D7643 +A6A84920820A22BDCDBD9D5CB31A57C2BB67222ED05E71F061D79BF09A2651D8 +FA6ABE2FBB465F4310F1BF1BC5856984F5857398B636D1144F75202A4F9C4022 +0DFE3F18FD6043C381EA81B70DAFE2B776E88FAC1D482775AA6B452B81F5B396 +21A97D7214B5C1A766B62988330ED4CDFCDCAD8CC165CAD046278163046BF696 +BE49C3AFD83A0D6850CBC9FF1751D90433C03F373B89C31A0137EC9428A9C744 +72CE4653AB8B1CD3EC345C90879BCBB7C89B25AFE08A9FD880B78C9F6FD42186 +6103F6FCCC9E0FEFF506D56B5A98AC79F69DD7D60BDE46D29956E47396C7A15A +76887359539D654B899B6C0FC8ED736C5DE7199AC10FDD15B4FECE94E4CFB473 +0422A29427D252C11ADD2778C3777254F58EC33BB24C82F559287F92083CF708 +38A9CCED1E5EAACADA0B4CF23D83F1B257DFBA2F83883496BC1D8766A4FEFD11 +A320AD84F04C029DA40E51DB8E0F82EE343EF7383B29786B90680FA8A108A94F +E1CA201327F0E17C392C706CFB7515873582A090F93C9BA2BE6774B810FECD10 +01CDBFABEA808363A1374672AEDECAE03C783F7E2C85299E40F4B76AB7BF41CD +B01EC583140F30817B5C9B4D22EA6D4233E7EA1AD32629BBC513F79E85A0EBB2 +1AC59E7BAF8EC2FCA88318C1DD72B1E1D899354DBD8AF5C39EF980CAB38141EC +56C01860B90DCED2175947096C6D5AD7B56F4A5D0CF8569CCC1E0EAA454D696F +1652453ADDD38ADC336F2BA06523BF8DE4BC77969135CFC485313118989B90BF +B00E6A34AB57C871767EB52A9B970CD5D70D26164B6617F4D19C5C3DF977989C +687CA9F67509CB0E261E9A8D18FD6F0D7C061212B8BD3CD876CFEFC50BC6569D +5ED1FB4C56B4E0D3B2CC1117A90DB01802D36929E28F84C19ED6C83E65A0782B +F5EB4A9F9AB020A1FAA6B7BA6CBBE0C071BB1FB61B2F9113042C5A8E2E131FA2 +5677554EC8EA45604BF7464C5137EE17634E8434020D90CB88B94A76A100077A +21E031DFF68439EAB3381D1436E31452CD4D2E69914FD2E82E6D9AF2FBEF031B +53AF448C21559598865550488FF2EE2F88E3027F6D1840D52497EBF96AFA6691 +64F0671E2E29C6EFB745ACDBE97709FD452FA6B2BA43E1B21320862B5019F8A9 +52B68BDCD53B35BDA09F1FC4C480CFA3B92719E360BF124D9A9E728BB8D4AD56 +3D1CBF8EA793F509CF59585D2443DD46F15B8C86BA6438272ACA57274895771D +637365F5FB3361631F68CDE33A8E8B5E7FF3CAFAD3344FE57FB79115E2E67678 +B1ABFF4CCFB3540B6F7AD4189088EE0471DE1207E97945B4B74350A71852C0C8 +2EE1BA9E58C467B3234985794B04C91F6A857D5DE23F7B71CAFC182C7153EF1F +E353F897E22851A621E1D60FB5BA7FB0FCFFD4032F714F30B69609C9FB9B1032 +CE7F88EA8C488D55F9ABD713B603273830D45026A5A4D6E8E235E6772B43DC75 +59BA22ADC7382A89D5EC83D516B6B067DC0321FE435AD294787DC7A736CAE106 +FE2DB1162B182B1C9AEBA01BDF7A13934F796F7D5962D53C90084E5C5B0F54B1 +C50BEC8A2B11841E08B0B3E4F57ED0227298F2FC5F7553B0F3D522A1FD5DB5AD +261D7E37FA8AF178BB9F57531D728D266335807E68D6D7BA036804F0CF9D6EF7 +E024A3E3E2CA30911E6F37352A381EBDE15276CC52A168FE21AC6F8078CD9E80 +0E4212AC2AB968B339C7C55BD52AB03A3D0A65A10652149B4B56687105F6B51B +886A944C181310A86C7B824508A4614DA7EED2E942AFCA91C8685D9EFE369883 +021C308CE882836A5CD0A87C8F255ACC770B815F79EEF626A12618EA3AB0BF52 +AA35B2EF24789BDE3C8EF3E282882F3B7256CC2366A131AA8578FD14B369E5AF +B6C94E61BCB7FEEE9AFB30FCFCC9BF85B0444056614F18F99E4D456E50B977BE +E3D9996B9E817010678D3B6F733C4B3C48DB1E6475FA6E0E5C8D6A37517A1F56 +93819C842B090BE09DE6BC7E5D8BD3351DAB8469A27D9F5DFC4227EB534E8750 +695FBBFE39024507D5B7CFF063435E3EBEA0702CFEB563B3130AC0810A3BA1AB +4597EC9A2487D8EF0FC7827474ED4ACCDE5F680CFD17651A21E3EDC15E9FB31A +F9DC51FEB169A884F15732C1BF3948E8B96CC55563AADA8B3606B17218D86349 +470CC300E618135C404A8EEB551A10571A922B920945CCCF0F315D1A75F8C4EE +1A0641A8915BFBCA53162BB40F6AD8E8FFE411E2FBE104EE488385551FB16217 +D7784722697D0891B966CB4019037D0F96A1F57EC50C4B27437BB8763A79A7B8 +F1F01F5F4BCC48F7F642C6EF1CA4AFF92EB674CF99222EA58FE888B737ABF9F9 +2D87CDB282F6A5E8C02DCA4D76A2913CE31272387E21EBDEF0D9E2F24C79A7E3 +EED0A7FBA3A8BBD9B525ADE096B4903D120144B333F0D702E0B166D433E30EE3 +D3B0659FB70A2538DF137545C312665AC28FC49DCE75DF71FA1FCA37C6D0E879 +264C6B9D2B218859507A648A9FE83A8785079FD581CCE122B918DCC74A3A33DD +24589EE13017DC330385064B09E2C9B6E4A0E9D76A2ED29B68A547ED185D23E6 +730A46A85F80674E1F804216C1EFB747B7E9B8703CEB50C0206E0145969EF2CA +22F2604DC3FA86B795FDBEC57D4772AE030923BBDFCEFAC1A516E5CB058DB83A +BF6919BEBBB9B309E5E6263D6837FF36FAADD560BD7F2429CB4A5726923A683C +DECA1F3583E08C77AA81FB8D8623187596489A8894E0A7D562911DD7AB819260 +CDE2C4EA96901F92B2BE7ED14947B9D2A949C547B8A5CF52D9D15C930DDB4E3C +5E3B274198C2C80DD92CF75C28C74CEC39EE946A6047F6C056AB6E029A6E9654 +4A3E162AA204BCAD3B221288ED33DE3DA6095E85675A8105F5CC88CCEF4C85D8 +45F829A7EAF58B6B5D3DFA9FD708B82101C19895ADCD390B6C3723E8B3C42196 +F4AA43A125A1FCAFF10621AD0056B096C21C53D5C9B29D359A568F66C1F65A42 +7B76218410C0D4D47F64B3F625519D5443CAF0ACBCF6E45B59E9D7C4C6DF3545 +6D01216FFC11EACCA0FB29DC997CBA1E6B4408AB95CC3340C7BCAB683B7E62A8 +80D5FEC00070DB68043F8B95CFE064F09E62A2BC0C99138A5069E27C70F7FEF0 +DF3B98DE67070E05C0E3680DC1BFA10025DAF449B5E2FEE824B277DEB9489E63 +C27D82358933C1B103EB95AC38EA9F52F3D437C59DB47AA465DAC7EC07F731E0 +7F72C3868CD58DB46FB7839DE77F8B00B5ED53322DD03CFB2303C2CC1B26C78B +B6F7624596B92939E8D6717F6C75139FCE87D549D311B8EE9A63EEB766D68A26 +689DD5EDBF8A9B8695EA4226437620AF7ABC90A5E19A1BCF9CE1B38F99CC6626 +651ED6388A1CAACD4CF505131B97B27F32F68E2F83882108598140218BE26381 +8C32D7FD29852913C5BFE5C65C0EAD586D801B0E5BBC6310FC50A92E18151EEC +FDDC28F39FD1A323A3B5EB5DC12D263DD1D7D8B9A69B5CC156B041CA460D4055 +6B2F44057BECED5CF64C9DD3E5AF2B13053841C9FF55E28E21EE767EED5E16E9 +A033C6442737BD02C0BFC4E2137951ECD3C21F6CFFE5394D37DB260D5EA02F0F +FE200F25E652110134711CB66547C6E3DEA4684233B3369CB975761CB81F91BF +F6F1E4808276641AEF2F9D0577E8A6D4DE2AA8BD547A0EEF761E2C62DE6EE39D +76CB24479232B1DCD7219BA499225B533791BF358610ED296656A3F95A44D564 +DAE42762CA32419A67501BCAAEB2360BE431E835A00CB7BF1B6E58CE1F6FE01D +191A9117CFDD9AC1ABA5B616FA4CFF94EEBE9F84BC4338F66F86FC04EFC73548 +1F6D884F7A8837011A13127F58AB3F47F7C301F872550F558B462205726683AA +B9AC359D635C6B7733DDB204D23AF4279CE7F5DC8BBB352B4B2F50E9721DC89C +EE6CE994935C74AB296589C3C47F624972B7D92E0D1FFB7F5A30FD52E1B15126 +86D1595E064FACF2BCD55A5391F9AB38C3913B008491D7003782F95668735AB7 +56EFA837275E42856380E3F5B9F29C1F3C2EA94440A8C5399771065EB26DD940 +12C34F5DFE5AA595249CD08EC2B9C2E387DAECDF0E7878B9888D7630DCED1C9F +D341C61C57B47C12CC7DFBC5AD8F2FE583A2378B0E111CFAB1891794FE65E2E2 +3CD1F5DC0A2D57F2B6E4F88B9298234756748DEB13AC2163147EDBFB9D44C614 +9606533420CC766AE517630E0B7BCF01F2B5A092CE86F3B0E69614C2E3867B9A +99E05A128EF55B171C869616A1B4AA03D7EC61BF69D36ECE84BE11D888FEE73E +C91C03CE9A752EE81E21E73E849931FE57D0AC6180D9884E5BBA81EA20B9C879 +31AC7E8B3B26A27D510E69512B9CCCAB31F41ABFA92CBC9972AA3B8612CD5440 +AD0C1FDAB86391E2358F209D7D6EB419D18BBF8EBBF13C7838B40625FB5461B6 +4AC315A975E6687D68504B1CEB3C507CD015A25689614B379F7EECCCB5EA7978 +DA58CE5562A85E0E5FF07FDA3E08088A8A0C8285E8B30A95FE7ED9C5C80B23C0 +F696683A43ADA8F6D1AE93AD9E95E05AA639EA487E19D2BC1377F611FCF62647 +E21F511B70CB659A0B120F64F98CB091B751A55376A60E34041011E5DE6C8ECE +D124DCB9FA45029064DE7CA36F8CCE8FB149A220A29083CE2F7F56A665940958 +1B1384039664D4B1E3EC177CFC6DB6A98E162D89FEA3CE1C35803C4CB7593756 +CCAFFC04F2F41743D684EEFD4DB4B9B2E9C8DA8BD3EE4539405F2B1B2BC5AEEC +F6B303C32892CDAD9E9F7B2B00175F9B45133D3317D87922D268C3CED1CD1C51 +FF4604002D6AEBC8E4784BD4E87979C9C5964962D6AF054DBE2B00FD08419C16 +9F3D7B2C70723BC7B0B5273AAFE83C2D0B1B96D7F0617FEACC78A584DFA8D253 +D71029C6884E70033922D3E2B2DD27231A0B9A9FC83A0D75349FDE08D60B9F6B +76F0BE5614C22C5A3810DD19A8AF131DF61C98D739220243D6136A56B6ED09E1 +49C0CD780134E118D88C5AE22CD15128E00E5E47C27CFCD1E8201AE916F4881D +EA3D220AC1798A571B4BE179A5BBB474508A1BF6C7415C6465602FF73FA78214 +D20E6F79BDB768C2F0AADB39088359DE6A5412885C21837E7B97A20BFCA2364A +1FFCBBFD3FF10936C80448A2E8343247E552A5F082A5B2E44F72DCB3D0074D48 +BAE6C21FF654953B9E0A33AB9B33259044BDE76643833BE8588F50130087356B +19EACBA029A1ACD80CD0DAB61094A8BDCE989D7B6BE57A58698079245DB6857C +ABFFDE2F20116A134E2BFBFCD1A4790FA4B723142BB0745C755CFA493C33EF54 +60EACDC2AA25704B648E7A4D03127D49C68F79A3A6E74294CD7BF78C4003209C +CED18AA524478D46D6286061E69975212175230477A59A6342A684A5955EA108 +98C38DB86533C293B419E2D7E5C4E15DC47BA14478ADF01D466DB7CF41E34196 +4A64 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l049033t.pfa b/ogclient/lib/fonts/l049033t.pfa new file mode 100644 index 0000000..1c7e205 --- /dev/null +++ b/ogclient/lib/fonts/l049033t.pfa @@ -0,0 +1,1735 @@ +%!PS-AdobeFont-1.0: LuxiSerif-Oblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Oblique) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Regular) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -30 def +/UnderlineThickness 60 def +end readonly def +/FontName /LuxiSerif-Oblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-207 -211 1088 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078993 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E5A3EA27312D552EF3BA +D64EAC97A2E691AD6D6E5E444CB2AB74100E0BBCD168621F404A2C17DAE2055C +D93986BA853006BC4334F74072DB02FF011FB0F56FA0837770F4DCE07D798EDE +1F4B52091BA76C81A45FBE15DB5A0D68D7A79A8DEA9E4CDC55A047442208C135 +341BDA8FC13603A79D99D9727F1E4DE02E48C52B5CE6F5562616B4BC9B244567 +46D53ED8EFAFD8C44F4FA1999EFB90044F1C32BC1F17875428F1B9282238D5E5 +F13485FC0BB836C0B07591955B070B64DE596BDBA674A31380AAD2387FDA4077 +F0C99DB67BC7E0D2F4A214F0297085D898A0B1B8F87EA37A22039BAA041A168F +9A09FBDEF76C808DAB506A14BE209ECEDD52561A881096E9005665CD1F34B5A8 +CAA535FC82F7C2643B07D7A4DDA492AF2B82FF073FC79FCE68FE8BCA2C899AE9 +FD64352D010C7CEC4853C29EE8E9E1CFA01A58A75D91F09D51BE3D56BA37E8EB +161BB620977C99673D3CD1D0B268F9CE2D8E5B0F95A8091634DE5B63E112F25A +2D794D375AD81A716DFDDAAC5B40E5E127191A098317223EEE90186101A453B8 +4D60C9C1E5FEA43CBCCFA33DBD3AF962D9E9B6963667C49BD729B73F333BE4BB +5009B89754383FAFEFBD007839B81AFCAE0661A3237B01B83ED6DF684272E95B +A01B989947AFEFDD0DCD5E6A67D331EC60BE9B77C6C0586B6C57113D304AF5A5 +07C5766D0B19C4061E59A3EF4041F8E9CA4EFFDE2F48653B5EDBA25DC74FBAC4 +D6736D66890497C37B4DFB51CB2D7B6CDCD1D691548209BF599E149BCA092B1D +2E8D1203CB0851C714FCD6777BCEBB26318D5C5E2E439C5CB17A93EDC9E48E10 +92166DCA43650ACBA389D3A55D38ED21951504CBD551FC7EAF5D3A8BFD48FFAF +DB31CA6E7D0E1DDBA18569A6900A20A11A9B4B8B3383900B369A4A1C9859F828 +DC8BBC1BB653F92C1C78D24EB7D3CB97D6F1D5B63E099E68D065A9ABB7228B1D +B6D17A5C3FC4255972A26B54AF5E9973BAC93A9F5E84220CA34E3C531D23DB43 +50001FC2BF3F62049435BBF3AC2FF0EA43B63EEC52D3AE060018CB3331882A9F +6B05A69332C5DA24457DF7F2AFBA0FC7E512A28BF6C638FACBFFD54B90CF0768 +E5F2180D31C651B7F58EB26B484955D1156CD7F37BF812224950615DA203E923 +E07250619C784672066E8B36423A83E2BD4970F894AF6F52B2F0A6AA1A85137E +056051067F2979EDA3EABF13255A3CE018FB7EDC0D3C7458FA67E63AB44F0E7A +770E2D2A8309285D6B04701A53F44503AE64B9D572560E12B102ABFD762F3988 +AC2B39737A18F9A52A0BD10BE37CF64F5198600DB70B31F6A9DA9FD6B2AE82F0 +C745B5AFD6C2F650D5273516C4130052964AF5349D562BE851E4B604F60789A9 +C673EB95E8873A695BD37549F0C6F1CD390F5DBCD938320A0CBBC22A3CDE08A4 +F8D15B484B34DF6971A54B8F7FB1CF485EE80B16412EEAA55632C6148404D293 +2B574F96BC9405DA846B02C1EF69797A0ACC13E42BAA953827E28F17D57CE611 +683565E3627DC24E3B67D80E2C740E5941431F816F60249DBDE5755BC004157F +7ADBBA7F7ACF01B405A87382189BF6540E6B53E52F772A05B23462D1E6B11F1D +8462B8474CE66638DFA39DDC6BB35E06463312D4858418A49C71EDD693348F23 +E3B6C4BAAE2D228D1B45290A316721673C256B03378E998594847503606EE7C1 +5276590ABC466729F36F907A0B37B5F1BC381A115A65DC2B2C5B8439F85901B1 +BBD6EF263820E813F9E4BD65E9A29FFDD9178D22EA74552E22DE6362E465D698 +3795D8FD2487B2A624D5C535063F1B2BB3DEE07E7BA4A5936BB0DFA4377BA2F1 +FE555D347799403EFE551EFF30BE7468A471E902433EFBF02E4784B583B1C255 +BA90095E37CAEA6CBD0BAD59E3B9A14120190846B8AC02B9A6442B78E68BBC0B +94F8E33387523D672BD366106A4BB62B1CF022364D011CF340BF08021FC70AE1 +D2B4714002FAD60CB843898B731FD401D41C25AC996A864B4848C0DAFFFC7383 +95EA07BCC6A7BD093D1ADB6E3D220AFF5669883F5C01B2820C82E07411488E7F +66CB3CC2F58D0F867D9370FC82B6D231B37E5E6FF413669ADADF2264586D9E25 +AF180F49B79416618FECFA641018806471B0145DA023FFB1FC61A51D03B86C5E +4EBEB9F7F5D5182C3075474B9CCE399CA11C9FA17EE469FE0481C253253FC03F +A4562033ADBC19505B863A444C23F07B048A3DD044E8CD9F0BD77C9459D61FA8 +1AFD906843077AC6F878B099F776C0A4BB5460B3D1F81DC3871F3BD4C8379B08 +8309F47A42D923C153F7581EEC85AB756075CB465CC8F8301AC6D00764992DE9 +E0BF8A4D9C6B4B0EA012216797543DED1CC8AD8D89B277E586B1763F9004583D +CF1EE2BBA82FF768EFD891834C0CED284F56580A4BBE440839A53F8636B1C99D +89D65CEA7FCFFB44F9CAC913A52C81728800031F240A502B588F487AAE219D97 +CED1BCD34096FA682B335FF362F87FA6D8A307CB9D796F1700CDFA3D21C5BB66 +FA221D737EAAD02208240E4B882CE67D19AE089380B0FEDAC4F97E7ED7629A20 +C7F8688BE4D5C0AF3326A66C1403E968E8963F4DDE599143D8C57CCF85B7887E +980D75A2DD2B7AA28202635645D768C7121AC6D6FA7A6DDB06BE3AB1624D36C6 +C0F31E3B9BFED8691709D747DC2550915DE2A2486B7E74DD1665F350D2FFAA8E +81E8671F67776964ED20C46E2FCD2CF7B3E0B559FD8C9A24C39611E930D0EB7F +B28FAA043903F3E4A0E3C1856CF7EDFDA670FA030C2A78A99F4FC80207E17A20 +63C316F77D88676C3FB96B680B1A27180087FAA1FB5CBED05EC3BA0CC5566CBF +496545871367621CC713131BD73F6C37064EF652DB3CF175AE9636ADFFF84259 +25A185AD1F4582845C8D4B095B4F7628F1D44C79FDD16E20638698C2D3AE2797 +04723053FD9ED7D54F2A64C09CA1FC60D3410E42196E42BB914E4C4A04C39599 +51BB33559A9EDDE6FD37E9876659831E92E1FC5FB389E5C89A0D59F792AC9D51 +2A27FD50F713B97D32D83A216241DA10B43928565CFA592C54A4288118B6989C +8BC97A4A1E3C8EF78B1E17C18B4D36F48067C9746CE3109914324B9FFAB62B27 +603ECA751FE7AABFC5E38DE09BDE9E575EA00E8726C3918DB505D2264A510EFD +117D3F834DCD09796193CC5D6911FC7BA69DBC8350468534353B20E8EBC077F0 +9CA9090C11E7FB960DF3596125E52411C38A7E5C36F88313F84FEA1916C5FCC9 +BD772A1B9DDD67BD21B117F9F2F00FB7B1EBA1B5DF9CD89CD46E0BFA65199E62 +FB5C7F1557C60A36D87898E8C2BCDEEF99040B45585C0ACAD8E573901AAD634D +D2F69B4CB22412EDA3C74D5D6098E8BAA1D25A1B78D07FB93A58F84EAB79ADDE +E84D39DAA5C0E94FE8951AD145AF05E9A2A4432B7BB6E853FE441EAD4DECD57D +D8E96957622DBF00DF38825C428ADEE495F1CCB5B25F08CCA276DCB042A63CC8 +D610CF464BB435CF4716ABB81A7166EA48CD9855BAD9046C898390441B7435D2 +FFC98669E81324854E750F49F64FD19D69A10A92328F2A4B11DBC02EB1F7CC46 +54FD66F66A32B02C57488F8BB468D73DAB1B3982DF8405BA4F1CEA9C76D10F54 +F5481A0C3DECCF250DF79F6B614B3E7CDC0571E95FC4478A20CDB3E4D4B83ECD +3C747CE9D175AF8F8E0E435A7D5C498BBD387D9041DBBA0EB62A5035838D7E45 +4B0717C5CC75BEF851558280983D72DEE80A0EC3F685A2467C6D22F4E33C4D6A +494589594DB320011E40993D0942E3D26B507E61BFA17A3FE55157225468E2BC +6C63EF000588FF08D4E0F8D244152FC03B35FA6C5F6BAEC28D34F3FDFDBDFB8F +90DAE0DFD3D284A3E859AA4F79091E373D27C04A82819A2E91AF7736AA070F56 +2429F1077B9F32E7F1700AF99146863A82481D0E78729E9EAEA3C2FFDED364BA +D88A837491D5A6428294F60C608A3483A2BFA25FE5E0FEA30E984C46E25D98B0 +28B708C01494CF33D00C0174E18E52F9B2EA7F921827505A980BCCDD191E1B8C +D6BEDFA50F653B88CB0144871B2AE58835B15F7CE53F731CCBDD056672574ED0 +7BEF33FAC905EBCD9D47B82F749B30D14CED4D0907DCF3DFCF0185BA1CBE722C +49D7186BF7981DFCE6B2679E177569941FCD563FC3B9B75610847279C1A01341 +AD3C35B4752799789DFC7D2A1F5F0DFAF89C498DE1A771DFCBE9816971C5313B +5AA89B10C8C4094049570C394A837B031BE0A8AED0A74123CCBBCE2DE1671841 +397237C7827A5BC42574E2AD0605F84B77261DD7DEF10EDE93BA9D61FF8174BD +3BA0A966728BBBAA807DABFC3108209752FCEAD24BEBC8B22603C9E7B158E86E +8873BB01E6D25A09F5FDFBB6EDD3FAF6C672461644BF76ADFDE82DE718BF11F9 +A75433926E4B37556EF4BE8110D82A385C324DAEC3F37D89434C5EC8CA3286F3 +A0819C04DA7E4E48CEFBA97BCFB6005D3B3DF4A8880D3349FB15EB7A614FCAB6 +806ED53B9BA76C02E89D161E8A880ACE8E4201029C62DF57099634EEFE3FC7C5 +A755374ACCBCA10435F24D5F649EC05D4CBF39150A893984A177ECB0D3956D88 +798954C873DFCE8F57D13D6652CC928E9F80B4B6D47C5CF9B17BF89456C7B91F +4717C990911E19C595B52D19C4E5DD70AB3183C4165A4217ABCE21EBF6115E53 +8A1774E1A998893F0668FDF637A05178F5F1CC675CFE42E67D56C3365A762FE6 +DB7B670A60C81104B9237F5BE835B38184D56DEFCA72130240A2C543035B4418 +384ECD8189CD5B7966663EC5B42A83406D06210A37C65D02F7C6CDC3C499C574 +4A4E719EB0F14EAF5786A385D9BA4A04D3B7EDCF1BB35D3243264DE8AEA06AA7 +28DEBC7B95023FE76C18E9CE32FBF3AB800F3F8C9FB5211BDCF93469DF59BDD0 +662345D4D57D9A56BAB5A145DCBCE29521E30DE7C6637A812E64253584D66BD3 +83BBDB9B8A1AC464FB53009D543B74F07B234B4E1D523DAB41EEFCD319465AE1 +BEFF3DC939164B65A06C6F60AFC0126E093166A842B40F8C39693AEAE9BCDAC9 +758B1163F4AEB042E8AE1385672B62B161D83CEDD0889080CE8F76900B82F82D +B84192D470A0C3C80C5E15C1E3ED8FD582825FC18A055C40FAE681E1EC4B16B6 +53A1723815E7D7E8C65553F97D7577859E4E63FD7EA4508825B75FD8FF0F49D8 +03047786DD59110FB7F422C6C625992E86C719F6932ADBA81CBE1C43C63DD43C +50D79466C8AA5166B8C664D8F6E90F1A807E8EF26A1B69DC6314B72F20A390A2 +98599D640CC42ECD583F6405828CA8408EAEBE5997D15BA79060AD9C8E5FFF57 +8B64D12E6AD37373570EDCD19FFD63951EA8BA780A2D01F1B9670BB636088C3C +4B1A8706556D8EB05F15B34A549905C330004A66083B88D6D6D3B538B93F7090 +4719658F96F98FA64F2D8773ED8BA488CDA55ED6D75AD2B8E9AF47AC86FC2FB8 +29CF1A792379143993D9E20240DCA56D3E7EFEA9466B0138175CDF149DBB6872 +565A8D48C7233A6AE4780373014CC5CD045CA08EB63631A50B8C05AA893A6128 +FAAFFAE38FC5C81D9320B116864DAEA14ECBF347953510B494993E459483D0E7 +7699A329D0EF527230463543C583EDD4D5C05CE0E81D1A51723300EA987314B2 +3352F4D19439CB60D500EBDDE5B3A293D4771A4AA137E76DF5688C50A65258EC +DD90D1060DB86A881F858ED21DE81E407FE74E9904E98BF659282B89D9ED0240 +535995B68AEA47B05601AC9BEF4735CF94BD905324CE61374AA17FC0AB3CE14D +23D28C1DDB70E9EB283ECBF96BC601C7B16810C46D996DEE582A41C995208793 +F88378EA764446F9AF8939AF830CC14D62345B40264362CAC8DA7D59953FC1EA +6DDCF2142D534C0D3C3EA587503BDF46F76C459772A60C5CC4716235B0EE1576 +690C4F6E9D1C6825253BDB9CE0C710D1F0BAD5193878AF0D3EE7D51D54C7E0FA +AFC54104158E7D0B6B9F7F83E7371AF8D278D861B91974135818DB29D89F1501 +A00CE9CCCA2662A93B447E9A5EBA74A719C811598CB09AA94CEE7D9EE8880967 +443D806099915D25D63021B4E57F359AC43911D42E07F6E8E3CBEC19B6C0496A +24C383E14E8CC8B664EDA0248B047951DFAF98D8D8F2FB531FC408FC123606ED +86788DBD7D42DA61B976B263685297224FEE5BBD981C5A45194046016A8B26E6 +F54EE7FD496AC4DEFA514BDA54EABDF41F1619C4E533363C5CF5914B25890331 +9A7F821F784004AEE9D10D4B47F75D0531F80AE71097B4DDE3B8BBD360EE2727 +3892959E0C7480895DDFE0A8999E18302F60979F5B2FC794F5AAEE205BE8FDB8 +84684F7B35DD6F88CF8C5AD2B982E6EFACCBBB7A4700A67CE00998252AD0B287 +E20D5AFA935A49B1ED106E71FA16355F1A54D64E0F8D2545D98FD99690C40B96 +1A9162AD79EBB7B613A015EF486FC56F2EEA41FA772EDA87137606EEBDB64E04 +E24856C6E819063B2CE246F7223C6330A36D624A597707D2385F43CC17D529AE +4997634BA6BC9090AB520E2C45EB729612B12F9D3FD91DC4C9EE74CFC552E56C +4D672D1306407D690974E5B3DE86C7EFE946DC7ACA248718FE3B2F699E01CEF2 +B70DCFB81F24AA2A2C220E14006B8D6E09C5101F6724E9D75BA1F465E211B1D5 +177E9F83AAC3F0DF18EB7454E61F76CB700DD59D8ABB42B1AEE8FD5565F85D70 +240B724E6D3C5935D8F42638DC82D9773CA3B78954ED6533F1D0BBAF1BCACBF8 +E0CDF3032CE880780EE8F56AC2182A46A319798C9C60D398BE16E654490428B5 +A480805FD3E59D75A2E154C1016D210D4DD3E11639E9F2AE510694FE5F7D9733 +F594EBB8A17B5A2A2471C571D481E8C04D072511753927376F97F1E3009D3B31 +ABCD1C6DE64D19D471E39E7FABFD7978ECFA08E611A9932EAB8AFC7A4A1AB516 +6315B8363C62D112A9FCE8489156E6164BE073C1FA98E9D55E975B86ACD9CC87 +03542B3B79EACDDC0F525ADF9922868CF31F3D83D1E392ADF522E46D9E71EDF5 +25C3FF53ACCB292A8604CC32E8B3051AC8BBACD05948612D337DED7C027E4EB8 +F5ED77D4966D1A6B32722613F9BE146E5D7A61ACEEC0B8472E95B4E8266DB146 +8B1991DFEC19482C9E1D4058016E0EE9B2545B07CB4810F564B10D0EA86BD066 +41F027E003DEC79F80D11E9452035B4093FDB920B535C18EF20305534855287F +DCECDAD9A1CBCD79CCADBAB8F3B55B0E59001E587A81B5D02EE45FC1672C411E +FBEB21598F9FFCD05C55AAAA281AACA5193DA116B1F46ACB96F728D40476BD89 +542BD47C984849AB998D6DA2AF989EC1BB9A26F4361C610919969F7DA2771B7B +055F44BF8DED74CDD91CA5609918ED52354ABEFF2DA73C1DE643FA90FE4FF2B3 +830743AB648D2A108FF8CBBEEC1DCB62A71490A6D574AB2C36792CC00CE631D1 +984014A7B9508C3FC71CEEDD417F6E31F5BBC6F1FC0AE55155F9D56A1AA196C3 +A696F91CDEA58317BE9E8B37F112E6076C765B1C25F0CC6F671428C91A57C63A +1A69F5931B1875664D489A65698A2BCD637965FA5001F2AAE617BD5AE2DF9B9D +0E230D097AEBEA7551245B5F6B4D98EBB1DD23C6ACBE887FAB49E9F271051F15 +E6EE147FA3B91FCBB5F0D571D69E1C942BAD057F13E4D44B4C3BCDA1A34B4A1B +FC1B3938C1A20FF5F3C2F479FA651F015C4BB08BC019A692462F15CF9DA72D1B +04DB4C99E145218840246E4337700D009123F528AB89469B888C9DFA38E032B2 +7E2256BFB68648EB06197B1DA3F73AE3DBF313A8C661499CC0693C8D3557F0EE +B9479448E1A85B014F1D178C6BE2B625EE25EB51CDC71B9510793AA5D823CF6D +7328E54584076DF26B858C9836077C4A2381F4A6EE19F4E801772C0DBA42508A +3D92EA34CD0921CDD2C56A1D9ACEC3CEB200626FE3CAF033E24800DBD51E6C82 +FA0F7E37F3DA97A83227358C5B20549859645E819C193B303A957229F66896EB +225922A128B1333C3AC8C616D348C1FE225DE03782E6E5719F13DB747D0846E9 +C3C66728C9099069DEF69A4F254188C46177757DEACB597E8CEDE41658FA405D +921E8F71F91F455C0A11B8B517BEE363690C14FBB31232239F5A095CBFC7941A +95815705868B3BE129F81BEE586F90983A28C04543E049BE4A6CB0EDC3EF4929 +D2499DD08DF2A3BCC55CAF2AEB42695A8016A4A1A52D4688AE0C4867363AFA12 +3EED7AF3200320C1EA166FBE2A42BE3157AB633610FAF827666C239F5E6310EF +BBC01419156AB3022DC29B5C64E8F676150AB1A5CB91AE6E9453A60A5A24607D +AC7F2B5790429364E4E6BC6F3731610769EA645101C3329C77CC30D7E7742FA9 +6E47A1F4A95E5B9A9DF448B03C764390C74B6CE38FD8A43E0FD49B19E5508491 +4A47FDA43F186BDECD6D9FD0F1D592FE384F09D4415EA6FB9AAD57F11465E56B +CC7CF0F78A498F3B63985EE28F4E18557DB38101282E3FF5827569B33DE8510D +9ACB69C2D3F13D791A4E095B77A92081D8943E3027F6A8AE7DF75A8946CBCC5D +D397485BF27B974A5708AB8C06AF9B9C695725B49D670891EB0C87A4B650F117 +381EDC200C8172A35F37542F207FEFE29ED8337427230C2B16536FAC2C89B550 +6F714AC7D8870775AB79A072355DE4A5B4D1B4520FF18D626A8BD3F6BEA2A17A +8EA40E7A82494F7C063830B6B81779212BE325569F482C0239E11CAD51B49207 +012F36787400AEED36BC61A6DA3B497E86D4BE1E849E577C89A72EF77A6E252E +153E83DBBBE61BD4AE74D470F8A729E385628C9B60D12A999C345C19348A0F95 +6EE4379A54C267466537316ED4BC409483351B747C91241C1CF777B72491D418 +8BD37616222529F07681FE0F43B3ADA4847A612C7C56B5B32D8011D13A9DC226 +116C53C017F2E54C5D2EAB0047BC9B01A9A414D2EF9F51D9E9861615CFD729B4 +FCADE9B5C9EEC3D84C9F97B2528CDE18C4B461FD56A5327771C977B13E967091 +B8B375C0E7A63D93681104AA2D00161D1A9FC91457DEAB8114A9EA93EF9AC7CD +B292CA7EB423DF2EA9183A267953D4B431A5C532B26B12A4D2D681804DB2A908 +4E15E30372E42740E3E04E044BB9E97252B95A7BEE944E3840A4E9A327ECD640 +38194D75C20F80497DB572929D7B1DE23C5150A242A5D042988C83F39BB55958 +E3BFAEC4582969F5690715B30A44B6CFBF33DF363400A52191EB2BBCC599F2B2 +F4FABAE2BADBA0731D59F1B2E43C97769BFD3B9CD210018080BB38A06DE7A42B +D717CFA65D48118E5FFB29C2DC85E1D3068261EA15CD6F851C4DE7FBE2D6B4C7 +A6EB8752F6B4BF9C5DFB7C3282D56FD0E1036F3D74C2A96B4D308D91C1D83F93 +E59BB92411EE3CFA1169E5C92A94A32CBAEC1B570CC34F14B1810C1144283402 +F6021537D75F7B98DA7459921CAF5DE5323C1C1400C79B1E9BAFE971F7F21268 +4AC50D4D0DEF6E15F2DCB9541C04FE993AF7982AE5F9C4C6CBCA302B76EA1A6F +DFC4D325A8CBF550FFA5D9298B4DC9D016A66FC44D3ACD5F26C980F61AC2A49E +B738EFA01CFA1ACC7F251E87195F70385CC3B19D3D7701CDF9E4CD52FAB6AC67 +C86FEAA4A793FBA499A7601F95F9F934495FE5AF5EC8CCB8F1C061E9733EC0C4 +845364B1F0A232EAF557C293EE11704617B82DB310FB50B152A711EDAA13182F +6AB5B07064C07CCEBCB7ED57669150C74A2E72E95CB979EB18E439D8C2C55C23 +3A66A30F43B2C40B939592405EACE804CF149A667DD795016439668BF538913D +A46FE03F8A45B348EFB1F5A454BD392390225351099E12068DBD8EFC37365FB2 +899734B4D85E0AD8D98F18EDB76389713CE43C0DD27D4E0AD99BD3CED8359325 +CDFFB957B75D05325AF1FE0532260F41AD9C37E5533019AD8ED57A1D7214A0B7 +FE158F9A5DB18CBDB2CEF1829C6DC6CDE3A14D2E7BE72648EE28C088EE03CD66 +EEE9C566F8380473199F069C73C621C8A8FA0A3E606730A2A6E3B0C72C09B0AF +46803CA2D1134E117D38C827AB65BE4F5F8B1E43F1294E07C38924243796B797 +4F27F3124FFEB4609518D629C0FCCDF235363A523C0F6AC3D37BCEB1DCD10231 +6ED57B4137242BBAD3F625CB0D79AF1A46DFD85232CC90F5EAB36E950CC5D7FC +345A443B7F1CCF0028A6759F37F7356EBEC1B1271FA22BB0A72DE74EED1F8E5C +C9A20D9D2115C7FEA8EC01F15FA28A2F4537A3C21EF9A168017327BC03FB37EE +FA1E0ED6BD673F79CC1DC21B88C26550A14AEEEBDDB1E61CCC504157E461E29C +7BDB3D919A2986B5EC8EB2D732B0B4BFF561DAA1E9618CD256E219C4DE36B69F +4B6DFCF81B78F00D14145F21FFE675850CDDB32D499BDFBC1EC0D35787225CD3 +DEDD89FDAEE89501C4E5850F06BD948E95FAA06BFD2556BDB16259D19086598D +DA982F4D7593DC56130F818CB25DD92F2388520E730C8B3ACA4E03A3CF8CF205 +FFCF113E4278F0B5869E37AF3460C9BD1DE520D277AE1A09F85E276D6F16D7DE +C04E12DA6EB6FEE8F9285E888ECA6B408A8EE929ED51F5A7CAF5FF5F87579604 +889BFC328A4E43D308DF7B6F89C059DBDD4458D521A4FFD66E8339D883E1B7D5 +951E32532F60D1B75845DAE58332BDDE7A72A8FAD548E31202130EE23E730ABE +C9007226F3C24AD929158D6A266A045C715B293A3D7E8447CBE6062BFEBD7956 +9088865031AD88B5329D104969A1FAD918F828208B743B650ABA1F345D9D6227 +5E4AF25448CCBB425DAE77E2CB9B73C73E0247C3DBE67F7BC3401433DBE53E08 +561295690C9F93A07D10093DC2AE953174ACA5358B40F3BA9DCF0710C49976A3 +C482B698FA107B25B246789B91473B63B4C9396997BBE4C8A5821E9F6C48598F +41FBEBA01C031E5B3107A5D20839907D62D51F721ABD116A40692084A06818D6 +19470FE3BF24062BA7E62A27841DDC319496790E027DBCD4EB1B87810F936D5A +D33212E5CD654BDF7E245D04A555640DBD89A6A998A6A2377CA8AC615734035E +44ACD5BCBDAF14DD345D8D6B8A34AE91A6AFA2A7FE4B09761A732DB70692691C +774659E2768D84943091417976A6ABE11095605C8269813BB4811F0F47A8F669 +34E3168FA6A02E4DA5335ECFFC0077F7D3D4573BFDE1D22E5FC066AB27579763 +422F27362794478CA59D87E9B4049F7CCBF47854774BE273A6B6F0638F897E92 +741F3144F7BDAC4010929BD605D3C52234F5EAA239A68FA7C52CE2B184538C06 +E0A90BE79DD5FDAD372D95213E30F9C2A999E21F598BDEAF6315F5C3BCDD6044 +92733C0B012F610C25E146CB6F17AA6CBDCA88116E7B551B3B882179441E0568 +852F3E714BAFDE7ABDB93BBA3F1C04E4FFE87D786B38CDE07FC9797AE301F3BC +70013745A652EA5A8DB0265E846BE240D4A456E3B1953553D1D36781FBF11C50 +90C2236FC2CAECBC91C0FC04FC9F3B86BA31684BE56309027044EDAC9997EC57 +247D28A677AEE4B0844EEC683A2227969EF18F52D1E9C926569AFB482CC0C475 +E0217037378CFF3B701A798074AE248751A7DDA18EC1138BEB5E57FFED63B920 +D9BE59FE503DD1EE2909A7FDE826B40A419CB0089C91D6A134EAC709CAC514CD +DA21620C37994A81709C97314C1A09BA6AF7206122BC143310CF7D9CDE96AFFD +ABF6B7400862212ED910F90C9E9B90BA2F7AE0364472576AE09C193D7F327016 +D9C68AF2F55C13FE4AB71C2B4C7D9A9A58AA097B69447DFCD98219A2998BDA74 +00807ADFFF265B30D1A9A2D967856C911A15D89A147016F70099D7AA84E661A3 +64EE3A3E379ACF29DDE519099453FF94441B19405D7C873F6DDCAB0EA55E8271 +ABF2B29FE36B9D3B2461D01DEDDEA93EE39BA85B6424D70A72AA4B05B19B6D42 +D46298C7D23E94A88FACA6D476DC37E379F537B80454A61678262B39B84E0530 +F21082CD5EA2D11623EBB27340297A0311BC422690758E11E6A2D14668C3FED6 +FF932118DCFBB0E4E8B723A2EB58367A96B16B9E3E466F9ABBD458C866CEB4EB +D326D8BBAC28163105F537220F240FFCDB3CC8D35F60AEF379B3679ACF3F86A3 +C0E32746EA9F67C084B2A80866DC1564CD4118E13D0E3842B623191E849EBD64 +8E89ED9377F700D60B0FB5A4248156A1D5E8400C21A2EF623730FE9530382652 +705E3C9228D9963BE6AA380A98574C52EB657B6F2E142AF3F0250FE04EA1E913 +BF95A78EC7A6A68FFFE15FE8128F3EAEFD692A17CA5F779C705FD1896B1C9BE2 +09E8D23F3BE13C3761DCAC7D89679EB558BFE8BF9A03B30D8790B7247E0C094A +A0E14581C633C41987F33D225F9ABE5E1547310A2F2C755CF580485D7328E451 +95D7C240A674262ADFE530034D164B066204358E87699216995BEDF3C437A77A +6D9DEAA3B088DBE3C510FAF44F92D11A9795B81682F992318675B181532BAD48 +7C30BFF33FFC7B0D756EB2FF171DD0FB853178FDB08A48418A8494C4538D8300 +50A48E926152E47B225932AA491D20754B115C867C40930F85ECF5D82F43FD4A +E1FB09A16485AA8DE8481E2344C8BD2EC4C3EE82BDBD4EF12B793B74454BEB72 +10DE166D7941C0AE41D9822B8B1A5BFF31A411A95321D4B3F81922E711C2C594 +7C8D17D535A289F32F573F5435EF81F7A6E15D2A27E6020CA9602DCE96520A5E +91043C649E41950750AC2B991524FE956D3A5AD964D1313C2EA55D4B5355F7D0 +49C8838BBF2C970A150F272805E66AAE44582A5840D7F0E206D82A411E7BFDCD +8C52A9BE758D312192DDC8FF3C4B3900879307282815E4BF9511AA1810509CF7 +14AA4025436A8E20702E2BBE02E0060C875D1B25FA984A3165B00F5CB82962C6 +6D2C2B594AC551828A416536FB02BCD49090FA6C7AB58AD771D02F6895374768 +4FCFE729D2827DF513E1C60E4716CC859E4D87B049ECC8986B68E7E5C0FD1C04 +AF1DA089D0FB03897D48E7D4F2277B8AEAD3A24147D0936C54D487B434C48B19 +E38A0109C9CB131359FB2FE6DBEBDF180CA8C12C2ABCCB46931C662DB2D3DB5C +0CCBDB6F00EC033C9F923DBBAAAC0BBBF4A35ABA8F2D4AE7F868213721F10D51 +42BABD11720505345566C5E2594867DE91E81DE20709BAC6888CF96B4728E2DA +9CB5032F3FA434B95F6E55F484E1570565C0424087D1FE65A7BA94459FDECB20 +02A522FE8ED23D6EBB943F185E966F7F027C183AB1127A0A7EE43A9EFB4A127B +43FCE7527CA6D3C753626DD9D35137B7BEFB4D0C7A0428D6E12512E63BA0B82A +D8E22C7D40477131568FD5B9E01F4C23022190578DF4B596FCAE21A6CAC7D573 +BAF887E02FD103350C0C6483732E94B507718B8A9A378DF180A41EC67BDA506E +4D8FB98046D97A626284261FF30F456D211D5C384A16887706B8C659B2281B9E +AD07F74DC327C12AD6B828AB0CB757A83BD9D135BD0799B5F8969F5E00DBADE8 +5A8D191228CB014330CF17720C5C2B8564BF78F396B9F518F96A92CE80D9D64A +4DE45FA6DB005EC8CAFC6C997E9F3B1688BAE40F0FA54A7F5E9B7AB6664F2E94 +1A653398F4B3E45854D3EF1789E8F769BA3816D5EF896A997FB64E0A8D06365A +ADF839A43899B0FD2411D851E273B4B0BFB5A1174AD6D0CEB05915F1A8229547 +F9220EF578AA6A561D949B48D1B6185F2058F800BBD758317E4D555869BDE73A +A5B130A31718C787A4302B76297F94C503A442412CD263F5510A39E6F9494664 +724329E58CF259950CD1579297B9956BB9435B6D44801C058E28DA4911C19CB5 +368397D382C4C6BED80E1AC6CB7716E9C83CBACB87173CAF0A7B56A657BBCEE2 +8D252EFC0FF59ADAFC582146D2074BC71A3BC55D2B6694842C0AC9DE6FC0BA58 +C67AA00F8BE31EF69343479C04F1E4718A99EDEF7C54EA07F6FDB1673B515CB7 +90BD510B6915016564A3C69C7DD10D2896C21E1893C441243AC3D3223F878DB3 +D98A58573D71008F7B5A574AE8AFF1D9BE4BDFA755459A0AFA87EB60BA40E9E3 +86ACE3DC9C8C83CB780B705390EF58C22AD86E3AF8AE9EC7B098E3A4CB7A20C2 +364844C91C9B092F3C80E5F0C0875C87CAB85005893837D2A84288F50F595A2A +C6F7524DA556249A48B1D6E407AAECEC725E46A22EB1B0CB8A03D1C853396D14 +8135A883BF18DF240F8B19CB176B064E685B60B93B16C74B6E988AA18E610FC0 +150AE778A8AC1043B75F43D477BD8B5EFF5BEBE679AE42571C7A8974CF07F55D +1FDBE94C2B83D8D50C6B1FB66178051BF1C42EB489C0EBC39DE09549DADFC50C +8140F04C4D065549800E1DCCFE65BF708B09D177C19D3AB5AEC42DD4CB645A7E +C52A360D67920A2F379DF0796DB1D31B2BB681E759279CB093F545262152EF1A +EBC19FAB38F4649CE126E4051AC6258C6C301A2285DEE5605FA2B337356E0B36 +2D927CB3361B895447EE897BADC86B875E28679DAA7A23C71590BA5F59BE94B1 +18670F3934CD9A3402A4C8A154EF6A8C9A0238F2F2BA7C4CC5C8CBB774923CC1 +2F12543FECCB1635680275A48309AA322D43CDA5109EE8E6E7E8472EF199785D +9E84A5D50E433A860494349B55CF38808CB51851F21281959CE4A43781AE9250 +54011F5849FD5B45940616AC942483A87C1165D191B856C9D8479501E9A59E8C +13B9FBF1083FA716AB4D7FC885186C551085354D17684BB7B0F0E9EB9C4A1205 +3383639CED121ED2BDB7A52356806A46954A06C00894DC228F22E704FA3E30B9 +204B85BADD5411B313F7FD01E02FC927682DF3E8EB3BD0EAF002448154C8DAA9 +8B2691D0AF9A6E6DB9DFEF0FAA136AE9A99EEF6F3A9B55EF49C85A083EC02514 +05C8B5D5FE8A273C8FD656ED257F11D49504F91CBA6933DA45AE47F7AA3013CD +23825CD92D445B052A383CCE81EFC50927C94D9C1C29D6EF54E5BE20D876A751 +32339988D4D440EB7561E5B90F4EA7586010566272E81FA73289981CB2166E79 +4FB33F7CA98FD016ED602C78529173B3B976F11A9CA86437F942ED0AA26B5EDD +D089AFCA5E3285B85D390031D1A942BE38B826BA08E36E6A275C87DC5477FC15 +1ACCA330651DD43750D3B0332C55197D91345D491DF96764DE969F55E6612354 +A540402879BE16BB2A08E45EA16DDF58645B86F3884E5A2669DA970E01156162 +D74A3AC0104DCF86C11C4F19236C586FE659844F0200868570BB4BCE1B529C2C +A216F27DD9EC638F671B049CBA7F96D0DC3402478CC833E3CE19D4B42C1FF119 +39268958A932BCAF36DC99B83061149B18C800E4196291DAA2E5D6983353EC41 +966F9303327A7DDA28D041555320E4B3B5DEBAD49CBC043DF4D92C2E5F82F3E8 +5C79AAA7C3B9CAFD96A39F58914D24E1B815EA03B238FF763763DBE885E8AD8A +C58A31E220ED192C61D9E1F3C5C13730744A2343B9BE703EDAEB42C9A53B0CA9 +BE6910779D1F94BB4789D3611A1D51F555448B8661249459CA515AFD0640D3CE +A564907F819B3752DFDD134FC5978398AF0C57B969D5B24A92CF99F2A0DFC447 +751F988B3AC1E5E55382673EDEB9CBCDB9825E7998F332A04EEA0BD207143EFD +BA2A4EDAFB487EACF8B4753A7343915C0EED8E9831BDD37BE699F32F0D09206B +FF1CE2BFEC49DEBD085733DAEB2720E03CC19A8B995FD2FFAE293C720A59DE13 +D7181515582AF67F9B51A1F8531A5B0A63BBCE4BB6146DAA1CD4281CD4166F38 +012F72EBD053D5DB3D2AF3D84EF7B38EC4E6845395395DC12F97526437F7B839 +F6633DC3CBAEC03D5391314E6C2B94B8392B1848527544E28F808A50CFE94745 +B6C2E7BEB710279420E2284F37657B59248DDE57C149E34BD2B9BF6F41207188 +22D28A609D2EFEC2F04B22DA370761E1C8FB04A7A132A157F25593FBF6A62F88 +4697C4E6C2E70B57443D08F5FAD9DB2AB398D2C47B039573C85546FCDBCBB5FB +453B9CC6D93DDA6D58B495099B5D204AC291074CDF0319957383AD958390FD8E +BF768029B92022E9E7CD009620AB491330B8270FB8B94202C94E41397357167F +5BD8BBEA013F3278EA0A1EA4A6CB25527C92F5BF9A2F67A38FF2488B09C89B8E +A5BBAF61E672FECFF5511AA05A3AE001463483D86B60C7E61939FDF6306093C5 +E621F084D993ED0D4ADD7F58F9D0FD05932E2E4DF4C2CEB1B0401F6254DD0899 +B87E41C1CAA87981E7E2E94BEF85F5FF3C260710408B536EDAF78189E816F2FF +2ABA6F132830117F95DFE7C0CFD740E20826E875DAE1F6E7AE8333B1C20ADF8B +B882B45CCEC42A6EA5F2A50F100987D50A1F8E5FA9C00AE132D77740F48B6D3B +E6E12B534A97663A3695491CF4E42E66DA66FB2EC1531AB292E3D8238BDEEBE9 +DBBBABA1498310DCE5B1B7B99464C463637218A766F1B731CCDB17AB17F4FBEF +47E7FF5962EAAF1320C667A645E25FBFEE4D882DDF31C9785628D32988F00F4D +87FF88DBCD2370661F85A16B82125D753CD02688FFF8FCC59D318EDEB5E56010 +16BFB2A8E8A151898F548C6C69BD17857F6427DB8102711103BDB2BD1C0A8F63 +31A1167EFF41E0E5B814AEBD022E941109E8BE0987FD33EDBBDDD203A18A3FAB +2A720481F15233739E1E882A191ACA4B051BF6549A0FE597041B33DFA55BC396 +A3D200D46DEB2071C756FC050132CF58BC768224387C4B53F646EF9972266FDC +210F24A85881F5EFCA127055FB69324B377802CC1CEF29C1A5D1C894337D0ADF +7B5EAB50B40D91D3B0A2C3698D1603FE27CAB713502ECC3BE3A543802BB18627 +1F3148A1F9F31C8905205B6348E39498BE0E24B558ED3D061CC47D7544FB10CA +EE4B5F5FC8161C9A341AC7CDC83F9D506AD6704554A31D20C26DBA17B6F011DD +71232C8BB6C1EC2993160ED28B5C15A330FC1EB37FDB83C2B7FF9857138A1F75 +3D91CEB5BFC8CE44159EC17B0462D274D75C4EA3C7A519067B8B817A9C6E63C0 +33989FAB825455369FA87EB7BBC8E80A9387E0772B22B2AE50A2EBCBD0E087A8 +18026C8BE1110F88E341751A56DE4D00B3EFC3207488097453DA8FCFA4A551E5 +5CC41FF1571C73BC0FD6ABC360E406713DA218331CA552B23B33F5C689DD2356 +17D4A4AB5E0983DBA0287557E477CBEA196CC9D04D7F101AF7D15EB52A3B8F9B +0BAB6EAFE12C85DC36A106DBA34997E9C669DBA7F2FADBE2DA80725736E5D681 +9E03E69A866ECDFB07FF17E0BA3F9270C633C1E8FA8C259DAA9407A9C8EA2208 +E0B22230BF8A84CA23386B55C5DD8E5DF685541A0BF372FB76C9F65835B339A3 +74E10EFDDF2E84872899B3C2ED02BBBD466EF25660E416575F8D01B6A191AFFA +51897804456707B70534647A4C09D849309102336B5D6F66CC544B2A37E1D8A2 +01F71DEDB222D2A42D74C99B14C8E834F831BC6BDD4348A514D35B666CA56ED2 +D93BABAEF353159474732E67F45199411CF000C7D4B1AB7BB569DC5F3F9EB893 +13FF595AD8F1A41B50CDDA27778C68BEFDE28CC79AB8B94377919B318E32F7B4 +7B3850320E1509452AA99F6F65E1C5C79CF67B4753528D07DD8BCAABC5BCCDA4 +76759D0343C3D4566270EC7F2665BB459A9FBB81A85F7343A5E14C7B7D262072 +FC37886F1CCC8F17DC5122F4978DB35E157310E6C355414DF6CC4532BEA621F2 +14426EEF4D7BCA2BD46419AF7E01B659F04F3C663FD10B4F09EF9F9ADB946319 +EF6C61A97667B2898256575DC116363B892DC5509652A1166C3D235A0CFF2135 +60675E209ACC3E057A38BD343EA5C01DAA61AFA53584C3E76C24212FD2DB65E9 +B2D99F97874228101DD2F38D85AB8E394B0C93076AE8310A6370BD12074EED63 +39C6160DFB49AE01E384825CABE01674B9AD61FB7EE61BBEF839C40E0B9E1081 +5F50BF8BDB6244230F2C06C421847031E5378874BC3CEED207DF0DA572FB92A9 +24C312CC4FEBE8AC67117837A6689B9A4C1CF677EE4B74BC60C12C3796FC5D3B +259907D399538B1E207BA2170472980AD2713092513D67D8A475410884883A96 +176D772793DD06855DEDADE128239C387D36CD8DB2E1D3174102BFD70BF8B2E1 +7F68744226293C8CD39C99D939EB6A4E635C19929FBA4D49B3F576B53FCF7257 +EADBA531A9316496118352BFEEAB3862370148E1A20E07D93C7958EA113DC037 +5A99A7C8658CE77F01C1B769618205E86D966F5D0F3A276732CBA6800576B5C5 +F31E739B709D75526F32B6E796E7F659AB80AB86A3986742441EB99B8EA3614D +880F9F37671E5BC3F8CE19B38EA6EE0693CECA57A6D7158EDCEBBECC70E1E429 +C1CBCD515EDC5AD996E877CA88B290E342D82F56ACAD5465790A46DDB20C5D81 +9C70A24BFEAA39A9155532380036451E1CB48ED7B7DBCCB686BF9A32041072F3 +3879D310C2E50A6646271800B2422E0C29974D6A02337B2BE484CA0D266F8F0D +5B5E13C2595509B03FC95C8E37A20BC8FCF0A4B6CB6AD6C1F9FAFA02BA37B969 +2E0E8036EAE531074039D62ADDCB67F7A28B1815C04EB22F8234EAE30E773A54 +5F04842B429034472097D2852282BD77A39101904B505825616B09A9F5BC1377 +678FCBBF4689E4A980A46C83AB17E2AE5C222BE8A967D448AA9492C106D259F4 +17B5AC04797F36B2BBFF569CB8F0E48CE727F7741A1B57A71655E77736CE6D26 +4A6B86E078016BAE886E069F6FD040315C89C3A441EE0A92EBFDB02D81AD44DF +F4F29AEFE0390448CE106B5A23143E9C34DC75C157C759CBCCF87E47CFEC0C03 +3148060FCDFFCD94B034DCB302FE796F06649C209DE276FC313D6A10189862B7 +D1C21075D80C30BA1F21AF907F0A9F38BD87F485F9DF469C8C9A9ADBB85F3679 +9839E5403BD31457AB9DB726DAC9CFF72EE7C3DFB0DA829DD28F50701FFD3B3D +7203F36E2E5142A210B695BFAEE814274CBA880DDEFDEE86FC499D203FD205E5 +6A11E5571369718AD1E56508C161A48A059098E7FF3D2BD0898A17F591635391 +B81544B0FF21B57B5D6507F57EFEB2DEC894970513304FADF02D78747E900164 +56C90030E3E8F2D728128C19410E0D2CC1A34257F371A856D0B5DED3C887DCB9 +76C65ACCEC3089352636F977026767AF681F829435E68124FDC3F4F22C1A18EE +9501478B1627E6E8C9E0F0737107EF242AC54676AB4F632DFB1FD1DE937EC35C +64A0E35DB72A5B524449F65AE9054EEB9315971A43A48A12B82B81258D355979 +F50E3F34B4BF541FB2FE7B31190705BF86D1B7DDE8B8CF9433A6474A0B82CA9F +03ECA76DDE98DCC703EC6ECAA8589374B9B58C648D0B644D652EE872CFA2B9F4 +767DBC4D8DDD8E69172D8FC9E12D4A30380EFDBAF3C0210B881F1069D17456F0 +B6F4A005A1E9F8B5C673A91F52FE95FB8BE9DCCF76465BDC26BC7C29FD2D13D9 +EE86AC85C3F1526FD495A120FBD5AAC5238AB1AD736206128ED0D1755A5F7098 +8B91636223E9666726FB36AAA4B02C3FC1E37CDA969175596B571B7D792EE705 +F72DBC6BB24E6D5E592AAF9B9D6CCC2469C389D25549A1E9FFC3B549C12BB96B +66299ECA3C0E9E2AE6DDD699E07A59593F8DD214897C22214C7300A517F7CD1E +D2144B07851F5E38E70886C9F06AD8CE90C35BBD91334EDE8A627735A4E8AFB4 +843D624A11113B8EBA95B1C55452D5A1D1E37532DFE8004F021A919AC07C5906 +090BB1AE3AD8B590686265C5E73FA528D9DCD44CABC78A392967031A08E12F7D +5E70778013B30559D74E4C6BA2B551500CF1071B722234DE8B4F6EBABA2988E9 +B67E527FFA26B606977B273B6555CD0B9DDDB4913B1D233933B1ACBD74EB59AB +BAD67D6047E712C4C144EC5EDC74F53D94A790806FACBAA02E7E2F3CFA6CDA93 +F337ADE914C9DC9937CE95F823931CCA1DFD7B2BB3B4E057EDEC6373F8B6E3A2 +2F547929D2083E6795A032AC0E892EA1E4DE0F5A97785B067CBF04C86BFB4B1A +911BD9E498A3C3E11BCF09EA0CB1AEB8B966C7504AC1FA2765D172E0A026F215 +4BB374CF5AF876BB152546EA55BAD5E3ED4504AB544200A703EAC71DCEA9F09F +B64AD56380576FE8F72C4147AF39BC522C9B13E8DBC11EEE1B216FA638604D49 +5A5417B6B9BB23A006983E01BF51884024AB44C8A0426FE01A1428E70478DD8F +EEA0EF6474E3F999F3F0BDA5B3C2368A618238706D1B4732E6E24368AEA068E9 +1345142CBD56044541347286877D92CDB2E42426F59D405791E7A17019260769 +0A0BF66417658C49261985D15092EA239DCDBFAB358B37FA22D6C91E34EFAFEF +824D6FECF0BDAA2C2FFB1ED169266318AFCA0509EDDC9F9F41C5ECB18A2C2BFC +824F82D4FECA753CD4A07A11BBF92A19525031F8A01AE2D2DA04611C4DB764B9 +39DF94E9FD03F0074840DD609F1058BC2FD065828FB587D38C8447EFF2FD999A +341E1F3201504B3123E7B19DA117BE5648B03E7964F6652148EBBCBDB3B5F167 +0187A61C00EDBA395538CD1C92D2C0AA9AD68A2BC0881E8F2A025E763B0C0EE2 +3E3E8A9E02DB95BCF2326CF8C9AEB14BDE8288D8992EF921A947970657F605C9 +E0B90DB7C5D16EC535F5830FAE43BE9488203705041635645A2A958A04FBE6AA +47CA6AE7952B5C944734178C9B86015C9D440C6D1A2D45834CDAAC19120EA2C9 +13C2790137B35075012779BE0249EEE679FFB95FBD04030845803CB299080F51 +BFA09748A6708C48964052C7D8502433AB1777EC4328140F7784DE3614C5024B +5351C63AE6DC3C064E126335F968067DE981706B3E907EFA1A73537F0B268E33 +521AF616B2B6EDCFA9B0FAB31B7AE7DC3A870D1968D0D4D1466AA7C923A923C4 +F86B6F4692B6B637322297221C69EEA47E9D7B46E726EE2FB8BD9866153BB505 +C1ADFB6545B6EC4E3ECE12EAD2B0CF05A0EC1CA8188991E90E3BD7151C234F11 +0EE146C0B9383B1FEA8C66D140EF9B4CECDD3B92C3E2633A0F6218D42A60CBB1 +01375E99A55510B06E4C307A91986A70AC40F11BAADABFEFF1E2D11AC9F791C4 +4AAB4546C037AC8200216F73E2626060D3817596C588D86D2E1105C0CF2845FD +8F1E084E431E651B5C90DC97FA78DF49F90AE9F923D889047FC7EFD70399FB5A +3FC6A2F5AC4C6BA217CAC25F0E01C65ED9A88A58429E396C9C0AF8D001EB1E1F +5E7E1CF6C5DCE293F84E96C6D004CB0D19827D5AEADBEB37E818B664381EE6D5 +270A60FFFD4857A695C480F6F2EA24E37A69B4A47B9D62A9E2831999C590E50D +7716AB8BA00DA97889DADDFE6D8AA93668C03CACFB051C8BB9226713D1E9BC75 +86CE9BB8059900D038CD0B31BD8230DEBF34FE8B6C9DEFC531B21D90FE4B6DCA +257C9410BA9CB32711BD79A11EC587921FE57B095DFD07F051F2892A1B6AA72C +34596217E819502427387BAA7E7C324C8C36E0E1EA3F3A3D16BD71486206FD5F +E881F999449812050164148E0776E1E84A1901C49BB4AB89845DC1082EB048C4 +1E8300F8474A3F5BF28C96AADA6A3AE3EDFBCFF9FF44254B41C9AAB0AF34E0B9 +6551C23F6371C135A2F6EC9239D949BFB5C27F3A46C5BF6E214CD9A24FCCE358 +E3DF152004AE936538E4E54B88F1A8D02646DF74CD50E205C68B3587CE090EEA +CB287AE009B551DF09FB77FCFB36973A68383E92575BF05387DEBA273ABD7579 +C772FA8F32B221EFA1A246EEFAE8B9354FE5C5B0583D37FB53B839BE68E80D91 +DA146A6DC4C8BB34D140EBDC678AC25B79B6BBFD37C9D73E57DB38ABF84C9A1B +BFD558468EBC5B96912E91FA3F4205F5ABFD7246D749900436B7C4D9D4C6F78B +7695E53781E9D7976937D21DA26F4A4C4EE02565AD55CC77798F86DC49D6136F +88182A88FD5CF4FC3D0B4ABD7C268C1B90BB850DC034C5B32B3605A07E9371A2 +B750C4F8B3B862221BB0F4AF1DB6AE3E77652F33FE9D95439F536B4EA4D4D226 +2A8E09AE1C980DB20855283DCA5410A62514842388A4127E93D304C350EBB09A +DC693B1D90AE851957DA25E06C795CE6C3090F5AA6AF587CB39405FA90316AAC +F980CE1041C8DCB55786D2A47C499B5CE0947546A588BBCF1149206967B15CDC +355EF3E9B9BF4ABE679EEE80187FBC57B317C194C9DF20BF344859567B8AA537 +B92E5196AD7B7F2C427EABED44C59FCAAEEAE18C3B518A39A1CAD14FEBDC311C +02EF80CCBBB3B023B5708920C91B2A835775D0E7AB0A0DF2E249F2AC0D2435EE +3BAA4A853E37F80C7EFFA56C6DA23BA618C5B259618460923EA12527D779BC05 +D3C20C410AD476F416D04489A2F4C82A4E583B3C5980A33BE766BC84CEEBC1E3 +FF77CBED10B8534A7540522E1D1D92A973700053D51DA6F89B10EB0EFADC289D +EC8B53E81B095B5599E77EB443CBAD4074FDCF7085D7645980894419447EF8E1 +945A692E3721B90B580518ABE6BEACE7BE71B920A6FB704E25321624A8D1A37C +9B01D6BFF2689A65B237ABAB3114112B7BEA16B66AFBC9E9D89F36CD4E638F18 +8926101C2B86A60EE12F6F432AAD3F5CCF22981DA0072DBDB1AB687F6E7ABED9 +84308AAA4662C8B9BC4A630E5FA5389EE050A9E4DF53B35D86C50150FAA3C0BA +465E05FD1CA77AA3E78B19A5DDD60E4CE308C0DD115CA303D7D105D33F9F252B +1D6C5764BDED6609EEF2400557658BD92C650DF037B7733FF5F5639E1B2973E3 +F673AA2E0319B4F0399D9784A25C08EED747CE2FC5AC3A8DCE5397BB03943E50 +866C1BB1FB0AFB847EE73DC3CC6B93BC7342DAC3D88727CFC0284A8FC2AD8B99 +DC7D6397043E8C5340B31E0568861EFADFC08212AF630E015E24C21AAF77F259 +089CF6C8D1E2D0136BA22707D9959981981CDEDEAC3375C1C9CFF0BF91785B8D +44EBCF873DDE5F6A4C590156BDC278B6910087262BC808A4409323E465FC7BE7 +847A33796D20B116B205C2B2888E02957520B5034EA2C4644F2E99CAB4330924 +71D1A7A65290E8D13D37C7A778116F16FD8A2B93F78601EE0E28CEE0B83FAFAD +B52146A221B9F011D167AE9644BE125FFF4F8A2228E21CF447DE42FEC6810352 +6C7DFF028D84DE6BB86C1B62A062A969B5BB1333D3E3BD95DE87E756D7098390 +2AE560996D9557A0C1D19F901A324656E3AFBFA1AB348FC923264E744954CF08 +B799CE46F1487B3188306BAAFB8D16B07B8B4AC37E11A6A5ACA1D5C7CB5FC3C6 +212AA74DF2EFD557BB3664366AF289F88FDBBADA3A6CD43756AB8DF2E30E7704 +DE96DCE521E0F9F23F2C5C299DC1345DBF1E9EB0A50231B02C53230131B67649 +B8422865DC9CE8CD2345FACFD59F8A0A13B4B4752DDA9258232C3BB537F44FFB +A39DE8755B381C88D94A07B561879B3AC97FD8AB89953516769C44CCB5EA2CC3 +68156538A8F8D46EE1DF6E42B31D283868E5716AE0A9DBC518A2D19826032C05 +34A8563294BF6B4A5657CA7440BFCEA23BA55F4DCE15A036B0B30A4CC283CEF9 +056E9F7DDFCFF1BFF0CEE33DDD1BE8640443D2E9A9193A55D17766E6803E6C00 +57646B20920BDA09F080FD41D11B73CA536CE6835BCEE1D7ADE4DD4FCC849CEB +3A4F4C808B2A1EDA914D469BA709AE3663CE715776A3C6893023FD59120FECAC +2BB5E1A0278B4804B8A5A08ADE396027120D4855DF5408B7CFF13FC94981D448 +4EA46332569AA8A6121DFA55FB6310E86C95AE03AF0656317CEE6D8ABE6DED51 +140070B89F8FDA351D7520AEF9331649BC4FD2B96433951290573014594AFF53 +E1D59C2257C38DB5F89C2D84D47F9463F6B79D4FB06F4D994D475EAC02B40590 +A2A6EEE9CE8FF2A05ACC51694AA14E9DE73E688099E5E4297322399284EB456A +0CC3EB28F470193CA13DCB82B8A72BF0DA06843DC95C17AB25512CF75E410B53 +01D4470B5910503400E1FB0088068CC4A753DFD5F725B0883E667185DC04DFA0 +22721F7C43F301155719E4AC651C0E9DC3106AB600C9F34408E6286E265B837F +E977906953BA864E3CEB19BE1E7472CD6C0FEBC2F552A1EC207C1DA42B88E271 +3C76D77C01705EF06D90918E9F02A8619AA10100D32636F4DB188EFE516A3CED +5BA74EC79C63824BC1BC0A8E7914AFD6BD14DE2F5A6FB7F3D0AB1B991D568760 +B056BD18C1967E6042D161C8F4A9E536B8EC49F1AA354437662332203A574906 +2698C5954EA3842D8CA8EA5018C64B49C0CEE3CE8157D1A54037831431073FBB +23BDB5A15B6936D772C5B9E21963BD6FE868BF7174DA2E24FAD983B3C106864D +E7E6540574F1FD6CD5C8442635637676D99986DC0A810709C3D3BF40458DDBFA +456DB2EB44FA75C83AA70566C9F4A95DC1DFD8F820F1161ADBE4FE65CE040E65 +864D5D56F4D93D796493042A5EBDA7BCD6283DAC18DA5A87342C165D69118843 +0E8470A2D7137E4899DF3DAFA8A27D2273BB401A7A5C24A6243D1CE9930B0D3B +4119F0588F822318FA154E5C882B677D8DA3359E0EF21BDAAC9262504C6D4714 +5426139CA31164F05FEDFE85368A8E087D65343C75EC07CEC25DE4F0F95A127C +29C930F7ADFE463D8B64DE535E77F36C4A84DC6C0B158C3B0E1CFA30BAF3D834 +525DD3D8F39D755B95FC306923A9771CC3161B72888FCAE7F62137B030F6DECD +1AE4FDF62A5C586204352359C639C9DF7D1A57482707EB0FDC5C687878329AD9 +1EDBB83D3E373D5812AC6B98DEB87EA382F10CE7E282360236EB97A006967B1F +1BA105A48DD051FEA8E9E9DFC221549E71216EF16A28469BB9A296E6061277E0 +DDA7500023F51C416ADC9AFDC0A45A94D568556E9E25AE3383BB89F311F316F3 +EF7272EF3BE368B0ABF145AE097FFA7BCBCCA46CCF460916FD0F7B4840D36CAB +B47BF1CC0D4E406ECA0C3E349C4D7443855BC48D56F5C7B53F69AC2602F02AA3 +A430E9215121108C6287012D3079969000DE04D0085B7BDC7B3EE1F16D659195 +7E695E20D5AC8F2D32CDD9D88E21B23B5E2E0A776E35F8EB759DD20B01D3DDDE +77B7273192442C270ECE3422DEA9E52EE99542D636AFB83AA225B35DDB5E6384 +8DC6B5FBF7EE518377B4B2A8E01468E568B20DC79F2AE5A178E37FE67719CBF2 +C0C1F12B06F646E97998A5D6A36447BE87C94533E04071DC4C818A46C98482D5 +5F557B92F3B5A592B675F0395CDC05349F49E0B2878A0AD4F2C1473AD30DF752 +1ACA29B9520EC066319191D8B14DAE7685B5DB3C85C10685EA0C5158E049EBDA +B204C1F73E78699268C9C336B8C0D54AB4B6D20E34F5F3CD6AEBB3CCA179689F +8DFC5B4973346B98689E6AB25D251EB83CA6DD6DBF8EEA0AE66D7957B15CC773 +4F9C26A5BD0BCF65D7303AD381963B584E7CDDC6DA9B572BE655B7601BF1482D +CAC527069E33038F77639810D403BAE1ACD1F9CEA544F8CE81F5D78582A24F54 +B1AF188BBE247053D3F09EAB56A65214432AD104E1E588A49DA1D26E5A31E7EF +68625B55F1B366292993E186142FF99862DE9AE40032AB70A053B003D3C19953 +0BEF3A5F6C16F8FDEEF0F2303F004EFE8E3DD7148D0B9D2C393D4226CD841E69 +4E131E7DCB3FE6D2979ED1DAB5BD7A91F97AC79FC4FB82C125B69AA9BABCA9BF +A04AAF364A4AD81E33626B682BEE85A84D882B9C0713FF7CFDACC4BFFB6B3BB0 +E9FC25F52747B88D33935FBAE5712461093EE2BD224FD7A85BC9704F960EF2A1 +60BAE279B5EA1076BEAC60905D07B921A8F001B9D287603B04EB7B02DBFC1E7D +132FA456CD85FE50509DB3549013A8F88949FDA83275150A58C9A6E480D5A8C0 +DC7C88445966C9DE70CE6A910628883102C1A56B386039EEF0549B7A78120649 +5421D166460E4B21BE9415E0AE0BD368BD0B9A90DF4EB85845F26F7A32E2C37F +570F67173339084B317A22FC9157DE2B384AD6363AE9420166D72E7313B10885 +75BA9EB86C588374434557D10D456E6FCE7F024721C4C2F8E4EF9CAAC22F06E5 +013AA1026802276A8F4E1724740943AECD35F6DE0B9B229541A3B56B08F30998 +D4C5AABC03B40DC85B1F5BA7C6F699B3E4891FF8FFF91B77EFE1241A21EDEB42 +408D18E39A3C39604BFD2C5124A79AE7546B176F22BFEC91542D2F83AD5981CB +B02B8C521B5E93236CF74B33F1262E1A504AD22EC8F0D2942121AA8C627DE60F +B8E290A73C446BA83A97BE7ECCAC79CC97F574DE7D15C7424F6D873B367F3C59 +754854D2F0B183A13F28C3EBEC1EF32EFF18930BC635783D011A26D4B3F1764B +05C97B9B681EEAC6B8F3922C700279E12E630497431706790100EA191C81B146 +0B412CFBADE7A563CF37E48DB5C7758CEDEEB96E25B9C7B28E8507361ECB3D08 +FB007AC448D980295DB91A8817557E4CB0E6B614C079FB93062C95470D0A32F6 +D281F0F9C45F0FDAC9539B375C2B9C9B0B5BF6CCB2D9AB8E80E4549C0F8E5A68 +2A0A246C81C9F147F9F21D98F75EDC6A3A293DBA61A8255B3E42999E281FA099 +12062B882543AA988E743EFE5311A7AEB8C51F5E3A13C935B4FD1A371F8FAED1 +7794722BFC34883350A3FB39BEE9C5FA8C6A59D8652BA6C34DD958A9352E7170 +711CDD510350D910B2BE3A9771C191818C3E81582A8F6DE8A01ED72462EBB883 +718E75731C2CEC9BAC03AF799A664D62DE91ABCBC8BDF2B39177D18B5DC26825 +F73562547130271B8C1AACCE769778738EE03B74276984BF67298021478D71E4 +590B9AA09E0C6D2B59468022F86CE4C6ADA15C3543F48F380FB260676B6E8488 +97E9884A3F3682D3E7086E8CD1484DF32C5D3DFCF0FF06B245F44A03BEDB568D +86893E393FCDB7DF54D0DC1F5E628DC9B6FDAC156FF3A8C7097D1F49666E4400 +FF3EF4CDB5BBDE55A39F0A67854518CABE1B1EBDAFAE5FC34D1D45FAEA59D992 +716B91F73AE51DFDB14E1032F68CF751AF805A41C99AB161EF7DB88DA4B01611 +4779DD94D5BE1D8F9554D21649F5E18A5664A5F4638F939FFDEC9D65BEEB097F +F31C13D001DDD0F94C33D2C7BAFF8681874CEF7C44D75A691F15E3D90EE7BF19 +3C9F447B2CE43B95C05D54B0755B676228F094045C56DFD70F70F0B1A04C1807 +3784289A1FDDE55B751AC021A410FB735AF90D1793F98D7EAE87D3330C63A85E +5DCBB8E087B11BE030023BB83AD994D6C54FDF104508235070E96271E643CA72 +25002205BDF49DE412FC2DCECF3D1364090484DDA5290CADE2BE843CE0C726FE +C54419F2DD1307E2742B115F4FA7FD8EA222CCB89B6808763D60EAADF8529B15 +C89061F75917B22B603EDB02AC709D6E705D2F3D84C31B09D08A4C188E1C8A92 +1062A38AC7F4CC83F55B974F1F394362B8D3E8777BE3D244C53856BF373727AC +618C224C5B7CF8D94C9674EAA106C3F30817AEBF0386D3F07D6A9296417867A5 +5B9B9CFEC845A461357685A95AD0630B2C0DC9EE8963128132B4874C861DBA02 +1E1D7BE9259713E343989E16859F5E4275DD3BFAE96F382B8F31247EEF86212F +0D577D0221B9B8965D0C2FC396FF5F38FF95B56D071E432931CD324FB790FBFC +C6CE521D85FF14E8815E9D4425909D6C312C7A2FE077E4B1FD5F8ADEFF72173E +9AEBA065002EEC149758F3016625256F37AD2055AAE3FDCEA074A8DD0311328F +5CBF4CA5D62CBF21C9A5883685B8F7265F10AF6F5D464CFD13C9B40A620FF21B +DA5F4801C8D5357C49D5B401F51DE0923D0D96ED6DBC57C6E77569FB69FA198A +2029DF8A5F3CFABCCE3A5FF87E5A4877D0F8887EF0F4F0FEB51091894A946A18 +84EFAC78A32C7EE6082A51BB01AEAF4FC9066367AE9B5A5B74EB4A4231F1FEAC +B7B76BEF33551AB4893958462B0CACEBBD48CEA3174BDB86322383CE32D8EF35 +BA9E1B7F4994220250359EE3C5AE78C1492833F71701D0C6B0B4B46B8641373F +5193B8FCCDE73F2F56333AD23422273ECB807AC49D9A79DBB88FA987F34B278D +39AE097E8D664414FEF8C2B0EA3F7BD43D38E964AD7709BE0923BA5DE504D56E +7F8256969F12A9149F1C9D7DB5FF20425C47D68C15F0F1F492F0FDB01C1EC138 +4F3DF82B0C1BC7A8FF3CEE5AEE3992586A2B53B425118546D9314170B3877D74 +BCDEB2790C9EB08C21FE6A3FB8D567F39429F2DD066754C18E026539EA88A94D +D643E27E8F8E071AB6EC8A30951504B93FC59CF0E801D3F920509AC2E6823635 +9ECB917546C50906C3A2F61D6BEB4E887C6C9272FAD0AED7ABDF73EE841FBE28 +FB5DE55F4ED965252883CC567C96DE4EDB781EC82E4AF9E04ACCC2160598C2BF +60140942123DAC1D457F947CAE5E0654D38117D261F4EC69ABA52543D215C011 +F72B148E55104DD3A872B9C01B47B02398C0848FB0FF5D4C9F557D51449CD16C +9D7AB623BC300CF38DEE6CDF4596F5B288C577814C19403220C343B11AC0770A +920B257185D738BB7CE4B535EA0EA8F9446D8D7A35F10ED1D98F1DB7771268F4 +4ABBC51CBB2CE7F48FEED3446467A9A04A826AB7688F8525671BB3A5DFED3954 +3BEA36C1301291EC0784D413A324237445E85FABE6565A058A89E19C25CC8359 +3623738C4292091CE48959C0ABC289CD0CA5316AF2756B31B5218091D094331D +CC294D876D57E3D5B36D96C0F444D9270B297149FC8C607DD5AACB8CFEB91704 +3930AE21ABF7C4E3C524BF33F4F4CE4EE4BC1566342BCB5B7C937902D6C4CAF7 +62539819195853646B73E749B06C59109B4EB288FDACC61CC962CD5AAFC24B15 +FEA2E8286298F767ADC5D1CE787B26E7C25B20765DD831363F228099E4125168 +7C3E64BCAB5A40D1D17150A8BC43E66D4D03712C370DA6128784F1E15BB3816C +F38C845066DAA046C038D54A3FCDF3939D0A39123854C93F1E635E0EF053B84B +012B3F64398194A21A5AA2A15CA473EF99F8C67DEBE79C747E5CDEEDB6AF41B9 +511ACAF55ABA8FD1495345148A34869A0F52D647C861D22E0F03EC217227E270 +8FBDA95B4F70519FFE4371F2187A70E9323E5671299F358C02D7CAC76B0C253D +269A43C27FC6F4132E8E8F2C0FCC103143E21A4EE3E5D3E6062FA1E0054E4E49 +3CAC42D8A9B3AF467F9AEB84E0C12AC9E0F529AC18C6EE1D02A29A0D86800884 +AEE0DAAC7890621BB42E531BC53BE80439093EE80A72CEBE746C4D0BEA66A685 +E56FD9378BB056BE0DD465A145A8148C3F5E54E5B9F11F4F9202EA28EF9396C8 +2958636AF404023AD5A9D4A19163A285CBA7D0FCFEE888268D4BF46C9DA49AE6 +DEEBFB4B4B2072CA7B0B8E62A85CE2ECF876610A161B76D43D67A73C67C70124 +6BCE8FFF02272DB067916FF0A5F157BD73BAEC3456CEA84AE21A4936B4983780 +4D7116570CFA46045B4E98E65931DCACE943C83B7BD30A60575C9D34F480A179 +CDAD619F8B084FDE54EBE09D95C0433109202CC0E32BB8AD1EC3CED55DF0E3D3 +4DB701AAFD59F6D4BC29F3A533E34E45E0613A6619BCC9300223380440FBB8B3 +3BD3FFD5C7F76407076E4A791528AFA58926DC581F5C3CB53ADA019813B1FF1C +01C14DF03B1F77458F1D33A59889DFEE4E1C99BA0CF4B04F7B11BA530B154E64 +F5E4C2BF964C12A5ADF102B4EA55D46AECC430C1162DACA9985BDD7910F446C2 +C41DBAC7C809E2058C2CEADEF4CC7BAD936B660A6E6AB17B5F52F2346171B63A +5D642852B7046CBCF7B2E9B8CCCDCBDAEAB267A48E3C8218CFC5129BA1404253 +1B01C19EDAE3092F99BF5864427CAEC6A3F7C00AFC4328D3732EC4CD4A051F2A +FC6E419DAC820B082C7CEDA6F19AB2CE97BDBC45708798DD2E38BC27D4CE044B +85323D6BD9141DE647AD8EFA76D21B899F28896E73AC9C2616F46DDA50B17387 +F5CC63F90FABD2716E5548BDC01BC6D798F7311169AC071B2326D156A66BC649 +7976BA04BF4743442CB5898BA927BDA218070A5D03E543EEFE4C93D1C9503655 +10591B89D07DE1A0A3B57F1651701C5479ECA1D8C9B7FDB02CD351AB975094F5 +D4544D0712690DEB7DDA59998E13B656B38F57816E8E4EF2CEE0D3506A1D8D3C +28AB4918BBC3079DC7436C20600EC9ECFE4A7424BB3299ED0E9E39B977023DFB +4E1FA6007CA8C1D86D7181E078DB2516CE3F18011E15E436940291808FF64806 +8AAEEA70E5FC56A02F87E38C7CF06FE80DF9930F63E633B67EF6093296CEAD28 +0B150EF111A6D20104AF1746CA1CD02BF2DE14546CECB44BF33E239FB7185A9C +738414D921AAF0CAD72B2425B19A0BE3063FAE017C404DB6CD8A2335B62CA1D8 +9A742A632035DB0132EB2463C9CFD4F806FFA93EC90AFFC4F6AD2852F52F0F6F +1FAE527B45679B55EF87934A396B331352920491B04F9FC364C0182E4C693885 +DD52CB9E6F7BBBF49066852F9850B1E071372B6B77D4912B8D0299C314E34638 +C079305798A0F654EE711F28A4917BE210CBD0614329FBA0B638E6CFDD0E10E8 +64EEE1C52F077F43ED14AE2E87FE3163C3DC62BBAFD7DCABABD75F0229858FE6 +29F198374EE6E28A4C729688D7D345D95DF513F85319F7ECC40F6477E8B73EC3 +5437C673F57AADBCC35B08A271288E1DA43287140AD1AFDBBD0F7C5A0A761178 +271F0E587F04C5A2F9D026E0B92F942FE7BB27A9605B6924545EE82090FEE9B7 +DBF60FD0870068A2082B5B22BEC698460E3D452A5F92F0CD727F75317A528635 +F883F3EA161BAD1CC81820A36978666899D28126C1BBCB4C08121E248CD1D0D5 +DDD043B58012277B03F1706E8313BBB4142A10F8F775871B340C83378431849B +E4E8F4A18BD703409EE58DD8618F94D70A57D1D13188A16BE8A5F6383C1EBED1 +6CCDF1B01EC33E4C57ECAAD2E292120F2CB157A3C6BF62EB41B9A8299728BE8A +E03A17183E7C2B3BAF9864C762A60C414F693450F952B48AD049527468A9A8F3 +731DB86A622A3C2E5BF3468B8A3115BBA8170FDA23A6A0F1C38DC1FE1004F7E8 +443EC7E4474E19259072E47AF8771288D76EDF91F8697595B8A8C08AA5C4BA35 +2E581250F1A3610EC9D5991EAFF6938C0EC16ECC43E4CFDBA8BA42A7BAC738A1 +B29563E2D7283D106F4AB176C617A6F1B1F9076E564F67819159F7D3AA4123D3 +B8A7E922AB52D0C63819D6A95ED6A3A63E82A6947098FEB9A2F1221F962DF9DB +5DE56A57214E4B84FA855475BAF474EC9A53501BD5542CECCFE81A4136A78ED7 +12B834881BFAFAE2A890E598EE2E11D1CBD44B6B66DD384DB7F21F30842673F4 +50619BA185CA3925AE1D922430FA6B3EFA985E50A3371A6B8C2D7B907C63FB81 +6FE0CA8233E4620050EA197E05A42930856FE8FC0257C1FF4B6706E4F9BC770B +987BFF7CEA0EADAEA356B750134819B4BD68FA0C36A65681686E5437E8F09282 +E89F8990B705E5A0C215CCED16CA5E663C46D5164AB439F73EE640D6DA70C155 +3F69C1BE1FFA5B6FD443F9336DE031A4C9607C706B7571FFFEEC8D8FCE91FD5A +C999821E81425432805A253C573F614895CE3570A39753B36A357F21759F1498 +A1236B1D1790B12D471D917699C19A963B866FFFFA37EFD74E0B811AB6832346 +ADCF181D963C812F18E141681EBD36482E7D29853D91683B9ACCC3B8055EFC55 +E4DB09030C38C5520E4562932C9E9AC675CEAAF41D8868F7A4E1D38193669EC8 +62E2B2AA3E597455D3FB186205210BCCD1E9B3A3564AF82997E238669AD833A0 +D53B951CB550EC7FF5FDE4A5E7C7499A889EDD8C453D99349FC4F65130849E4E +7D76D3C9A153B8522FCBF0E8C80F6C9BEB419E501A891D9E03A807E5D8C9EC9D +AAAD2A86F0D360DEA694784376800E32EF4DB045B32B78988CF798EA7CBD3351 +CB60C6C775B0E7B4D8C1CBDABF6841618296A94876573E9693A39DF47564C29D +27C0CCEAC55E0339F134B45B1403D2DD491C81BD3F1127164D6DC4DA058EB7C2 +50F8C910A005CFC6990D6C2911656677D26E557AEB420B8FD91DF224F01458C1 +0E8CD85189635A3E237F605F5C8A751AFB0E8FF920B1094166C152C9AD7F4D5E +D3074664ADDC3E807FDDDAC2393FCF48CC76AD84ABFEF4DA6465008499EF0F52 +37B408058365334FFDC0AB15C8988D58E62E7CF50A199481832968BE04CE1301 +75BD2CF84588645A9123982C8E20189D264E1FEBEB22605B20082B37502C7F2A +BFC371277B10FF89AD4A78405E76D1220E38F9F2FA8CBD9115C11B30BB9CA9C7 +4A996AFD108D2A3B860AA8C3E9FF6676597AD9B1F6F9AD92CDAEABBC510E7995 +6BC046674A9EEF946A294F4A1D4F0BF8CF73ECE930DEA3DF887EEEC94B5526B7 +12CF09476D5EE9D7E9F570D29D6D4CE9507F26E7EE794EB9AFEFE7E89EE1E32F +C48959A2FCCD7AC5C5C15C81198235E3C0A216CEEF1E6EC1267B74DC19498B25 +12C869A068D9E94598923D7E63E336BFF1C40025548AC0EA3DD2BCCE0B483631 +6ED3545427FF3E9E9460789BE0D6A9E39ED20F8BEC133EF4E5F4F577FE93FE35 +0BDEF6C35B34D3A3FD2815798BC64B9508A8B86DA0F0424352E872B943B6A8B7 +C0631B9083F57EE7D0D2BA76FD3AF87CD0C0F106180EB8E1C50840EBD968ABD1 +4728D49F9A4531B890E97F8BCA0589248B8E7F60F7B2CC612EF540244E0DBBEA +828F57E5E5BBFFE0E2AA7E46FA16A45484BA795D4862AADB29874C4EA6CA5EF6 +A61306112EB3023047F31E1C16DED2D5600A1A30F7370BC707672CA411F3347D +734D41CC60AB436577659B9C256C56019FBE476CBA18DEFE9DBED04334E9A6CF +AFE56EEC626AD03ED98E488E02ADB02BB677163255DF5D029636C4D077583725 +B60C7DC3F886913B8BC6738C662BE0A74AE9F94286114AEC6A82E824C468570E +C3D2514801ABA14EF94B9470FC684774543F95701FF7C6EEC3233DA5DEBBF56D +9349174E5D0BF48986D549FBD758B3D123E8D694FDFB95BD9B94417BD070CB8F +71992B2BE2AE0C9A36822E4E8D85DD3B337B0A9E13DE07679346C55145F38012 +AB566C38CAD0C63D0491EFAA2CE1CD8FD4938331CAD9C7E87149B8E90E6EC1F3 +55D5DBAF807BF2482A99B02BDC8BF10EFE5309D54FA108D379393BFF8AE59C70 +0409DB0D558A48892A20FC6418F2F9F56CA50878146F222A656B0E9B1C346577 +5E2B5F79094386CF535C145B5459158D74845BECB76E02D53EF9FEE8B23BD8BA +59969C7FAF44CB5E5D217DA9E19634DF2E2A653A50F7D4C564AA875454612BD8 +B01356EF6F620D202612E424A1B0FE9B0B740C344E96F6F9EC0199BF3B3FB4F3 +9330124AA725E21021B82B845B25707A56D25FBCC138EBF0FE757DD1DCA7D3F2 +5285256F32C2BF27FD47D283E44D8BFE63CE9E9E9DE2288E9A1BBFFFCE006201 +187335A534958F32C1999C8D75FFDDA244B5A530390897449A4AC5DC6D64F5F4 +9D32AB0A9376F819356705A799EE20D2196993BAB8A58AAEBD0CFB2D9477B162 +0BE6BC4A665B5AE6E1765CF427F0CEE173BD948D2BCEC5E63BA15DD808AC37E8 +27AFE857EE793FC34C1989560E809FD94A462B0E4A5EB5C655BF6D45BB65EA04 +67ABF18D255B6407510F1D65DE2F93F2349B218DAFABD923C937F1BC70B9DF64 +FDA4CED24854859D721D78E8A21BD565F05E8179E3BEAC804931EE7499BE55D6 +0EEE411DFB1705C1D0D7AA13FDD13235C649506E111045CABC12BD36A7409923 +CB2A2CE48FF0DB470A746348F2F8B5AD886298062D76ABC0365195E6926D123B +414699E9BA9783B6792C284146448D785FC8ABAEF70C59740ABDF18DB7B08203 +8C9684A23C234ED1C7C6315B7F9F517A2241534B1DDFC8B7EBAC878C3FE542A7 +013DA7DE6E70927D5B47F53F90BC5A580E3AC286D1062FD4653F070A070FD397 +7F88828313821C2B1FC062E544E42F0585115A6B19F32C2EADE89E31D279E54F +8544054CA49F7368C94A1939266C344B012EC9800955A89E832F9E59E50DAE60 +AC0364A43C400B8F62815FF6CA864E59327B89A8BFB5435B0F0F5BE4F9F544AE +332C19DC75CC3461F388472A5764ED36FE91F8710FAB141022883091894D45ED +294BEBB897D36694334F3E968FFC4EA6B073493C32827351FC6F323D0FF9380D +804B12F01BE6B926690A68F1F9ED129C390BC240DA061C341F0D09D9210409C4 +3C5E9696A5BDDFD5393AC9D7AB9F82E919F808317679DB70D674F46877F83C95 +52DC2EADDDA7DF9AD79B9BCB28C2BE897C9E9378657B39046A929D23E7ED0AE3 +7925F1B184573115299AE2E11D43FDA75E4A1DFE14F80F05EC57303DA964AA35 +9462759CA36DDFF3B43F3CEDDE73BCE859484AF34F6B1EF90FCBF49D34722571 +A2CC337ADD4F4EDBA0C20B673D68A3150E378BA0DFA81F6ECB97CD9BFBCC13BA +F89762B850DD34A51092D9E4D39D6EAF8E5B401F34F07D2CFEAB932A066F220E +869F2D19EE55663BBA117EE3E13463FFCAB2EE730F840DDDC82C5AC69C64B203 +675F11DBC40186A2E5CD1B346DA37E8D3B3C518D9480201A9C598DEBE0035A14 +355C3D66F06C4A7ED75A72DEC787ABD39FB77D3CC27FA505F8A4865117FEFEB9 +98D774B3268803E7D586FB8F5276B405680841C7EDBD1AB4D055FBA696139B75 +D1839E542902660144559D613D162E217283E112CD4B11C13A3AD04C161B154E +AD5E2EA101FC279B83B8F313F18FEE59B20876FB99AA1587AD45CF9E294CC653 +C0128353B6644F5D01339143F692EE2DA2C640EE0423E0E0C524407387262CA5 +728D9BF533A5DA8B4B24579476FE77B263A611DCCC6C893CDB7FA087820DE632 +A7E72EE945AE53FFB7FABF66C8D7A9E4FE5FC76FAA7B8474C6DFA527032EBD00 +11742B09CF9364FA679CFC5B7751BBEEE7CE5983C32AB245884170697841CA95 +9B781839232EFFC2C7CE51FAE5C3117B6C5A6EBFEB8CD5C17AE1F50F322325ED +2C42751E03BF9C602FFE7651F8EAC796F22AEB025024EA9D3C6839C5D78446E9 +8286E802ED412857CA42FB01A78B15B908F7CE8BE1C419254998C35C790368BD +8B8CC75818C190AA8B52B75F2532630CE54DF5D40C04EA7C764BA3F54657FC55 +390A118C2B74B34CDA77D2B4808F068FF11A3C3DCEBE799FA2CA3D9B7AA54E48 +2306EDDD3809DEE1CB37EBAC8AD6419A27738071492B3E89E32052CD2A3516A1 +E742FAD7E97F019C0A3E6066F6E065ED5152C0C078D314C3BE3F8DE49AEE7D71 +3A53A6D2F528499F10B2D0FEF019FD05C4F57F07C1241AE208DCCA9B74604871 +4C6C13C4CAB543F890259BE362AACDE5B69BDF373E7CFC60FB3DEBD243F2626C +793933011C0125630471B7AAF3839AED975EA581558B53BB330021054A7784EF +0EB98D56C807A4327FDB846E51725AF217563D6BFE0726A3FFDFA377A3635891 +F3A8FB69F1522676D6E01984ABB5C655964B00A05A499EAFED034513085755C3 +F54402B658E24D4A57913C4C4D1CA2335FE0A4F658BA773962F393FF5FEF8BF6 +8D6166014FBEDE0287BFCDD725639BFEDAECD06E57488F5BF30BCC2B3AE9E878 +F2AD3575FD043C6397A82F27D6E5A98B9BBAF8C78279D1A78809FBE9D56FE7D8 +306090DC00DA55AB9624FC4E4A279849AB4D5B7E7E125ED292B125C34FCE6C5B +66ADC813BEBDDC1E91CBA09751DD13ED696B5629234AAA990C467DE668CF1D29 +556A24B3D5EAD78CC38A3282E46C884C802C0C0B010840CA8D454034D3E479FA +F9B9394A89924F66E106AEBE1156337BA80303F111AACD622F9B0C79E463F1B6 +E7ADFCE41A9E7C962A96016418824569861A8B2A426AA86A3BA4AEB5CA11916D +2F6AE0C03BFB90E5B6081BCB7348C8B74A20EF87D04A91B5EAED48B7917240F4 +EF91A3A1F77DBDB81D8D95080E4EC1DC67AE3788ADA00E8CF885A13DA34F525F +9552BFA79FC0967C2AB66E42F9245CB380EB196C927E3279DE96FB8606FA9F13 +1DAC5442B25B461C586203D9ABE024569996131F178B1302624A4E78EF2F82BE +E9A0B83549FE5275E85C176B7D3F44AA19A0025032BBAE7B2BD928270028C866 +3358A8B2058383FF2FF7A41B4D90F4425F40557BBC907D8C8F835412EF0DC6BC +CE6FE967D55770C0EAC8EB190D7B8D355EAD9408050795BAEB5149114CF377E2 +9A6E11C422F51705EB921F95B548C79775525D0C4D6CB5F9101B99F4C712ED50 +ECB12BC53FE3C703B505A12C8824804ECC3F66F8BCFE740E36CACC94C7E76B50 +A8C037E81731F40AA1DEFAFE6673BAD83EED23B4D1829A6343C1FA7118CA9C31 +C08EECF55F2E5682A445561D7EF396239C25C013AB9B0E3CAC0CCA451846E611 +8D17C7ECFFAF85013BA136C056381F4CBFF31FA4A30A19FFA8BC4F29A8C4FEDB +670E4B65C5FC2AFD7B12DB24B6B26E9A2328AE47204D35E8D981B2D90C47F768 +53AF1FE5A271FB05C3258A280676594255E53410299DF24F4574BF72FFDE081B +A1D2DDB7E42C91C7CF3E7AF0A28630BA772057A39265A74CF07790257403623B +755C99198D679FFC403886A1216EF0DB21BC39BA11BA1910C4599641007227FB +07B7BED0F7B334C4409CA8E46414996E89C99A848AAAF1BD80510470BCB2E5F1 +8D2A32099AEB23EACCDB07ED46641500E3577C561F5834F90C353B03A1556DC1 +355AADAF4F16C5BABC1126699459018ABDEE8117A30F1FF0327DDE29E8F679E3 +F44188845CC71A694285A0061030DE452D5EB85B0286D1CB19077EA18FEAA2E2 +493910C0194C37E859CAC47FFCA73FEF03C42FAD09EEEC4E57647B8A1725406E +1686835E81E7F2D621D6B2FF972904B7BC529DB1912C6B788869E3C3578A0B6B +7A15160577F1545F50294D006AE862A89CEB65DB36E68013A3B71D99CD45EF05 +942296CCC7338ADFBE0C14E6E800DAE58873FEB18428B59298C6B6331AD79F1D +6E4B8F925E5497E4760EBC2AA946DEF442FE076F75D96497FEC6E539D7EC13E6 +368AFCCCDC03A73C1AD82B3BF06D294EEC6908FD9C1E2F8935ABE200B3D4EB33 +A76EF754D2359192B75970B235FC6F59CF2E1B99F35FDEC3309C0978F597EED4 +75655F2533DDF000A53E02630DB8CCF0CA83D305F1CA78428B09E181CFAB40DB +AB63E6796CBCDD7CDBCDFF14A6934BC5C02073F0A317DC0A6FB9C607B9B49FE9 +E102DCD3AEFB7ED4805E028AAB641D0E0EC6AE09D7FFF3A4F594098D03139D61 +AC6DBCCED93EA94E3142299CE717CA0D77597801CF5D01ADF5304D52750C4EE8 +66804AFE77229D54649931E1765BB9AAD54DE84E5E8A49A1CCC80E94D009EC63 +F5CB056A88A3E2D0E0C78CF31754EFA654746F33236478BF53B8A56FE0B51A19 +9D1E51E21B92C158069A59F8AE0F11ABAAF2AC3394DE03389F538958CD709639 +26086A53C600E8D4B2A1E9F65A9982D3FD0AEDEA1272126EB2FF08E06C5A14B8 +263561B5192332798EE1FAC70F4FA20E9257A186277D80E2325A8CC9C650F374 +9EE7200AA82D05D7CA5D4C6D7ED6D38462AF2EA35C1F6679B1767EBBA6F62769 +383C4C5D7A3C0924BF850BD0EC1FA16606A973BD45A0F2AF86018A4B57AB4334 +82FFCF17BFD39CA87D25E36D028E7E35B6FC3DD850184BED63C2E3843A6FB26C +65EC1A1F562591747AC1656BE602CAAF7D24E678A5834D33B4F25EE8EA40D88A +C87860F8F6CF38B3AC16E525C7CB7B19183FA62C6941CC8FC771A5C87BD45F2A +BEC03A4FC754608A6CB3AD74F88327B260914E0B325C246057B013E0E8018FD9 +55FC00A741CFFF655AF36098211D7756F1BA8776EB391E73B8AE402814F8824F +571C0255B878A0CEA097CC8732FBDF57F56A3C36A4C792D16875E88A03207B22 +49F60658A2519300C1887A8C3A64BA08603860DF48302E54261ADD2F23FDFFDC +DC8D44DD1D24B7D0C693263AC1CB7793192C5BB7619C3FA526E3D44832676038 +B2AA7E7F80B1F190E83534DDABC07D4A8C312C25080FEE4AA75F17616616E53D +500D0A9EE43DA70ACCB163A463BCF0255826DEF676C383C5137DA065FC1FDBE5 +AAEC7415E6C5309AD238C4B77A809BA02385B03378AD562D1C3227CD0D376CA1 +57818FA2A81DFA677865A17880B66BE988043AFC0B431B238508266BC074B742 +5C2118FEBC282096246631E897ADB907DFECD2C7569293A5EF0DEDA5B8B287E5 +53017E1CB1FF124EB57676EE5CE07467B8CCED2B63B70E303EE474596F3D8450 +C39893423406A654217C1439A7C4000946378A3504AD3F2C820DC818B48CB651 +6921E0A29A0BA2C332690BA7626451E234E4DDBD744DD801E335D9DB4EED3F87 +7C4347F874D7F15882960CEAC7039E1064E7C9A264A1C6D966260754736FFC04 +B3462E87FCB084E2FD1F53FED1E493C298926B26855280C154A17164C32F6079 +046A2CAC71FFF007E7B84DBD42DA2F4E15209CF8194383B5F0B47F47A6E95EDA +A161F214BB90B548F2C1458F1034AE071633A9105C09DD9EA1DB23CC13611B3C +D3B67EF45E4057C865C0A271F974D9615F0AEDE45A4AF7B1623F725A7A60EBF5 +82D0B59987C89D848F6195788ECDA22F9E39400615C8D287E75300A295431ADB +83D0F4ED026C188E6B57C9A90E5655DA0F56A65385A46DE73E7E1F7482BFDD88 +4F4570C318026366791AAED812B4BE31F3D130C46E45A699C843E09C24945C8F +806F3DBF476D3DC8D7261570C54EB79905AC4F4524C9B3100BC5470160BB0587 +BB04E4C7090B090B769E654DE50D771EE270825F28CA00D86B6814DE04D02304 +9742A33ACAD2D718843F882D06755E0FC71B5B92A1AAE92E1167F867E895BCCF +A5BA73AA8CFB9BE0BD2E4A16523198B21B664B1D41E4BC0E18BD709923EEAC97 +501C90138C493F8E1E229481B00A2A1E4940A8002A2401DBDA64C86B61C760EF +DEA4C7A8EF665E03D0FB63939DB9B6D8FC78B20D882FBEC7A9EEFA6A91E0322E +387252FF8770C9A2F5E2A3818EF6CCCCDCC5F5F21B855F489898A13080983705 +977416594B8B0428FEF03A554CF07FB3B59E5F3E027AD38799533C5960C826E9 +95C6F25B15B802D96D975D8621AD10E0DE65C3B8F09CCFD12CEC98F71EAD2E69 +2AB13A9F2183C9B035704EDCC8930860B48DBB68B8E3111E26A8FF216E80D082 +F6CF064967B1233D711C076D2F3680D9586A87694ED8FCD0BEE0A8C338A11728 +D658C224D94045D9528BD888275E17B50F9A72005130EE5149B8FE243B2F428E +81F8F5602D3E3EB89395E590A1253A9C28D4140DB9769A5F986325A29BCFBACC +9ADFBAC34FFA3DDB5859B9DE3311790882EE64EDD02B79E15406D945E6B454CC +9E658F0ACFF0D13B58C75E395E0BEBFF5317C0610DDF07D18900919DF6F7AF17 +7FBC6BDD3488C1E140DA40049190E4F718AAEB9B1990F1F8FEB61FF5EDDF3055 +4A747292CBDE3C33372450568D371D342F8371E7F9DA016B5039810D053F7871 +A211EAC5AE13E808F44711906806FF0284FA51F97934B41B4E320DB211E33E32 +64321927CBB5E97A82274EBDA4D88FB255791A70A0A2E651F141D3CD1DAE553C +94AEC8B6B2F4E337A7074B7E40BAFD0EB0202C9F77EAA4183208D539A15B94E8 +127C767800748416332A9FDFE6DEC86EE0273FEC43152C064B7C6C24A0389ACE +95DC88E06E1ED02B277A4CB3500B6822E969E36F0F0709ECB4A53949965FE907 +6B9E95142869B12750FE639B9B5AEC8C28F70722049617EF0BAA248D559AD505 +29C89B1B14E68E3E47427A636090A417A74B2FD20C209ECCC88C1F93E75568BF +D1D32921C4BF2B1B999C86E331DDF26BE549161C272235EF9A62E2F04BDEE6DA +123C84DAA783A4A9A179C344DE77CEBDE3291006D04DAFBAACE06FC66FED9259 +AC036F7554276923F8CA84952B8524F73786497344A8210D72777A3F0F402461 +DAA6FF1C3918B8690C409A718C3DDC9326D14D27FA35C25CC13FE4955AE7F19E +FA40A395917DC43A1BA33B7A21DB8971D5258BB07B14E587C3B8C0BF6D186719 +BA375629266754D560240F4C642A20DD6540283828B260F7BB04057D9773887F +30E3D0DC8F26CAE5BC74CF2599C55C7D53A866C9E56450A0C9E8F295C3956F04 +62944690147B5098D87C3315972ED1972EB3681E2141CA1AE9D54F1E37EC8EAF +3B7B27D54223C95CBCF3F200694343771860B4C59B2F74BD3EF3C20A3361824B +C178234D9B87F2831726735E054C48B57705C254DE978FD66B8FED99C179E3A6 +CFD55E11231275614024B0CA241EA4618430F62E93D5702AC09472BF682EB92B +F83B7B99EBD3736CD543F7C02E7F42AC083B75F5C28B4D0AF596BDC1BC90D7D2 +58DF44752BD362E7896C8A9C0320F226DFE7400946754A5F518596BF0CB2A307 +00C276C5A4A7DEDAC773F40FED1463FD62CC21CFF7CB7A850DDA434473866023 +0146E94958A21EF632671B71FE474F1915DBEBA6F6521A2A18382144E3B4CD87 +AC655DACF75CCC795C24241C851A05FB942FD8FD05E434EDDA3EF804B1363BE9 +504F346D6E23AF4193A93930B1E605FE73A96BF9C6778BDD25980D671C75FEA4 +700186F9F1F54814C73B69D66FB36B4DDCE39F3E5908B9E73E385EB116C21BCB +2322A225EC338C82C422ADEA0F8605A8F382D115B1243B0A2CA19EFB2ADE474B +6641F564C6003FE42639E7D862F8F3B691F566D454BB781B45EFC163969493D8 +857468480DA8967235BB2DF1E4B1070DFE9FEEF51F3BFD6B6909E0B19DB09F09 +921E9ADF59D3C3ED0B3383A3CF17A4633738A781B55E43C650A79CA2B2297867 +EC4A4C7012615840E816AFE169DE32DCD6C91159E97C0CD550DEFE597596CCC1 +9DC7CA2907DF60E74B7076ECD61345A90993D198B4442B42103C6A0F7BFF05A7 +D927C4452D15A983CFC306A3FB4D19A5A54D581409183CF749F58F64749AA350 +20BD27B2A702F72A98D584DF32984302EB1804B4EB5CD2BAFBB482E3DF8129E4 +8F4F44C221A1F2C862CAB51EA2DABF24AF42D64DB8829E30076385677719564E +B5658DB1086E0052BC1FC562F7F9894B46734DA15B142E7165F3519B36D4FBE9 +4220A60BE1E30FBFFB67FD2DE4286276CC9A341E21558A3BD8B729B667784C8D +97981ED0612FE2DB733F7E46CBADDCC6A3BA7AA53C6CB34B021FC4545C1EB139 +58EDBD8D2E98A9CBFA4B72F52F1C1B72AF8A99BF78CB6E2F19F5458CD4A538DF +17C18A80F62BBCDCD5B789A7DF3544F9C6DA2C22C580C41EEF179A9E9514BBE7 +4F15B7687C5ACEEBCF6D2229238EAAE66AC13027D20DEE7FB7652731200B1E21 +B2D72B3053C47132594A48501C9BFC7DB924B4810299B3581C1DAFF03B0658D5 +BDBC8E7F6C15B26FC872BBE0595D1A0E764C632B766C33D33F5A423AE987ACF7 +974B18F39F85F7A063D99B451B7DDA3C24B0FE4E7FE6FCED2A231B27EC109962 +EB7439AB63D48FD4813CCAE4D3F53B0C3471ACB52A5DB323FF4E1EE8373FABF2 +6D844FC2DD98598B9647BB4DBE12454CE24FE162C3B4583D593E67EEE093EFA3 +B8EA96E3D20B182F8C836B676B1CF4CDA0B5C283E2E2A7992453B9C09684C5D0 +9FF000F41DE580FD799E7663F918E7BCE5CEC8CE05473B660B343C5564BCB7E5 +9F4DA3B7991EC910F0DDE4002D54D459AB33770ECB111C25B0D327194D3DA61C +2CA2BDCC78DDA1F3A51F3D7EFF922D3C9A7D5E88D3F718D4224A0A34A4B91A12 +EC7AFA2472E8977F1C299380AF7D02E2423D880CAE31A610E0158C318DFF3802 +9BAEA372D8168F5D631B7CCA290C93314D3B96CA1EAAEB29D308499CB4AFDCDC +49429DA85225B0429998746B2B2D4A4D45BAA8575416631386AA7B620FB272F4 +69ACE1610BB6F651B154ADEF7F8EA3C51BC62A081F547181A3A18703D01E020A +5DC4C1C934D2AC4A0B67F545B521D9B40F3255E5E9DE9322FA51652337A405E4 +5F0CF9FFD3FDD10AE339AA2D91BB9D3637E72738620E8CB14CD87363AA04D4FB +79B0127EC187E8767D3C06404CCDABF583404809EEBE86DD8365E5A61BFEB1AE +492423B4E5F9CA962357444AFB75AC7AD2F387107AD76171F194606042072B9F +18B341BA7D01A6EDB28297DACDEA900F301D95D33A89248EF42C3264F8A1B47A +5CFA54118803E5B57CE7C0068C6732B60A741E20C981BD7C4BB1717F5774AC58 +92CB5C82DE1D1DF4A9E4B945D7ECF90E9086BBC455244C51E7F6A9AB801CDD0E +7E5BC63515FEAFA4238F4765AC04F3E09F1279FF3943D77A06C0EA2E52EE75FA +834963A8FD2929735CBA89073CF651DFAF18FA8D91BC1022FF345C3E6705899D +13A63FFE22DBF6AF2150887E12D9C7C55FE026F763D3D15D6F5DDE550E21ACD7 +91E9F7937D3F2FFC2438EAD533076BC5003E4CF3CC4A98777B0615A2D20CB825 +93C60EB16B5BBB653C91B8DA49BA774C81C3AE8F12D5E84D49C431055B9442FC +27BAF5F30D341BB3329CFBCCB09CF1A2FBAE92525E9D3CF5E099C0A72E1629F8 +D08CDF8A6B50CBD76FF67250631D13EBE30787D2B912AAC23C6973439C1980A4 +676D23FC0E90644BD0FB6176322D94EC8B2C32DD0A12065019F0E8926A14B7AE +C9D8905D9B79EF23446388D9005CBF63EE7A197BC4C5FD2E3470DA7D46DC2977 +B4C6FE57865E1C0448F393E0AE7D44FE616F129D7A0EB9ED1B78773EE54032ED +1DD3672B6923D188014A61F67ECE29D913F6CE37D014AD2FB1CF07CB8AB70530 +FC5D413407B6E01A3DDE44613B8A7AF8FBA104D0E03DDEE4684F73E97118F4CC +F74A503462C96F866366C2950BE3F19CE061EC7834C0E732FBE592DB5AC2E088 +683CEBB978E109F198E2D39FD2E690C390DF290F7709DEB6EE64F8B88D3993DF +03452F2C314C04807A63AB766F940667FA3B6BBF887EECB96B3E29424B3DA03E +80E7045A2578BD70F50E0F20BB6C3341560A2C9D5241936269C36A9C1D71500B +9C048AB6B9A5E0B50E4D3E0F63B4369B7A0AF6E1DF6C8CF5CA4111DBFFC325C9 +41F28237A7F731F99D5CC15F3AA14E5B4B4E6F7C617AF408275091BE72E98AF6 +456F9A83F05B21CA0429EAA3BA48CC5CD29A087D96B1279B9EF5551794BA809D +6927420E8DBC16CAB46450F1C0D5C8C8B3041C22390F9F6390067EACFC174AF3 +C9782CBEE35675872C4C68D3FBF78C8ADFC284E82C52C64477D228181C8697C9 +5E98D430816AB96DB01299654FB097DC281F0A60D9F03F84C973A6AB85EA5889 +AF3E8C64327D25D06B766F88973D5C75449D258D8F7A8F1976867644EC49D2B2 +AD765695B57D3EF8B8ACF005EC4A6083E30406C4887134314AF75BC66239B2C6 +44D663071AA7858CEA822B1F1DF09F4099D3B0F7A40809E08C0417BC05AC45BA +30776357774331D19C0937E7DA9B93E490CD9E58D68B227579A840563DD0B5FC +A6FF6D2B9DDE5A86AFB467395A2DE7F0F17494907B5658E29B518078C19D6E49 +E9FA0BDBCD3CE2579F20608BB5E9F6FBD30BA9A9A7BBEB411F348F69680DE209 +2D450CAD4AA515EF0744A9AF866BF129E92C57D523DC7FDECB9495F3CB72DA82 +5C3C50BBFA161BF93955972BDE0B44AD8483B519388A72717F6CF2D96F806F5A +204141542454453EA24A95A4B7BB7EC8530CFA497732F57CBC4F6A778EC05F81 +4D479F48F6CEE8E893DDF75B3C6429D1F593659E55267744E046627EF474337A +996F2FD56F2109879BD8A98B4C7EAE060F1770DABFA0973030CCCF297AA2B3A7 +5AE3C82E164304E43212390C4BBDE2606B124AEF5BF5DC9405F39F76C7448574 +589A6074EBC89C5FDE3542D723ADE4ACAF83C617D73BDC4CF4670E414A0F7C17 +7C0EDE2CCB0D5A10F0EED3CDF41CB790BB8EA61CF1AD9FF3EB39CEFA61CB13DB +378DD50F477C9A5FF24448A750699CC73739254AAE0E26886195B1CD7501DE9D +B60CAD2D5539BEABA6FA7BDFEB572CA0FB6A8FE46C6C219834BC23B3E4DE6BD0 +522028E9B7EBC83FF1E17E28A3C9C1BE0227536B3E917E6C2523121B7A6D32E6 +A007CCAFEEBE1633D1B8ED9C0F2C9D6E23141E75707FBA37897E4C0CAD0E1BEA +603DBCDD7747690BEFF6314A18186703C62FE2903C7D782C677AAFA105ADD4CE +C91EB6BCF2D327A3A6406C626A07A18473043F3E1B8038F873048F25B228187D +7226BBA7763E9DC0B43895C088EDA7A6A1E367D905E477F41ED43EF267B86CDA +481C8FBB1BAC6E6E0AA4FD2E979BEB703BC7366ABEDC18F71942D87928155C75 +1C8B4EC74C2CD9ECB7B19D9864271F8A4AA5F57D5B684471F273095A07892C91 +C946F615723E17E8025FBBFBAF16687DF65BDE23B92BA8FEDC894427C91AC4E2 +A3605B5D49E1C13AE8CC26902E92378104577A188B45EBF878875FF1B574F34B +9C2BA7781078F7A9CA7228E781D70A9FEFBAE5AE8319AACDA99A2E368706A2F8 +D068FBEF3A103ED7D71223DDA428F36A07DE9A9B6C26F3728296CFC3272A8E1E +7B372F5D9CA4FB010ADB189075DDEFB7488F481E6BF8490DA0C23DA26E2F582B +1E0433F5F019AEB91C663C7B4BA4FBDCD53CE9FEB02D5261CD78A1C17C30FE54 +EA8455AAC1204908C191698FF7E1CD58B6C766A6DD9E68AFCB0D2EEE7FA1338D +E0D8072E2838DC80FF6A028581CAB8E03A59B1BC7280EF55B97DD4365A28905A +5D0D198E6930333FA1013A152F5DBCD8A36DA7B52CC1BF296D768CDC7079588F +407DB466E7B70BFFBF82FC6751B65347A9523823E992354233DB98E838EC8933 +45C0C3181EA91C8CEFF04937B63D0DFE2B46A421820BA8CA5F5499D481868E51 +CDC4596D648F23F5AD603154996304A2C27EA1CA6E415C2F15BDFC6B01D2FDAB +638DAE9355FDF19780A42ED36A33E9D6A216D455253BC4EA831C1419F5DF7159 +9772F00CF17AC084B10C4F11860E31702C911EE925B93D994F67E2926B73213D +68AB7A0B7B42E150F3CA1E30BA0ACDF4DC74931E6009334B33035201C698F185 +57B132858F43B7A1DA50415E3D883342665118C3CB952B74BFC7BCE4E613A0C2 +E73A167648E282D8235FD84203EDFEB2A8899B4C9818D91483715F894657C032 +A5CBEEBBFC10B7C5AA59F8883FF4E799E0C4728E568F46CEBB4AB0929DA6D001 +A8FA70332C827535F8F05CBDDCCEE7178C007E60CA1AC783741307D5CD9C3199 +E673C480D0BEAE9DA98ECCEF3BC798AE5286FBCD3B9C0D4BCED845E41BE0AEF1 +763D293C78622EE9818DA386CB77A060B5296E06A44661F1B2289B7857C73425 +C28CA50441AEC8DE567D8504355E34ACBFECAD86A95E82F0D5A09C402EFDB239 +2A499DB371B08634CC07C592CF407738A667DF57D8417C4CFA790619309C5179 +82160A93C4841844CEEB8030B65CE23CFFDBBC0E9A48272A53A9DEB47C991A44 +5600168B35F73748C7EBB2460CB56FD313054E15F564254B074C68489BE6EC8A +A4C16F287CADFEC52FB61BDAD3E1AC87518DE6CDD7921A166B800C03E8F1243A +2B094B68EBE2691D726CAA51E554F96B8ADE6D019C24DD75C7A4F038686C45A7 +2268359BC73D4F0154DED87B863937AFC3EDE0C56507256C0230C43213650D07 +93BADABD4A9C066EB2B3D9BD43FA8169D87791C3A9287DAD03CDE950FBB3676F +D3605535B5D7C9BD0118308F5A94C4EB29E842D1FBE49670FD7AF78DC31610E2 +4EF86FF61693FAF103AA56DA7A920A25B394A461423EEE8231A1DD3FC34F927E +26A717BE37CAAD64E883E2E22C1718C1E9A4E69C977DB13411D427AA96569E9B +D7522FF889462400293E2FA2F4100340578D19519CD9ABF77EF8CAC1571FE000 +1080AA77E574DD6BACFEAC54A1FEE5CF9B6F7E1E7429C4E3B20C4F492D8B3B91 +9FFC3B6FAA8AC36FC882AD4BF6171C5147177DA06295A82E24C3AFB404C200E8 +6103733C515894B0FB2AEC498FFEB5A20A8E020D29A807CBB9C3F7FE0CBC7175 +89BBA2230D6013A3C42588DC018714BF4FAADADFA6E31397FBFBA428F91F79C6 +9A757C636CDFD43E3F6214CD4FC2B56F10C542D7C53FE0268D8D30AC95A2AE51 +3A6401231B8D18A9C57571086CD8F58FF109E7AE7BEDAF804A6263A439D4BE3F +94CFAFB9848B4903970B58DD4DE26F629AD2E2A2183CB3054ECC4B9962A89661 +64F15BD83E84AE8AD4958115B00E557FFB569EB78EFE95042FC0D73CF577C624 +ECE57E45F135BC904D5C6722D791040A426C9766C4607CD5CA7AE54298ED38FE +60ACA2735BDD35A88F5B394990BF320D533CBFEEEF0FC0077300E6FB3D808EEA +BE8C4416E964A5D673093480166B503E7C86431DE792F71B0025541659E26667 +BF303598A53CA0400DA9FF896D6114F5293FB6AE8A1481EF79C044AFFD1C3DE4 +8A06216AEE80BD03D1C579767C296C49A9B4434C3317A19268E3FB8162198D56 +3611EC062C551FFC5E17A76DD094B1BF2DC29FB49E08537224389B666D105539 +091F8CAE03B5C33AFCC39F0ED3E0B154005BB452E76C73BFC3C79DD85E11A59C +95289C023A19DB7F061AB2A39BA47E1A9E81547C73796CB226BB8A55AD2268E4 +5564A217DD47C2E21AB9D1D816E47A9D195022251B0D82989D0F4DC19CD954DF +B1B5BDEC1D7DFF81988967A834D6236549F4D4F484A7E173B2400CBD6E5839D8 +B5C5EF5DBFA5717F8A8FD61B0319067B908795C08BE68961161D7B898A80D9AE +9434D738EC57737E9B2DE0A7CD1289629D94F21F872442EF3D0267A4424C1398 +309295B259BCC8F2C37A1894F347478DB2A7D4A4505942CC5F7ECF884C5D885D +ACE1EA5883050D0FB58AD394F96AA583074ED9BE783D6B7C1B12A02DB2CCCFC4 +EEFA4E50C8FA241CF4BB972C19900F5B0FA8E6CE6F2C2B1495C996D5B8D1C4EC +26100C8E5A4338685050DD2D2A8E5395BCAD3D9064805E85AEC31A8B90EE0978 +680998678A2D5522316D7D1F5B2EE30353CB249E7DF0646D07E0202DD1B7BD9A +66B151FA113C809DF13EB798BFF29818C2CE867E32EF3FEB32BE7299DC51157F +CD9F9059E4CA3A87DADFAB36F4881BD781EC929E9A728C9FD2FE76B839E84F35 +4B4353C08F1A95BEDA491F4379235C4DDBCBD70CBB2BC34B563129F506293EBE +C5C516EF82B087695FA0F1DC412C3BEC7142E5D19368D904F8D2EAEF62FD0570 +DA36CA4EA8B866F9B017E7012F4A8AF1A13FEE0F9C568A7D6A92AC54679E9451 +D7BBDA3C9EB65A15BE4EF37F7C60569DA22F0BB241D7CBC4BCE3544C6C78AC67 +49226B987356C108626B7F07169F2B2CB49AF675AEA691D04496E36875C1D8E9 +C4E792D5F617835201531BD533CEF81C26D754A63460AD3927989ADB385BDBEC +347219074B8E68FAF8D5EE8A26635251C6A59D1122C7FFC71C2D459AF4616E82 +23C0FB4FE06DD91ADCB2C8C1CBE7B2E7AA01414F38E93651A889D4379CD4BE45 +F709055A8BC91BEB8345A56ACCA76149A699E21AFA6F6D423A4A715D77DA669C +51884704E172744920533D18E877EB348010C909946A2507E22A3CA3E3041EA4 +60294E8F205528062DDFC3562733BBF0922A87CD2D5F421FF9FC94AA2D380A8A +BDF33CB17415CA97A74009E70B0A7DE15BF1C714C8D63B72EDCB0E8AE1C6986B +208C9AA1D0B6E9453DB51E4054B0E4E4A544F713BCAF55B90FA84E5DDCE1F132 +3FC5DEE7BA419E006677D2ABC0E012385A049C3B9C51841FECEA0ECB262A0CA7 +CEE05A69BD5BBAA0F8EA06D878AC3B81829D3891A456BFE19B0D9B06B5D715FD +1C0BCC3D304FE9F1C830DE89F6D526BDEE9E886621C13BEE2ED59169270F686D +01A7440CB9165022FF6AFC8EC4FA7C17741FDB6D2FBDE95873DA69A4F8252B8F +7978F7314A143F8C0414F532B504F6A6A42ECE5C0F09B9B3FFCCF68EE81CABD8 +0DE789A64AE3F3F7E3293411B15D1BBE264355F096FF90250D0D2D43C3016FFB +2A59F70FFE9636208054ADC08C8D02F9DC2AE567FF26A95D67923343C169CEAF +F14E4CC9FAF053DA5155520CFDEE63169924357A5C3158FC3D43A7A42E4C5E2C +9A641E6E25FB2115C40A03472C5B06AC4D65A1854985F782B387EDC26ABCAF2C +9837E7D331E57EACD575B3349D17706C398A79BC015A0B01A1977459B86ABC6D +BE555CC7776C0C7DE01A158608A0AE3A3E9289A5D8F2CBA9D6C63EFBA892695E +B7534C0453EC26B7743143F2F1002AD757C177F5D7F16436DFF4ED6AD12CECB9 +D9271BDE6ECA276C3B2AC065029563932B5D7E33CB1B71B996C947546900987C +0E4490EDDD6EE78B6DF8D723C19771D36656F3ECCA752ADBD68951ED0E79D35E +D38852D8AB1496E0960D14C1C8A687D31913589A491EAEA3D18696AEC361D483 +4FFEBCA1FB33A8C600EBC456137A7687F4DF40EDFB9A3B080466C4A470457538 +3823E06B9E6DFB287FA7BD7042203D0A6ECB0E47EDEBF97016D831E0569BB60B +F2DFB207C631EA5AB58FEE4D5BDCBBC4B41CF0BB1F4ECA465242E509D145538D +949C0233F71C27407E75B11891045C9F7801A973EA41AFD742DDEAAEB504ED4F +64D6E0B7FB9263BC65823D51D593EC42CFCBC682CA4770C0CED5B238063DA5D2 +716A9205CC862023BAB6937D2A18FF5D618116B45623E06172EC30280C21388E +4D53D077D5EEB77F2B300C57FC3ABAC1E89AD317B46F1883F5F83E7A8AB1891E +8110ABC7FEEBA203BC9F2EE2982D77BEB0F23904EE340D6D6F72B1BBDC76FB3A +8E69F3C5C04F29E2AD924C390DEEC073AFDF3784DC26B85B7F0528E3B61339DD +1E341DF261CE097C3BB1769FA4C6E728D678ED7B928FB44E6BED81890CF233AD +DF4A72B95F85BD95C5645D8A049E89D0F94AE88ABBC66F5ED01EE9141448C37B +D47FF55ECF86E13B47EF1AB27C5CA26F7C2DA5841D47B3E602CDB2125DC345E5 +74A8E293DBF4032168983A6B439B189FCDFA5FCBA97E166C65FF0641E0B1A7D0 +9AF28005F1CAE32F1D95A27BCFF98C139911199AB6CAEAB49728AF2B0A0DB6D3 +7419EAD54E2EC55808C6C176EEC97477FD65C11BF88BFC0CC39BA742BF841FEF +AB317723C3F95445BCCD5A3ECF82C78C262B200894C983AF871912E47342C0F3 +13AE004F1E05CD83125AA4AA5161B1DB9D3F1A960E682EF93123EF53145A9C24 +EBDBD744307F6AE52FF1D6D43C3F667360FF48673C59D04F12C3AD8FD361C4FC +8F2A902193D4EEA3E9DDFAB0D323E2E49CA4B4FB691F9635AF026CE1DC94506C +49D68F5899BFCD1B947C77A77B1598CAEDBB7AF0F13221B59604E91140959F92 +8C49E5AEAE03C019BF6D2FC50B5BEE2BACD955319BC969EE0FA1752BFBDB1380 +042B1C0FD79AC43B5452A1BA2281982E73F681FA76AF1C9C4F4FC38EBBEFD865 +4648D27D218C40BD2C1629E1DD79263FB7FC2005BB3D06C9EBFFB22F67F356C3 +D20EAE1DE1D11ED1DB1D0E6F2F20FE98A28EB737B6F5B3307620A0199A076B49 +05F16F4D4A9C39E1B806BA6ED58B24657C2427AA6C987619D213AEB93B3754F2 +E247612FDADA5F5AFEC1512AC93181F8DCF831DD78271F12D28B0250440AF081 +5C141B11585D8929ACE6C79BC97C804325EC5931EE393A7B964B14B376694460 +9C0858E833FD66D0DE9B7D6BA33AB8FEEC15C99E3E5D329676F0EC2FE5E539B6 +4957002C77505CEE1027AF7F1BA529B45942058EBF4EA22F1F7FE3C5DD93AA1D +9F3A228EC45643CC629AF5EDF9A4A33EBDB7CDC0ACFF4A4326ED51BA05C88118 +ABC356B35D4DFCA057D8BB3D8ED04DA0CA49210F352E589748E63F2B3CDF7281 +6C3E8F46B9C2DF790FEAC41637366274C88DC4C6297F1501436602AC7CF94F17 +17812F8230CBF820885C3BD086289B845ED8F6B8B75015744DAE3981E8A1C691 +93B1D66ED2E41EFD86C74E12276CDE05A3A929E529F7781F1E49550B44A26FBE +DE59A39FCF8CBA8F05862882D6AC13EB83C20D6115D4BF9509F8A506E5ADDAB1 +ECE74497A17AA12D1CFE36672C2D1A4F2DC52DE56E8AE6CD1E72B8A4F850D3B4 +1551EDEDA4FBA36379A26C3B3928AA8AC63B5FF9D24A893EF019E6FF0735FC60 +7E95D2F29AE0ED922BA57F85CABE2AA44498C160656779860006AFBC4BD6685E +ADF006A4936E52637ABCBFDA6C8ADEBE083845A20B9978A2592F98A8E92F2541 +A84F2AD2DC12A81C071C0864A1510CC6BA44226B03E4DEFB70112B4EA34ACEF0 +0FAE9A6A783FD2911ABF67B974FBAAD4CAAB514DDC66C696C003E728262EF4C4 +4AF9AB3E23EC019EB66269B65CA53271B20CB71962FBBF8967293C1A81369021 +E89CBCFE25C124BD7A8A1F7C84DB681A545692C17C5A4C3D036B7E61C7C8976D +A3071BA77FF9F7C9181AC0B09D02DA041981A7FED34879CD2AA43695CF8BF01C +A92100BDF60720C5633E3047655240DFE1E96A85C1F021FC237F51318A9E82A4 +563725D2267D7ACD7C78B228D5A6114D77F9F055B885A279F7198F0993332786 +A3A6459FD9BFFDEDE996C0BEA951C2BFB14F7753C3599F630B00B6A44C46B2D6 +94E02C6E3CEAF82C3F730DA6486A47C2EC4722963ED34D3E982DB93A891A0789 +5CD8EE15405EC998AC29D6374356F8E4D8125EDD844183FE31A2E00102E276A3 +7F138310B428AD8D3BE683B8525524F14E6ED10AFF68127B617167F1CA432732 +081B87D78B6667E92BB1F5794C6A66DD830154311C59A43BF96100AA8A84BBB5 +7F201F4F25DD15E87F6A9BD20A34402E5757ABA204236C00541C68A52B8C6666 +FC3860679EB3C085B647796B424B598E97F6EDD31E1C1FDB740FD735A614B4F2 +93EC1CA3ABB24E4A2FA853AE8688E535FCC99160F55E28D542B2C48644ABF948 +168DA7AFFA42839CC7EBEC5068A78AD0468A6697D0848A6604CD020BD92F5362 +DFA41E55C003B702655FFA0315EEB6D622DEEA18126267998875C2F2CB9D6A0E +4AAACF51EA44074ED7D625572DDCCC20982B43B7BF9488A5CE852CEAD090719B +8C6A97257123E8EAAF13A06DFA4BC20801079D7636DF8B8D5F5B3C75968C441A +F17903004DE8DBD08022CCA7C0CE9E0D784D7F571D4BC3DCE4AD4B4487CD7ED6 +7E4DD4516FEFEE7FF9D7190CFE093423D9FAB6D03D8C7607B9C8491AFFF1333C +C4A5CA33C669A889D0C0F174E9AC7B2B81CA532D70F86D820A8E0BE35B21F16D +C1099AB373DC1EEB63CABB00949B38DECC52B236AC8FF44E0F35858ACD325E14 +4A21CEB8281D10BF798F2B3E460E89E54A8B255A50623743E7C0797644C92832 +60F30A5B104827DDBCF075872DC910E480A48D73118D4541B19AC92B1086E48E +CBDAA0C4BB3600E546D538145C6C449658ED66B292CB2B10431B5517DADC3269 +0652E4287731B70785C23D0A5A7BF2FCECD6481CA92758B74487C3D50FC8FF29 +FB973E1E518130D2662DDCDD6199422FF55521E0715AFD06C43AF2A99999A5F8 +B6EE78F74BFB8F845CA9FE3A03A50218495724850CC8A66C92A3C4827679B4E0 +02B86A7FCF82248A7ED56D5034A349F920FB25112CA8A84E7EBDE228DB05D009 +76B948FE201D9F56E64CF491A7DCE17ECD0EDFFA25E1EBA6A5B5F8B9D811F559 +9A341D65B51A32B2230FB689F0DB5E70967A2F333194FAC528AF2CBE72C31A47 +0902B69CEDB8BAA7BB1381A4D31EE1198324324E2373263CFBF2D56F7841E493 +90DEDC910506EA457385BD968786C753ACB24820E00D74F35BD07195E2959044 +0BB0B53AB9B29D14D0EC5A35ADB896440506D070D0341A5127241D914BD0F82B +A8BE9416B728BA2BE4E0214A4CA7D354E229AA83BC5BBC744C811A5FE4994EED +46C0103C40ACD7C5772F22EE718159A80C6ADE365F84E1327A5E8725D8618176 +7F331D3D3EF56CCE69F36DA9E620197E52CA7B818D4BADF758380F5B10764C7E +C3B3ED839AB620B9555A2EA838CF5D2E9F014B9A3C96BB0EA054081EB07F604A +E2B1A9758C336FD7EC9C7C2A1640725485C5C7B353D58FE00259EE1C709E07CF +FD54165C87CFBACA6E3101C23601BF20C689BDDDB94BD6DEBA876E981CE95C45 +6543A8BCD8BCF2549C97401442E3ADAC213C1885CCDEBE8AAF47A58FEB1B15FF +F2208DE4F031C8415E83CF7A6611464B491EDE2E9AC7D9AA84441F9A6532F44E +3D142F77EBB3E8033F23C93923F0CE6848F5AFCA7AF0EEF8B8DE8FCE52CA1C92 +1BEDCD239C712A1E6CECD22EEF42A99B6640D59C848F9C630F52EB49CC6E881A +0C2104A3ED2DB85AA79874C5072389A73878C01D45AF07B73ECD178FBFDA6EDD +7380E9FD555E929D92876138934B8434B0774E378C1DFC1AA1E65EE9A4C69ECF +0BA16C2B96CCC0F22C8CB492965A8F6AF7322E4142D8A40A9A3B291685B0BA10 +0EAC0E2A92B955B7A115FD3F75B0F081ECBBFC40B4E81B76BDD5F7CD3255E4B3 +2EC25E35718527CE70470C47D4D160871C8F7415F80EC718338E41FACFA607E3 +C29F11193EFDC1C96D24D9ECCDBDBC5A0541FF5ED2915623346D61A71BB2DDE4 +A273CE9CD37FBAF6903058C7FBA3CF4507DD723C983BFA5C2CE4651E2B3ADA8C +28D1525C8A184140BA42C0B1878C5883581826D7F0C02E6753526FC538C0CE33 +CEFA24C86414F785D2F31A5BA161E696782396E117E6B3D21DF1EDCFF6930A8E +4D8AB720D67F93D6F0FAA25894208574DF575EC31451CE3D196319119BD46767 +9E7B1C7E26CCDDB510E19A057209D1F8DDA77F830752735CA95B8B46EE230338 +F37D528BD533640FC7AA6F4CBCDD5F0154EED7625D9BC57ACAA90481BF18ACA4 +4CC17B1FA53AB188F6D4EBE0E89671BF9926B8B87A6EE17F782E1AA5289E1A12 +F791CF64CFA9BD842771237FCF330478A6AFE0D6BF9A80CE2CE48784D0F1FE7F +E36517A0AF2778ADB4913DCBA5CCEA8F423CD59CFBEC56BEDDA8B3E03E048CD7 +4D670F5BEA7A44D309CAF775DF677EF3E6B5131E3F28CEE8F506990446D077C7 +8293B4F57F7FB2D175EE6A12A0E050802017311C15CABA6C5CC5D56F77F93CCB +A25DE6C9DA9C304B98100B26C5BB88542CEC07C1C1AAC21501D933E2B2F74E8B +5153D70756AFD54C0D1CEB3E70CB40270FB03CEA23CA0AB46BD904919A931769 +FDC333FA2B2D55CDD99148CD555C959BB511732A90DB1B986A3EC1F3251925CC +985228C6BABCBEF2C59A590F22E1D1DF16D6654B35FAA7A1BD7ACC0EBB529437 +408628F19838384635676825548558554D6CF471178B8C0CAF16CC278F58AD3E +1524989C16B63834A76133746B1A306E2F89C52A4209999F0E63DD7C85058894 +98C18F65DE1E03297C51BB581EAD46557BDE7155DAEB76F74E3F00A32271F5E2 +E7E909D1826303032047F61130FAF8BAEFC77D524C6D1F8F2DB87D1D36F1FAFF +5030AF4E0BDFE670712B3F01DAEDFB76C93CE59B766295E1C766C1BB0552751D +EFA83B7080B6156FCCF1796A68CD83B6BCD4DAF3353361F6A79DE994F0833A15 +638AE470FC6672593006E47301ED6A1C8727388AB31EEA34613CAE8E8AB07FD7 +6A18E36309FDCC4834F8CEBAE4AA648754D679DD4BDD86513C851A8102399740 +7792F8FF58081A0B4E84058E4C1A2D6BF680CFF926DCBDDC05D73627B7980E94 +D5E410848B1B6FC742315A2ED6F25635EB0D734C82480157DFD2F383E6508EAC +EE70215C509B0B2A4DB87E6ABAF2E1AC115E6E24A55815703E0E054FC445CF86 +C1E0ACEF9AEAE22EB5D627D7E96701F93D080DB33240065D31745331D210830F +DD0DDB83FCC6E4645D54012254EDA717ECDEB5C114D826D8F2E95FFC67948335 +2B0E77D7541876CB99594FA3C629FF182A7BDA378C823826AB0B24006F80406D +5DA1BDD296992542E75B74CD79C2B4386016F415DAD1C183C3330252B1CDEA5E +9129274519705F35769DF987B207CA0C68F3E6247F6119B01802A55CA056AF0D +E8247CD5EE363A61D10855FF3A495861993440F77301477FB4EB0EFFA5D71568 +D708EC717428323DF6942FC660961D005CABA2388F00575F4649F9FCABA1779F +88F964A301A6D5D1FC02B327B55730031CCF60ED2A15E6039471FE70B9C83C32 +A25E93184F3A994CCCBD2EF04491851D59DB819DA46DB076C3ED8230F0AF49C0 +A2224E5CA6ADEC27C15D0642EADB6A63628EEC98F6E941394C71DF59846ECBBA +E7BF50E44E3D78994167B63641F8FB22460867CEB24CA37B08C91E49F0C47D13 +10F05348092FEBA6250C635FBA5C5962AFB24C950DFA5CDEDF063589804173B9 +EC2979D26993378BF16CB04F4EECB360182CCA00094A7E6C9D16630A1089B6C7 +B3E3FC864CFC613F2742065D4A57EF6559FA02C397AC666B8C9C35DBE5ACDC5C +9624EB9A2219385CB8C83DE36D78ACB2B4A8A84D83C4DD8700534E00B4C4AE0C +E431200DBC2C1BB217159174CF4EE41B6AC8746598A999F9F1CB98275D6D4CA0 +16C45FF79EF527AF3DB2FA45CE3BCB2E5D46D6A8CA3B7D81DC5679CC7D949CCE +7D3F61F0FB9313FF41878D6C7058D8B2D3525D65C7FD7770D119E7C4E93898B1 +6844F80F0ADF8E84DD888594153238CA44CD3BB791186B47C66F6DA75F5E8FBC +A623B5AA758C66F72C6E908E5490E95C1E73E674CC58B1ED4B385130382A2C48 +0D815DD704ACD6A68DDF70D5DD361ADCC1FC831C9680C02E77FF1413A025D992 +27C683ECDA0447F1A027DD1A47CCFDBC30AA59D35F731255609B509406D8C22C +CB4A0BCF1654060D52EB4EDF21BE9F53CFEBDF408C5EA49B22A7909193FDD3F8 +DBF9F403B961F6412F2D27D7A1CF7E18F46630A0CA925CAE8CCB10CAAF42A5BD +BF21F7845DDC89B892349BA7B4BAEF3B85593FB06A267075BFEEC3A857CB73F4 +402EDB98A70D15F48C2F61B3CBD7BF277304DE6EE36E9A55D2A1805B37CA9A13 +B37F00DF6FE4F8508305C3FBF257A7884A7C4D95B6A7DA6B2C4BC6465E0B8054 +77160504FC1976456543D6AA5B521E88A74E5B2FE7AE6CE5BEB4BCA8683AF38A +7C6059764A7CF8E688EEBA0CC520F2AB06A61A07CD0222D2270ED4E17CED6C77 +565A18155B38795CD27D7001E06EFF2C41C80404884E878B64E60F13A901CEBD +B0AB679183726D2808497859EE701055276F2F0F36763FD9F58FC1190A59B9A2 +65FFD2E0278ACFD8C6C575339D8B459C4DBDCBC4DD985F45AE1C7AD96FBEDD80 +60AF0F7FF0FB1C8960BB4BEA08B115BBB2B3CF7CA09B56622D59CD9403C2B2A4 +4E6A7E47B8CD864C07648D07AB07E8CE9173BB2B9C349A282AB8BA11076E1201 +69CC0C54AE2E893FA5D95E1A9440D9F991E29CAA259220DE5F3B99AC86DF417C +0F50FC176CE4A0DC9EE549D2FA86D80629225D51F289674963CC78D11F8F7406 +85E67DD88CCC905FD02C0C7125D7F7C2029114E399489DCE1490EEE5DD8BDD16 +BCCF12ABA0D8E5D016874943E64EE48A0CF3B544662F1C107F8E75F32FBCB827 +6B905EC3F579BE9AAE714BCA85FE11E8B6E29DCE0044AB28A9175B0CF183A0F9 +A43D9742DD8E1AF097D3450F83D97855265B9F612D8A1C6165C339F0CE092652 +F3843DF0A898EA13374098110F461C42A17A10F73127ACA85EEBD115225B3FCD +870CCF74E7103E305AD55C8D77B528000001B2593FEFCBE9014AACC6E83581FE +E0B3C455B02970E509EC1C54120688DACB24517BAD30395B4261D3E266C55FC8 +5CA30725C79DA01BA71EAB826745A22DD24AAAA048039BEFC549538CCE9A4F3B +75A50AF2F15BADC785E37D65A772D919482362A3E7A0EF75B61461CFBCD6AE1A +7941F680FF7A0BD04182C21CAEF966A52DD4CCFCC22420CA5433D148A0D88EF6 +32AD0BF5CA6F3E031670EAD28609AB31E3EF73A4DC62C984CB953274C53F4F9F +165ADAFCBACDAC894C0523646AC25509E65DDBC032E798EC31CE2608F1D89B9B +3413911202DF9C0B291BCA78895AC01F4523C7FA4174E2747032E38B32716E23 +00A6F1EC49633898D4EEB694DA03E2E68E607DBEEFA851F685D6EA3F242140B0 +FE1C632CAEE6E741B9AD5D1D51C0D7D6DADEFD3C084E152F8D3341C3ACF52469 +256FE1C5C7ADDA51B355DF0CF42604C9840D6C01EDD1F5022BE5B15E1DB2420F +44DE5B6E7D1CA024F1DA52AAE5F2B3E080B95D6B65914F1A8D7D6B235ACBE85E +61493A5EB7C06CE2C3CE32A42D9508AF914D4ECA8EBFBAE318E6692DDB02C811 +DBD168004760E33BE0DACC8A5E77D7850795B7FBFFDD85A7A12DA088E0D04CE8 +5946CCDCD41C221A1E9729DDD097218CB4783DE0AE30E333EF00A8AD42DA7C06 +BD3BD7716C10EE6F801D3928277AA87225AA33E8141A47FD9BDD64FB6D29C60B +F91DF1B8BBF9154811DE01AA799F5B9B1683A380429550192C09F052F027CCC1 +D42CC5B2E0C4A0FCE424D50AB5B82ACB7A9B1C7838722D3DC7E84A84BCB67061 +B204E8D1715A8EDDAD4EB4EFC2973EB418666C7F57580278514A6C5D0869AF3C +0CB1D99BD5FE72A665380ED04AC4BD8379A1D5B2894B82B8A5EC319302DDF62B +ACDEE383614D564D8FB8A7C6E6D1FC5C5B70C893ECCB540540C23EFCB7BFA574 +10D7C828495FFE4D7FEC9FF1F727F9CB0EFE9536989601F746CAD0EC97778E96 +D62380591A4B2F38CF1CD42A62B1DF45C760753E0E4AFEA5FB90309D412BBBC8 +6A1FE55FAF842BCD90BAD6D491061BCA6D8E589675B9418723FC18D3FAB84CEB +4956C5868435D6DEE4D4F9172BF165C0C22BACE30A0E10B54D49B04AB0FA95C9 +921E11B6F12913966E2488EBD830CCB05F02AEA26A0E87C98ECC85660BA28C1E +F9C2E577F087D8A844537008C8AED065EEF36CC3A5FBDACC6756EEECA8356873 +47EB1F955743F051D9FA4F51AAB900F7A8F656BD967FA52CDAE022EDB5BA2673 +C775BA4A6FAFAA1243CEEEA4414A1B2ECEF3B40BA6262135301CC62A355331FA +1EB4009CFFE5CFC9DF8391D9BC92BF3E666A3B22696C567F6680ED5C4B5829B4 +8A6EF11B93D084AAF2DCE69B39BA46F28131C0B45EFA3BE521822CF75A528640 +661CCAF1B95560682208D24203D6DA466A4C4260AB717BB1656BA8846C4DD7C2 +5E8A48DE389DF43DE66BAA55789B20360D143F7D89F5A7906DCED9F51F8F18F5 +F1C5B170B883F7C389FE4F935D9EBB68F3EA8DF84E501C1F280F8849BC476181 +7950935420C6CB6C7FC4A470966C7762FDAB91FBA0D6DCF03CE97660B3F9E054 +A63216C80E878E319CDAC223EAD23BC143A921C6619B7E522362D6F37F5EEC98 +F7CB040FE694AB48051612955CCF098578AD99B26736D99E3792508507625070 +12881AB347B1ED8F489D4FCA2966944CBE0F62174E2B76E613EE541E940E8C49 +92AE79B2FA6FD6F5B16CA72F10CAB2A322A217C316E4B4CB99E888987BA0658C +358EEDC1D85BA4486B479E2A2E6030786CF13889278949EE21B21D8F023B2CD1 +901FD514EFE94982A0C1AD2BD1C98E19848A4E36F4039EE0F4687FCD9C65EDE0 +5CD331D4BAA14998B24C0ABEB19CCEEB98611BA87F7BC01CCBD1AC749DECD76C +6D3BAE9B89AE22653BE4482ACD59A35DD0DBE43406E57AC36C5307AF81CB00E0 +3E545F943565D0D925513E85041C16651313564518F604AD60C7F24B14DB7C25 +34D8E4C5A0121FA194AC14E86AAA4E14305F6948C6998B3ACF67CA8BF1B12744 +5E7EE111CA04335F78DCFC440E9A99AB34E60F9EFCBB233A9D20458DA9405D56 +57264169160682DDA15B1B19A2C599C1671D0702D3AEF14B2645C6500C07A7C2 +D4B95437F1EE7D8D0DA247F54D4E68399487CB01F031B63760511FCD2858F1BD +AA7DDF5F3D0E4CDACAFBCA0610BF6DFCAF0046DA73542D5AF1E8EA8015D76A07 +7382A7B4F7419DBCE79A551D7A7CD12B1A8AB09174E5A3548BB56C0BCF4A87ED +18B7B5A9B8375AD8535785C2DB59FE934A4BA33E8112C6FAA92CC683CE765D24 +6E6152964086CFD1A6CE9191D1C59521E98CCAAA407F093AF076F250AE02E0A8 +2835EF3FAF19B53EAB419E2677E1A58C742BE93A55D2E6FFB71144BABABA674C +B972E811BF7857D3BDB809C0F23A51FFFF2E9160FBE2ACE2793EC2A381210CA9 +BFB1BA5F1576584EDFA3E904EF4A208350866A1CA232E6521018F245F33A9FBC +BD3B09FACEBAB6CCE610CBDA6170F0D16E477CC664BD4FBEFAC52A887A1FEE93 +C0143336EF77A46748F464F1403791CF0EAE32CD4DDB4F298A17E9EAF1885666 +4E467059DEFEF575A9E0C4AFE7A3BE402CF79B2D02B79C42B06684CE5875A9DB +DB64C03D668BB381B816A6F9813B2F5E2CBC194B93791F3BE0832AAA705D51F8 +1C0AE8829D844D5A1C5B9BE2519C921C6614D5DFF978A762B6D2F974B29AB353 +94166E26F6D86CBA714E47F84FF0A0CDF672271AF9E2AF7E2E8B743D7EE30E15 +C165FA7EE181ABED7981579A2D9999EAA208C7C8B33B9C6F95FD586CBD9354A8 +3B390D280A7D8FF96CE8A5C8F91DF9935F5A684133534C99A5918781F1B26C17 +E2436EE11DB1E3F104F7B3EBACA254B1FCE4B01FDE4183805ACB425FD8B46CC8 +04C1270FB3055101BB95EDF6E1D076A2A7FD3C2F97BC65802962E7EC127FB969 +C07E70F4D2F53AB08970C61BC6795CC95499F1A2C4BF9446FC4B65B123F81A0B +60C6488F593594E6296844C0959E0AB0C386CC76E769C7D325E1BE46926DDDE5 +1EFFCC709F7998ABCF24DD1865D7C60C6527D0B06A4B50725D1C3384EB164111 +70D637D76C3E3EF63D0057B1A0F970EAE0613F3B94B025C1CB733A4BAE995E99 +3C1D5B00419B2AEC1300C1FC9A9E98F5AD5B92F11A90E07D32E8D6BD040E78F1 +48FFE3D337EE827CF632351057B0C568A3413ED28343E0F3029F76DFAC3C738E +90B243F7D6039F6115845EE2EF471336C4D50FC48BC09EE001879FEA9B5BCEC0 +72EEC9FFE66C377390A5651677AEED0E1AE6800C495709B66C7F5FFC9974BF9E +9DABFD11A00F87FC7861180133E09A718D7685953600600A669247AA8F25C483 +0C72735CEEDF3BF9BFA88C178994AF71A16D84630B0FA21369F5AFAF22527409 +3DF33589BC9C61041C8AF4879CEAA373523D99C34801809EF4160416A13F5D38 +14C0B9B4C95B5E7CFE6E70D61A8C847819A9D2AF78C329DC67C123E45E2E81B9 +A0EADF7B66B5D7524E6DC225BFF4364BA9DE24CBDE57667D694D6628D7841AAE +49008D71ED25B845FD19B440E6AF9B5F140558AEFB89546BBF3B434E8ECCD005 +E8311C43B54F523A04B12D9B68400A6433AF4A8BF56A6E9EB36827DD1A5AC4BB +724636815C3149AE97E24C03D9B7DF5F88343F26A7335F47265201ACEB998AD2 +AB922BDCA39EC2036EC2721EC4B4180257C931237635B0C395A73C0441C202DB +9955C439043F04AF3125BB2FD696884E3FED05EDF1F5303D6BD60325CCED537C +0995E73E9F2B962FE6B8816C5A68FCD4D325A6865FC7D57A992EDBD05FB6E92C +C9725682A0CDC3214BD57988D001A5F62FD8A7C180C4F699A6EF7A804DC3863E +DD7A20181CFBE117109A793F1EFBD99392E400F3DDD6C64BE64BA05FF710E605 +7D564C9BB7F666CFAE8076F2E4209DB688CD864BB58965B33CC7AD08A076FDF0 +3CE533959C33732D444D4ABCD35C73B6CDD1CD70CF072BFB175A0B5476B062B5 +3A637FC14D8DFD7C44DCBDC78EA108BCC4C8E094C4EEC35C9A399850BAAEC9C1 +C73E525076AB7EB6F5388ECD2962F7BC6137E78CBABD857C035EC03272BD12EE +46692B841ABA2A1DCFCE4DD3D5E6883917D06659A523E0D3E3227516FCBE9AEB +7F28DFF0707E0AD6BB92A9210EAD45F69A1ECA248D2883FEDFE8C52F75A73B7B +9C7F07C4AA92537A2E9CE45F39FDEEA6C9FF6CA915E3D0AC4FC67BC6F0AFD108 +4810D67B320ADB50D4D37AD0C27A7564F6FAF3E6DB1CFC47CF9DA097AA269A80 +947043CBA10D93FFC7033C60A672C9D3F3999222D57492A97D5A4D10D99E437E +0C0289A1BAA29D449B2C17C24D780E68354D874CEA9EA4E02FE0583A18C0667D +4FEAB0CF5286FE487C95C969ED1CAECDD9F9BF5EC8A36C864190C73473C33162 +20296752CEBD6EB43144764E6FA12F60EA605290CCC3C69994BF0780A0BD9257 +A09FB9A9D3A5272C9FE2DAAB7975A5DCBD78A67E4F981E4EF224986C110F472E +F86E07EEB1B2B8325D4DF7E4751215C7DEB987CC9662B92590889D64EA31A1CA +55701D52590B3BAB4F0EA40D32CE6F98D6193BB6F843FD6FFEDFCD9C2CEA3A18 +917842BE0C2248B22D5AD817421748C36B4A10B6E65BED5686FCF26F4BA1C933 +1ADDBA36F99AD0F880DE81FA0C14AE93074C0D2F32AE2197ED43E3490C0A8FFA +0D747D1622CFA8CCBD48E8DC112A1743AF9C7BCA93E5B5696C46A27A8815B167 +BF2896574824B20D9C1CADF443982E8B8ADF1F705AD3FD030478AA79D12DEA5D +F5E3E9C309D9F3F360525044503A563F06AE33FC380C3DA0E0EACA854B23D030 +11897C208EFB2EFA86EE596420DE71B3ECCFDF3678888606031FDD301429AC82 +92CD38D8DE1C888EEEBAEFF6E5C9AFD6B2F8FB8B283E68EF1E12AEC79FA23D02 +908DDB7755C11E7DD339A1F2AB6AFCC27FBE797D03D01DFBEDB1460274C8BDBB +57A48FF118324F231274183E0C00064893021BC8F3B52C7E784881A31D913F17 +19675260415F19D5CDBE742FA47668A6C3870553E3FA0CFE56CCF589767DDD20 +D4540E734169D2E1E1E979F74369EEFD66777BC54361CFF22291B76CE36FC987 +D78E9A4D17C75B8DB9740B72859A51B65E0985F1280983F224684E7300191D62 +D8248056727303B6FC6CB175EC5C6E372180995A44680EB012A97AF3B770BADB +40FB89E4D1A48C46B1F56250382AFE36A674B92D132A56F5929260CDE410A744 +40E8B4262891CD7EB6CAF8DCBD3C58B46A5F0E9494651A2DF23EA1E3C80A2ABA +0665C9562DE3719F15473F9138C66CC24BE1DD07C961F7F64E638496911F4FAA +84BD95000B76D644EA13B94A73A1C41E1B08ED9A978AFF4BBF6567ECCB823D2F +5FF935156F79A00BB188BCD617B6FB2541339E4CB82D196BA067DCFF9DC6D401 +3114E16A003D4722FAAD466AC7F0F932ACCBA5A7BCD038DF0C39DEE32E0CE33E +16D59F60B06DC9561B40E328F8CFFA55042FE1C52BFD8A3273CBB02044CD01B1 +029A457EB8C8AD1CB1901140CCC5E8389416DCB7639D7D0A608F20ED96CAAC89 +F73DCB332055DBD161936E6A1EFB24CDBEB8AA69BFC7E2C4AA083B55D431235D +21B65636385C41EFA278C440D24743FD2ADA13B62D53E7235A54760771C50DD3 +608ABA221A0724063C839E96306FF87344532D03EE2BC70A223CB6FA74964687 +82CC44EC76EBC8404A42644852197569B1711946ADF595E8A6C7789C7D8720B8 +371059305ED1ADE8B01C494FC1342154916EAEBE3F7732B595A840C7A0363839 +0977D1EB502C15D6FE8A368B398C4BD7977914B072DF30C4BD7DEF9EAB7AB5B7 +0327D5AE95CD10F79DD6844BA1CADED35FDFCB17B8C28D55EBCDF54FB943B39F +0F9E98494B1654B1CA280350A03A9ECA8B00B59BF0D7015EF79C48A13662B7B8 +0547E2E3DAEDC268822F6DE7CD6F14AF71F7E546E12B4E11AFAADC34AEE5BDF7 +1E90DA341B6CD373009C6E774B0916787F637F6EA5AACC162582F1D10187FC56 +39349AB0AF7665252B5403E67686DF0973104F5B193D8CC9F673B3D9176A4B8C +9C31382EBD5C1979493FAE6EF2056A346F656EFA5B31922C434BBFB892EFE8C0 +6230451A3F26B98DD8E62ED4757460B1F0F5C813901F351A93A7E11758798965 +EBDB3A22144A7782238284780A9263B561FF7F1CCAA4D24DD2F37B177FD24EC2 +B372252825D66DBA7941B096D85BAFFA5C2B9F8AA4A31A30AEF5273FCE05F36A +75AC322BBC88C6B7D11CFD48D6D70408C664145D81130A2445D643E7118C6FB8 +48A01EECC93A45D37FAB6680D32FDF09E25481E18C388241D5ED823EE6FFEAA0 +90BA7638DE302486DD4F682CBCB33871FDCE16B67B158816960B52E75A1C28AA +F4C27D521AFD7E74A51CFDE38340A368ACC89DE2FAD37E34F3858A5C2DC7BAFF +F4CE85374EA40E25E959A9B74834DECBBFF9FAE1F39FDD5D0E8863D71D27CF04 +4AF357E77B565F5EA577466FD4138A5516E4624C7214E2BEDF1BB484D3425BD9 +ED34FD792F2F2B9BBB40FEA9D0056FDDBAE1CCC72FC101AC94859A9AAF2E37E2 +39BA606FEB4689E4E04642B70E58DDE5DA6608E318A70E24B6C7B88DD7E5BA52 +8FBE8B99BA85C5444FAFA046574C9160A0A920DB544419993BC4A1E9703A3D85 +A97827D2AF45C8379398A4D2A9DCE175DE7008A138BAE08B4B9A6B52D73D1B24 +6787C31875B04E35112F6A8AF5A2F8AE9155A80C36C6E8EA83642397717383F1 +EA877B01DFBAE379529D16D1E0CCCA4B8C8B94F979251914B958F0713859605E +6DD76A27705012B089059F9490AB4238107EF9AE1A556CFE69360AE47F66AD68 +CB48D08CB5AEE83A3A9D77121D2A599746E7B7C839B4C5CDB41EA0ADF56A1375 +8BB21918F49B70AC01273EF2C388F118806FAE2743E1DB3164F4D5F7893ABA6C +B5C122C9290394F2A216261845738E66B7650C8CEEAD7452BF6AFAF54C8EBDBF +DA5876569BE294EEE5B54F23ABACEE7FD554998C84B6450BDD689A10FC20845D +89F972F368648CB8CF864FF6648AF21FAB210BF101BFDB3B354C6659E761EEEA +31892585C32A18FBE8E4883D9D5CC48D84EA2F9FDB73638E10CAE3F75C3D9E57 +6810FD5239352AF7DC7DDB3704CA7EC8FA4FA3EE75FDBBE9AF058FFA17A32A17 +AA578E1A1708E8CB257CA968EEB34140804C224B2FC49643E5B3A3F7CC5E6C75 +6EA9BFD9FF9067675CF025636875588F8C7CA7E41654D7D3BD7A388B8F517686 +4DD89A12B204251AD96E3FBB73B5BEFAE355E5BA81EA1A1F17DC49647224A9CC +0CA44F3D25CF352E184544A710CF6EEEE3E73DDF1366A99B07F47E452623FF61 +B2D94549A80ED356E864D58BC00DE620D39A41C8CC18B5301CE74AE512F6B8A6 +72CD753E7161956C6BD11D375787797BEC1B061237307B0E1E08BBA7A94F422C +A77335BEED64C6AA2E850801FBF083E1DB91776FE9F7C6EFA3278AE93AD6A58A +193AAE6FDF8B15B529E7A5A543609E3CFF4D7CD3A121E0871CFBF0EF1D6E39CD +552A2C1C3160D13787E0F01B2C405B8D46A802F8026C5CA738AADDA72AC9B78F +5957ADCC3BC0A3C0A201089663D1FD6B68E1D2020E83BB50327141534336F1B0 +9B264841F663B1BFD914522EE29C20E22AB6141AE15090302ABAFF5CDBAB2B26 +84F3BEC919127A72C6E1E35A7D69B367D76481231A33AF2FEB9470F35872DE5C +50F82702B55FB3BFE33CB165015BE9F7CB928769DE116F207DFB5F6E1EAE31FD +000D15ED943A1A30C4B4048AE9E7D91BC1B1CD64EC2C24DAF572BEB3F0785AB0 +0D74341DB2D399B39FD5A6EF44DAFA7933EE532E6D4DF024EE9D4D27C88B25C6 +5CBA87237B30917F6F7D7EEC1BCFE774B4D7E0859EF5E07071B58EC2B074B288 +E0FE19979B84ACA7E6E7FA1889DEA18A119E2509CCFCE53D0AFA66020624CED0 +C55C31392AC12110FCB8C81BD289FE7B6330D7A5F9B07994AB79A494F370A732 +94776A8C2B5E557C2F5CE0CA852092F2181C4EC8ACFB01D197AF975B5DA482AC +59BD5C70267E811E80525111D17BCA8D53EE95A843F1000BE05E93F507113ED5 +751D6970485082915C28A673008B4F9398EEE609E483D001296F181783423B9B +7BD78EBBA0CEC7D10F35C23137BF69AF40DEEA478923AC289D554E6837D380F1 +5C3A29F97B3C2EADE26B9926D2B7F83289B723032C1385AA809D0B23B093D4D1 +A0A9087625FB595C017C1B0C1029511225AEBFE7A52AAB58A9BFB740DEC5AA88 +6F02290D37B03E3EB90A821E4BBDCD96A01A7A23FF3BEA2216A41BCFB63AF555 +8A7B9D2211DD290DCDE2A28BC6E1F96048CB9DF02F0471BB1F9E5EBA85E035B6 +3926CE1E1E97DA841FBA83D8C95717A23664FB840AF1DB06D0C47A989BBD5B9C +3E710BAE7A7C5BFEADE6F96EB056E6E702AE6A84814E0043E61B5A03B7A717E2 +54CE4FABD79B8F2CBFE163F05B717A76BE430F459AB5EC6BE60F6EE1BBDCBA1F +5DFCADAEFF23E029C48C33D5844673334FC54EB282C76357D93593A34E099E27 +0D29C79DC8B927266DC6E71FA8B2804AD0D00FDEC01917E7499F2706F6FE9EF5 +EEF6E24581BA11ED1E6405394C85E81E3ECA373279306298078DA538EBDBB62A +62AD89EB75F19A810E7CA9C745A8910129B1DDF7C70B5853B6395871DF37E468 +73C456D0A83C17DF45B7B242A0FD09D2157EBD8B14D4B852766F11962EFD1B0C +BBCD3C398DBBDDB157F80CDA579478A9689C720C026372B13B363CF23BA8D2F0 +0828BBE088A6DF3EE50886D5D79282B82145D5B1FBA13CCABF9C4E94F66A145D +F1BCCE4FDB0AA925E131B4270A48D25365090B70EF23F92ED72E770744059753 +1AC58E87A3A8B5F75C39DAB382E14AA485194E650C3F268EF6DBA0B1A604DDAE +7A151A21CB7D411E77289EF01A99A4332EEADB57372D43230B804C90FB1C08BF +201C3B7ACECA45D6A1DE107A9E231BA5CEB149F40D71C67F1F7ACE8DE1271368 +FB5B447454BD37B8BC43C65F6E8733323AA43FB5F83C4FAAB164C3C2DB7A678B +6454FF9EB6C0A4CB8186B895D1DBF0B5382BBAFBE484C5580CB354DD40AEF365 +E1DE1638E582CFB5C1E58EFDF0D3636C95BCB4DD9573F00AE7149371E0CB0969 +B3EC075D3D7ADF61E79E29F83144CFFBDDEB68DAA5E05D30508EECFC43B8B625 +5B533DCC9149E8770F4EFE85207CFA8C1E50D8B589E090DC84EBEF2360B5F3E4 +479E68779E5A24BB722A37A311F3AA39BB04530A2BDEEECB3BC9FBC889E66949 +797E3BFB3D1A1CE6A62CBB5CF5DB3CF99954F5D0CB096CEF2F5431994738CF1F +97FF3260AD2D89FD819B16E53D59E9E0FDF6B56BAD6E0AAF557EFB6A48D029D8 +F70BA32DFC0779B353A4D476B86CF02A505D40815E2585FD03C07B32B14D2B58 +13BEB639824A1FC04E7336470DE07DADD4D25A641B430DD1336F3A1D0F1DB6D9 +453006DC947ED4F2D528C00BBA98BEBBF855AC8C133B68DD62E292063FCCDC1C +0E390165DF8B85C94DEC13270D824E029046C892495BE1303C44FBD3BB36745C +63ECE2B67D2B303DFC22E2FDD140E40775A99B1A8D11DB4ED1C625540E3CC640 +269F338D8B04A713CC3063EAC34AEA0AF725D31642877042C6DB4E7950DC8C0B +61A322EA288F55B899F0A08F49E22791A2D55BBF89CBF0F1B97317C04216D616 +FCB5D100126A49DD94338D4DC08EAFBE1F08AB6B1792D358C50CFA58B5A66643 +6B801A2267C9843F9C06FD9F137AF780DE55D83F949F1B8CD025475779471377 +B8CF89B2765C0A9C41C186C586629C36C879F3A29D7A9F4E8B8919425F3B0C98 +45CC7A7AAFD70D88E2DE69200ADF0D263951718B2289DFAC4A38311519C07933 +9627F52FBEEE5B9619DE3BAC9B2791BD888B70AFDB75A1999540A1D16E9D4491 +FF5D3E5CE027E7700F1CC85F0BC64ABE5CADF8059C77CDBA5EB1AAD36B1C14DE +1B30ADFDBEA34650116888C6714B1825E56406C96C06B1D37000AED2840743AF +BC2F6F95E7917B32C3A5C7D36FB9F34626C0E61231599C2EE02EAB2DE0136081 +48A65E57FEDC0664DD2934ED21FC98BD568B4DD7BD55A251D16D2CB99C53C96C +0A44BEB44D9714F33CEE323B0ACE7923AD307A8D3B0CE768240F0E8C15C2693A +70BBBD740B3C410DAEFC933B324A3FFAF31C3D03516A6EEA22D2EAEF4D607FEA +4E865D7F6A47EC9034D23464715127986B704A08EA781C5DC9096EA7A95F611F +AEE6BF59FC2F3F67B20C70C7B187E0ADDC966BAB1258DC4B7C64E317BC97F2AE +B07D61A535F51DB2C0A058174EA194DA4F0E44326A2BE85E31A81A2D1032BD4E +945838B571BC43768226FD5171F01C24AF9654A8846AB32147D9E6F43F03DE47 +2E515D0A300BDE126FCF69A4C19DC8F13641C89A674E5B299DD875DD0CDADEFC +54FDED84A2946C4992B9EFF20C93AB2EE98837456C5BE2D691E5BFAD21A297C6 +9FE7FCF5F91AFE1546DA4F96E0F437460B044CD9BB2CAB9422FB85C5E131866A +B392515816F305001A0BBA51343572CB7B81356A0B45E33BC7BDF0F507F1A316 +BC9F6563A5BE869CEB87DE1051F1BE6AD6F267AC18B6A8289215D968BD467A24 +1F5F5233230CDE952ACF0B776D919520E70DBD5E1D5DF82C89DFAB421F98FB62 +8CCA29D0D223FAB23AA37B3609D1E15ADB7F680CB67097444672C9347E47E230 +B7A8E5D4FBC1C05DACD6CE17006D2150F6D378459E4BEDF9CFF363E564D63353 +C2C609C19DAF27C7DE9A91AF2F0664ECE84CF7A8C288F94EC8033A9176FABB14 +2B41009D02B6DC09CF9DEFE893386E3CD5E7331A35F481E18BE9CBB04951C4FF +7F08F5A49566BD7142D20E1A42C875A0EF12892F404BBB128174F8979852151B +E67D2D84151BF68E9C6427BC362CADFE532EDEAB49BCE2E5009030151BE5D2B3 +CEFE4F215E91DCE7D407FB57BD0FA8BED720E20E65FF4CC5BA32C867A1F9DCB3 +EAD136D0F7767485A604CC97D47A2320560D95E9315D04D72BDF9DA3F9E4836D +1D24ED2D707DF128810F218425FCEA314852DD80D48BD08963976ACFB9C44CD2 +BAC78BEDE35470512463B5C6E877BA3AA4749680D05FA3959A0B2ECE7171F1EA +9B963122A1A72DFC9E6FEC7E699A4C6BD742E3D4D570877231AF25FC17F598B6 +3777595305CAABA3696ECFCC725EB41E222403D84DA710D690C155978D93F389 +0F49E87EF135D19682BD2A2EA6FDF7CD3A2BEB6C087643ECB69252BB8678B21C +33F85002D1C82BC7066BFA02EA5E7D671D6450E5297BC91B2121BF46DF58892B +14D581DBF322E89E6BF24C6532CBA0C3897DC13C907EFA52142A018CA820A079 +52D7541D59D864C597D7ED9B9714A4422BCFE03AEE1EF4B6B565B40FF1EB4BCC +ADD77668A46FA7CFAC18AFD4B92C8F76806F81A818663A4DA845DF15F6A2DA70 +67F165013514D26B51D958A57EEBA06114DA17B3A930FF23B0DEC464C8D2F915 +68700C34E684DECC3639BFAC26B22E277B1AF59112FC783B887F37A730766AD3 +F50CFBAC08E0B4050C1434241EDB33BDB3F97E1CDA67721899E4A7EF1DBB3E3D +4AA90E615D06A805EFD26EB78A6F9FFC12E53D5E0FF49909F41E69D10C308EAE +707F729147F4D375E461690B9DA00A94CCAEF8C039B1F6A911A2AFFDE3C954FF +DA1FDC3C137433AD11A357F011594CCD9D1EEF0B976378F8CAF292E67662EF17 +AB786E90392DA9618E9D8DCF87C6C51C3B7371207C66D0B692FE7C290C0B51C9 +EE8B2670B63946EEB7FB9A7F66CD72EF1F890301173FFCE6B8FFED59895DAC93 +EDF39170D6D906FD2A462A1D2A85C1F19D77EBBC4CBAADAF49CE9462F23E1329 +8CD5B445800973B978A460921E8825014983943BCAA4D1019AB6627925B03E4D +DD70D0A1B8694A0D47DE8DF8B89D079C9C14C6B804058B43B39780847D746616 +52ACC4AAFCF918C3D3135F7B82A38162BFBD112D581157A19DA30ACB74502FE4 +40D7EDC6EBCD9BB458F2668D727CBF2E53A9F0121F62678D113EAAB36C24F3FB +831ED9761D907C5DCED84E6A9B242B041D26BB25A88136470F112DA1459657AC +AF399CE6FF71A7CD29E40A19C2503D08372C2A770118ADFFD821159C067B98AE +1170DBDA9AC3B3C31CEE8F6DC8B20C27295F362B52F1E309146EE975F9B41094 +BF28580EEF0DD850CE543A5D369676D7BB9AF94FBECDE2AE3F09848107BB9A89 +97EF34E79201D422622E36F78FA2B80E678FB154FE84D934FA7C8D9AA1A1AAF3 +33D0A40D2DCE86DE6380BF617ADE6C6E5C97A3F056BB062A9097293FDC0BD70B +987E357AD571971CFF01E913BBC1D05F0A7205F1ABAF516E38C02CF41DBD399C +E4B4648049569DE6DE43170DDF91A4BA23E398F82EB411194147528312F04F35 +9B8A36719E8CB6094DF7E2A14B1632CBDB2B1966B59CA5A778ABBBD66FD53571 +CD8B761D8BA11C0BFFA71C58FEF39ABA40A4D01974403D5076CB826315A24ED7 +3D207C528FAFB65B4861BF8AD2B53C748B0A4B34E57771278FC24E98AD52F34E +04AA492C9815EBE676781D40239B3FB7E462DA782BFE82C1C43BD937D6C260B3 +29D6DF902006EA10A63DC2090C9484C6234AB78A45957087E65F0F8979D5A6DB +C952E8721133F3D88316977789EB8CFCEE5085FA4741AA4090B920CE7849F9CD +4DB2FCC872CAC7AF5FEF0257B4A0AD781B6B4F634F370F7F61DBF8BB66578E34 +4DF73EFC1C23CA11C7A6C336BAF988B37E55C20F4138A7B5D8FBDBFC70BE5D37 +AF6F7E6958E062C6344C14249958E8566571B9C79ECC +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/l049036t.pfa b/ogclient/lib/fonts/l049036t.pfa new file mode 100644 index 0000000..df2250f --- /dev/null +++ b/ogclient/lib/fonts/l049036t.pfa @@ -0,0 +1,1613 @@ +%!PS-AdobeFont-1.0: LuxiSerif-BoldOblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Bold Oblique) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Bold) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSerif-BoldOblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-221 -211 1138 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078994 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E237CD60D35F0FD179FB +1219B605B80A36CDE0BAAFFA5D97DF370655785FB236544DF1E7A00B7E8AA37F +C23C6BDAB4E3F9BC5EE40602171D028423D88D16F57168C9631090E451FA196B +8B446947EE6233FF652CF41C03ACCD60952FE06298CA4E207FAAA38F192D2D8E +E528AD9B647706997722D73A9203CF7377792AE5780299EB8DBF2C0CBE5E1572 +982D74F81C32E627DF120AE53A1BFC783FAA74AEE3920D208F8AF826AE684F6D +CA41AED94655B6A9E0D60C34C318C7E76F5A52F373693DF3ABC03A72E8DB5E66 +CF5DAD37C9CB9EE42DA592D9DB876C6E62DAC02F1B126C59D1703D3A685C617B +F5A8FD9A630D8746ACEA7B41E9DBD4C47B30163DE05B34AAC3337965660BAA0B +CC2BAFFC0F3446E268C9BB27CE08456549C2DFD8812DAF308024973D7C38E8D1 +30C198D253136F3478334600EBF8C0196ACA6E350182B387FCFEB559F62ADD64 +D9B3C78A9832FA4EB023B07719B4D8A173274C388446C99C63F7C6313DCE4118 +8D2127184AFC17D5651DC1F2B7A763052FDDE142C714658009F5407B20F1D30D +FC978A2FBD8CCE7523A2A62EAF38D6485FD62C13D444DCEC7DBC79CF9258B502 +67CE30E2032F03718CACA3A28F71B941923F52B6FC4EE1731D9BCDEB5F456423 +52BC72B85C92AA0A7EEB5E7BD6470B7FF3C9A68EB479102C6F790F27266B67A8 +59AD2EB5CF5A20B6A39274BAF31E02E1C487F59EA0AD622DD509438C43E7F935 +C21E6FE887846ADF1D3071DB5C1A7868787F92F46D6AB19D56CCC3742B646AEA +2D24DDA6E00C6EC895103BBFB6D67B0C902E176F84AED3A0999C2C99A65F1A64 +A362CFD2DB6885F1EF150D828BA5C685A3A0183963102723AAC166BEBF18CF62 +D0C26D613CA8AF740822182523B26060E255124B1F9C70511B9D338A6AE2D837 +2492D7A67A371CD3E757A8130F8FC9D6B13BFF690257B7D41C012CDEFF5BFCAB +B511D068C9183BC0983E09341008C9717C20DE26E61CF7CA45E59433E58FE1B7 +C6884418C26663988693B995BF1EE3842EFC3E33976C988D6CD724D3B81A942C +2B0BB08F65A08BF768138C8A750A892DDAEF502823D4D6706CCC05451652D896 +38C09DB8EABA368FCF8AAC4E482942DD3D784D9C57675577F107594C0D2E07EA +36553A9785E0FE26534DF886F2B5A906018C48F1A0CFAB7E373476BCF98E7CDD +18A11D8F2FD16699FAEC22754E53EE9C972FF4A3901F94E58E23823A78F40439 +B709D90F48348B8B8E78569C77326B684E4DE7AE9192877076BE05932E8D3FCF +DA09EAADBDDBA35290E3FBC6AF2FDBD178AC051807027BABD733B54DA6E6ADA8 +350D3FF874041333CF88705C96F55CBE46A4D6DB68FFD447996A124603F3E29D +4673137D87A8B33A430F18ECA5DE4ACCF88AA16294BD9A3A98C5081C2112E3A9 +FC7C9FBB704BAD222B07D0D7E9F52BFB316992C7ED6AA618163D2268734D7B22 +3991A8C256CC17087E844BB8FB806A66B9EBA4DCD9FE4DDA936CC61229492253 +2922EDB5B12AEF0F77D693C51D616EA252BF6CF515C5CC737495F33CA41D9F8E +34572232EB422CFDAB03BC194E42DC669948235E0BDA96E50A3B78FD24A8F859 +61B560D847BE4A63E97358DECFA6BE9B86E026176DFDAFB470D57AAD803FBD38 +714DC319655DDAF6BF3E085819C456BCA734BC479A22BB6E8C9FE3E747A5E47E +0FD73B4AF5A80AC230DCB02818AF68A251998462E6DE10AB7FCA5FED041B32A8 +382B480F30400DB936DE1665D9D7592110AACF516FD0F68026AFC371458BACD7 +BB9F0A7C5B399DF9E7B02249526C555137B5A2B8BD3FC2A5055ACF2A983C54FC +5D4862F8867C39DF18824D457F222918FACD5EFE01982CEB5E75643EB7C61F77 +5ACFF22D54B58EB7F0BB14210CBB8A8B562B188E04164F46DCD915E428BA6137 +08420B83F3ABEE130C92EBE3A7C55FE7AAA126F2E9D450350F6331D4FCA8554D +2A0D48865FFB3E0CB9E97847D82F8EA1218B5DF5A9966DF6B7622A0BC06531C2 +54F0589991E10C95A5D1CD2BF64E248D3BFDF25F88A405E95FA254D2E4B70160 +9C8153A5504EE22BFB83C771616044B55E0B9676CB234B0054EB8B3B073AAD22 +B7E7A89C15A80E3344ADCAB949955641E1785EAB2D62B843DDFE4D5974FB03A2 +8E9CD8E6B10A98611126BCACF813843C92AC35DAFB9F14055EEC42E01028431F +2456598FD76BB66F1309B1DA0F7077D86BDCFBC6B628B895011B8D74935F5419 +8902392C6D35EC29225CDC7D49712D1D9FDD66C24C5340C1E05646631902B92C +516F67ECD172F882CDCFE2F957E4F6395D79E9F08E0EF64C7FC0B3118E3BFBA4 +FB752619779BC1645969558BA349F8868B3A3CAB48ACA78FC8BBF33198F03AFF +3862063C0BD73AA486316E28F948E31B89CEA0A0F9F10311483EC0676F597458 +8943317514B3B0D47274A499CBA6F76415D22ABF9AF5AE9A164D3444BD3A3CBA +17682AED8A11DEE04EF6965C07849C06970829560793B5E422DD801B4AD94CCE +AB73562530310B79FCD6F2F93182C05C509C0B2163F9F24A7BD06DED8D50C955 +1C9012158313AA8A548B79D495DAEDFC651D4A6110B98A88047A6893FFFCF00F +03D6848F15412C9200C5AA0525397806CEBF448F92E9EB110EBAF17CB2856DC7 +8C22DA7487B9E55B6DF23F345CB478689FB8522A1FEB34EE58AD8A4805B7CABB +58EA56D1FCCEF7869901EA0229908C74EDE80E2CD07B0E33D17389A434C54E07 +039EC17E27A56847CFE4FA04D65AF20650F8C58D24745FFD76F443843B7ACF94 +01528C2F046C2F8598C36367E9FD009B2B73F52AD9DCB49DF76DF74597AF9AE7 +B43E4988D7CAA34ED694CF0D3F67B9C21680DFD8E925FD4DC6E4458939C1F5A1 +1F0465493E0B8DD3F63034813F557C9B321E9265F4467E1BE3070101675A40E2 +36AF9F1D37162176B4B950A37EB1EFA3642B9E8AE6D5CC77DDBC6E5C0A172BC8 +4EDAD45A7502ACE290A9AB4D56E32245F7AF75D540485611CC79C813CCC61FCE +E7C773F74E26BBCF5EAFC476AB031A04C1BEEEFC881843AC2438988CDDE7CF53 +C18FD1A9E1F1EC264DC2484BDF4867933422A75E0EAAD1AD55A408D81ACF6AC5 +D93D12EED180D56666BFF3479B7EFF185E39D4296C7C87F56A6C1B6B0A99DCCD +F7032FF77585F4A1A22DDF46171A5A0C0601758F64CC10DD4EE4EAB0BCD05753 +76ED93EA50B176B36196DFDF5345E4BC934D9B6CF7ACAAE77A9B0BC66E460402 +87AC5F4CF69ABEC05B6DB517FE1059002B95E4245297272E552E6DFBAE1663E6 +1C37C0C90916037DB040BCE0BC1FCAF881461E0B5960997AB582942DF119F00A +A58EF89B9CA549913721521F259B135EFA1C7E1A5F87550621E31BC7DB07FD3A +85F024F2943F95D66503E8498D4B7038FD7F938950FF22310D1B49E61E395426 +B20B952D57983BF33A707C794895B082DBB035705F8DAE75EDD15A2F75C9DC04 +91A59777B2953CB4A1C8575C4FDC2DECE1737E9ABAF62637B0FB6471378E942F +1141977AFC8032A13866589CDB087995F9F78EFF5713572E6F3F7FE4467E8313 +44D994CA7AE974124CA93BD83C9E8451C956BAF993F279AD7044ABBE7BB826A0 +2757ABB1135A21C9DDD3781A589F9252C51452458CB5C94C4FCD53D3ECCA36EE +263C1ADECAAA22CCF6CE9DB923000BD7FA6B6B12032ED49A469BDE95C5903420 +CF275F03D3637C7A65A872F462F19C6EB25EE8F4E7A49C528806EF56ABF5468E +BDFFAA111A3B5E5DC9C46340DB0563DEC9250C603439F656ECC6F8A5E344BCEC +DAE02EE7F349175C35D8F8CA7715BEEBCD45D2980B707B3B2EE44FFF846C8B8B +8A7C02A56DAF16192B3823283E9876E8079FA3EE07BC1EB30AD14DA63B80DAC8 +D1311AA303A9D56859A4169C20C7F279B7527741D44DC6AB31A2A048C2CCD362 +BAB152807E3F73A621579EAA2FA7EB2BD45AD89E170D4AFFE6ED94A395965E32 +09C600D9AF322B870B34068FB0706EAB341FEEA668275183D38C641A98EC2BB3 +0E6827F3A764DAF871DBF5D27D254FD78E5F99432C405E92178941EE9B1999AC +3BC5E2D10BE76BC555C63167A0408A69A3B37A4D263204F6401A3AFF49398862 +C685EEB99C79D42A7859211B6C447462C894150469429C7E5315F575F8AAA66F +C2DADD013A304894E50EAEE124C86E1AE87AF200C8DEA35027ECD102071F8FD8 +F3EFCE1A14AF5910C6CF5A5A8DC5F09A18285D0384717E4FA0232443D12130C4 +EBAFACCEB4A8AC281F8B4CB5136740A15E7184A2BE166ADD3B307E918D326769 +F99E923C3834EDBFAAA5A2BBA1CE952CC01804000E1BF0A4C80B35E0474FC985 +3F852E8AF570C542ECF37F4CBB940E278FD2AD1249144457ADED44359A90D3BC +9022B23C46F25C74D22A61BA69F1BBDB4C5AEAC64AE8B6AE975822C08E416810 +310EA856B8FF8D17BC79AEB42808ACDDA673BE0BCE980C6A98CD5A0455A1A234 +BDD559C0B31A798D088BA0AD425DCD904E8C3013C388770DC9D03B6249E8A4ED +A49B3A2EB11723B0D6FAC3BDE453E1F8DD6531BA42B6359F47A61B5762AFCDC6 +5AF5130792FE98C5FC024B1DA4887095413C6FBA16EE59F1C8CC43A9FCA40344 +2ED9359597B991AFD2D94BADCE1E96B676A5910BE322CA3BED9120062740AF03 +7DCCF5793E87E7C05D95C4F65466C2D1867518BBD4CA2CEF4F6299E122C2EF6F +9301DE754D842D32BF4FF0C61001FA3929564A3935FF2C291B7E3B4425E9A0B8 +BD326EB5926EA0AC4FAC6D34F2A0715A68D38EAD576CB1FD774C30F0CDF2643B +2DFDBE58F38F0589ADDB6BCA49E1280F5219F45B0FFCD574ECC51BCC8625B1D0 +8A710B796113F13B8115B3EE0267F25C595CDEC16A6E7A016436A5AC93783EBB +443AF8DD342F6BD1F58C315973F9FE0B6D85C50D9BAC10A456CC83D8577032BC +FFEDC71049EBC829D6A419DCC22ED0A3A2E230101CEDC64C67E4F442E36AFEC4 +EFD6AF959D4341CDD27830F364E85DEDEC69E1D375AEEA5805D45B4507275AC3 +95575B9C83CF9529A9050997D5235ACCEB4E79BC37515C7C0205D8C9B827A5F0 +04E21177207379699BDA9805FBC4CF0A9B6AEB09E1E21DCC693E985DDD79C45F +A33322BF56FF7B91ECAED3E0E9C92729CE6894815DB7FF4C61E9F74AEFEBFCF4 +56FAB1681DD80EBE8D418B6B7BAAADF34E87EB5CD4AA2FFDA2E4F238035FC14F +6239B152EF3232277E9AC710AAE11C310DFB02BA392A026C661EBA5669F33C22 +B850CC57351F9EF0D6237C36753FE0A63ABE7C6E11798C9CEB6602D8E33724D6 +CF700E1A9D09D6973C99EB520C3034F8B38EFD43FF71313950C1D44565EBB204 +A614DB50EBC153B59A366BC76F01E5C3E5B8BC09D2B68EA6C154F72D54AA4733 +A4FF05C6A82B0ACE40AC70343FC83133797AE8C6DBF3BE1F6E441D6BF809C71B +D392A0CC32F1625D07869950F857E4E2B3B9979131C4432C44D8F6EFE9D01F80 +86D60FE915A474EAD180B21A24FCE69D511C011A8A6A39DF30F87FB2EFBB376B +7CFB1EDA2447181948D01C49F3795ABCD52344B58ADC8A8DA554849C97E5ED97 +E42F571E5F2D060FFB9E1B012FDD38B53C3AA5172E280B319BB3AC47E4BAF2A1 +4F891DF034AAA2F2AECCCD8C23182B5535DAC76C151F7718C39D549B6610DCE6 +9E154606D564619BE796F85050CBCF8EAB4EABF17FFF4ED07A3BAD022C523621 +DE7FEE8172910DD5448D8F7456637A17ABE96218AA7B1665D361B7FE4427BA75 +8F9193B7B9A52D4AD3405B7DFB1FC79D235DDF354D321B293E5C269616A10E58 +722A50BB356379CE744B3839E7822455300AACB0AD45EC8761F560B8D1073C9A +5BD7ED1BEE741282A92AF285BE80C6C65B2448E0A4A359851945AFFC91C9E578 +2C12D27B51BB4500CFB533051D055E7EE47BCC23D8F8DEE569A1FBE3419539F0 +8FA5CE4D8612AD404EB7E83D4E4A547C2C347D217979AC48E5C081CDE3671319 +7DB36C69C2A31B0F633EBC046CFE969448FF2A253CAC2B4FFDC14FC152BF83E5 +E517DE19FE1BDFFB7A3F276293E761C3B39AD3610E442AA58A7C25BE41C05141 +AC500ECB657643CB128E8AE36F4B37E8EF15CFEB1F8E3D334519A3609CDFAC3D +362933B5A55559CC28DFA89182F89B2FD5013E08A2C583FCFF9CC53A2D5CD13B +1C9786D1F39A02106517DD191D9E5169363FB01ED68C4CC13CD9CC257A2EE802 +C9E40E5C0BE5E65982AA15FBF0F04118EBE9DF64C279AFDFB1197AF62F6E18C2 +3E95A13D6B6737C4579B24E33A0A14DC922EC4C7202A30A06A4596547A791955 +B3902033D6047AD6E44A90FAE4333D0891684A9B1895585D9E91985026F72BE9 +C216009AF01806AB043E51DA494644D61AD7379C7F93F17AD0F164D794DD82B9 +077118A0426BF267C12997090821C5E01202BE01A1BA5CF130557EAF84E2AEC0 +C83C03CBE7F14C63884CDF25E5248C45799F080D281E3F9FD932063E7EEDE22F +0B2F478FF72D54E68FDBF6AF5A8BF8EE06EF6C30A5E061D14A512075A873AE5B +5DF02D81390DD9597AA8E902459BDBE5A6A61BA2E6CEC7C563DEDB2BC950B307 +CF22643E985DE1D7CA84881D19CAE2A205FA5CDE59420353F3EF23FDBF391FB7 +38CE81218276B2960C3923B47EB52A8429A50E28A607D5242312ECA5536916E1 +8624CD1482AF8AD52857F38E4E689F774B55C3946C2012635B911205A760F77C +8093298C200E220697E6F3D210C88B3E46F2B2E931952D42F51FB5426DEDE03A +05004DDA3604F38CD65473D13877822CF615C299308395A213B5D666EE06B0F6 +C1ACC344BC1037B5C95D78BD424522F051CA1C03F9FD11EA355206230ADB90B8 +E274770F8DDCDA7C3910FB07CC477B04205A6434DB34E69F3B69EEA2ED6FBD58 +C6CA944822B44062ED2F5B0AE86AA5F40E0B171D158CA1A57E5C3240A1A721C9 +92AEBF5D4075D78D772E1364F9BB631CBE1086D4EEE58E6B4D6BFDD7581D2075 +EC0FF81EC590A69AB9EA6C38D91A3D763A1A85D9588741BB657A7CE31A9D8C55 +9AA83C9DD8321EAB44CA22827230A11FBC9CB12992204FD936401DCF9A71D190 +C9C7EFF35FA97ED1EA2DA3584CDF3D66C545AE37E2403C3945DFDFC3F08A6C76 +C6E3F7C9238492D7022B904C846CAF40F0D571A39FB05B7F359C869081274F4F +3174CCD65045AFA181235224859AC3B5A708301033D0DD449D0F3315C59EDF26 +94B3AF8F8FCAD728C18B55A9A4283D0A257DE2C36F2066A31EB0E401C34A5861 +1E4DD5C81288469B625BDE1B3734804F726005071BED0BC518D0A1CB8C45CF5E +01E344C48668D815DF1B3087DA5B063E9C6D1232D3337DF90E71D10A306211F8 +A360053722E799E182D22CE80F4B0A7E118806F6D99B4456C539DF049BAF6694 +A9EFC7B847D0C45BF90DEA76CC68BFF4F733D246715976AC5BC56AEEBF3783F1 +15A79B960289C4BE778BB63F8C46237A84D9881B40B9562E460ED08BC770F6B8 +97A739BC2A060A76F1F1280EB07487F42EDC0C9510388CFC618A311A3987F4F3 +B464489A974B2F8C2375351E70C95BE7A7E25777D78FE245195F9920C14688F2 +05F350B893547D619300D36C58A8FA419F310A38AEE84A714BC8D0ADC2166D13 +80BBCA7400C6AF8687E0F9690EE1B71538EA3534E43F035B24532305E07133AA +F43680AAC2EBE60674F991234FCA58A01A4BCD9486599B2AB70FC48E0533CA06 +C2DF386E46617AF45A810EB56C610168AC4AED960EC344187934EAFC3E1FA3EF +F5010ACD71A7A902FF0DD4CC41107189041A71DE11A6BFA37CB035F1C14B8161 +9D70DB95AF381AFB800C99D56A366ABC81B4B463DAB84ADFA5272FFEFB1DC405 +11A92D7CEB4D54CC1C682E3BE2C0C2E671DF073A96B9DBF014588B663BA73768 +A7C3D4D546D8B59BF7447DA941A52D295B8002E5F1C31ACA441F6F55DF69F515 +19212E4BA25B340E9740499986A387E9B379F341B3A2B4C0D0E79379C6A2606F +744E13D2E415FCE686A2DA21195AC7431C9AD3F4165C7635DFAEFE5ECCAE5372 +BF7B107E6363B7C97CABF67A141A2B7ED27B415D2CD730FA62CA1C8900C673EC +373485615ECAA7C4C7A187BA60AE6B4E6200EEBC4F421689E5578A29F16719AB +154C41FAB20E9D262C2BFFC9F6C6394CB841E9AF84A48376BBB637EF6BF45330 +346CAEE1700DCBA3C1E0F2E75340B6FBA1721AB007CA80EBE1E66E785B2C9568 +E570A8101996903075E3E9816741BAD2A30EB96430A5710348109270BA7CE860 +C227023C77730D5CE4D23CE0D48707AA4C314D6E065EF55B5E0A83ED927D68A9 +0421AD3A6BB10F27DCB22DAFA033F15BBD985E2468490DCCBE677EE57061184C +73F22395323818EFB3D0906537F0881FEA258E8ABA6F89758F21A47AB72A79E6 +59C9F0737C23D76F95B80BEF922C62502C533ECD80C618C1814F112EBD7616F5 +D9D42153E5DF0B4F844B66F5985A345E26E93C259D36FED6C9751BFDCC82A233 +6FA4A91926D768AB042278F2142C51997A27CC08DCE7985FDECC2F99C25F5F04 +C48C0C4F532256581490B27931E1A472C7895E90520ACC252E55709DCEB8D255 +45C0B5526F339CACFD8A94A1D58958B239FAB094424412FB699FB5A036BEFBA0 +572D5738B2167771B29D3ACD92667C57B07D7AFC1AB676E600823FEC83003E43 +49F0D3F7CBCA7D7BD764C70247299783EAE00B03C09ED5A6330F1516600BA52D +E1832F3268D38396776D36166E26BCA5252A59D3A9DE42A84969092761BBDACF +6C5E83A69C03B53B10FCF95EF76F91F7A8EDE6E450CE253F373FB9382FC84BC7 +833F464126EFBD42A486308AD1A30680F7C423EBE1597FE234E510FB4F2F0F65 +E6CDCA4D2C5BF86E743A39BBE78D0E4A3D56B04588EB457D96629CE5AE95F268 +87E3B49D66C2BDDDD27E9F1986BBB313E33110F099C9F176D188B7594C965EAF +AA4FEDAFCC7BC9E7BAD2E1C983D596844DFE6F321EE15F109150CAA6DCDA513B +78D6D3B8260041367FA44C058C3EF84A37DDDDDEFFD35AB50664F7DD9C856D37 +D5C6569718DB3A6C869C9DE6257E06ADAFE2FED0A544F5023A4452AF73771AF3 +06B737395348ACCBDC9662EA92616D197226E424520F68D38E80537926DE94CF +13DCCB715204C3DDD69DE77BB00334FD3086F8B961FD7FCE4B565BA524C8EDEA +84EB69E3400A075561A19AC5D2AC8786A68EBFAC2860ADF804AC53BDA205AF27 +37D47F05DF295430915591AFCA00CFC65B428CB41EBD97F229F171C8995887F9 +8F99C0B45CFA0787C9B23EC73EEE85AF1ABCCA5DCADC9124A41671ADD3C33BC4 +2BF955421C3D563B1741C5BEC1F28D2011FC1FFECA792B31C208A9A02C950397 +74ED4874D55F2EC1655102672BF26012D747D46563CAD7C0BCF5D194B0EFBE73 +71C1D68F3AB20B63D083F45945E1C5B21C0FBA4FD11597548062C967CCCDF68F +6578505652468F71B803C9A4DE8093A4D0FE29646D7F8737E565EAA3D9F6846F +5AFAACD20B44F58F143E8CBF9C236938CFEA98EC19AC08DFB881F560A2ABA6C3 +45E6E8499338F1ECC0B7AACA6634485468C0BBED3F99D6A304BB5968EF8345B6 +AC1683C7E9D4EA6BDA3BB7D4EE9E819325D0BD1672B65C0D213DD9B988476936 +7948106DB8A26C2F6A511B771CD57462181CFA3B086CBB508270443C48EF7EEB +7C7F0CAB757FE1A1E62C26C079AD2DF5C2A1DDC919F59D7AFEF92DA0B1B3A34E +9B142C92E8EC6A370DB976E3D112458AB0580EB79E6253D01E59A015278698D6 +38684DCCFE13D476679E1CE55D565D5521684B4BE62D0CFD7FB961989C011660 +E79F7A051AA75872D48629E5A1598D29E8AE353757DACDC027C8408E3E027B8C +2304B2F54CA64306776A2A82017F5C96BAE8DC9D7867857D772DC9F4AB8B45EF +F3CDF3D58B91557E6D39CAEBAA8F3D81023C344B2471128BBB0632FC6F05E9C4 +95D16C636DB9858D1359FB36B301929881F09E5F29B0C2D5D13D4E598E1C086E +70141315351EC33C15AEF4FD6519FFD5352CED5E5A878FBA466F1C0252660F79 +29B1428E9D0467FE26A3E1D22B7B47EE8929F87D906923BCB7192DD94E22DE58 +A49D4BAFF8DEF1078DFC049BB16420F6F968B2F6AE8CF8FFC65DB1AB9A6EE972 +C89FC33EDF480124696DE3FC43BCD111108C9FE08482A3BEC819FF71917C5118 +B38040F48D74E224B495B90667A7A678A9F55DEA4F70953B38F97FB2D3EA9B9A +6E5B19CC035DCCEA31C8FACF62CFFE9DC86DE87815BBF5B7F9D4EC7322C3E658 +BDCE94C84A4D747531AF85676C5405242865E9086E77FD8C51C1A5984C9D8C1C +7B29952094DC47D9062C89BB7AE2279B1B92DE43BFC54C8D236E546D0A3B9B24 +A143F5B47A70FDC724F45AB788E3FD7228D4991B7AB0DAC1588F290FA1884EDD +5A895972F0E76446925A73E616C93E0DA74520929A053B730EE97CAE5FC04749 +18F8E2B87C210C799CB0AB651AD24D9749A2D41DAD03E94DC779312BFB90883E +3628A822946BF8F81023F2C0B3DEF58D73B11493D6482FEB44DB9BAE0FFC52E9 +0BC04A6E50FEEE540E4E8C8BACDEDF32A3F09FADF274150134AB3D62AE0A711B +0B30F3419615E7F6DC430C13E976246B470440E759117045A4CF8CCFDD9F0E2F +E1EF1170FA6B80D192C34F01E472F8CA8978EF531C13D5BC6571F7C3196584E9 +06ED32F98FCF35B50BD2C4DEEC9AF9475B79FFB95024D3ECAB0522B19786E083 +5B86E984FF076AA82F707048BAEF3106EDA9317B42AC8D3CBAF0B9E21D0AB84C +957D20D768C903AC512A947DA6119F151C1247B23CB1B52B7DCB17C5A6A5205C +265B78795B1D00B361778BC7351787B9ABC1CE5E5A58D0B7EA5EEDC3EC71B1B5 +BEE69671010F9F22067E99B01575464E9F34574E1BB7464644968547382BE1B7 +891A84149F9A5F42CC21478EAEDC5567A0D430A296EAB205368B068AE66A1B0A +78A65BD2C23B4039CEEEA7903B1CB11E476C1384A332FFB687F661A368001C71 +722E27B624DA1939FADBB5BC7086FDA5094001B50895C70159DA51BA742D540C +2216A1C5BD55E2FEF4E71561612C02809C69C21A072F46FBEDD83935A9C850D8 +EBDA855336501173E29F765129023E86D29D6CB0F8BFEA01229DE5369B143A5A +090B7315D36169A8E4704BDF62F93B949662CD574211CC8CEB59C02E1A061A44 +0CF5A59A05BF9D4E71F5FE55772FF327119B585635EA460B3AEE5965DE139421 +BF947637683431ED8EA28BF1FD43F8AAAD8FF22669DE5C867E388A30D0677B2A +8168BF8243E3E7D7FE9DEEF929735B1708FD0685C575E96A621EBE96EA15C3BB +888D276E8923D2F7C946B11D5E7AA212219475D90CA4114C879783235D636B29 +02E43A52803BF524F84603DA0D27C8A0EB4B3B84C66A0F270A49A0BF6E5148EC +EF7C6BB67144ED456ADFF8EE21371FD8DEDDEDFA42B0738DB69E1BE864CBD632 +EBED5E9C457FBF80B2D1DADF31A63C86144A1AAE498162AC4DC9E04329792111 +C631C12CDB2281987C5F9E12625B8331C3355490C0139A306F7C0E8D9B3FD198 +D77A0D2980599D64829F5B509C5E88AC242BF2B0D6EABC04E8A25CE812352A6C +8A5EA0335322C561559BD1172211A0A5F5B70A8711B2C277E668A47C1E254047 +298EA350947CB275DBC85B531DEB739A78C504FE2D679AD7D3811237D5349D6B +454A0B44051150C0DDA3728510A321DD25BBFCC7CED07D88298C30225632C5E6 +627DB302E9AC30AE902B82DF0ABC2CDDB55EBE98D1213C397780931F58854D9B +C355F7EE7BC6F526A5EEA043FAE8BD740D2713BCB352811DB18A253291A8D465 +EBD45B9E21447B5670D47815E7D04C00EA15AB089EE92683E6242C8948A3FC16 +50BB0BADA960157D20E3AD217C5DA1563A86FCFDDE2D274692A0EE47D41227C9 +1188D534C7F42858D0087713B9829DB97B31EDC82BD05AFAD4B4CEEB3554CDF5 +56F79FC410FD577693706CEA58F300F8158EAEC1ACDD7B0F2DEC83EFCF850B45 +40A00794BDAD3C43777EC8C9CCAB480D931093495BD55F39BC6D33DFF3ADA062 +EE643B9B84086693BB70A7AC9B290586403B43F4F930894FC0A3A4C9133E84D2 +7A144EE9A60A6EE3AA5076ED1BDE8B56AAB7AC243E8317343FC83ED2AB33D0BC +6A130EE2087C0534521954E77121B2F34D00BD2C6D7B29E6B96D15CB1BE9D144 +6771C1CC311CDE1337E2122076006C84659022B235D597551AE45287BE7CA489 +1B0CCADE0B548A0850D29B6C1F38ECC3E534E37848032818CEB1962A7AD21DFC +F4083B75C000F0A5D0FD565F1737AEFAEA0083F3066B540E93EA4C32BDC0D5C9 +4ACE4E5131877B46D2BAA122680620903552D738E225E3D89D41A391D7F492DE +617FEBB74C31F3193275F2E456E705C0126654C36C9243135BED4ADBE26B01C9 +7366ACD0DF11A3C4DF0771007B319462E4396B8F644D67A5DAD7F747B9FBE502 +02D24645EF82BCFAB980F80933ED035D6E31549503126EC31B8D205EE4EBBF82 +56CC51748F061A4322593ADBFCDA9A704BE5FBEB0E733D025B4BD81056ED0A03 +4EA60DC8B3853A5AA4B3708F0A9786AABE370627C32A82E588C76F8DC6D99CF5 +ADBE29DA22EE31311031FD37408FBB7C160C2F9895DD2F2E40D498D25BB3FD71 +A28B9524619B60E7696833F73B5A20078A6330A62456C15EA5EF488094536156 +4ED0B6A26E6EADAAFE761BB8494E33B4D87820961BB5E38BC45055C5921BFBBA +665611136B7400F3271A865138B1BDD4E6FC6871A4E9AA7E447DA991C4A894B6 +B3D2A552639CCC2EAD55A6367B500F7793F9DA332D5AA3B6A7DDC903B1E5C223 +A5843D031413ABDA79FC810E408C352A0FAD6401F612F78FE6601A45497F67A0 +E4047A1953BD656FBF31FF37789EDB624977D7D7EBD79DFB50EEC4EA3F89CBA1 +B88E2BB110C1BF48EFC58539F2E1B36A5B9CE6891B0DA32BF6CEE62DA5B9DAA9 +B9D6AE4D088A536F7C4AD89D079C9E4866073EEFC46C46C77255420F786D6AE3 +A8F397CA9C3DEE47594C109B794AC7E43001E6CFC374C415E62095C7FB05151D +21675170547234C3B3EE974FE929C1FB4BB2405C28B844C82004F533F4BC6FFE +F62BB9F778F81A3B28C7D26527ED751763B8FCD7EC02F565533433E11C1869A1 +E427023B1041B70252EF1C68758BC8EDC2046266EE0518264C8CA97D6996924C +0EDB3446A9A7CB910CD8A2AEB08B1E35F71F9CE07773F3D2FBACB7D9A4FADEE5 +3B51F1468EFE1E9C7B51DE91BCB86733D77B9D11828F6ADD68F72B405C41CACC +98076A626DB8F7AF19B919834DCE03391B7274D1B1D9838791D8276DF09401F5 +B130C9E744BCDB98D02A68BD1D860A54D8E6564144688C0B43BF0D56917A2AB2 +989EFA8F599520F2B19EF6D8D92138EEB8854546DB669CF14CD5ADC9C8F01DA8 +20F8C5D21D0617FCDC8B1A7D7BF6D880AA2B410A98CCC8F96AB191EE1F64C9E1 +C9AF753B04757489881B2D16459B7EF2F612E658C62C32CE17767209C5FE65DD +38D736E96F29CF8F8B6AB28FE3D6F6F48FC05FDA95BE564B762B456DC4B86575 +014BA2B041B05FFCE349DA27064514CFCE004DB9E05F6C1E516B00A948EAD74C +D2F1CEC1E150F5533B662CFCD8AD232C2666401BFB7679DC7530204AAF2FD7CB +8114E3A2530EAB6F7C75EC5982B8816C7AEE1D69E567C0934EAAEA4B09604564 +B2F5416576945A152EFD7B85B0D1F53D4431524AEF0CCA43EE250C6FB1A6AFE8 +F92C3B67EF9DBD5F8739B064DD4826CDCDA3673FC41C521ABD1DE23EB0700C50 +3D202646191A6B031483AAA52BB73D98F17B361B8DF51B984EAE2FFE0B1F4D5F +DBCA6362C76813086B3296D1AC387BDFAC50164525AD253A46F52792316FB237 +45EE6E4B3B4C56C2420AD3DE65421E5A90D4DA797599905558B336C01856BF9A +F77354104FD93CB2E90B0E5D615A2E2CA4F12C3501D0863396290DD285DAB35E +79A8C8DC6E340A0F32CCBA90FAE28FD3FC95710B0D0C5757D97102EA269A0A10 +652E8B9F9517ACDF09218926563F25B6151D1AA8D79732A403ED88ABFB0E7889 +543FE0D96A0E1245DB8337F8EA21EF2D948C0EE666B4EA53836B33359085AE96 +1709376A742AD8B181DB35FD583EA24A5B43B1294D9A144065767659C9DA490C +29FF12165AE21AB10B49A5FF797E3F079A645648C687ED6F44EFFE79464D5696 +875EEBA4AFB09F3455EC2E0122A7E91DBF828906BC05E6DA2ED9D9BCEE5412C7 +3B6868267C29BE95D732BF9FF6CAF6084159425D3CC6AEDF7E552BAEE821A9CB +1F806C46A138A2C5F6765F015C4C27F6521BAD1A582326333BC11D14F7F5C83D +464109FC2BBA092FD6DB0FFE8C1408856DDA1D6F0A04F831CBBB9BA91D700396 +1F3503C4898EA49E922A556A085B9D50D1493176C9C740FCDDB1A313321B86E1 +E5C5A295BAE5C271D536FBF8B31C95B6F648FAC4DEDA02318904CA443DC63A16 +BFA0CDCA75245A4AE420CD20DD780F2AEA6388F84A8FB42BFF09F9996DCC5844 +FBD0850B5E46824C6C5452E34A39E0A0BFD082E2478E0A0B2AC9253B4326B21A +DF20260F9E9D36004984C074B1419385A1C52B3606B9BFEC246E26EAF79C9964 +C34DA47CFF84D27DD210251C784578B1BEE835AA614695107A4CB67298C47886 +9FE67FEFBEAD028894151095F8D728CBE7AA066B03518E2EF6A0180D050F04FB +12E9E7F3859A223303139EFA0CC71138FB807BD816B8D83AD3AF3B3F42B73F61 +F95A647C354C384BA91BDB1F80B1D756FA5C13BC4AF763EECCA28D2627C81EBE +A34C6BDD97B0F3514F9B1A0E3A30D2B07CABB15EB3EE9E3F530019F5C749D314 +5CA78408F38325F93B97F5856445395F7C3D8B98AB1F11358F2CF97DD723ECB4 +7D9BE2DFC6C0E44AB939F235A1CBC300015BB9DDDF9A0AC9B7EB1EADE2E947DB +BEEA69328ADA6C95EECB9FE886ADF89287461853571EBB307395E2058B2478F4 +703779C0516D8F56B021437EA62B26E57E6A023AEFBC3C263A0DE6F365BD527C +531072303C7E6230266C34FD2C0041839B11D2ECB7274E7C30CC584C8C591F5F +C8950B9A2CC207711B3045796B08C8A43D7E580E8089D0B63E4EFD0F188F26A5 +8EBF298E304C8C104E150950AAC8D6E2EC9F7926921FAD5ECEBC0FBA4E0862DE +4E1E1754BA60C7C98DEFCEB707F12CC44947007D3D645F586A132A3A7228B5AA +79081C76C88638543806730012023A16535D0FF1E28E1DED9989E3BED625BB7C +E4C52162FD31C0540D5D73AA9EC196D29D39192BA969E221FF021DC69F379B3D +06357B828D205E2C4D37DE3B88FECF77B3D533CB93AC8FFC16E8E5822433D678 +931FB87D23452D49ACB5680A3E7C3543D728413168441D4BFAAB9B7833A46023 +D971EAC42B2339992915C854A53C62B68F867122956DE5272FBE60C742B6E5E7 +C8821F723450B4579DAB198FAE97E500ACC86D78FD7248876ABF21B761B9E2A1 +7380FED4EFD79B47D3E1A31A7FE648301DD9F7F4F58784DF0B54AFF457AB34C2 +A493CCF0F735C1C9F3203E59348D53D65FBDB6E24B552DB3CF8509DF3930F641 +E6FCDB4A9F970C1FA4CF1A0F4717338835895255A1E3737A588A5EFFB8FCE73D +7EB9C0908DFFA40F8723A9319A39548E8CA5533794F50F3B6AD6BA01D48A9929 +65261FE523320846602F4FBF5B4375D70D8BDB9A559867CAD2D047A8680B83DB +0DD38FDFBACF3678E77CDAE128A19812625CC1CFA9BACE39E6CAFBE28098C380 +17225012670F963056EBBB2748634B343C0677B09C0ED1D4B33DEA7F07B03E87 +99E229A8364F326D8F80ED4A9095181FCBDE9BC4FA0104B28F9F8CE994F1B6F4 +1316B3B768C81CF7C38BD55AC7820BE48F949730167DE7AB0B62365A9F5A4E0B +2ECFD6F04D3652B9C1BDA8176AF1146B91789BC2BE3664D906134D7723EA4EA5 +6DEBE02A75EE93E24583B1217A61521946F7BB69C2371151D2D44E3888C50FC9 +E49FA7705BD8800AE067630191AEBB2E78C4E3CFD62DE90683910856B7FA74C9 +312EFBC58534DA5656239BBA9E102D33D2E76DD8D170350C83663EFA6D07C076 +451AC8F5F034F69855DF60EC8A88BE7913502E562FB9B64FEDA4447AE1BF6F04 +1F366A5FD382142BA4CBBC451B5470EF3D51B57EAF791499A140BB10FA70A06A +E0B18701CCFCCFA2DCBF92BB59376D462F9D59FE114D3538880F32B7F4140E13 +F386343F0C4074277153D61460AC6A392A0EE67F11C411D68E50C9CD2BC171E2 +E4E73A231FA6311B3D0062FA73B5F5563C0357EE52FA4B5CAA9B5EFB20617661 +9EEC6C742BEF43DB2CC2626A76D03FB70C959A24F269E1FE81AEBE54D4BFCB6F +A56B6B8BDFD3E69788A32BA3072F373DD1AA6787704CB0F7EC710FEB08A82825 +50859DD1DDE613BED2F9F0891F5533816ED8137CBB3D7EE93D723EBBB3EB841D +A4EB010D20B870CC5C2C95E722E77C639B189CD44285870666494C2C00639F56 +D91A6C2A45F4C45D7D904F1799EBC44720410E1A0E32F100FED8D696A7031FEF +CF56C7774E4E568050487F1F78A86C968F82579D9EBEF42C500B23BA00A7099E +275C9BAD491D22755B542FEAC98C1B1C42EABA3A39C1C312767820D264438F67 +1A65E314A633CF3E2FAD7F83DEADCF62117446FF4A4B099A183342916F8BF57F +A3D0BF61D2DC3726FCDD3A4F7C723DAAAA40CA0D68460DC2D990B12C405FF111 +4F5B07278ABC51A7DFE18ED1596AAE6208F189D8CBBB50AB6577E2A635205E16 +F78C97714783DB67D467EDD804B062FA8463BCA130D5A0727BDA392C22FD94A2 +25C674C3B4435BF4436432249C48347B7382CAFFCEF88BEDAA614435269DF406 +B9D5011315265A9525B4919218D9B932F3043B3B2B4287F04F12DE69080CBB54 +A11A3BF8D59EDA74DD90EAC521976C7882CD8571E764B4FC566E3E08B1E7A1C0 +7F16BD8A1C1E4677415E9547DED46BC202BC1FEC8741D71E285B87F8C982EFD5 +C201155719E4AC66CBDC95012913031421A36455AEEAD59F24134B2A78C93812 +12B1826E250AB1987B31C6A20129A2EB557BC85FFCD1DD36C678B5F39388E7C4 +1D4B7BD640ED5EFEFE063C9D91308850548BEC011A487B9DDD5E4F032CE0F094 +D548572784220981B268A932922A79B9B8C16FBE12E6D7EA801EDAE92079407E +00312D7BACBEB5C45B62BE9532A4C81D39658A187E1EA1F4C16624A6AD1A56CE +5077F62EDEF7E3A07084B37731A237C746E6D89167EE41C278D2865055685107 +CF73CE1A574A47AB40792DD4A970204B8498C154CA1CBC5A23F270D44742EB64 +5A7A385B37BE67CC817019EA16BA310A19CC3AA2A5DCA5C010B76D985D4524A6 +3643492A26A249FF85944150DAA4343B30D77D7639F4076350D43D7E33C677CC +8DDC7FC142D1D376E98C8E2AA0310287D51168F29612C4C421293E23C5F120E5 +268BC1932C4F9DD29CBBCC08734EFE71678BCB5CDE4B5BCD8635F3009B631D3B +C2F00A38CF023D09AF6A832A32C7E78F1FB9232FB9AA5FAC477BEB54561F25A4 +BE1C23C41A6B1A8F49D4057050D846A50960E64246361DF2B1F829CAE8A81556 +5DF1055F9DA935D01D8071914AC2A89223C7F14AD4C36512B62BDE4FB699BDD3 +FBDC8628B9430467A2B79C4225F060419087B0CF614464F93AF3165A5366250F +72778A1C0BBEAEA0DB639FD61F5680B6A2903EA8FD9F056F77A68D10B2C7B4B7 +C772FBE5D7E3DA169257F2B6F9E3A1F2ADACBC3A10E1A47E26A58B07101B541C +E72012DEA2E1603BBC157C589791FD069E7EAD5EC41061B8034D22FF0EA7EA79 +87139328F4D74C18721E4773F841DF72B3BD044A7FF1EAC934BFDAB2ACCD0395 +B8635FF543B94CA4151C672719E68D1540047B466EDDA89D3FB44E2D75602F6A +639D9F99EF31C5B04299DB9F3B51A574DDB9346BFF5C978F81246026991D38CA +899CAC9A9E91BE864BAA95C082E6A89C7514FB6518341AAD562C3902A8EA5C9F +413CB578D6712BF142F643FCADEF165E7ADCA15AFEA3A330CEAAECD393DCC91A +75989E3B6D937101C344F859D53534B5CE55BBDE02C4DA5FD1B8350AA76A887A +875ACAF58CFB7B1E755FD2011FEAF1DFE43928AC8E01C09B272503DFBD21F115 +2577A6C990FCFC9A42B020EFDA2E199613B0552B7765928F2EB3C4D7ED2B4D6E +978CB8E88E1DDF4E61A50F34CCACA8DCBCDBB2CB1C747F70071ECFA1F31C9656 +22D28A21D48AA970CA6DB819810006C3037D4637E26B9760F7BB016EB4FE8125 +0B9D841ECE3D5A3704D93F448663998DE3FC8EBFB76CDCB79454DEF45256CD3A +2D180C96F89882EAB95A97E5EE721959642B176298959B934141D00B6C7CF1A3 +B1CB3A19E4BE96C990CF77832C665E6F0828867F3859879D83FF45FC5C4489C2 +00A8FDF187E6723B23F760AFDFBA6A4830611C4755DCCCC43F8DECD983275642 +1BF5B6230D3123380AAD3D3A8A9A60F67DDE88254A13CF536A93B326329A4EB7 +BD5CBCFA582DAFF013E2A4F2A909A6DF1465F8C1DD7649C2222E0DE04BA3FF19 +31A0D71EE85F748F964D6D57EE57DD800F105282409FF2E27A08B059AA17A4B4 +E2D848EBF8C8FC23641E2B517710012ED40350615AEBC5C115D4777117440A73 +C4BE0F4F6D73EF7B35140AD9BBFAFB43FCC0764D82E3AA81F25794DB6ECD7A3A +6B72ADBB483D979591D85D3002AF1B4956F3A7E083BE9D6ACFDF409852500ECD +886D3C4E51169ECECE6297959B78B813586F2075701F256137C9F92399F3E5B1 +82FF6E10B5C4CE5078FA4A71841D9C3C01AD81A4F9D80969AD249DDF63FD9505 +6B152B2AF6D4CFFAE20C111756204BD7BBDDA81A9E3BF3024D31C90D1CBB4B7B +BF83B8C033868615017CFDF7B2FB2DA13A7D65834652CF604DBF9412366D4823 +36486DEB84980FD65C2875281D0AFDFA70EE5011118D1CEFC78FC4D4AE20AD45 +AE7E74346B8897BD97630888CDAB0461B781997541F1C74E240623B1A7FB26FB +C4FE22401B8A4A6239B10D9E897191D185270FC4F2DC7ED13E73F9B0A1F3F0D4 +31C739380EDC495827B4E81D7DCCF8BE6D384ABAEB6447B65FF319284F0DAA6F +5ED58695628330CE770F62CA16248B1E0FB657214115DC760182CF062D97CA40 +BC683C923DF12BF39E725FAC6411359FD71DFB26E8FBDBECA81E03CDAA5FEC26 +07A5A8F6C925582E6C516FEA20488E24CD42A5DFD29DA96E6C9A12EC451D18DD +9464DFE4FD5AB577FC667905D9BF08C7083850C3B3EC67DB8CAA3695DF32C256 +D54ED4483A53AD3AD376590BD1BEC8C5AD3E253B3EC721F4A71CAA6C906742D0 +AB1A043660F7679433F7354CF1A36E59B40ADFF929F87B03B951D1393F50387A +B3E7185DD68CEE7C232EF44B747356D3C81D0A018CA61E48EFCDA4EFC203AEA2 +838B2885F7B626512C631538384A58C478AFCD28F4FEA7FE149D850182A270B8 +D899D8CF3730998BD517CA64AB0A9E40956D4755D455F5A56BE4DE02EBC29B49 +7B800445211A9150A9D09F8C285D67876F5C5925E12BF01A464049BC6BE89F5D +807E9BE5B8EEC3E1EAC7CB602C673D0E2C64F79BAC2E963EFBEEDC5E1C6710DA +290407E7C4B81E3B8BA1D40245A1081FD81E2DEFD90944A67EADAF922C269175 +99CFC6962F9409D9BCF1CB785CFC2B59B8E059CD2A184FAEF63A7E4708F82785 +E75B8EADD1C81D68908B09B9FE30E8EDA5AC37E2257D5C689B1AD942FFC30273 +2327B6A7A6F92B6BA207979CE10AEFA56075103807D6BDBE7397A64E9569C36C +CC6AD742DC9D5E935A8E28101A68DA4AB6224BA4544DB47247A30F98B50D7211 +229703CBF5410F964A91FDA6DD4B0A603361C3EE0B65911A79DD7935BDE86032 +44A74B051ED27B31FBE4B501E20076AD67B32A6908D7614CA95B06DD64B01C93 +14D813CE0EDD0F2FDBCFB731995201F07483A8C5ED79C56CFFA3BA2EB734689B +D0BA4DFE2F46E9325A9E7B6EE2FCA7825AF486E0A4606D4A1E6B8C8439AE7AE2 +347BD7656CC4F48DF8EE3074C98C3777E037E8E26C6369008778C331A0601077 +14EB598297507B9F2ED2BDC03C3E29EECADF0F5FFA1225DC5F27CD8EB7D7199E +F496EAC3998FC12515E0E75A7952C6BB951C8E782145F445E917B19413C1F702 +AD9E0180E4941769351F4DED721C0089ADD66BAF9417F5CBD78BB53F12F14CD4 +71BC0BEDD7FDE799A9306D0885FCD40BF15DE837EAB5A40EBB52CB6B4ED299DB +B12A2D1818F135706AE013BE70F3A60057B5A82D661ABAF018DFBDFE65AA8E47 +AC6C8A798D2F3C772C0BCDEF0A9CFB8BC638AA64F95D41715353D25B2143B4D3 +7BF3852091153F5732DEFAB4D4BE6199E13D1D9258142FAA82F3EA57CDE218C1 +41CBC59F5951625C556F6D38557082F300E341B0EF1AF38FBEC6BBF6EBD87FF5 +921FF53B6C78217355B9C1C17216DD5541FCD35123EA68D57904FB1BD7B9A7E7 +3BDC01113118854E5FD8E88712E1C916ADCB543B264D9573D2E96376A03250D5 +700A0CBDC1143FB85B69CD3455E5CAFD7AAF3D2A2154E2E19E9CC8C233AE6E94 +53A24290D61A03F7CD038D15317FDE765000BCE92199B728DF17AE8D540705FC +237F527B4EE8EFA5A870BBC588090A087B108FB0ACFB705103D027DD942D8F7E +CA2293C9C50DC0CDC960139CC4D6384A6BBAAED1D50EC10A261F22EBAFEB2876 +76BFE0D228A14D6DB2524801192D1F0EF49BFAE7667188B4827008D05406539A +1AFE0979DE52C462D998F769FBF62A45552C6CF1B30059B26F3336DF19093DC8 +2C75A5A9022EA3A6A35C35965A96C673FBFEFEBC0EF188EA9B3B31036CA56634 +F7F89E88C7611B6007BCEE35E423B73A63028078FFA84E73490DF2F564423647 +8ED87859266AE96C56883B6AFA0A46AF1BE64F7A07F9B9A8A69BB47B83E904A3 +A6DB8B582311AA9C2A787CBAC2EB5823F6DA66D4CCF5B5016D179BB50D691517 +130D77A7C3205F27D4A15DDB0D2062C486B59C70D0969CA5F00687A0886CADBB +CC06B136064F97A43BEC08811EA53CA13F190FC6F8F07FC498BFE128EBE6881F +1A4913BD395DD85B683FC2A4290C2EA20125ECA194846444811B0F530D16B29A +6CC24D9A7F3BD5888CEF45FB9BA8598B3F5032ECF39E2A1A3CBE122F100C72C5 +071FC086C9739482C8A19195D2CA3D041EC36C93FEFA520E94E01037567F0A57 +4CF1102DCBF9670740C273E2CCDA3553E267EF8ECBF31F1FAC3B1ED824DA935E +9E52E9586ABBE45F3B5A6409C5E779B6A0768AD6323E76606F20F40F401AE6CD +44F2F88CE5DE95B9CA1711A877EE203769B566E263AFD6360F1312A0AB9CB6AF +2546F112C20A703A01AB255739647E46451EFF522204A0CE985A609083F52A1A +9ABD0B01910B4FA3E4FE3A060791E1986BEF81F9150C2AEB6391AE1F09F1D94D +9BEA9ECB59E7E9B116128DE2205D27D2EDDF96FB50F3E1CB742CED4FDAC545E4 +9F5B5BE0A88FE7B227332D171E14DDF89EC0BCECA370EFA73C40EBB1A20FAE8C +C1B7EAE158B5BE22AA16F12952628B2FE8F086ACBC5F778A18E7B67963975550 +735D4CB5ACA7279379D2381BC97D1F2613F79C32742750006973C036BE035C5A +BA17EA7BDB9A8F098B733DBC954574927A16961C2B7DF2D0ECBCF742FFD781DA +3E0A3A1278178426F4592799264BAFDF16CB96EA4D1ABA4D806C9D264095EF6D +1067FDF90690EFCF0146A1E143798F104534FF17AD762F0355DC69F821234018 +A042CDF7D7379DC718E0865FAA8B0C757D0A19498CEA30513FA12003629455AF +B115BC2DBAC68D4937314FE10CBBB96AF8B3F4CB26CFDBA604A7865584AC0763 +BDA317AFC9906AD0B8DCC5A6A88A0B1ED4C6CBDF5F2BB5A5037C1999CCCF507D +AD3F6E4ACDEA803B4104BD05889027E00B027715C1FFD9DE303C2758CC38AA7E +9CC9AEF43DC69027ACE2AC9CB078FE8290FA53D3F6A2AB73EA241E7A53806998 +8ECC1327E41B13C1F5F79A1C963EB00EBAAC27D716206FE780323CA86495C3CD +7EDE7B2A5753E0FD0E0B62960AA8CFEB2823BE0371EBAB60C6FE9F279133E88B +2F2DC40BB446D7C3E955243C55956B7AA576879BE1EC0F2230796408D654A069 +A93FC77990E9C0D437535FCEB32D61DAD9EFAC776FF20A7110E1F3B3C4D89AC9 +759C25536A1604BBC08D52CD8B893A50C0490691960F833E421739B7BF232BE8 +2C53D766D04FF056E6AAFACA416D25696ED97D10175CD63BAAE9510FD1CCD8BD +06A32D6CA296C24AF84692D043E5515C5C261D8C49306AABF81A6D6977EBE74C +51A79CA47EC3017088019301ACAAB074AC3870BBCF2F7A24760CBD344753DB5D +83C3CAB511E2BE890C2EF39DE85FD5778B70C0CCFB18A7717C794488B1D8D1BD +1B23DA8388227ADCF12A251D7202928644FB9F97A97A48CEC170393E8B261E26 +99635A086A8BDE8DFFF1AB3E25F1A6AC7DFB45723AEC5A0DED5769F9AC15A4FF +A951E7D42EB97247257479E3DEE9E695C3D544785B5C1E6BD0B5F4D1619BA7A1 +623A55DAFC29AA4502274386B438F23EF0A56561EC3DFA3F85A1011338B2E5AE +40F075D94A3EF78CE49D514A237A459E4BEAE702222377581FE3A5A6EA51E701 +CDF405444E9CAAB052DEE3E7834DAC8988EC4558E03CD0D9935DAE536CD28ABD +8BF2392B102D2DA4FC0D219DCC8AFCBEFFD823B324C539E5E8B76E006D596C46 +BD79ED7547ED1DA6E352FE2221170EA158E6717C745BF178252CFE4C75801C86 +95074789408C86526E3E872D606DCB4E37B035482471101D8F75CF415BB55E2B +AD747464B5FDF829AAEE09A6823BAE96F66B1452FD4C25A88934F12F448177AD +135818B74EFD6F812A11CD02561938195F7126DDB92455434EB548A5E1B28511 +DC14E3A398F9D8C08F23B2F89370594F0E6544DA432B9FB693F1265AD432CE20 +8123E5AAE03AC7D2C9D6C129B0C3B39CD79F035754854C2ED206791498E26C52 +79BC4C326BA7053582745DA47D6F8231CEADA2547CBDB6BCC2A0858758D65522 +8180BFA16671793B335DC33670B4C7C99BAB013CEB0913B1AA5D0288ED9D527D +FBF2D7F780292D4EEA768D04580A1BF6D292FC886D00009EA6CEDF31D2D22E89 +4382CA2F0FB37686D30898A9EB923F0A181AC58A4A519DA05A5F8C7151F38709 +0831D20D980FCB1B760C636CA2AF619E226DBC0A68741B659D52635E0D1DCE57 +165B0E2ECE8F37B58AFCB15CEF1E23E0E71CEB8AFB3B5E1A59C886486FAAA210 +71B222001AEE2CE52CA68FC3E8ECD1F4692015206665088B3E52E6C33E31590F +17A4E0FCD13A761752BF155A22AA0E1ED55B70BC00793756AAD810A10CA9C4AC +A3804A9C4D27F10EF567F9592731C95E7AAB6F6CFF2E9413036CC9400E00442E +05EDD9B298BFAD4834737E37910B74063BB1E3D5B0CB4CC774FAFECCAD9ACBEF +EAC03D8EF0141885A587B64C83660E0AC8D9B2BE4BB8FDDE306A625DAAC314B7 +B9C359AA51715B2B0DFA7D7F671B1C5EC2B1BB5624D72B7AC0483F7F2837FF52 +2899193863B63E78A39D926940FC71F00FAEFF9751C0CF42A834F186D3549393 +7A052E9CE214054A6889AC95AC408032D305B1CD6C89083763722860F875F4FF +640556DB2E770A449647988FDBA00083BEE2303682B28C8C7BC163777EB51A97 +A20A3F99A01D5B6F2C183048B5DD93A8D445C5DFD41C909B49D23BE41A60F01C +1D6E704C8C5F9D783C224B70E56009569C54D5F64423D3BFF8DAC962FC050128 +965B9870AC96D51CA8420FA8420FD88F6C7B963822BB292F2B00297C40507A70 +2A32271F34B164F772763415FADDBE6ACF6EF3E791E69EB0557AE5693DB0A20B +1DD6536F9D74BCF1C0265A4A88C31106E169732563B2EC5AAB3C0768AE2DBFA6 +4B2C5F7DC339B4BDBE3704DC48633BDBEA8AB3195E9C4677088C47F074D28ED9 +4ED5F03A635888050524C82BAF1087764A217B1E9585C6C38E41A7A26B355130 +9CD809919F9976192C46D2581F984E71B6BE7E626202B45B414A97BB4963E609 +DAA06B99E772BA4C6FA7DCFBB5E2AE2E8E02358DDDA48EDD8B46AD558C1E98FA +D23EFAA66E98B1C49C08BE57FAF9DF8F246DCF7FF9DF21C48DADCE837A503D55 +BA201BDEEB84553DCE5A0C3E2EF0BED804315BB664EC9B8459E09A203AB28903 +9850DB3898EF211CB25C20ADD50EF5439DD13CBFD14000B15424054E0C2147CD +02098784127BB9411E4C96D30C16706DBA484D3C2AEE11D693ABD7079EAD3AB1 +61EED1BDB6CB6FF66B9FF26D4BD79AFBA78FBC53E7F6AA1E103155B980EEAB9C +ABFAF83A91206CC20932DC36910AD39DEB52E5C0539DC99C056A287AE661B13B +1A2DDE0AEEE340A727006033BC6636C743D310130EDF6383747CFEAF9BEF1D60 +8E851A71F212CB203175FC6A58EFF38A833D588A1AE6457E269045C40E432127 +ACA54E03232ADBE5FF45C23E025665F43DF522F20E776163C6B7D069B0EA8D46 +FBE3A12ABCD9F5C249299B57ADEB9B9AB1444F42837B39B1BC6C4026F788CD51 +93E52D681F719ED741C7C9FFE946F665494F17C17501988A509EC377AEB8C87F +8BB6348134BF9806C11669EC6A43DC9B8FD334416DB537D1AC9311E69417CFBC +1565476D77E4C3A1C96FDF49E1F6D62302B571A6FC3037DB9C2ADA5CFF15A110 +83FEFFFC074621E9ABB9C62CC3969B6C0864C41B757F23E189788F0A0BE16026 +D1187D48AA190E42BA6ADF00B80E44AB5512DDD195C376CBE0825343DCA082CC +411E26E3A71EFB7BCFA1B43BCE6F86720E7A0D2A60DA0ECBC4C3A0BF5FE07553 +16EF96247BD1BEDDF29ADEFFFB4B355ACE88CC5D4A37E7D7817B98B2B1E4A524 +C54434CCC39C7A5869BDE8C5D9E3098CA1B65AC57C9D81D1EAF711423A9FB92E +C20F18C80E22E7731C56F60703C6604EDDEF15F234A46F8659C724595980259D +35AA0847B7E96F0D3B3F4D9D1A82E8742CDD1FA2058770AAC4DDA727C506C700 +9A9F93144600628C46B6E5904B7CA98D21F4E08E6804D920AAF68293C4F0666B +1742FA95AA85FBA95037D9FF7E65F6B503D22180437AAEBF65FA8901C1903EC3 +896B213EA46EF7B5541B74F72EFD07C752BFFD26B8746019D131ED8B94E23794 +A5973768AA9FB961394105930FDE07BF0D08218CB985079BA634D8029FE54CE3 +F758E2C8841D7E2D1D8DED3D2D69E437597B28CA971E8161949BF5B71BC1EC15 +910426E7C2855DC776AE87C7482DCDFB994608C0189B7E24E2F16269068812BB +6F1E98EE8DF82468763810DAD7CE08EB0896F7D5342BDE3609522A4D6670016E +A837BAFE7CA0E712D9C68580B5A30E544C25A956EBA242C73DCC40209CC0E557 +D16ECE17D18FEAD279B4143B5F3C69F7F5087D5CCCC6387CE3745FE9FA4FBF24 +A239EE87218BD2933BF6FDCEE282EEB8C709303B35D6A8D9279917E28FFE2CB7 +7F7843C0D4BC1A5A85818F3417B85B416A3EB78C00CB196CA920155690D58079 +33290BE8EF54AC6653D30FAA959DAE3D153426163119BBE5F4D6636AF877D304 +4E74FE984B62E07CD1BEEBF56A26B5B2CFD7E622EC2211DB6368086807F8CEF2 +259FE58C1AD88A982DA8CC8E3656769F2BEDC9B1A1A26985BC3F4AF421DCA42B +2F70334F378D6ED76EDDB59B3B754EBCFB8B35FA47E9DF5CB209BE0518F9E6C7 +22A2A537A3209892448DF436370F0E5DC5E50EC7691C720B26B5027C2FD0DCF6 +BC303E8D72FAC731E2EDC1E2A70C0E51CA0103E7F97727583E65ED760FD724F9 +D318F10A6F16A98574ED667E810224241CE1E674C20EB3DAF738ED6BBD6360F5 +2BE448328D5279BC25C35F2509B2B77BEAADEB4C8F915C73888C953D40417510 +684D630CC51822F84466E3BD89BBE49D4F01D3A8AB9FA1A4A0095A76E95D6D1C +222FA4123029FC4CF44F1E0BBDC820272D681B7540CB096976F01DB1F8F42B59 +1954DFEF62F91CF5D72849B987118BA52928C213EAC75A50B61A7C1BE41B1AB0 +0EC9DE839CB0657A17D9B40BFB7D1A9E101C359E27168A641AC1821760EDE5B3 +53BC6D9643E68F49F87B75AFF41236A9F59F9929BC6BFBD4344A325F5C6929F4 +B1B977F84ECFAD8F885A3D4CA3C8DA38536BB5B76ACBBDA57F882F372EC4220E +1DE5276AB135BC50ACFE5080E281D2243CBCAB5465F18682B09942C56456A432 +7E6C3BFB691FAD4BD032FA4CEF24C1B06CB560AD996AD5C9DD766FD65D3A9C10 +534B84AF27525C7BB98302D952A4469A17F850AA95AC91962AED0C8FD8632BBF +73D29C76285F9733EC29D5B6C7455ABC96BE7F4A3056364A329158F29A1B69DF +AF0BEF221497937A09FAB0C4870C8EFA15303E8DF5B1451805AA50172FB1A797 +02EA9CAE6D6EF65020201A5A0DF800F80C02FF591D1BC9A4E504BA01F48CDE72 +EC8D0FF70B703E749B60A1589B1D80F9E71E8CDA61E7580C12F7F1410353FC3D +0B1604AC55094DD12433E043D958B66E72B718697A209BEAC588407D4F89430C +DF029CC69D52297D801E441FAD734ED519FB78BBF223A60624740CD10AAB1C38 +56534B7525561DD7776393CF031A5B71344809979D150E08BBEBADC84A7E0036 +870490909D120C9614974B2A06D30ACAB28BF9F812889932DEDD470BF2D1874A +106489BE6CE558BCEAB2B0685EE12F7F8099854ACACC27738BEDC39F1034B1DD +08B9D6A0EFE43CE60FB97E9B4C0A2DC5B9B61944ECCBEEA72915C03FD7E467CB +FCB568DD452C729492D0ADB06452F78E8F619A6D4BE8FAC82B3F3BF301830D6D +2773D4E95DA7FD8C38D69AC9BDE1A779AB5B170120F4B8BCAE745FF4F56266B6 +ED9D14509CBD0CC4DF264613B1B021E8029CC0D22F06074E174B635C4C0DD15B +1C2BB2B53CDE374E4E6520D38D8664E9EF753B1E4D7244E071912547E0275504 +C0266420D5F18027CABF3061B054AE9127C7D13007B03C0A4FF7D71ACB26D732 +FD54BD1227C94BB259D8AC8B246F666D3452BC92CF4264664A28C6A744C13AA5 +11BC7801E7956F4E5113500AA535BD7B5225EB693E8A0A8FA7038F789035EAA7 +B5E227C1CB68C3A4AFBB516DABB82592D5FEB58529BED646E3A0E8C0BAFD87EB +CEF8B46FB294B2EBF7720628A3711AF55CDBE85C92A7B0AB3F1820D6568B0FDD +DDFC91A440CADBC88ED53DA9E7C408BFBF59CC87853203E3FF707C55BB314805 +C0E9695DAE783943C37CCC94C7387974A5C88F1B9FE40CCDC5535A48DA86CBF6 +A6A155F451AA39CDF4C010C66ED11E3F4AC9FF5F78721512E8757B77A301400E +6FDEF7FF640B85EB573BE8D3CF834E45B944B22A01DF1F657DBB58A071584A08 +D6943D1E1A712EB23E749BD181C8FDE4C27CA25B9EEFC1BEDE9E99062D83C20B +8CEF0E7E7A7D40983B8C09871B41CA0B3D414E6B503DFEEBEAFB224D1F129914 +67889FBE3BA7C43423D2851045E70369EF98E0FAA1DAD562894C6C93D76B3A20 +B73E4C54E735613973E6E19700ACFF7ECBBDC340EAD2AF295A2F070AC4433E32 +5678B6F710C5545BF2721D3FF8A895F05F7F5D8BA3FA244CCF3EE68544098667 +EF8DCCFA2BE9DE5342D1FEBB4F074A1DAC4CA2DBC82EF2B85E7C1C3E750AFCCA +1FC22A49350D891C052F46D2C04C50BA7260B0B975C0996820BF66F9DD100B26 +1BF9CAA3DAC323CBE5BD11B75020AD3932499ACE1C5350EFEEACD5334252EAF8 +04B2A70F1027AF7D0CADC3AECD739C9CA5653426CE0104D5A1D5D5893EE0B068 +D5F6AC8F6413214052045D650997D30927FC5283F35F6ABCB5BC05D92A241271 +52E1293BD8720727D530A4B368DF0AC5529CD334BADB1F8677D25593AA974489 +2F9F548874FECC35FC83814651A33BF12C79C53A35108C45AD8B0C1B1EE0333A +61F52F2FD2367D066F3CCB15595B21031EE2C1AA1A76E103978447A34E977FD9 +664B7470201E0B68B4206CF910FB57A357DC43923B0D7E29E7B4B2245097D593 +DCCD25A270E762567ED47BF94B6301D7A996B13CB258872DF5302FDF7F0E7BEE +0BFAB7FB65F0DB0503FBD7C66371305DCF168797BE81DECAC68FF3942C9ED677 +427BC47B7AB628A989B8BE079A81B2CA513D69944B03A21C59E99D1B38E65AFF +392A9E10AE8C6094EFCCA5B4D2CAAACF88B6DD46420FE2858794BAB331A31466 +28D371C206865FE867912F5A7249AB90095B075A2184D676A5C7E257A581F693 +FDD8B34A77CA78F06B674E06E3C4596AE9DBE770A51A2FC5D50DE3744F858F63 +2A810996C917F1DAC470CA7B462684908FA48884514D67ED5BDC043CD53021D5 +9C701A1D62D9791506430BB45CF1362B4E8364A43E7E59EF5F44F78CFF4C2ABC +00CAD79E6C2A9ED58156E27D74959BBBD262EB44271651D95FADCC6993C4F789 +008648C1282411014B9F1EB5EA7F0880A80B3B24860073C2EBFEF40CD1AA93C4 +154CA5BD37CDCCABE50C7EB3E5933124E2B3B5451226CCC20EB0611F509CA7F5 +5B2783812F6F4C1F9119485933D8E441B9CD7B18C88E193114613F1B55BBD2EA +3083766C3123D53F2A968F4E0F4D48D31C3B9DAE4FBCB8CA79C5B53EFA185F2A +12E74835F5DE5CBCF32353991DCAFE8A45336264D7C1DC55EC1249FE846B9998 +2E47E6D855E6C56E18CBBC60B84B0AB44A4028CF9AB16F03740EB584E81491AB +00845F21486A1F903378CBABB122FB199E33C89DAFA54F3AD43EB6A4A3B9759D +454E8E3C14FADB4DEC10C64810D3427F1EB144E47A429C8350A99391C82BB82F +29BA08A51D727FF0FC6E7D0823A4ADB2B40D00A96F00FA7CA1D5C8ABB86B3F25 +5CA86D9C55020908DC2C8371F5BA6D999338C7C9E06B28FC1B1B3E5FEF3AF0AF +FF412A76E841CCE583CAB8B89C0ABFC585D365B7D071E6E35E40002A0F654689 +BD1D5647A800FC5AD97C20F84E9A608F9BB348EE0D3E9A542B4262BF1F424558 +D3E455268D042F048B4760A6C2E6BB9A783C849787F9F02B98C356C1BAD94634 +2485F033A0CA885570C419818C8203CAB7B9FA6290F8A62EF9033713D1257064 +0E305EE5170A4DE71CAD89EE2C0BA62E9E69A9870DE74CF52D0DEAD65DE2A291 +2282FAFEEBC0B936E91595F7C6E0BBD33E79FEB2ECBE04891F1071D631B3C9EC +6305879468CBCA461AF927A3561AE15A463B24461B9960474005F98892057048 +6419A27D3A51461C9BB9A0E8E621ED1F536937FD0BFCA77A3C33C35E11F3C367 +554833F4252C036D579F32DDCD7F4081B4BA73AF51A2488EFD7877D917B2D4D9 +C239AB6DF1638C9BD14BFC9964A0C65963F6B79D40CA9E44A301F437B8E03B73 +0A52683FAA4CB2620D7426916F89BF72052DCC7E24509A893B715C4515E740F4 +55EC935779A22EEF3207C657A6833F73F04206D147F5E427B0414D8F6F3DDCCD +BC895E1FDCD3A7E76D4B21669D5C4C5113959CC62F0B7023F58D771229C2A3A4 +00FA0B6760C8B77E356410A854B23C9BE8F4BAB75482495E621F83045452DD46 +B5F299871544E4E922780FCF0BB6DB666B9EDBCA62703ABD4F3CC69E15728DBB +6C2DF999717533FF7F98ED6934826FC7569A4020DE4B06147865178D420E8CBF +FACACBDA128C17B635329AD9995E6E2033E6CC702D5CEF1F0DE1F25322BF58FD +9041EE0D904200FE87E2D5A672FF0B3C63575D5F7E07F01202FCB8C42EDD0296 +6E657B5D703AF68D26FCA74FBC8076ADBA7F5A4BC58C10D91FCBCB628AA9F313 +71CD61BBAE0B6A6C7B774DE4903676BB3D210F220B413F0B95F43121741523F2 +F65DBBC09B04BE87A030C607A545A9D5791FE4FD8F479BB213662ECA9103027C +01D85141DC897832816392AA1F49056AAE3EFAB417AEA3C79E49E68EE9CBE8B5 +717FB5C3C5E811F51BA685A178DA6DC3DAD589ABB4F8A0A27A5DDCBBB11A5E76 +94B6320110123C630857538E620AF88BD8ED5B5B8A10F1F28A15BE1ADB196F40 +CB04E8A50ED5322AEC3CBF8881D32160209E8FB6F7ECFA70AC58F94CE3810BE5 +8597D5657E39AB15B3E35DDD508F74069DCFBF0CC70A6399C3AF7B04D4975FA9 +31698D10B8E9CEB89DFDEC2989C37FDD417360F39FC6802EEE5E3CFE7DF63361 +758BF4861385D4931323EF38E7348EB98633C83EF9BF627A29219E9F75A1D341 +5C8091A908ACCCFC01395AD91DDB82EB58BD88D5387994A74F35BA04265BC32C +4DF225782658BDAF63E8EC8B5B4DB6CEA66F83961D5B41C8FB62CEBA3DBEDC69 +B6DAF5BC4B541FDCA54825918B9C84E7122D9718D28BF9E9066C8B122072225A +1B79B4A73C235DF52511CCC1E0A3420B35A5598230CBF3C6EBF09AEB6265B481 +304D9325DC8AB8F6853D4111D42724C558761991E953F114019169BD632E6639 +037344F1B767B0DAB524847DCAE3C5CAEB864973F3A3FFC06312A7753F571888 +957ED07CAD5EDC9D04497FCB48446F6C44C6083BE9A31821BFAF1046F89985DA +009025D4AA91058EA366244ED8E64601B374DE230A90463AE4E57D5D995BDC18 +F621E2B31F79439BF5A4984BB6A02833ADFDF4AC0DD58F53BADEF74BB1D4AB88 +90AC403AEB53313D51303384053A941B0AA32C3868582180868D7B6822533E61 +A4C1E26794A2D9F505EA75EA790BA944FCF61B5314DB14FBBB6252495103C7CB +8E355F9193D5ABC556F3E4D5B6CD2B8FCE08570B3B69075E241E06CD9AB790B5 +948176080294D56000A0B7ED21D906169D052EFC220767178ABE60759E148036 +388530AFD262244BFDCC980D432DF470C4243BE84EAE322C4D8EED4C2242F490 +93639E49E5548FAE9DBAA2826176756D46BE3449E33E8C1F4CEB4720D0667DC4 +EF9D390416E580ECB81029054635C6DB6D8A1B7B964CCE4B15B632416804C805 +0BBB666A4AA5038D4ADBA00ECF22EB59FE9E6E4F801CDAFE3E35C44EB6C098D8 +093AF18BF4FAFBC3CF7562B90029D395D58383E75039003351E35057489BB5A1 +6AEBC03506289C918E6AFEF280E437299C2ACA7E6D5D52AA3EA2509A1758EA51 +637645F7CE54EE87093AE38B8FBCAAAEAA2452AC65FE2C68235840BE62B91742 +96AFCBCF4AA8300FDAACB55FAB27B2B29C488628347E9262464EEBC8D13855F4 +56D9775DB23F069E9CF9C84813F0CFF1391D72DB08B0C9A3FE409D8D08C00562 +DAEC5022E11EEF099724E648BDD73DEFF8E1FFBB3F80042554CB0C03158793D8 +CEBB320F8E0A86CC95E5860355F00DBB146380CD6BA35F93F5B8FBAA54280262 +31CB7998DA8B43473EE8D1895D5D85ADB6E5C8D2B5109E57DE3697F541C7B27D +12650F96FC01E3D56F457FFDC3BC2668F8E6FFE82B94D81A648046D7CC71C4F7 +E218F5D5D9F899E5A3A33EEF7EE7C8CBDC9F239BD2C12612519ED9D4E89CA4CF +348C0EA704B46E56FD9EEE336494CF103C93CDADA00AC0CB74DCCBF4737A481A +F330C6969D9925BB1CAAFF8A2D857245B8E4C82A7915D97F7466501EE7195D8D +C35D2B5DFAF50C78686CD5F5717ADC8047B7877FB15E84961F372D03C0679375 +88E4A9A5D2492D28D55FB00ED000E2B8DCF24AB3EB4519CDF68E3FF98B54A1E8 +E4DF661329FC27BDFD47BE63E85A469191E476D0406774727EE99EEE6C2A1C0A +EDCE20F13FD1838EDF3C1E5FD764723276ED5D853E609B0800197BD8E59C1265 +4092D1D76BF60B1FB675B25344D65C0F79C3064CB634970B5ED680EA710FF884 +8078F9E050655644617690A3EA66AF2D9AB40D187B46E22E72001E2A9D3541C3 +5BECA48A812700501568565A8D37A2159A51A89BC59D4ECA20F3328CF48838F2 +B6BB50D0DFF3039160FE2E278D178B673361A3D412BF3ED1554540F1F0A9A1F5 +67C7C4B257B97C6BD1FAC85ABC9E86B175DBA1FD0E9BB7C0DED0D47956AF2389 +64EB6C4CBB3A03A8DA5AEEEA4422F432EEE66860BECFF5BC5752147BBE75D0D4 +BED50695E88D2E9F01FDE0FFB409CCA801EB16F6471181E62EE70AE4AE06B9CE +91079CB5ED83BD82A88C835CA82612A4431EB7979FCF8A7D1ECED31CBD1A2C3F +A586804D66B8A86997A05D349FC01A2796F1892A42979F50B0DB1175B42EFC58 +0B1D3CB8DC992ECF5BA9A6DBD1756C20DBEA6948499F0D245F2CD8D121A8F916 +C0D41F5FD5414C12EA4FFC688344F7EEA2DA6BF2795D4D479851DC004555E3D6 +0AAB1969509FFEE0390AEAA3D631B78EED9370B286B5D2F871EAC4F14FC32B7E +5571510C3C9BE1467125B7EB3C9E161B0254213733C6992062A63C6904575107 +3395A27167787044056BF09BA5BB742AEC0D7546E9D092D2F66D3BF9564F838E +FAB5EBFE6FE458D8FB9BE05800AFFF6924270F06FA0DB61E48F36417F2B84ED6 +27076B8B6EC6F7DECD29DED0DEB9D51DE150938B7E94D09D19F28E3608DE37BA +FEA6BBB3BA06C13F39BFB5268D4BA8D8009E41D5DD8F5C0171FE2859A78C8F16 +8A98E12F32F867DBFB07EB5404B6092C7B04BC47118E3B3FB66F981FF9642C15 +A4A63362DD5D20EC4EBF415D79626385EF9D7ED7B18A41A4C33F3C70553B31A7 +01EC23459FAC1A5B9D320B962D966C43887CF3BEF40D2DC83E843E51C9870C2F +43CB49080C3C477358867A4FE87FB6E9F79C7C7D573B0D65F155B2656F4D33E7 +0C6049E8C46513CC500CC600D7EE5D30D32B9324C89AA10A9D676EAD04C9728F +4A4CEF9925A294F26E6AC63730B4520C43BA5AB4EDD6441DBC3F2B4EF8FC4AFB +1ACA19E714C1CBC4AD114FD0744F84C85F4F3293BBD036EBD4CC29B3B9609F46 +E856F37EC8E33396C89DDEBC43C0A78A3FA67A155E1DCF82148893C418531769 +CB82B1B6357335742E7F712A182C413E8D8192BE6584A907969A48EEBBE5C0F7 +95C7219652F28F3306DE1F83315BFF09D66E3C31CDAB730DABB8ABC1A33C2BCF +046D3FC7E0084877999B7D2A8AA3880006B9D63BFA9F82F26AF0B93372E55EF1 +DBF53C7494E42794097DF15DDBF43180CD643589E2F3A40AF0A1A0D7EAC3373A +B94B1C375A45DF21509C3D094F230B8EF207F4D7EE1B6096FA047D0AEB83D12F +E3AE9ECBDF2C24F3D553DEFFC93ECC63A2479AC22A209FAE85E34D7A6855C386 +C611D60159CBE8A9595DB541849FEDDA99DB09BEEE9499A6CCEE6A0BDB150B11 +6DF9A795156BF845FB89ECD6939D6EBC8615D8FC47911BB34107E71FB3E4507D +215C1A8476E75BDD1B3D87321852AB6A94D21027D35A2199F25DE7F7BDC4C865 +98DD84C89BA03D5498AA3AD62135F0B1390613421D52E2869B87579EA5AEE7BE +6804CDF29BC99A9F7355ABC9E42D21E706B97091AB73D3CB9184013C6D8980B4 +CD5C8D5D13973F342E8FB4467260B23340BF1254E3D9195B1D6AA566976C0CB3 +62B492B2C8D4EC481C5756496FC54DD7A6EF6A209F1E15FE2C3F57821E9E19AD +0A563DD390A89A6722513345EF58F98D65450541A0C5C093E69D749E0759FB1C +DFCA7A4782EDBC030B9D692B3EB1003487863549585E94245D9ED36D5576245E +C189F5E31A033C68BD21D5A477B756ABBD830CEA8D7F0FC73F93352CF95D584C +2593F7389DFFED1A40E6B14BBDEBC5368FE10962FF7A8938227FE9C44AF54602 +3EE2AA0B6D7B4044F906480199E49B3F2AC6ADEAD76C88DC8D22A417C8A4BCEA +D0812F1F513068E700040A9F3B6678B1F51A48592437C79E2BEA709B92669764 +8A058E234468B01F498B5A51E2021BFDC09784C706024DACCA6EC0DF8F9039B9 +02EDE264D7BF8381A66751F4B9FC4734CF608898828B5CC3483C688132FF61EC +E7BA899F45C3530ABDAD48A5B5930DA1BE15ACDA0522A33E87127C559F551896 +40348DF2CA4651C51475B1B611957E11D787F05CA436BBF1655999F1DBE03AF2 +3C83746EF137EE71ACA97CFA6969D1CE5ACBF61900A452D630011FC3E85FE0FF +AB5AFB57483E7ED55221A7735E5F89CB4EC92D5A8C9CD73FFEF46D62F8DE207F +D4DBAD9EEE001DDF0750125FBC59A5E13A921955C6D7CCB1CF8F89F3E00F7B12 +5D358163ECD0CF38A118064862EA04B50B6AC7B95D531C2065BF2CDBBCE887F1 +70650E0772EE5AE10AD67FF178EB51F8AFA0CB0213BBF9757976621EE0058B0C +3AF602DBCC7ABFF5F467B7854904BD7F7E89BD19EEF9A2F7B8E557283AC672B2 +92BD96D87365C681463A6FDF56DADFE485E1B81A7766EDFDAE58F92E33CB12AF +EABC9D80CF4514D8BEBDC6433B990B0AB267D378438D738025AD340FD602C441 +A5A4C63510DED267FEFBF9787BABFDB79804F56C89A602470AFC0E541B46666A +1C167AB82E06BFA1814E22B65355F40813BCA02BFECC086C7E8FCBD845191C28 +7FA8F4BE3F1B4057D192AF55AAE787B0C654468600ECE8A763BF3B5A7324F7F5 +62F7F596204F0A50A5A7E1911418C00849DF24E00AADFBBEBB6D10180E9B5FC7 +BF839E08691661836B5DE3E5041DA4D3B4A458E270B274C82EC58617A98F0341 +C4D379C508B3DA7F2C20A1E7CA5DC9505795944BD83EBF02022F31E50A3FAE52 +7259693253A45AD3AC1D1E40D694D4B33E8A5A09C405B52BEE5EC132C9B27B8F +4C45B3EBA9CF34BAFF627AB8D86755D31472CE8ED453F01E96F74851862DDEB6 +0A8B4C6A0D69783E632065B095924AD3D5B98A8100E52F2058E795639BF91C8C +CF10E8F4DBAC1F9BD167FCB399BCEC1652C81DBAC4B0E37DDAC9998105397E3D +73FC7E53E70028314EFEED71A935C9792CCEAE794608DC13C6D14A069A02FB43 +8A05187E9EE03AC908DBCC7551F1E933B4FCE961926D5B81CC885D8CF3F4CD3F +EEB5DEE1769A5C5D8E86C7DB3E96FA500A2EB89735C55AC3252CC280ECD07AE4 +64EC4F4BF687A866CD8A9806BF96FCB8AD9BA0972F3DBC2971F50CCB4E1A2979 +480341DC01E58273F4086B4FB7C98D4271829AC9255598669F26F5B59F3DE2F8 +9BD2FB9BF3AD79C02B8199C952D7135933BFF1A3B3D04EEE52CA1CB9A15413F2 +158BA8D689AE2F93EF3EE2AA055B2CF2CB6D077AC8F72126FCE95F30471F7AF4 +6267671B6EF1D3F5A932D94B700CF3FD7777FE123129E874DA871CC6F54D69AF +CFB6E499F50025567B58595509CBE1300AB209CD88FC472BBE9C5F8124AEF8D6 +3288921A3932D0374333DF8D0F77881B9012D75EADEBD2F80DA17B5B1CF8DCDC +C71A7E217FBC07ABE2395653552742AD35C5B3A99045B92B320711B18E9580B7 +071C0C1598A58D0CFBA46370CC8111237545DB6353BDFBBA45128109B9311523 +F493DA4EAFC9D6FF5B73A486A8D4E39C582280BE7569C1B272F2942782C52F6E +C26A3904E0EF2926B98038E35113D0D1E6B91A310F30B0BB7971E5EF0D4511D4 +888AC76E95D810A7CF7EAD44883DF3CBD91F1452F901F6448EB8914C3FE434A9 +60166AF573EB5D77DA5A16A33E5ACB089C8E0F8FEACE1F9C48C83F18B685A3B0 +027007A99175E59A6C9609A363748E53C44A1602A39E96776738B54690E9E4EE +A3104B25F24E3F3B77316CED31ED193B4A33C5E8E1CC3B2492319BDE215C1AA1 +DD86D2622627C483F831DC8FF17D9125974521EF53760CEA854F0E8DCEE92856 +7E9364B786F6E7995A3CC87196162C734CED436832DF7F10CBBD7726A1A9FE74 +5AF7E934B5418F210BACAA8C3023598DBEEB4DD2B4C92652B61C76FB1433B9EC +163099EA47869D3BA7C97B1D27503C4C8CA20E2735B650C7A18B57B8E960F8B8 +42E06826FAD393BAF7DE0D21AD910ECCC2D9D5FF7A260F2E88345617B09EB029 +432AB4ABAF89680F39FFF1722917F6EFDA157A5B5158C8A6261CE4FF77D4E971 +D892554EE4D3E1AED976FF227FA98944D159972872D6DBB6E0805F0D7F267D18 +26ACA6D4BB463E6D288CEE66B08BDDB4FC916718B3A497CA632CE6E8FC9AB174 +8EA17C8E6F053F81AFD6D42382AD9AFE8D64B2A4C7D91181A73AC25F06E5DB71 +4506F66FD51B010AE1AE5E82A3ACB0CC3D5BD1224A28B05D2470209C182FA991 +A9F2DBBF7CB018CE87D3EB1D9FF744099C62169EC03A45DF7994D8F42C326A4D +5F320EFB7ADB34F2CF4031455F5D42949CB30B925BD9C5D7F8F0D85877FA7A42 +DC6B98FBBCD08BC4A760453B73CDE333CC60A6A8F2BF2785B457CD11878F84F2 +8FE44CB9E828A5AD27EB965ED94BE35BDD3C6D6FC4027CBB93508F3116A0D4C0 +0E75B6E94219DA65169079555947CF73645A516B0B779D4342A4E65B0C8DE843 +4858368B3EAAA38BA9750EFCD7864D6F931240E80E49A8FB2ACCD96C67282060 +B4751BD16AC3232A53AC9B4DD68839A36615642E76607A784ADF74DB11E2C67B +3966754103EB44767F5DF32FB7BFD4ABD89789E9B5D23E51ACFE4E5ADEE1D4AE +26385ABF6CC8B432096689A9CAC71E086FF2F5A5111EB0F631703C7851538CD0 +D6EB492CD25F666697B3B6C184BC91B05371345FA185AEE6A5AF301128F4B4CD +75597F9ED3B7823282CD05655F3BEB5BD4BFFCD0F0199E2FDB6C9F8FB3818747 +6738C4F7610C3A2F46314B90C0DB9A4ADC56D955FF6AA22574B727D8857F2B24 +8B5D884511ED7190EEA9A71E9708D4AA1B06222D5FE5A4E25314388A959FBDDF +1EA0C85E01169B2AAD698AC73A65400E87B7A9E7EB43E022817C7392CEC3FC67 +D6663DC750D40671F0337A49F2ABDB10AE3EAB8EB746980BDEB2E69D762C19E7 +440F5275C396C3B56C6FE9196ACDE6159F41CB9A554D8320A4D71BE0F7AACC4F +466397A75E981E1A215EEEED4F3A8482A686FA7C695B6D40AE92B4150BD00DE1 +E4FFFA42AAA059FFFC4AC9491C33C05E4D27808B69E9FAE08A86FBD01A35ACCF +46E967E862960EC4FC2704B507FBDF00FB02494D7059E429E80761626678AC74 +0BF0108F8B03A95ED783A10FC5938D9E42D64E914E9A4F04EA06BE4C8D79AF99 +25B19DFCE00972D45CA59A8BA41E349840ACA3124E8F3297C26A6D1BB1B02DE6 +C52F047B55DC672DDB9BC73BE4B39410E9CFEAB0A4B1C55DEA46746AB52CA9FA +761C8C8A2D34944E904879403B0686521C9CFDC8FBC32F4AE659FDA262B41F54 +4D5D69DB0D26B43B68EAFF8C8997A267477ABFCC6FB829632BACD3129BA0127B +1B9164BB9AB6EBFDE99D84FEEC3F04533B07117AF9ECC0BE6845F0854805296C +03C11A27AF920E36D28152A50418A9EDA2F14940BFBD9ABF2F31E84D5D0EE3E1 +94F32CEDFA821CC1FEAFA56758D269643383A613B466305C21A87E58C9296CB5 +DB8DC4EEAEEA89A1E84D5DF6041A12563A0EB66C2A0F59581FA47099D429E615 +1FABC2046BFC23C7E848F53D118239D666F058113C865B01A8D4AEDD8AC89F60 +819C1A3A051AA665A43D3552760D9410843CA004B1F2CD998A3FBED3A7CA2277 +E1FEAA9AD910849B10145FC2E0D6346666DE2FF7C2AF38E2F84CE0DF16D0B90D +03E00EC3C55E5C05AD3A120CB1879E84898995AE5A205721E2AC6F88E5B57FF2 +7CD9D37EAE28F3461181FBBC340BE35601D0CDD0FCAC181EC6E2CCCA00ADEDB3 +6867BA1627D730CA71566C9388C6F0E069BFED8968B67AD465645798D18A49CE +1C34EA0A2DAE4C7D13FBA180C50EEF9827FE456C27BF25FEC28ADD3AD94486D9 +9A697024609611947D03EB461FC8D17B2EED155A46C0825FF872C1AAD02CE9D9 +A2FC62A38F4784B40CC33C298B4E8F7C3E8A3018ED0F497B054DEF36487213C6 +116F39D64454F11B0EBEA532DC3F72A16454A5EFD2A0A702139F6F6647338E06 +773E301EE8FB984CE226025F597DF0B44A73629E50D39DBE28DE1852B0C79E6A +1FBB78BCE132753A07F858898522ED3420F671D4EC657B1363D88433F155911E +991DFCD39AF4523716AB392E40BA705784376CA58F5C5F06C71EAB6734C12F8C +C6E8D698345483D4DC9194204501A98315E44C43B38D7F30C00E01F0D1024052 +D3E0C5FB320D54FF4ED525133C55CE2021F9B06130DAECE83115C5E4CA7A5E60 +78A5AB40B902EA0315651E07B8FA6367F01701B9F5460AEFCC9F591678A12F90 +A8CD4150876FBA33C30AC006B8D168BCB4B4D63259127268C996A5A59D12872B +EA4304B8A5A08ADE39604C14416F9B327ABBF977BA56FF620A97FE4F2D4D4181 +ECC349BF0776276405F54C882128121AEA5A07478E2AD6C10742FF6430EC0EAD +752F3541B1CB283CB24D7E37445D4BF42C8BC632D41C4A168EEBD0B086BDA9FA +3D17F6ADE5D0D70BEDCF0A50B1E16055999018B459146125D16689CF811CDC42 +E1563D331618A22EE81DB417DB13ABDB475396B02F8FDB041DF6B099074AE073 +202B439C5956EA33C15AA8F1F6BB27F0160337203EB289BF55D613ED95A97685 +5F86C5FC55B627453171F5BF641E5B6DCCAA31E67DFD68F968EC79BFA39B178A +D3EA21270631FD29031F64621061E60C7E2269645A51A239A207A51DB86CD07E +3BB35993A95FEAB12FF6BA96EE231F1B2935E979AC69CB0CF2416938F5FAEE48 +E813DFFB95D13BB6A92A7A6E2CC08E3789462092F4E72626279E5C8257EACE5D +B3CDF6D4704A729D020C278BF8BBD6474912424702ED4DD0368F30CAE5977FDB +3541ACD80981D99B54976936DA5AA9975B84F7F2A2B2CAC6EAADC5B2BF652891 +FF8BD1DC5BFE7033D9D2A2C79FCFCBE44D84513D542373A9CC8CC6267A6C8BFE +F2FAAF8AE6C30153EE9F280A063D05A9443DC3B99AF1C9C1F2B0D4BBC6804F99 +5167D5481B434092E61F7F6120C743597D4CC8F7F158622C87E0D7FE7595DEBE +2EE42174102C99FE6092CD19A8E424B6DF432EAFC0046595DD05EA58D034F4FC +FD90B00AA18C3CA05F03445DDD30A6F040B51DAD4F04EBCECB1D5482301978D5 +DFED67774A1C1251F2003FBF6C4E2913B259D99C55B25C3173F41AC40933CA99 +2CE8EB0145F68130A4B2960C2BE2CC89AAAF8AE833982768B321DEC8FC8EAA8F +B64A9868E32D1914C46C8A2EBFA46F7C1CF199D24DE24339661F7272A6E34829 +E62E11A0924988177435DA106D7C524C0C2BC1C2AF99D496859326FA74FABDF3 +83FD82C9144B6F03F082E20EAD92284139E45C994018F889A1FFDA5FA2B19B90 +38B9EF87D2B34A7F46AE27BB95E2195F958798982E96979BF23BC7EAFAD3F1D5 +AE454252A06C5953A6553FD93ED295F86F419D15FC76F05B0C15EECD70D0C784 +21CAD58C34FF8689CA2D0A2C9A204D99C2378421A0F57EE9A3E6C9358F3AEEE4 +E9B6A0CC3AB9DB260D68D35E66376A74B26F925F1578737AE6539575B969F269 +872A97EB9E0181BEA5241F9DB74F212F81249B71B82D547D1C9CB6FCDDCFFA1E +700FF34E08147F6E29F10F0CBEF09CD254EB5F9F8D8099C56D859AE9EBA5D4D8 +256B90DE65747C78D14B4FB8E39A67FB1039914026E0CEB6FEF629E1C024CC37 +037DA8F073991235541F09CCAD292E4F7574ED126C99628F6B208661C2EA782F +C74AE7FF1F486B781D89357F70ECDE3F36FF6580E6A0F43F9CEA95BE57AA3AE9 +D82F4D141B9F92F22466637CA739BF9397BB94F60A6F4197C6DF0C4A9F348C46 +29FDEEB9DB680EF7EA71037C2C42D15A966D378AB2192B56D24E2EFFE4421B53 +1930203249DAC898FCBB90EF4FF10B95B01E4CA59B25CBC1517740BF94243B52 +E8B96AD886C9D9EDEE636A4F8722956674D838F57A2B049E0DAAD8731CA7331E +6D5F3CBE866174B949D87043C4686B226AFAB0BC6878D1693D849CDF52B2D498 +729734641F6F8A63D0FCF3139C55D9ECABB27508613C1997A8D8AFD78C8E789A +D7C30F6C58E84FB564093D7A589F4181EEE55EEBF39F369396ECD59D90D44965 +1E267F20B980A4359B462F692E86E04E0167B965B6D958A52CD880FB69F6C60F +F0F76F5DEABE3B0E21592258BC83BD9AD7C087B9028D3F1941A2873FE5D6911C +7D353B921FEA42816DD49B48450049B8F31D7078D0AE7CD7DB8765A8781D9B75 +0547884A23E8DF7778571C650490A77F1124639AA7554AFE3D8589DDFE5D7141 +43B8AF5E82E9098B95F395C2B9988068260570B288D1882D1EEFEBD9E9B0FFD9 +331503DBF1ACAAE998CF3F3452518B30469A6C72C23D3344C4FC1DF7A8A01148 +73FD5F56F95BC98CB2278B583574471BD2E97E95E8EE1860E74300D302602DCB +74D548F0D7377C0A1887D5FB27534A5560DE1D1211F52963AC6C7523FDA0104E +72121BA9D2CF1D84B299F2826B5105F140B890484CD2D5AE03C69BC056786534 +2BAFBEB8D80273CA0395EBE9A3BF3263C1F46093C5B3F17771D7AC85CD72DFA7 +CD767C726E7BF2196380E57453AC511C99DF297E4A7D01ECB22A095355C30E6D +CAC1B1F0FC955478F0953EF9CF88940D6FBF6D77BE921BEA61F3F1C939EE6351 +C2F6A29D1F1FE4383BFBA53ECC232C6535151EA9E1E81355FA9E72847EBE8B9B +11B229BE65DFE9774B9B2970C8C08431943ED09CD1A09CD6EFF896F43EE81FF8 +69C777498FC421ADBC40DA7AB46E3C65998092017F8B6BF96FADD768770E8219 +71D03657047E0E6E154CA34E4013D724A8F78B53CE623DDD13A5F7B7FBDCB909 +455CD4AB2062AE859FEC2F78116EC8583A2B002C2D9258FE3DF659855CD98E65 +876383D0F67C2BA1DBDDC0F652875EE767025C2EC6FDDF5CDC440577D5F9ED91 +8F6593731D04B25C2868B3356C87A9ACC98AA052932E01C509DA912B44AC538C +DB92D01A4AD932CF0D48E6DC067795416BF0A4E5B9500977DA66E4B346394D3E +D27939A56887239B7FC7F15F564E51116B615A4900CF3A67F33EAED29CF39528 +2BBF2827BDAF3616AA1740B7CF12854CB51175B088CC6A697B5D5462C15B49D5 +D4E58A406B51EFF8CABDBE91FFCB58E9C8101178FFD0833FF612DF7F99891F97 +6E994A80EFC41B863696FE7EB6787E4AEDF21E8BB6D5270927CE9AD669261255 +4D345A92D79F62F15454A661B4470310C0C7F85545806CAA0CC180B957846895 +BA04D4ABDF3D89D321D9B9C7DBAE4C690F4625EEF664CD0BFE548E057E484610 +1839E6F5C8662BA539813EA1011E77B85B859E5C2D30C27E19CE1FD55E2953C0 +6C9D5E733BBF99B3FEF8EA202DCDB64B8588E0F0A5EE6D3F214321FE15C3C9D5 +9DDCFEF830B4A0C458962EDA665A95F4779CB7C6F3A1FE80C8C9EC1542EC2D9E +B583B37FAF62443FBB3E5A7F6BFE6596DF1E9651216FEBF11803FAE1CDDF8756 +A55D19B3B1898C71ACA59364386B4912DC634E04151A443C6B6C307AA2D3BDE3 +7AC16A5B39744FAE7E9BD225E04A466BEB4F9F51959F3188325DECB6CDE15C2D +66F4C612224BA6A9FC70787FF17B7E0E31F556E2E088DF214ABF9F27C39EE495 +1EE163A644106E1C1C7CF6BEF07009B38022CB5B9C33CA4C62E69DA01BA25CF0 +BCA87377622FF3C96C68D4FF09BE24612DC788F0ED2910FBB1AE8C023B7CEBF5 +86196213453251BF1231B5BDCE182503C9B0E06724133CAD069E14C36DEBF9A2 +5661BFE61BE51624F42EB5717CAE7F05DF20A27F0CD37D268BD50286E891311C +D55744A29736BEA554B466A7AEB02C5C0575EF05CCB1F69D37EC144458048245 +01EA846682850F97310FD68190044E4CE798D51699058F03F5B0035A83F96E99 +A5F7112737D436EFE6A7C60627B700D4B539288D2006CCA437D0AD04106AC8BC +9E411030E00CBCDC3F9357ACA9CE3E6A63203DF968AC474F722B889A4EC10DBB +39295354F28BD8A3A770BCE14091561583447E29292174A067DDBC4A7C638A50 +7A0F05863F435AA2C763BA5CFCF6DF8E39189E79A9178E80A305E8F03534999D +532CA867B055AFB2077A0C7B5D1B738DC0494871F707B12D1EF469EE4FFD9C63 +78FE05E1DA7E188E997AD2C03EEB2CCFDAB1019581FA9C57C8F1DA051A60B02B +C76A5F7419B32AEC483D1EE2E7512BA83AB78C796CF06D6A01AF6C1A517F8643 +141D48E3344B15CC483395CE83BB56762A423322A0AE12786626E541F85C5A2A +79DFBBE6DAC3A2754AEAE562523A5788C3B548B6DA59D3DA207E5628017BFDD0 +A9DE4072882788AA1177C695DBF0BB784F480F831C4FD4B67365B15CDBA909D5 +F83B44B360609163287D7F315CF95B8090B2BA45518F9BCD3884CA9641704A05 +37D4CEDBCF7F3208C7580AD987F7424C459333F2C7B11937BC3AD70EE12EA881 +FBAFDCCDB80A1C05D129E0C0DAA23909BC56AFEA730F64F93FF369928C40F0E5 +CBDB410CF2EF47D49B0F04841B268F954E225ADA644566B2E2A7B93A6C6EBEDF +F6CCD83C4BDD1AF12A016D640CA9CF1BCB0FA48213C25E7359294857E16A8326 +400C324F4D6D15FD011EA1D345CC8585B06A5D34A0F2103FEEDECC9D3D5C65D5 +620710092A213AC8E1C8C5AED11E350F0760D1CD7062BC1FA480A15DE733FFEE +5F428FBF94488CDBCE85D4B65593362AFCD83A782A03F80672257A67EEE33940 +89F04CEE35C0B418BF33F65357EFBA4E3839D5CA447BE8D1E7C14C99A1866A13 +115E858073E68F259F48908E980C8335F9ABEF1109A93C20164161EE5DFFCC18 +3B913D65D9ED29CE5688A0078454080BB624DAF959BF30ABD78B1964C0D38D81 +BBEE68F8C31A647B75194980EADAE5AA18609FCCFFFC73D55212DB091A812A65 +1C62893A54B9E9214A6223EF22E663B0076192EAA8338FEBD91498B875DA25C7 +DB83A8D36542F0818F02717973F1FBF55811A03592A5778CCCC941CB636E6C8C +0159AD962BBB6951D36FE9966DF8111AD385EAA574BF225F06DC016443CDEF40 +632709C6ADDA1A90DC99DC0C4AF29CD4722CC759C1E811676F12D58148FE7DE0 +6FE2C004CA06AB171D171B21D3F01BC76C5BF9C95B7BDED1E82C0DABA460AD4C +B434BFB99978D079BB31CE9B6961CDBED6BC7601A99A1F811E5A1384107A9E79 +4CD84EBBA899EEF9F33583490C3767041B9DC600FB7311C8C606F1A3C3A30630 +6C6B2E51637DD48659A31BAAD4CED67A90B9D8FC4B548320CF65C66E5D0B0726 +B2047D77C71A385C3A77DEB598E24CFAEB307185D6CF4DB6985EA47290BB4191 +F5A5700F9070499C56DE417EFCA43AAB5AA92D1620E38D9ED6E01230409EA873 +F16CF19C67466306F8D5A442B9C619D5108E77DCABFB71F3F5222D46DE8B5103 +EA329DC77AB50E9F8C73455354851AB748246C351B313D14292DCF639D80AF65 +2E765CB7C1CD67DCB2B1FFB4C7C16FF06E22229C6CA1B90DF3BC04F43DE4F520 +604F5459B3E77FD1448F38E411CF8890DFA4625A9A70018DB43BE1C83DF0715E +769DA23B17BFAC15285413BAC8B44E0B8ED023B4CC9F65427E922F7AFFD419CA +20F0E82EB61C0EE762F546EDF4F6C3BF91F991CEC5751CE393A8A1B5A740E47E +208BA82AD0AD81FB31FBDF64A44AECE390218F22B94F4912735351875810351D +7DADE83748BC01453FA6CCB00DB1F253694EFA2F906121935E446568F9C36D74 +22518EDB8490CBFC2A03E3F7C143EC67BE7758D7E018B9D17328E842A71A6DB4 +5653AD77807334DA683403FDF3909AB57EE261D12038D277D445B4AD4B9D0943 +9E1787ADA6156861B188646A3A065A2BBD52DD92CCEC0121BB56AC8961E67A21 +C6C56FAD0A430B0EAFBCEE41F8D7EFA3D1CF92A5A26AB7B1ADFCE7B43BE20CED +4721BDDD06BAFF6F0D44EAAACF15D4BEE561E4702B525EC62BCF202D52EAD25C +90F6F53F4F37E45B94C0E707B426F5D598DF95372790BACB881E0C817FB3CE27 +A8E31CBE57FDF91582510DBAF8CED1E042D592C18ED85C646507E39D28C8A6DD +073FA1DE452C4AC40489B68FD3343DC637070716DA198EC36C2A7283604B99B7 +3389D0F2D1F95455105A3B7C18400F55C617A2EB7EA84CA48F770953AF9FFF9A +B00A4C6DC1A5BB278129E7B98E1124B396DF750E2C4470DF3AB074602CF55478 +F2DD0FED01D5989EE6E52B3728E9D5EDFACAD462187C310B04914E2F34580E9F +D2D9939D2E18753A313CEFE1C6C4EC368E199D5569DAC78B62B967E2A01537E9 +6288410DADE218305D5FDC8B96F258964BEA24E3FFC3C092F7FF5A8ED7005939 +CBD7594BFACAECA3A650BB2D2BB41A9146C83BDF84CD8349989B0B7C46264EEE +B0AB0F2EA1D9911B68E9709D2AA3772094EF0A8774A4ED4B93B45EC22B6D8616 +66D1CB9EA64AE4500209113975CBE220A83B6C74EDDAC5FBC11190A44223611E +C2829BD6E3443F5938C20761F9B1EDF84D060FE45B20C86C3CCB8C7B83D74235 +598FADECA175DD7AC9C301C875DDB055AA7950C93DE8D7016A3D5D2BE2A0CF82 +94AF5DFFD81BB8E7A8B0664EF4426A765AD48C168965DBBCB4A5292E99E329E4 +3B68419B564858738F4419D2AC492DA601D7D4FB8082F16E104F507B503BF9CB +7F40A15D1D6B1BCF03D5630E16249ABE6DF0EDDB568CC19FD9F785F3F7417334 +8738B91915C553906EE1B378AFA358CFD6FA3C815F4EF44DD5BA6D26C6E17CEA +0A29B307C857D5D2CD8C3E506660D7950B82F1DE12E141F4740DE728900709C0 +696AF057305E6670C23DA0BBA5C64A111206219FF2C1CF6FE7B0EF257D5D99AB +C60AEC3AED73831760CC5D22E74727BFCBFE6810EDF4F48AB39121A82DD5821F +DE6F8A10AA6CDECFE7D4BD8E2388631D5941C5DA0F61640103E5C68F6CC413A8 +EAA7D2419F2B6A643E8F9A95F66A1ACBCAFCC7443F4E01B62320EE7DE0689EF6 +B8397698925233490BC6C4B90243E9A72770FC68CBD3854821DF66B785087743 +9058E6DE7D1D932ED00A1AB57D21067A5411DD097EB0065B1EABEB209C5B69BE +87F33EA9E280B71D4B8C8CB8C99123B8282AB57848A99699402FFF93B755ACEA +DC15E0383422646F3F80BA0698A6A51AB1A28169E38340B303950B69B881030B +1EF221BD8E44BB2549234CABFC545DE97DCBF12F75655BC523A2371D5E680BBB +82CC1D799C451E8B3C8AFF0AE63EE353520A2EAF5C4E815352BB98ED6162F08F +E2EBE7F408BECA380891A40FE3691F984D498935B11F7F295E98A256E77BD0BB +4492D8CE904D9CFF530B5A26D14A0B49DEDFA9B19DD80FFE4A56CCF3AC87C651 +FBE675846EE0A998B2BA26234849C4F95B0C5DC2D3E84A26961B1175928BCF7A +730B085C42FEB713C58A2E335CCCA1A5DA7A88F6E2BB015961C14848F61AB3DC +DA874008FE811F38B13959D227AE5B3E358F1D2BB8E2D7FEC13DF0CC79DB6D25 +5C7BC76C29CF9A0F688A0ADCF3D902FB7E9269837D1C59976F19012919F67E3A +6094482E0EB91FA4B137FE4F07CBE4557F414E60EF225666F9648AC754A28E43 +629F1F070299834C1309BC28F0659B8FA58C133F403D61BAFE7F40B6E31D6C83 +EB980B5AD4CE3F01D8547DA7FE177C1D230480F771183B302FF5C3683FC2F628 +8A9E6E5DC9C029E7957CFAB8C1C9C4B2B604812854153C683618749FBDD5FB05 +3F743A4FB268B84ACF1D9ED1283A7DB64A31B78636B4574B8A473679C3A881AC +F7858416D29D3EDB3C2A62604C0A666188BF9287118F092485FF10AC343C31B7 +66C761AE8DF4634B448201A9DB85B0BF06A2E8BE1A762ED37127DF2245084B93 +FB078BC50ABD8980CEE021547ECEC6751B2295819D5F39BC3B210560C383D887 +A4B179D0ECE8C1AC8E0A2F97DF032D1EE28F3C835D7BFA2DB9AEE349E65B73D9 +3C9A367A6C655174DC8180663D37E19C6B5C44031067CCBC577B786828DBB23A +C076FD672CD32D1AED09BF9F38834E6B16F1BDA5A34F063C64AB8EB8864E7D5F +C74EE517DC915F0C77A2DD5923A50AD8A4DC39344635AED890A5DF3E461AEE3F +E362DA67E73CD14B200DF449FBF2D92C27FAF4B895C45F370C93AF5F429A4303 +4CD0D65D1FB3EC103BB5A48C04D675928B6FCE127AB32BF205F2EDAC29B327FF +A10489744E27D249753E5661634753915059E6E2702C2F58905DE3AFCF2D4272 +9BA4DA3E6781EC67AA39B77B6DDE3968AFCAF99554580AF408293DD5CA032713 +CA5B5D28AA46606E627F53F27628FA563C4759D84697781600DE99D895B402BA +870E5427BCD0FC02B9090770CD84BC9061B76A051F6CB4921990A0DB13C2E333 +8CA0E378EBF8E9E507E22979D9B694FEC20378CBC11560FADFE040DA63FA4E56 +9D7D12D7005DFFB82D17C87C9EF63CFBA5CA887B88BDAD23B4816CDF4BAEA528 +E269CE1DB32E79840D3569ECF356984326C1E4B7C20B268FE955E9BD3884EE01 +4BD7CD21031F7623DBE183EEF39AED664EE4A94156DD0887D85F19A27C90B834 +4FC4FEC2F39029872023186B6CFCBFE065D9ED6B332D63847E5EA8DC91C8C668 +2026FAD8E24C00B2AED44466AF5BFD3FF9255EB05F7CDD90826D88D6830BE8CF +2AD621CBC121437726CFCE345418CAE44DE21AA3711E4F9DF7AB331C5B074BF7 +3FD41C21F642266E799450F7D0EBA2DBCCB9D9DF3F331602FE0FC18225BAB14E +26D1A7E72290E42B39172B949F58258D96DC335CAE79C3B583BEAF9F36AF6DE1 +67213D403790B505E753A10C277A6FAAD5327B738517D57BC130A486BC8B4746 +1D46DED8FDDB9C917B1E8D1D6E4DE551B412DBA2FFC1E35473DF49D9CBB20666 +9ED63C06DD802CA9A81BA3631F1CD8671744267037EEF17A82CF746591C63A7E +8BA5F822B443BFEEF8BB6C0717AE87D880BAD61A1A478FFF5883C463DD83CA43 +793AE5C407FA4C66A56592862EA0F626822AA8AADC651E6010A652477E63AC80 +0F32336858B94F8D40E9F9FCAC69E8813C76B5491F4CA8B291CE1E7BCD138383 +E02AE5A5C8A8B13569D813A947CC46F321029906C5DEED777724A1B34A684E60 +90F8205B446B5D744D622DE3632F31DA8EA4E412D8E65E45FF964A545CB8CB3E +654A99A1C4E6CBB8D8C61961403D12CF6BD20E99765BB5E239E8357620DA54B2 +61BC00063389228BCB59EE9565B3BB99F1AAF30D296DF5D34D86B543B41308FC +B5E55F4B0DCB6D3D5D5A027BA1E23566997C78B477E67F00A57F67414ACF113C +877AE58946253165E92084BDAA4D40250ECA51BCBD9EBFF9EBFD6369DFF081A2 +2DE96084D718C88C6DF2D167C11805CC839C7CC393C052FD4959399A9B4330EB +88CC19F2B480CF088E338708B643279D35D68C3679A6EC577997A54FEE8086D4 +94BA562BF63777FCE8EA4E0E59068A8433EF8B64BF8ED59CCE16B7916D9F1E57 +322E144D245577C69E99E84DF2367B1865CA3B5FAA34F4B00D059D09FDAF9EE6 +F57C0D4F73F17D9136F873F1A8A7D2880E7319B3188CDF8451B66E5D08E20BAE +C106696379B76C44832F51B7BFA28572850DC31EA2512E1BC3888224F96A75A0 +8B7738C1B2981A3B89D8D5ED4B7F6C3F6995C893D6C174F4E3A38268228FEDFA +A72E14856DA96125C4217DF38DA9DED696C4D62DBF37FA9FC1466A31047A6223 +DDA2F118E90B180B45D0A6D20EB1BEF9FF0C561BA1D870A01349AC1E42A6E9BE +FDA106D48928D65EC46F2CCE64D61019ECF22E75F743E9E1D0FE98FBF5729A93 +86D9AE0309816B8C5DF3E9698D51BED760CC637FDD3D8516E36B036E7D784D69 +E3512F9AD76F7C3BFC32CE40EAF7C0B7A0B1729E986790DEBD13E2DEADF92C41 +528C9DD1E835CF18CB8489B4CAB7E105CE9D16CE645599199F1D2A58BA2AFF59 +AECDF574F7C2944699ED630718FEF049139CA3F4ED5C0C5702A0DBBFAD074AC1 +78C70DD53C12EC599A5F1B2AEE886DC46426B8A21E059D78AA51E4AB57F8B4CE +5CEEB784C7FF980C36B2DE62BCFF37CF378A7017D8144AB88CCE45F3A07680B8 +32101BC312A020F621AAFC524C5F86BBC48BCF4F7C81B4B2E82CF585F06F2481 +2F8EA6A1BC2D580617140EFBC6B8F7EB7D7E323A27BE3D5AD599C6BEFBB2CDA4 +3BA86E0E16D7264833827DD01E7B4FFE6EE2454820E939066B988DD2345D97E1 +88ED2DE120992C40A3A5A073C1371662E3DE05CEAB8B438E47057EC5139AE5F9 +7CC2A859CEE5F0EB7F062946327FDC5BA33A7E1358142DC5E7B5476BD1AA7AD0 +1C024E313D070A8D7A3D62FB6B64A5FD562263B79BC832D87C60489FA0A2C4A8 +BAC86DFB78D38A6EDDB47D21A596969093A36BF8185535D3D5C987160188B6D0 +5719D2FB8C8F0F76A5A0A8562E34E7A4543863874E81CDEE68C57068734270B3 +EA9FEC6514B36D5F2484079464CAAC1E8BC82B9708E7355FA8F78C9271ED294E +146EDCF66FA86CDD1D47D5590B633CDAAC3E559609D270BB7CEB794F48B5DDDB +EF716CDDD85A9E39CC640E1232BA4E057518B0876B3491AB21CBD1ED1BF51F0E +5B171D6DEB1A7C292F2FAA36E3AAE7C21548BA6A5D681407613CE614A81AB209 +198C5F7A36F2EE329A3B3BC98B1DC8A8D30EED1D7D0F62D187225BB3224247FD +67EDFA0A6C417B3411533CA4B6BC54FACFA7D4D8377647AF0C9D562080BA8221 +B1371213B8B1E28C69C6DDB4448B8A5FED0F15656FC6A229715BF71EEDDCCE88 +146243275714C6C27476BB6AF2DDF878F223318B1ECDC0B8FC4D1010C1299A14 +83169C33DB33166F1BBBA3197AEF05A8600891D61947E919A0002297CFABF727 +0204E391480B6C4ECDFB94567478AE392F34CFA124CD2D2637ECD95197F371F4 +92CC9A34BE0FC2EC3E7A05E25D1D76157E0F59734C3969EEE34E164C7BA3829D +EB3404CA60DEDA0EB05C66D78234729EFDC442BCB0878530CAA0B8EFFF57F74B +9D3F8361A24E3ACEC3A1AC34766ED8C043B6FB579E873758C501F81939E79C76 +BA612E0F349E8DC891303776A7702C082D91CB23D2F77E08FB2EC60EE73070C6 +4E033D300A5D26F59C51241BDBBEE8DD113EE54CF6DB8642063EB84ED1CFE531 +D9E90C0A972CFA4674937455B30ED726FB98C786CBFE0CEC95EB60D2AA279F64 +C723DBDD83BFFC077DB57F399F2C6731145390B4DAFBAB65A25E0B41E617C71F +9ADD86B4CC8312E8AEC23ADF1096031DF225F59D890AB7AD5DA0CC8EFE1BC2E1 +A5360CD6799FA342B89290EA741B84A37CA3D64297C8DC6B5ADC401329873763 +E227DD032DBF2164DD14408EB89FE313988FD9335BFF72AE9A5982ADFEE44A08 +D75DD38EB950C579CB6BA4B381FC43354CD9FDCB691C413BA246F07E81764507 +E20F37B02E320E2E086179CC60350B236E249FF196DAFB94242CA7FDA746228E +1EB82BDB89AE60C453081FC2D1D9E546376F4464E9AEFF63E8CB8D6B47A4D499 +6BB3A0A8744679D7D1C05AE44E98D7325A6402228B87AA3A410367E956D24807 +07581F6AD7932EB450EB16449E1A40E7F250A989FEC92E27AC6AF78826FA6885 +ADC87FD6C0697F41BA2C7C79D777B344037BACB220B1A9A657030A5965E025A1 +F953185214804459E96A586BACC62FBEF3CE5954EF1C61467F5514ACE043D448 +5D038438250F1B85463F8A324962144F9D7E1C328816994DD3A9B31231871091 +5552844DF707EFC3F81FDF4169CEC3A1C38E24FF0F0AFACDFEFE7F745CAAEDE4 +04A092E5809AC0EA02C3F06E384B0FD60AF369F9A9EA85667035DF87C5858BF1 +603E9A419D4D8DB73AEF26F7AD52E9E394557E1B2B257F0DF026A431A192ADAD +00BD4836B2C8B54D646E8EF9E52B0FB19C4FA322409D09BF167CAC5ED3A82A48 +C8FF640CFE6D091EB6032DDCBC50F9A593B5FEF9976C67CCF409F64207FBA557 +77340CDBCA6F7380B9E2B3243FE805C4B69A3BA2FE1830139F10A403CAAA7ED0 +BF5386C7D3BC998BCA4ACD968401DF751A7EE9492A690BF0D521932FB4E63761 +DB383CDC362D8E5A563BDC4BD8D2A1DB5D900B8FDFB5329CFB85603967C42502 +0947B3FAA5AB0A96FB08A464817136A4F5BF988080CC0085CEB42879D650466E +1B972B717B18D5CDD21AE47FA495641374CD156A4F726A291D4E7C5CBC042DD6 +3D119BBA7E7163F6AFCDAA9AF22A83569D2FD35969143D992570D905A90F247B +475E253081579D0B75467A329E5B5F124DDCB602D34D12D72ABEB65E41C5C919 +BB9B1638E41165C33D20797C3755AD71F53FBB70A0FCA76D52B33097C3ADD50C +7CE5AEECB9C3378538FCA2D0C5928150FCAD751DE3611F9E84ED2A0C6DFE70FC +4AE33F879129C961929BAB02BE32CF4070F8F4F0BB0158834FB0C605A3CF5490 +4BED0B1E98A2FC5399924C4D554E41E74CB58A21200E6DD2AA0A734679EACF7B +97D1030EECA997D2371712690F8D8CFC9A4EBCBFFBB9F4E4BFD790A0F961B95B +700A2877241797ADB1CEF48AE70DE669C8A8E990F7EF38F24C269734C4E230CC +FA6B080559B635F5D5F78972786469291A062617CC8919F2C8CE94845E955DE1 +F668AAE68051854B3766B7D14962EA3C322845BCD8A00341B20A2A6A90A77DE3 +EB2757A5DF3D6292033C869AFBF5E58F4E4C0819504B93F88E6F116F39200A19 +FBF1236080BF69C9F77C53413323BC8250901D87175E2402926C33726D68FF1F +AC4C38FB4CF0EC80BF1147AEC15B05F580E4C51B2F5F01EAAF8095B02DECB458 +C2B6D8D951BB2E7DE70C31E4FA5A4FDE49AE7E89DD82B217D6579A00EFCBBA91 +14E991022833D0DF8CF05A1BD852C1879779176564B121F6FC64A795666A8920 +24DB2D57D0AC1341F032403EB030CA99BBB31BF216A87FCDD7282C4497A99AF1 +EF9E7DA614FDE80B811D62C995F5178588FFA0DE8C76E18CA223BE296CED4016 +A8B92C2C727C4E5AEC2F0C56E1D4E004FC3414502FD82A29EB4B87D8FEB92155 +F56C4C27BC1EECDDDF5F224F935CC45D2509E4AF6227C89C20C250F7C823911F +0E1CF6B31C793BAE12A61A6BF5C8DAA299201D9514267D54A2D201E4257AFD7A +8BC070BABCBA91F449CB6F546A92F87ACE058EC39AA84EBFD8FAD238EBCE0D63 +0007EB216406BA29C84FD6B9385577D04222C305114F3B59C186604F67C5AC8F +4546B1B55348E1E2CE449D3A28562FE514F36A77F66A71CA91EED86EADEED4D1 +07F36C67AB83B0BC344FB9DF4960D11FE02EECDBB829B0F2AF39FC9D02E75C5C +5D3C1BE00FD913F35AB9B9F693E7C9BE6B315B35D035585ACA19CF2C7CCAE105 +349E30AA4F57A63149D9262028C53EB8129E0F15EDCC7CFC2CDB5FC190B1010D +9F198949F56402888E3C7892E48408B34D9EE3E9418CFF92B8418498297E2449 +E7F92E983348CB30D76BDAA84DD2797D822D6F26A582F8A338B9D4D370581CDD +34D0D334CA8D7616E448C86374B65CC0131010CEF730785F3DD5ED2E26F27011 +CCC7B554FEDB02B6DEDF48CE76591CC110C65FC5CC72E7272FF63F07516AFE39 +11202DC05097DEDBE384E8DAAA2F2A422565FF426715A849EC159220C8CEBF65 +1E4FDE87CED9414AE86D6D2066F8CE0AFD31FE5A839EAF3092C2974FA170835C +31E8F1883E82EDF30AA1BD6AE0C5FD22DB9B1A53F27E404E2B8595E241843B95 +A9B16F40CAE8F8712E1BEC901165E4B64AABEAA93A544682298C5703620E42E5 +F8536D0DACD0274B1B13805CDC0ACFD5A242AACF29B8881EAF29780B65CFD8EE +21524F3F845BE6D7E8D5CF594B0B15C50A9B5A2620907241DF6100DF4AD96AE1 +9BF9254162CA6386079FB93F1F88A94BCFD6E47B1CA020129EA7F34E9A261581 +615C23C8D52AFA37AF575417C814E74D56F08AB575D44B2D0C17274BAA5611BB +8C61D49D7BA9343D8998110796E4E060523BB6B22F1D5DEA9CF8620D29A5CEF8 +5EDC173ED7142A121F0E472BDFDB29E721A825FEC5013E8794B8D132E994D583 +412370CCA2DCB10E3A5B49778AA5B4489AAC9918D4658F0E43F10558EC41D454 +FF56C8261842EB93FF326EE3856FD0A25AEDC72CF966CF6FF46383C39C44836A +22485CE993E3A0578466FC77106CCD2195126567E11E54EFFEAF8F40BC0D1B97 +634F8C121D9B62648DD61752005891596F40EFCF13A2276A4C187CB66F0B7949 +BE95486034B3E66445AEB24A084F8E535C754892FFC156AF7EA8315A1997D3D3 +FDAB4CD7C426F839FCC9BF4506C3A9430F6963AA8215E44D86ACEF423291375F +F6242DDF87980A9A5E55DFB668C74F123656CB625E5E335D2CE989FDBB269F18 +432F91A9E4D62B32E6B9BC8AB5CA32649C98597DDCDE2F343AD7E61F0F54A21B +449DCD1FECBA7CCFFFB5B2090D90251DF0E92CFF6FCB89B5A4FE39F78E9B817B +90FC9CCC283011B96319FA61E5C1BB9E2A633CB9BC346D08ECB3AEC5A4E36A75 +CF8843027E2B411B4410B5C06F3B83A37442D06B4BA57316A7C9DA5956B0AEB1 +C7A221C939DFB559CF0FD174C3E9D917DAAEF97391558C48DD1BB7992B14A8AE +55B1CFB6678C44305C03297D61D45A23A162A71873ACC77FDE7501DEEA302144 +11A8EC2224408B7B4159154C4B1CDE75D5A80FEC50C1E123B6E0ABB523B90F07 +91E363150E451670DF047132CB503719485BA8058750DF7E7961AC02B84FC89E +B8D57BCC582C6D9754CB90691F65EA57AE3D8A7F61B70AB95FD6C05B0E0D107C +7560C1C8AC53A0C5588A14412A264BD84DF2A164B1BC8CA599C58A8C581DF0CD +C9B9719A9CB243B95A41402C29F2F56C71D253FC699BBDC4F2D2FAEAC42AFA75 +DB38A8EE0398BFAB528832A80D3ED42E9E3F3375F7DA493A936EAD1162DB55F8 +79F31A554D8BF98B5E1CD6F1ED1FF319B61F5743E24FD64F42873E0BAAE0754D +13634CDB4BB284979BA95CA517BCD14F2BC5B7ADF3C105B5FEC0C9A9FC25D662 +0237C84F75CD28D122E5BA85BAC7CD5D8A520DF718AF068A62E2B9D20DFD2E16 +B9DB0234564337ED27C69DE8881A6493AF8FDBB5920CCE09D5C1FB480540C2F1 +980A6D87A4105B168D570BF0CB65E2E03860C838011393C9AF6F6D688FC52770 +EA668A2F714A1F61F77AE35A1F55FF065B799C1028ED8A5E0111581FB14E3CD6 +BE1A98601BDB8B3AB76C58D31A1EC0C72EB5965CA5ACE2E42C73DD7DF21F82D0 +1A3331DFA06E332B68858574FE9CAD3E3D720C17A2D92C53EEE6B58B230316A7 +5AA30C60CC672E473ED311E7D38C4EE2809C29F2E76EA3F5A474E6AEBA84862E +7BD677B6D9AB0C2B501BD929354DF6A3CBA66FE0FCA49EDDD22D6E660085C421 +533D735684BA3BDA798AB2CF9E8523B16389BD242E0D19953D83FEEEA8ACB5CE +5EAA4BD530D3F8C8CD72D3EF90DC038E2307A58D51800A5F9C62025039CCA4D3 +07DA0A0A0263FCB71E20C9DDC7F26718A2D1B5882C7BBDD3244701B62D890C48 +5FAF33407E9A5E4EA5D1C6910815BEECBC69FDD837E51154E84FF784896EF91E +DC45F60F9C2FB8C376B5728C7EA835A807DA811A64C3F8C7043FCECD580B0B02 +F0E23F84CF6335F261F030FB1CEA8C261EB1934C750B34039A5799356B79F65B +1CA31F02BE58D8AA229FD20CDD1BDFCF6199B6C5B9FF6D63C3585D3475C58E79 +8FCC21AFEDD5D5CB5ACC9B0F6AE689BEA23DD30F02858CA6806DB4248C837B60 +09D96D24C0E2CD5F4CD2ED50E60D03CC760D996B108017B26563E5E8FB203D96 +15FA47459C2CCF99556D0F91E5E6DE0051FB6914EA99F0016627491BA5176383 +AA37E3A49B58E488F1D6D37CE2EDA15AC652164007171D4BB2E1EC06F7ED225D +71AD96534DC26F8E167179AF8714137383561BD7EC9C5F8ABB64C334F1AF280C +4E70CA3751C2ABF7FBA2821B286A9F6DDA9E769646D5878F8860F02B8FABA6CC +A82EADF9A45A30889AD551894A018B81093344C6CB0D59D09D6DFE91112DFC9B +5F0387D8727D1963415748D482FDD5AFB001FC249FF5B02DCE1D62F011E553B2 +E767E48A1CAB27FA0237E35464C55CBC199F7596FC2F60BD9D853D825498D381 +D52C5FECDED23525AE02234F8AB609EB0339B06A46BE7AD7DC67A08FFF568B3F +25C071294F839F96C2AE03BC57DCE13855AD7400D7BE881DC5E34720F408DD31 +B6B5A33E2BE89889F0F5868C71602B086EFF8DA6554640A822B59D547C1DA709 +E29964B2E321E2E803684C8E5D64384228714509E618BFFCE97B1298203E144E +FD4E16F8C2B37AD390CA7A59E3ABDD281B2B41738C96478DEFF7DFDF45BD60B4 +BFF2C7E57027AD51112808DF8E36F0423391C8328E17AE3D71B3EA2958720539 +5182BF85FB826E5119E4D56BD5C0100647B190B3F2F671012AC37165C85962B6 +E1679413DE6F824482AACAE6301C9311BBCE073B1349BE7A287D9B6486A683C4 +4D4C541CF4667B55EC959511E0FB0DD4BFDE5F7F71341598CDD86CFD646C22C1 +A2919208944AA9C75A62F1DEF2AB80DF12023564EEF49D56B0D6D05FE2757BA8 +66F35AB485083ABE685486B81B68082FFE98C89CF09D0171A1FD0CB866E94AAF +AEEEC73F2AADC9F1B1ACD6545BCDA0CE039891B541FC674F2D6831ABFFF143A6 +8CBB10ACE99ADAC14E99ACDA73CF808B10E87B42DF4AE186BA18FBF828D0BC09 +A4A1C10FE4C47233B57CAB00B6EDD73A38F345609EA860C884E22597A1AF21A2 +4EEA28727C1A92FEF237B84507B38CAA4C66BF72CB2CF1C7F94562029B286AAD +BF01AB7FFA13A1E0D33494802667C5A3EEF5D51BE02AC508A997B5F09B747089 +2D7C3145EE5A9E7C15DB5AEC8304FB776F15122DF7B939265D4FCC43488EB42B +699CE8F68E943B035FA1F378E5621BCC00C810163737632CAB6826161D90448F +3403C32EB1B52D7FB65149EED419A765D56A05FE6A2706D998DBC84125D617A3 +37351C9C547ABB6F1AB4FADEA5A265AF4D9B45BEC4147B6CC5110251A426350E +60F3172C40805292170B850FB347DD98793AFB38E475AD2BF38F8628987E3F50 +651114D1527F030ADA4D61944E677977BB8EEE0C1EF98679246CB1D43403311F +5F09BCB30445487F82ED268577F22479EFE87DD0022D42D3328990B88601C3A0 +D5A8389C4578C3DA01F653EEF9EB5D83A98A6939320FCD6F5B6A5A60FADBBCD7 +E5A7DE5A95D1CC7DCF5A051C652B767FCBC59D61AB9FB5141F393F2028879995 +4AB737BD26D81232CA8D64DAFF989F878537C305BB5C09889235BE3727BDEE32 +EC5A4D06A68746CA33CCED3F1D456DFF0118E993C802AF0C3136FDA8B93BC16C +E22A5C124972517594A82850CDC000F6505A7C5AE9E75800EFEC3815C130EE25 +547A326325271049D9B178E23FC5FDE8880CDA9C903EB4B8A44F85620465FF4A +D097A6D89A8B644E7D9944E180A3E1EC6D2581715EADFBF3C2BE3B330B1D208F +B84C4B98E999C5684E9843E6AA2F932D1813DAF4931D12AF17FD2CB2387751D2 +5D14CEA4C66C48C7E6FD61BA6D09E591188E7CFC0F5C306672481FC77B5C6D84 +F589673C4F4EE90E2D3D1345196A10907A22585E7D55A9620FD7D191956DF340 +4C98AB5A8A3D98798F2581D409FBACC2419A031666DC9967DD10A1A565A98672 +BDCDD345FCEC9BC08698949C887E90EAF94B7CB450A9C45FCCF289DEF3380309 +D7644EF509BCFF5628ED51E056FD7848A2A36E30551E13B2A2921AE2028B2C4D +902F7C901BC54F945AA1AA018EBA00AB9A2FB36159147C74880C06A26092B54C +D3E6DD432A3507FA11384F0C08C68942C26ADD98DBE948D854199B19B0421687 +7FC55F9284AF035C5C9DB4269FE72FB251030F9A5A31A75FBBB0DBB1151EC785 +08F8CD88D6FD5A700AC0F6E0F37536C2F1228052846C3ADF9DDB7D56A57F19C1 +B8382EB996D8FECE8F8B130B89037F9FD4D58426049F99B840F337BE6A9427DE +B68BA69B32A301263F8881F35332FF35ED6BC15FBD4A8915C8CC37839BE3944E +A15701B8FABC6D533FF5D8C96B1D599DF7E2738996520A0702307E3C91A476E5 +C76AA881695D7400238B4EDC669BE334B84A66B9427432A3AB970D55A899DFCC +81F7C68D637F77121B75C0D6C073CD14A7311799CAD07684A5C0F662CB10CF9B +FDC4CB98B6E7892BFE731360E35AD6008F8154E419FE86FCAB0264173127B1C7 +92D6DAC832571CB2771F9EBF2486F61FBA0D94DBF0795D5653EDBA2F7441B683 +C3E77B314D02C049282E7B749B80C326DE8DA52D632A1A9C3C84198785161129 +D527239F456F6FA14CC264ACA06DCDF408278CF105A3786073709E365A85BBA4 +74A20C47CF495A0913CE079F33B71BAAE3928C18D59B2DB6A38E54EAD9FB87B4 +EA6D147D264E48E665A4DFB466A948811DE66770B0774C80BC2C54EB7452017A +52AC312508C6FB6A4DE3570A3DF50EB00540003382B91E06067A3D11E1DDC023 +5EF8787F1F1015152BE7F3D5F88EDE778E946768E4E333288F4DE66D604822A7 +5F2D5069B6CAB613145652E07F608A093645EB6DA6A9B231EB5EB31C097354B4 +AF54E8AF3455011E51ECC74FEB9847FEE3C42DB441DC3E39DC1650E80BB2D530 +823B1246699B391341E7D7BBE42DE15092EE2FACECE3B8290FBFE4567E4E3B09 +973088770EC250F55AB5FB3E7ECC7537909622252E7967AE84368FE204800BC5 +6C51A8DBB2DF121FD04225015DB5A39A1D6241C9874215D115A58D8329E752B4 +D5CE3B1BE30D1703A044BA14B6C71F406733E771E8F9FC662C6DDEE86BAB4F68 +DAFB63D8870938C3149CC07F6660AEC0296885F64905B8BC82B317DE4DD729C9 +5989533686291EE980EA2470794FB3DEBEBE9E41F9BD793CE4DE37D9821D44EF +803651668599D59FA7D44526F67C73C954BBB28BB25BF8606340755D02B23C42 +094CEF3CD30B04B9AE08FCDAC339FC1A9DD2008B0FF3C1F68C328541FDE6FBA9 +98DE24C4C3B3FC7D3B0D86FE89B6716E57BF46CB201F6A5EF73F05444D024D34 +639BA30B6D6F1A25D7CDB89D79FFD826663A3DCE5E9F4C72F06DD6C32A34CD22 +A7A1B7E3CD27707F4F09EAF284ACB3D960A530D4932D08028CFEB3AFC2D59170 +730ECD5D19B4D23108944CB7649AB0F1F3C286863A6A34A964A879D63CE05F1D +FC11C5B69374F1993DCCFFC99D0E597C3BC99DE67E5059FF0672F79938F4CC4E +4C66D6DCB0239444F2E614D09692297C7329411AA1CD5A540F9D61EBE2AF8B58 +DF46F4065672539C326B50BA1CB54DE5603D0799534ED0BE40AD5C72B4EBEF40 +A5EEBD414F1639AB6C955557FF9BAA0B62DBD32895B0DE12FDB66694F3CABABD +7D54F0B29F8EA32CE746B652CC9E44EA64C3F8847053D8E50CE044C990A7BA13 +7B1B0F4B2FA68D08A82C30E800F8B26CC84495B222ABB5E41824953315CE7F22 +6D8FB5AA10A3EAE16A1B5BA8A283854C5A1735D5F628DB64C8DA6E51C727EA1E +C3CF188BBE2473E9112529AA6A8DA151DBABCC26973531DD69B4A14D9783FF33 +FCD1672B629CD4DAB4EF573DFE9C3BC550C446A34940BE4437F43CCD16CFA3C0 +537ECBB7DCE1E76D9FCC2EA5E9E5656F7C7A3FE1611BA6A8AFF0667450A4A8CE +0706CDF854B4DEA79C5FC25A0556F44CA3593E89ED5881ECB5BB3EE6572F8F2D +4D31466C9AC2350898349C3208636F43D1EBF5BB2F01DCF827AD6C205F3B381F +800D5F4B827107AC881BD66BF5CEED3205535C8C3704A02614E6233344667C48 +570C4B5A3326D2F58A6111AC9B0CA7F3A48DEC898FD5AA05929492B8FF061E1C +990E08AADA5E9711658E30F71BA41A7806BEB51BE0949777E1550F54C66B8AFF +DF4129B42B71DE6101C57DAFA63FAA169145C0D6A0D6279658431E874C32250B +AB0B09056CF7A096E7E644B5B629F275194CB0CCEFC7A802F123A587156AB136 +513A7362EFC4C0EC330E11C3E25B9A943D2BDFDC1EA5C19DA64B47E690C2726A +0C0708F7A1DB146B80C6E8B4D30D28F6E8B7A7505EAC296258485AFF374652EF +ED73EFC04C6CFD28890F035DBB7A0CFCECE8AA68FA622390B782E595D4157106 +802499D76B0351617B5CDFF4F7F758DAD993DB5628B346240DF540E821144C5B +D7FAC2C00B22D8DD374C6FED26F619FF150AA2292A9D03AC7F5F6A20B3283890 +C80DB07E6923B6C485819A849BA8A3F18F7B4D309802AB3D489587721417A2DD +0B1A4D9994E3C611E3289465E657939EC06D752330EDD2D475E67F345C3527BF +0175182934D53176D5877D064F6FE1C1D559DC657E4C2CC83FB022A38E6E406F +E8F85B556F9A771F4DDA35AAE7C76DE0CCF5C2A9D9F4AC946C1A836553D792C3 +F2F8FEFF9A6D7DAB2FA5F0C9973FF8E3206680D96ACF9CAF54FB6274B99E3F9D +7E2B64C85EFDE220C15BF9F4AB5CB772197464078AE34FFEA9095DDBE6B0EFE7 +4AFCCEA58D12EB46648093EF927A8E600F0D4E239BCDDE8DD5AB6A651018E932 +746F18584378B3B4899B6E5E7B3C742835BBDE2D9271AA95E1E1C714F51B8D08 +562CFF8AC79F495578993955611AD98303AAD37FEA8CF9AF63543C1B4DC0281E +1269CECEAE77D660AB8800EAF547ADA30278345A189EB7CE9B03B936F3511496 +84E87A395C9012C66EE994141779E4282AE968FFC1E764C45751CCB23049BEED +069E6AC75A8CA8D115B4C269C8E6EB3047E0A17251D46D389F43809423BC2A8D +1730A54F8ED38019DDC4BC752539AA8FE9514EBC42F74FC8B50A850D09829810 +4CF7546878A85B8A9CCCFC866B5C30E1E5295E50D2E05F02B414B04830756970 +09BE8D4898B2CB6D2E95FA6890A620DD863B30C1EC77C08AFA711EF6C0D45878 +2E93BB6E2B4B44A5D24C55C22E6D58E4AE93A566B5545783E1B54B937D68BF21 +45A1CFA44CA87DBCEC8EF7A309015EB883D14BFD9DC89DF814697740C100B0E2 +1A5DD11DEE47681B153C4CFA026451660213253618E16F5C3B2D590363786BF0 +83E23B438E0FE85597F74C40611C5D3BB944108416AE0960432B8E59D8B64197 +81DAC51D615971E976768826B90CE2C563E498B8EE3A2D28546814F3D7E6DA78 +217C56ABD4CD323029CDB3C01B1885A9E12D5F92E773F31B50E2DC680708B37A +F234AB215B75DE93E7912E20DC4937EBE1208B476DD8BCF68F115B72FA76AF8B +B14AAC4AC7097D55B469262970369AC25526BDF3EFA81563066A37A4A71C19C2 +27611CF279C483B6C0CDE8B302C531E8F776CD557D91F348494088D6AC9CBD93 +7D0935EB5CE4C558247EFE669A39C56DC5F683337235E405BDB83CCAC1EA995A +7E437ADB4B9576683D8E6776830D570699D696B0C233BDA475B1909197F57B04 +92A0A6F9D72F4E8A56A71CC7F4729C06A5C4F9915FBA4857276A50D2A4B857D5 +3F20433EB0098D714E526D288CB0F36B88B989FF98EAA2AC2FD44DE6E0159E98 +341459E97C035442EE8974C465ED07924FE76933E6C6B2D0D632EFE2FDCEDF92 +6D1B58D9266F961916E0B21C7EDA8533638DE541728C38225C8EDBA3DF56D9DF +7CEE29D9EF955215974AB20AC024439A3730BA9227B1DBDABAA2D83443CC2F57 +21F0ADCFB8C2AF6FC327F9AB05C646C7BBFF81F3C3DAD7840CB477A2584695AC +45BA0AB785FF4C993900136B6139E4D26B5EABF1BF17A80C6370CC2BC3540A0E +4A4914C8F61A9608DE06BC8DABAB1492482AE665460981F4258B05E8F3A197C5 +30350BEA2DC89BA16224E570290845A6C7096C0C7707DAECFC85F9C853B8D65A +616E3323082033D542C13FCB10BCBDA0BA71445145A511641BD12B35AB5D8E74 +11D5EFEDE88EF9392103EC087932CF217CB44935FC6F99353CEC68F814950518 +EF919470486379FD02265F766244436BD290C65600D964044989C7F6A9672EF7 +803021A9E4AA6818125000EAE5F90D382AAE0908A26FC6083A90B88FEEC0746A +9F008C010CA98EEA7AAEA307037D2CA7200CA9BB68916CCAAB05E57FE7164A7D +C3D820303340D49EB29E6EF22A023F2D42D67A664F38C4FBDFC9A31A28A02145 +E38CC211BC73DF5F661EE9A3CAA076E43EB233583865289F66A7ACBE315AF81B +AFA2CFDE8A20549941EAE2E73E33BD0EB8D075F492724BC444FE8953F5F77B2B +4E7378CE552F79C360EEBA56B64CAA47DF10D14402EBEDFFF7069444AE3EBE3A +E96201E14EF892868F9AA982E738DCFE7E8DBE41C8F43A227EFC9EED795F5D6B +40D3A08D867F363232B20C71CF2E44B884A8CF28D96A028BE7C67DE00765793A +B1C867F0DF3E1D578D96428CF1E66632EB746C4B71314D5D009BEC8CA52A7518 +89B9255BDF988262A4BAF717FAB90525C81C223D4936F0AEE0E40908CC9E0DF3 +17AD71C0F5009CA00E1E6F8CD308501356235F63CB112C6760963857B6B20A94 +7FC16C899A7EA6743267F889D070698554DECE912C6052E04DF59FC85E67561B +3C7345EA3E21DB7206A14EAC4F46F457A83C1E2877B56EC49EF87B9B363F4B77 +BB6F51C3F1454325010AD71E28E935E74924A6ADA4A08C6C723276CBD4DA333E +C3590B7FB914E25828CEAC502704BB4C8C0C64395EED986F91D8C940D3F0ADEF +1F2749400B4D9A8BEA50CF4732DCBE21A6BA4DC17762BABC34DFA16EBF988574 +6B6363A6075CD4784CB799E35D29425D55AF001F51E565FCF4D18E98EF3C94C8 +5B88BC96A9157BED2529803EDE8E42BB57FD504764175EAED257D6E62CF9A17F +3E08727A38A0A43221BD62CBC2818ED5DDABD2E2FA6141D986229528AAEE7C73 +532A8D78FB8FDF433022F0EA43B63EEC52D3829E84AF010A2A19742296D91415 +42F9E632FFB3F0D8457AF426F0CA3B9A1D56DABD0537C9B5A9CA82E42A647CF9 +BA8D38F49445387AC896F16D85708BD8CE4BAA625EA09621EC17FD1A1377807E +DD68854483E84C181532D3B70680773CFE5D580712FD948F5D34354394D4E502 +6AD35AB042519E82177E06284CCAE4AF2C6D918FB32DFF205E9D9C88E31143FC +66DC0572961089CD0F2AD2EF82CF204E8AAB1F0122130232ACE276B134A9BB0E +91FF8020FBF69B32C93F1C10026F6B2E1D40796313D974E066BF799311595012 +59886A161B669C22EFD773802ED9321BE23DFC3240D170BE8499E1735623A130 +054EB5EC958884699867E3C94FFE49CBC9AD6C3C935E56C0712CDEB13BA92E2A +AA843CD9A30BA3C01ECC284DA4AEE6689A1A9E3D7D0F6A144C658F9441E730FC +24831893520FB7D2C69104E56D5D49DD6A86152C9BFE88F6166104AEF80B992D +406205CEA63C31A7B46D6B8C9A1782A0A0A30DD52066642554735406851F863B +BF981B4C8DC4882A03BCB160A06D18D72E61A49A23163BF92D091C35CEE0CB85 +04E3D95F3E98CBCC53B0015AD136FC481078ECF65B62EDD8EA3EF1B938119D10 +36D6D85412D1104BFAD6A4589C17B40EEEC5C3FC90933D9095B49A6956CF9F61 +E54384137A39A509200B0E51C1625CB599A91B287744677E059E6BA039B6146E +791EAE2676D2E233F2659C92A10D32A055935A193D4480B4E7069D3DDEEAC166 +1D24FE041BDD02D1A84CD43C43331AFE821B4ACC22F165DC53890D66606FA10C +B83E2BBA03C826B958FA79C31E081B5396297013A70E1FE82E76C8512402EAE6 +840E5943B19623473FF8F215D6332EC26D1DD0760142E4296287F98A30CB2A82 +8A639137E8BB018AE16F54FFB9100F533587B4812B5A7EBB0C2DD22D20F1B55B +D241DAA8614240F2B528CD48CD2F71496F181A94F181F7E85D07E4180CEFAB87 +57090401893BD680891ED7E7C9218409DD4995F3DF56E77F79CD06B9207328C1 +1427488F5876672E3806D8B8E0BB95AABA421B6629EA9A5A5FC811D43209610B +F729AA30565DC4C4A2CA67721FF1F87A4C4B26BBFB2B68766840DD148024FB21 +F2750EFD0F31FE624CAC5D606B6C14C15B1FD7D4DFF182F436399C19F22C9F57 +F243086E319BFFD7412871031E5226D494B41EB70093103C606ACD02F6B2737A +31C6DC7E3617F617471C37861161C799646C1CF8B60E9A5366C3A9EA785ADFE5 +2AA75D252775300DDF7F463E15FF6EAD513BC042837243F8514AF04586F5E451 +AEAA68E3C96574415497576D010A6D68148DE883083070DAD871E8F151C1C1F2 +2E82F50EEDEE298EE66699BADAA6677586F59AE3DA5038F513FDCFD7978B2829 +794271AD63CA26EA8970DCA4F32B57C09799C9B8D78BFBC50FD36A3F3F254799 +B313915C9640A27AF3530C68FA3053AEF80B2659AD152CAC44BEFDCA211EFD6B +1DC6A25A08183879CDB74DD95EE2779416C0B3EA306720FABA153F3BD94B0DC2 +A429050A7D6B7B5A54C2AF4F45194667C3CF2EC4014444717DC6C7100035C504 +216661A97B632FA32FC1E021AFB75B395ABF844C558122C416F3CAB82B4ED56F +15589E9F34CCB7C0C7F7B5FBBF48169105355F6EFF2F41A212C24A81BB9A466C +598B921E0CF721A525187BC75CB3B2DE6A94205517B2CAA504F351BA0DC5C26A +28CF5AC9DF3C81B888AA3C930DE00DA50DB0422A0D85A00C7E2AE3061E1E17DA +55B3E3C998466DB8337E81059214406CC58CC1C204EB3D435C50B52E14B91905 +CC33F6D9C78342EBDD3033EB6A8D41530105CDB05B2E67606A022D366284CEC8 +6BB9FF090261A42EDE521B2BD2D955050F3BD2EDE7976A68F17F889943C369FD +564CC15CC19D082B2EF4FDCB95E835A0CA799B4F8B68215006ECC332955837F1 +9118D86E07EA5D7815F66D3907EFAC1A2B76845B90B1D385EB08434B5DB96FC0 +59A97A94E4C21015EE22E04BA4A962F5ED4BF157A6 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ogclient/lib/fonts/micro_40_50.qpf b/ogclient/lib/fonts/micro_40_50.qpf new file mode 100644 index 0000000..eae4a5b Binary files /dev/null and b/ogclient/lib/fonts/micro_40_50.qpf differ diff --git a/ogclient/lib/fonts/unifont_160_50.qpf b/ogclient/lib/fonts/unifont_160_50.qpf new file mode 100644 index 0000000..2288575 Binary files /dev/null and b/ogclient/lib/fonts/unifont_160_50.qpf differ diff --git a/ogclient/lib/grub4dos/COPYING b/ogclient/lib/grub4dos/COPYING new file mode 100644 index 0000000..eeb586b --- /dev/null +++ b/ogclient/lib/grub4dos/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ogclient/lib/grub4dos/ChangeLog_GRUB4DOS.txt b/ogclient/lib/grub4dos/ChangeLog_GRUB4DOS.txt new file mode 100644 index 0000000..8db358f --- /dev/null +++ b/ogclient/lib/grub4dos/ChangeLog_GRUB4DOS.txt @@ -0,0 +1,585 @@ +2009-06-20(r68) add (ud) device to access space created with fbinst. +2009-06-11 fixed a bug of missing assignment of ES and BX registers in +int13_handler(asm.S). +2009-05-13 fixed size-wrap-to-0 infinite loop issue in grub_read()(disk_io.c). +2009-05-07(r67) resolved conflict between int10 stack and BIOS Data Area(grldrstart.S). +2009-05-03 fixed a bug in geometry_tune(grldrstart.S, asm.S). zw2312914 report. +2009-04-30 triple mbr without bpb also bootable as a floppy(grldrstart.S). +2009-04-26 added ending CHS calculation for partition entry in mbr of the triple mbr(bootlace.inc). +2009-04-25 bug fix in dd about device length calculation(builtins.c). +2009-04-24 save and restore GDTR in int13_handler(asm.S). +2009-04-06 accept partitions starting in the mbr track(probe_mbr, builtins.c). +2009-04-05 triple mbr floppy partition (fdX,Y) support for some USB BIOSes(disk_io.c). +2009-04-04 fixed partition table entries in the 2nd and 3rd mbr of the triple mbr(bootlace.inc). +2009-03-31(r66) 0.4.4 official release. +2009-03-28 removed the problematic global variable "i"; reduced one open-file step for configfile on cdrom. +2009-03-27 fixed memory overlap issue on "map --rehook". +2009-03-25 disabled the search for DEFAULT file on cdrom(in cmain, stage2.c). +2009-03-24 fixed problem of WRITE/DD on modifying internal variables. added dd options for user-defined buffer. +2009-03-21 bug fix: turned errorcheck on in run_script and enter_cmdline. +2009-03-20(r65) fixed `configfile not working in menu init command group'. +2009-03-19 trying to fix problem of `configfile running slowly'. +2009-03-18 fixed problem of `geometry-tune too slow' on vmware. +2009-03-17 fixed endless loop problem while running "configfile (md)4+8". +2009-03-15 added new option --sync for geometry command. +2009-03-14 added new option --tune for geometry command. +2009-03-12 rearranged preset-menu items. +2009-03-11 changed geometry-tune code(aim to solve problem on vmware). +2009-03-07 fixed a bug(in grldrstart.S) brought in since 2009-02-05. +2009-03-03 fixed memory overflow issue with (rd). canceled restrictions on some disk write commands. +2009-02-26 fixed geometry-tune issue(reportedly with Virtual PC). +2009-02-21 changes made according to Simon's hiddenmenu patches. +2009-02-20 documented the command line needed for chainloading stage2 of grub legacy. +2009-02-19 now a range of drives can be unmapped. +2009-02-18 possibility to run another menu.lst after gfxmenu. +2009-02-17 fix graphics display issue generated last time. +2009-02-15 improved color command to set color for help text and heading line. +2009-02-13 fix problems booting Linux when there are mappings. +2009-02-11 added ext4 support(in fsys_ext2fs.c). +2009-02-09 isolinux.bin(version 3.73) gets chainloaded again. +2009-02-08 Move some variables to a known address. The read command returns value at addess. +2009-02-03 New initrd syntax loading multiple cpio files for Linux 2.6 kernels. +2009-01-30 Supported per-menu-item help text. +2009-01-28 Fixed printf issue. Allowed non-block files to be written with dd and write. +2009-01-24 New syntax of WRITE support writing string to file. +2009-01-16(r64) Added gfxmenu support +2009-01-09 New commands dd and uuid. fixed a bug in disk emulation. +2008-12-30 Work around for BIOSes lacking INT15/E820 support. +2008-12-29(r63) Now the preset menu holds the highest priority. MSYS/MinGW support. +2008-12-24 Added "detect" sub-command for the "pxe" command. +2008-12-21 Fixed several bootlace bugs when running under DOS. +2008-12-20 bootlace is now able to create triple MBR. +2008-12-19 fixed problem of Disk Read Error on the last track. +2008-12-16 under DOS bootlace can use a parameter file for its command-line arguments. +2008-12-12 added a new option --chs-no-tune for bootlace.com. +2008-12-07 workaround for buggy no-emulation-mode cdrom BIOSes. +2008-12-04 fixed ext3 inode size issue on bootlace. fixed partition table check issue on bootlace. +2008-12-03 cut off the MENU_BUF. removed the TESTLOAD command. added TITLES array. +2008-12-01 added new program badgrub.exe. changed syntax of the find command. +2008-11-19(r62) enable interrupt when DELAY. avoid disabling CPU cache in a20_test(a20.inc). +2008-11-18p added STIs to better respond hardware interrupt(a20.inc, asm.S). +2008-11-18 changed DELAY code(a20.inc). added JMPs in unreal mode for RAM disk emulation(asm.S). +2008-11-15 loosened the check of the first FAT entry(fsys_fat.c). avoid using OUT instruction in DELAY(a20.inc). +2008-11-11(r61) added --ignore-cd option for the find command. +2008-11-08 read the boot file to determin the pxe block size. avoid running pxe_detect for non-pxe booting. +2008-11-02 added a new option --mbr-no-bpb for bootlace.com. +2008-11-01 changed PXE_MIN_BLKSIZE and PXE_MAX_BLKSIZE. allowed FAT cluster size larger than 32K. +2008-10-26 fixed pxe block size issue. +2008-10-21 fixed cylinder issue in int13/ah=8. Fixed stack conflict in bootlace. +2008-10-17 added command line options --serial-number=SN and --restore-mbr to bootlace. +2008-10-12 fixed a bug in fsys_fat.c causing FAT32 mount failure. +2008-10-03 cancelled unnecessary initialisations for the root device. +2008-10-02 improved int15 probing in probe_int. +2008-10-01 before booting GRLDR, give the user a chance to boot previous mbr. +2008-09-30 fixed a big bug in set_bootdev causing extra rawread executed and the geometry messed up. +2008-09-29 fixed a big bug in get_diskinfo causing duplicate geometry calculation for each IO request on floppy. +2008-09-27 fixed a new bug intrduced recently in get_diskinfo. +2008-09-25 fixed an issue of uninitialised current_term in boot.c, causing the failure of the kernel command in graphics mode. +2008-09-24 fixed the issue of "$BITMAP should be non-resident when in attribute list" in fsys_ntfs.c. +2008-09-23 fixed virtual cdrom sector read issue(64K at a time) for a non-mem mapping. +2008-09-21 added a new command "tpm --init". +2008-09-21 fixed memory conflicts between graphics mode and linux kernel. +2008-09-20 fixed a serious problem in grldrstart causing boot failure on FAT. +2008-09-19 fixed a new bug intrduced last in get_diskinfo. +2008-09-15 fixed a problem when different action occurs on a drive between chs and lba. +2008-09-13 fixed a problem of reentering int13 handler from a virtual device on a real cdrom device driven by the builtin cdrom driver. +2008-09-12 fixed an issue of whole cdrom mapping. +2008-09-09 fixed virtual cdrom sector read issue when it is not a mem-mapping. +2008-09-07 title delimitors(or comments) can be used in menu now. +2008-08-27 save stack space occupation by the int13_handler. +2008-08-26 fixed a bug relevant to iso emulation, causing disk read error. +2008-08-24 save stack space occupation by the int13_handler. +2008-08-14 enlarged stage2 stack space. +2008-08-13 fixed again the bug on the root command. +2008-08-12 fixed int5 in probe_int. +2008-08-10 added a new command checkrange; fixed a bug on the root command. +2008-08-08 added builtin stack for int13_handler to avoid stack overflow. +2008-08-06 fixed a suspicious problem on the SCRATCH buffer in get_diskinfo. +2008-08-04 fixed again error handling problem about operator && and ||; added STIs to better respond hardware interrupt. +2008-08-03 fixed error handling problem about operator && and ||; grldr.mbr structure change; other small alterations. +2008-07-28 added STIs to better respond hardware interrupt or to feed watchdog. +2008-07-10(r60) let KEY_UP(KEY_DOWN) loop to the last(first) menu entry. +2008-07-06 added backup_int13 and restore_int13 for a buggy usb bios f24a ver 1.00parttbl on compaq v5235tu(reporter: uleak). turn a20 debug on for memdrives. +2008-06-28 fixed ext3-inode-size issue in grldr boot sector and bootlace.inc. +2008-06-26 fixed int4C-4F in probe_int for Lenovo A6900. +2008-06-24 fixed "256-byte ext3 inode size" issue in fsys_ext2fs.c. +2008-06-23 added command ls. +2008-06-22 disabled safe_int13 code for a buggy usb bios f24a ver 1.00parttbl on compaq v5235tu(reporter: uleak). +2008-06-21 add A20 debug code to help locate a20 failure. +2008-06-18 A20 test begins. Update version number to 0.4.4. +2008-06-12 Let HIDE and UNHIDE respond with a message. +2008-06-10 Let ROOT show correct filesystem info. +2008-06-07 Let MAKEACTIVE and GEOMETRY show active partitions. +2008-06-01 commented out the terminal-switching code in run_menu. +2008-05-31 changed asm.S to avoid clearing out bss for the configfile command. +2008-05-27 initialize saved_videomode/font8x16 for working across configfile. +2008-05-25 fixed int76 in probe_int for a Tongfang. +2008-05-22 fixed an issue of CPU cache wrongly disabled in GRUB.EXE for long. +2008-05-21 fixed an issue of stack-overflow in real_get_cmdline. +2008-05-17 enable the geometry_tune code for test only. +2008-05-14 fix int5 and int8 in probe_int. +2008-05-06 adjustment on probe_int for "pxe keep". +2008-05-03 fixed problem on the commands setup and install. +2008-05-02(r59) add new command checktime. +2008-05-01 fixes on int vector probing, A20 control, configfile, find, etc. +2008-03-14(r58) commented out the geometry-tune code. other fixes. +2008-01-01(r57): mini build support +2007-12-25(r56): created the test branch +2007-12-25(r55) removed commands uppermem, ioprobe, impsprobe and displayapm. +2007-12-14 test 3 of the geometry-tune. +2007-12-10 cleanups on chainloader and errorcheck. +2007-12-05 fixed a bug in ntfs file system module. +2007-12-04 fixes on gzipped (rd) image support. +2007-12-02 int13 emulation workaround for buggy BIOSes('Disk read error'). +2007-11-23 implemented cdrom emulation. +2007-10-15(r54) version 0.4.3 +2007-10-08 implemented chainloading isolinux. +2007-10-04 changed drive number of (md) to 0xffff. +2007-10-02 reduced output messages for "debug off". +2007-09-27 added a new map option of --a20-keep-on. +2007-09-26 a workaround for buggy USB floppy BIOSes(hang at INT13/AH=48h). +2007-08-27(r53) new notation () standing for the current root device. +2007-08-26 new feature of root prefix for support of relative path. +2007-08-25 fixed one more possible issue on A20. +2007-08-24 fixed another possible issue on A20 for memdrives. +2007-08-23 fixed a possible issue on A20 for memdrives. +2007-08-21 expand memdrive size according to the probed CHS. +2007-08-17 test A20 control for memory mapped disks. + + Updated code for hmload. + Fixed a major problem of endless loop on enumeration of partitions. + Fixed an issue in probe_mbr. + Fixed a bug on compressed NTFS volume. + Fixed a problem in probe_int by capturing int10. + +2007-07-25 version 0.4.3pre2 + + Added a new command OUTLINE, and a new option --duce for GRUB.EXE. + Changed PARTNEW syntax. Fixed a problem of OPEN_PARTITION. + The arguments of PARTTYPE have changed to be optional. + + A Fault-Recovery-Handler was imposed on probe_int to fight against + some very serious BIOS bugs(reportedly of DELL machines). + + The DEBUG command syntax was changed for verbosity control. + +2007-06-22 version 0.4.3pre1 + + Fixed two problems on GRUB.EXE: preset_menu and FreeDOS related. + Added a new command `hiddenflag'; Added BPB in GRLDR.MBR; Ignored the + partition-ID check in filesystem modules; other fixes. + + PXE and NTFS fixes. + Fixed a bug in probe_int for GRUB.EXE running in VM86 mode. + Rewrite fsys_ntfs.c + Fixed probe_int and init_pic in GRUB.EXE. Reduced warnings in bios.c. + Added PXE support. + NTFS code update for bootlace. Fixed timing functions. + fix a bug in get_diskinfo; protect the MBR of an in-situ-mapped drive. + Insert-key to debug on startup; polish graphics. NTFS boot record fix. + Bugfixes on STAGE2_SIZE, arrow keys, and handling `&&'/`||' in menu. + Move preset menu to the end/tail of pre_stage2. + Numeric keys to select menu entry; fixed a bug of int13 harddrives. + Code clean-ups on build script and keycode translation. + F11/F12 hotkey handling. + Added builtin NTFS boot sectors into GRLDR. + Added 3 commands is64bit, errnum and errorcheck. + Applied Robert Millan's patch of check_64bit. + Implemented two syntactic operators `&&' and `||'. + Added a new option --in-situ for the map command. + + Fixed an auto-probe-int problem of GRUB.EXE under "EMM386 noems". + + Workaround for buggy VirtualPC on a issue of floppy-emulation-mode + bootable CDROM. + +2006-12-28 version 0.4.2 + + Fixed a bug hidden deeply in memcheck. + Fixed a bug hidden deeply in get_diskinfo. + Fixed a bug in load_image. + GRLDR(as a no-emulation-mode bootable CDROM image) was adapted to + cope with some buggy BIOSes(e.g., VirtualPC). + Added LBA-to-CHS geometry translation(in int13_handler) to simulate + LBA(EBIOS)-enabled drives on CHS-only drives. + Added a new feature of Unconditional Command-line Entrance. + Applied Beverly Brown's patch to load_initrd. + Added two new options to the map command to better serve Win9x. + The default config file search path for GRUB.EXE was changed to + (DOS file) .\menu.lst and then (DOS file) \menu.lst and then + (GRUB file) /menu.lst. + Other bug fixes. + +2006-10-24 version 0.4.2pre11 + + Made a workaround for buggy USB-bootable board QDI 848E. + Made a workaround for buggy 965 board with SATA CDROM connected. + +2006-10-07 version 0.4.2pre10 + + Fixed a problem in GRUB shell which causes failure in grub-install. + Enabled GRUB.EXE to run under FreeDOS with memdrives in use. + Implemented an auto-probe mechanism to support all kinds of DOSes. + +2006-09-19 version 0.4.2pre9 + + Resolved several problems: + 1. (about kexec)Dropped the problematic kexec-tools-1.101-patch. + 2. (about stack)Adjusted code in C files to use less stack. + 3. (about cdrom)Fixed a few bugs in the cdrom driver. + +2006-08-29 version 0.4.2pre8 + + Added a new command `setvbe'. + Dropped the obsolete EZ-BIOS(with signature `AERMH') support. + Fixed a bug in parsing Rock-Ridge extension. + No-emulation-mode Bootable CD can be chainloaded now. + Some work was done to improve remote/diskless boot. + Fixed one more USB/Floppy EBIOS problem(in get_diskinfo). + Merged protected mode stack into real mode stack at 0x2000. + Code clean-up. + +2006-07-31 version 0.4.2pre7 + + Imported ATAPI CDROM driver from Smart Boot Manager. + + Dropped the previous implementation of SCDROM/BIOSCDROM. + + Fixed a USB/Floppy EBIOS problem that could cause media access failure + or even hang the machine when using USB storage devices. + + Fixed a bug in BOOTLACE.COM that had improperly set the LBA indicator + byte(which is at offset 0x02 of the boot sector). + + Fixed a bug in GRLDR that caused failure in finding the associated + MENU.LST config-file(which should be in the same directory as GRLDR). + +2006-06-18 version 0.4.2pre6 + + Dropped the obsolete EZD disk map support. + Fixed several bugs that may hang or slow the qemu virtual machine. + Fixed a bug that causes the pause command not to respond any key-press. + Fixed a bug that causes a command to accidentally fail if in a menu. + Fixed a bug that causes the menu not to work once a cdrom had booted. + +2006-06-05 version 0.4.2pre5 + + Added a static-linked binary executable file GRUB(a Linux utility). + + Fixed a gateA20 problem related to memdrive emulation. + + Boot GRUB.EXE directly off Windows9x/Me(experimental; might hang). + +2006-04-03 version 0.4.2pre4 + + Made GRUB.EXE run under EMM386. + Fixed a bug in splashimage_func(). + Made `ignore error' constant and removed the `--ignore-error' option, + and renamed the option `--seconds=T' to `--wait=T' for savedefault. + The sample menu.lst was modified accordingly. + +2006-03-28 version 0.4.2pre3 + + New syntax for the `default' and `savedefault' commands was + implemented. + + Changed `int' to `unsigned long' for filemax, filepos and fsmax, and + modified all fsys_*.c files in order to open large files(2GB or + longer). + +2006-03-09 version 0.4.2pre2 + + The directory `boot/grub/' was removed from the release tree(GRUB4DOS + does not use the stage files at boot time). The default config file for + GRUB.EXE was changed to (hd0,0)/menu.lst(but preset_menu still locates + (hd0,0)/boot/grub/menu.lst when (hd0,0)/menu.lst does not exist). + + Added DOS command-line options --bypass, --time-out=T and --hot-key=K + for GRUB.EXE. + +2006-02-24 version 0.4.2pre1 + gcc-4 support by VirusCamp. + + Limited support for returning to DOS from GRUB.EXE. + + Implemented a new feature that GRUB.EXE can be used as a DOS device + driver and be started in CONFIG.SYS with a DEVICE line. + + Better IODELAY was made for initialization of PIC to fix the + keyboard-not-responding problem when running through KEXEC. + + Better A20 gate control was made to help fix various problems on the + boot of grub. + +2005-12-14 version 0.4.1 + Fixed a partition enumeration bug(in disk_io.c). Fixed a bug of mapping + partitions to harddrives(in builtins.c). Fixed a bug that causes + failure when `find --set-root' on a CD-ROM device(in builtins.c). Added + a new feature of directly chainloading ntldr and some dos kernels. + +2005-11-14 version 0.4.1pre32 + Fixed more bugs. + +2005-11-02 version 0.4.1pre31 + A few bugs were fixed. + +2005-10-23 version 0.4.1pre30 + A bug about "bootlace.com --floppy" was fixed. + +2005-10-18 version 0.4.1pre29 + Added ram disk device (rd) to access, typically, the initrd image. + Added many new command-line options for bootlace.com to install GRLDR + boot record onto the boot sector of a floppy. A few bugs about + "map --mem" were fixed. Another bug about finding grldr in NTFS was + also fixed. It may cause the machine to hang up when there is no ntfs + boot record in the boot area of the NTFS partition. + +2005-09-25 version 0.4.1pre28 + Commandline option --config-file="FILENAME_OR_RAW_COMMANDS" was added + for GRUB.EXE where GRUB.EXE is treated as a Linux kernel. + Fixed a bug which causes installation failure when BOOTLACE.COM is + used for large disks. + +2005-09-21 version 0.4.1pre27 + Added a patch to the kexec-tools-1.101. Kexec might fail to load + grub.exe without this patch. + +2005-09-14 version 0.4.1pre26 + Fixed a bug for the DOS part of BOOTLACE.COM + +2005-09-11 version 0.4.1pre25 + GRUB4LIN has merged into GRUB.EXE; A new command-line option + --read-only was added for BOOTLACE.COM; A few bug fixes. + +2005-09-01 version 0.4.1pre24 + BOOTLACE.COM runs under both DOS and Linux. + +2005-08-27 version 0.4.1pre23 + Added a utility BOOTLACE.COM for installing grldr bootstrap code to MBR + +2005-07-30 version 0.4.1pre22 + Added bootstrap file GRLDR.MBR for launching grldr from MBR. + +2005-07-24 version 0.4.1pre21 + Added Windows NT 4.0 support(actually fixed a bug reported by Stefan + Baur). For other new features, see README.txt. + +2005-07-20 version 0.4.1pre20 + Added ext2/ext3 boot record code for loading grldr from the beginning + sector of a floppy or a partition. + +2005-05-25 version 0.4.1pre5 + GRUB commands can be embedded into the command line of GRUB.EXE + +2005-05-20 version 0.4.1pre4 + Bug fixes: When the system has no floppies, some operations, + e.g., the find command, will hang the machine. + +2005-05-17 version 0.4.1pre3 + Search for cdrom_drive from drive 0x88 to drive 0xff + +2005-05-11 version 0.4.1pre2 + Our base is now upgraded to GNU GRUB 0.97. + +2005-04-25 version 0.4.1pre + Fixed a bug reported by Gilles van Ruymbeke + : + + The map_func improperly opened the emulation image for 3 times, that + might slow down the load speed heavily, especially for gzipped files. + +2005-04-15 version 0.4.0 + Add /boot/grub/menu.lst in preset menu. This is final. + +2005-04-07 version 0.4.0pre7 + config_file takes precedence over preset_menu. + +2005-04-06 version 0.4.0pre6 + GRLDR can be used with no-emulation-mode bootable CD-ROM. + +2005-03-09 version 0.4.0pre4 + Now preset menu find /menu.lst, no longer support /boot/grub/menu.lst + + Partition images can emulate a partition (hd?,0) with --mem option. + +2005-03-02 version 0.4.0pre3 + GRLDR startup code search all partitions in all harddrives for GRLDR. + + chainloader can boot images larger than 512 bytes, and can load image + to a different location than 0000:7C00. + +2005-02-06 version 0.4.0pre + Switched to GNU GRUB 0.96 + The --mem option of MAP command was added for memdrive emulation. + + Also announced 0.2.0 final. + +2004-10-23 version 0.2.0pre13 + GRUB.EXE runs in DOSBOX. + GRUB4LIN is introduced to boot off LINUX. + Fixed a bug reported by windrv: NTFS check contiguity failure + Rearranged the patches. + +2004-08-31 version 0.2.0pre12 + Fixed a bug reported by szwp: cannot load GRLDR on partition that is + not CHS-accessible. + + Fixed a bug reported by windrv: take too much time to check contiguity + +2004-08-15 version 0.2.0pre11 + Mark the scdrom module as experimental. + +2004-07-13 version 0.2.0pre9 + Merged GNU GRUB 0.95 + + BOOTGRUB removed. Use BOOT.INI line C:\GRLDR="Start GRUB" instead. + + Patches from Gandalf: NTFS and ATAPI CDROM support(also thanks to + Tobias Svensson ) + + Patches from Chris Semler : findroot + +2004-04-12 version 0.2.0pre6 + Now GRUB.EXE can be used in CONFIG.SYS this way: + + shell=C:\some\where\grub.exe --config-file=(hd0,0)/boot/grub/menu.lst + + or + + shell=C:\some\where\grub.exe + + No other changes. + +2004-04-09 version 0.2.0pre5 + Now BOOTGRUB contains 4 sectors, i.e., 2048 bytes. Optionally, you may + copy the 2nd, 3rd and 4th sectors of BOOTGRUB to the three sectors that + immediately follow the MBR. Also Optionally, you may copy 446 bytes + from the very beginning of BOOTGRUB to the very beginning of MBR. In + this way, the GRLDR can be started out of MBR, without the presence of + NTLDR. + + CAUTION: Don't copy 512 bytes to MBR. The partition table should not + be overwritten. The partition table is in the end of MBR. If you make + a mistake, you will lose your whole system!! + +2004-02-18 version 0.2.0pre4 + Arbitrary-size floppy and hard disk emulation finally implemented. + GRUB for NTLDR is included. See README file. + Splash image version is available in the SPLASH directory. + +2003-09-23 version 0.1.4 -- development unstable release + Unfortunately 0.1.3 has an ugly bug. Fixed. + +2003-09-01 version 0.1.3 -- development unstable release + Rewrite the code for guessing FreeDOS int vectors. Hopefully it works + for all the future versions of FreeDOS :-) + +2003-08-25 version 0.1.2 -- development unstable release + Fixed a small bug that affects the read of the emulated floppy sectors. + + Added some files (including the menu.lst file) for installing GRUB to + MBR from DOS. Usage: + + Copy the boot directory to C:\ ; You must do this on Windows, NOT dos, + because DOS cannot deal with the long filenames. + + Run grub to access the menu.lst file in C:\boot\grub ; Of cause on DOS. + + When menu occurs, select a proper menu item for installing GRUB to MBR. + + If the menu does not appear, you should get the "grub>" prompt. At the + prompt, type the following commands: + + grub> configfile (hd0,1)/boot/grub/menu.lst + grub> configfile (hd0,2)/boot/grub/menu.lst + grub> configfile (hd0,3)/boot/grub/menu.lst + + Then, the menu should occur. + +2003-06-29 version 0.1.0.1 -- development unstable release + Do some cleanups on 0.1.0, no important changes. + BTW, it seems that the 0.1.0 is quite stable :-) + +2003-06-29 version 0.0.8 + Restore mapped int13 to the unmapped state while grub is invoked + after a previously performed drive map operation. + +2003-05-29 version 0.1.0 -- development unstable release + Floppy 1.44M drive emulation are OK. GOOD!!!! Usage: + + # boot Windows 98 SE + map (hd1,0)/dos98se.img (fd0) + chainloader (hd1,0)/dos98se.img + rootnoverify (fd0) + boot + + Another example: + + # boot Mandrake hard disk installer + map (hd0,0)/hd.img (fd0) + chainloader (hd0,0)/hd.img + rootnoverify (fd0) + boot + + Note that the floppy image file must size 1440KB, i.e., 1474560 bytes. + _AND_ also, the file must consist of one contiguous disk area, no + holes, no fragments. Use GRUB's blocklist command to determine whether + or not an image file is contiguous. It is known that a 1440KB-file is + always non-contiguous if it resides in an ext2 filesystem. But you may + get a 1440KB contiguous file with an FAT32 partition(vfat filesystem). + + Floppy(and hard disk) with arbitrary sizes will be emulated in the + future. + +2003-05-06 version 0.0.7 + + Fixed a huge bug!! Read the following carefully! + + Using the drive map command(just as many distributions currently do) + + map TO_DRIVE FROM_DRIVE + + to boot your system could seriously _damage_ your hard disk data, + + totally and thoroughly!! This bug has just been fixed in 0.0.7 :-) + + This bug is not specific to grub_for_dos, but caused by the original + + grub-0.93 release. So do _NOT_ use map command any more until my fix is + + accepted by GRUB maintainers or a similar fix is made by other + + people. For now, do _NOT_ use map command in any kind of Linux + + distributions such as Red Hat or Mandrake or any others. + + Because GRUB_FOR_DOS-0.0.7 already applied the fix, so it + + should be safe to use the map command. + + Another small bug was also fixed in grub_for_dos-0.0.7 :-) + +2003-04-29 version 0.0.6 + Runs also on MS-DOS 3.30. No other changes. + +2003-04-26 version 0.0.5 + Runs on MS-DOS 4.0, 5.0, 6.0, 6.20, 6.21, 6.22, 7.0, 7.10, 8.0 and + FreeDOS(build 2029). GOOD!! + +2003-04-20 version 0.0.4 + Running on FreeDOS(build 2029), GOOD!! (But currently GRUB.EXE only + has limited FreeDOS support, maybe unstable.) + + Add a "Guess DOS Version" feature. The program now exit to DOS when + guess failed. The previous versions of GRUB.EXE always hang when + running on an unsupported DOS version. + +2003-04-13 version 0.0.3 + The option "--config-file=FILE" was added. + +2003-04-11 version 0.0.2 + Also runs on MS-DOS 8.0 (i.e., the DOS with WinMe/2000/XP), GOOD!! + The GRUB.PIF file included, so GRUB.EXE can be started from Windows 9x + +2003-04-10 version 0.0.1 + Runs on MS-DOS 7.10(Win98) diff --git a/ogclient/lib/grub4dos/Get_Source_of_This_Build.txt b/ogclient/lib/grub4dos/Get_Source_of_This_Build.txt new file mode 100644 index 0000000..98c89e8 --- /dev/null +++ b/ogclient/lib/grub4dos/Get_Source_of_This_Build.txt @@ -0,0 +1,11 @@ +Get the source code of this build by using anonymous svn in this way: + +svn co -r 68 svn://svn.gna.org/svn/grub4dos/trunk grub4dos + +or in this way: + +svn co -r 68 http://svn.gna.org/svn/grub4dos/trunk grub4dos + +and now you may "cd grub4dos" and do a "make" to compile. + + diff --git a/ogclient/lib/grub4dos/README_GRUB4DOS.txt b/ogclient/lib/grub4dos/README_GRUB4DOS.txt new file mode 100644 index 0000000..c77243a --- /dev/null +++ b/ogclient/lib/grub4dos/README_GRUB4DOS.txt @@ -0,0 +1,3866 @@ +Please refer to http://grub4dos.sourceforge.net/wiki/ for DOCs on GRUB4DOS. + +Main project page: https://gna.org/projects/grub4dos/ + +Download site: http://download.gna.org/grub4dos/ +Download site: http://grub4dos.sourceforge.net/ +Download site: http://sarovar.org/projects/grub4dos/ +Download site: http://grub4dos.nufans.net/ +Download site: http://sites.google.com/site/grubdos/ +Download site: ftp://grub4dos.sarovar.org/pub/grub4dos/ + +Get the latest source code by using anonymous svn in this way: + + svn co svn://svn.gna.org/svn/grub4dos/trunk grub4dos + +or in this way: + + svn co http://svn.gna.org/svn/grub4dos/trunk grub4dos + +View the source code online with your web browser at: + + http://svn.gna.org/viewcvs/grub4dos/trunk/ + +GRUB4DOS mailing list: + + grub4dos-devel@gna.org + +Subscription page: + + https://mail.gna.org/listinfo/grub4dos-devel/ + +Discussion forum(Official technical support site): + + http://www.boot-land.net/forums/index.php?showforum=66 + +------------------------------------------------------------------------------ + +Usage: + GRUB [--bypass] [--time-out=T] [--hot-key=K] [--config-file=FILE] + + The FILE, for example, can be (hd0,0)/menu.lst + + In CONFIG.SYS, the line looks like: + + install=c:\some\where\grub.exe --config-file=FILE + + If no options present, GRUB.EXE simply uses + + (hd0,0)/menu.lst + + as the configure file, if it exists. (Notice! We finally + changed the default file from (hd0,0)/boot/grub/menu.lst to + (hd0,0)/menu.lst) (Changed 2006-12-23. See Update 3 below.) + + The partition (hd0,0) can be of a Windows partition or a Linux + partition, or any other partition type supported by GRUB. + + Only GRUB-style filename is acceptable here for FILE. A DOS + filename won't work(it is certain we should use GRUB-style + filenames because DOS-filenames won't access a file in a + Linux ext2 partition for example).(See Update 2 below) + + Update: FILE can be the contents of a menu. Use semi-colon + to delimitate the embedded commands here in FILE. The FILE + can be enclosed with a pair of double-quotes. For example: + + GRUB --config-file="root (hd0,0);chainloader +1" + + This command will boot the system in (hd0,0). + + Another example: + + GRUB --config-file="reboot" + + This command will reboot the machine. + + One more example: + + GRUB --config-file="halt" + + This command will halt the machine. + + if --bypass is specified, GRUB will exit to DOS when + timeout reached. + + The option `--time-out=T' specifies the timeout value in + seconds. T defaults to 5 if --bypass is specified and defaults + to 0 if --bypass is not specified. + + The default hot key value is 0x3920(for space bar). If this + key is pressed, GRUB will boot normally. If another key is + pressed, GRUB will terminate immediately and return back to + DOS. See "int 16 keyboard scan codes" below. + + Each option can be specified only once at most. + + Update 2: DOS filenames have been supported(patched by John + Cobb). If the beginning two characters of FILE are "#@", then + the rest of FILE is taken as a DOS filename. Example: + + GRUB --config-file="#@c:\menu.lst" + + Only the beginning 4KB of the DOS file will be used. The file + should be an uncompressed text file. + + Note: You may also use the `direct DOS file access' with the + SHELL or INSTALL line in CONFIG.SYS, but should not use it + with the DEVICE line. The DOS document said that a DOS device + driver should not call the `open file' DOS call. + + Update 3(2006-12-23): By default, GRUB.EXE will locate its + config file in the following order: + + (DOS file) .\menu.lst, the MENU.LST in the current dir. + + (DOS file) \menu.lst, the MENU.LST in the root dir of + the current drive. + (GRUB file) /menu.lst, the MENU.LST in the root dir of + the boot device. + + The default boot device is still (hd0,0). + + +-------------------------------------------------------- + +Update 1: Version 0.2.0 also brings out a new thing, GRUB for NTLDR, + which could be used to boot into GRUB from the boot menu + of Windows NT/2000/XP. Copy GRLDR to the root directory of + drive C: of Windows NT/2000/XP and append to C:\BOOT.INI + this line: + + C:\GRLDR="Start GRUB" + + That will be done. The GRLDR should be in the same directory + as BOOT.INI and NTLDR. Note that BOOT.INI is usually hidden + and you must unhide it before you can see it. The filename + GRLDR shouldn't be changed. If GRLDR is in a NTFS partition, + it should be copied to the root directory of another non-NTFS + partition(and likewise should the menu.lst file be). If GRLDR + is compressed, e.g., in a NTFS partition, it will not work. + + Even if the drive letter of this disk has been changed to + other than C by the Windows device manager, it seems you still + have to use the letter C here in BOOT.INI, otherwise, NTLDR + will fail to locate the GRLDR file. + + And what's more, if you are booting NTLDR from a floppy, you + will have to write the GRLDR line in A:\BOOT.INI like this: + + C:\GRLDR="Start GRUB" + + and shouldn't use the letter A like this: + + A:\GRLDR="Start GRUB" + + (Note that in the case when BOOT.INI is on floppy A, the + notation "C:\GRLDR" actually refer to the file A:\GRLDR). + + +Update 2: GRUB for Linux is also introduced along with 0.2.0. You can + boot grub using a linux loader KEXEC, LILO, SYSLINUX or another + GRUB. (GRUB4LIN has merged into GRUB.EXE) + + To boot GRUB off Linux, use this pair of commands: + + kexec -l grub.exe + kexec -e + + To boot GRUB via GRUB, use commands like the following: + + kernel (hd0,0)/grub.exe + boot + + To boot GRUB via LILO, use these lines in lilo.conf: + + image=/boot/grub.exe + label=grub.exe + + To boot GRUB via SYSLINUX, use these lines in syslinux.cfg: + + label grub.exe + kernel grub.exe + + LOADLIN may encounter problems when loading grub.exe, because + grub.exe requires some unchanged original BIOS interrupt + vectors, but DOS has destroyed them, and loadlin does not + recover them before it transfers control to grub.exe. + +Update 3: Beginning at version 0.4.0, GRUB for DOS supports memdrives. + Example: + + # boot into a floppy image + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + Because the image will be copied to a memory area, the image + itself can be non-contiguous and even gzipped. + + Another Example: + + map --mem=-2880 (hd0,0)/floppy.img (fd0) + + This memdrive (fd0) will occupy at least 1440 KB of memory. + This is useful when the size of a 1.44M-floppy image is less + than 1440 KB. + + One more example: + + map --mem --read-only (hd0,0)/hd.img (hd1) + + This memdrive is a hard drive, and read-only. That means you + will not be able to write data to the memdrive (hd1). + + You can use many memdrives and many ordinary virtual emulated + disk-based drives at the same time. + + If the BIOS does not support int15/EAX=e820h, you will not be + able to use any memdrives. + +Update 4: For memdrive emulation, a single-partition image can be used + instead of a whole-harddrive image. Example: + + map --mem (hd0,7)/win98.img (hd0) + map --hook + chainloader (hd0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + Here win98.img is a partition image without the leading MBR + and partition table in it. Surely GRUB for DOS will build an + MBR and partition table for the memdrive (hd0). + +Update 5: Now GRLDR can be used as a no-emulation-mode bootable CD-ROM + boot image. Example for Linux users: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o bootable.iso iso_root + + As an alternative, grldr can also be used the same way as + stage2_eltorito. The -boot-info-table option is allowed but you + can omit it: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + Also note that the bootable.iso above must be created with the + -boot-load-seg 0xHHHH option where HHHH is greater than or + equal to 1000(hex). If HHHH < 1000(hex), QEMU will hang. This + is a bug in QEMU. The grldr.iso can be created with or without + -boot-load-seg 0xHHHH option. + + The menu.lst file should be placed in the root dir of the CD. + +Update 6: The Chinese special build is in the "chinese" subdirectory. + (patched by Gandalf, 2005-06-27) + + The Chinese special build also has scdrom builtin. + (update: scdrom has been dropped since 2006-07-20) + +Update 7: Added memory drive (md). Like (nd) for network drive and (cd) + for CD-ROM drive, a new drive (md) is implemented for accessing + the whole memory as a disk drive. (md) only works for systems + with BIOS int15/EAX=E820h support. + + The cat command now has a few new options: --hex for hexdump, + and --locate=STRING for string search in file. + + Typical examples: + + cat --hex (hd0)+1 + + It will display the MBR sector in hex form. + + cat --hex (md)+2 + + It will display 1KB of your memory(in fact, it is the real-mode + IDT table), also in hexdump form. + + cat --hex (md)0x800+1 + + It will display 1 sector of your extended memory. + + cat --hex (hd0,0)+1 + + It will display the first sector of partition (hd0,0). Usually + this sector contains the boot record of an operating system. + +Update 8: Added ram drive (rd). The (md) device accesses the memory + starting at physical address 0. But (rd) accesses memory + starting at any base address. The base and length of the ram + drive can be specified through the map command. "help map" for + details. You can even specify the BIOS drive number used for + the (rd) drive, e.g., map --ram-drive=0xf0. The default drive + number for (rd) is 0x7F which is a floppy. If (rd) is a hard + drive image, you should change the drive number to a value + greater than or equal to 0x80(but should avoid using 0xffff, + because 0xffff is for the (md) device). + + The notation (rd)+1 always represents the file which contains + all the bytes stored in (rd). + +Update 9: Directly boot NTLDR of WinNT/2K/XP and IO.SYS of Win9x/ME and + KERNEL.SYS of FreeDOS. Examples: + + chainloader --edx=0xPPYY (hd0,0)/ntldr + boot + + chainloader --edx=0xYY (hd0,0)/io.sys + boot + + chainloader --ebx=0xYY (hd0,0)/kernel.sys + boot + + Hex YY specifies the boot drive number, and hex PP specifies + the boot partition number of NTLDR. If the boot drive is + floppy, PP should be the hex value ff, i.e., decimal 255. + + For KERNEL.SYS of FreeDOS, the --edx won't work, + use --ebx please. + + The option --edx ( --ebx ) can be omitted if the file is in + its normal place. But in some cases, those options are needed. + + If, e.g., the ntldr file is in an ext2 partition called + (hd2,8) while you want it to think of the Windows partition + (hd0,7) as the boot partition, then --edx is required: + + chainloader --edx=0x0780 (hd2,8)/ntldr + + For DOS kernels(i.e., IO.SYS and KERNEL.SYS), the boot + partition number is meaningless, so you only need to specify + the correct boot drive number YY(but specifying the boot + partition number is harmless). + + The above PPYY can also be specified by using a root or + rootnoverify command after the chainloader command. Examples: + + chainloader (hd2,6)/kernel.sys + rootnoverify (hd0) <-------- YY=80 + boot + + chainloader (hd0,0)/ntldr + rootnoverify (hd0,5) <-------- YY=80, PP=05 + boot + + Tip: CMLDR (the ComMand LoaDeR, which is used to load the + Windows Fault Recovery Console) can be chainloaded as well + as NTLDR. + + Bean has successfully decompressed and booted IO.SYS of WinME. + Thanks for the great job! + +Update 10: isolinux.bin (version 3.73) can be chainloaded as with build + 2009-02-09. + + chainloader (cd)/isolinux.bin + + isolinux.bin must reside in a real or virtual cdrom. + +Update 11: stage2 of Grub Legacy can be chainloaded in this way: + + chainloader --force --load-segment=0 --load-offset=0x8000 --boot-cs=0 --boot-ip=0x8200 (...)/.../stage2 + +-------------------------------------------------------- + + There is no full documentation in English at present. Here are some + examples showing the usage of disk emulation commands: + +1. Emulates HD partition C: as floppy drive A: and boot win98 from C: + + map --read-only (hd0,0)+1 (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + boot + + In the above example, (hd0,0) is drive C: with win98 on it. After win98 + boot complete, you will find that A: contains all files of C:, and if + you delete files in A:, the files in C: will also disappear. + + At the map command line, the notation (hdm,n)+1 is interpreted to + represent the whole partition (hdm,n), not just the first sector of the + partition. + +2. Emulates HD partition C: as floppy drive A: and boot win98 from A: + + map --read-only (hd0,0)+1 (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + After the "map --hook" command, the emulation takes effect instantly + even in the GRUB command line. + + Note that the (fd0) in "chainloader (fd0)+1" is the emulated virtual + floppy A:, not the real floppy diskette(because map is hooked now). + + +3. Emulates an image file as floppy drive A: and boot win98 from C: + + map --read-only (hd0,0)/floppy.img (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --floppies=1 + map --harddrives=1 + boot + +4. Emulates an HD partition as the first hard disk and boot DOS from it: + + map --read-only (hd2,6)+1 (hd0) + map --hook + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + In this example, (hd2,6)+1 represents an extended logical DOS partition + of the third BIOS hard disk (hd2). + + If a DOS partition is used to emulate a hard disk, GRUB for DOS will + first try to locate the partition table, usually 63 sectors ahead of + the DOS partition. GRUB for DOS will refuse the emulation if the + partition table is not there. + +5. Emulates an image file as the first hard disk and boot DOS from it: + + map --read-only (hd0,0)/harddisk.img (hd0) + chainloader --load-length=512 (hd0,0)/harddisk.img + rootnoverify (hd0) + map --harddrives=1 + boot + + If an image file is used to emulate a hard disk, the image file must + contain an MBR. In other word, the first sector of HARDDISK.IMG must + contain the partition table of the emulated virtual hard disk. + +Note: Counters for floppies and harddrives in the BIOS Data Area remain + unchanged during the mapping. You should manually set them to proper + values with `map --floppies=' and/or `map --harddrives=', especially, + e.g., when there is no real floppy drive attached to the mother board. + If not doing so, DOS might fail to start. + + `map --status' can report the values. Note also that `map --floppies=' + and `map --harddrives=' can be used independently without the + appearance of mappings. + + 0.4.2 has introduced a new variable, memdisk_raw, to simulate the + memdisk-like raw mode. If the BIOS has no int15/87h, or if it has + buggy int15/87h support, you should set this variable before any + memdrives are used. Here is an example: + + map --memdisk-raw=1 + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + boot + + If you encountered a memdrive failure without using + map --memdisk-raw=1, you should have a try with `map --memdisk-raw=1'. + + If you `map --memdisk-raw=0' later, you should afterwards do a + `map --unhook'(and followed by a `map --hook' if needed). + + Update: memdisk_raw now defaults to 1. You should `map --memdisk-raw=0' + if you want to use int15/87h to access memdrives. + +-------------------------------------------------------- + + Floppies/harddisks of any size can be emulated with GRUB for DOS 0.2.0. + + Image file must be contiguous, or else GRUB for DOS will refuse it. + + The `blocklist' command can list fragments or pieces of a file. + + Type "help map" at the GRUB prompt to get a brief description of the + command. + + The form + + map ... (fd?) + + is a floppy emulation, and the form + + map ... (hd?) + + is a hard disk emulation. + + When a HARD DISK emulation is used, better not start Windows for + security reasons. Windows may even destroy all data and all information + on all your real hard disks!!!!!!!! + + Update for --mem: when --mem is used, it seems rather safe even after + entering Windows. Win98 can operate the memdrive normally. + + Windows NT/2000/XP does not recognize the emulated drives no matter + whether the --mem option is present. + + + +****************************************************************************** +*** Explanation of the grldr-bootable floppies or harddisk partitions *** +****************************************************************************** + +1. Ext2 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +An EXT2/EXT3 volume can be GRUB-bootable. Copy grldr and an optional menu.lst +to the root dir of the EXT2/EXT3 volume, and build the boot sector based on the +fifth sector of grldr(some fields need to be changed as detailed in the +following table). And then the EXT2/EXT3 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the first sector of an EXT2/EXT3 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x02 for CHS mode, or 0x42 for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x42. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x42. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x42, + otherwise, set to 0x02. + + Note that Windows98 uses the value 0x0e as the LBA indicator. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + +03h 10 OEM name string (of OS which formatted the disk). + Update: this field is now used for error message of "I/O error" + +0Dh 1 Sectors per block. Valid values are 2, 4, 8, 16 and 32. + +0Eh 2 Bytes per block. Valid values are 0x400, 0x800, 0x1000, 0x2000 + and 0x4000. + +10h 4 Pointers in pointers-per-block blocks, that is, number of + blocks covered by a double-indirect block. + + Valid values are 0x10000, 0x40000, 0x100000, 0x400000 and + 0x1000000. + +14h 4 Pointers per block, that is, number of blocks covered by an + indirect block. + + Valid values are 0x100, 0x200, 0x400, 0x800, 0x1000. + +18h 2 Sectors per track. + +1Ah 2 Number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors in the filesystem(or in the partition). + +24h 1 BIOS drive number of the boot device. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +25h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +26h 2 inode size in bytes. (Notice! We use the formerly reserved + word here for inode size!) + +28h 4 Number of inodes per group. + + Normally a 1.44M floppy has only one group, and the total + number of inodes is 184. So the value should be 184 or + greater. + +2Ch 4 The block number for group descriptors. + + Valid values are 2 for 1024-byte blocks, and 1 otherwise. + + The value here is equal to (s_first_data_block + 1). + +30h 1 code for "cld"(0xFC). + +31h 2 code for "xor ax,ax"(0x31, 0xC0). + +33h 1 code for "nop"(0x90) or "cwd"(0x99) + +34h 458 The rest of the machine code. + +1FEh 2 Boot Signature AA55h. + + +2. FAT12/FAT16 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +A FAT12/16 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT12/16 volume, and build the boot sector based on the +fourth sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT12/16 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT12/16 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + +10h 1 Number of FATs(nearly always 2). + +11h 2 Maximum number of root directory entries. + +13h 2 Total number of sectors (for small disks only, if the disk is + too big this is set to 0 and offset 20h is used instead). + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 Sectors per FAT. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors for large disks. + +24h 1 BIOS drive number of the boot device. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +25h 1 Partition number of this filesystem in the boot drive. + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 41h below. + +26h 1 Signature (must be 28h or 29h to be recognised by NT). + +27h 4 Volume serial number. + +2Bh 11 Volume label. + +36h 8 File system ID. "FAT12 ", "FAT16 " or "FAT ". + +3Eh 1 code for "cli". + +3Fh 1 code for "cld". + +40h 1 code for "mov dh, imm8". + +41h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +42h 442 The rest of the machine code. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + + +3. FAT32 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +A FAT32 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT32 volume, and build the boot sector based on the +third sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT32 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT32 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + +10h 1 Number of FATs(nearly always 2). + +11h 2 (Maximum number of root directory entries)Must be 0. + +13h 2 (Total number of sectors for small disks only)Must be 0. + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 (Sectors per FAT)Must be 0. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors for large disks. + +24h 4 FAT32 sectors per FAT. + +28h 2 If bit 7 is clear then all FATs are updated, otherwise bits + 0-3 give the current active FAT, all other bits are reserved. + +2Ah 2 High byte is major revision number, low byte is minor revision + number, currently both are 0. + +2Ch 4 Root directory starting cluster. + +30h 2 File system information sector. + +32h 2 If non-zero this gives the sector which holds a copy of the + boot record, usually 6. + +34h 12 Reserved, set to 0. + +40h 1 BIOS drive number of the boot device. + + 80h is first HDD, 00h is first FDD. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +41h 1 Partition number of this filesystem in the boot drive. + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 5Dh below. + +42h 1 Signature (must be 28h or 29h to be recognised by NT). + +43h 4 Volume serial number. + +47h 11 Volume label. + +52h 8 File system ID. "FAT32 ". + +5Ah 1 opcode for "cli". + +5Bh 1 opcode for "cld". + +5Ch 1 opcode for "mov dh, imm8". + +5Dh 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +5Eh 414 The rest of the machine code. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + + +4. NTFS Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +An NTFS volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the NTFS volume, and build the boot sector based on the +6th-9th sectors of grldr(some fields need to be changed as detailed in the +following table). And then the NTFS volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the leading 4 sectors of an NTFS volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 (Reserved sectors)Unused. + +10h 1 (Number of FATs)Must be 0. + +11h 2 (Maximum number of root directory entries)Must be 0. + +13h 2 (Total number of sectors for small disks only)Must be 0. + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 (Sectors per FAT)Must be 0. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 (Total number of sectors for large disks)Must be 0. + +24h 4 (FAT32 sectors per FAT) - Usually 80 00 80 00, A value of + 80 00 00 00 has been seen on a USB thumb drive which is + formatted with NTFS under Windows XP. Note this is removable + media and is not partitioned, the drive as a whole is NTFS + formatted. + +28h 8 Number of sectors in the volume. + +30h 8 LCN of VCN 0 of the $MFT. + +38h 8 LCN of VCN 0 of the $MFTMirr. + +40h 4 Clusters per MFT Record. + +44h 4 Clusters per Index Record. + +48h 8 Volume serial number. + +50h 4 Checksum, usually 0. + +54h 1 opcode for "cli". + +55h 1 opcode for "cld". + +56h 1 opcode for "mov dh, imm8". + +57h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +58h 420 The rest of the machine code in the first sector. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + +200h 1536 The rest of the machine code in the last 3 sectors. + +------------------------------------------------------------------------------ + +Appendix A: File System Information Sector of FAT32(not used by grldr) + +Offset Length Description +====== ====== ============================================================== +0h 4 Leading Signature 41615252h. + +4h 480 Reserved, set to 0. + +1E4h 4 FSI structure signature 61417272h. + +1E8h 4 Contains the last known count of free clusters, if this is + equal to FFFFFFFFh, then the count is unknown. + +1ECh 4 Cluster number at which you should begin a search for a free + cluster, if this is equal to FFFFFFFFh then the field has not + been set. + +1F0h 12 Reserved, set to 0. + +1FCh 4 Trailing Signature AA550000h. + +------------------------------------------------------------------------------ + +Appendix B: Media Descriptor Byte(not used by grldr) + +The Media descriptor byte is meaningless because of the duplications, F0h for +example. + +Byte Type of disk Sectors Heads Tracks Capacity +---- ------------ ------- ----- ------ -------- +FFh 5 1/4" 8 2 40 320KB +FEh 5 1/4" 8 1 40 160KB +FDh 5 1/4" 9 2 40 360KB +FCh 5 1/4" 9 1 40 180KB +FBh both 9 2 80 640KB +FAh both 9 1 80 320KB +F9h 5 1/4" 15 2 80 1200KB +F9h 3 1/2" 9 2 80 720KB +F0h 3 1/2" 18 2 80 1440KB +F0h 3 1/2" 36 2 80 2880KB +F8h hard disk NA NA NA NA + +****************************************************************************** +*** grldr.mbr - How to write it to Master Boot Track of the hard disk *** +****************************************************************************** + +grldr.mbr contains code that can be used as Master Boot Record. The code is +responsible for searching all partitions for grldr and when found, loading it. +Currently supported partition types are: FAT12/FAT16/FAT32, NTFS, EXT2/EXT3. +Logical partitions in the extended partition are supported, provided that the +extended partition type is Microsoft-compatible. In fact, the Linux extended +partition type(0x85) is not fully tested for the search mechanism. + +How to write GRLDR.MBR to the Master Boot Track of a hard disk? + +First, read the Windows disk signature and partition information bytes +(72 bytes in total, from offset 0x01b8 to 0x01ff of the MBR sector), and put +them on the same range from offset 0x01b8 to 0x01ff of the beginning sector of +GRLDR.MBR. + +Optionally, if the MBR in the hard disk is a single sector MBR created by +Microsoft FDISK, it may be copied onto the second sector of GRLDR.MBR. + +The second sector of GRLDR.MBR is called "previous MBR". When GRLDR not found, +"previous MBR" will be started. + +No other steps needed, after all necessary changes stated above have been made, +now simply write GRLDR.MBR on to the Master Boot Track. That's all. + +Note: The Master Boot Track means the first track of the hard drive. + +Note: The bootstrap code of GRLDR.MBR only finds GRLDR file in the root dir of +a partition. You'd better place menu.lst file accompanying with GRLDR(i.e., in +the same root dir of the same partition as GRLDR). + +The filename "grldr" in an ext2 partition must be in lower case letters, and +the file type of grldr must be plain regular. Other types, e.g., a symbolic +link, won't work. + +Update: bootlace.com is a DOS/Linux utility for installing grldr.mbr to MBR. +The whole grldr.mbr is embedded in the body of the bootlace.com utility, so +bootlace.com can be used independently. See below. + +****************************************************************************** +*** grldr.mbr - Details about the control bytes *** +****************************************************************************** + +Six bytes can be used to control the boot process of GRLDR.MBR. + +Offset Length Description +====== ====== ============================================================== +02h 1 bit0=1: disable the search for GRLDR on floppy + bit0=0: enable the search for GRLDR on floppy + + bit1=1: disable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + bit1=0: enable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + + bit2=1: disable the feature of unconditional entrance to + the command-line(See below `--duce') + bit2=0: enable the feature of unconditional entrance to + the command-line(See below `--duce') + + bit3=1: disable geometry tune(See below `--chs-no-tune') + bit3=0: enable geometry tune(See below `--chs-no-tune') + + bit4 - bit6: reserved + + bit7=1: try to boot PREVIOUS MBR after the search for GRLDR + bit7=0: try to boot PREVIOUS MBR before the search for GRLDR + +03h 1 timeout in seconds to wait for a key press. 0xff stands for + waiting all the time(endless). + +04h 2 hot-key code. high byte is scan code, low byte is ASCII code. + the default value is 0x3920, which stands for the space bar. + if this key is pressed, GRUB will be started prior to the boot + of previous MBR. See "int 16 keyboard scan codes" below. + +06h 1 preferred boot drive number, 0xff for no-drive +07h 1 preferred partition number, 0xff for whole drive + + if the preferred boot drive number is 0xff, the order of the + search for GRLDR will be: + + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + otherwise, if the preferred boot drive number is Y(not equal to + 0xff) and the preferred partition number is K, then the order of + the search for GRLDR will be: + + (Y) if K=0xff; or (Y,K) otherwise + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + Note: if Y < 0x80, then (Y) is floppy, else (Y) is harddrive, + and (Y,K) is partition number K on harddrive (Y). + + +****************************************************************************** +*** bootlace.com - Install GRLDR.MBR bootstrap code to MBR *** +****************************************************************************** + +BOOTLACE.COM installs GRLDR.MBR boot record to the MBR of a harddrive or of a +harddrive image file, or to the boot sector of a floppy or a floppy image. + +Usage: + + bootlace.com [OPTIONS] DEVICE_OR_FILE + +OPTIONS: + + --read-only do everything except the actual write to the + specified DEVICE_OR_FILE. + + --restore-mbr restore the previous mbr. + + --mbr-no-bpb do not copy BPB in the boot sector of the + leading FAT partition to MBR. + + --no-backup-mbr do not copy the old MBR to the second sector of + DEVICE_OR_FILE. + + --force-backup-mbr force the copy of old MBR to the second sector + of DEVICE_OR_FILE. + + --mbr-enable-floppy enable the search for GRLDR on floppy. + + --mbr-disable-floppy disable the search for GRLDR on floppy. + + --mbr-enable-osbr enable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector). + + --mbr-disable-osbr disable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector). + + --duce disable the feature of unconditional entrance + to the command-line. + + Normally one can unconditionally get the + command-line console by a keypress of `C', + bypassing all config-files(including the + preset-menu). This is a security hole. So we + need this option to disable the feature. + + DUCE is for Disable Unconditional Command-line + Entrance. + + --chs-no-tune disable the feature of geometry tune. + + --boot-prevmbr-first try to boot PREVIOUS MBR before the search for + GRLDR. + + --boot-prevmbr-last try to boot PREVIOUS MBR after the search for + GRLDR. + + --preferred-drive=D preferred boot drive number, 0 <= D < 255. + + --preferred-partition=P preferred partition number, 0 <= P < 255. + + --serial-number=SN setup a new serial number for the hard drive. + SN must be non-zero. + + --time-out=T wait T seconds before booting PREVIOUS MBR. if + T is 0xff, wait forever. The default is 5. + + --hot-key=K if the desired key K is pressed, start GRUB + before booting PREVIOUS MBR. K is a word + value, just as the value in AX register + returned from int16/AH=1. The high byte is the + scan code and the low byte is ASCII code. The + default is 0x3920 for space bar. See "int 16 + keyboard scan codes" below. + + --floppy if DEVICE_OR_FILE is floppy, use this option. + + --floppy=N if DEVICE_OR_FILE is a partition on a hard + drive, use this option. N is used to specify + the partition number: 0,1,2 and 3 for the + primary partitions, and 4,5,6,... for the + logical partitions. + + --sectors-per-track=S specifies sectors per track for --floppy. + 1 <= S <= 63, default is 63. + + --heads=H specifies number of heads for --floppy. + 1 <= H <= 256, default is 255. + + --start-sector=B specifies hidden sectors for --floppy=N. + + --total-sectors=C specifies total sectors for --floppy. + default is 0. + + --lba use lba mode for --floppy. If the floppy BIOS + has LBA support, you can specify --lba here. + It is assumed that all floppy BIOSes have CHS + support. So you would rather specify --chs. + If neither --chs nor --lba is specified, then + the LBA indicator(i.e., the third byte of the + boot sector) will not be touched. + + --chs use chs mode for --floppy. You should specify + --chs if the floppy BIOS does not support LBA. + We assume all floppy BIOSes have CHS support. + So it is likely you want to specify --chs. + If neither --chs nor --lba is specified, then + the LBA indicator(i.e., the third byte of the + boot sector) will not be touched. + + --fat12 FAT12 is allowed to be installed for --floppy. + + --fat16 FAT16 is allowed to be installed for --floppy. + + --fat32 FAT32 is allowed to be installed for --floppy. + + --vfat FAT12/16/32 are allowed to be installed for + --floppy. + + --ntfs NTFS is allowed to be installed for --floppy. + + --ext2 EXT2 is allowed to be installed for --floppy. + + --install-partition=I Install the boot record onto the boot area of + partition number I of the specified hard drive + or harddrive image DEVICE_OR_FILE. + +DEVICE_OR_FILE: Filename of the device or the image file. For DOS, a BIOS drive +number(hex 0xHH or decimal DDD) can be used to access the drive. BIOS drive +number 0 is for the first floppy, 1 is for the second floppy; 0x80 is for the +first hard drive, 0x81 is for the second hard drive, etc. + +Note: BOOTLACE.COM writes only the boot code to MBR. The boot code needs to +load GRLDR as the second(and last) stage of the GRUB boot process. Therefore +GRLDR should be copied to the root directory of one of the supported +partitions, either before or after a successful execution of BOOTLACE.COM. +Currently only partitions with filesystem type of FAT12, FAT16, FAT32, NTFS, +EXT2 or EXT3 are supported. + +Note 2: If DEVICE_OR_FILE is a harddisk device or a harddisk image file, it +must contain a valid partition table, otherwise, BOOTLACE.COM will fail. If +DEVICE_OR_FILE is a floppy device or a floppy image file, then it must contain +a supported filesystem(i.e., either of FAT12/FAT16/FAT32/NTFS/EXT2/EXT3). + +Note 3: If DEVICE_OR_FILE is a floppy device or a floppy image file, and it +was formated EXT2/EXT3, then you should specify --sectors-per-track and +--heads explicitly. + + +Important!! If you install GRLDR Boot Record to a floppy or a partition, the +floppy or partition will boot solely grldr, and your original +IO.SYS(DOS/Win9x/Me) and NTLDR(WinNT/2K/XP) will become unbootable. This is +because the original boot record of the floppy or partition was overwritten. +There is no such problem when installing GRLDR Boot Record onto the MBR. +Update: Some NTLDR/IO.SYS/KERNEL.SYS files can be directly chainloaded in the +latest GRUB4DOS. + +Tip: If the filename begins in a dash(-) or a digit, you may prefix a dirname +(./) or (.\) to it. + +Examples: + + Installing GRLDR boot code to MBR under Linux: + + bootlace.com /dev/hda + + Installing GRLDR boot code to MBR under DOS: + + bootlace.com 0x80 + + Installing GRLDR boot code to a harddisk image under DOS or Linux: + + bootlace.com hd.img + + Installing GRLDR boot code to floppy under Linux: + + bootlace.com --floppy --chs /dev/fd0 + + Installing GRLDR boot code to floppy under DOS: + + bootlace.com --floppy --chs 0x00 + + Installing GRLDR boot code to a floppy image under DOS or Linux: + + bootlace.com --floppy --chs floppy.img + +BOOTLACE.COM cannot function well under Windows NT/2000/XP/2003. It is expected +(and designed) to run under DOS/Win9x and Linux. Update: For image FILES, +bootlace.com function well under Windows NT/2000/XP/2003. For devices, +bootlace.com will not work under Windows NT/2000/XP/2003 because bootlace.com +is a DOS utility and Windows NT/2000/XP/2003 does not allow bootlace.com to +access devices. + +****************************************************************************** +*** kexec-tools should be patched for the 1.101 release *** +****************************************************************************** + +The file kexec-tools-1.101-patch is a patch to the kexec-tools-1.101 release. +Kexec might fail to load grub.exe without this patch. + +The home page of kexec-tools is: + + http://www.xmission.com/~ebiederm/files/kexec/ + +Note: The Linux kernel should be KEXEC enabled before kexec can be run. + + !! Important Update !! + +The patch `kexec-tools-1.101-patch' is not needed now and has been deleted. +Even worse, it fails in `kexec -l grub.exe --initrd=imgfile'. So please +do not use it any more. + +****************************************************************************** +*** Direct transition to DOS/Win9x from within Linux *** +****************************************************************************** + +By using kexec, we can easily boot into DOS/Win9x from a running Linux system. + +If WIN98.IMG is a bootable hard-disk image, do as follows: + +kexec -l grub.exe --initrd=WIN98.IMG --command-line="--config-file=map (rd) (hd0); map --hook; chainloader (hd0)+1; rootnoverify (hd0)" + +kexec -e + +If DOS.IMG is a bootable floppy image, do this way: + +kexec -l grub.exe --initrd=DOS.IMG --command-line="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +kexec -e + +Note that in this manner, we can boot DOS/Win9x without using a real DOS/Win9x +disk. We need no FAT partition but an image file. + +We have noticed that Linux itself can act as a big boot manager by using kexec +and grub.exe. This may be convenient to developers who write installation or +bootstrap or initialization programs. + +Certainly, grub.exe and the bootable disk image can also be loaded by a running +GRUB or LILO or syslinux. Examples: + +1. Loaded by GRUB: + + kernel (hd0,0)/grub.exe --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + initrd (hd0,0)/DOS.IMG + boot + +2. Loaded by LILO: + + image=/boot/grub.exe + label=grub.exe + initrd=/boot/DOS.IMG + append="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +3. Loaded by SYSLINUX: + + label grub.exe + kernel grub.exe + append initrd=DOS.IMG --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +Note: If the above `map (rd) (...)' failed, you may use `map (rd)+1 (...)' +instead and try again. + +****************************************************************************** +*** Keyboard BIOS Scan Code/ASCII code tables *** +****************************************************************************** + +Keyboard bios scan code and ascii character code tables can be obtained from +the web by, for example, googling for "3920 372A 4A2D 4E2B 352F". Here are 2 +main results: + +1. From "http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html": + +INT 16 - Keyboard Scan Codes + + Key Normal Shifted w/Ctrl w/Alt + + A 1E61 1E41 1E01 1E00 + B 3062 3042 3002 3000 + C 2E63 2E43 2E03 2E00 + D 2064 2044 2004 2000 + E 1265 1245 1205 1200 + F 2166 2146 2106 2100 + G 2267 2247 2207 2200 + H 2368 2348 2308 2300 + I 1769 1749 1709 1700 + J 246A 244A 240A 2400 + K 256B 254B 250B 2500 + L 266C 264C 260C 2600 + M 326D 324D 320D 3200 + N 316E 314E 310E 3100 + O 186F 184F 180F 1800 + P 1970 1950 1910 1900 + Q 1071 1051 1011 1000 + R 1372 1352 1312 1300 + S 1F73 1F53 1F13 1F00 + T 1474 1454 1414 1400 + U 1675 1655 1615 1600 + V 2F76 2F56 2F16 2F00 + W 1177 1157 1117 1100 + X 2D78 2D58 2D18 2D00 + Y 1579 1559 1519 1500 + Z 2C7A 2C5A 2C1A 2C00 + + Key Normal Shifted w/Ctrl w/Alt + + 1 0231 0221 7800 + 2 0332 0340 0300 7900 + 3 0433 0423 7A00 + 4 0534 0524 7B00 + 5 0635 0625 7C00 + 6 0736 075E 071E 7D00 + 7 0837 0826 7E00 + 8 0938 092A 7F00 + 9 0A39 0A28 8000 + 0 0B30 0B29 8100 + + Key Normal Shifted w/Ctrl w/Alt + + - 0C2D 0C5F 0C1F 8200 + = 0D3D 0D2B 8300 + [ 1A5B 1A7B 1A1B 1A00 + ] 1B5D 1B7D 1B1D 1B00 + ; 273B 273A 2700 + ' 2827 2822 + ` 2960 297E + \ 2B5C 2B7C 2B1C 2600 (same as Alt L) + , 332C 333C + . 342E 343E + / 352F 353F + + Key Normal Shifted w/Ctrl w/Alt + + F1 3B00 5400 5E00 6800 + F2 3C00 5500 5F00 6900 + F3 3D00 5600 6000 6A00 + F4 3E00 5700 6100 6B00 + F5 3F00 5800 6200 6C00 + F6 4000 5900 6300 6D00 + F7 4100 5A00 6400 6E00 + F8 4200 5B00 6500 6F00 + F9 4300 5C00 6600 7000 + F10 4400 5D00 6700 7100 + F11 8500 8700 8900 8B00 + F12 8600 8800 8A00 8C00 + + Key Normal Shifted w/Ctrl w/Alt + + BackSpace 0E08 0E08 0E7F 0E00 + Del 5300 532E 9300 A300 + Down Arrow 5000 5032 9100 A000 + End 4F00 4F31 7500 9F00 + Enter 1C0D 1C0D 1C0A A600 + Esc 011B 011B 011B 0100 + Home 4700 4737 7700 9700 + Ins 5200 5230 9200 A200 + Keypad 5 4C35 8F00 + Keypad * 372A 9600 3700 + Keypad - 4A2D 4A2D 8E00 4A00 + Keypad + 4E2B 4E2B 4E00 + Keypad / 352F 352F 9500 A400 + Left Arrow 4B00 4B34 7300 9B00 + PgDn 5100 5133 7600 A100 + PgUp 4900 4939 8400 9900 + PrtSc 7200 + Right Arrow 4D00 4D36 7400 9D00 + SpaceBar 3920 3920 3920 3920 + Tab 0F09 0F00 9400 A500 + Up Arrow 4800 4838 8D00 9800 + + +- Some key combinations are not available on all systems. The PS/2 + includes many that aren't available on the PC, XT and AT. +- To retrieve the character from a scan code logical AND the word + with 0x00FF. +- see INT 16 MAKE CODES + + + +2. From "http://www.hoppie.nl/ivan/keycodes.txt": + + + + Keystroke Keypress code +-------------------------------------------------- + Esc 011B + 1 0231 + 2 0332 + 3 0433 + 4 0534 + 5 0635 + 6 0736 + 7 0837 + 8 0938 + 9 0A39 + 0 0B30 + - 0C2D + = 0D3D + Backspace 0E08 + Tab 0F09 + q 1071 + w 1177 + e 1265 + r 1372 + t 1474 + y 1579 + u 1675 + i 1769 + o 186F + p 1970 + [ 1A5B + ] 1B5D + Enter 1C0D + Ctrl ** + a 1E61 + s 1F73 + d 2064 + f 2166 + g 2267 + h 2368 + j 246A + k 256B + l 266C + ; 273B + ' 2827 + ` 2960 + Shift ** + \ 2B5C + z 2C7A + x 2D78 + c 2E63 + v 2F76 + b 3062 + n 316E + m 326D + , 332C + . 342E + / 352F + Gray * 372A + Alt ** + Space 3920 + Caps Lock ** + F1 3B00 + F2 3C00 + F3 3D00 + F4 3E00 + F5 3F00 + F6 4000 + F7 4100 + F8 4200 + F9 4300 + F10 4400 + F11 8500 + F12 8600 + Num Lock ** + Scroll Lock ** + White Home 4700 + White Up Arrow 4800 + White PgUp 4900 + Gray - 4A2D + White Left Arrow 4B00 + Center Key 4C00 + White Right Arrow 4D00 + Gray + 4E2B + White End 4F00 + White Down Arrow 5000 + White PgDn 5100 + White Ins 5200 + White Del 5300 + SysReq ** + Key 45 [1] 565C + Enter (number keypad) 1C0D + Gray / 352F + PrtSc ** + Pause ** + Gray Home 4700 + Gray Up Arrow 4800 + Gray Page Up 4900 + Gray Left Arrow 4B00 + Gray Right Arrow 4D00 + Gray End 4F00 + Gray Down Arrow 5000 + Gray Page Down 5100 + Gray Insert 5200 + Gray Delete 5300 + + Shift Esc 011B + ! 0221 + @ 0340 + # 0423 + $ 0524 + % 0625 + ^ 075E + & 0826 + * (white) 092A + ( 0A28 + ) 0B29 + _ 0C5F + + (white) 0D2B + Shift Backspace 0E08 + Shift Tab (Backtab) 0F00 + Q 1051 + W 1157 + E 1245 + R 1352 + T 1454 + Y 1559 + U 1655 + I 1749 + O 184F + P 1950 + { 1A7B + } 1B7D + Shift Enter 1C0D + Shift Ctrl ** + A 1E41 + S 1F53 + D 2044 + F 2146 + G 2247 + H 2348 + J 244A + K 254B + L 264C + : 273A + " 2822 + ~ 297E + | 2B7C + Z 2C5A + X 2D58 + C 2E43 + V 2F56 + B 3042 + N 314E + M 324D + < 333C + > 343E + ? 353F + Shift Gray * 372A + Shift Alt ** + Shift Space 3920 + Shift Caps Lock ** + Shift F1 5400 + Shift F2 5500 + Shift F3 5600 + Shift F4 5700 + Shift F5 5800 + Shift F6 5900 + Shift F7 5A00 + Shift F8 5B00 + Shift F9 5C00 + Shift F10 5D00 + Shift F11 8700 + Shift F12 8800 + Shift Num Lock ** + Shift Scroll Lock ** + Shift 7 (number pad) 4737 + Shift 8 (number pad) 4838 + Shift 9 (number pad) 4939 + Shift Gray - 4A2D + Shift 4 (number pad) 4B34 + Shift 5 (number pad) 4C35 + Shift 6 (number pad) 4D36 + Shift Gray + 4E2B + Shift 1 (number pad) 4F31 + Shift 2 (number pad) 5032 + Shift 3 (number pad) 5133 + Shift 0 (number pad) 5230 + Shift . (number pad) 532E + Shift SysReq ** + Shift Key 45 [1] 567C + Shift Enter (number pad) 1C0D + Shift Gray / 352F + Shift PrtSc ** + Shift Pause ** + Shift Gray Home 4700 + Shift Gray Up Arrow 4800 + Shift Gray Page Up 4900 + Shift Gray Left Arrow 4B00 + Shift Gray Right Arrow 4D00 + Shift Gray End 4F00 + Shift Gray Down Arrow 5000 + Shift Gray Page Down 5100 + Shift Gray Insert 5200 + Shift Gray Delete 5300 + + Ctrl Esc 011B + Ctrl 1 -- + Ctrl 2 (NUL) 0300 + Ctrl 3 -- + Ctrl 4 -- + Ctrl 5 -- + Ctrl 6 (RS) 071E + Ctrl 7 -- + Ctrl 8 -- + Ctrl 9 -- + Ctrl 0 -- + Ctrl - 0C1F + Ctrl = -- + Ctrl Backspace (DEL) 0E7F + Ctrl Tab 9400 + Ctrl q (DC1) 1011 + Ctrl w (ETB) 1117 + Ctrl e (ENQ) 1205 + Ctrl r (DC2) 1312 + Ctrl t (DC4) 1414 + Ctrl y (EM) 1519 + Ctrl u (NAK) 1615 + Ctrl i (HT) 1709 + Ctrl o (SI) 180F + Ctrl p (DEL) 1910 + Ctrl [ (ESC) 1A1B + Ctrl ] (GS) 1B1D + Ctrl Enter (LF) 1C0A + Ctrl a (SOH) 1E01 + Ctrl s (DC3) 1F13 + Ctrl d (EOT) 2004 + Ctrl f (ACK) 2106 + Ctrl g (BEL) 2207 + Ctrl h (Backspace) 2308 + Ctrl j (LF) 240A + Ctrl k (VT) 250B + Ctrl l (FF) 260C + Ctrl ; -- + Ctrl ' -- + Ctrl ` -- + Ctrl Shift ** + Ctrl \ (FS) 2B1C + Ctrl z (SUB) 2C1A + Ctrl x (CAN) 2D18 + Ctrl c (ETX) 2E03 + Ctrl v (SYN) 2F16 + Ctrl b (STX) 3002 + Ctrl n (SO) 310E + Ctrl m (CR) 320D + Ctrl , -- + Ctrl . -- + Ctrl / -- + Ctrl Gray * 9600 + Ctrl Alt ** + Ctrl Space 3920 + Ctrl Caps Lock -- + Ctrl F1 5E00 + Ctrl F2 5F00 + Ctrl F3 6000 + Ctrl F4 6100 + Ctrl F5 6200 + Ctrl F6 6300 + Ctrl F7 6400 + Ctrl F8 6500 + Ctrl F9 6600 + Ctrl F10 6700 + Ctrl F11 8900 + Ctrl F12 8A00 + Ctrl Num Lock -- + Ctrl Scroll Lock -- + Ctrl White Home 7700 + Ctrl White Up Arrow 8D00 + Ctrl White PgUp 8400 + Ctrl Gray - 8E00 + Ctrl White Left Arrow 7300 + Ctrl 5 (number pad) 8F00 + Ctrl White Right Arrow 7400 + Ctrl Gray + 9000 + Ctrl White End 7500 + Ctrl White Down Arrow 9100 + Ctrl White PgDn 7600 + Ctrl White Ins 9200 + Ctrl White Del 9300 + Ctrl SysReq ** + Ctrl Key 45 [1] -- + Ctrl Enter (number pad) 1C0A + Ctrl / (number pad) 9500 + Ctrl PrtSc 7200 + Ctrl Break 0000 + Ctrl Gray Home 7700 + Ctrl Gray Up Arrow 8DE0 + Ctrl Gray Page Up 8400 + Ctrl Gray Left Arrow 7300 + Ctrl Gray Right Arrow 7400 + Ctrl Gray End 7500 + Ctrl Gray Down Arrow 91E0 + Ctrl Gray Page Down 7600 + Ctrl Gray Insert 92E0 + Ctrl Gray Delete 93E0 + + Alt Esc 0100 + Alt 1 7800 + Alt 2 7900 + Alt 3 7A00 + Alt 4 7B00 + Alt 5 7C00 + Alt 6 7D00 + Alt 7 7E00 + Alt 8 7F00 + Alt 9 8000 + Alt 0 8100 + Alt - 8200 + Alt = 8300 + Alt Backspace 0E00 + Alt Tab A500 + Alt q 1000 + Alt w 1100 + Alt e 1200 + Alt r 1300 + Alt t 1400 + Alt y 1500 + Alt u 1600 + Alt i 1700 + Alt o 1800 + Alt p 1900 + Alt [ 1A00 + Alt ] 1B00 + Alt Enter 1C00 + Alt Ctrl ** + Alt a 1E00 + Alt s 1F00 + Alt d 2000 + Alt f 2100 + Alt g 2200 + Alt h 2300 + Alt j 2400 + Alt k 2500 + Alt l 2600 + Alt ; 2700 + Alt ' 2800 + Alt ` 2900 + Alt Shift ** + Alt \ 2B00 + Alt z 2C00 + Alt x 2D00 + Alt c 2E00 + Alt v 2F00 + Alt b 3000 + Alt n 3100 + Alt m 3200 + Alt , 3300 + Alt . 3400 + Alt / 3500 + Alt Gray * 3700 + Alt Space 3920 + Alt Caps Lock ** + Alt F1 6800 + Alt F2 6900 + Alt F3 6A00 + Alt F4 6B00 + Alt F5 6C00 + Alt F6 6D00 + Alt F7 6E00 + Alt F8 6F00 + Alt F9 7000 + Alt F10 7100 + Alt F11 8B00 + Alt F12 8C00 + Alt Num Lock ** + Alt Scroll Lock ** + Alt Gray - 4A00 + Alt Gray + 4E00 + Alt 7 (number pad) # + Alt 8 (number pad) # + Alt 9 (number pad) # + Alt 4 (number pad) # + Alt 5 (number pad) # + Alt 6 (number pad) # + Alt 1 (number pad) # + Alt 2 (number pad) # + Alt 3 (number pad) # + Alt Del -- + Alt SysReq ** + Alt Key 45 [1] -- + Alt Enter (number pad) A600 + Alt / (number pad) A400 + Alt PrtSc ** + Alt Pause ** + Alt Gray Home 9700 + Alt Gray Up Arrow 9800 + Alt Gray Page Up 9900 + Alt Gray Left Arrow 9B00 + Alt Gray Right Arrow 9D00 + Alt Gray End 9F00 + Alt Gray Down Arrow A000 + Alt Gray Page Down A100 + Alt Gray Insert A200 + Alt Gray Delete A300 + + ------------------------------------------------------------------------- + +Footnotes + + [1] In the United States, the 101/102-key keyboard is shipped + with 101 keys. Overseas versions have an additional key + sandwiched between the left Shift key and the Z key. This + additional key is identified by IBM (and in this table) as + "Key 45." + + [**] Keys and key combinations marked ** are used by the ROM BIOS + but do not put values into the keyboard buffer. + + [--] Keys and key combinations marked -- are ignored by the ROM + BIOS. + + + + +3. From "http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html": + + +INT 9 - Hardware Keyboard Make/Break Codes + + Key Make Break Key Make Break + + Backspace 0E 8E F1 3B BB + Caps Lock 3A BA F2 3C BC + Enter 1C 9C F3 3D BD + Esc 01 81 F4 3E BE + Left Alt 38 B8 F7 41 C1 + Left Ctrl 1D 9D F5 3F BF + Left Shift 2A AA F6 40 C0 + Num Lock 45 C5 F8 42 C2 + Right Shift 36 B6 F9 43 C3 + Scroll Lock 46 C6 F10 44 C4 + Space 39 B9 F11 57 D7 + Sys Req (AT) 54 D4 F12 58 D8 + Tab 0F 8F + + Keypad Keys Make Break + + Keypad 0 (Ins) 52 D2 + Keypad 1 (End) 4F CF + Keypad 2 (Down arrow) 50 D0 + Keypad 3 (PgDn) 51 D1 + Keypad 4 (Left arrow) 4B CB + Keypad 5 4C CC + Keypad 6 (Right arrow) 4D CD + Keypad 7 (Home) 47 C7 + Keypad 8 (Up arrow) 48 C8 + Keypad 9 (PgUp) 49 C9 + Keypad . (Del) 53 D3 + Keypad * (PrtSc) 37 B7 + Keypad - 4A CA + Keypad + 4E CE + + Key Make Break Key Make Break + + A 1E 9E N 31 B1 + B 30 B0 O 18 98 + C 2E AE P 19 99 + D 20 A0 Q 10 90 + E 12 92 R 13 93 + F 21 A1 S 1F 9F + G 22 A2 T 14 94 + H 23 A3 U 16 96 + I 17 97 V 2F AF + J 24 A4 W 11 91 + K 25 A5 X 2D AD + L 26 A6 Y 15 95 + M 32 B2 Z 2C AC + + Key Make Break Key Make Break + + 1 02 82 - 0C 8C + 2 03 83 = 0D 8D + 3 04 84 [ 1A 9A + 4 05 85 ] 1B 9B + 5 06 86 ; 27 A7 + 6 07 87 ' 28 A8 + 7 08 88 ` 29 A9 + 8 09 89 \ 2B AB + 9 0A 8A , 33 B3 + 0 0B 8B . 34 B4 + / 35 B5 + + +Enhanced Keyboard Keys (101/102 keys) + + Control Keys Make Break + + Alt-PrtSc (SysReq) 54 D4 + Ctrl-PrtSc E0 37 E0 B7 + Enter E0 1C E0 9C + PrtSc E0 2A E0 37 E0 B7 E0 AA + Right Alt E0 38 E0 B8 + Right Ctrl E0 1D E0 9D + Shift-PrtSc E0 37 E0 B7 + / E0 35 E0 B5 + Pause E1 1D 45 E1 9D C5 (not typematic) + Ctrl-Pause (Ctrl-Break) E0 46 E0 C6 (not typematic) + + - Keys marked as "not typematic" generate one stream of bytes + without corresponding break scan code bytes (actually the + break codes are part of the make code). + + + Normal Mode or + Shift w/Numlock + Key Make Break |----- Numlock on ------. + Make Break + Del E0 53 E0 D3 E0 2A E0 53 E0 D3 E0 AA + Down arrow E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA + End E0 4F E0 CF E0 2A E0 4F E0 CF E0 AA + Home E0 47 E0 C7 E0 2A E0 47 E0 C7 E0 AA + Ins E0 52 E0 D2 E0 2A E0 52 E0 D2 E0 AA + Left arrow E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA + PgDn E0 51 E0 D1 E0 2A E0 51 E0 D1 E0 AA + PgUp E0 49 E0 C9 E0 2A E0 49 E0 C9 E0 AA + Right arrow E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA + Up arrow E0 48 E0 C8 E0 2A E0 48 E0 C8 E0 AA + + Key |--Left Shift Pressed--. |--Right Shift Pressed--. + Make Break Make Break + Del E0 AA E0 53 E0 D3 E0 2A E0 B6 E0 53 E0 D3 E0 36 + Down arrow E0 AA E0 50 E0 D0 E0 2A E0 B6 E0 50 E0 D0 E0 36 + End E0 AA E0 4F E0 CF E0 2A E0 B6 E0 4F E0 CF E0 36 + Home E0 AA E0 47 E0 C7 E0 2A E0 B6 E0 47 E0 C7 E0 36 + Ins E0 AA E0 52 E0 D2 E0 2A E0 B6 E0 52 E0 D2 E0 36 + Left arrow E0 AA E0 4B E0 CB E0 2A E0 B6 E0 4B E0 CB E0 36 + PgDn E0 AA E0 51 E0 D1 E0 2A E0 B6 E0 51 E0 D1 E0 36 + PgUp E0 AA E0 49 E0 C9 E0 2A E0 B6 E0 49 E0 C9 E0 36 + Right arrow E0 AA E0 4D E0 CD E0 2A E0 B6 E0 4D E0 CD E0 36 + Up arrow E0 AA E0 48 E0 C8 E0 2A E0 B6 E0 48 E0 C8 E0 36 + / E0 AA E0 35 E0 B5 E0 2A E0 B6 E0 35 E0 B5 E0 36 + + + - The PS/2 models have three make/break scan code sets. The first + set matches the PC & XT make/break scan code set and is the one + listed here. Scan code sets are selected by writing the value F0 + to the keyboard via the 8042 (port 60h). The following is a brief + description of the scan code sets (see the PS/2 Technical Reference + manuals for more information on scan code sets 2 and 3): + + / set 1, each key has a base scan code. Some keys generate + extra scan codes to generate artificial shift states. This + is similar to the standard scan code set used on the PC and XT. + / set 2, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code). This scan code + set is available on the IBM AT also. + / set 3, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code) and no keys are + altered by Shift/Alt/Ctrl keys. + / typematic scan codes are the same as the make scan code + + - Some Tandy 1000's do not handle Alt key combinations when multiple + shift keys are pressed. The Alt-Shift-H combination loses the Alt. + - extended keys like (F11, F12) can only be read with systems that + have extended keyboard BIOS support (or INT 9 extensions); to + read these special keys on these systems INT 16,10 must be used + + +****************************************************************************** +*** GRLDR Error messages *** +****************************************************************************** + +1. Missing MBR-helper. + + The helper function in the sectors that immediately follow the MBR is + not present, or it has been erased by a virus or by Windows XP/Vista. + + Run the bootlace.com utility to fix the problem. + +2. Buggy BIOS! + + Your BIOS is too buggy. It even has no support for INT13/AH=8. + + No solution except flashing your BIOS. Buggy BIOSes will encounter + more and more problems with grub4dos in the future. + +3. This partition is NTFS but with unknown boot record. Please install +Microsoft NTFS boot sectors to this partition correctly, or create an +FAT12/16/32 partition and place the same copy of GRLDR and MENU.LST there. + + The boot record was changed or erased by Microsoft Windows XP Service + Pack 2. + + You may install the old boot record introduced with the original clean + Windows 2K/XP. As another solution, you may create an FAT partition + for your system, and copy GRLDR and your MENU.LST to its root dir. + + While the startup code of grldr might fail to load GRLDR in NTFS + partitions, it always successfully loads GRLDR in FAT partitions(and + even in ext2/ext3 partitions). + + Note that NTLDR only loads the startup code of grldr(i.e., the leading + 16 sectors of grldr), not the whole grldr file. + + Thus, C:\GRLDR must exist(here C: can be NTFS), since it is used for + BOOT.INI and NTLDR. If C: is NTFS, X:\GRLDR should exist as well, + where X: stands for a certain FAT partition. + + +****************************************************************************** +*** Known BIOS bugs *** +****************************************************************************** + +1. Some newer Dell machines have no int13/AH=43h support. You may encounter + failure when trying to write-access an emulated disk. + + Note: This bug is serious! The old "root+setup" installation method + (in real mode grub environment) uses INT13 to write the first sector + of stage2. It will fail for the buggy DELL machine when stage2 is + accessed with LBA mode. + +2. Some buggy BIOSes won't boot bootable.iso(See above).(qemu can boot it fine) + +3. Some newer Dell machines violently destroyed the interrupt vectors for + hardware IRQs and will hang the machine when running GRUB.EXE + from DOS. You may try again with BADGRUB.EXE. + +4. Reports say some BIOSes will function abnormally after GRUB.EXE is started + by kexec of Linux. Some machines reportedly hang. Some others + reportedly cannot access USB drives. + + +****************************************************************************** +*** Known Problems *** +****************************************************************************** + +1. Running GRUB.EXE from a DOS box of Windows 9x/Me could hang the + machine, especially for some systems with USB support. You may + encounter the same problem when running GRUB.EXE through KEXEC under + Linux. + +Note: You don't have to run GRUB.EXE from protected mode of Win9x, which + could hang the machine; Instead, you usually want to run GRUB.EXE + after you have done a "Restart the computer in MS-DOS mode", which + is safe enough. + +2. The default chainloader action will keep A20 on. Some buggy DOS XMS + memory managers could hang the machine. You may use the --disable-a20 + option in the chainloader line and try again. Anyway, you should avoid + using those buggy memory managers. + +3. THTF BIOS L4S5M Ver 1.1a(dated 2002-1-10) has a buggy int15 which + causes hang at the boot of a multi boot kernel(memdisk for example). + +4. A Chinese DOS system software, the TechWay SCS, will not work with + newer versions of GRUB.EXE. In general, TSRs that take antitracking + measures will not work with GRUB.EXE any more. + + +****************************************************************************** +*** List of binary files and their corresponding source files *** +****************************************************************************** + +binary file main source file other included source or binary files +------------- ---------------- ------------------------------------- + +bootlace.com bootlacestart.S bootlace.inc, grldrstart.S + +grldr grldrstart.S pre_stage2(binary, See note below) + +grldr.mbr mbrstart.S grldrstart.S + +grub.exe dosstart.S pre_stage2(binary, See note below) + +hmload.com hmloadstart.S + +----------------------------------------------------------------------------- + +Note: pre_stage2 is the main body of GNU GRUB and it is simply appended to +grldrstart/dosstart in binary format to form our grldr/grub.exe. + +Note: The GRUB file(WITHOUT .EXE suffix) is a static-linked ELF executable +program for Linux, normally called the GRUB Shell. The GRUB Shell is a boot- +manager, but not a boot-loader(the "boot" command won't work in GRUB Shell). +GRUB.EXE(with KEXEC) can be used as a bootloader running directly under Linux. + +****************************************************************************** +*** Memory Layout for Quiting to DOS from GRUB.EXE *** +****************************************************************************** + +The quit command is implemented to return to DOS in the instance that GRUB.EXE +is started off DOS. + +1. Before GRUB.EXE transfers control to pre_stage2, it will copy 640KB of +conventional memory to physical address 0x200000(i.e., 2MB), and write 4 long +integers immediately follows the backup copy of the conventional memory: + At 0x2A0000: 0x50554B42, it is the "BKUP" signature. + + At 0x2A0004: Gate A20 status under DOS: non-zero means A20 on; + zero means A20 off. Update: A20 always on, see below. + + At 0x2A0008: high word is boot-CS, low word is boot-IP. The quit + command uses this entry point to return to DOS. + + At 0x2A000C: CheckSum: the sum of all long integers in the memory + range from 0x200000 to 0x2A000F is 0. + +2. If the above memory structure is corrupted by a grub command, the quit +command will issue an error message and refuse to exit from grub. + +3. Because GRUB may corrupt extended memory, you should better avoid using +extended memory under DOS before running GRUB.EXE. + +4. Gate A20 will be enabled by GRUB.EXE. Hopefully this would hurt nothing. + + +****************************************************************************** +*** Memory usage in conventional/low memory area *** +****************************************************************************** + +1. boot.c, fsys_reiserfs.c: 8K below 0x68000. + +2. fsys_ext2fs.c, fsys_minix.c: 1K below 0x68000. + +3. fsys_jfs.c: 4K + 256 bytes below 0x68000. + +4. fsys_reiserfs.c: 202 bytes at 0x600. + +5. fsys_xfs.c: 188 bytes at 0x600. + +6. fsys_xfs.c: (logical block size) bytes below 0x68000. + +7. geometry tune: 0x50000 - 0x5ffff. + +****************************************************************************** +*** Command-line Length about GRUB.EXE *** +****************************************************************************** + +GRUB.EXE now can be started in CONFIG.SYS with the **DEVICE** command: + + DEVICE=grub.exe [--config-file="FILENAME_OR_COMMANDS"] + +1. If GRUB.EXE is invoked with DEVICE command and FILENAME_OR_COMMANDS is a +collection of some GRUB commands separated by semi-colon, then the length of +FILENAME_OR_COMMANDS can be nearly 4KB ----Supprise? But true! MS-DOS 7+ +even allows a much longer line, but 4KB seems enough for our use of GRUB.EXE. +This is very useful when we want to embed a big menu into the command line. +Note that GRLDR hasn't yet supported any command-line arguments. + +2. If GRUB.EXE is invoked with INSTALL command, the option length has a limit +of 80 characters(including the leading "--config-file=" part). An overflow may +hang up MS-DOS immediately. + +3. If GRUB.EXE is invoked with SHELL command, the option length has a limit of +126 characters(including the leading "--config-file=" part). Overflow won't +hang up MS-DOS, but the line will be cut short. This limit is the same as that +in the console-DOS-prompt or in a BAT file. + +4. The DOS editor EDIT does not allow to create a line of 4KB long. So use +another editor, for example, vi for Linux, please. + +5. The DEVICE=GRUB.EXE line can be used together with other DEVICE commands +such as DEVICE=HIMEM.SYS and DEVICE=EMM386.EXE. The GRUB.EXE line should +occur before the EMM386.EXE line in order to avoid the rejection by EMM386. +Update: Since 0.4.2, GRUB.EXE works well even after EMM386.EXE is loaded. + +6. In any case mentioned above, you can return back to DOS by quit command. + +7. Memory usage about command-line menu: The 4KB command-line menu starts at +physical address 0x0800 and ends at 0x17FF. + +****************************************************************************** +*** New Syntax for the DEFAULT/SAVEDEFAULT Commands *** +****************************************************************************** + +In addition to the original usage of "default NUM" and "default saved", now +there is a new usage of "default FILE", like this: + + default (hd0,0)/default + +Note that FILE must have a valid DEFAULT file format. A sample DEFAULT file +is included in the release. You may copy it to wherever you like, but you +should avoid modifying its content manually. The DEFAULT file may be used +in this way: + +(1) First, you should copy a default file with valid format to somewhere in +your operating system. + +(2) Secondly, you should use the "default FILE" command of GRUB to announce +the use of FILE as our new default file for being written by "savedefault". + +(3) Then, you may use "savedefault" command to save the desired entry number +into this new default file. + +(4) OK, at next boot, you may read the saved entry number by using the same +"default FILE" command as mentioned in above (2). + +And the SAVEDEFAULT command now accept an options `--wait=T', like this: + + savedefault --wait=5 + +If `--wait=T' is specified and T is non-zero, savedefault will prompt +the user with a message just before it writes to disk. The write operation +will be cancelled in T seconds if the `Y' key was not pressed. + +Here is a sample menu.lst file: + +#--------------------begin menu.lst--------------------------------------- +color black/cyan yellow/cyan +timeout 30 +default /default + +title find and load NTLDR of Windows NT/2K/XP +find --set-root /ntldr +chainloader /ntldr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback 2 +find --set-root /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +write 0x7C07 0x00736E6F +savedefault --wait=2 + +title find and load IO.SYS of Windows 9x/Me +find --set-root /io.sys +chainloader /io.sys +savedefault --wait=2 + +title floppy (fd0) +chainloader (fd0)+1 +rootnoverify (fd0) +savedefault --wait=2 + +title find and boot Linux with menu.lst already installed +find --set-root /sbin/init +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title find and boot Mandriva with menu.lst already installed +find --set-root /etc/mandriva-release +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title back to dos +savedefault --wait=2 +quit + +title commandline +savedefault --wait=2 +commandline + +title reboot +savedefault --wait=2 +reboot + +title halt +savedefault --wait=2 +halt +#--------------------end menu.lst--------------------------------------- + +Note 1: The file DEFAULT must exist and have a proper format as stated above. + Or else, the default/savedefault commands won't function well. + +Note 2: The file DEFAULT which is in the same dir as a certain MENU.LST file + is called associated with the MENU.LST file. + +Note 3: The associated DEFAULT file will take effect automatically if there + are no `default' commands present. + +Note 4: Just before a menu file gains control(e.g., it is the associated + MENU.LST of a GRLDR file, or it was specified via + `grub.exe --config-file=(DEVICE)/PATH/YOUR_MENU_FILE', or it was + specified by the `configfile' command of grub), its associated + DEFAULT file will be used if present, until an explicit `default' + command is encountered. + +****************************************************************************** +*** The New `cdrom' Command Syntax *** +****************************************************************************** + +1. Initialize the ATAPI CDROM devices: + + grub> cdrom --init + + This will display the number of atapi cdroms found: atapi_dev_count + +2. Stop the ATAPI CDROM devices: + + grub> cdrom --stop + + This will set atapi_dev_count to 0. + +3. Add IO ports for searching the atapi cdrom devices. For example: + + grub> cdrom --add-io-ports=0x03F601F0 + +After running `cdrom --init' and `map --hook', the cdroms can be accessed +through devices (cd0), (cd1), ... + +Note 1: If the system does not fully support the ATAPI CD-ROM specifications, + you will encounter failure when trying to access the (cdX) devices. + +Note 2: After doing a `cdrom --stop', you should do a `map --unhook'. Of + course you may `map --hook' again if there are mapped drives. + +Note 3: After adding IO ports, you should do a `map --unhook' followed by a + `cdrom --init' and then followed by a `map --hook'. + + By default, these ports are used for searching cdroms(so they needn't + be added): + + 0x03F601F0, 0x03760170, 0x02F600F0, + 0x03860180, 0x6F006B00, 0x77007300. + +Note 4: The BIOS might have offered a cdrom interface. It would be (cd). After + `cdrom --init' and `map --hook', we might have our (cd0), (cd1), ... + available. It is likely that one of them could access the same media + as the BIOS-offered (cd). + +Note 5: You may access the (cd) and (cdX)'es in the blocklist way. Example: + + cat --hex (cd0)16+2 + + The cdrom sectors are big sectors with a size of 2048 bytes. + +Note 6: The iso9660 filesystem driver has Rock-Ridge extension support, but + has no Joliet extension support. So you may encounter failure when + you attempt to read files on a Joliet CD. + +Note 7: The (cd) or (cdX)'es can be booted now. Examples: + + chainloader (cd) + boot + + chainloader (cd0) + boot + + chainloader (cd1) + boot + + You should already have access to the CD sectors before you can + chainload it. + +****************************************************************************** +*** About the New `setvbe' Command *** +****************************************************************************** + +Gerardo Richarte contributed the `setvbe' code and the following comment: + + New command is `setvbe', and can be used to change the video mode + before executing the kernel. + + For example, you can do + + setvbe 1024x768x32 + + this will scan the list of available modes and set it, and + automatically append a `video=' option to each subsequent kernel + command-line. The appended `video=' option is like this: + + video=1024x768x32@0xf0000000,4096 + + where 0xf0000000 is the video framebuffer address as reported by vbe, + and 4096 is the size of a scanline in bytes (also as reported by vbe). + + This is really useful if you want to give some graphics support to your + OS, but you don't want to implement any video functionality other than + writing a pixel to video memory. + + +****************************************************************************** +*** About the DOS utility `hmload' *** +****************************************************************************** + +This program was written by John Cobb (Queen Mary, University of London). + +John Cobb's note: + + To make use of the ram drive feature I wrote a program `hmload' to load + an arbitrary file to an arbitrary address in high memory. The program + is not very sophisticated and relies on XMS to turn on the A20 line. + (Also one must be very careful to steer clear of any areas of memory + already in use). + + Under Linux we generated a disk image `dskimg' (with the kernel and + Initrd and a partition table). + + Using this our boot procedure looked something like this: + + hmload -fdskimg -a128 + fixrb + + grub + + map --ram-drive=0x81 + map --rd-base=0x8000000 + map --rd-size=0x400000 + root (rd,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + boot + +See http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ for details. + +Update 2007-12-05: + + Now the MAP command can handle gzipped (rd) image. One can use this + feature with the hmload utility. For example, + + step 1. Load the gzipped image under DOS at a relatively low address: + + hmload -fdskimg.gz -a16 + + step 2. Unload network drivers. + + step 3. Run GRUB.EXE. + + step 4. At the grub prompt, run these commands: + + map --rd-base=0x1000000 # set rd-base address to be 16M + map --rd-size= + map (rd)+1 (hd0) # This will decompress (rd) and place + # the decompressed image at the top end + # of the extended memory. The (rd)+1 + # here has special meaning and stands + # for the whole (rd) device. You must + # use (rd)+1 instead of (rd). + map --hook + root (hd0,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + map --unhook + map (hd0) (hd0) # Delete the map; this is needed. + boot + + +****************************************************************************** +*** Notes on the use of stack *** +****************************************************************************** + +The protected-mode and real-mode stack are merged at physical address 0x2000. + +All functions should use at most 2K stack space(0x1800-0x2000). So each +subfunction should use as little stack as possible to avoid stack-overflow. + +Don't use recursive functions because they could expend too much stack space. + +The original protected mode stack at 0x68000(expand-down) is free now and can +be reused for any purposes. + + +****************************************************************************** +*** A bug was found in the CDROM driver *** +****************************************************************************** + +It seems the cdrom must be connected as the master device of an IDE controller. + +If cdrom is slave, the driver will fail to read the cdrom sectors. Hope someone + +could fix this problem. + + +****************************************************************************** +*** BIOS and the (cd) drive *** +****************************************************************************** + +When BIOS boots a no-emulation-mode bootable CD-ROM, it allocates a BIOS drive +number to the CD. If the boot image of the CD-ROM is grldr or stage2_eltorito, +then GRUB can access the CD-ROM media through the drive number allocated by +BIOS. The device name of the CD-ROM is (cd). + +BIOS can allocate a BIOS drive number to a no-emulation-mode CDROM even when +the CDROM is not bootable. QEMU has done so. At boot time, GRUB4DOS will +search drives 0x80-0xFF for a possible no-emulation-mode CDROM drive allocated +by BIOS. So if BIOS offered a CDROM interface of int13 EBIOS functions 41h-4Eh, +then the (cd) device will be automatically available in GRUB4DOS. + + +****************************************************************************** +*** The way of disk emulation changed greatly *** +****************************************************************************** + +The way of disk emulation has changed greatly since 0.4.2 final. Please don't +mix newer versions with older versions when disk emulation features are used. + +The newer versions won't automatically unhook emulations established in a +previous grub4dos environment. The GRUB.EXE of an older version will +automatically dismiss emulations established earlier, before transferring +control to the main grub program(i.e., pre_stage2). + + +****************************************************************************** +*** FreeDOS EMM386 v2.26 (2006-08-27) VCPI problem *** +****************************************************************************** + +The VCPI function "AX=DE0Ch - Switch From Protected Mode to V86 Mode" of +FreeDOS EMM386 v2.26 was not implemented properly(it always hangs). As an +alternative, you can use Microsoft's EMM386 instead. + +Even while emm386 is running, grub.exe can be started. But if you try to quit +to DOS from grub4dos by using the `quit' command, the VCPI function DE0C will +be called. If EMM386 is of Microsoft, everything goes ok. If EMM386 is of +FreeDOS, the machine will hang. + + +****************************************************************************** +*** New options for map were added *** +****************************************************************************** + +Along with 0.4.2 final, there are two new options for the map command. They +are --safe-mbr-hook=SMH and --int13-scheme=SCH. Both are related with disk +emulation for use(as smoothly as possible) in the Win9x environment. + +SMH can take either of the two values 0 and 1. By default, SMH is 1. If you +encountered problems of disk emulation under Win9x, you may insert a line of + + map --safe-mbr-hook=0 + +before the `boot' command and try again. + +Also SCH may take either 0 or 1 at present. By default, SCH is 1. If you +encountered disk emulation problems under Win9x, you may insert a line of + + map --int13-scheme=0 + +before the `boot' command and try again. + +Note by the way. Like --safe-mbr-hook and --int13-scheme, the MAP command has +a few other options that are used for setting global variables. They are here: + + map --floppies=M + +M can be 0, 1, or 2. MAP will set a proper value at 0040:0010 by using M. + + map --harddrives=N + +N can be between 0 and 127(inclusive). MAP will set 0040:0075 to N. + + map --memdisk-raw=RAW + +RAW default to 1. If RAW=0, `int15/ah=87h' will be used to access memdrives. + + map --ram-drive=RD + +RD default to 0x7F which is a floppy. If the RAM DRIVE is a hard drive image +(with partition table in the first sector), you should set RD >= 0x80 and RD +< 0xFF. + + map --rd-base=ADDR + + map --rd-size=SIZE + +ADDR specifies the physical base address of the ramdisk image. SIZE specifies +the size in bytes of the ramdisk image. ADDR default to 0. SIZE is also default +to 0, but a size of 0 means 4GB, not a zero-long disk. The RAM DRIVE can be +accessed in the GRUB environment using the (rd) device. + + +****************************************************************************** +*** About the new map option --in-situ *** +****************************************************************************** + +--in-situ is used with hard drive images or hardrive partitions. With an +in-situ map, we can typically use a logical partition as a primary partition. + +In-situ map is a whole drive map. It only virtualize the partition table and +the number of hidden sectors in the BPB of the DOS Boot Record. + +While disk emulation may encounter various problems with win9x, the in-situ map +works fine with win9x. + +Note that --in-situ will not change the real partition table. + +Example: + + map --in-situ (hd0,4)+1 (hd0) + + +****************************************************************************** +*** The PARTNEW Command Syntax *** +****************************************************************************** + +Besides the mappings in the above section, you may instead choose to create a +new primary partition with the PARTNEW command. PARTNEW can generate a primary +partition entry (in the partition table) for a logical partition. + +For example, + + partnew (hd0,3) 0x07 (hd0,4)+1 + +where the file (hd0,4)+1 stands for the whole partition (hd0,4). This command +will create a new primary partition (hd0,3) whose type is 0x07 and whose +contents/data is the same as that of the logical partition (hd0,4). + +Just like a whole logical partition, a contiguous partition image file can +also be used with PARTNEW: + + partnew (hd0,3) 0x00 (hd0,0)/my_partition.img + +The type 0x00 indicates a type-auto-detection of the image MY_PARTITION.IMG. +The above command will create a new primary partition (hd0,3) with a proper +type and with contents/data being exactly that of the contiguous file +(hd0,0)/my_partition.img. + +PARTNEW will automatically correct the "hidden sectors" in the BPB and the +modification will be permanent. And PARTNEW modifies the partition table +permanently. + +In addition to creating new partition entries, PARTNEW can also be used to +delete(erase, or wipe) a primary partition entry. For example, + + partnew (hd0,3) 0 0 0 + +which will empty the last entry in the partition table in MBR. Generally, +you should use the form of "partnew PARTITION 0 0 0" to erase the entry. +Note that only the entry would be erased, and the data stored in the partition +will not be touched. + +****************************************************************************** +*** Newly implemented operators `&&' and `||' *** +****************************************************************************** + +This implementation is very simple. It does not handle operator nesting. + +Usage of `&&': + + command1 && command2 + +Description: + + If command1 returns true, then command2 will be executed. + +Usage of `||': + + command1 || command2 + +Description: + + If command1 returns false, then command2 will be executed. + +Examples: + + is64bit && default 0 + is64bit || default 1 + +****************************************************************************** +*** Three new commands is64bit, errnum and errorcheck *** +****************************************************************************** + +is64bit and errnum retrieve the value of is64bit and errnum respectively. + +errorcheck controls whether or not the error will be handled. By default, +errorcheck is on, and menu script execution will stop on error. If errorcheck +is off, the script will continue to execute upto a boot command. A boot command +will turn the errorcheck on. + + +****************************************************************************** +*** Use numeric keys to select a menu entry *** +****************************************************************************** + +If, for example, you intend to goto entry #25, you may press 2 followed by 5. + + +****************************************************************************** +*** Use the INSERT key to debug step by step at startup *** +****************************************************************************** + +Some buggy machines could fail to enter grub4dos environment. They might hang +or reboot unexpectedly. Press INSERT as quickly as possible on startup, and +you can get a chance to single-step the boot process and see how far it can +go, and then report bugs. + + +****************************************************************************** +*** The debug command syntax has been changed *** +****************************************************************************** + +The DEBUG command now can be used to control the verbosity of command output: + + debug [ on | off | normal | status | INTEGER ] + +0 or off for silent +1 or normal for normal +2 to 0x7FFFFFFF or on for verbose + + +****************************************************************************** +*** GRUB4DOS and Windows Vista *** +****************************************************************************** + +First, use the following command to create a boot entry: + + bcdedit /create /d "GRUB for DOS" /application bootsector + +The result will look like this: + +The entry {05d33150-3fde-11dc-a457-00021cf82fb0} was successfully created. + +The long string {05d33150-3fde-11dc-a457-00021cf82fb0} is the id for this +entry. + +Then, use the following commands to set boot parameters: + + bcdedit /set {id} device boot + bcdedit /set {id} path \grldr.mbr + bcdedit /displayorder {id} /addlast + +Please replace {id} with the actual id returned from the previous command. + +Finally, copy GRLDR.MBR to C:\ or wherever your boot drive is, and copy GRLDR +and menu.lst to the root directory of any FAT16/FAT32/EXT2/NTFS partition. + +Note: A boot partition should be the active primary partition with BOOTMGR + inside. The `device boot' indicates grldr.mbr should be in the boot + partition. + +Lianjiang has written down a script to automate the tasks: + + @echo off + rem by lianjiang + cls + echo. + echo Please run as administrator + echo. + pause + set gname=GRUB for DOS + set vid= + set timeout=5 + bcdedit >bcdtemp.txt + type bcdtemp.txt | find "\grldr.mbr" >nul && echo. && echo BCD entry existing, no need to install. && pause && goto exit + bcdedit /export "Bcd_Backup" >nul + bcdedit /create /d "%gname%" /application bootsector >vid.ini + for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do ( + set vida=%%i + ) + for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do ( + set vid={%%i} + ) + echo %vid%>vid.ini + bcdedit /set %vid% device boot >nul + bcdedit /set %vid% path \grldr.mbr >nul + bcdedit /displayorder %vid% /addlast >nul + bcdedit /timeout %timeout% >nul + if exist grldr.mbr copy grldr.mbr %systemdrive%\ /y && goto exit + echo. + echo Please copy grldr.mbr to %systemdrive%\ + echo. + pause + :exit + del bcdtemp.txt >nul +------------------------------------------------------------------- +Update: Fujianabc pointed out that + + bcdedit /set %vid% device boot >nul + +should be changed to + + bcdedit /set %vid% device partition=%SystemDrive% >nul +------------------------------------------------------------------- + +You still need to copy grldr yourself. + +Notice: It's possible to modify the BCD entry from a different OS, you just +need to specify the location of BCD: + + bcdedit /store D:\boot\BCD ... + +Notice: These commands need elevated privileges, they should be used inside +cmd.exe which is started with "Run as administrator". + +Notice: People has reported that some version of Vista doesn't support +creating file in C:\ with no extension, even with administrator privileges. +This means grldr can't be placed in C:\. You can solve this by either copy +grldr to another partition, or rename grldr to something like grub.bin. Please +see the following section on how to do this. + + +****************************************************************************** +*** How to rename grldr *** +****************************************************************************** + +grldr and grldr.mbr use internal boot file name to decide which file to load, +so if you want to change the name, you must also change the embeded setting. +You can do this with the help of grubinst, which can be downloaded at: + +http://download.gna.org/grubutil/ + +grubinst can generate customized grldr.mbr: + + grubinst -o -b=mygrldr C:\mygrldr.mbr + +grubinst can also edit existing grldr/grldr.mbr: + + grubinst -e -b=mygrldr C:\mygrldr + + grubinst -e -b=mygrldr C:\mygrldr.mbr + +In this case, you must use a grubinst that is compatible with the version of +grub4dos, otherwise the edit will fail. + +So, in order to load mygrldr instead of grldr, you can use one of the +following methods: + +1. Use customized grldr.mbr to load mygrldr. In this case, you need to change +the embeded boot file name in grldr.mbr. The name of grldr.mbr can be changed +at will. + +2. Use mygrldr directly. In this case, you need to change the embeded boot +file name in mygrldr to match its new name. + +Notice: The boot file name must conform to the 8.3 naming convention. + + +****************************************************************************** +*** PXE device *** +****************************************************************************** + +If PXE service is found at startup, GRUB4DOS will create a virtual device +(pd), through which files from the tftp server can be accessed. You can setup +a diskless boot environment using the following steps: + +Client side + +You need to boot from PXE ROM. + +Server side + +You need to configure a dhcp server and a tftp server. In the dhcp server, use +grldr as boot file. + +You may also want to load a different menu.lst for different client. GRUB4DOS +will scan the following location for configuration file: + + [/mybootdir]/menu.lst/01-88-99-AA-BB-CC-DD + [/mybootdir]/menu.lst/C000025B + [/mybootdir]/menu.lst/C000025 + [/mybootdir]/menu.lst/C00002 + [/mybootdir]/menu.lst/C0000 + [/mybootdir]/menu.lst/C000 + [/mybootdir]/menu.lst/C00 + [/mybootdir]/menu.lst/C0 + [/mybootdir]/menu.lst/C + [/mybootdir]/menu.lst/default + +Here, we assume the network card mac for the client machine is +88:99:AA:BB:CC:DD, and the ip address is 192.0.2.91 (C000025B). /mybootdir is +the directory of the boot file, for example, if boot file is /tftp/grldr, then +mybootdir=tftp. + +If none of the above files is present, grldr will use its embeded menu.lst. + +This is a menu.lst to illstrate how to use files from the tftp server. + + title Create ramdisk using map + map --mem (pd)/floppy.img (fd0) + map --hook + rootnoverify (fd0) + chainloader (fd0)+1 + + title Create ramdisk using memdisk + kernel (pd)/memdisk + initrd (pd)/floppy.img + +You can see that the menu.lst is very similar to normal disk boot, you just +need to replace device like (hd0,0) with (pd). + +There are some differences between disk device and pxe device: + +1. You can't list files in the pxe device. + +2. The blocklist command will not work with a file in the pxe device. + +3. You must use --mem option if you want to map a file in the pxe device. + +When you use chainloader to load file from the pxe device, there is a option +you can use: + + chainloader --raw (pd)/BOOT_FILE + +Option --raw works just like --force, but it load file in one go. This can +improve performance in some situation. + +You can use the pxe command to control the pxe device. + +1. pxe + + If used without any parameter, pxe command will display current + settings. + +2. pxe blksize N + + Set the packet size for tftp transmission. Minimum value is 512, + maximum value is 1432. This parameter is used primarily for very old + tftp server where packet larger than 512 byte is not supported. + +3. pxe basedir /dir + + Set the base directory for files in the tftp server. If + + pxe basedir /tftp + + then all files in the pxe device is related to directory /tftp, for + example, (pd)/aa.img correspond to /tftp/aa.img in the server. + + The default value of base directory is the directory of the boot file, + for example, if boot file is /tftp/grldr, then default base directory + is /tftp. + +4. pxe keep + + Keep the PXE stack. The default behaviour of GRUB4DOS is to unload + the PXE stack just before it exits. + +5. pxe unload + + Unload the PXE stack immediately. + + + +****************************************************************************** +*** New Feature of Relative Path Support *** +****************************************************************************** + +Use the `root' or `rootnoverify' command to specify the `working directory'. + +For example: + + root (hd0,0)/boot/grub + +This specifies that the working dir is (hd0,0)/boot/grub. So all subsequent +filenames of the form "/..." will actually refer to (hd0,0)/boot/grub/... + +That is to say: + + cat /menu.lst + +will be equivalent to + + cat (hd0,0)/boot/grub/menu.lst + + + +****************************************************************************** +*** Notation For The Current Root Device *** +****************************************************************************** + + +The notation `()' can be used to access the current root device. You may use +`find --set-root ...' to set the current root device, but the find command +does not set the `working dir' of the root device. In this case you should +use `()' to set the working dir after the find command: + + root ()/boot/grub + +Update 2008-05-01: + + FIND can also set the `working directory' now. For example: + + find --set-root=/tmp /boot/grub/menu.lst + + It is equivalent to this pair of commands: + + find --set-root /boot/grub/menu.lst + root ()/tmp + + +****************************************************************************** +*** The new map option --a20-keep-on *** +****************************************************************************** + + +Along with 0.4.3 final, map has a new option --a20-keep-on which is related to +A20 control after a memdrive sector access. Usage: + + map --a20-keep-on=0 + +It should be used before the "map --hook" command. + +By default, A20 will be always on after an RAM INT13 sector access. If +"map --a20-keep-on=0" is used, the A20 status after the INT13 call will be the +same as that before the INT13 call. + + +****************************************************************************** +*** The CDROM emulation (virtualization) *** +****************************************************************************** + +The CDROM emulation is sometimes called ISO emulation. Here is an example: + + map (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +if myiso.iso is not contiguous and you have enough memory, add a --mem option: + + map --mem (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +Note: (hd32) is a grub drive number equivalent to (0xA0). If a virtual drive is +specified with a drive number greater than or equal to 0xA0, then it will be +treated as a cdrom (i.e., with 2048-byte big sectors). + +Like normal disk emulations, the CDROM emulation also (mainly) works with +real-mode OSes. After a protected-mode OS kernel (such as +WinNT/2K/XP/VISTA/LINUX) gains control, the OS would have no ability to access +the virtual CDROM through BIOS int13. + +DOS/Win9x users may google for ELTORITO.SYS and use it in CONFIG.SYS as a +device driver for the virtual cdrom. + +Example usage of eltorito.sys in CONFIG.SYS: + + device=eltorito.sys /D:oemcd001 + +Corresponding MSCDEX command which can be placed in AUTOEXEC.BAT: + + MSCDEX /D:oemcd001 /L:D + + +Due to some bugs found in eltorito.sys, the driver could fail to load. If you +encounter such problems, then you may replace (hd32) with (0xFF) for the +virtual cdrom drive number and try again. + + +****************************************************************************** +*** The New Command CHECKRANGE *** +****************************************************************************** + +Checkrange checks whether or not the return value of a command is in the +specified range or ranges. + +Usage: checkrange RANGE COMMAND + +Here are some examples for RANGE: + + 3 is a range containing only the number 3 + 3:3 is equivalent to 3 + 3:8 is a range containing the numbers 3, 4, 5, 6, 7, 8 + 3,4,5,6,7,8 is equivalent to 3:8 + 3:5,6:8 is also equivalent to 3:8 + 3,4:7,8 is also equivalent to 3:8 + +Note: You should not insert spaces into a range. + +Here is an example showing where the checkrange can be used: + + checkrange 0x05,0x0F,0x85 parttype (hd0,1) || hide (hd0,1) + +which means: if (hd0,1) is not an extended partition, then hide it. + + +****************************************************************************** +*** The New Command TPM *** +****************************************************************************** + +The "tpm --init" uses 512-byte data at 0000:7C00 as buffer to initialise TPM. + +Before you boot VISTA's BOOTMGR, you might have to use the "tpm --init" +command on some machines. Normally you want to issue the "tpm --init" command +after a CHAINLOADER command. + + +****************************************************************************** +*** Delimitors or comments between titles *** +****************************************************************************** + +It is possible to use titles as delimitors or comments. A title(or menu item) +is called unbootable if all of its menu commands are not boot-sensitive. + +The following commands are boot-sensitive(and others are not boot-sensitive): + + boot + bootp + chainloader + configfile + embed + commandline + halt + install + kernel + pxe + quit + reboot + setup + +An unbootable title will be skipped when the user presses the Up Arrow or Down +Arrow keys. Even the unbootable menu item can get accessed(and executed) by +using the Left Arrow and/or Right Arrow keys. Examples: + + title This is an UNBOOTABLE entry(so this line is also a comment) + pause --wait=0 This title is a comment. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + help root + help chainloader + help parttype + clear + title ------------------------------------------------------------ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + clear + help + help boot + title ============================================================ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + clear + help pause + title ************************************************************ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help kernel + help + clear + +Note: An unbootable menu item must contain at least one command. If there +are no commands for a title, the title will be simply discarded and disappear. + + +****************************************************************************** +*** Bifurcate drives *** +****************************************************************************** + +Some machines apply different actions to a drive between CHS and LBA mode. +When you read sectors using standard BIOS call int13/AH=02h, you might find +out the drive is a floppy. But when you read sectors using extended BIOS +call(EBIOS) int13/AH=42h, you could know the drive is a cdrom. Such a drive +is called bifurcate. + +A bifurcate drive can have two drive numbers: one is the normal BIOS drive +number between 00 and FF in hexa, and this drive uses only CHS mode disk +access(standard BIOS int13/AH=02h); the other is the normal BIOS drive number +(Bitwise) OR'ed by 0x100(i.e., 256 in decimal), and this drive uses only +LBA mode disk access(EBIOS int13/AH=42h). For example, if the drive 0x00 +(i.e., the first floppy) is bifurcate, then the drive (0x00) uses CHS mode +to access its sectors, and the drive (0x100) uses LBA (meaning EBIOS) mode +to access its sectors. + +The geometry command can report the disk access mode for bifurcate drives as +BIF instead of the conventional CHS or LBA. + +Known bifurcate drives. Virtual PC and some real machines are found to create +a bifurcate floppy drive when they boot from a floppy-emulation mode bootable +cdrom. The "geometry (fd0)" will show + + drive 0x00(BIF): C/H/S=...Sector Count/Size=.../512 + +and "geometry (0x100)" will show + + drive 0x100(BIF): C/H/S=...Sector Count/Size=.../2048 + +Actually (0x100) can access the whole cdrom, you may "ls (0x100)/" and find +your files on the cdrom(not the files inside the booted floppy image). Of +course "ls (fd0)/" will list the files inside the booted floppy image. + +Note that only some (real or virtual) machines have this action, others +will not produce bifurcate drives. + + +****************************************************************************** +*** GRLDR as PXE boot file *** +****************************************************************************** + +GRLDR can be used as the PXE boot file on a remote/network server. The (pd) +device is used to access files on the server. When GRLDR is booted through +network, it will use its preset menu as the config file. However, you may use +a "pxe detect" command, which acts the same way as PXELINUX: + + * First, it will search for the config file using the hardware type (using + its ARP type code) and address, all in hexadecimal with dash separators; + for example, for an Ethernet (ARP type 1) with address 88:99:AA:BB:CC:DD + it would search for the filename 01-88-99-AA-BB-CC-DD. + + * Next, it will search for the config file using its own IP address in + upper case hexadecimal, e.g. 192.0.2.91 -> C000025B. If that file is not + found, it will remove one hex digit and try again. At last, it will try + looking for a file named default (in lower case). As an example, if the + boot file name is /mybootdir/grldr, the Ethernet MAC address is + 88:99:AA:BB:CC:DD and the IP address 192.0.2.91, it will try following + files (in that order): + + /mybootdir/menu.lst/01-88-99-AA-BB-CC-DD + /mybootdir/menu.lst/C000025B + /mybootdir/menu.lst/C000025 + /mybootdir/menu.lst/C00002 + /mybootdir/menu.lst/C0000 + /mybootdir/menu.lst/C000 + /mybootdir/menu.lst/C00 + /mybootdir/menu.lst/C0 + /mybootdir/menu.lst/C + /mybootdir/menu.lst/default + +You cannot directly map an image file on (pd). You must map it in memory using +the --mem option. For example, + + map --mem (pd)/images/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + boot + +One more example, + + map --mem (pd)/images/cdimage.iso (0xff) + map --hook + chainloader (0xff) + boot + + +****************************************************************************** +*** New program badgrub.exe *** +****************************************************************************** + +The new program badgrub.exe is intended to serve 'bad' machines(typically some +DELL models) that cannot run the normal grub.exe. + + +****************************************************************************** +*** Conditional find *** +****************************************************************************** + +The new find syntax allows to find a device conditionally. + + find [OPTIONS] [FILENAME] [CONDITION] + +CONDITION is a normal grub command which returns TRUE or FALSE. + + Example 1: + + find + + This will list all partitions, all floppies and the (cd). + + Example 2: + + find +1 + + This will list all devices with a known filesystem. + + Example 3: + + find checkrange 0xAF parttype + + This will list all partitions with ID=0xAF. + + Example 4: + + find /ntldr checkrange 0x07 parttype + + This will list all partitions with ID=0x07 and existing /ntldr. + + + +****************************************************************************** +*** How to build grldr boot images *** +****************************************************************************** + +1. build 1.44M floppy image ext2grldr.img + + dd if=/dev/zero of=ext2grldr.img bs=512 count=2880 + mke2fs ext2grldr.img + mkdir ext2tmp + mount -o loop ext2grldr.img ext2tmp + cp default ext2tmp + cp menu.lst ext2tmp + cp grldr ext2tmp + umount ext2tmp + bootlace.com --floppy --chs --sectors-per-track=18 --heads=2 --start-sector=0 --total-sectors=2880 ext2grldr.img + +2. build 1.44M floppy image fat12grldr.img + + dd if=/dev/zero of=fat12grldr.img bs=512 count=2880 + mkdosfs fat12grldr.img + mkdir fat12tmp + mount -o loop fat12grldr.img fat12tmp + cp default fat12tmp + cp menu.lst fat12tmp + cp grldr fat12tmp + umount fat12tmp + bootlace.com --floppy --chs fat12grldr.img + +3. build iso9660 CDROM image grldr.iso + + mkdir iso_root + cp grldr iso_root + cp menu.lst iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + +****************************************************************************** +*** Use bootlace.com to install partition boot record *** +****************************************************************************** + +Since bootlace.com has not implemented the --install-partition option, you +need to use the already implemented --floppy=PartitionNumber option instead. + +Hear is a way you might want to follow: + +Step 1. Get the boot sectors of the partition and save to a file MYPART.TMP. + For NTFS, you need to get the beginning 16 sectors. For other type of + filesystems, you only need to get one sector, but getting more sectors + is also ok. + +Step 2. Run this: + + bootlace.com --floppy=Y --sectors-per-track=S --heads=H --start-sector=B --total-sectors=C --vfat --ext2 --ntfs MYPART.TMP + + where we suppose MYPART.TMP is for (hdX,Y) and the partition number Y + should be specified as in the --floppy=Y option. + + Note that for FAT12/16/32/NTFS partitions, you can omit these options: + + --sectors-per-track, --heads, --start-sector, --total-sectors, + --vfat and --ext2. + + For NTFS partitions, you must specify --ntfs option. + + For ext2 partitions, you can omit --vfat, --ntfs and --ext2 options, + but other options should be specified. + +Step 3. Put MYPART.TMP back on to the boot sector(s) of your original partition + (hdX,Y). + + +Note: Only a few file systems(FAT12/16/32/NTFS/ext2/ext3) are supported by now. + +Note2: Under Linux you may directly write the partition. That is to say, Step + 1 and Step 3 are not needed. Simply use its device name instead of + MYPART.TMP. + +Note3: grubinst has the feature of installing grldr boot code onto a + partition boot area. + +****************************************************************************** +*** Use a single key to select menu item *** +****************************************************************************** + +Some machines have a simplified keyboard. The keyborad might have only the +number keys 0 .. 9 plus a few other keys. When the menu displayed, the user +can strike a key for 8 times. When the menu handler detects the continuous +single keypress, it will assume the user want to use this key to select a menu +item and boot. This single key will act as the RIGHT-ARROW key for the user to +select a menu item. And 5 seconds later after the user stops the keypress, +the selected menu item will automatically boot. Any normal keys can be used as +a single key for this purpose, except for a few functional keys like b, e, +Enter, etc. Once another key is pressed, the feature of Single-Key-Selection +will disappear immediately. + + +****************************************************************************** +*** Parameter file for bootlace running under DOS *** +****************************************************************************** + +You may move all or part of the command-line arguments into a file. The file +can have multi lines. Just like SPACEs and TABs, the CRs and LFs can also +delimit the commandline arguments in the parameter file. + +Example: + + bootlace < my_parafile + bootlace --read-only my_mbr < my_other_options + +Note: Pipes do not work. You have to use the input-redirection operator(<). + + +****************************************************************************** +*** Use bootlace to create a triple MBR *** +****************************************************************************** + +This is typically used for USB drives, though it also works with hard drives. + +Steps to create triple MBR: + +1. Do a fresh FDISK to create a FAT12/16/32 partition starting at sector 95 +(in LBA, that is, the begginning sector(MBR) is sector 0). + +2. Install grldr boot sector onto the boot sector of this partition. See +section "Use bootlace.com to install partition boot record" above. + +3. Get 96 sectors of the drive starting at sector 0(MBR), and save to file +MYMBR96.TMP. + +4. Run bootlace.com: + + bootlace.com MYMBR96.TMP + +5. Put MYMBR96.TMP back onto the drive starting at MBR(sector 0). + +Note: If the drive already has a triple MBR, then bootlace will cancel it +and restore the original partition layout. + + +****************************************************************************** +*** Use 'pxe detect' in preset-menu *** +****************************************************************************** + +Now the "pxe" command has a new subcommand "detect": + + pxe detect [BLOCK_SIZE] [MENU_FILE] + +BLOCK_SIZE specifies the block size for PXE. If it is not specified or it is +0, then grub4dos will go through a probing process and get a proper value +for data transfer. + +MENU_FILE specifies the config file on the PXE server. If omitted, a standard +config file in the menu.lst sub-dir will gain control. For a description on +the config files in the menu.lst sub-dir, please refer to the section +"GRLDR as PXE boot file" above. +If MENU_FILE starts in a "/", then the MENU_FILE on the PXE server will gain +control, else(if MENU_FILE does not start in a "/") no menu will be executed. + +Normally you want to use a "pxe blksize ..." or a "pxe detect ..." command +before you access the (pd) device, since the default blocksize of 512 might +not work on your system. + + +****************************************************************************** +*** Use 'configfile' in preset-menu *** +****************************************************************************** + +Now the preset menu holds the highest priority. It will gain control prior to +the menu.lst on the boot device. If a 'configfile' command(without specifying +any file as the parameter) occurs in the menu init command group of the preset +menu, then control will go to the menu.lst on the boot device. + +Note: You should better not use "configfile ANOTHER_MENU" frequently in your +menu.lst file, because it could create infinite loop and thus hang your +computer. + + +****************************************************************************** +*** New command 'dd' to copy files *** +****************************************************************************** + +Usage: + +dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT] [buf=ADDR] [buflen=SIZE] + +Copy file IF to OF. BS is blocksize in bytes, default to 512. C is blocks to +copy, default is total blocks in IF. IN specifies number of blocks to skip +when read, default is 0. OUT specifies number of blocks to skip when write, +default is 0. Skipped blocks are not touched. Both IF and OF must exist. + +Both IF and OF must have a leading device name, i.e., of the form `(...)'. +You may use `()' for the current root device. + +dd can neither enlarge nor reduce the size of OF, the leftover tail of IF +will be discarded. OF cannot be a gzipped file. If IF is a gzipped file, +it will be decompressed automatically when copying. + +dd is dangerous, use at your own risk. To be on the safe side, you should +only use dd to write a file in memory. + +In some cases when writing a file in a NTFS volume, dd might fail. + +If you attempt to write a device or a block file that is not in memory by +starting dd in a menu, you will safely be refused :-) (Update: no restrictions +now) + +Update: New options are implemented for user defined buffer. By default, +the buffer is at address 0x50000, and length is 0x10000(=64KB). You cannot +specify ADDR to be lower than 0x100000(=1MB). Besides, you must specify SIZE +larger than 0x10000(=64KB). Normally you want ADDR >= 0x1000000(=16MB), and +SIZE also >= 16MB. A large SIZE could speed up the progression of dd. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! Both IF and OF can be a device name which stands for !!!! +!!!! all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +****************************************************************************** +*** New command 'uuid' to identify partitions *** +****************************************************************************** + +Usage: + + uuid [DEVICE] [UUID] + +If DEVICE is not specified, search for filesystem with UUID in all partitions +and set the partition containing the filesystem as new root (if UUID is +specified), or just list uuid's of all filesystems on all devices (if UUID is +not specified). If DEVICE is specified, return true or false according to +whether or not the DEVICE matches the specified UUID (if UUID is specified), +or just list the uuid of DEVICE (if UUID is not specified). + +Example 1: + + find --set-root uuid () 7f95820f-5e33-4e6c-8f50-0760bf06d79c + +which will find a partition with uuid=7f95820f-5e33-4e6c-8f50-0760bf06d79c +and set the partition as root if found. + +Example 2: + + uuid () + +which will print the uuid of the current root device. + + +****************************************************************************** +*** gfxmenu support in grub4dos *** +****************************************************************************** + +Gfxmenu support has been added to grub4dos. To use it, you must first find the +message file you need, then load it in menu.lst with command like this: + + gfxmenu /message + +This should be a gloabl command, that is, not inside any menu item. Also, it +can only be used in configure file, running it in console mode does not work. + +gfxmenu does not work in conjunction with the password feature. + +There are two major format of message file. Old format is created with gfxboot +3.2.* or older (size of message file is normally about 150K), while new format +is created with gfxboot 3.3.* and later (size of message file is normally above +300K). Both format are supported in grub4dos. + + +****************************************************************************** +*** Use 'write' to write a string into a device or file *** +****************************************************************************** + +Usage: + + write [--offset=SKIP] ADDR_OR_FILE INTEGER_OR_STRING + +SKIP is an integer and defaults to 0. + +If ADDR_OR_FILE is an integer, then it is treated as a memory address, and +INTEGER_OR_STRING must be an integer value. The integer INTEGER_OR_STRING +will be written to address (ADDR_OR_FILE + SKIP). + +If ADDR_OR_FILE is a device or a file, then INTEGER_OR_STRING is treated as +a string which will be written to ADDR_OR_FILE at offset SKIP (in bytes). + +The string is quoted with nothing, that is, neither with the single quote +char(') nor with the double quote char("). + +Space char must be quoted with back slash(\). (Update: need not now) + +Single quote char(') and double quote char(") are not interpreted specially +and can be used directly in the string. + +Some C-style quote sequences are interpreted as follows: + + \NNN character with octal value NNN (1 to 3 digits) + + \\ backslash + + \a alert (BEL) + + \b backspace + + \f form feed + + \n new line + + \r carriage return + + \t horizontal tab + + \v vertical tab + + \xHH byte with hexadecimal value HH (1 to 2 digits) + +Just like dd, the write can neither enlarge nor reduce the size of the +destination file, the leftover tail of the string will be discarded. +The destination file cannot be a gzipped file. + +Again like dd, the write command is also dangerous, use at your own risk. +And to be on the safe side, you should only write to memory files. + +In some cases when writing a file in a NTFS volume, the write might fail. + +If you attempt to write a device or a block file that is not in memory by +using write in a menu, you will safely be refused :-) (Update: no restrictions +now) + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! The file to write can be a device name which stands !!!! +!!!! for all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +****************************************************************************** +*** Item-by-item help text for menu entries *** +****************************************************************************** + + +The help message at the bottom of the screen will vary as you choose the menu. + +You may append your help text to the title line. The help text must begin +with "\n", for example: + + title This is the title\nThis is the help text.\nAnd this is the 2nd line of the help text. + +Some C-style quote sequences are interpreted as stated in the section above. + + +****************************************************************************** +*** initrd can load multiple cpio files for Linux 2.6 kernels *** +****************************************************************************** + +Usage: + + initrd FILE [FILE ...] + +Note 1: You should not load more than one oldstyle disk images in this way, +because this is not supported by Linux kernel. + +Note 2: The FILEs should be specified in the same order as with syslinux. + +****************************************************************************** +*** access some internel variables at a fixed location *** +****************************************************************************** + +Address Length Description +========= ======== ============================================== +0000:8208 4 (DWORD) install_partition (the boot partition) +0000:8280 4 (DWORD) boot_drive (the boot drive) +0000:8284 4 (DWORD) pxe_yip (your ip) +0000:8288 4 (DWORD) pxe_sip (server ip) +0000:828C 4 (DWORD) pxe_gip (gateway ip) +0000:8290 8 (QWORD) filesize (file size by last "cat --length=0") +0000:8298 4 (DWORD) saved_mem_upper (extended memory size in KB) +0000:829C 4 (DWORD) saved_partition (current root partition) +0000:82A0 4 (DWORD) saved_drive (current root drive) +0000:82A4 4 (DWORD) no_decompression (no auto gunzip) +0000:82A8 8 (QWORD) part_start (start sector of last partition) +0000:82B0 8 (QWORD) part_length (total sectors of last partition) + +Note 1: Filesize can be initialised/modified by using "cat --length=0 FILE". +Note 2: You should not write these variables by hand(should read only). +Note 3: You may use 1K at 6000:0000 for your own varibles(See note 4). +Note 4: The read command now returns the integer value at the given address. +Note 5: Grub4dos does not have the variable expansion feature. You can only + use integer variables. You need not declare them, but use the memory + address directly. Usually you want to use variables as a logical + value or in a command for conditional test, e.g., of this form: + "checkrange RANGE read ADDR" +Note 6: no_decompression, saved_drive and saved_partition are writable. + + +****************************************************************************** +*** possibility to run another menu.lst after gfxmenu *** +****************************************************************************** + +Notice the use of CONFIGFILE after GFXMENU in the following example: + + # The menu.lst file for gfxmenu + default=0 + timeout=5 + gfxmenu /message + configfile /another.lst + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of menu.lst + + # Begin another.lst + default=0 + timeout=5 + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of another.lst + +This will try gfxmenu command first. On exit(or on failure) control will go +to another.lst file. + + +****************************************************************************** +*** a range of drives can be unmapped *** +****************************************************************************** + +Usage: + + map --unmap=RANGE + +RANGE is a range of BIOS drive numbers to be unmapped. BIOS drive number 0 +is for the first floppy, 1 is for the second floppy; 0x80 is for the first +hard drive, 0x81 is for the second hard drive, etc; virtual cdrom (hd32) +corresponds to BIOS drive number 0xA0, (hd33) corresponds to 0xA1, etc. + +For description on RANGE, please refer to section `The New Command CHECKRANGE' +above. + +Example 1: + + map --unmap=0,0x80,0xff + +This will unmap virtual floppy (fd0), virtual hard drive (hd0) and virtual +cdrom (0xff). + +Example 2: + + map --unmap=0:0xff + +This will unmap all virtual floppies, all virtual hard drives and all virtual +cdroms. + +Note 1: Normally a `map' command will add an item in the drive map table for + a virtual drive. But `--unmap' means items in the drive map table + (for the specified virtual drives) will be deleted. +Note 2: The --unhook option only breaks the INT13 hook(to the inerrupt + vector table). It will not affect the drive map table. And later on + execution of a `boot' command, the INT13 disk emulation routine will + automatically get hooked(to the interrupt vector table) when needed + (e.g., the drive map table is non-empty) even if it has been unhooked. +Note 3: Usually you want to do a `map --rehook' after you have changed the + drive map table. + + +****************************************************************************** +*** geometry tune and sync *** +****************************************************************************** + +When a USB storage device is connected to a (or another) machine, the geometry +in the partition table or in the BPB of the volume could be invalid, and the +machine could hang at boot time. So you need to find out the correct geometry +for the drive (use `geometry --tune'), and then update the geometry in +partition table and BPB of the drive(use `geometry --sync'). + +The above steps are required if you are going to boot DOS, because DOS +requires the right geometry in the partition table and BPB. Windows/Linux may +also require it, since the boot process could run in real-mode. + + diff --git a/ogclient/lib/grub4dos/badgrub.exe b/ogclient/lib/grub4dos/badgrub.exe new file mode 100644 index 0000000..92b924d Binary files /dev/null and b/ogclient/lib/grub4dos/badgrub.exe differ diff --git a/ogclient/lib/grub4dos/bootlace.com b/ogclient/lib/grub4dos/bootlace.com new file mode 100644 index 0000000..58ae01f Binary files /dev/null and b/ogclient/lib/grub4dos/bootlace.com differ diff --git a/ogclient/lib/grub4dos/config.sys b/ogclient/lib/grub4dos/config.sys new file mode 100644 index 0000000..9aa253e --- /dev/null +++ b/ogclient/lib/grub4dos/config.sys @@ -0,0 +1,6 @@ +rem load grub.exe before emm386.exe +device=grub.exe --bypass --time-out=5 --config-file="color black/cyan yellow/cyan;timeout 60;default 0;title find and load NTLDR of Windows NT/2K/XP;find --set-root /ntldr;chainloader /ntldr;title find and load CMLDR, the Recovery Console of Windows NT/2K/XP;find --set-root /cmldr;chainloader /cmldr;write 0x7C03 0x63646D63;write 0x7C07 0x00736E6F;title find and load IO.SYS of Windows 9x/Me;find --set-root /io.sys;chainloader /io.sys;title floppy (fd0);chainloader (fd0)+1;rootnoverify (fd0);title find and boot Linux with menu.lst already installed;find --set-root /sbin/init;configfile /boot/grub/menu.lst;title find and boot Mandriva with menu.lst already installed;find --set-root /etc/mandriva-release;configfile /boot/grub/menu.lst;title back to dos;quit;title commandline;commandline;title reboot;reboot;title halt;halt;" + +device=c:\windows\himem.sys +device=c:\windows\emm386.exe + diff --git a/ogclient/lib/grub4dos/default b/ogclient/lib/grub4dos/default new file mode 100644 index 0000000..689c3c8 --- /dev/null +++ b/ogclient/lib/grub4dos/default @@ -0,0 +1,46 @@ + +# +# +# +# +# +# +# +# +# +# +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/ogclient/lib/grub4dos/example.menu.lst b/ogclient/lib/grub4dos/example.menu.lst new file mode 100644 index 0000000..e4d1e98 --- /dev/null +++ b/ogclient/lib/grub4dos/example.menu.lst @@ -0,0 +1,108 @@ +# This is a sample menu.lst file. You should make some changes to it. +# The old install method of booting via the stage-files has been removed. +# Please install GRLDR boot strap code to MBR with the bootlace.com +# utility under DOS/Win9x or Linux. + +color blue/green yellow/red white/magenta white/magenta +timeout 30 +default /default + +title find and load NTLDR of Windows NT/2K/XP +fallback 1 +find --set-root --ignore-floppies --ignore-cd /ntldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /ntldr +chainloader /ntldr +savedefault --wait=2 + +title find and load BOOTMGR of Windows VISTA +fallback 2 +find --set-root --ignore-floppies --ignore-cd /bootmgr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /bootmgr +chainloader /bootmgr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback 3 +find --set-root --ignore-floppies --ignore-cd /cmldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +write 0x7C07 0x00736E6F +savedefault --wait=2 + +title find and load IO.SYS of Windows 9x/Me +fallback 4 +find --set-root /io.sys +chainloader /io.sys +savedefault --wait=2 + +title find and boot 0PE.ISO +fallback 5 +find --set-root /0PE/0PE.ISO +map /0PE/0PE.ISO (0xff) || map --mem /0PE/0PE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title find and boot MicroPE.ISO +fallback 6 +find --set-root /boot/MicroPE.ISO +map /boot/MicroPE.ISO (0xff) || map --mem /boot/MicroPE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Parted Magic ISO +fallback 7 +find --set-root /pmagic.iso +map /pmagic.iso (0xff) || map --mem /pmagic.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Ultimate Boot CD ISO +fallback 8 +find --set-root /ubcd.iso +map /ubcd.iso (0xff) || map --mem /ubcd.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title commandline +commandline + +title floppy (fd0) +chainloader (fd0)+1 +rootnoverify (fd0) + +title back to dos +quit + +title reboot +reboot + +title halt +halt + +title MAXDOS.IMG +find --set-root --ignore-floppies /boot/MAXDOS.IMG +map --mem /boot/MAXDOS.IMG (fd0) +map --hook +chainloader (fd0)+1 +rootnoverify (fd0) + + diff --git a/ogclient/lib/grub4dos/grldr b/ogclient/lib/grub4dos/grldr new file mode 100644 index 0000000..16ed4c7 Binary files /dev/null and b/ogclient/lib/grub4dos/grldr differ diff --git a/ogclient/lib/grub4dos/grldr.mbr b/ogclient/lib/grub4dos/grldr.mbr new file mode 100644 index 0000000..7af7ed3 Binary files /dev/null and b/ogclient/lib/grub4dos/grldr.mbr differ diff --git a/ogclient/lib/grub4dos/grub.exe b/ogclient/lib/grub4dos/grub.exe new file mode 100644 index 0000000..57b890d Binary files /dev/null and b/ogclient/lib/grub4dos/grub.exe differ diff --git a/ogclient/lib/grub4dos/grub.pif b/ogclient/lib/grub4dos/grub.pif new file mode 100644 index 0000000..28b4380 Binary files /dev/null and b/ogclient/lib/grub4dos/grub.pif differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/COPYING b/ogclient/lib/grub4dos/grub4dos-0.4.5b/COPYING new file mode 100644 index 0000000..eeb586b --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_GRUB4DOS.txt b/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_GRUB4DOS.txt new file mode 100644 index 0000000..9d54b92 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_GRUB4DOS.txt @@ -0,0 +1,704 @@ +2011-12-05 Issue 53: add new command 'iftitle' for menu.(thanks @Steve6375). +2011-11-17 (tinybit)supported utf8 and unicode char printing. +2011-11-04 (tinybit)added new argument of max_width for putchar; various fixes. +2011-10-29 (tinybit)add new command 'font' for vesa fonts.(Not yet complete). +2011-10-22 (tinybit)bug fix on failed loading multi-boot kernel(issue 44). +2011-10-20 (tinybit)increased SYSTEM_RESERVED_MEMORY upto 0x2000000(i.e., 32M). +2011-10-19 (tinybit)merged console/graphics setcolor functions. +2011-10-18 (tinybit)rearranged memory usage and preparing for vbe support. merged console/graphics setcolor functions. +2011-10-03 (tinybit)changed buf_addr from 0x20000 to 0x100000 to avoid possible conflict between dd_func and get_diskinfo. +2011-10-01 (tinybit)resolved conflicts between gfxmenu and configfile. +2011-09-28 (chenall)fixed partition enumeration problem(important!)(disk_io.c). +2011-09-16 (tinybit)disabled ELCR code for ASUS eee PC 1215B. +2011-09-06 (tinybit)fixed pxe_detect to handle long bootfile name. +2011-08-05 (tinybit)added a map option --e820cycles for Dell Laptop N4030. +2011-07-27 (tinybit)fixed a careless mistake in clean_entry(). +2011-07-21 (tinybit)added a map option --int15nolow. Some changes on handler. +2011-07-10 (tinybit)re-enabled int13/ah=16h floppy detection in int13_handler. +2011-07-27 (tinybit)fixed a careless mistake in clean_entry(). +2011-07-21 (tinybit)added a map option --int15nolow. Some changes on handler. +2011-07-10 (tinybit)re-enabled int13/ah=16h floppy detection in int13_handler. +2011-06-28 (tinybit)fixed a careless mistake in probe_mbr(missing evaluation on C/H/S). fixed a bug in clean_entry() which return the address of a local variable. +2011-06-27 (tinybit)added wee_skip_to as a replacement for skip_to. +2011-06-22 (tinybit)better probe_mbr handling abnormal partition tables. +2011-06-19 (karyonix)int15 fix. (tinybit)remove code to save handler room. +2011-06-10 (tinybit)trust CHS in floppy BPB for GRUB.EXE to run under DOS. +2011-06-09 (tinybit)trust CHS in floppy BPB for GRUB.EXE to boot via NTLDR. +2011-06-04 (namiltd)added exFAT filesystem accessibility. +2011-06-02 (tinybit)better handling loading grub.exe from NTLDR in floppy +2011-05-31 (tinybit)fix chainloading grub.exe from Grub4DOS +2011-05-31 (tinybit)make grub.exe loadable by NTLDR +2011-05-24 (tinybit)make grub.exe chainloadable +2011-05-19 applied Roy's patch(Issue 27: adding PC-DOS/MS-DOS chainloading support). +2011-05-14 (tinybit)use HLT command in key detection +2011-05-09 applied steve6375's patch( Issue 23: Improve grub4dos menu item numbering). +2011-05-07 applied Roy's patch(Issue 25: Add chainloading DELL DRMK DELLBIO.BIN support). +2011-05-06 applied Roy's patch(issue 24: Add ReactOS freeldr chainloading support). +2011-04-29 (tinybit)exclude ntfs short filename.allow space in fb_filename. +2011-03-22 fixed a bug on case sensitivity in filename completion. added a new parameter "case_insensitive" to print_a_completion(). +2011-03-19 fixed a bug on NTFS unicode filename handling. let unicode_to_utf8() return string length after convertion. +2011-03-05 fixed a bug on "cdrom --add-io-ports=...". +2011-03-04 setup a byte at offset 0x1F0 of GRUB.EXE to indicate number of + sectors used by the DOSSTART.S; change boot_drive to -1 so that + external programs can set it up before transfer control to grub4dos; + when grub.exe is loaded as a kernel, the default boot device of + grub.exe will be set to the current root device of current grub4dos. +2011-02-20 prevent IO.SYS from wiping out int32-3F. +2011-02-17 fixed a bug of "0xEA not properly restored" in realmode_run(asm.S). +2011-02-16 fixed a bug on stack checking in realmode_run(asm.S). +2011-02-16 changed real_to_prot(asm.S) and related calls according to WEE. +2011-01-22 fixed "map (hd1) (0xFF)" issue of failed cdrom emulation. +2011-01-18 set "APM BIOS call" as default halt method(see http://reboot.pro/13632/). +2011-01-16 clear preset_menu before enter_cmdline. uncomment the required "default entry number" resolving code(stage2.c). +2011-01-15 trying to fix ELF executable loading problem(issue 14). (confirmed by the reporter). +2011-01-07 applied karyonix's patch (issue 9: fix geometry_tune function) +2011-01-07 applied Roy's patch(supported packed DR-DOS). +2010-12-29 applied Roy's patch(fixed build issue). +2010-12-25 applied Roy's patch(issue 13: fix autoconf and gcc issues in Linux). +2010-12-11 (r73)applied karyonix's patch(issue 11: Wrong data read USB) +2010-11-30 (r69)applied karyonix's patch(support lzma decompression). +2010-12-07 (r68)applied karyonix's patch(issue 9). +2010-11-15 improved ACPI halt code(patched by zw2312914,Thanks for MR.rockrock99 and MR.xianglang reports their different and special hardware response mechanism ). +2010-11-04 finally fixed the ACPI halt failure on AMI netbook(by commenting out ACPI-enable code). +2010-11-03 partially go back to ACPI halt code of 2010-10-29. +2010-11-02 deleted a duplicate code snip which could cause halt failure. +2010-10-31 fixed the find issue. changed ACPI halt code(based on zw2312914). +2010-10-29 improved ACPI halt code(patched by zw2312914). +2010-10-22 fixed AMI netbook gray-screen-of-death problem on halt. +2010-10-19 allow BSD primary partitions to be made active. +2010-10-12 fixed grub.exe issues when booting off Linux/kexec. Only comments added compared to 2010-10-11. +2010-10-11 try to fix grub.exe issues when booting off Linux/kexec(enabled system timer 0 init). +2010-10-09 try to fix grub.exe issues when booting off Linux/kexec(enabled writing ELCR port 4D0/4D1). +2010-10-08 try to fix grub.exe issues when booting off Linux/kexec(enabled coprocessor init by writing port F0/F1). +2010-10-07 try to fix grub.exe issues when booting off Linux/kexec(disabled writing ELCR port 4D0/4D1). +2010-10-04 improved halt with ACPI. try to fix grub.exe issues when booting off Linux/kexec(by sending 100 EOIs to PICs). +2010-09-22 let chainloader recognize isolinux.bin 4.02. +2010-09-19 added support for 800x600 graphics mode(SVGA mode 6A). +2010-08-09 improved CHS probing code of map command on ISO9660 images. +2010-08-04 finally find out the missing-extended-partition problem is caused by a gcc bug, and workarounds are created. +2010-07-25 re-enabled the extended partition with logical partitions in disorder. +2010-07-24 patch by chenall: cat --length=0 will return the size of the compressed file if it is gzipped; fix memory-not-enough problem when mapping a gzipped memory-file with a high compression ratio. +2010-07-23 improved next_pc_slice() to cope with the partition-loop problem. +2010-07-22 try to solve the problem of missing Linux extended partitions in Tab-completion. +2010-07-21 improved next_pc_slice() to cope with the partition-loop problem. +2010-07-20 changed code about pxe_basemem to solve the problem that pxe_unload fail to release memory. +2010-07-12 fixed a bug in guess_dos_versions(for DOS executable grub.exe). +2010-06-21 applied bean's patch(supported new (ud) device created with fbinst1.6). +2010-06-09 applied karyonix's patch(fixes on grub_read and blocklist). +2010-06-07 adjusted probe_int(dosstart.S) to deal with HP DV3-2309TX on its garbage int76 vector. +2010-06-03 adjusted restore_BDA_EBDA(dosstart.S) to deal with HP on its garbage EBDA size byte. +2010-05-31 unhook int13 before hooking it in load_initrd() to avoid duplicate hooking. +2010-05-29 resolved conflict between drives_addr and mmap_addr for multiboot kernels. +2010-05-27 adjusted probe_int(dosstart.S) to deal with DELL on its garbage int05 vector. +2010-05-23 change /main.lst back to /menu.lst, and the original /menu.lst dir to /menu for pxe booting. +2010-05-21 changed initial config filename from /menu.lst to /main.lst for pxe booting. +2010-05-19 fixed problem of mapping small file(<512B) to (rd). +2010-05-15 added --keep-pxe option for grub.exe running under DOS. +2010-05-14 (chenall)fixed ntfs small file(<4KB) access problem. +2010-05-13 added --off option for hiddenmenu. added nokeep subcommand for pxe. let halt return on failure. +2010-05-03 hopefully non-linux kernels could get loaded now. version number changed to 0.4.5b. +2010-03-14 fixed problems in set_bootdev and others. +2010-03-13 fixed a (possible)bug in init_pic(affect grub.exe as a linux kernel format). applied Icecube's patch(curr_part_start). +2010-01-22 applied karyonix's patch(PAE). +2010-01-07 fixed problem of "command-line length limited to 15" on external executables. +2010-01-03 applied karyonix's patch(PAE paging). +2010-01-02 applied karyonix's patch(map improvements). +2009-12-30 fixed the failed find. note that the kernel command could hang while loading non-linux kernels, which is a known bug on newish 0.4.5 versions. +2009-12-28 initial implementation of program execution. fixed a bug causing FAT16 search hang(grldrstart.S). version number changed to 0.4.5a. +2009-12-12 moved up 32-bit grub kernel code at above physical addess 3M. moved down buffer for dd and geometry-tune at 0x20000. moved down raw disk buffer at 0x30000. version number changed to 0.4.5. +2009-12-02 (chenall)fixed a bug in color_func(builtins.c). +2009-12-01 (chenall)fixed a bug which caused dd/write to write onto the wrong sector of the disk(fsys_ntfs.c). +2009-11-29 (chenall)fixed a bug when using (md) to access memory at 2G and above(bios.c). improved memmove64 to support overlap(asm.S). + +2009-11-25 Caution! Reports say build 2009-11-08 and later will write wrong data onto disk when using dd and/or write commands. + +2009-11-13 (chenall)added --replace option for cat. This will write to file. Caution! +2009-11-11 let PXE_BUF use BUFFERADDR. cancelled (hd+) support. added (hd) and (hd-N) support. +2009-11-09 moved FSYS_BUF and some other buffers up at 0x3E0000. (chenall)added (hd+) support for map. +2009-11-08 map memdrive images at memory address above 4GB(only for 64-bit CPU). deleted SETUP, INSTALL and EMBED commands. + +2009-10-16 Turned off int13/AX=4B01/DL=7F cdrom query which may hang on some machines. Commented out DMA code related to running via KEXEC. Implemented 64-bit int13 memdrive block moving code. +2009-06-20(r68) add (ud) device to access space created with fbinst. +2009-06-11 fixed a bug of missing assignment of ES and BX registers in int13_handler(asm.S). +2009-05-13 fixed size-wrap-to-0 infinite loop issue in grub_read()(disk_io.c). +2009-05-07(r67) resolved conflict between int10 stack and BIOS Data Area(grldrstart.S). +2009-05-03 fixed a bug in geometry_tune(grldrstart.S, asm.S). zw2312914 report. +2009-04-30 triple mbr without bpb also bootable as a floppy(grldrstart.S). +2009-04-26 added ending CHS calculation for partition entry in mbr of the triple mbr(bootlace.inc). +2009-04-25 bug fix in dd about device length calculation(builtins.c). +2009-04-24 save and restore GDTR in int13_handler(asm.S). +2009-04-06 accept partitions starting in the mbr track(probe_mbr, builtins.c). +2009-04-05 triple mbr floppy partition (fdX,Y) support for some USB BIOSes(disk_io.c). +2009-04-04 fixed partition table entries in the 2nd and 3rd mbr of the triple mbr(bootlace.inc). +2009-03-31(r66) 0.4.4 official release. +2009-03-28 removed the problematic global variable "i"; reduced one open-file step for configfile on cdrom. +2009-03-27 fixed memory overlap issue on "map --rehook". +2009-03-25 disabled the search for DEFAULT file on cdrom(in cmain, stage2.c). +2009-03-24 fixed problem of WRITE/DD on modifying internal variables. added dd options for user-defined buffer. +2009-03-21 bug fix: turned errorcheck on in run_script and enter_cmdline. +2009-03-20(r65) fixed `configfile not working in menu init command group'. +2009-03-19 trying to fix problem of `configfile running slowly'. +2009-03-18 fixed problem of `geometry-tune too slow' on vmware. +2009-03-17 fixed endless loop problem while running "configfile (md)4+8". +2009-03-15 added new option --sync for geometry command. +2009-03-14 added new option --tune for geometry command. +2009-03-12 rearranged preset-menu items. +2009-03-11 changed geometry-tune code(aim to solve problem on vmware). +2009-03-07 fixed a bug(in grldrstart.S) brought in since 2009-02-05. +2009-03-03 fixed memory overflow issue with (rd). canceled restrictions on some disk write commands. +2009-02-26 fixed geometry-tune issue(reportedly with Virtual PC). +2009-02-21 changes made according to Simon's hiddenmenu patches. +2009-02-20 documented the command line needed for chainloading stage2 of grub legacy. +2009-02-19 now a range of drives can be unmapped. +2009-02-18 possibility to run another menu.lst after gfxmenu. +2009-02-17 fix graphics display issue generated last time. +2009-02-15 improved color command to set color for help text and heading line. +2009-02-13 fix problems booting Linux when there are mappings. +2009-02-11 added ext4 support(in fsys_ext2fs.c). +2009-02-09 isolinux.bin(version 3.73) gets chainloaded again. +2009-02-08 Move some variables to a known address. The read command returns value at addess. +2009-02-03 New initrd syntax loading multiple cpio files for Linux 2.6 kernels. +2009-01-30 Supported per-menu-item help text. +2009-01-28 Fixed printf issue. Allowed non-block files to be written with dd and write. +2009-01-24 New syntax of WRITE support writing string to file. +2009-01-16(r64) Added gfxmenu support +2009-01-09 New commands dd and uuid. fixed a bug in disk emulation. +2008-12-30 Work around for BIOSes lacking INT15/E820 support. +2008-12-29(r63) Now the preset menu holds the highest priority. MSYS/MinGW support. +2008-12-24 Added "detect" sub-command for the "pxe" command. +2008-12-21 Fixed several bootlace bugs when running under DOS. +2008-12-20 bootlace is now able to create triple MBR. +2008-12-19 fixed problem of Disk Read Error on the last track. +2008-12-16 under DOS bootlace can use a parameter file for its command-line arguments. +2008-12-12 added a new option --chs-no-tune for bootlace.com. +2008-12-07 workaround for buggy no-emulation-mode cdrom BIOSes. +2008-12-04 fixed ext3 inode size issue on bootlace. fixed partition table check issue on bootlace. +2008-12-03 cut off the MENU_BUF. removed the TESTLOAD command. added TITLES array. +2008-12-01 added new program badgrub.exe. changed syntax of the find command. +2008-11-19(r62) enable interrupt when DELAY. avoid disabling CPU cache in a20_test(a20.inc). +2008-11-18p added STIs to better respond hardware interrupt(a20.inc, asm.S). +2008-11-18 changed DELAY code(a20.inc). added JMPs in unreal mode for RAM disk emulation(asm.S). +2008-11-15 loosened the check of the first FAT entry(fsys_fat.c). avoid using OUT instruction in DELAY(a20.inc). +2008-11-11(r61) added --ignore-cd option for the find command. +2008-11-08 read the boot file to determin the pxe block size. avoid running pxe_detect for non-pxe booting. +2008-11-02 added a new option --mbr-no-bpb for bootlace.com. +2008-11-01 changed PXE_MIN_BLKSIZE and PXE_MAX_BLKSIZE. allowed FAT cluster size larger than 32K. +2008-10-26 fixed pxe block size issue. +2008-10-21 fixed cylinder issue in int13/ah=8. Fixed stack conflict in bootlace. +2008-10-17 added command line options --serial-number=SN and --restore-mbr to bootlace. +2008-10-12 fixed a bug in fsys_fat.c causing FAT32 mount failure. +2008-10-03 cancelled unnecessary initialisations for the root device. +2008-10-02 improved int15 probing in probe_int. +2008-10-01 before booting GRLDR, give the user a chance to boot previous mbr. +2008-09-30 fixed a big bug in set_bootdev causing extra rawread executed and the geometry messed up. +2008-09-29 fixed a big bug in get_diskinfo causing duplicate geometry calculation for each IO request on floppy. +2008-09-27 fixed a new bug intrduced recently in get_diskinfo. +2008-09-25 fixed an issue of uninitialised current_term in boot.c, causing the failure of the kernel command in graphics mode. +2008-09-24 fixed the issue of "$BITMAP should be non-resident when in attribute list" in fsys_ntfs.c. +2008-09-23 fixed virtual cdrom sector read issue(64K at a time) for a non-mem mapping. +2008-09-21 added a new command "tpm --init". +2008-09-21 fixed memory conflicts between graphics mode and linux kernel. +2008-09-20 fixed a serious problem in grldrstart causing boot failure on FAT. +2008-09-19 fixed a new bug intrduced last in get_diskinfo. +2008-09-15 fixed a problem when different action occurs on a drive between chs and lba. +2008-09-13 fixed a problem of reentering int13 handler from a virtual device on a real cdrom device driven by the builtin cdrom driver. +2008-09-12 fixed an issue of whole cdrom mapping. +2008-09-09 fixed virtual cdrom sector read issue when it is not a mem-mapping. +2008-09-07 title delimitors(or comments) can be used in menu now. +2008-08-27 save stack space occupation by the int13_handler. +2008-08-26 fixed a bug relevant to iso emulation, causing disk read error. +2008-08-24 save stack space occupation by the int13_handler. +2008-08-14 enlarged stage2 stack space. +2008-08-13 fixed again the bug on the root command. +2008-08-12 fixed int5 in probe_int. +2008-08-10 added a new command checkrange; fixed a bug on the root command. +2008-08-08 added builtin stack for int13_handler to avoid stack overflow. +2008-08-06 fixed a suspicious problem on the SCRATCH buffer in get_diskinfo. +2008-08-04 fixed again error handling problem about operator && and ||; added STIs to better respond hardware interrupt. +2008-08-03 fixed error handling problem about operator && and ||; grldr.mbr structure change; other small alterations. +2008-07-28 added STIs to better respond hardware interrupt or to feed watchdog. +2008-07-10(r60) let KEY_UP(KEY_DOWN) loop to the last(first) menu entry. +2008-07-06 added backup_int13 and restore_int13 for a buggy usb bios f24a ver 1.00parttbl on compaq v5235tu(reporter: uleak). turn a20 debug on for memdrives. +2008-06-28 fixed ext3-inode-size issue in grldr boot sector and bootlace.inc. +2008-06-26 fixed int4C-4F in probe_int for Lenovo A6900. +2008-06-24 fixed "256-byte ext3 inode size" issue in fsys_ext2fs.c. +2008-06-23 added command ls. +2008-06-22 disabled safe_int13 code for a buggy usb bios f24a ver 1.00parttbl on compaq v5235tu(reporter: uleak). +2008-06-21 add A20 debug code to help locate a20 failure. +2008-06-18 A20 test begins. Update version number to 0.4.4. +2008-06-12 Let HIDE and UNHIDE respond with a message. +2008-06-10 Let ROOT show correct filesystem info. +2008-06-07 Let MAKEACTIVE and GEOMETRY show active partitions. +2008-06-01 commented out the terminal-switching code in run_menu. +2008-05-31 changed asm.S to avoid clearing out bss for the configfile command. +2008-05-27 initialize saved_videomode/font8x16 for working across configfile. +2008-05-25 fixed int76 in probe_int for a Tongfang. +2008-05-22 fixed an issue of CPU cache wrongly disabled in GRUB.EXE for long. +2008-05-21 fixed an issue of stack-overflow in real_get_cmdline. +2008-05-17 enable the geometry_tune code for test only. +2008-05-14 fix int5 and int8 in probe_int. +2008-05-06 adjustment on probe_int for "pxe keep". +2008-05-03 fixed problem on the commands setup and install. +2008-05-02(r59) add new command checktime. +2008-05-01 fixes on int vector probing, A20 control, configfile, find, etc. +2008-03-14(r58) commented out the geometry-tune code. other fixes. +2008-01-01(r57): mini build support +2007-12-25(r56): created the test branch +2007-12-25(r55) removed commands uppermem, ioprobe, impsprobe and displayapm. +2007-12-14 test 3 of the geometry-tune. +2007-12-10 cleanups on chainloader and errorcheck. +2007-12-05 fixed a bug in ntfs file system module. +2007-12-04 fixes on gzipped (rd) image support. +2007-12-02 int13 emulation workaround for buggy BIOSes('Disk read error'). +2007-11-23 implemented cdrom emulation. +2007-10-15(r54) version 0.4.3 +2007-10-08 implemented chainloading isolinux. +2007-10-04 changed drive number of (md) to 0xffff. +2007-10-02 reduced output messages for "debug off". +2007-09-27 added a new map option of --a20-keep-on. +2007-09-26 a workaround for buggy USB floppy BIOSes(hang at INT13/AH=48h). +2007-08-27(r53) new notation () standing for the current root device. +2007-08-26 new feature of root prefix for support of relative path. +2007-08-25 fixed one more possible issue on A20. +2007-08-24 fixed another possible issue on A20 for memdrives. +2007-08-23 fixed a possible issue on A20 for memdrives. +2007-08-21 expand memdrive size according to the probed CHS. +2007-08-17 test A20 control for memory mapped disks. + + Updated code for hmload. + Fixed a major problem of endless loop on enumeration of partitions. + Fixed an issue in probe_mbr. + Fixed a bug on compressed NTFS volume. + Fixed a problem in probe_int by capturing int10. + +2007-07-25 version 0.4.3pre2 + + Added a new command OUTLINE, and a new option --duce for GRUB.EXE. + Changed PARTNEW syntax. Fixed a problem of OPEN_PARTITION. + The arguments of PARTTYPE have changed to be optional. + + A Fault-Recovery-Handler was imposed on probe_int to fight against + some very serious BIOS bugs(reportedly of DELL machines). + + The DEBUG command syntax was changed for verbosity control. + +2007-06-22 version 0.4.3pre1 + + Fixed two problems on GRUB.EXE: preset_menu and FreeDOS related. + Added a new command `hiddenflag'; Added BPB in GRLDR.MBR; Ignored the + partition-ID check in filesystem modules; other fixes. + + PXE and NTFS fixes. + Fixed a bug in probe_int for GRUB.EXE running in VM86 mode. + Rewrite fsys_ntfs.c + Fixed probe_int and init_pic in GRUB.EXE. Reduced warnings in bios.c. + Added PXE support. + NTFS code update for bootlace. Fixed timing functions. + fix a bug in get_diskinfo; protect the MBR of an in-situ-mapped drive. + Insert-key to debug on startup; polish graphics. NTFS boot record fix. + Bugfixes on STAGE2_SIZE, arrow keys, and handling `&&'/`||' in menu. + Move preset menu to the end/tail of pre_stage2. + Numeric keys to select menu entry; fixed a bug of int13 harddrives. + Code clean-ups on build script and keycode translation. + F11/F12 hotkey handling. + Added builtin NTFS boot sectors into GRLDR. + Added 3 commands is64bit, errnum and errorcheck. + Applied Robert Millan's patch of check_64bit. + Implemented two syntactic operators `&&' and `||'. + Added a new option --in-situ for the map command. + + Fixed an auto-probe-int problem of GRUB.EXE under "EMM386 noems". + + Workaround for buggy VirtualPC on a issue of floppy-emulation-mode + bootable CDROM. + +2006-12-28 version 0.4.2 + + Fixed a bug hidden deeply in memcheck. + Fixed a bug hidden deeply in get_diskinfo. + Fixed a bug in load_image. + GRLDR(as a no-emulation-mode bootable CDROM image) was adapted to + cope with some buggy BIOSes(e.g., VirtualPC). + Added LBA-to-CHS geometry translation(in int13_handler) to simulate + LBA(EBIOS)-enabled drives on CHS-only drives. + Added a new feature of Unconditional Command-line Entrance. + Applied Beverly Brown's patch to load_initrd. + Added two new options to the map command to better serve Win9x. + The default config file search path for GRUB.EXE was changed to + (DOS file) .\menu.lst and then (DOS file) \menu.lst and then + (GRUB file) /menu.lst. + Other bug fixes. + +2006-10-24 version 0.4.2pre11 + + Made a workaround for buggy USB-bootable board QDI 848E. + Made a workaround for buggy 965 board with SATA CDROM connected. + +2006-10-07 version 0.4.2pre10 + + Fixed a problem in GRUB shell which causes failure in grub-install. + Enabled GRUB.EXE to run under FreeDOS with memdrives in use. + Implemented an auto-probe mechanism to support all kinds of DOSes. + +2006-09-19 version 0.4.2pre9 + + Resolved several problems: + 1. (about kexec)Dropped the problematic kexec-tools-1.101-patch. + 2. (about stack)Adjusted code in C files to use less stack. + 3. (about cdrom)Fixed a few bugs in the cdrom driver. + +2006-08-29 version 0.4.2pre8 + + Added a new command `setvbe'. + Dropped the obsolete EZ-BIOS(with signature `AERMH') support. + Fixed a bug in parsing Rock-Ridge extension. + No-emulation-mode Bootable CD can be chainloaded now. + Some work was done to improve remote/diskless boot. + Fixed one more USB/Floppy EBIOS problem(in get_diskinfo). + Merged protected mode stack into real mode stack at 0x2000. + Code clean-up. + +2006-07-31 version 0.4.2pre7 + + Imported ATAPI CDROM driver from Smart Boot Manager. + + Dropped the previous implementation of SCDROM/BIOSCDROM. + + Fixed a USB/Floppy EBIOS problem that could cause media access failure + or even hang the machine when using USB storage devices. + + Fixed a bug in BOOTLACE.COM that had improperly set the LBA indicator + byte(which is at offset 0x02 of the boot sector). + + Fixed a bug in GRLDR that caused failure in finding the associated + MENU.LST config-file(which should be in the same directory as GRLDR). + +2006-06-18 version 0.4.2pre6 + + Dropped the obsolete EZD disk map support. + Fixed several bugs that may hang or slow the qemu virtual machine. + Fixed a bug that causes the pause command not to respond any key-press. + Fixed a bug that causes a command to accidentally fail if in a menu. + Fixed a bug that causes the menu not to work once a cdrom had booted. + +2006-06-05 version 0.4.2pre5 + + Added a static-linked binary executable file GRUB(a Linux utility). + + Fixed a gateA20 problem related to memdrive emulation. + + Boot GRUB.EXE directly off Windows9x/Me(experimental; might hang). + +2006-04-03 version 0.4.2pre4 + + Made GRUB.EXE run under EMM386. + Fixed a bug in splashimage_func(). + Made `ignore error' constant and removed the `--ignore-error' option, + and renamed the option `--seconds=T' to `--wait=T' for savedefault. + The sample menu.lst was modified accordingly. + +2006-03-28 version 0.4.2pre3 + + New syntax for the `default' and `savedefault' commands was + implemented. + + Changed `int' to `unsigned long' for filemax, filepos and fsmax, and + modified all fsys_*.c files in order to open large files(2GB or + longer). + +2006-03-09 version 0.4.2pre2 + + The directory `boot/grub/' was removed from the release tree(GRUB4DOS + does not use the stage files at boot time). The default config file for + GRUB.EXE was changed to (hd0,0)/menu.lst(but preset_menu still locates + (hd0,0)/boot/grub/menu.lst when (hd0,0)/menu.lst does not exist). + + Added DOS command-line options --bypass, --time-out=T and --hot-key=K + for GRUB.EXE. + +2006-02-24 version 0.4.2pre1 + gcc-4 support by VirusCamp. + + Limited support for returning to DOS from GRUB.EXE. + + Implemented a new feature that GRUB.EXE can be used as a DOS device + driver and be started in CONFIG.SYS with a DEVICE line. + + Better IODELAY was made for initialization of PIC to fix the + keyboard-not-responding problem when running through KEXEC. + + Better A20 gate control was made to help fix various problems on the + boot of grub. + +2005-12-14 version 0.4.1 + Fixed a partition enumeration bug(in disk_io.c). Fixed a bug of mapping + partitions to harddrives(in builtins.c). Fixed a bug that causes + failure when `find --set-root' on a CD-ROM device(in builtins.c). Added + a new feature of directly chainloading ntldr and some dos kernels. + +2005-11-14 version 0.4.1pre32 + Fixed more bugs. + +2005-11-02 version 0.4.1pre31 + A few bugs were fixed. + +2005-10-23 version 0.4.1pre30 + A bug about "bootlace.com --floppy" was fixed. + +2005-10-18 version 0.4.1pre29 + Added ram disk device (rd) to access, typically, the initrd image. + Added many new command-line options for bootlace.com to install GRLDR + boot record onto the boot sector of a floppy. A few bugs about + "map --mem" were fixed. Another bug about finding grldr in NTFS was + also fixed. It may cause the machine to hang up when there is no ntfs + boot record in the boot area of the NTFS partition. + +2005-09-25 version 0.4.1pre28 + Commandline option --config-file="FILENAME_OR_RAW_COMMANDS" was added + for GRUB.EXE where GRUB.EXE is treated as a Linux kernel. + Fixed a bug which causes installation failure when BOOTLACE.COM is + used for large disks. + +2005-09-21 version 0.4.1pre27 + Added a patch to the kexec-tools-1.101. Kexec might fail to load + grub.exe without this patch. + +2005-09-14 version 0.4.1pre26 + Fixed a bug for the DOS part of BOOTLACE.COM + +2005-09-11 version 0.4.1pre25 + GRUB4LIN has merged into GRUB.EXE; A new command-line option + --read-only was added for BOOTLACE.COM; A few bug fixes. + +2005-09-01 version 0.4.1pre24 + BOOTLACE.COM runs under both DOS and Linux. + +2005-08-27 version 0.4.1pre23 + Added a utility BOOTLACE.COM for installing grldr bootstrap code to MBR + +2005-07-30 version 0.4.1pre22 + Added bootstrap file GRLDR.MBR for launching grldr from MBR. + +2005-07-24 version 0.4.1pre21 + Added Windows NT 4.0 support(actually fixed a bug reported by Stefan + Baur). For other new features, see README.txt. + +2005-07-20 version 0.4.1pre20 + Added ext2/ext3 boot record code for loading grldr from the beginning + sector of a floppy or a partition. + +2005-05-25 version 0.4.1pre5 + GRUB commands can be embedded into the command line of GRUB.EXE + +2005-05-20 version 0.4.1pre4 + Bug fixes: When the system has no floppies, some operations, + e.g., the find command, will hang the machine. + +2005-05-17 version 0.4.1pre3 + Search for cdrom_drive from drive 0x88 to drive 0xff + +2005-05-11 version 0.4.1pre2 + Our base is now upgraded to GNU GRUB 0.97. + +2005-04-25 version 0.4.1pre + Fixed a bug reported by Gilles van Ruymbeke + : + + The map_func improperly opened the emulation image for 3 times, that + might slow down the load speed heavily, especially for gzipped files. + +2005-04-15 version 0.4.0 + Add /boot/grub/menu.lst in preset menu. This is final. + +2005-04-07 version 0.4.0pre7 + config_file takes precedence over preset_menu. + +2005-04-06 version 0.4.0pre6 + GRLDR can be used with no-emulation-mode bootable CD-ROM. + +2005-03-09 version 0.4.0pre4 + Now preset menu find /menu.lst, no longer support /boot/grub/menu.lst + + Partition images can emulate a partition (hd?,0) with --mem option. + +2005-03-02 version 0.4.0pre3 + GRLDR startup code search all partitions in all harddrives for GRLDR. + + chainloader can boot images larger than 512 bytes, and can load image + to a different location than 0000:7C00. + +2005-02-06 version 0.4.0pre + Switched to GNU GRUB 0.96 + The --mem option of MAP command was added for memdrive emulation. + + Also announced 0.2.0 final. + +2004-10-23 version 0.2.0pre13 + GRUB.EXE runs in DOSBOX. + GRUB4LIN is introduced to boot off LINUX. + Fixed a bug reported by windrv: NTFS check contiguity failure + Rearranged the patches. + +2004-08-31 version 0.2.0pre12 + Fixed a bug reported by szwp: cannot load GRLDR on partition that is + not CHS-accessible. + + Fixed a bug reported by windrv: take too much time to check contiguity + +2004-08-15 version 0.2.0pre11 + Mark the scdrom module as experimental. + +2004-07-13 version 0.2.0pre9 + Merged GNU GRUB 0.95 + + BOOTGRUB removed. Use BOOT.INI line C:\GRLDR="Start GRUB" instead. + + Patches from Gandalf: NTFS and ATAPI CDROM support(also thanks to + Tobias Svensson ) + + Patches from Chris Semler : findroot + +2004-04-12 version 0.2.0pre6 + Now GRUB.EXE can be used in CONFIG.SYS this way: + + shell=C:\some\where\grub.exe --config-file=(hd0,0)/boot/grub/menu.lst + + or + + shell=C:\some\where\grub.exe + + No other changes. + +2004-04-09 version 0.2.0pre5 + Now BOOTGRUB contains 4 sectors, i.e., 2048 bytes. Optionally, you may + copy the 2nd, 3rd and 4th sectors of BOOTGRUB to the three sectors that + immediately follow the MBR. Also Optionally, you may copy 446 bytes + from the very beginning of BOOTGRUB to the very beginning of MBR. In + this way, the GRLDR can be started out of MBR, without the presence of + NTLDR. + + CAUTION: Don't copy 512 bytes to MBR. The partition table should not + be overwritten. The partition table is in the end of MBR. If you make + a mistake, you will lose your whole system!! + +2004-02-18 version 0.2.0pre4 + Arbitrary-size floppy and hard disk emulation finally implemented. + GRUB for NTLDR is included. See README file. + Splash image version is available in the SPLASH directory. + +2003-09-23 version 0.1.4 -- development unstable release + Unfortunately 0.1.3 has an ugly bug. Fixed. + +2003-09-01 version 0.1.3 -- development unstable release + Rewrite the code for guessing FreeDOS int vectors. Hopefully it works + for all the future versions of FreeDOS :-) + +2003-08-25 version 0.1.2 -- development unstable release + Fixed a small bug that affects the read of the emulated floppy sectors. + + Added some files (including the menu.lst file) for installing GRUB to + MBR from DOS. Usage: + + Copy the boot directory to C:\ ; You must do this on Windows, NOT dos, + because DOS cannot deal with the long filenames. + + Run grub to access the menu.lst file in C:\boot\grub ; Of cause on DOS. + + When menu occurs, select a proper menu item for installing GRUB to MBR. + + If the menu does not appear, you should get the "grub>" prompt. At the + prompt, type the following commands: + + grub> configfile (hd0,1)/boot/grub/menu.lst + grub> configfile (hd0,2)/boot/grub/menu.lst + grub> configfile (hd0,3)/boot/grub/menu.lst + + Then, the menu should occur. + +2003-06-29 version 0.1.0.1 -- development unstable release + Do some cleanups on 0.1.0, no important changes. + BTW, it seems that the 0.1.0 is quite stable :-) + +2003-06-29 version 0.0.8 + Restore mapped int13 to the unmapped state while grub is invoked + after a previously performed drive map operation. + +2003-05-29 version 0.1.0 -- development unstable release + Floppy 1.44M drive emulation are OK. GOOD!!!! Usage: + + # boot Windows 98 SE + map (hd1,0)/dos98se.img (fd0) + chainloader (hd1,0)/dos98se.img + rootnoverify (fd0) + boot + + Another example: + + # boot Mandrake hard disk installer + map (hd0,0)/hd.img (fd0) + chainloader (hd0,0)/hd.img + rootnoverify (fd0) + boot + + Note that the floppy image file must size 1440KB, i.e., 1474560 bytes. + _AND_ also, the file must consist of one contiguous disk area, no + holes, no fragments. Use GRUB's blocklist command to determine whether + or not an image file is contiguous. It is known that a 1440KB-file is + always non-contiguous if it resides in an ext2 filesystem. But you may + get a 1440KB contiguous file with an FAT32 partition(vfat filesystem). + + Floppy(and hard disk) with arbitrary sizes will be emulated in the + future. + +2003-05-06 version 0.0.7 + + Fixed a huge bug!! Read the following carefully! + + Using the drive map command(just as many distributions currently do) + + map TO_DRIVE FROM_DRIVE + + to boot your system could seriously _damage_ your hard disk data, + + totally and thoroughly!! This bug has just been fixed in 0.0.7 :-) + + This bug is not specific to grub_for_dos, but caused by the original + + grub-0.93 release. So do _NOT_ use map command any more until my fix is + + accepted by GRUB maintainers or a similar fix is made by other + + people. For now, do _NOT_ use map command in any kind of Linux + + distributions such as Red Hat or Mandrake or any others. + + Because GRUB_FOR_DOS-0.0.7 already applied the fix, so it + + should be safe to use the map command. + + Another small bug was also fixed in grub_for_dos-0.0.7 :-) + +2003-04-29 version 0.0.6 + Runs also on MS-DOS 3.30. No other changes. + +2003-04-26 version 0.0.5 + Runs on MS-DOS 4.0, 5.0, 6.0, 6.20, 6.21, 6.22, 7.0, 7.10, 8.0 and + FreeDOS(build 2029). GOOD!! + +2003-04-20 version 0.0.4 + Running on FreeDOS(build 2029), GOOD!! (But currently GRUB.EXE only + has limited FreeDOS support, maybe unstable.) + + Add a "Guess DOS Version" feature. The program now exit to DOS when + guess failed. The previous versions of GRUB.EXE always hang when + running on an unsupported DOS version. + +2003-04-13 version 0.0.3 + The option "--config-file=FILE" was added. + +2003-04-11 version 0.0.2 + Also runs on MS-DOS 8.0 (i.e., the DOS with WinMe/2000/XP), GOOD!! + The GRUB.PIF file included, so GRUB.EXE can be started from Windows 9x + +2003-04-10 version 0.0.1 + Runs on MS-DOS 7.10(Win98) diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_chenall.txt b/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_chenall.txt new file mode 100644 index 0000000..cc498a4 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/ChangeLog_chenall.txt @@ -0,0 +1,645 @@ +2011-12-11 + 1.可以使用map --status=n来获取已经映射磁盘的状态。 use map --status=n to get status of hooked drive n. + 返回以下两个变量信息(return) + %?%=Start_Sector + %@retval%=Sector_Count + 如果该磁盘不存在返回0. + +2011-12-08 + 1.支持菜单自动编号(使用动态菜单时比较有用)。 Support menu AutoNumber.this is useful when used iftitle. + usage: + write 0x8274 0x2001 + or + write 0x8274 0x2D01 + 0x20(space) or 0x2d ('-') is the delimiter char in ascii code. + 更多的用法介绍: + http://bbs.wuyou.com/viewthread.php?tid=180142&page=193#pid2351695 + +2011-12-06 + 1.bug修正。 + 2.使用调试模式启动时可以显示条件菜单执行的命令。 + +2011-12-05 + 1.添加条件菜单功能 added iftitle. + 语法: iftitle [] Actual Title displayed\nOptional help line + 只要条件不成立该菜单项目无效。 + eg.如果(hd0,0)上有bootmgr文件才会显示第一个菜单,如果有NTLDR文件才会显示第二个菜单 + + iftitle [if exist (hd0,0)/bootmgr] Boot to NT6.X from (hd0,0) + chainloader (hd0,0)/bootmgr + + iftitle [if exist (hd0,0)/ntldr] Boot to NT5.X from (hd0,0) + chainloader (hd0,0)/ntldr + +2011-12-01 + 1.BUG修正。 + BUG fixed. + 2.添加使用INT18启动功能。 + Supported boot via INT 18. + 用法(usage): + boot -1 + or + boot --int18 + 3.一些代码精简 + +2011-11-29 + 1.BUG修正。 + 2.新的color命令语法。 + color color_state=color [..] + 其中color_state字符串可以如下。 + normal 未选中菜单 + highlight 选中菜单 + helptext 菜单帮助信息 + heading 菜单头(GRUB4DOS信息) + standard 默认色(控制台) + border 菜单边框VBE模式下有效果 + 3.新的setcolor/setcolorstate函数 + +2011-11-27 + 1.修正fontfile命令在splashimage后面时导至背景图颜色错误的问题. + 2.VGA模式(0x12/0x6a)没有使用splashimage命令时可以指定字体颜色和console模式一样. + +2011-11-22 + 1.新的COLOR命令允许设置控制台默认字体颜色和背景色(只限于文本模式或VBE模式) + 方法: 直接使用只带一个参数的color命令即可. + 注: 在命令行或批处理脚本中执行有效. + +2011-11-19 + 1.cursor_state bit 0=1 show cursor,bit 1=1 show splashimage. + use setcursor(n) to change if need,can change from commandline e.g. + call Fn.70 0 disable cursor and splashimage. + 2.清理部份无用代码. + +2011-11-18 + 1.支持BMP背景图片,只限于VBE模式 supported splashimage with BMP format(VBE mode only). + 2.使用BMP图片时,如果非处于VBE模式,则尝试自动匹配图片分辨率. + +2011-11-03 + 1.修正一个map的bug. bug fixed in map_func. + 相关贴子: + http://bbs.wuyou.com/viewthread.php?tid=201887 + http://bbs.wuyou.com/viewthread.php?tid=201647 + 2.忽略ISO9660文件系统上文件名的大小写. Make name comparisoncase-insensitive on iso9660. + 可以使用以下命令禁用该功能. You can use below command to disable this feature. + write 0x4CA24 0 + 3.cat命令添加--locatei参数, added --locatei option for cat. + 查找时忽略大小写 ignore case locate. + eg. + cat --locatei=Test (md)0x300+1 + +2011-10-07 + 1.新增?_BOOT变量,访问启动GRUB4DOS的Boot_drive + add new Variable ?_BOOT to access grub4dos Boot_drive. + 2.为了节省代码GRUB4DOS内部不再处理外部命令WENV的兼容性(WENV tuxw版) + 解决办法如下: + 如果需要使用该版本WENV则自己在菜单或批处理中添加以下命令 + write --offset=0x1f8 (md)0x228+1 ?_WENV\0 + 3.uuid 命令对于uuid字符的判断不区分大小写。 + +2011-10-02 + 1.取消对fb启动盘的修正,恢复原样. + 2.其它批处理相关代码微调. + +2011-09-28 + 1.修正访问磁盘分区的BUG(disk_io.c),感谢Yonsm的报告和测试. + fixed a bug in disk_io.c + http://bbs.wuyou.com/viewthread.php?tid=200520&extra=page%3D1 + +2011-09-13 + 1.修正insmod的一个bug(不能直接insmod默认路径下的文件) + fixed a bug in insmod_func. + +2011-09-05 + 1.insmod支持指定名字,比如insmod fat.gz fat. + Support specified name when insmod a module. + +2011-09-02 + 1.fixed a bug in setloca/endlocal. +2011-08-25 + 1.修正cat命令的一个BUG,使用cat --locate-align参数时会出错. + fixed a bug in cat_func. +2011-08-23 + 1.添加echo/cat命令的帮助信息.(issue: 38,40) + add help text for command echo/cat. + 2.修复help --all显示的问题(issue: 39) + fixed "help --all" issue. +2011-08-09 + 1.批处理call/gotoBUG修复. + 2.新的call可以直接call一个命令. + +2011-08-08 + 1.一些代码微调. + 2.修正Ctrl+C强制中止批处理脚本,有时会失败的问题(call和&&,||连用时可能会失败) + 3.使用管道符"|"时超过0xC00长度的之符将被丢弃. + +2011-08-01 + 1.外部命令调用修改,优先使用当前目录下的命令(如果存在的话). + 2.修复在批处理中使用exit命令退出批处理,导致批处理返回值为0的问题. + +2011-07-30 + 1.批处理执行时允许使用Ctrl+C强制中断运行. + +2011-07-19 + 1.内置变量?_WENV=?_UUID=? + 注:1.将来会取消?_UUID,为了保持兼容性,暂时先放一段时间. + 请使用%?%或%?_WENV%代替%?_UUID%来获取UUID. + 2.%?%变量可以获取命令返回的字符串信息. + 目前可用的信息有两个.uuid dev(返回指定设备的UUID字符串),cat --locate= (返回最后一个找到的位置) + 2.@random算法修改. + + +2011-07-13 + 1.在执行cmain之前初始化变量内存空间。 + +2011-07-12 + 1.执行clear命令时同时设置count_lines为0。 + 2.内置变量增加@retval,其实就是之前的0x4cb00 + 3.增加setlocal @和endlocal @用法。 + setlocal @可以在批处理中使用,把当前的环境保存起来 + 除非使用endlocal @否则setlocal @之后的设置会一直保留(批处理退出也不影响). + 注:1.在批处理中出现setlocal @则在批处理中setlocal @之前的setlocal命令会全部失效。 + 所以setlocal @有必要的使用的话一般要放在批处理最前面。 + 2.setlocal @后面如果还有出现setlocal,则setlocal之后的设置不会保留. + +2011-07-11 + 1.添加SETLOCAL和ENDLOCAL命令,和WINDOWS下的批处理用法一样。 + +2011-07-05 + 1.尝试解决%~d0,%~f0路径提取的问题,现在%~f0应该可以提取到正确的路径。 + 2.解决if命令输出转向失败的问题。 + 3.其它代码调整。 + +2011-05-27 + 1.优化PXE_DIR代码。 + 2.其它微调。 + +2011-05-25@176 + 1.调整cat命令的查找字符串代码。 + 2.修改批处理的调试模式开启方法(改为debug 3才会进入调试模式) + 3.消除一些编译时的警告信息。 + +2011-05-23@174 + 1.修正一个TFTP相对路径的问题,感谢2011exuejiao@wuyou. + 2.在批处理中可以使用debug 3临时开启debug模式。 + +2011-04-30@159 + 1.取消前面版本对批处理参数的调整.恢复到04-16版. + 2.修正一个BUG.(函数print_root_device). + 3.批处理参数新增%~f 文件全路径,%~z文件大小. + 4.现在批处理脚本可以使用使用errorcheck命令控制是否检测错误(默认错误就退出). + +2011-04-29@157 + 1.find 命令不再查找(hdx)设备. + 2.删除@root变量的前导空格. + 3.ls命令新增dev参数,用于显示设备列表. + 4.批处理代码调整,对于(bd)设备%~d0会使用实际的设备. + +2011-04-25@156 + 1.新增两个内置变量@root,@path. + @root 当前的root. + @path 当前默认外部命令查找路径. + 2.修正一个可能导致程序出错的问题.(使用到了临时变量的内存). + 3.批处理代码功能增强. + +2011-04-16@153 + 1.md5crypt 支持参数。后面直接跟一个字符串会直接计算这个字符串的md5。 + 2.菜单支持以变量开头的命令。 + +2011-03-30@151 + 1.LZMA格式解压时暂时禁止显示进度(因为显示进度时解压大文件会失败)。 + 2.添加内置变量?_UUID(使用uuid命令可以把获取到的磁盘uuid保存到变量中). + +2011-03-29@150 + 1.insmod *.mod添加了检测模块文件头是否为GRUBEXEC签名. + 注:目前还是兼容旧版本的MOD模块,一段时间后会取消,请使用新的MAKEMOD重新制作模块。 + + 2.对批处理路径和文件名的空格进行自动处理。空格前面自动加转义符"\" + 注:使用p,n,x参数时有效。即%~1时不会处理,但%~p1时会处理。 + +2011-03-26@150 + 1.使用kernel (rd)+1启动时,默认的启动设备改为当前root. + +2011-03-25@149 + 1.修改cat命令替换时显示的信息 + cat --locate=S -replace=R 除非debug on否则不显示信息. + 2.批处理参数新增%*代表所有参数%1 %2 %3 .... + +2011-03-24 + 1.set /p功能增强(可能会和之前的版本不兼容),新增参数set /p:N + 主要变动: + 1).如果未输入不会清除原来的变量.(之前的版本会清除). + 2).新增支持默认时间没有输入自动退出. + set /p:N variable=prompt + 如果在N秒之内没有任何输入,则返回,并且不改变variable的值. + +2011-03-23 + 1.为了方便使用,修改shift命令为内部命令.并且shift支持参数 + shift n 或 shift /n + 具体用法,可以参考CMD/linux下的shift命令帮助. + +2011-02-19 + 1.修复kernel加载grub2 loader的问题. + fixed a bug when load multiboot-image(boot.c). + 2.现在可以运行16位程序,和wee的机制一样(直接移植了wee里面的代码) + +2011-02-15 + 1.添加realmode_run函数 + 2.修改GPT分区检测代码,更加严格的检测。 + +2011-02-12 + 1.增加GPT分区检测,检测不通过就使用MBR分区。 + 2.一些代码微调。 + +2011-02-10 + 1.清理UTF8转换UNICODE的代码,不再需要(请同时更新UNIFONT). + 2.修复变量字符串截取BUG.Fixed Bug in envi_cmd func.(thanks sratlf@wuyou report). + http://bbs.wuyou.com/viewthread.php?tid=180142&page=52#pid2154655 + + 注意:从2011-02-10开始,必须使用最新版的UNIFONT才可以正常显示UNICODE字符. + + Note: You must also update unifont to the latest version.new unifont can show unicode char anywhere. + Download the latest version of unifont: + http://code.google.com/p/grubutils/downloads/list + +2011-01-28 + 1.支持读取GPT分区表。 + 为了区别MBR分区表和方便编程,所有的GPT分区类型全部使用0xEE表示。 + + 2.修正一个bug,现在可以访问大于1T的硬盘.但还不能访问超过2T的内容。 + +2011-01-26 + 1.修复run_line的一个BUG,会导致返回值为假。 + 2.添加IF/SET命令的帮助信息。 + 3.IF命令增加以下语法,判读一个变量或文件是否存在。 + if exist variable|filename command. + 4.控制pause的输出,debug小于0时不显示倒计时。debug小于1时不显示按键码. + +2011-01-22 + 1.set /A 参数使用16进制数保存变量,set /a 十进制数保存变量。 + 2.修复goto的一个bug. + 3.修复重定向操作符的bug. + +2011-01-19 + 1.set命令不再接受回车换行符。 + 2.修复获取批处理参数bug. + 3.修复fb文件系统bug(可能会导致访问文件出错)。 + +2011-01-14 + 1.set命令增强.添加了/l,/u参数 + set /l a=Abcd + 把Abcd转为小写./u是转换大写。 + +2011-01-13 + 1.修复utf8菜单编码自动检测的BUG。 + +2011-01-10 + 1.修复SET命令的bug,添加/p参数 + 2.修复启动linux时内存冲突的bug. + +2011-01-09 + 1.菜单支持变量。 + 2.支持变量截取(和CMD的方法一样),不支持替换。 + +2011-01-08 + 1.重写grub_sprintf函数,支持简易的宽度和精度控制符(m.n或*.*)。 + +2011-01-07 + 1.SET命令添加一个参数/a可以把=后面的计算结果赋值给变量. + 2.新的safe_parse_maxint函数支持一元运算符。"~!-" + +2011-01-06 + 1.修改CAT命令的显示。现在的cat /filen.ext碰到字符结束符'\0'就停止。 + 2.批处理内部添加一个命令shift(只能在批处理中使用). + 3.skip_to函数现在会可以跳过(‘\r’和‘\n’)。 + 4.set *将清除所有变量。 + +2011-01-05 + 1.修正run_line的一个逻辑错误。 + 2.外部命令command默认的目录改为(bd)/BOOT/GRUB/ +2011-01-03 + 1.pager命令即实生效。 + 2.添加简易的if判断命令类似的MSDOS.目前支持的判断如下: + added a new command if. + if [/I] [NOT] STRING1==STRING2 [COMMAND] + 注:判断符号==前后不允许有空格或制表符否则比较会失败。 + 2.添加SET命令可以设置、修改、删除变量。 + added a new command set to modify the variable. + 3.从现在开始支持变量。用法和MS-DOS一样。 + From now supports variable. + 注:使用了和WENV同样的方案。所以这个功能可以看成是简化版的WENV + +2011-01-02 + 1.pause命令添加一个参数--test-key,可以显示按键扫描码。 + added --test-key option for pause to display the key scan code. + 2.grub_sprintf函数支持字符串精度控制符。 + + +2011-01-01 + 1.修复find命令的bug。当然使用条件查询时可能会出错。 + 2.批处理参数修改,为了方便使用,%9改成剩余的所有参数。 + 比如参数: 1 2 3 4 5 6 7 8 9 0 a b c + 那%9就是9 0 a b c. + +2010-12-31 + 1.pause命令增强,增加了显示按键码的功能。 + 2.hiddenmenu命令增强。增加一个--chkpass参数 + 具体用法请参考: README_GRUB4DOS.TXT对应的更新 + +2010-12-28 + 1.一些BUG修复. + 2.PAUSE命令增加倒计时显示. + 3.fsys_fb.sys代码微调. + +2010-12-25 + 1.现在delmod也是一个内部命令. + 2.重写insmod/delmod相关的代码.把加载的模块固定在内存18MB开始的位置. + +2010-12-21 + 1.从command_func中分离出insmod作为一个内部命令存在. + 现在允许insmod加载一个命令合集.(扩展名.mod) + 例子: + insmod grub4dos.mod + 这个命令合集使用MAKEMOD程序生成. + +2010-12-18 + 1.代码调整. + cat添加一个参数--number=N 在查找替换的时候指定查找次数. +2010-12-17 + 1.fixed a bug in checkrange_func. + +2010-12-16 + 1.修正使用批处理运行时可能会出现ERROR 25的错误. + 2.重写批处理运行函数. + +2010-12-15 + 1.还原2010-12-10对0000:82A4的改变. + 2.为了方便使用当使用fbinst启动时有如下调整 + boot_drive (bd) 为FB_DRIVE(ud) + 默认root(saved_drive) 为可见分区. + 3.为了减小压缩包的大小,改成用7z压缩发布. + +2010-12-14 + 1.完善对ud(fbinst创建的分区)支持.现在不需要从fbinst启动也可以随意访问fbinst创建的分区. + 2.允许在批处理中执行的外部命令调用goto/call标签. + +2010-12-12 + 1.批处理添加exit命令.直接退出批处理.如果后面有数值则设置为errnum. + 如exit 1,退出,并返回一个错误的值. + 2.一些代码优化调整. + 3.修改pause命令,现在的pause直接返回按键的ascii码值. + +2010-12-11 + 1.完善批处理脚本参数的支持(同CMD下的批处理用法一样). + 2.可以在菜单中使用goto命令(即跳到某个菜单项目). + 3.delmod 添加参数-l用于显示已经加载的模块.如果-l后面还有参数则是判断该模块是否加载. + +2010-12-10 + 1.改变了以下内存地址的定义(和之前的版本相反) + 0000:82A4 4 (DWORD) no_decompression (no auto gunzip) + 改成了 + 0000:82A4 4 (DWORD) do_decompression (do auto gunzip) + 2.0x8284的值的bit2如果为1则显示解压进度,否则不显示,默认不显示. + 3.完善了goto/call的功能 + +2010-12-09 + 1.批处理脚本支持标签(类拟BAT批处理). + support goto/call and :label in batch script. + CALL :label arguments + goto label + +2010-12-07 + 1.添加两个命令用于加载外部命令到内存中,加快运行速度. + insmod path-to-program + delmod program + +2010-12-06 + 1.批处理脚本支持参数%0 - %9同cmd批处理用法一样。%~n 可以去掉前后的引号 + +2010-11-24 + 1.修正一个skip_to函数的bug。 + fixed a bug in skip_to func,thanks tuxw. + +2010-11-21 + 1.解决在(ud)上使用自动补全功能问题. + http://bbs.znpc.net/viewthread.php?tid=5976 + +2010-11-19 supported pxe_dir list. + 1.添加PXE(pd)文件列表的支持.TFTP ROOT 上的每个目录下都需要有dir.txt才支持. + 可以使用以下命令生成dir.txt文件 + for /r %i in (.) do (dir /a/b %i >%i\dir.txt) + +2010-11-18 + 1.Fixed a bug in batch file,thanks Mr.zhaohj. + http://bbs.wuyou.com/viewthread.php?tid=180142&page=9#pid2087407 + 2.Add a new variable at 0000:8278 for grub4dos version by date. + e.g. read 0x8278 return 0x132B7FE (20101118) + 3.Fixed a bug in find_func,thanks Mr.pseudo. +2010-11-17 + 1.重写command_func函数大部份代码。 + 为了方便外命命令的编写,修改主函数调用为以下格式。 + int main (char *arg, int flags) + 新的版本可以直接使用arg和flags参数,不需要再进行计算了。 + +2010-11-16 + 1.改进malloc/free函数。 + 2.允许执行多个外部命令(之前只允许一个),现在可以在外部命令里面调用其它外部命令。 + 外部命令调用方法使用builtin_cmd函数:builtin_cmd(char *cmd,char *arg,chat *flags); + builtin_cmd(NULL,Command and parameters,flags); + +2010-11-15 + 1.内置echo命令自动回车符改为"\r\n" + 2.添加malloc/free函数. + +2010-11-04 + 1.重写run_line(执行一行命令函数)。 + 支持操作符连用。例: +  echo a | echo b | echo c | echo + echo abcd > (md)0x300+1 && echo def + 2.支持新的操作符">>"和">"一样,但这个会附加(附加在输出文件中的第一个字符串结束符'\0'后面) +  注:目前这个操作符不会改变文件大小。 + + 2.内置ECHO函数添加两个参数(默认回车不转义) + -n 不自动添加回车符 +     -e 允许转义符 +2010-10-28 + 1.some bug fixed. + 2.find支持查找使用cdrom --init生成的光驱(只找第一个) + +2010-10-27 + 1.修改printf函数,支持显示"%",和C语言的语法一样,使用"%%"来显示一个"%" + 2.重写find的查询代码. + 3.find新增参数--devices=[DEVICES],指定要查找的设备. + + 说明:DEVICES可以是以下字符的组合: + u,p,n,h,c,f -->分别对应 ud,pd,nd,hd,cd,fd, + + 例子:--devices=hcf //只查找hd,cd,fd,从hd开始. + 注:优先current root.然后再按上面的顺序.(current root必须在列表中,否则跳过) + + 可以使用这个参数来重新设定查找顺序,默认(find order):ud->pd->nd->hd->cd->fd + + 4.保留--ignore-cd和--ignore-floppies参数(会自动转换). + +2010-10-26 + 1.find支持(fdx,y)的格式. + 2.优先查找当前root. +2010-10-03 + 1.使用操作符"|"时默认自动添加空格,并解决使用"|"时可能导致死机或重启的问题。 + +2010-09-30 + 1.修正操作符号!失效的问题。 + 2.恢复内置菜单的大写MENU.LST为小写(保持兼容性)。 + 3.内置echo命令。 + 用法: + echo [-P:[-]XX[-]YY] MESSAGE + XX: Line number. + YY: Column number. + + XXYY指定后面MESSAGE要显示的位置。 + XX指定行号,YY指定列号。前导“-”,即倒数. + +2010-09-25 + 1.修正calc计算的一个逻辑错误。 + 2.使用fbinst启动默认root设为ud + set boot_drive to fb_drive(ud) if boot from fbinst. + 3.添加一个新的命令initscript,只能用于菜单中。 + initscript用于初始化菜单,每次返回菜单时在显示完菜单后执行。 + 有时候会需要这样的功能,比如执行某个菜单失败后返回菜单时重新执行一次初始化。 + initscript /initscript.g4d + +2010-09-25 + 1.简易计算器调整.如果没有"="则不保存计算结果,但++和--除外. + 例子: + calc *0x60000 + 4 不保存计算结果,所以内存指向*0x60000的值不会被改变. + calc *0x60000++ 会保存计算结果到*0x60000中. + calc *0x60000 = 1+2 同上. + 2.如果当前已经是图形模式允许graphicsmode直接切换,而不用经过terminal console中转. + +2010-09-16 + 1.修正一个产生Error 27的错误。 + +2010-09-06 + 1.添加操作符号"|" ">",输出重定向(有点类似DOS) + Implemented two syntactic operators "|" and ">".Like Dos Output redirection. + note: 1.use with "&&" and "||" ,the "|" and ">" must be at last. + 2."|" and ">" can not use at same time. + 例子: + 1. pause abcd | pause efg + output: efgabcd + 2. pause 0x60000 | read #There is a space after the read. + run read 0x60000 + 3.help > (hd0,0)/help.txt or help > (md)0x3000+2 + help.txt must already exist,grub4dos cann't create file or change file size. +2010-09-05 + 1.修改TAB的显示方式,现在使用8个字节对齐显示。 + +2010-08-10 + 1.fixed a bug in disk_io.c,it may return error 25 when set root to a cd drive. + 修正一个BUG,当设置root为cd设备时可能会提示Error 25的错误. + 2.加快colinux下源码在cofs设备时编译的速度. + +2010-06-21 + 1.打上支持新版FB的补丁 + 来源:http://www.burgloader.com/bbs/index.php?topic=37.30 +2010-05-02 + 1.PXE启动时首先尝试加载root目录下的menu.lst。 + +2010-04-17 + 1.命令行自动完成调整.现在可以直接输入/+TAB显示当前目录下的文件或(hd0,0)/+TAB显示(hd0,0)/下面的文件列表 + 以前的版本必需要像以下命令才可以。 + root /+TAB + 2.get_cmdline函数调整,以方便外部命令直接调用。 + +2010-03-29 + 1.外部命令执行过程调整。 + + 例子:默认path (bd)/grub/ + echo abcd ## 优先使用(bd)/grub/echo 文件,如果没有再找 /echo 文件 + /echo abcd ## 只查找/echo 文件。 + (fd0)/echo abcd ## 只找 (fd0)/echo abcd 文件。 + 2.find 命令添加一个 --ignore-oem 参数。 + http://code.google.com/p/grub4dos-ireneuszp/ + +2010-03-10 + 1.边框位置自动调整。 + +2010-03-09 + 1.注释掉karyonix 4G GZIP MAP的部份代码。 + 2.添加UNIFONT外部命令,可以加载UNIFONT字库。当菜单文件是UTF8格式时可以显示多国语言。 + Support multi-language menu with UNIFONT. + +2010-03-01 + 1.打上了karyonix的4G map 补丁 + http://bbs.znpc.net/viewthread.php?tid=5844 + http://www.boot-land.net/forums/index.php?s=&showtopic=10096&view=findpost&p=91378 + + 2.添加fontfile外部命令. + 3.添加menuset外部命令. + +2010-02-09 + 1.重写cmp部份代码(注:比较时可能会比较慢,因为只使用了1MB的缓存,之前的版本是完全缓存). + 顺便添加了新参数 --skip= + 可以指定在比较时跳过几个字节,用于cmp --hex时方便查看差异. + +2010-02-05 + 1.添加calc简单计算器功能. + calc [*INTEGER=] [*]INTEGER OPERATOR [[*]INTEGER] + + 具体使用方法参考这里的外部命令calc的用法,是一样的,只是内置了. + http://www.chenall.com/blog/2010/02/grub4dos_calc.html + + +2010-01-13 + 修改设置默认可执行文件搜索路径参数为 + --set-path=PATH + 例子 + command --set-path=(bd)/grub/ + +2010-01-09 + 1.为command参数添加一个参数--set-root用于设置默认可执行文件的搜索路径。 + add option --set-root for command + sets a search PATH for executable files,default is (bd)/grub + +2009-12-03 g@chenall.cn + 1.修改了cat --hex代码,现在cat --hex会显示ascii>127的字符。 + 2.修改了cmp --hex代码,现在cmp --hex后面显示的字符同样可以显示中文。 + 并且添加了颜色控制,不同的地方使用了菜单的高亮色显示。 + +2009-12-01 g@chenall.cn + 1.同步源码到2009-12-01版(修正了NTFS上DD或WRITE的问题) + 2.修改调整了cat --replace,当使用--replace=*addr时允许使用--hex来指定读取长度。具体 + http://bbs.znpc.net/viewthread.php?tid=5784&page=10&fromuid=29#pid42939 + +2009-11-29 g@chenall.cn + 1.调整了chainloader功能,如果chainloader (rd)+1,并且没有指定edx设备,那将把当前设备设为EDX。 + Changed chainloader_func,if use chainloader (rd)+1 then will set current_root to EDX + 从光盘上的BOOTMGR启动硬盘上的VISTA/WIN7系统。 + Boot VISTA/WIN7 from cdrom or any other device + chainloader (cd)/BOOTMGR + rootnoverify (hd0,0) + dd if=(hd0,0)+1 of=(md)0x3E+1 + 现在可以直接使用以下方法来启动; You can now use the following commands.. + map --mem=0xF000 /BOOTMGR + find --set-root --ignore-cd --ignore-floppies /BOOT/BCD + chainloader (rd)+1 + http://bbs.znpc.net/viewthread.php?tid=5784&page=7&fromuid=29#pid42684 + Tips:about EDX,please read README_GRUB4DOS.txt + 2.源码同步到官方2009-11-29版。 +2009-11-28 g@chenall.cn + 1.修正了当内存>2G时访问可能会出错的问题. + fixed a bug when access memory>2G problems. + eg. + cat --hex (md)0x40002F+1 + map --mem (md)0x600000+0x19020 +2009-11-26 g@chenall.cn + 1.修改cmp_func代码,使用之使用十六进制显示差异偏移(为了方便对比使用)。 + change cmp_func to show Differ at the offset with HEX + 2.为cmp添加了一个参数--hex(直接显示十六进制) + add --hex option for cmp +2009-11-24 g@chenall.cn + 1.添加(bd)设备,即启动设备,注:使用configfile命令会改变启动设备。 + added (bd) support.(bd):the boot drive. note:use configfile to change boot drive + eg. boot from (hd0,0) + now boot drive is (hd0,0) + configfile (hd0,1)/menu.lst + now boot drive is (hd0,1) \ No newline at end of file diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS.txt b/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS.txt new file mode 100644 index 0000000..03b13d4 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS.txt @@ -0,0 +1,4138 @@ +Please refer to http://grub4dos.sourceforge.net/wiki/ for DOCs on GRUB4DOS. + +Main project page: http://grub4dos-chenall.googlecode.com/ + +Download site: http://code.google.com/p/grub4dos-chenall/downloads/list + +Unused: +Download site: http://grub4dos.sourceforge.net/ +Download site: http://sarovar.org/projects/grub4dos/ +Download site: http://grub4dos.nufans.net/ +Download site: http://sites.google.com/site/grubdos/ +Download site: ftp://grub4dos.sarovar.org/pub/grub4dos/ + +Get the latest source code by using anonymous svn in this way: + + svn co http://grub4dos-chenall.googlecode.com/svn/trunk/ grub4dos + +or in this way: + + git clone git://github.com/chenall/GRUB4DOS.git + +View the source code online with your web browser at: + + http://code.google.com/p/grub4dos-chenall/source/browse/ + +GRUB4DOS mailing list: + + grub4dos-devel@gna.org + +Subscription page: + + https://mail.gna.org/listinfo/grub4dos-devel/ + +Discussion forum(Official technical support site): + + Chinese: + http://bbs.wuyou.com/forumdisplay.php?fid=60 + http://bbs.znpc.net/forumdisplay.php?fid=4 + English: + http://reboot.pro/forum/66/ + +------------------------------------------------------------------------------ + +Usage: + GRUB [--bypass] [--time-out=T] [--hot-key=K] [--config-file=FILE] + + The FILE, for example, can be (hd0,0)/menu.lst + + In CONFIG.SYS, the line looks like: + + install=c:\some\where\grub.exe --config-file=FILE + + If no options present, GRUB.EXE simply uses + + (hd0,0)/menu.lst + + as the configure file, if it exists. (Notice! We finally + changed the default file from (hd0,0)/boot/grub/menu.lst to + (hd0,0)/menu.lst) (Changed 2006-12-23. See Update 3 below.) + + The partition (hd0,0) can be of a Windows partition or a Linux + partition, or any other partition type supported by GRUB. + + Only GRUB-style filename is acceptable here for FILE. A DOS + filename won't work(it is certain we should use GRUB-style + filenames because DOS-filenames won't access a file in a + Linux ext2 partition for example).(See Update 2 below) + + Update: FILE can be the contents of a menu. Use semi-colon + to delimitate the embedded commands here in FILE. The FILE + can be enclosed with a pair of double-quotes. For example: + + GRUB --config-file="root (hd0,0);chainloader +1" + + This command will boot the system in (hd0,0). + + Another example: + + GRUB --config-file="reboot" + + This command will reboot the machine. + + One more example: + + GRUB --config-file="halt" + + This command will halt the machine. + + if --bypass is specified, GRUB will exit to DOS when + timeout reached. + + The option `--time-out=T' specifies the timeout value in + seconds. T defaults to 5 if --bypass is specified and defaults + to 0 if --bypass is not specified. + + The default hot key value is 0x3920(for space bar). If this + key is pressed, GRUB will boot normally. If another key is + pressed, GRUB will terminate immediately and return back to + DOS. See "int 16 keyboard scan codes" below. + + Each option can be specified only once at most. + + Update 2: DOS filenames have been supported(patched by John + Cobb). If the beginning two characters of FILE are "#@", then + the rest of FILE is taken as a DOS filename. Example: + + GRUB --config-file="#@c:\menu.lst" + + Only the beginning 4KB of the DOS file will be used. The file + should be an uncompressed text file. + + Note: You may also use the `direct DOS file access' with the + SHELL or INSTALL line in CONFIG.SYS, but should not use it + with the DEVICE line. The DOS document said that a DOS device + driver should not call the `open file' DOS call. + + Update 3(2006-12-23): By default, GRUB.EXE will locate its + config file in the following order: + + (DOS file) .\menu.lst, the MENU.LST in the current dir. + + (DOS file) \menu.lst, the MENU.LST in the root dir of + the current drive. + (GRUB file) /menu.lst, the MENU.LST in the root dir of + the boot device. + + The default boot device is still (hd0,0). + + +-------------------------------------------------------- + +Update 1: Version 0.2.0 also brings out a new thing, GRUB for NTLDR, + which could be used to boot into GRUB from the boot menu + of Windows NT/2000/XP. Copy GRLDR to the root directory of + drive C: of Windows NT/2000/XP and append to C:\BOOT.INI + this line: + + C:\GRLDR="Start GRUB" + + That will be done. The GRLDR should be in the same directory + as BOOT.INI and NTLDR. Note that BOOT.INI is usually hidden + and you must unhide it before you can see it. The filename + GRLDR shouldn't be changed. If GRLDR is in a NTFS partition, + it should be copied to the root directory of another non-NTFS + partition(and likewise should the menu.lst file be). If GRLDR + is compressed, e.g., in a NTFS partition, it will not work. + + Even if the drive letter of this disk has been changed to + other than C by the Windows device manager, it seems you still + have to use the letter C here in BOOT.INI, otherwise, NTLDR + will fail to locate the GRLDR file. + + And what's more, if you are booting NTLDR from a floppy, you + will have to write the GRLDR line in A:\BOOT.INI like this: + + C:\GRLDR="Start GRUB" + + and shouldn't use the letter A like this: + + A:\GRLDR="Start GRUB" + + (Note that in the case when BOOT.INI is on floppy A, the + notation "C:\GRLDR" actually refer to the file A:\GRLDR). + + +Update 2: GRUB for Linux is also introduced along with 0.2.0. You can + boot grub using a linux loader KEXEC, LILO, SYSLINUX or another + GRUB. (GRUB4LIN has merged into GRUB.EXE) + + To boot GRUB off Linux, use this pair of commands: + + kexec -l grub.exe + kexec -e + + To boot GRUB via GRUB, use commands like the following: + + kernel (hd0,0)/grub.exe + boot + + To boot GRUB via LILO, use these lines in lilo.conf: + + image=/boot/grub.exe + label=grub.exe + + To boot GRUB via SYSLINUX, use these lines in syslinux.cfg: + + label grub.exe + kernel grub.exe + + LOADLIN may encounter problems when loading grub.exe, because + grub.exe requires some unchanged original BIOS interrupt + vectors, but DOS has destroyed them, and loadlin does not + recover them before it transfers control to grub.exe. + +Update 3: Beginning at version 0.4.0, GRUB for DOS supports memdrives. + Example: + + # boot into a floppy image + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + Because the image will be copied to a memory area, the image + itself can be non-contiguous and even gzipped. + + Another Example: + + map --mem=-2880 (hd0,0)/floppy.img (fd0) + + This memdrive (fd0) will occupy at least 1440 KB of memory. + This is useful when the size of a 1.44M-floppy image is less + than 1440 KB. + + One more example: + + map --mem --read-only (hd0,0)/hd.img (hd1) + + This memdrive is a hard drive, and read-only. That means you + will not be able to write data to the memdrive (hd1). + + You can use many memdrives and many ordinary virtual emulated + disk-based drives at the same time. + + If the BIOS does not support int15/EAX=e820h, you will not be + able to use any memdrives. + +Update 4: For memdrive emulation, a single-partition image can be used + instead of a whole-harddrive image. Example: + + map --mem (hd0,7)/win98.img (hd0) + map --hook + chainloader (hd0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + Here win98.img is a partition image without the leading MBR + and partition table in it. Surely GRUB for DOS will build an + MBR and partition table for the memdrive (hd0). + +Update 5: Now GRLDR can be used as a no-emulation-mode bootable CD-ROM + boot image. Example for Linux users: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o bootable.iso iso_root + + As an alternative, grldr can also be used the same way as + stage2_eltorito. The -boot-info-table option is allowed but you + can omit it: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + Also note that the bootable.iso above must be created with the + -boot-load-seg 0xHHHH option where HHHH is greater than or + equal to 1000(hex). If HHHH < 1000(hex), QEMU will hang. This + is a bug in QEMU. The grldr.iso can be created with or without + -boot-load-seg 0xHHHH option. + + The menu.lst file should be placed in the root dir of the CD. + +Update 6: The Chinese special build is in the "chinese" subdirectory. + (patched by Gandalf, 2005-06-27) + + The Chinese special build also has scdrom builtin. + (update: scdrom has been dropped since 2006-07-20) + +Update 7: Added memory drive (md). Like (nd) for network drive and (cd) + for CD-ROM drive, a new drive (md) is implemented for accessing + the whole memory as a disk drive. (md) only works for systems + with BIOS int15/EAX=E820h support. + + The cat command now has a few new options: --hex for hexdump, + and --locate=STRING for string search in file. + + Typical examples: + + cat --hex (hd0)+1 + + It will display the MBR sector in hex form. + + cat --hex (md)+2 + + It will display 1KB of your memory(in fact, it is the real-mode + IDT table), also in hexdump form. + + cat --hex (md)0x800+1 + + It will display 1 sector of your extended memory. + + cat --hex (hd0,0)+1 + + It will display the first sector of partition (hd0,0). Usually + this sector contains the boot record of an operating system. + +Update 8: Added ram drive (rd). The (md) device accesses the memory + starting at physical address 0. But (rd) accesses memory + starting at any base address. The base and length of the ram + drive can be specified through the map command. "help map" for + details. You can even specify the BIOS drive number used for + the (rd) drive, e.g., map --ram-drive=0xf0. The default drive + number for (rd) is 0x7F which is a floppy. If (rd) is a hard + drive image, you should change the drive number to a value + greater than or equal to 0x80(but should avoid using 0xffff, + because 0xffff is for the (md) device). + + The notation (rd)+1 always represents the file which contains + all the bytes stored in (rd). + +Update 9: Directly boot NTLDR of WinNT/2K/XP and IO.SYS of Win9x/ME and + KERNEL.SYS of FreeDOS. Examples: + + chainloader --edx=0xPPYY (hd0,0)/ntldr + boot + + chainloader --edx=0xYY (hd0,0)/io.sys + boot + + chainloader --ebx=0xYY (hd0,0)/kernel.sys + boot + + Hex YY specifies the boot drive number, and hex PP specifies + the boot partition number of NTLDR. If the boot drive is + floppy, PP should be the hex value ff, i.e., decimal 255. + + For KERNEL.SYS of FreeDOS, the --edx won't work, + use --ebx please. + + The option --edx ( --ebx ) can be omitted if the file is in + its normal place. But in some cases, those options are needed. + + If, e.g., the ntldr file is in an ext2 partition called + (hd2,8) while you want it to think of the Windows partition + (hd0,7) as the boot partition, then --edx is required: + + chainloader --edx=0x0780 (hd2,8)/ntldr + + For DOS kernels(i.e., IO.SYS and KERNEL.SYS), the boot + partition number is meaningless, so you only need to specify + the correct boot drive number YY(but specifying the boot + partition number is harmless). + + The above PPYY can also be specified by using a root or + rootnoverify command after the chainloader command. Examples: + + chainloader (hd2,6)/kernel.sys + rootnoverify (hd0) <-------- YY=80 + boot + + chainloader (hd0,0)/ntldr + rootnoverify (hd0,5) <-------- YY=80, PP=05 + boot + + Tip: CMLDR (the ComMand LoaDeR, which is used to load the + Windows Fault Recovery Console) can be chainloaded as well + as NTLDR. + + Bean has successfully decompressed and booted IO.SYS of WinME. + Thanks for the great job! + +Update 10: isolinux.bin (version 3.73) can be chainloaded as with build + 2009-02-09. + + chainloader (cd)/isolinux.bin + + isolinux.bin must reside in a real or virtual cdrom. + +Update 11: stage2 of Grub Legacy can be chainloaded in this way: + + chainloader --force --load-segment=0 --load-offset=0x8000 --boot-cs=0 --boot-ip=0x8200 (...)/.../stage2 + +-------------------------------------------------------- + + There is no full documentation in English at present. Here are some + examples showing the usage of disk emulation commands: + +1. Emulates HD partition C: as floppy drive A: and boot win98 from C: + + map --read-only (hd0,0)+1 (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + boot + + In the above example, (hd0,0) is drive C: with win98 on it. After win98 + boot complete, you will find that A: contains all files of C:, and if + you delete files in A:, the files in C: will also disappear. + + At the map command line, the notation (hdm,n)+1 is interpreted to + represent the whole partition (hdm,n), not just the first sector of the + partition. + +2. Emulates HD partition C: as floppy drive A: and boot win98 from A: + + map --read-only (hd0,0)+1 (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + After the "map --hook" command, the emulation takes effect instantly + even in the GRUB command line. + + Note that the (fd0) in "chainloader (fd0)+1" is the emulated virtual + floppy A:, not the real floppy diskette(because map is hooked now). + + +3. Emulates an image file as floppy drive A: and boot win98 from C: + + map --read-only (hd0,0)/floppy.img (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --floppies=1 + map --harddrives=1 + boot + +4. Emulates an HD partition as the first hard disk and boot DOS from it: + + map --read-only (hd2,6)+1 (hd0) + map --hook + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + In this example, (hd2,6)+1 represents an extended logical DOS partition + of the third BIOS hard disk (hd2). + + If a DOS partition is used to emulate a hard disk, GRUB for DOS will + first try to locate the partition table, usually 63 sectors ahead of + the DOS partition. GRUB for DOS will refuse the emulation if the + partition table is not there. + +5. Emulates an image file as the first hard disk and boot DOS from it: + + map --read-only (hd0,0)/harddisk.img (hd0) + chainloader --load-length=512 (hd0,0)/harddisk.img + rootnoverify (hd0) + map --harddrives=1 + boot + + If an image file is used to emulate a hard disk, the image file must + contain an MBR. In other word, the first sector of HARDDISK.IMG must + contain the partition table of the emulated virtual hard disk. + +Note: Counters for floppies and harddrives in the BIOS Data Area remain + unchanged during the mapping. You should manually set them to proper + values with `map --floppies=' and/or `map --harddrives=', especially, + e.g., when there is no real floppy drive attached to the mother board. + If not doing so, DOS might fail to start. + + `map --status' can report the values. Note also that `map --floppies=' + and `map --harddrives=' can be used independently without the + appearance of mappings. + + 0.4.2 has introduced a new variable, memdisk_raw, to simulate the + memdisk-like raw mode. If the BIOS has no int15/87h, or if it has + buggy int15/87h support, you should set this variable before any + memdrives are used. Here is an example: + + map --memdisk-raw=1 + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + boot + + If you encountered a memdrive failure without using + map --memdisk-raw=1, you should have a try with `map --memdisk-raw=1'. + + If you `map --memdisk-raw=0' later, you should afterwards do a + `map --unhook'(and followed by a `map --hook' if needed). + + Update: memdisk_raw now defaults to 1. You should `map --memdisk-raw=0' + if you want to use int15/87h to access memdrives. + +-------------------------------------------------------- + + Floppies/harddisks of any size can be emulated with GRUB for DOS 0.2.0. + + Image file must be contiguous, or else GRUB for DOS will refuse it. + + The `blocklist' command can list fragments or pieces of a file. + + Type "help map" at the GRUB prompt to get a brief description of the + command. + + The form + + map ... (fd?) + + is a floppy emulation, and the form + + map ... (hd?) + + is a hard disk emulation. + + When a HARD DISK emulation is used, better not start Windows for + security reasons. Windows may even destroy all data and all information + on all your real hard disks!!!!!!!! + + Update for --mem: when --mem is used, it seems rather safe even after + entering Windows. Win98 can operate the memdrive normally. + + Windows NT/2000/XP does not recognize the emulated drives no matter + whether the --mem option is present. + + + +****************************************************************************** +*** Explanation of the grldr-bootable floppies or harddisk partitions *** +****************************************************************************** + +1. Ext2 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +An EXT2/EXT3 volume can be GRUB-bootable. Copy grldr and an optional menu.lst +to the root dir of the EXT2/EXT3 volume, and build the boot sector based on the +fifth sector of grldr(some fields need to be changed as detailed in the +following table). And then the EXT2/EXT3 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the first sector of an EXT2/EXT3 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x02 for CHS mode, or 0x42 for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x42. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x42. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x42, + otherwise, set to 0x02. + + Note that Windows98 uses the value 0x0e as the LBA indicator. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + +03h 10 OEM name string (of OS which formatted the disk). + Update: this field is now used for error message of "I/O error" + +0Dh 1 Sectors per block. Valid values are 2, 4, 8, 16 and 32. + +0Eh 2 Bytes per block. Valid values are 0x400, 0x800, 0x1000, 0x2000 + and 0x4000. + +10h 4 Pointers in pointers-per-block blocks, that is, number of + blocks covered by a double-indirect block. + + Valid values are 0x10000, 0x40000, 0x100000, 0x400000 and + 0x1000000. + +14h 4 Pointers per block, that is, number of blocks covered by an + indirect block. + + Valid values are 0x100, 0x200, 0x400, 0x800, 0x1000. + +18h 2 Sectors per track. + +1Ah 2 Number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors in the filesystem(or in the partition). + +24h 1 BIOS drive number of the boot device. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +25h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +26h 2 inode size in bytes. (Notice! We use the formerly reserved + word here for inode size!) + +28h 4 Number of inodes per group. + + Normally a 1.44M floppy has only one group, and the total + number of inodes is 184. So the value should be 184 or + greater. + +2Ch 4 The block number for group descriptors. + + Valid values are 2 for 1024-byte blocks, and 1 otherwise. + + The value here is equal to (s_first_data_block + 1). + +30h 1 code for "cld"(0xFC). + +31h 2 code for "xor ax,ax"(0x31, 0xC0). + +33h 1 code for "nop"(0x90) or "cwd"(0x99) + +34h 458 The rest of the machine code. + +1FEh 2 Boot Signature AA55h. + + +2. FAT12/FAT16 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +A FAT12/16 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT12/16 volume, and build the boot sector based on the +fourth sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT12/16 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT12/16 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + +10h 1 Number of FATs(nearly always 2). + +11h 2 Maximum number of root directory entries. + +13h 2 Total number of sectors (for small disks only, if the disk is + too big this is set to 0 and offset 20h is used instead). + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 Sectors per FAT. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors for large disks. + +24h 1 BIOS drive number of the boot device. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +25h 1 Partition number of this filesystem in the boot drive. + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 41h below. + +26h 1 Signature (must be 28h or 29h to be recognised by NT). + +27h 4 Volume serial number. + +2Bh 11 Volume label. + +36h 8 File system ID. "FAT12 ", "FAT16 " or "FAT ". + +3Eh 1 code for "cli". + +3Fh 1 code for "cld". + +40h 1 code for "mov dh, imm8". + +41h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +42h 442 The rest of the machine code. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + + +3. FAT32 Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +A FAT32 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT32 volume, and build the boot sector based on the +third sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT32 volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT32 volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + +10h 1 Number of FATs(nearly always 2). + +11h 2 (Maximum number of root directory entries)Must be 0. + +13h 2 (Total number of sectors for small disks only)Must be 0. + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 (Sectors per FAT)Must be 0. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 Total number of sectors for large disks. + +24h 4 FAT32 sectors per FAT. + +28h 2 If bit 7 is clear then all FATs are updated, otherwise bits + 0-3 give the current active FAT, all other bits are reserved. + +2Ah 2 High byte is major revision number, low byte is minor revision + number, currently both are 0. + +2Ch 4 Root directory starting cluster. + +30h 2 File system information sector. + +32h 2 If non-zero this gives the sector which holds a copy of the + boot record, usually 6. + +34h 12 Reserved, set to 0. + +40h 1 BIOS drive number of the boot device. + + 80h is first HDD, 00h is first FDD. + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + +41h 1 Partition number of this filesystem in the boot drive. + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 5Dh below. + +42h 1 Signature (must be 28h or 29h to be recognised by NT). + +43h 4 Volume serial number. + +47h 11 Volume label. + +52h 8 File system ID. "FAT32 ". + +5Ah 1 opcode for "cli". + +5Bh 1 opcode for "cld". + +5Ch 1 opcode for "mov dh, imm8". + +5Dh 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +5Eh 414 The rest of the machine code. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + + +4. NTFS Boot Sector/Boot Record Layout (for loading grldr) +------------------------------------------------------------------------------ +An NTFS volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the NTFS volume, and build the boot sector based on the +6th-9th sectors of grldr(some fields need to be changed as detailed in the +following table). And then the NTFS volume is GRUB-bootable. + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the leading 4 sectors of an NTFS volume. + +Offset Length Description +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + +03h 8 OEM name string (of OS which formatted the disk). + +0Bh 2 Bytes per sector. Must be 512. + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + +0Eh 2 (Reserved sectors)Unused. + +10h 1 (Number of FATs)Must be 0. + +11h 2 (Maximum number of root directory entries)Must be 0. + +13h 2 (Total number of sectors for small disks only)Must be 0. + +15h 1 Media descriptor byte, pretty meaningless now (see below). + +16h 2 (Sectors per FAT)Must be 0. + +18h 2 Sectors per track. + +1Ah 2 Total number of heads/sides. + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + + Also referred to as the starting sector of the partition. + + For floppies, it should be 0. + +20h 4 (Total number of sectors for large disks)Must be 0. + +24h 4 (FAT32 sectors per FAT) - Usually 80 00 80 00, A value of + 80 00 00 00 has been seen on a USB thumb drive which is + formatted with NTFS under Windows XP. Note this is removable + media and is not partitioned, the drive as a whole is NTFS + formatted. + +28h 8 Number of sectors in the volume. + +30h 8 LCN of VCN 0 of the $MFT. + +38h 8 LCN of VCN 0 of the $MFTMirr. + +40h 4 Clusters per MFT Record. + +44h 4 Clusters per Index Record. + +48h 8 Volume serial number. + +50h 4 Checksum, usually 0. + +54h 1 opcode for "cli". + +55h 1 opcode for "cld". + +56h 1 opcode for "mov dh, imm8". + +57h 1 Partition number of this partition on the boot drive. + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + + 0xff is for whole drive. So for floppies, it should be 0xff. + +58h 420 The rest of the machine code in the first sector. + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + +200h 1536 The rest of the machine code in the last 3 sectors. + +------------------------------------------------------------------------------ + +Appendix A: File System Information Sector of FAT32(not used by grldr) + +Offset Length Description +====== ====== ============================================================== +0h 4 Leading Signature 41615252h. + +4h 480 Reserved, set to 0. + +1E4h 4 FSI structure signature 61417272h. + +1E8h 4 Contains the last known count of free clusters, if this is + equal to FFFFFFFFh, then the count is unknown. + +1ECh 4 Cluster number at which you should begin a search for a free + cluster, if this is equal to FFFFFFFFh then the field has not + been set. + +1F0h 12 Reserved, set to 0. + +1FCh 4 Trailing Signature AA550000h. + +------------------------------------------------------------------------------ + +Appendix B: Media Descriptor Byte(not used by grldr) + +The Media descriptor byte is meaningless because of the duplications, F0h for +example. + +Byte Type of disk Sectors Heads Tracks Capacity +---- ------------ ------- ----- ------ -------- +FFh 5 1/4" 8 2 40 320KB +FEh 5 1/4" 8 1 40 160KB +FDh 5 1/4" 9 2 40 360KB +FCh 5 1/4" 9 1 40 180KB +FBh both 9 2 80 640KB +FAh both 9 1 80 320KB +F9h 5 1/4" 15 2 80 1200KB +F9h 3 1/2" 9 2 80 720KB +F0h 3 1/2" 18 2 80 1440KB +F0h 3 1/2" 36 2 80 2880KB +F8h hard disk NA NA NA NA + +****************************************************************************** +*** grldr.mbr - How to write it to Master Boot Track of the hard disk *** +****************************************************************************** + +grldr.mbr contains code that can be used as Master Boot Record. The code is +responsible for searching all partitions for grldr and when found, loading it. +Currently supported partition types are: FAT12/FAT16/FAT32, NTFS, EXT2/EXT3. +Logical partitions in the extended partition are supported, provided that the +extended partition type is Microsoft-compatible. In fact, the Linux extended +partition type(0x85) is not fully tested for the search mechanism. + +How to write GRLDR.MBR to the Master Boot Track of a hard disk? + +First, read the Windows disk signature and partition information bytes +(72 bytes in total, from offset 0x01b8 to 0x01ff of the MBR sector), and put +them on the same range from offset 0x01b8 to 0x01ff of the beginning sector of +GRLDR.MBR. + +Optionally, if the MBR in the hard disk is a single sector MBR created by +Microsoft FDISK, it may be copied onto the second sector of GRLDR.MBR. + +The second sector of GRLDR.MBR is called "previous MBR". When GRLDR not found, +"previous MBR" will be started. + +No other steps needed, after all necessary changes stated above have been made, +now simply write GRLDR.MBR on to the Master Boot Track. That's all. + +Note: The Master Boot Track means the first track of the hard drive. + +Note: The bootstrap code of GRLDR.MBR only finds GRLDR file in the root dir of +a partition. You'd better place menu.lst file accompanying with GRLDR(i.e., in +the same root dir of the same partition as GRLDR). + +The filename "grldr" in an ext2 partition must be in lower case letters, and +the file type of grldr must be plain regular. Other types, e.g., a symbolic +link, won't work. + +Update: bootlace.com is a DOS/Linux utility for installing grldr.mbr to MBR. +The whole grldr.mbr is embedded in the body of the bootlace.com utility, so +bootlace.com can be used independently. See below. + +****************************************************************************** +*** grldr.mbr - Details about the control bytes *** +****************************************************************************** + +Six bytes can be used to control the boot process of GRLDR.MBR. + +Offset Length Description +====== ====== ============================================================== +02h 1 bit0=1: disable the search for GRLDR on floppy + bit0=0: enable the search for GRLDR on floppy + + bit1=1: disable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + bit1=0: enable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + + bit2=1: disable the feature of unconditional entrance to + the command-line(See below `--duce') + bit2=0: enable the feature of unconditional entrance to + the command-line(See below `--duce') + + bit3=1: disable geometry tune(See below `--chs-no-tune') + bit3=0: enable geometry tune(See below `--chs-no-tune') + + bit4 - bit6: reserved + + bit7=1: try to boot PREVIOUS MBR after the search for GRLDR + bit7=0: try to boot PREVIOUS MBR before the search for GRLDR + +03h 1 timeout in seconds to wait for a key press. 0xff stands for + waiting all the time(endless). + +04h 2 hot-key code. high byte is scan code, low byte is ASCII code. + the default value is 0x3920, which stands for the space bar. + if this key is pressed, GRUB will be started prior to the boot + of previous MBR. See "int 16 keyboard scan codes" below. + +06h 1 preferred boot drive number, 0xff for no-drive +07h 1 preferred partition number, 0xff for whole drive + + if the preferred boot drive number is 0xff, the order of the + search for GRLDR will be: + + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + otherwise, if the preferred boot drive number is Y(not equal to + 0xff) and the preferred partition number is K, then the order of + the search for GRLDR will be: + + (Y) if K=0xff; or (Y,K) otherwise + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + Note: if Y < 0x80, then (Y) is floppy, else (Y) is harddrive, + and (Y,K) is partition number K on harddrive (Y). + + +****************************************************************************** +*** bootlace.com - Install GRLDR.MBR bootstrap code to MBR *** +****************************************************************************** + +BOOTLACE.COM installs GRLDR.MBR boot record to the MBR of a harddrive or of a +harddrive image file, or to the boot sector of a floppy or a floppy image. + +Usage: + + bootlace.com [OPTIONS] DEVICE_OR_FILE + +OPTIONS: + + --read-only do everything except the actual write to the + specified DEVICE_OR_FILE. + + --restore-mbr restore the previous mbr. + + --mbr-no-bpb do not copy BPB in the boot sector of the + leading FAT partition to MBR. + + --no-backup-mbr do not copy the old MBR to the second sector of + DEVICE_OR_FILE. + + --force-backup-mbr force the copy of old MBR to the second sector + of DEVICE_OR_FILE. + + --mbr-enable-floppy enable the search for GRLDR on floppy. + + --mbr-disable-floppy disable the search for GRLDR on floppy. + + --mbr-enable-osbr enable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector). + + --mbr-disable-osbr disable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector). + + --duce disable the feature of unconditional entrance + to the command-line. + + Normally one can unconditionally get the + command-line console by a keypress of `C', + bypassing all config-files(including the + preset-menu). This is a security hole. So we + need this option to disable the feature. + + DUCE is for Disable Unconditional Command-line + Entrance. + + --chs-no-tune disable the feature of geometry tune. + + --boot-prevmbr-first try to boot PREVIOUS MBR before the search for + GRLDR. + + --boot-prevmbr-last try to boot PREVIOUS MBR after the search for + GRLDR. + + --preferred-drive=D preferred boot drive number, 0 <= D < 255. + + --preferred-partition=P preferred partition number, 0 <= P < 255. + + --serial-number=SN setup a new serial number for the hard drive. + SN must be non-zero. + + --time-out=T wait T seconds before booting PREVIOUS MBR. if + T is 0xff, wait forever. The default is 5. + + --hot-key=K if the desired key K is pressed, start GRUB + before booting PREVIOUS MBR. K is a word + value, just as the value in AX register + returned from int16/AH=1. The high byte is the + scan code and the low byte is ASCII code. The + default is 0x3920 for space bar. See "int 16 + keyboard scan codes" below. + + --floppy if DEVICE_OR_FILE is floppy, use this option. + + --floppy=N if DEVICE_OR_FILE is a partition on a hard + drive, use this option. N is used to specify + the partition number: 0,1,2 and 3 for the + primary partitions, and 4,5,6,... for the + logical partitions. + + --sectors-per-track=S specifies sectors per track for --floppy. + 1 <= S <= 63, default is 63. + + --heads=H specifies number of heads for --floppy. + 1 <= H <= 256, default is 255. + + --start-sector=B specifies hidden sectors for --floppy=N. + + --total-sectors=C specifies total sectors for --floppy. + default is 0. + + --lba use lba mode for --floppy. If the floppy BIOS + has LBA support, you can specify --lba here. + It is assumed that all floppy BIOSes have CHS + support. So you would rather specify --chs. + If neither --chs nor --lba is specified, then + the LBA indicator(i.e., the third byte of the + boot sector) will not be touched. + + --chs use chs mode for --floppy. You should specify + --chs if the floppy BIOS does not support LBA. + We assume all floppy BIOSes have CHS support. + So it is likely you want to specify --chs. + If neither --chs nor --lba is specified, then + the LBA indicator(i.e., the third byte of the + boot sector) will not be touched. + + --fat12 FAT12 is allowed to be installed for --floppy. + + --fat16 FAT16 is allowed to be installed for --floppy. + + --fat32 FAT32 is allowed to be installed for --floppy. + + --vfat FAT12/16/32 are allowed to be installed for + --floppy. + + --ntfs NTFS is allowed to be installed for --floppy. + + --ext2 EXT2 is allowed to be installed for --floppy. + + --install-partition=I Install the boot record onto the boot area of + partition number I of the specified hard drive + or harddrive image DEVICE_OR_FILE. + +DEVICE_OR_FILE: Filename of the device or the image file. For DOS, a BIOS drive +number(hex 0xHH or decimal DDD) can be used to access the drive. BIOS drive +number 0 is for the first floppy, 1 is for the second floppy; 0x80 is for the +first hard drive, 0x81 is for the second hard drive, etc. + +Note: BOOTLACE.COM writes only the boot code to MBR. The boot code needs to +load GRLDR as the second(and last) stage of the GRUB boot process. Therefore +GRLDR should be copied to the root directory of one of the supported +partitions, either before or after a successful execution of BOOTLACE.COM. +Currently only partitions with filesystem type of FAT12, FAT16, FAT32, NTFS, +EXT2 or EXT3 are supported. + +Note 2: If DEVICE_OR_FILE is a harddisk device or a harddisk image file, it +must contain a valid partition table, otherwise, BOOTLACE.COM will fail. If +DEVICE_OR_FILE is a floppy device or a floppy image file, then it must contain +a supported filesystem(i.e., either of FAT12/FAT16/FAT32/NTFS/EXT2/EXT3). + +Note 3: If DEVICE_OR_FILE is a floppy device or a floppy image file, and it +was formated EXT2/EXT3, then you should specify --sectors-per-track and +--heads explicitly. + + +Important!! If you install GRLDR Boot Record to a floppy or a partition, the +floppy or partition will boot solely grldr, and your original +IO.SYS(DOS/Win9x/Me) and NTLDR(WinNT/2K/XP) will become unbootable. This is +because the original boot record of the floppy or partition was overwritten. +There is no such problem when installing GRLDR Boot Record onto the MBR. +Update: Some NTLDR/IO.SYS/KERNEL.SYS files can be directly chainloaded in the +latest GRUB4DOS. + +Tip: If the filename begins in a dash(-) or a digit, you may prefix a dirname +(./) or (.\) to it. + +Examples: + + Installing GRLDR boot code to MBR under Linux: + + bootlace.com /dev/hda + + Installing GRLDR boot code to MBR under DOS: + + bootlace.com 0x80 + + Installing GRLDR boot code to a harddisk image under DOS or Linux: + + bootlace.com hd.img + + Installing GRLDR boot code to floppy under Linux: + + bootlace.com --floppy --chs /dev/fd0 + + Installing GRLDR boot code to floppy under DOS: + + bootlace.com --floppy --chs 0x00 + + Installing GRLDR boot code to a floppy image under DOS or Linux: + + bootlace.com --floppy --chs floppy.img + +BOOTLACE.COM cannot function well under Windows NT/2000/XP/2003. It is expected +(and designed) to run under DOS/Win9x and Linux. Update: For image FILES, +bootlace.com function well under Windows NT/2000/XP/2003. For devices, +bootlace.com will not work under Windows NT/2000/XP/2003 because bootlace.com +is a DOS utility and Windows NT/2000/XP/2003 does not allow bootlace.com to +access devices. + +****************************************************************************** +*** kexec-tools should be patched for the 1.101 release *** +****************************************************************************** + +The file kexec-tools-1.101-patch is a patch to the kexec-tools-1.101 release. +Kexec might fail to load grub.exe without this patch. + +The home page of kexec-tools is: + + http://www.xmission.com/~ebiederm/files/kexec/ + +Note: The Linux kernel should be KEXEC enabled before kexec can be run. + + !! Important Update !! + +The patch `kexec-tools-1.101-patch' is not needed now and has been deleted. +Even worse, it fails in `kexec -l grub.exe --initrd=imgfile'. So please +do not use it any more. + +****************************************************************************** +*** Direct transition to DOS/Win9x from within Linux *** +****************************************************************************** + +By using kexec, we can easily boot into DOS/Win9x from a running Linux system. + +If WIN98.IMG is a bootable hard-disk image, do as follows: + +kexec -l grub.exe --initrd=WIN98.IMG --command-line="--config-file=map (rd) (hd0); map --hook; chainloader (hd0)+1; rootnoverify (hd0)" + +kexec -e + +If DOS.IMG is a bootable floppy image, do this way: + +kexec -l grub.exe --initrd=DOS.IMG --command-line="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +kexec -e + +Note that in this manner, we can boot DOS/Win9x without using a real DOS/Win9x +disk. We need no FAT partition but an image file. + +We have noticed that Linux itself can act as a big boot manager by using kexec +and grub.exe. This may be convenient to developers who write installation or +bootstrap or initialization programs. + +Certainly, grub.exe and the bootable disk image can also be loaded by a running +GRUB or LILO or syslinux. Examples: + +1. Loaded by GRUB: + + kernel (hd0,0)/grub.exe --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + initrd (hd0,0)/DOS.IMG + boot + +2. Loaded by LILO: + + image=/boot/grub.exe + label=grub.exe + initrd=/boot/DOS.IMG + append="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +3. Loaded by SYSLINUX: + + label grub.exe + kernel grub.exe + append initrd=DOS.IMG --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +Note: If the above `map (rd) (...)' failed, you may use `map (rd)+1 (...)' +instead and try again. + +****************************************************************************** +*** Keyboard BIOS Scan Code/ASCII code tables *** +****************************************************************************** + +Keyboard bios scan code and ascii character code tables can be obtained from +the web by, for example, googling for "3920 372A 4A2D 4E2B 352F". Here are 2 +main results: + +1. From "http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html": + +INT 16 - Keyboard Scan Codes + + Key Normal Shifted w/Ctrl w/Alt + + A 1E61 1E41 1E01 1E00 + B 3062 3042 3002 3000 + C 2E63 2E43 2E03 2E00 + D 2064 2044 2004 2000 + E 1265 1245 1205 1200 + F 2166 2146 2106 2100 + G 2267 2247 2207 2200 + H 2368 2348 2308 2300 + I 1769 1749 1709 1700 + J 246A 244A 240A 2400 + K 256B 254B 250B 2500 + L 266C 264C 260C 2600 + M 326D 324D 320D 3200 + N 316E 314E 310E 3100 + O 186F 184F 180F 1800 + P 1970 1950 1910 1900 + Q 1071 1051 1011 1000 + R 1372 1352 1312 1300 + S 1F73 1F53 1F13 1F00 + T 1474 1454 1414 1400 + U 1675 1655 1615 1600 + V 2F76 2F56 2F16 2F00 + W 1177 1157 1117 1100 + X 2D78 2D58 2D18 2D00 + Y 1579 1559 1519 1500 + Z 2C7A 2C5A 2C1A 2C00 + + Key Normal Shifted w/Ctrl w/Alt + + 1 0231 0221 7800 + 2 0332 0340 0300 7900 + 3 0433 0423 7A00 + 4 0534 0524 7B00 + 5 0635 0625 7C00 + 6 0736 075E 071E 7D00 + 7 0837 0826 7E00 + 8 0938 092A 7F00 + 9 0A39 0A28 8000 + 0 0B30 0B29 8100 + + Key Normal Shifted w/Ctrl w/Alt + + - 0C2D 0C5F 0C1F 8200 + = 0D3D 0D2B 8300 + [ 1A5B 1A7B 1A1B 1A00 + ] 1B5D 1B7D 1B1D 1B00 + ; 273B 273A 2700 + ' 2827 2822 + ` 2960 297E + \ 2B5C 2B7C 2B1C 2600 (same as Alt L) + , 332C 333C + . 342E 343E + / 352F 353F + + Key Normal Shifted w/Ctrl w/Alt + + F1 3B00 5400 5E00 6800 + F2 3C00 5500 5F00 6900 + F3 3D00 5600 6000 6A00 + F4 3E00 5700 6100 6B00 + F5 3F00 5800 6200 6C00 + F6 4000 5900 6300 6D00 + F7 4100 5A00 6400 6E00 + F8 4200 5B00 6500 6F00 + F9 4300 5C00 6600 7000 + F10 4400 5D00 6700 7100 + F11 8500 8700 8900 8B00 + F12 8600 8800 8A00 8C00 + + Key Normal Shifted w/Ctrl w/Alt + + BackSpace 0E08 0E08 0E7F 0E00 + Del 5300 532E 9300 A300 + Down Arrow 5000 5032 9100 A000 + End 4F00 4F31 7500 9F00 + Enter 1C0D 1C0D 1C0A A600 + Esc 011B 011B 011B 0100 + Home 4700 4737 7700 9700 + Ins 5200 5230 9200 A200 + Keypad 5 4C35 8F00 + Keypad * 372A 9600 3700 + Keypad - 4A2D 4A2D 8E00 4A00 + Keypad + 4E2B 4E2B 4E00 + Keypad / 352F 352F 9500 A400 + Left Arrow 4B00 4B34 7300 9B00 + PgDn 5100 5133 7600 A100 + PgUp 4900 4939 8400 9900 + PrtSc 7200 + Right Arrow 4D00 4D36 7400 9D00 + SpaceBar 3920 3920 3920 3920 + Tab 0F09 0F00 9400 A500 + Up Arrow 4800 4838 8D00 9800 + + +- Some key combinations are not available on all systems. The PS/2 + includes many that aren't available on the PC, XT and AT. +- To retrieve the character from a scan code logical AND the word + with 0x00FF. +- see INT 16 MAKE CODES + + + +2. From "http://www.hoppie.nl/ivan/keycodes.txt": + + + + Keystroke Keypress code +-------------------------------------------------- + Esc 011B + 1 0231 + 2 0332 + 3 0433 + 4 0534 + 5 0635 + 6 0736 + 7 0837 + 8 0938 + 9 0A39 + 0 0B30 + - 0C2D + = 0D3D + Backspace 0E08 + Tab 0F09 + q 1071 + w 1177 + e 1265 + r 1372 + t 1474 + y 1579 + u 1675 + i 1769 + o 186F + p 1970 + [ 1A5B + ] 1B5D + Enter 1C0D + Ctrl ** + a 1E61 + s 1F73 + d 2064 + f 2166 + g 2267 + h 2368 + j 246A + k 256B + l 266C + ; 273B + ' 2827 + ` 2960 + Shift ** + \ 2B5C + z 2C7A + x 2D78 + c 2E63 + v 2F76 + b 3062 + n 316E + m 326D + , 332C + . 342E + / 352F + Gray * 372A + Alt ** + Space 3920 + Caps Lock ** + F1 3B00 + F2 3C00 + F3 3D00 + F4 3E00 + F5 3F00 + F6 4000 + F7 4100 + F8 4200 + F9 4300 + F10 4400 + F11 8500 + F12 8600 + Num Lock ** + Scroll Lock ** + White Home 4700 + White Up Arrow 4800 + White PgUp 4900 + Gray - 4A2D + White Left Arrow 4B00 + Center Key 4C00 + White Right Arrow 4D00 + Gray + 4E2B + White End 4F00 + White Down Arrow 5000 + White PgDn 5100 + White Ins 5200 + White Del 5300 + SysReq ** + Key 45 [1] 565C + Enter (number keypad) 1C0D + Gray / 352F + PrtSc ** + Pause ** + Gray Home 4700 + Gray Up Arrow 4800 + Gray Page Up 4900 + Gray Left Arrow 4B00 + Gray Right Arrow 4D00 + Gray End 4F00 + Gray Down Arrow 5000 + Gray Page Down 5100 + Gray Insert 5200 + Gray Delete 5300 + + Shift Esc 011B + ! 0221 + @ 0340 + # 0423 + $ 0524 + % 0625 + ^ 075E + & 0826 + * (white) 092A + ( 0A28 + ) 0B29 + _ 0C5F + + (white) 0D2B + Shift Backspace 0E08 + Shift Tab (Backtab) 0F00 + Q 1051 + W 1157 + E 1245 + R 1352 + T 1454 + Y 1559 + U 1655 + I 1749 + O 184F + P 1950 + { 1A7B + } 1B7D + Shift Enter 1C0D + Shift Ctrl ** + A 1E41 + S 1F53 + D 2044 + F 2146 + G 2247 + H 2348 + J 244A + K 254B + L 264C + : 273A + " 2822 + ~ 297E + | 2B7C + Z 2C5A + X 2D58 + C 2E43 + V 2F56 + B 3042 + N 314E + M 324D + < 333C + > 343E + ? 353F + Shift Gray * 372A + Shift Alt ** + Shift Space 3920 + Shift Caps Lock ** + Shift F1 5400 + Shift F2 5500 + Shift F3 5600 + Shift F4 5700 + Shift F5 5800 + Shift F6 5900 + Shift F7 5A00 + Shift F8 5B00 + Shift F9 5C00 + Shift F10 5D00 + Shift F11 8700 + Shift F12 8800 + Shift Num Lock ** + Shift Scroll Lock ** + Shift 7 (number pad) 4737 + Shift 8 (number pad) 4838 + Shift 9 (number pad) 4939 + Shift Gray - 4A2D + Shift 4 (number pad) 4B34 + Shift 5 (number pad) 4C35 + Shift 6 (number pad) 4D36 + Shift Gray + 4E2B + Shift 1 (number pad) 4F31 + Shift 2 (number pad) 5032 + Shift 3 (number pad) 5133 + Shift 0 (number pad) 5230 + Shift . (number pad) 532E + Shift SysReq ** + Shift Key 45 [1] 567C + Shift Enter (number pad) 1C0D + Shift Gray / 352F + Shift PrtSc ** + Shift Pause ** + Shift Gray Home 4700 + Shift Gray Up Arrow 4800 + Shift Gray Page Up 4900 + Shift Gray Left Arrow 4B00 + Shift Gray Right Arrow 4D00 + Shift Gray End 4F00 + Shift Gray Down Arrow 5000 + Shift Gray Page Down 5100 + Shift Gray Insert 5200 + Shift Gray Delete 5300 + + Ctrl Esc 011B + Ctrl 1 -- + Ctrl 2 (NUL) 0300 + Ctrl 3 -- + Ctrl 4 -- + Ctrl 5 -- + Ctrl 6 (RS) 071E + Ctrl 7 -- + Ctrl 8 -- + Ctrl 9 -- + Ctrl 0 -- + Ctrl - 0C1F + Ctrl = -- + Ctrl Backspace (DEL) 0E7F + Ctrl Tab 9400 + Ctrl q (DC1) 1011 + Ctrl w (ETB) 1117 + Ctrl e (ENQ) 1205 + Ctrl r (DC2) 1312 + Ctrl t (DC4) 1414 + Ctrl y (EM) 1519 + Ctrl u (NAK) 1615 + Ctrl i (HT) 1709 + Ctrl o (SI) 180F + Ctrl p (DEL) 1910 + Ctrl [ (ESC) 1A1B + Ctrl ] (GS) 1B1D + Ctrl Enter (LF) 1C0A + Ctrl a (SOH) 1E01 + Ctrl s (DC3) 1F13 + Ctrl d (EOT) 2004 + Ctrl f (ACK) 2106 + Ctrl g (BEL) 2207 + Ctrl h (Backspace) 2308 + Ctrl j (LF) 240A + Ctrl k (VT) 250B + Ctrl l (FF) 260C + Ctrl ; -- + Ctrl ' -- + Ctrl ` -- + Ctrl Shift ** + Ctrl \ (FS) 2B1C + Ctrl z (SUB) 2C1A + Ctrl x (CAN) 2D18 + Ctrl c (ETX) 2E03 + Ctrl v (SYN) 2F16 + Ctrl b (STX) 3002 + Ctrl n (SO) 310E + Ctrl m (CR) 320D + Ctrl , -- + Ctrl . -- + Ctrl / -- + Ctrl Gray * 9600 + Ctrl Alt ** + Ctrl Space 3920 + Ctrl Caps Lock -- + Ctrl F1 5E00 + Ctrl F2 5F00 + Ctrl F3 6000 + Ctrl F4 6100 + Ctrl F5 6200 + Ctrl F6 6300 + Ctrl F7 6400 + Ctrl F8 6500 + Ctrl F9 6600 + Ctrl F10 6700 + Ctrl F11 8900 + Ctrl F12 8A00 + Ctrl Num Lock -- + Ctrl Scroll Lock -- + Ctrl White Home 7700 + Ctrl White Up Arrow 8D00 + Ctrl White PgUp 8400 + Ctrl Gray - 8E00 + Ctrl White Left Arrow 7300 + Ctrl 5 (number pad) 8F00 + Ctrl White Right Arrow 7400 + Ctrl Gray + 9000 + Ctrl White End 7500 + Ctrl White Down Arrow 9100 + Ctrl White PgDn 7600 + Ctrl White Ins 9200 + Ctrl White Del 9300 + Ctrl SysReq ** + Ctrl Key 45 [1] -- + Ctrl Enter (number pad) 1C0A + Ctrl / (number pad) 9500 + Ctrl PrtSc 7200 + Ctrl Break 0000 + Ctrl Gray Home 7700 + Ctrl Gray Up Arrow 8DE0 + Ctrl Gray Page Up 8400 + Ctrl Gray Left Arrow 7300 + Ctrl Gray Right Arrow 7400 + Ctrl Gray End 7500 + Ctrl Gray Down Arrow 91E0 + Ctrl Gray Page Down 7600 + Ctrl Gray Insert 92E0 + Ctrl Gray Delete 93E0 + + Alt Esc 0100 + Alt 1 7800 + Alt 2 7900 + Alt 3 7A00 + Alt 4 7B00 + Alt 5 7C00 + Alt 6 7D00 + Alt 7 7E00 + Alt 8 7F00 + Alt 9 8000 + Alt 0 8100 + Alt - 8200 + Alt = 8300 + Alt Backspace 0E00 + Alt Tab A500 + Alt q 1000 + Alt w 1100 + Alt e 1200 + Alt r 1300 + Alt t 1400 + Alt y 1500 + Alt u 1600 + Alt i 1700 + Alt o 1800 + Alt p 1900 + Alt [ 1A00 + Alt ] 1B00 + Alt Enter 1C00 + Alt Ctrl ** + Alt a 1E00 + Alt s 1F00 + Alt d 2000 + Alt f 2100 + Alt g 2200 + Alt h 2300 + Alt j 2400 + Alt k 2500 + Alt l 2600 + Alt ; 2700 + Alt ' 2800 + Alt ` 2900 + Alt Shift ** + Alt \ 2B00 + Alt z 2C00 + Alt x 2D00 + Alt c 2E00 + Alt v 2F00 + Alt b 3000 + Alt n 3100 + Alt m 3200 + Alt , 3300 + Alt . 3400 + Alt / 3500 + Alt Gray * 3700 + Alt Space 3920 + Alt Caps Lock ** + Alt F1 6800 + Alt F2 6900 + Alt F3 6A00 + Alt F4 6B00 + Alt F5 6C00 + Alt F6 6D00 + Alt F7 6E00 + Alt F8 6F00 + Alt F9 7000 + Alt F10 7100 + Alt F11 8B00 + Alt F12 8C00 + Alt Num Lock ** + Alt Scroll Lock ** + Alt Gray - 4A00 + Alt Gray + 4E00 + Alt 7 (number pad) # + Alt 8 (number pad) # + Alt 9 (number pad) # + Alt 4 (number pad) # + Alt 5 (number pad) # + Alt 6 (number pad) # + Alt 1 (number pad) # + Alt 2 (number pad) # + Alt 3 (number pad) # + Alt Del -- + Alt SysReq ** + Alt Key 45 [1] -- + Alt Enter (number pad) A600 + Alt / (number pad) A400 + Alt PrtSc ** + Alt Pause ** + Alt Gray Home 9700 + Alt Gray Up Arrow 9800 + Alt Gray Page Up 9900 + Alt Gray Left Arrow 9B00 + Alt Gray Right Arrow 9D00 + Alt Gray End 9F00 + Alt Gray Down Arrow A000 + Alt Gray Page Down A100 + Alt Gray Insert A200 + Alt Gray Delete A300 + + ------------------------------------------------------------------------- + +Footnotes + + [1] In the United States, the 101/102-key keyboard is shipped + with 101 keys. Overseas versions have an additional key + sandwiched between the left Shift key and the Z key. This + additional key is identified by IBM (and in this table) as + "Key 45." + + [**] Keys and key combinations marked ** are used by the ROM BIOS + but do not put values into the keyboard buffer. + + [--] Keys and key combinations marked -- are ignored by the ROM + BIOS. + + + + +3. From "http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html": + + +INT 9 - Hardware Keyboard Make/Break Codes + + Key Make Break Key Make Break + + Backspace 0E 8E F1 3B BB + Caps Lock 3A BA F2 3C BC + Enter 1C 9C F3 3D BD + Esc 01 81 F4 3E BE + Left Alt 38 B8 F7 41 C1 + Left Ctrl 1D 9D F5 3F BF + Left Shift 2A AA F6 40 C0 + Num Lock 45 C5 F8 42 C2 + Right Shift 36 B6 F9 43 C3 + Scroll Lock 46 C6 F10 44 C4 + Space 39 B9 F11 57 D7 + Sys Req (AT) 54 D4 F12 58 D8 + Tab 0F 8F + + Keypad Keys Make Break + + Keypad 0 (Ins) 52 D2 + Keypad 1 (End) 4F CF + Keypad 2 (Down arrow) 50 D0 + Keypad 3 (PgDn) 51 D1 + Keypad 4 (Left arrow) 4B CB + Keypad 5 4C CC + Keypad 6 (Right arrow) 4D CD + Keypad 7 (Home) 47 C7 + Keypad 8 (Up arrow) 48 C8 + Keypad 9 (PgUp) 49 C9 + Keypad . (Del) 53 D3 + Keypad * (PrtSc) 37 B7 + Keypad - 4A CA + Keypad + 4E CE + + Key Make Break Key Make Break + + A 1E 9E N 31 B1 + B 30 B0 O 18 98 + C 2E AE P 19 99 + D 20 A0 Q 10 90 + E 12 92 R 13 93 + F 21 A1 S 1F 9F + G 22 A2 T 14 94 + H 23 A3 U 16 96 + I 17 97 V 2F AF + J 24 A4 W 11 91 + K 25 A5 X 2D AD + L 26 A6 Y 15 95 + M 32 B2 Z 2C AC + + Key Make Break Key Make Break + + 1 02 82 - 0C 8C + 2 03 83 = 0D 8D + 3 04 84 [ 1A 9A + 4 05 85 ] 1B 9B + 5 06 86 ; 27 A7 + 6 07 87 ' 28 A8 + 7 08 88 ` 29 A9 + 8 09 89 \ 2B AB + 9 0A 8A , 33 B3 + 0 0B 8B . 34 B4 + / 35 B5 + + +Enhanced Keyboard Keys (101/102 keys) + + Control Keys Make Break + + Alt-PrtSc (SysReq) 54 D4 + Ctrl-PrtSc E0 37 E0 B7 + Enter E0 1C E0 9C + PrtSc E0 2A E0 37 E0 B7 E0 AA + Right Alt E0 38 E0 B8 + Right Ctrl E0 1D E0 9D + Shift-PrtSc E0 37 E0 B7 + / E0 35 E0 B5 + Pause E1 1D 45 E1 9D C5 (not typematic) + Ctrl-Pause (Ctrl-Break) E0 46 E0 C6 (not typematic) + + - Keys marked as "not typematic" generate one stream of bytes + without corresponding break scan code bytes (actually the + break codes are part of the make code). + + + Normal Mode or + Shift w/Numlock + Key Make Break |----- Numlock on ------. + Make Break + Del E0 53 E0 D3 E0 2A E0 53 E0 D3 E0 AA + Down arrow E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA + End E0 4F E0 CF E0 2A E0 4F E0 CF E0 AA + Home E0 47 E0 C7 E0 2A E0 47 E0 C7 E0 AA + Ins E0 52 E0 D2 E0 2A E0 52 E0 D2 E0 AA + Left arrow E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA + PgDn E0 51 E0 D1 E0 2A E0 51 E0 D1 E0 AA + PgUp E0 49 E0 C9 E0 2A E0 49 E0 C9 E0 AA + Right arrow E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA + Up arrow E0 48 E0 C8 E0 2A E0 48 E0 C8 E0 AA + + Key |--Left Shift Pressed--. |--Right Shift Pressed--. + Make Break Make Break + Del E0 AA E0 53 E0 D3 E0 2A E0 B6 E0 53 E0 D3 E0 36 + Down arrow E0 AA E0 50 E0 D0 E0 2A E0 B6 E0 50 E0 D0 E0 36 + End E0 AA E0 4F E0 CF E0 2A E0 B6 E0 4F E0 CF E0 36 + Home E0 AA E0 47 E0 C7 E0 2A E0 B6 E0 47 E0 C7 E0 36 + Ins E0 AA E0 52 E0 D2 E0 2A E0 B6 E0 52 E0 D2 E0 36 + Left arrow E0 AA E0 4B E0 CB E0 2A E0 B6 E0 4B E0 CB E0 36 + PgDn E0 AA E0 51 E0 D1 E0 2A E0 B6 E0 51 E0 D1 E0 36 + PgUp E0 AA E0 49 E0 C9 E0 2A E0 B6 E0 49 E0 C9 E0 36 + Right arrow E0 AA E0 4D E0 CD E0 2A E0 B6 E0 4D E0 CD E0 36 + Up arrow E0 AA E0 48 E0 C8 E0 2A E0 B6 E0 48 E0 C8 E0 36 + / E0 AA E0 35 E0 B5 E0 2A E0 B6 E0 35 E0 B5 E0 36 + + + - The PS/2 models have three make/break scan code sets. The first + set matches the PC & XT make/break scan code set and is the one + listed here. Scan code sets are selected by writing the value F0 + to the keyboard via the 8042 (port 60h). The following is a brief + description of the scan code sets (see the PS/2 Technical Reference + manuals for more information on scan code sets 2 and 3): + + / set 1, each key has a base scan code. Some keys generate + extra scan codes to generate artificial shift states. This + is similar to the standard scan code set used on the PC and XT. + / set 2, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code). This scan code + set is available on the IBM AT also. + / set 3, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code) and no keys are + altered by Shift/Alt/Ctrl keys. + / typematic scan codes are the same as the make scan code + + - Some Tandy 1000's do not handle Alt key combinations when multiple + shift keys are pressed. The Alt-Shift-H combination loses the Alt. + - extended keys like (F11, F12) can only be read with systems that + have extended keyboard BIOS support (or INT 9 extensions); to + read these special keys on these systems INT 16,10 must be used + + +****************************************************************************** +*** GRLDR Error messages *** +****************************************************************************** + +1. Missing MBR-helper. + + The helper function in the sectors that immediately follow the MBR is + not present, or it has been erased by a virus or by Windows XP/Vista. + + Run the bootlace.com utility to fix the problem. + +2. Buggy BIOS! + + Your BIOS is too buggy. It even has no support for INT13/AH=8. + + No solution except flashing your BIOS. Buggy BIOSes will encounter + more and more problems with grub4dos in the future. + +3. This partition is NTFS but with unknown boot record. Please install +Microsoft NTFS boot sectors to this partition correctly, or create an +FAT12/16/32 partition and place the same copy of GRLDR and MENU.LST there. + + The boot record was changed or erased by Microsoft Windows XP Service + Pack 2. + + You may install the old boot record introduced with the original clean + Windows 2K/XP. As another solution, you may create an FAT partition + for your system, and copy GRLDR and your MENU.LST to its root dir. + + While the startup code of grldr might fail to load GRLDR in NTFS + partitions, it always successfully loads GRLDR in FAT partitions(and + even in ext2/ext3 partitions). + + Note that NTLDR only loads the startup code of grldr(i.e., the leading + 16 sectors of grldr), not the whole grldr file. + + Thus, C:\GRLDR must exist(here C: can be NTFS), since it is used for + BOOT.INI and NTLDR. If C: is NTFS, X:\GRLDR should exist as well, + where X: stands for a certain FAT partition. + + +****************************************************************************** +*** Known BIOS bugs *** +****************************************************************************** + +1. Some newer Dell machines have no int13/AH=43h support. You may encounter + failure when trying to write-access an emulated disk. + + Note: This bug is serious! The old "root+setup" installation method + (in real mode grub environment) uses INT13 to write the first sector + of stage2. It will fail for the buggy DELL machine when stage2 is + accessed with LBA mode. + +2. Some buggy BIOSes won't boot bootable.iso(See above).(qemu can boot it fine) + +3. Some newer Dell machines violently destroyed the interrupt vectors for + hardware IRQs and will hang the machine when running GRUB.EXE + from DOS. You may try again with BADGRUB.EXE. + +4. Reports say some BIOSes will function abnormally after GRUB.EXE is started + by kexec of Linux. Some machines reportedly hang. Some others + reportedly cannot access USB drives. + + +****************************************************************************** +*** Known Problems *** +****************************************************************************** + +1. Running GRUB.EXE from a DOS box of Windows 9x/Me could hang the + machine, especially for some systems with USB support. You may + encounter the same problem when running GRUB.EXE through KEXEC under + Linux. + +Note: You don't have to run GRUB.EXE from protected mode of Win9x, which + could hang the machine; Instead, you usually want to run GRUB.EXE + after you have done a "Restart the computer in MS-DOS mode", which + is safe enough. + +2. The default chainloader action will keep A20 on. Some buggy DOS XMS + memory managers could hang the machine. You may use the --disable-a20 + option in the chainloader line and try again. Anyway, you should avoid + using those buggy memory managers. + +3. THTF BIOS L4S5M Ver 1.1a(dated 2002-1-10) has a buggy int15 which + causes hang at the boot of a multi boot kernel(memdisk for example). + +4. A Chinese DOS system software, the TechWay SCS, will not work with + newer versions of GRUB.EXE. In general, TSRs that take antitracking + measures will not work with GRUB.EXE any more. + + +****************************************************************************** +*** List of binary files and their corresponding source files *** +****************************************************************************** + +binary file main source file other included source or binary files +------------- ---------------- ------------------------------------- + +bootlace.com bootlacestart.S bootlace.inc, grldrstart.S + +grldr grldrstart.S pre_stage2(binary, See note below) + +grldr.mbr mbrstart.S grldrstart.S + +grub.exe dosstart.S pre_stage2(binary, See note below) + +hmload.com hmloadstart.S + +----------------------------------------------------------------------------- + +Note: pre_stage2 is the main body of GNU GRUB and it is simply appended to +grldrstart/dosstart in binary format to form our grldr/grub.exe. + +Note: The GRUB file(WITHOUT .EXE suffix) is a static-linked ELF executable +program for Linux, normally called the GRUB Shell. The GRUB Shell is a boot- +manager, but not a boot-loader(the "boot" command won't work in GRUB Shell). +GRUB.EXE(with KEXEC) can be used as a bootloader running directly under Linux. + +****************************************************************************** +*** Memory Layout for Quiting to DOS from GRUB.EXE *** +****************************************************************************** + +The quit command is implemented to return to DOS in the instance that GRUB.EXE +is started off DOS. + +1. Before GRUB.EXE transfers control to pre_stage2, it will copy 640KB of +conventional memory to physical address 0x200000(i.e., 2MB), and write 4 long +integers immediately follows the backup copy of the conventional memory: + At 0x2A0000: 0x50554B42, it is the "BKUP" signature. + + At 0x2A0004: Gate A20 status under DOS: non-zero means A20 on; + zero means A20 off. Update: A20 always on, see below. + + At 0x2A0008: high word is boot-CS, low word is boot-IP. The quit + command uses this entry point to return to DOS. + + At 0x2A000C: CheckSum: the sum of all long integers in the memory + range from 0x200000 to 0x2A000F is 0. + +2. If the above memory structure is corrupted by a grub command, the quit +command will issue an error message and refuse to exit from grub. + +3. Because GRUB may corrupt extended memory, you should better avoid using +extended memory under DOS before running GRUB.EXE. + +4. Gate A20 will be enabled by GRUB.EXE. Hopefully this would hurt nothing. + + +****************************************************************************** +*** Memory usage in conventional/low memory area *** +****************************************************************************** + +1. boot.c, fsys_reiserfs.c: 8K below 0x68000. + +2. fsys_ext2fs.c, fsys_minix.c: 1K below 0x68000. + +3. fsys_jfs.c: 4K + 256 bytes below 0x68000. + +4. fsys_reiserfs.c: 202 bytes at 0x600. + +5. fsys_xfs.c: 188 bytes at 0x600. + +6. fsys_xfs.c: (logical block size) bytes below 0x68000. + +7. geometry tune: 0x50000 - 0x5ffff. + +****************************************************************************** +*** Command-line Length about GRUB.EXE *** +****************************************************************************** + +GRUB.EXE now can be started in CONFIG.SYS with the **DEVICE** command: + + DEVICE=grub.exe [--config-file="FILENAME_OR_COMMANDS"] + +1. If GRUB.EXE is invoked with DEVICE command and FILENAME_OR_COMMANDS is a +collection of some GRUB commands separated by semi-colon, then the length of +FILENAME_OR_COMMANDS can be nearly 4KB ----Supprise? But true! MS-DOS 7+ +even allows a much longer line, but 4KB seems enough for our use of GRUB.EXE. +This is very useful when we want to embed a big menu into the command line. +Note that GRLDR hasn't yet supported any command-line arguments. + +2. If GRUB.EXE is invoked with INSTALL command, the option length has a limit +of 80 characters(including the leading "--config-file=" part). An overflow may +hang up MS-DOS immediately. + +3. If GRUB.EXE is invoked with SHELL command, the option length has a limit of +126 characters(including the leading "--config-file=" part). Overflow won't +hang up MS-DOS, but the line will be cut short. This limit is the same as that +in the console-DOS-prompt or in a BAT file. + +4. The DOS editor EDIT does not allow to create a line of 4KB long. So use +another editor, for example, vi for Linux, please. + +5. The DEVICE=GRUB.EXE line can be used together with other DEVICE commands +such as DEVICE=HIMEM.SYS and DEVICE=EMM386.EXE. The GRUB.EXE line should +occur before the EMM386.EXE line in order to avoid the rejection by EMM386. +Update: Since 0.4.2, GRUB.EXE works well even after EMM386.EXE is loaded. + +6. In any case mentioned above, you can return back to DOS by quit command. + +7. Memory usage about command-line menu: The 4KB command-line menu starts at +physical address 0x0800 and ends at 0x17FF. + +****************************************************************************** +*** New Syntax for the DEFAULT/SAVEDEFAULT Commands *** +****************************************************************************** + +In addition to the original usage of "default NUM" and "default saved", now +there is a new usage of "default FILE", like this: + + default (hd0,0)/default + +Note that FILE must have a valid DEFAULT file format. A sample DEFAULT file +is included in the release. You may copy it to wherever you like, but you +should avoid modifying its content manually. The DEFAULT file may be used +in this way: + +(1) First, you should copy a default file with valid format to somewhere in +your operating system. + +(2) Secondly, you should use the "default FILE" command of GRUB to announce +the use of FILE as our new default file for being written by "savedefault". + +(3) Then, you may use "savedefault" command to save the desired entry number +into this new default file. + +(4) OK, at next boot, you may read the saved entry number by using the same +"default FILE" command as mentioned in above (2). + +And the SAVEDEFAULT command now accept an options `--wait=T', like this: + + savedefault --wait=5 + +If `--wait=T' is specified and T is non-zero, savedefault will prompt +the user with a message just before it writes to disk. The write operation +will be cancelled in T seconds if the `Y' key was not pressed. + +Here is a sample menu.lst file: + +#--------------------begin menu.lst--------------------------------------- +color black/cyan yellow/cyan +timeout 30 +default /default + +title find and load NTLDR of Windows NT/2K/XP +find --set-root /ntldr +chainloader /ntldr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback 2 +find --set-root /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +write 0x7C07 0x00736E6F +savedefault --wait=2 + +title find and load IO.SYS of Windows 9x/Me +find --set-root /io.sys +chainloader /io.sys +savedefault --wait=2 + +title floppy (fd0) +chainloader (fd0)+1 +rootnoverify (fd0) +savedefault --wait=2 + +title find and boot Linux with menu.lst already installed +find --set-root /sbin/init +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title find and boot Mandriva with menu.lst already installed +find --set-root /etc/mandriva-release +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title back to dos +savedefault --wait=2 +quit + +title commandline +savedefault --wait=2 +commandline + +title reboot +savedefault --wait=2 +reboot + +title halt +savedefault --wait=2 +halt +#--------------------end menu.lst--------------------------------------- + +Note 1: The file DEFAULT must exist and have a proper format as stated above. + Or else, the default/savedefault commands won't function well. + +Note 2: The file DEFAULT which is in the same dir as a certain MENU.LST file + is called associated with the MENU.LST file. + +Note 3: The associated DEFAULT file will take effect automatically if there + are no `default' commands present. + +Note 4: Just before a menu file gains control(e.g., it is the associated + MENU.LST of a GRLDR file, or it was specified via + `grub.exe --config-file=(DEVICE)/PATH/YOUR_MENU_FILE', or it was + specified by the `configfile' command of grub), its associated + DEFAULT file will be used if present, until an explicit `default' + command is encountered. + +****************************************************************************** +*** The New `cdrom' Command Syntax *** +****************************************************************************** + +1. Initialize the ATAPI CDROM devices: + + grub> cdrom --init + + This will display the number of atapi cdroms found: atapi_dev_count + +2. Stop the ATAPI CDROM devices: + + grub> cdrom --stop + + This will set atapi_dev_count to 0. + +3. Add IO ports for searching the atapi cdrom devices. For example: + + grub> cdrom --add-io-ports=0x03F601F0 + +After running `cdrom --init' and `map --hook', the cdroms can be accessed +through devices (cd0), (cd1), ... + +Note 1: If the system does not fully support the ATAPI CD-ROM specifications, + you will encounter failure when trying to access the (cdX) devices. + +Note 2: After doing a `cdrom --stop', you should do a `map --unhook'. Of + course you may `map --hook' again if there are mapped drives. + +Note 3: After adding IO ports, you should do a `map --unhook' followed by a + `cdrom --init' and then followed by a `map --hook'. + + By default, these ports are used for searching cdroms(so they needn't + be added): + + 0x03F601F0, 0x03760170, 0x02F600F0, + 0x03860180, 0x6F006B00, 0x77007300. + +Note 4: The BIOS might have offered a cdrom interface. It would be (cd). After + `cdrom --init' and `map --hook', we might have our (cd0), (cd1), ... + available. It is likely that one of them could access the same media + as the BIOS-offered (cd). + +Note 5: You may access the (cd) and (cdX)'es in the blocklist way. Example: + + cat --hex (cd0)16+2 + + The cdrom sectors are big sectors with a size of 2048 bytes. + +Note 6: The iso9660 filesystem driver has Rock-Ridge extension support, but + has no Joliet extension support. So you may encounter failure when + you attempt to read files on a Joliet CD. + +Note 7: The (cd) or (cdX)'es can be booted now. Examples: + + chainloader (cd) + boot + + chainloader (cd0) + boot + + chainloader (cd1) + boot + + You should already have access to the CD sectors before you can + chainload it. + +****************************************************************************** +*** About the New `setvbe' Command *** +****************************************************************************** + +Gerardo Richarte contributed the `setvbe' code and the following comment: + + New command is `setvbe', and can be used to change the video mode + before executing the kernel. + + For example, you can do + + setvbe 1024x768x32 + + this will scan the list of available modes and set it, and + automatically append a `video=' option to each subsequent kernel + command-line. The appended `video=' option is like this: + + video=1024x768x32@0xf0000000,4096 + + where 0xf0000000 is the video framebuffer address as reported by vbe, + and 4096 is the size of a scanline in bytes (also as reported by vbe). + + This is really useful if you want to give some graphics support to your + OS, but you don't want to implement any video functionality other than + writing a pixel to video memory. + + +****************************************************************************** +*** About the DOS utility `hmload' *** +****************************************************************************** + +This program was written by John Cobb (Queen Mary, University of London). + +John Cobb's note: + + To make use of the ram drive feature I wrote a program `hmload' to load + an arbitrary file to an arbitrary address in high memory. The program + is not very sophisticated and relies on XMS to turn on the A20 line. + (Also one must be very careful to steer clear of any areas of memory + already in use). + + Under Linux we generated a disk image `dskimg' (with the kernel and + Initrd and a partition table). + + Using this our boot procedure looked something like this: + + hmload -fdskimg -a128 + fixrb + + grub + + map --ram-drive=0x81 + map --rd-base=0x8000000 + map --rd-size=0x400000 + root (rd,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + boot + +See http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ for details. + +Update 2007-12-05: + + Now the MAP command can handle gzipped (rd) image. One can use this + feature with the hmload utility. For example, + + step 1. Load the gzipped image under DOS at a relatively low address: + + hmload -fdskimg.gz -a16 + + step 2. Unload network drivers. + + step 3. Run GRUB.EXE. + + step 4. At the grub prompt, run these commands: + + map --rd-base=0x1000000 # set rd-base address to be 16M + map --rd-size= + map (rd)+1 (hd0) # This will decompress (rd) and place + # the decompressed image at the top end + # of the extended memory. The (rd)+1 + # here has special meaning and stands + # for the whole (rd) device. You must + # use (rd)+1 instead of (rd). + map --hook + root (hd0,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + map --unhook + map (hd0) (hd0) # Delete the map; this is needed. + boot + + +****************************************************************************** +*** Notes on the use of stack *** +****************************************************************************** + +The protected-mode and real-mode stack are merged at physical address 0x2000. + +All functions should use at most 2K stack space(0x1800-0x2000). So each +subfunction should use as little stack as possible to avoid stack-overflow. + +Don't use recursive functions because they could expend too much stack space. + +The original protected mode stack at 0x68000(expand-down) is free now and can +be reused for any purposes. + + +****************************************************************************** +*** A bug was found in the CDROM driver *** +****************************************************************************** + +It seems the cdrom must be connected as the master device of an IDE controller. + +If cdrom is slave, the driver will fail to read the cdrom sectors. Hope someone + +could fix this problem. + + +****************************************************************************** +*** BIOS and the (cd) drive *** +****************************************************************************** + +When BIOS boots a no-emulation-mode bootable CD-ROM, it allocates a BIOS drive +number to the CD. If the boot image of the CD-ROM is grldr or stage2_eltorito, +then GRUB can access the CD-ROM media through the drive number allocated by +BIOS. The device name of the CD-ROM is (cd). + +BIOS can allocate a BIOS drive number to a no-emulation-mode CDROM even when +the CDROM is not bootable. QEMU has done so. At boot time, GRUB4DOS will +search drives 0x80-0xFF for a possible no-emulation-mode CDROM drive allocated +by BIOS. So if BIOS offered a CDROM interface of int13 EBIOS functions 41h-4Eh, +then the (cd) device will be automatically available in GRUB4DOS. + + +****************************************************************************** +*** The way of disk emulation changed greatly *** +****************************************************************************** + +The way of disk emulation has changed greatly since 0.4.2 final. Please don't +mix newer versions with older versions when disk emulation features are used. + +The newer versions won't automatically unhook emulations established in a +previous grub4dos environment. The GRUB.EXE of an older version will +automatically dismiss emulations established earlier, before transferring +control to the main grub program(i.e., pre_stage2). + + +****************************************************************************** +*** FreeDOS EMM386 v2.26 (2006-08-27) VCPI problem *** +****************************************************************************** + +The VCPI function "AX=DE0Ch - Switch From Protected Mode to V86 Mode" of +FreeDOS EMM386 v2.26 was not implemented properly(it always hangs). As an +alternative, you can use Microsoft's EMM386 instead. + +Even while emm386 is running, grub.exe can be started. But if you try to quit +to DOS from grub4dos by using the `quit' command, the VCPI function DE0C will +be called. If EMM386 is of Microsoft, everything goes ok. If EMM386 is of +FreeDOS, the machine will hang. + + +****************************************************************************** +*** New options for map were added *** +****************************************************************************** + +Along with 0.4.2 final, there are two new options for the map command. They +are --safe-mbr-hook=SMH and --int13-scheme=SCH. Both are related with disk +emulation for use(as smoothly as possible) in the Win9x environment. + +SMH can take either of the two values 0 and 1. By default, SMH is 1. If you +encountered problems of disk emulation under Win9x, you may insert a line of + + map --safe-mbr-hook=0 + +before the `boot' command and try again. + +Also SCH may take either 0 or 1 at present. By default, SCH is 1. If you +encountered disk emulation problems under Win9x, you may insert a line of + + map --int13-scheme=0 + +before the `boot' command and try again. + +Note by the way. Like --safe-mbr-hook and --int13-scheme, the MAP command has +a few other options that are used for setting global variables. They are here: + + map --floppies=M + +M can be 0, 1, or 2. MAP will set a proper value at 0040:0010 by using M. + + map --harddrives=N + +N can be between 0 and 127(inclusive). MAP will set 0040:0075 to N. + + map --memdisk-raw=RAW + +RAW default to 1. If RAW=0, `int15/ah=87h' will be used to access memdrives. + + map --ram-drive=RD + +RD default to 0x7F which is a floppy. If the RAM DRIVE is a hard drive image +(with partition table in the first sector), you should set RD >= 0x80 and RD +< 0xA0.If the RAM DRIVE is a cdrom image, you should set 0xA0<= RD <= 0xff. + + map --rd-base=ADDR + + map --rd-size=SIZE + +ADDR specifies the physical base address of the ramdisk image. SIZE specifies +the size in bytes of the ramdisk image. ADDR default to 0. SIZE is also default +to 0, but a size of 0 means 4GB, not a zero-long disk. The RAM DRIVE can be +accessed in the GRUB environment using the (rd) device. + + +****************************************************************************** +*** About the new map option --in-situ *** +****************************************************************************** + +--in-situ is used with hard drive images or hardrive partitions. With an +in-situ map, we can typically use a logical partition as a primary partition. + +In-situ map is a whole drive map. It only virtualize the partition table and +the number of hidden sectors in the BPB of the DOS Boot Record. + +While disk emulation may encounter various problems with win9x, the in-situ map +works fine with win9x. + +Note that --in-situ will not change the real partition table. + +Example: + + map --in-situ (hd0,4)+1 (hd0) + + +****************************************************************************** +*** The PARTNEW Command Syntax *** +****************************************************************************** + +Besides the mappings in the above section, you may instead choose to create a +new primary partition with the PARTNEW command. PARTNEW can generate a primary +partition entry (in the partition table) for a logical partition. + +For example, + + partnew (hd0,3) 0x07 (hd0,4)+1 + +where the file (hd0,4)+1 stands for the whole partition (hd0,4). This command +will create a new primary partition (hd0,3) whose type is 0x07 and whose +contents/data is the same as that of the logical partition (hd0,4). + +Just like a whole logical partition, a contiguous partition image file can +also be used with PARTNEW: + + partnew (hd0,3) 0x00 (hd0,0)/my_partition.img + +The type 0x00 indicates a type-auto-detection of the image MY_PARTITION.IMG. +The above command will create a new primary partition (hd0,3) with a proper +type and with contents/data being exactly that of the contiguous file +(hd0,0)/my_partition.img. + +PARTNEW will automatically correct the "hidden sectors" in the BPB and the +modification will be permanent. And PARTNEW modifies the partition table +permanently. + +In addition to creating new partition entries, PARTNEW can also be used to +delete(erase, or wipe) a primary partition entry. For example, + + partnew (hd0,3) 0 0 0 + +which will empty the last entry in the partition table in MBR. Generally, +you should use the form of "partnew PARTITION 0 0 0" to erase the entry. +Note that only the entry would be erased, and the data stored in the partition +will not be touched. + +****************************************************************************** +*** Newly implemented operators `&&' and `||' *** +****************************************************************************** + +This implementation is very simple. It does not handle operator nesting. + +Usage of `&&': + + command1 && command2 + +Description: + + If command1 returns true, then command2 will be executed. + +Usage of `||': + + command1 || command2 + +Description: + + If command1 returns false, then command2 will be executed. + +Examples: + + is64bit && default 0 + is64bit || default 1 + +2010-11-04 + Add new operators "|", ">" , ">>" +Usage: + command1 | command2 + + command > file + or + command >> file + +Node: The file must already exist, GRUB4DOS can not create file or change the file size. +Examples: + cat /test.txt > /abcd.txt + + +****************************************************************************** +*** Three new commands is64bit, errnum and errorcheck *** +****************************************************************************** + +is64bit and errnum retrieve the value of is64bit and errnum respectively. + +errorcheck controls whether or not the error will be handled. By default, +errorcheck is on, and menu script execution will stop on error. If errorcheck +is off, the script will continue to execute upto a boot command. A boot command +will turn the errorcheck on. + + +****************************************************************************** +*** Use numeric keys to select a menu entry *** +****************************************************************************** + +If, for example, you intend to goto entry #25, you may press 2 followed by 5. + + +****************************************************************************** +*** Use the INSERT key to debug step by step at startup *** +****************************************************************************** + +Some buggy machines could fail to enter grub4dos environment. They might hang +or reboot unexpectedly. Press INSERT as quickly as possible on startup, and +you can get a chance to single-step the boot process and see how far it can +go, and then report bugs. + + +****************************************************************************** +*** The debug command syntax has been changed *** +****************************************************************************** + +The DEBUG command now can be used to control the verbosity of command output: + + debug [ on | off | normal | status | INTEGER ] + +0 or off for silent +1 or normal for normal +2 to 0x7FFFFFFF or on for verbose + + +****************************************************************************** +*** GRUB4DOS and Windows Vista *** +****************************************************************************** + +First, use the following command to create a boot entry: + + bcdedit /create /d "GRUB for DOS" /application bootsector + +The result will look like this: + +The entry {05d33150-3fde-11dc-a457-00021cf82fb0} was successfully created. + +The long string {05d33150-3fde-11dc-a457-00021cf82fb0} is the id for this +entry. + +Then, use the following commands to set boot parameters: + + bcdedit /set {id} device boot + bcdedit /set {id} path \grldr.mbr + bcdedit /displayorder {id} /addlast + +Please replace {id} with the actual id returned from the previous command. + +Finally, copy GRLDR.MBR to C:\ or wherever your boot drive is, and copy GRLDR +and menu.lst to the root directory of any FAT16/FAT32/EXT2/NTFS partition. + +Note: A boot partition should be the active primary partition with BOOTMGR + inside. The `device boot' indicates grldr.mbr should be in the boot + partition. + +Lianjiang has written down a script to automate the tasks: + + @echo off + rem by lianjiang + cls + echo. + echo Please run as administrator + echo. + pause + set gname=GRUB for DOS + set vid= + set timeout=5 + bcdedit >bcdtemp.txt + type bcdtemp.txt | find "\grldr.mbr" >nul && echo. && echo BCD entry existing, no need to install. && pause && goto exit + bcdedit /export "Bcd_Backup" >nul + bcdedit /create /d "%gname%" /application bootsector >vid.ini + for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do ( + set vida=%%i + ) + for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do ( + set vid={%%i} + ) + echo %vid%>vid.ini + bcdedit /set %vid% device boot >nul + bcdedit /set %vid% path \grldr.mbr >nul + bcdedit /displayorder %vid% /addlast >nul + bcdedit /timeout %timeout% >nul + if exist grldr.mbr copy grldr.mbr %systemdrive%\ /y && goto exit + echo. + echo Please copy grldr.mbr to %systemdrive%\ + echo. + pause + :exit + del bcdtemp.txt >nul +------------------------------------------------------------------- +Update: Fujianabc pointed out that + + bcdedit /set %vid% device boot >nul + +should be changed to + + bcdedit /set %vid% device partition=%SystemDrive% >nul +------------------------------------------------------------------- + +You still need to copy grldr yourself. + +Notice: It's possible to modify the BCD entry from a different OS, you just +need to specify the location of BCD: + + bcdedit /store D:\boot\BCD ... + +Notice: These commands need elevated privileges, they should be used inside +cmd.exe which is started with "Run as administrator". + +Notice: People has reported that some version of Vista doesn't support +creating file in C:\ with no extension, even with administrator privileges. +This means grldr can't be placed in C:\. You can solve this by either copy +grldr to another partition, or rename grldr to something like grub.bin. Please +see the following section on how to do this. + + +****************************************************************************** +*** How to rename grldr *** +****************************************************************************** + +grldr and grldr.mbr use internal boot file name to decide which file to load, +so if you want to change the name, you must also change the embeded setting. +You can do this with the help of grubinst, which can be downloaded at: + +http://download.gna.org/grubutil/ + +grubinst can generate customized grldr.mbr: + + grubinst -o -b=mygrldr C:\mygrldr.mbr + +grubinst can also edit existing grldr/grldr.mbr: + + grubinst -e -b=mygrldr C:\mygrldr + + grubinst -e -b=mygrldr C:\mygrldr.mbr + +In this case, you must use a grubinst that is compatible with the version of +grub4dos, otherwise the edit will fail. + +So, in order to load mygrldr instead of grldr, you can use one of the +following methods: + +1. Use customized grldr.mbr to load mygrldr. In this case, you need to change +the embeded boot file name in grldr.mbr. The name of grldr.mbr can be changed +at will. + +2. Use mygrldr directly. In this case, you need to change the embeded boot +file name in mygrldr to match its new name. + +Notice: The boot file name must conform to the 8.3 naming convention. + + +****************************************************************************** +*** PXE device *** +****************************************************************************** + +If PXE service is found at startup, GRUB4DOS will create a virtual device +(pd), through which files from the tftp server can be accessed. You can setup +a diskless boot environment using the following steps: + +Client side + +You need to boot from PXE ROM. + +Server side + +You need to configure a dhcp server and a tftp server. In the dhcp server, use +grldr as boot file. + +You may also want to load a different menu.lst for different client. GRUB4DOS +will scan the following location for configuration file: + + [/mybootdir]/menu.lst + [/mybootdir]/menu.lst/01-88-99-AA-BB-CC-DD + [/mybootdir]/menu.lst/C000025B + [/mybootdir]/menu.lst/C000025 + [/mybootdir]/menu.lst/C00002 + [/mybootdir]/menu.lst/C0000 + [/mybootdir]/menu.lst/C000 + [/mybootdir]/menu.lst/C00 + [/mybootdir]/menu.lst/C0 + [/mybootdir]/menu.lst/C + [/mybootdir]/menu.lst/default + +Here, we assume the network card mac for the client machine is +88:99:AA:BB:CC:DD, and the ip address is 192.0.2.91 (C000025B). /mybootdir is +the directory of the boot file, for example, if boot file is /tftp/grldr, then +mybootdir=tftp. + +If none of the above files is present, grldr will use its embeded menu.lst. + +This is a menu.lst to illustrate how to use files from the tftp server. + + title Create ramdisk using map + map --mem (pd)/floppy.img (fd0) + map --hook + rootnoverify (fd0) + chainloader (fd0)+1 + + title Create ramdisk using memdisk + kernel (pd)/memdisk + initrd (pd)/floppy.img + +You can see that the menu.lst is very similar to normal disk boot, you just +need to replace device like (hd0,0) with (pd). + +There are some differences between disk device and pxe device: + +1. You can't list files in the pxe device. + +2. The blocklist command will not work with a file in the pxe device. + +3. You must use --mem option if you want to map a file in the pxe device. + +When you use chainloader to load file from the pxe device, there is a option +you can use: + + chainloader --raw (pd)/BOOT_FILE + +Option --raw works just like --force, but it load file in one go. This can +improve performance in some situation. + +You can use the pxe command to control the pxe device. + +1. pxe + + If used without any parameter, pxe command will display current + settings. + +2. pxe blksize N + + Set the packet size for tftp transmission. Minimum value is 512, + maximum value is 1432. This parameter is used primarily for very old + tftp server where packet larger than 512 byte is not supported. + +3. pxe basedir /dir + + Set the base directory for files in the tftp server. If + + pxe basedir /tftp + + then all files in the pxe device is related to directory /tftp, for + example, (pd)/aa.img correspond to /tftp/aa.img in the server. + + The default value of base directory is the directory of the boot file, + for example, if boot file is /tftp/grldr, then default base directory + is /tftp. + +4. pxe keep + + Keep the PXE stack. The default behaviour of GRUB4DOS is to unload + the PXE stack just before it exits. + +5. pxe unload + + Unload the PXE stack immediately. + + + +****************************************************************************** +*** New Feature of Relative Path Support *** +****************************************************************************** + +Use the `root' or `rootnoverify' command to specify the `working directory'. + +For example: + + root (hd0,0)/boot/grub + +This specifies that the working dir is (hd0,0)/boot/grub. So all subsequent +filenames of the form "/..." will actually refer to (hd0,0)/boot/grub/... + +That is to say: + + cat /menu.lst + +will be equivalent to + + cat (hd0,0)/boot/grub/menu.lst + + + +****************************************************************************** +*** Notation For The Current Root Device *** +****************************************************************************** + + +The notation `()' can be used to access the current root device. You may use +`find --set-root ...' to set the current root device, but the find command +does not set the `working dir' of the root device. In this case you should +use `()' to set the working dir after the find command: + + root ()/boot/grub + +Update 2008-05-01: + + FIND can also set the `working directory' now. For example: + + find --set-root=/tmp /boot/grub/menu.lst + + It is equivalent to this pair of commands: + + find --set-root /boot/grub/menu.lst + root ()/tmp + + +****************************************************************************** +*** The new map option --a20-keep-on *** +****************************************************************************** + + +Along with 0.4.3 final, map has a new option --a20-keep-on which is related to +A20 control after a memdrive sector access. Usage: + + map --a20-keep-on=0 + +It should be used before the "map --hook" command. + +By default, A20 will be always on after an RAM INT13 sector access. If +"map --a20-keep-on=0" is used, the A20 status after the INT13 call will be the +same as that before the INT13 call. + + +****************************************************************************** +*** The CDROM emulation (virtualization) *** +****************************************************************************** + +The CDROM emulation is sometimes called ISO emulation. Here is an example: + + map (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +if myiso.iso is not contiguous and you have enough memory, add a --mem option: + + map --mem (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +Note: (hd32) is a grub drive number equivalent to (0xA0). If a virtual drive is +specified with a drive number greater than or equal to 0xA0, then it will be +treated as a cdrom (i.e., with 2048-byte big sectors). + +Like normal disk emulations, the CDROM emulation also (mainly) works with +real-mode OSes. After a protected-mode OS kernel (such as +WinNT/2K/XP/VISTA/LINUX) gains control, the OS would have no ability to access +the virtual CDROM through BIOS int13. + +DOS/Win9x users may google for ELTORITO.SYS and use it in CONFIG.SYS as a +device driver for the virtual cdrom. + +Example usage of eltorito.sys in CONFIG.SYS: + + device=eltorito.sys /D:oemcd001 + +Corresponding MSCDEX command which can be placed in AUTOEXEC.BAT: + + MSCDEX /D:oemcd001 /L:D + + +Due to some bugs found in eltorito.sys, the driver could fail to load. If you +encounter such problems, then you may replace (hd32) with (0xFF) for the +virtual cdrom drive number and try again. + + +****************************************************************************** +*** The New Command CHECKRANGE *** +****************************************************************************** + +Checkrange checks whether or not the return value of a command is in the +specified range or ranges. + +Usage: checkrange RANGE COMMAND + +Here are some examples for RANGE: + + 3 is a range containing only the number 3 + 3:3 is equivalent to 3 + 3:8 is a range containing the numbers 3, 4, 5, 6, 7, 8 + 3,4,5,6,7,8 is equivalent to 3:8 + 3:5,6:8 is also equivalent to 3:8 + 3,4:7,8 is also equivalent to 3:8 + +Note: You should not insert spaces into a range. + +Here is an example showing where the checkrange can be used: + + checkrange 0x05,0x0F,0x85 parttype (hd0,1) || hide (hd0,1) + +which means: if (hd0,1) is not an extended partition, then hide it. + + +****************************************************************************** +*** The New Command TPM *** +****************************************************************************** + +The "tpm --init" uses 512-byte data at 0000:7C00 as buffer to initialise TPM. + +Before you boot VISTA's BOOTMGR, you might have to use the "tpm --init" +command on some machines. Normally you want to issue the "tpm --init" command +after a CHAINLOADER command. + + +****************************************************************************** +*** Delimitors or comments between titles *** +****************************************************************************** + +It is possible to use titles as delimitors or comments. A title(or menu item) +is called unbootable if all of its menu commands are not boot-sensitive. + +The following commands are boot-sensitive(and others are not boot-sensitive): + + boot + bootp + chainloader + configfile + embed + commandline + halt + install + kernel + pxe + quit + reboot + setup + +An unbootable title will be skipped when the user presses the Up Arrow or Down +Arrow keys. Even the unbootable menu item can get accessed(and executed) by +using the Left Arrow and/or Right Arrow keys. Examples: + + title This is an UNBOOTABLE entry(so this line is also a comment) + pause --wait=0 This title is a comment. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + help root + help chainloader + help parttype + clear + title ------------------------------------------------------------ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + clear + help + help boot + title ============================================================ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + clear + help pause + title ************************************************************ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help kernel + help + clear + +Note: An unbootable menu item must contain at least one command. If there +are no commands for a title, the title will be simply discarded and disappear. + + +****************************************************************************** +*** Bifurcate drives *** +****************************************************************************** + +Some machines apply different actions to a drive between CHS and LBA mode. +When you read sectors using standard BIOS call int13/AH=02h, you might find +out the drive is a floppy. But when you read sectors using extended BIOS +call(EBIOS) int13/AH=42h, you could know the drive is a cdrom. Such a drive +is called bifurcate. + +A bifurcate drive can have two drive numbers: one is the normal BIOS drive +number between 00 and FF in hexa, and this drive uses only CHS mode disk +access(standard BIOS int13/AH=02h); the other is the normal BIOS drive number +(Bitwise) OR'ed by 0x100(i.e., 256 in decimal), and this drive uses only +LBA mode disk access(EBIOS int13/AH=42h). For example, if the drive 0x00 +(i.e., the first floppy) is bifurcate, then the drive (0x00) uses CHS mode +to access its sectors, and the drive (0x100) uses LBA (meaning EBIOS) mode +to access its sectors. + +The geometry command can report the disk access mode for bifurcate drives as +BIF instead of the conventional CHS or LBA. + +Known bifurcate drives. Virtual PC and some real machines are found to create +a bifurcate floppy drive when they boot from a floppy-emulation mode bootable +cdrom. The "geometry (fd0)" will show + + drive 0x00(BIF): C/H/S=...Sector Count/Size=.../512 + +and "geometry (0x100)" will show + + drive 0x100(BIF): C/H/S=...Sector Count/Size=.../2048 + +Actually (0x100) can access the whole cdrom, you may "ls (0x100)/" and find +your files on the cdrom(not the files inside the booted floppy image). Of +course "ls (fd0)/" will list the files inside the booted floppy image. + +Note that only some (real or virtual) machines have this action, others +will not produce bifurcate drives. + + +****************************************************************************** +*** GRLDR as PXE boot file *** +****************************************************************************** + +GRLDR can be used as the PXE boot file on a remote/network server. The (pd) +device is used to access files on the server. When GRLDR is booted through +network, it will use its preset menu as the config file. However, you may use +a "pxe detect" command, which acts this way: + + * First, it will search for the config file "menu.lst" in the same dir as + grldr. + + * Second, it will search for the config file using the hardware type (using + its ARP type code) and address, all in hexadecimal with dash separators; + for example, for an Ethernet (ARP type 1) with address 88:99:AA:BB:CC:DD + it would search for the filename 01-88-99-AA-BB-CC-DD. + + * Next, it will search for the config file using its own IP address in + upper case hexadecimal, e.g. 192.0.2.91 -> C000025B. If that file is not + found, it will remove one hex digit and try again. At last, it will try + looking for a file named default (in lower case). As an example, if the + boot file name is /mybootdir/grldr, the Ethernet MAC address is + 88:99:AA:BB:CC:DD and the IP address 192.0.2.91, it will try following + files (in that order): + + /mybootdir/menu.lst + /mybootdir/menu/01-88-99-AA-BB-CC-DD + /mybootdir/menu/C000025B + /mybootdir/menu/C000025 + /mybootdir/menu/C00002 + /mybootdir/menu/C0000 + /mybootdir/menu/C000 + /mybootdir/menu/C00 + /mybootdir/menu/C0 + /mybootdir/menu/C + /mybootdir/menu/default + +You cannot directly map an image file on (pd). You must map it in memory using +the --mem option. For example, + + map --mem (pd)/images/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + boot + +One more example, + + map --mem (pd)/images/cdimage.iso (0xff) + map --hook + chainloader (0xff) + boot + + +****************************************************************************** +*** New program badgrub.exe *** +****************************************************************************** + +The new program badgrub.exe is intended to serve 'bad' machines(typically some +DELL models) that cannot run the normal grub.exe. + + +****************************************************************************** +*** Conditional find *** +****************************************************************************** + +The new find syntax allows to find a device conditionally. + + find [OPTIONS] [FILENAME] [CONDITION] + +CONDITION is a normal grub command which returns TRUE or FALSE. + +OPTIONS: + --set-root set the current root device. + --set-root=DIR set current root device and working directory to DIR. + please also see "Notation For The Current Root Device". + --ignore-cd skip search on (cd). + --ignore-floppies bypass all floppies. + --devices=DEVLIST specify the search devices and order. + DEVLIST u->(ud) + n->(nd) + p->(pd) + h->(hdx) + c->(cd) + f->(fdx) + default: upnhcf + + Example 1: + + find + + This will list all partitions, all floppies and the (cd). + + Example 2: + + find +1 + + This will list all devices with a known filesystem. + + Example 3: + + find checkrange 0xAF parttype + + This will list all partitions with ID=0xAF. + + Example 4: + + find /ntldr checkrange 0x07 parttype + + This will list all partitions with ID=0x07 and existing /ntldr. + + Example 5: + find --set-root /ntldr + This will set the first device it finds to current root device. + + Example 6: + find --set-root --devices=h /bootmgr + Same of Example 5.but search on hard disk only. + + Example 7: + find --set-root --devices=h makeactive --status + This will set current root device to first active partition. + +****************************************************************************** +*** How to build grldr boot images *** +****************************************************************************** + +1. build 1.44M floppy image ext2grldr.img + + dd if=/dev/zero of=ext2grldr.img bs=512 count=2880 + mke2fs ext2grldr.img + mkdir ext2tmp + mount -o loop ext2grldr.img ext2tmp + cp default ext2tmp + cp menu.lst ext2tmp + cp grldr ext2tmp + umount ext2tmp + bootlace.com --floppy --chs --sectors-per-track=18 --heads=2 --start-sector=0 --total-sectors=2880 ext2grldr.img + +2. build 1.44M floppy image fat12grldr.img + + dd if=/dev/zero of=fat12grldr.img bs=512 count=2880 + mkdosfs fat12grldr.img + mkdir fat12tmp + mount -o loop fat12grldr.img fat12tmp + cp default fat12tmp + cp menu.lst fat12tmp + cp grldr fat12tmp + umount fat12tmp + bootlace.com --floppy --chs fat12grldr.img + +3. build iso9660 CDROM image grldr.iso + + mkdir iso_root + cp grldr iso_root + cp menu.lst iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + +****************************************************************************** +*** Use bootlace.com to install partition boot record *** +****************************************************************************** + +Since bootlace.com has not implemented the --install-partition option, you +need to use the already implemented --floppy=PartitionNumber option instead. + +Hear is a way you might want to follow: + +Step 1. Get the boot sectors of the partition and save to a file MYPART.TMP. + For NTFS, you need to get the beginning 16 sectors. For other type of + filesystems, you only need to get one sector, but getting more sectors + is also ok. + +Step 2. Run this: + + bootlace.com --floppy=Y --sectors-per-track=S --heads=H --start-sector=B --total-sectors=C --vfat --ext2 --ntfs MYPART.TMP + + where we suppose MYPART.TMP is for (hdX,Y) and the partition number Y + should be specified as in the --floppy=Y option. + + Note that for FAT12/16/32/NTFS partitions, you can omit these options: + + --sectors-per-track, --heads, --start-sector, --total-sectors, + --vfat and --ext2. + + For NTFS partitions, you must specify --ntfs option. + + For ext2 partitions, you can omit --vfat, --ntfs and --ext2 options, + but other options should be specified. + +Step 3. Put MYPART.TMP back on to the boot sector(s) of your original partition + (hdX,Y). + + +Note: Only a few file systems(FAT12/16/32/NTFS/ext2/ext3) are supported by now. + +Note2: Under Linux you may directly write the partition. That is to say, Step + 1 and Step 3 are not needed. Simply use its device name instead of + MYPART.TMP. + +Note3: grubinst has the feature of installing grldr boot code onto a + partition boot area. + +****************************************************************************** +*** Use a single key to select menu item *** +****************************************************************************** + +Some machines have a simplified keyboard. The keyborad might have only the +number keys 0 .. 9 plus a few other keys. When the menu displayed, the user +can strike a key for 8 times. When the menu handler detects the continuous +single keypress, it will assume the user want to use this key to select a menu +item and boot. This single key will act as the RIGHT-ARROW key for the user to +select a menu item. And 5 seconds later after the user stops the keypress, +the selected menu item will automatically boot. Any normal keys can be used as +a single key for this purpose, except for a few functional keys like b, e, +Enter, etc. Once another key is pressed, the feature of Single-Key-Selection +will disappear immediately. + + +****************************************************************************** +*** Parameter file for bootlace running under DOS *** +****************************************************************************** + +You may move all or part of the command-line arguments into a file. The file +can have multi lines. Just like SPACEs and TABs, the CRs and LFs can also +delimit the commandline arguments in the parameter file. + +Example: + + bootlace < my_parafile + bootlace --read-only my_mbr < my_other_options + +Note: Pipes do not work. You have to use the input-redirection operator(<). + + +****************************************************************************** +*** Use bootlace to create a triple MBR *** +****************************************************************************** + +This is typically used for USB drives, though it also works with hard drives. + +Steps to create triple MBR: + +1. Do a fresh FDISK to create a FAT12/16/32 partition starting at sector 95 +(in LBA, that is, the begginning sector(MBR) is sector 0). + +2. Install grldr boot sector onto the boot sector of this partition. See +section "Use bootlace.com to install partition boot record" above. + +3. Get 96 sectors of the drive starting at sector 0(MBR), and save to file +MYMBR96.TMP. + +4. Run bootlace.com: + + bootlace.com MYMBR96.TMP + +5. Put MYMBR96.TMP back onto the drive starting at MBR(sector 0). + +Note: If the drive already has a triple MBR, then bootlace will cancel it +and restore the original partition layout. + + +****************************************************************************** +*** Use 'pxe detect' in preset-menu *** +****************************************************************************** + +Now the "pxe" command has a new subcommand "detect": + + pxe detect [BLOCK_SIZE] [MENU_FILE] + +BLOCK_SIZE specifies the block size for PXE. If it is not specified or it is +0, then grub4dos will go through a probing process and get a proper value +for data transfer. + +MENU_FILE specifies the config file on the PXE server. If omitted, a standard +config file in the menu.lst sub-dir will gain control. For a description on +the config files in the menu.lst sub-dir, please refer to the section +"GRLDR as PXE boot file" above. +If MENU_FILE starts in a "/", then the MENU_FILE on the PXE server will gain +control, else(if MENU_FILE does not start in a "/") no menu will be executed. + +Normally you want to use a "pxe blksize ..." or a "pxe detect ..." command +before you access the (pd) device, since the default blocksize of 512 might +not work on your system. + + +****************************************************************************** +*** Use 'configfile' in preset-menu *** +****************************************************************************** + +Now the preset menu holds the highest priority. It will gain control prior to +the menu.lst on the boot device. If a 'configfile' command(without specifying +any file as the parameter) occurs in the menu init command group of the preset +menu, then control will go to the menu.lst on the boot device. + +Note: You should better not use "configfile ANOTHER_MENU" frequently in your +menu.lst file, because it could create infinite loop and thus hang your +computer. + + +****************************************************************************** +*** New command 'dd' to copy files *** +****************************************************************************** + +Usage: + +dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT] [buf=ADDR] [buflen=SIZE] + +Copy file IF to OF. BS is blocksize in bytes, default to 512. C is blocks to +copy, default is total blocks in IF. IN specifies number of blocks to skip +when read, default is 0. OUT specifies number of blocks to skip when write, +default is 0. Skipped blocks are not touched. Both IF and OF must exist. + +Both IF and OF must have a leading device name, i.e., of the form `(...)'. +You may use `()' for the current root device. + +dd can neither enlarge nor reduce the size of OF, the leftover tail of IF +will be discarded. OF cannot be a gzipped file. If IF is a gzipped file, +it will be decompressed automatically when copying. + +dd is dangerous, use at your own risk. To be on the safe side, you should +only use dd to write a file in memory. + +In some cases when writing a file in a NTFS volume, dd might fail. + +If you attempt to write a device or a block file that is not in memory by +starting dd in a menu, you will safely be refused :-) (Update: no restrictions +now) + +Update: New options are implemented for user defined buffer. By default, +the buffer is at address 0x50000, and length is 0x10000(=64KB). You cannot +specify ADDR to be lower than 0x100000(=1MB). Besides, you must specify SIZE +larger than 0x10000(=64KB). Normally you want ADDR >= 0x1000000(=16MB), and +SIZE also >= 16MB. A large SIZE could speed up the progression of dd. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! Both IF and OF can be a device name which stands for !!!! +!!!! all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +****************************************************************************** +*** New command 'uuid' to identify partitions *** +****************************************************************************** + +Usage: + + uuid [DEVICE] [UUID] + +If DEVICE is not specified, search for filesystem with UUID in all partitions +and set the partition containing the filesystem as new root (if UUID is +specified), or just list uuid's of all filesystems on all devices (if UUID is +not specified). If DEVICE is specified, return true or false according to +whether or not the DEVICE matches the specified UUID (if UUID is specified), +or just list the uuid of DEVICE (if UUID is not specified). + +Example 1: + + find --set-root uuid () 7f95820f-5e33-4e6c-8f50-0760bf06d79c + +which will find a partition with uuid=7f95820f-5e33-4e6c-8f50-0760bf06d79c +and set the partition as root if found. + +Example 2: + + uuid () + +which will print the uuid of the current root device. + + +****************************************************************************** +*** gfxmenu support in grub4dos *** +****************************************************************************** + +Gfxmenu support has been added to grub4dos. To use it, you must first find the +message file you need, then load it in menu.lst with command like this: + + gfxmenu /message + +This should be a gloabl command, that is, not inside any menu item. Also, it +can only be used in configure file, running it in console mode does not work. + +gfxmenu does not work in conjunction with the password feature. + +There are two major format of message file. Old format is created with gfxboot +3.2.* or older (size of message file is normally about 150K), while new format +is created with gfxboot 3.3.* and later (size of message file is normally above +300K). Both format are supported in grub4dos. + + +****************************************************************************** +*** Use 'write' to write a string into a device or file *** +****************************************************************************** + +Usage: + + write [--offset=SKIP] ADDR_OR_FILE INTEGER_OR_STRING + +SKIP is an integer and defaults to 0. + +If ADDR_OR_FILE is an integer, then it is treated as a memory address, and +INTEGER_OR_STRING must be an integer value. The integer INTEGER_OR_STRING +will be written to address (ADDR_OR_FILE + SKIP). + +If ADDR_OR_FILE is a device or a file, then INTEGER_OR_STRING is treated as +a string which will be written to ADDR_OR_FILE at offset SKIP (in bytes). + +The string is quoted with nothing, that is, neither with the single quote +char(') nor with the double quote char("). + +Space char must be quoted with back slash(\). (Update: need not now) + +Single quote char(') and double quote char(") are not interpreted specially +and can be used directly in the string. + +Some C-style quote sequences are interpreted as follows: + + \NNN character with octal value NNN (1 to 3 digits) + + \\ backslash + + \a alert (BEL) + + \b backspace + + \f form feed + + \n new line + + \r carriage return + + \t horizontal tab + + \v vertical tab + + \xHH byte with hexadecimal value HH (1 to 2 digits) + +Just like dd, the write can neither enlarge nor reduce the size of the +destination file, the leftover tail of the string will be discarded. +The destination file cannot be a gzipped file. + +Again like dd, the write command is also dangerous, use at your own risk. +And to be on the safe side, you should only write to memory files. + +In some cases when writing a file in a NTFS volume, the write might fail. + +If you attempt to write a device or a block file that is not in memory by +using write in a menu, you will safely be refused :-) (Update: no restrictions +now) + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! The file to write can be a device name which stands !!!! +!!!! for all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +****************************************************************************** +*** Item-by-item help text for menu entries *** +****************************************************************************** + + +The help message at the bottom of the screen will vary as you choose the menu. + +You may append your help text to the title line. The help text must begin +with "\n", for example: + + title This is the title\nThis is the help text.\nAnd this is the 2nd line of the help text. + +Some C-style quote sequences are interpreted as stated in the section above. + + +****************************************************************************** +*** initrd can load multiple cpio files for Linux 2.6 kernels *** +****************************************************************************** + +Usage: + + initrd FILE [FILE ...] + +Note 1: You should not load more than one oldstyle disk images in this way, +because this is not supported by Linux kernel. + +Note 2: The FILEs should be specified in the same order as with syslinux. + +****************************************************************************** +*** access some internel variables at a fixed location *** +****************************************************************************** + +Address Length Description +========= ======== ============================================== +0000:8208 4 (DWORD) install_partition (the boot partition) +0000:8280 4 (DWORD) boot_drive (the boot drive) +0000:8284 4 (DWORD) pxe_yip (your ip) +0000:8288 4 (DWORD) pxe_sip (server ip) +0000:828C 4 (DWORD) pxe_gip (gateway ip) +0000:8290 8 (QWORD) filesize (file size by last "cat --length=0") +0000:8298 4 (DWORD) saved_mem_upper (extended memory size in KB) +0000:829C 4 (DWORD) saved_partition (current root partition) +0000:82A0 4 (DWORD) saved_drive (current root drive) +0000:82A4 4 (DWORD) no_decompression (no auto gunzip) +0000:82A8 8 (QWORD) part_start (start sector of last partition) +0000:82B0 8 (QWORD) part_length (total sectors of last partition) + +Note 1: Filesize can be initialised/modified by using "cat --length=0 FILE". +Note 2: You should not write these variables by hand(should read only). +Note 3: You may use 1K at 6000:0000 for your own varibles(See note 4). +Note 4: The read command now returns the integer value at the given address. +Note 5: Grub4dos does not have the variable expansion feature. You can only + use integer variables. You need not declare them, but use the memory + address directly. Usually you want to use variables as a logical + value or in a command for conditional test, e.g., of this form: + "checkrange RANGE read ADDR" +Note 6: no_decompression, saved_drive and saved_partition are writable. + + +****************************************************************************** +*** possibility to run another menu.lst after gfxmenu *** +****************************************************************************** + +Notice the use of CONFIGFILE after GFXMENU in the following example: + + # The menu.lst file for gfxmenu + default=0 + timeout=5 + gfxmenu /message + configfile /another.lst + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of menu.lst + + # Begin another.lst + default=0 + timeout=5 + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of another.lst + +This will try gfxmenu command first. On exit(or on failure) control will go +to another.lst file. + + +****************************************************************************** +*** a range of drives can be unmapped *** +****************************************************************************** + +Usage: + + map --unmap=RANGE + +RANGE is a range of BIOS drive numbers to be unmapped. BIOS drive number 0 +is for the first floppy, 1 is for the second floppy; 0x80 is for the first +hard drive, 0x81 is for the second hard drive, etc; virtual cdrom (hd32) +corresponds to BIOS drive number 0xA0, (hd33) corresponds to 0xA1, etc. + +For description on RANGE, please refer to section `The New Command CHECKRANGE' +above. + +Example 1: + + map --unmap=0,0x80,0xff + +This will unmap virtual floppy (fd0), virtual hard drive (hd0) and virtual +cdrom (0xff). + +Example 2: + + map --unmap=0:0xff + +This will unmap all virtual floppies, all virtual hard drives and all virtual +cdroms. + +Note 1: Normally a `map' command will add an item in the drive map table for + a virtual drive. But `--unmap' means items in the drive map table + (for the specified virtual drives) will be deleted. +Note 2: The --unhook option only breaks the INT13 hook(to the inerrupt + vector table). It will not affect the drive map table. And later on + execution of a `boot' command, the INT13 disk emulation routine will + automatically get hooked(to the interrupt vector table) when needed + (e.g., the drive map table is non-empty) even if it has been unhooked. +Note 3: Usually you want to do a `map --rehook' after you have changed the + drive map table. + + +****************************************************************************** +*** geometry tune and sync *** +****************************************************************************** + +When a USB storage device is connected to a (or another) machine, the geometry +in the partition table or in the BPB of the volume could be invalid, and the +machine could hang at boot time. So you need to find out the correct geometry +for the drive (use `geometry --tune'), and then update the geometry in +partition table and BPB of the drive(use `geometry --sync'). + +The above steps are required if you are going to boot DOS, because DOS +requires the right geometry in the partition table and BPB. Windows/Linux may +also require it, since the boot process could run in real-mode. + + +****************************************************************************** +*** Version numbering *** +****************************************************************************** + +Now we append a letter 'a', 'b', 'c' or 'p' to the version number(e.g., 0.4.5). +So the version will become 0.4.5a, 0.4.5b, 0.4.5c, 0.4.5 or 0.4.5p. + +'a' - alpha test. unstable, especially when there are known bugs. +'b' - beta test. the developers think it has no bugs and want a widely testing. +'c' - release candidate. +''(nothing) - official release. +'p' - patched versions to the official release. + + +****************************************************************************** +*** Running User Programs *** +****************************************************************************** + +From 0.4.5 on, user programs can be developed for running under grub4dos. The +executable program file must end with the 8-byte grub4dos EXEC signature: + + 0x05, 0x18, 0x05, 0x03, 0xBA, 0xA7, 0xBA, 0xBC + +The executable must have no relocations, and the entry point is at the very +beginning of the file, just like a DOS .com file(but the grub4dos executable +is 32-bit). + +Here is a sample file echo.c: + +/*================ begin echo.c ================*/ + +/* + * compile: + +gcc -nostdlib -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE echo.c + + * disassemble: objdump -d a.out + * confirm no relocation: readelf -r a.out + * generate executable: objcopy -O binary a.out b.out + * + * and then the resultant b.out will be grub4dos executable. + */ + +/* + * This is a simple ECHO command, running under grub4dos. + */ + +int i = 0x66666666; /* this is needed, see the following comment. */ + +/* gcc treat the following as data only if a global initialization like the + * above line occurs. + */ + +/* a valid executable file for grub4dos must end with these 8 bytes */ +asm(".long 0x03051805"); +asm(".long 0xBCBAA7BA"); +/* thank goodness gcc will place the above 8 bytes at the end of the b.out + * file. Do not insert any other asm lines here. + */ + +int +main() +{ + void *p = &main; + + return + /* the following line is calling the grub_sprintf function. */ + ((int (*)(char *, const char *, ...))((*(int **)0x8300)[0])) + /* the following line includes arguments passed to grub_sprintf. */ + (0, p - (*(int *)(p - 8))); +} + +/*================ end echo.c ================*/ + +0x8300 is a pointer to the grub4dos system funtions(API). The system_functions +variable is defined in asm.S. + +More function can use in user programs: + http://grubutils.googlecode.com/svn/trunk/src/include/grub4dos.h +note: After 2010-11-16 version of grub4dos,you can use like below. +/////////////////echo.c start/////////////////////////////////////////////// +#define sprintf ((int (*)(char *, const char *, ...))((*(int **)0x8300)[0])) + +#define printf(...) sprintf(NULL, __VA_ARGS__) +int i = 0x66666666; +asm(".long 0x03051805"); +asm(".long 0xBCBAA7BA"); +int main(char *arg,int flags) +{ + + return printf("%s\n",arg); +} +/////////////////echo.c end///////////////////////////////////////////////// + +****************************************************************************** +*** Map options added by Karyonix *** +****************************************************************************** + +(from boot-land.net) Karyonix's note: + +map --add-mbt= option to be used with --mem. If =0 master boot track will not + be added automatically. +map --top option to be used with --mem. map --mem will try to allocate memory + at highest available address. +map --mem-max=, map --mem-min options to be used before map --mem. Allow user + to manually limit range of address that map --mem can use. + +safe_parse_maxint_with_suffix function parses K,M,G,T suffix after number. + + +****************************************************************************** +*** Graphics mode 6A: 800x600 with 16 colors *** +****************************************************************************** + +Graphics mode now has 2 possibilities, one is the default 640x480 mode, and the +other is 800x600 mode. + +To enter 800x600 mode, follow this way: + +1. Be sure you are in console text mode. You may execute "terminal console". +2. Set graphics mode to 0x6A by using command "graphicsmode 0x6A". +3. Enter graphics mode. You may execute command "terminal graphics". + +To return to 640x480 mode, follow this way: + +1. Be sure you are in console text mode. You may execute "terminal console". +2. Set graphics mode to 0x12 by using command: "graphicsmode 0x12". +3. Enter graphics mode. You may execute command "terminal graphics". + +****************************************************************************** +***** GRUB4DOS variable support ***** +****************************************************************************** + +From now we supports variables, the same usage of MSDOS. + +commands: + set [/p] [/a|/A] [/l|/u] [VARIABLE=[STRING]] + variable specifies the variable name (up to 8 characters). + string Specifies a string assigned to the variable (up to 512 characters.) + +SET command without parameters will display the current variables. + +with "=",if the string is empty. + set myvar= +Will delete the variable myvar + +Show the name has been used for all variable. For example: + set ex_ +Will display all variables beginning with ex_, returns 0 if no match. + +Note: 1. the same of MSDOS. + a full line of command will be conducted before the implementation of variable substitution. + 2. Variable names must beginning with letter or "_". + Otherwise you will not be able to access your variables. + 3. See the previous description for length limit. + 3. To reset all used variable enter command "set *" + +the new command if + if [/I] [NOT] STRING1==STRING2 [COMMAND] + if [NOT] exist VARIABLE|FILENAME [COMMAND] + + STRING1==STRING2 + Specifies a true condition if the specified text strings match. + COMMAND + Specifies the command to carry out if the condition is met. + /I + if specified, says to do case insensitive string compares. + NOT + Specifies that should carry out the command only if the condition is false. + +Example: + 1. To determine whether strings are equal, and not case sensitive. + if /i test==%myvar% echo this is a test + 2. To determine the character is empty. + if %myvar%#==# echo variable myvar not defined. +Usage example: + 1. Displays a string including the variable. + echo myvar=%myvar% + 2. Using a variable instead of command. + set print = echo + %print% This a test. + 3. You can use a "^" to stop extended, example + echo %myvar^% + Or + echo %my^var% + Will be displayed %myvar% rather than the extended character after myvar. +Note: We only deal the ^ between the symbols %%. + +****************************************************************************** +***** GRUB4DOS batch scripting support ***** +****************************************************************************** + +The new version supports running a batch script,It very like MS-DOS batch. +Yes!you needn't to learn a new language. + +Example of a simple script: + ========= GRUB4DOS BATCH SCRIPT START =============================== + !BAT #Note: The file header !BAT is necessary to identify this is a batch + echo %0 + echo Your type:%1 %2 %3 %4 %5 %6 %7 %8 %9 + call :Label1 This is a test string + goto :label2 + :Label1 + echo %1 %2 %3 %4 %5 %6 %7 %8 %9 + goto :eof + :Label2 + echo end of batch script. + ========= GRUB4DOS BATCH SCRIPT END =============================== + +Some differences: + 1. Batch will stop when an error occurs. + 2. Use command "exit 1",if you need to stop a running batch script. + 3. %9 refers to all the remaining parameters. + 5. extensions + %~d0 expands %0 to a drive letter.e.g: (hd0,0) ,() + %~p0 expands %0 to a path only + %~n0 expands %0 to a file name only + %~x0 expands %0 to a file extension only + %~f0 expands %0 to a fully qualified path name + %~z0 expands %0 to size of file + 6.You can find some script in below site. + http://chenall.net/post/tag/grub4dos/ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS_CN.txt b/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS_CN.txt new file mode 100644 index 0000000..33bcf43 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/README_GRUB4DOS_CN.txt @@ -0,0 +1,4314 @@ +本文档来源:http://bbs.znpc.net/viewthread.php?tid=5587 +感谢zw2312914提供 +原版是中英文对照的版本,这里已经经过删改。 +需要看原版的可以从上面的贴子下载. + +一些旧的网址已经删除,只保留目前在用的. + +注:本文仅供参考,可能有一些更新没有在这里说明.如果有发现错误可以到论坛发贴或email联系我(grub4dos@chenall.net) + +其它命令用法请参考 + http://grub4dos.sourceforge.net/wiki/ 处的 GRUB4DOS 有关文档。 + +外部命令的用法请参考 + http://chenall.net/post/tag/grub4dos/ + +项目主页 + http://code.google.com/p/grub4dos-chenall/ + +下载网址: + http://code.google.com/p/grub4dos-chenall/downloads/list + http://nufans.net/grub4dos/ + +工具和外部命令: + http://code.google.com/p/grubutils/downloads/list + +通过匿名 svn 服务器获取最新源代码的方法: + + svn co http://grub4dos-chenall.googlecode.com/svn/trunk/ grub4dos + +通过你的 web 浏览器在线查看源代码: + http://code.google.com/p/grub4dos-chenall/source/browse/ + +GRUB4DOS 邮件列表(未用): + grub4dos-devel@gna.org + +订阅页面: + https://mail.gna.org/listinfo/grub4dos-devel/ + +论坛(官方技术支持站点): + http://bbs.znpc.net/forumdisplay.php?fid=4 + http://reboot.pro/forum/66/ + +---------------------近期更新记录----------------------------------------------- +最新更新记录请查看,ChangeLog_chenall.txt +2011-01-03 + 添加了GRUB4DOS的变量用法及相关介绍。 + +2011-01-02 + 1.为了方便pause命令添加--test-key参数,显示按键扫描码. + + +2010-12-31 更新: + 1.pause命令增强,增加了显示按键扫描码的功能。需要debug 为-1. + 例子:显示一个按键扫描码 + debug -1 && pause && debug 1 + 注:此功能已为被参数--test-key代替。 + + 2.hiddenmenu命令增强。增加一个--chkpass参数 + 功能: 在隐藏菜单的时候按Esc键要输入正确的密码才可以显示菜单。 + 注意: 1.该功能启用之后,如果按了其它按键则直接启动默认菜单。 + 默认的Esc按键可以自由设置。使用--chkpass=KEY + 2.菜单初始化有password命令时才需要输入密码。 + 3.按键代码如果不清楚可以使用上面的功能来获取。 + 例子: hiddenmenu --chkpass=0x8500 按F11键才可以显示菜单。 + hiddenmenu --chkpass 按Esc键才可以显示菜单。 + hiddenmenu --chkpass=0x2200 按Alt+G显示菜单。 + +------------------------------------------------------------------------------ +GRUB.EXE 用法: + GRUB [--bypass] [--time-out=T] [--hot-key=K] [--config-file=FILE] + 旁路 暂停时间 热键 配置文件 + + 这里的 FILE ,例如,可以是 (hd0,0)/menu.lst + + 在 CONFIG.SYS 中,其配置行类似于: + + install=c:\some\where\grub.exe --config-file=FILE + + 如果没有使用选项,GRUB.EXE简单的使用(hd0,0)/menu.lst + 来作为配置文件,只要它存在的话。(注意!我们最终将默认的配 + 置文件从 (hd0,0)/boot/grub/menu.lst 变更为 (hd0,0)/menu.lst) + (更新于2006-12-23。参见更新3) + + 这里的分区(hd0,0)可以是一个Windows分区或者是一个linux分区, + 或者是被 GRUB 支持的其他任意分区。 + + + 这里的FILE只接受GRUB风格的文件名。DOS风格的文件名不被调用 + (很明显,我们应该使用GRUB风格的文件名,原因是比如在Linux + ext2分区中不能使用DOS风格的文件名来访问文件 )。 + (参见更新2) + + 更新:FILE 可以是菜单的内容。使用分号来分隔嵌入 FILE 中的命 + 令。FILE 可以被一对双引号括起来,示例: + + GRUB --config-file="root (hd0,0);chainloader +1" + 这条命令将启动(hd0,0)上的系统。 + + 另一个例子: + GRUB --config-file="reboot" + 这条命令将令机器重启。 + + 再例如: + GRUB --config-file="halt" + 这条命令将令机器关闭。 + + 如果选项--bypass 被指定,GRUB将在暂停时间截止后从DOS退出。 + 选项'--time-out=T' 指定了以秒计时的暂停值。如果指定了--bypass + 则T的默认值为5 ,而--bypass选项没有被指定时默认值为0 。 + + 默认的热键值是 0x3920 (即空格键)。如果此键被按下,GRUB将正常 + 启动。如果其他键被按下,GRUB 将立即终止并返回到DOS。参见下面 + 的“int16 键盘扫描码” + + 每个选项最多只能被指定一次。 + + 更新 2:DOS风格的文件名已经被支持(由John Cobb先生提供此补丁)。 + 如果 FILE 的起始两个字符是“ #@ ”,那么 FILE 中其余的部分将被视 + 为一个DOS风格的文件名。例如: + + GRUB --config-file="#@c:\menu.lst" + + DOS风格的文件只有起始的4kB被使用。此文件应当是一个未被压缩的文 + 本文件。 + + 注意:你也可以在SHELL或者在CONFIG.SYS的INSTALL配置行使用‘DOS + 风格文件直接访问’。但不要在DEVICE 配置行使用它。DOS文档中表述 + 了DOS设备驱动不能使用'打开文件'的DOS调用。 + + + 更新 3(2006-12-23): 作为默认,GRUB.EXE将按以下顺序查找它的配置文件: + + (DOS风格文件) .\menu.lst, 当前目录下的MENU.LST。 + (DOS风格文件) \menu.lst, 当前驱动器根目录下的MENU.LST + (GRUB风格文件) /menu.lst, 启动设备根目录下的MENU.LST + + 默认的启动设备还是(hd0,0)。 + + +-------------------------------------------------------- + +更新 1 : 版本0.2.0 同时带来一个新的东西。GRUB for NTLDR ,它能够从 + Windows NT/2000/XP的启动菜单启动到GRUB。复制GRLDR到Windows + NT/2000/XP的C盘根目录,并在C:\BOOT.INI中加入这样一行: + + C:\GRLDR="Start GRUB" + + 这样就完成了安装。GRLDR应该与 BOOT.INI及NTLDR 位于相同的目录。 + 注意 BOOT.INI 通常是隐藏的因而你要看见它必须取消隐藏。如果GRLDR + 在一个NTFS分区,应该将它复制到一个非NTFS分区的根目录(并且menu.lst + 文件应当同样这样做)。假如GRLDR被压缩了,比如在NTFS分区中对它启 + 用了压缩的情况下,它将不能运行。 + + 即使这个磁盘的驱动器号已经被Windows设备管理器改变为另外的不同 + 于 C 的盘号 ,你仍然需要在 BOOT.INI 中使用盘符 C ,否则,NTLDR + 将查找不到 GRLDR 文件。 + + 也就表示,如果你从一个软盘上启动NTLDR,你也需要把A:\BOOT.INI + 中的 GRLDR 的所在行这样写: + + C:\GRLDR="Start GRUB" + + 而不能象下面这样使用盘符 A : + + A:\GRLDR="Start GRUB" + + (注意在 BOOT.INI 位于软盘 A 的这个例子中,标记“C:\GRLDR” + 实际将访问 A:\GRLDR ) + + +更新 2: GRUB for linux 也一起被引入到版本0.2.0。 + 你可以使用使用linux的引导程序 KEXEC,LILO,SYSLINUX 或者别的 + GRUB来启动它。(GRUB4LIN 已经合并到 GRUB.EXE 中) + + 从Linux中直接启动到GRUB ,使用这样一组命令: + + kexec -l grub.exe + kexec -e + + 经由GRUB启动到GRUB,使用如下的命令: + + kernel (hd0,0)/grub.exe + boot + + 经由LILO启动到GRUB,在lilo.conf中加入这样几行: + + image=/boot/grub.exe + label=grub.exe + + 经由syslinux启动到GRUB,在syslinux.cfg中加入这样几行: + + label grub.exe + kernel grub.exe + + LOADLIN在引导GRUB.EXE时可能会遇到问题,原因是grub.exe需要一些 + 未更改的原始的BIOS中断向量,但是DOS破坏了这些中断向量,而loadlin + 在将控制权交给grub.exe前并没有恢复它们。 + + +更新 3: 从版本0.4.0开始,DOS下的GRUB支持内存驱动器。示例: + + # boot into a floppy image + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + 由于镜像将被拷贝到一个内存区域,所以镜像本身可以是非连续的, + 甚至可以是被gzip压缩过的。 + + 另一个例子: + map --mem=-2880 (hd0,0)/floppy.img (fd0) + + 这个内存驱动器(fd0)将占用至少1440 KB的内存。 + 这也对那些小于1440 KB的1.44M 软盘镜像有用。 + + 再例如: + map --mem --read-only (hd0,0)/hd.img (hd1) + + 这个内存驱动器成为了一个硬盘驱动器,并且只读。 + 这表示你不能向这个(hd1)中写入数据。 + + 你可以同时使用多个内存驱动器和多个原来的基于磁盘虚拟的仿真驱动器。 + + 如果BIOS不支持中断int15/EAX=e820h,你将不能使用任何内存驱动器。 + +更新 4: 对于内存驱动器仿真,一个单一的分区镜像可以被转换为整个硬盘镜像来 + + + map --mem (hd0,7)/win98.img (hd0) + map --hook + chainloader (hd0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + 这里的win98.img是一个头部不含主引导记录和分区表的分区镜像。 + GRUB for DOS 确实会为这个内存驱动器(hd0)建立一个MBR和分区表。 + +更新 5: 现在GRLDR可以作为一个非模拟模式的可启动光盘的启动映像文件来使 + 用。Linux用户使用示例: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o bootable.iso iso_root + + 另一种选择是,grldr也可以用同样的方法作为stage2_eltorito来使用。 + -boot-info-table选项是被允许使用的,但你可以省略它: + + mkdir iso_root + cp grldr iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + 也要注意上面的可启动iso镜像是使用-boot-load-seg 0xHHHH选项来建立的话, + 就必须令HHHH大于或者等于1000(十六进制) + 如果HHHH小于1000(十六进制),虚拟机 QEMU 会死机。这是QEMU的一个缺陷。一 + 个grldr.iso镜像可以使用也可以不使用-boot-load-seg 0xHHHH选项来创建。 + + menu.lst文件应该被放置在光盘的根目录。 + +更新 6: 中文专用版被建立在"chinese"子目录中。 + ( 由Gandalf先生提供此补丁,2005-06-27) + + 中文专用版同时内附了scdrom 功能。 + (更新:scdrom 从2006-07-20起已被删除) + +更新 7: 增加了内存驱动器(md) 。就像(nd)代表网络驱动器 (cd) 代表光驱一样, + 新的驱动器(md)实现了将整个内存作为一个磁盘驱动器来访问。 + (md)只工作在支持BIOS中断int15/EAX=E820h的系统上。 + + 现在,cat命令已经有了一个十六进制转储的新选项:--hex + 以及通过--locate=STRING 在文件中找查找字符串。 + + 典型示例: + + cat --hex (hd0)+1 + + 这将用十六进制的表格显示 MBR 扇区。 + + cat --hex (md)+2 + + 这将显示你内存起始处的1 KB内容(实际,这就是实模式的IDT表),也是 + 使用十六进制的转储表。 + + cat --hex (md)0x800+1 + + 这将显示你的扩展内存的第一个扇区。 + + cat --hex (hd0,0)+1 + 这将显示(hd0,0)分区的第一扇区。通常这个扇区包含操作系统的引导记录。 + +更新 8: 增加了随机存贮驱动器 (rd) 。(md) 设备访问内存是从物理地址 0 + 开始,而 (rd) 可以访问起始于任何基地址的内存。随机存贮器的基 + 址与长度可以通过 map 命令指定。详情请使用 "help map" 命令。 + 你甚至能够为(rd)驱动器指定一个BIOS驱动器号。比如: + map --ram-drive=0xf0。默认的 (rd) 驱动器号是使用0x7F的软驱号。 + 如果 (rd) 是硬盘驱动器镜像,你应该用大于或等于0x80的值来改变 + 它的驱动器号。(但应防止使用0xffff,因为0xffff是预留给(md)设 + 备的。) + + (rd)+1这个标志始终代表文件,它包含存储在(rd)中的所有字节。 + +更新 9: 直接启动 WinNT/2K/XP 的 NTLDR 和 Win9x/ME 的 IO.SYS, 以及 + FreeDOS 的 KERNEL.SYS. 例如: + + chainloader --edx=0xPPYY (hd0,0)/ntldr + boot + + chainloader --edx=0xYY (hd0,0)/io.sys + boot + + chainloader --ebx=0xYY (hd0,0)/kernel.sys + boot + + 十六进制的YY 指定了启动驱动器号,十六进制的PP指定了 NTLDR 的 + 启动分区号。如果启动驱动器是软驱,PP应该是一个十六进制的值ff, + 即十进制的255. + + 对于 Freedos 的 KERNEL.SYS , 选项--edx不能执行,请使用--ebx 。 + + 当文件位于它们平常的位置时,选项 --edx (--ebx)可以省略。但某些 + 情况下,这些选项是必需的。 + 例如,假设被调用的ntldr文件在ext2分区(hd2,8)中,而你又希望它认 + 为(hd0,7)的 windows 分区是启动分区,那么--edx就是必需的: + + chainloader --edx=0x0780 (hd2,8)/ntldr + + 对于DOS核心(即,IO.SYS和KERNEL.SYS),启动分区号是没有意义的, + 因此你只需指定恰当的启动驱动器号YY(不过指定了启动分区号也是 + 无害的)。 + + 上面的PPYY也可以在chainloader命令之后通过root和rootnoverify命 + 令来指定。例如: + + chainloader (hd2,6)/kernel.sys + rootnoverify (hd0) <-------- YY=80 + boot + + chainloader (hd0,0)/ntldr + rootnoverify (hd0,5) <-------- YY=80, PP=05 + boot + + 提示:CMLDR (the ComMan LoaDeR,它被用于加载Windows的故障 + 恢复控制台)可以像NTLDR一样被良好的加载。 + + Bean 成功地解压和启动了WinME的IO.SYS,感谢这个出色的工作。 + +更新 10: isolinux.bin (版本 3.73) 可以被自2009-02-09 起建立的版本加载。 + + chainloader (cd)/isolinux.bin + + isolinux.bin必须是存在于在真实或虚拟的光驱之中的。 + +更新 11: Grub 传统版的 stage2 文件可以通过下面的方法加载: + + chainloader --force --load-segment=0 --load-offset=0x8000 --boot-cs=0 --boot-ip=0x8200 (...)/.../stage2 + +-------------------------------------------------------- +这里用一些示例来演示磁盘仿真命令的用法: + +1. 仿真硬盘分区C:为软驱A:并从C:中启动win98: + + map --read-only (hd0,0)+1 (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + boot + + 在上面的示例中,(hd0,0)是一个装有win98的C:盘 。当win98启动完成后,你会发 + 现A:中包含了C:的所有文件,而且如果你删除A:中的文件,C:上的相应文件也会消 + 失。 + + 在map命令行中,(hdm,n)+1式的写法被解释成代表整个(hdm,n)分区,而不仅仅是 + 此分区的第一扇区。 + +2. 将硬盘分区C:仿真为软驱A:并从A:中启动win98: + + map --read-only (hd0,0)+1 (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + map --floppies=1 + boot + + 在“map --hook”命令之后,仿真立即生效,即使是在GRUB的命令行模式中。 + + Note that the (fd0) in "chainloader (fd0)+1" is the emulated virtual + floppy A:, not the real floppy diskette(because map is hooked now). + 注意“chainloader (fd0)+1” 中的(fd0)是仿真后的虚拟软驱 A:,而不是真 + 实的软盘(因为映射现在已经被挂载了)。 + + +3. 仿真镜像文件为软驱A:并从C:盘中启动win98: + + map --read-only (hd0,0)/floppy.img (fd0) + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --floppies=1 + map --harddrives=1 + boot + +4. 仿真硬盘分区为第一硬盘并从中启动DOS: + + map --read-only (hd2,6)+1 (hd0) + map --hook + chainloader (hd0,0)+1 + rootnoverify (hd0) + map --harddrives=1 + boot + + 在这个示例中,(hd2,6)+1代表BIOS序号为3的(hd2)硬盘中的,扩展的DOS逻辑分区。 + + 如果一个DOS分区被仿真为一个硬盘,GRUB for DOS将首先定位分区表,通常, + 是在DOS分区的开头63个扇区中。如果那里没有分区表,GRUB for DOS将拒绝仿真。 + +5. 仿真一个镜像文件为第一硬盘然后从中启动DOS: + + map --read-only (hd0,0)/harddisk.img (hd0) + chainloader --load-length=512 (hd0,0)/harddisk.img + rootnoverify (hd0) + map --harddrives=1 + boot + + 如果一个镜像文件被仿真为硬盘,此镜像文件必须包含MBR。也就是说, + HARDDISK.IMG的第一扇区必须包含被仿真的虚拟硬盘的分区表。 + +注意: BIOS数据区中的软盘和硬盘的总数在映射期间没有被改变。当主板上没有配置真 + 实的软驱时,你通常应该专门使用诸如‘map --floppioes=’以及 + map --harddrives=’来设置它们。如果不这样做,DOS可能会启动失败。 + + ‘map --status’可以报告出一些有价值的东西。同时要注意‘map --floppies=’ + 和‘map --harddrives=’需要在没有执行映射前单独使用。 + + 版本0.4.2引入了一个新参数,memdisk_raw,用以模拟和内存驱动器类似的原生模式。 + 如果BIOS不支持中断int15/87h,或者int18/87h的支持有缺陷,你应该在任何内 + 存盘被使用前设置这个变量。这里是一个示例: + + map --memdisk-raw=1 + map --mem (hd0,0)/floppy.img (fd0) + map --hook + chainloader (fd0)+1 + rootnoverify (fd0) + boot + + 如果你碰到内存驱动器故障而又没有使用map --memdisk-raw=1时,你应当用 + ‘map --memdisk-raw=1’来尝试一次。 + + 你一执行‘map --memdisk-raw=0’之后,就应该执行一次‘map --unhook’ + (如果需要的话在这之后再执行‘map --hook’)。 + + 更新:memdisk_raw 现在默认值为1 。如果你希望使用中断int15/87h来访问内存 + 驱动器,你应当令‘map --memdisk-raw=0 ’。 + +-------------------------------------------------------- + + 任意大小的软盘或硬盘可以被 GRUB for DOS 0.2.0 版仿真。 + 镜像文件必须是连续的,否则GRUB for DOS 将拒绝执行。 + ‘blocklist’命令可以列举一个文件的碎片或者分块。 + 在GRUB提示符下输入“help map”可以获得简要的命令说明。 + + 这样的形式 + map ... (fd?) + 是一个软盘仿真,而下面的形式 + map ... (hd?) + 是一个硬盘仿真。 + + 使用硬盘仿真时,基于安全因素最好不要去启动Windows 。 + Windows甚至可能会破坏掉所有的数据和你硬盘上的所有资料!!!!!!!! + + 关于--mem的更新 :当使用--mem时,甚至是在进入Windows的时候,它看 + 来都相当安全。Win98可以正常运行内存驱动器。 + Windows NT/2000/XP不能识别仿真的驱动器,不管是否使用了--mem选项。 + +****************************************************************************** +*** grldr可启动的软盘或硬盘分区的说明 *** +****************************************************************************** +1. Ext2 引导扇区/引导记录的布局 (用于载入grldr) + +------------------------------------------------------------------------------ +一个EXT2/EXT3的卷可以是GRUB可启动的。复制grldr和可选的menu.lst文件到这个EXT2/EXT3 +卷的根目录,并按照grldr的第五扇区建立它的引导扇区(一些需要更改的字段在下面的表 +中做了详细注释)。那么,这个EXT2/EXT3的卷就是GRUB可启动的。 + +更新: bootlace.com是一个dos/linux下的工具,它可以把GRLDR的引导记录安装到一个 + EXT2/EXT3卷的第一扇区。 + +偏移 长度 说明 +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + 近转移指令的机器码 + +02h 1 LBA indicator. Valid values are 0x02 for CHS mode, or 0x42 for + LBA mode. + LBA指示码。CHS模式时,有效值是0x02;LBA模式时有效值为0x42。 + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x42. + 如果BIOS的int13支持LBA,此字节可以安全地设置为0x42。 + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x42. It seems that + (generally) all USB BIOSes have LBA support. + 某些 USB 设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 + 序应当设置这个字节为0X42 。似乎所有(多数)的USB BIOS都能支持LBA 。 + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x42, + otherwise, set to 0x02. + 如果(分区的起始地址加上分区的总扇区)超过了CHS的寻址能力。 + (特别是当它大于1024*256*63时),调用程序应当设置此字节为0x42, + 否则,要设为0x02。 + + Note that Windows98 uses the value 0x0e as the LBA indicator. + 注意 Windows98 使用0x0e作为LBA指示码。 + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + 更新:LBA指示码这个字节已被忽略。引导记录能够探测BIOS的LBA支持。 + +03h 10 OEM name string (of OS which formatted the disk). + Update: this field is now used for error message of "I/O error" + OEM 名称字符串(对该磁盘进行格式化的操作系统的名字)。 + 更新:此字段现在被用于错误提示信息“I/O error” + +0Dh 1 Sectors per block. Valid values are 2, 4, 8, 16 and 32. + 每块扇区数。有效值是2, 4, 8, 16 和 32。 + +0Eh 2 Bytes per block. Valid values are 0x400, 0x800, 0x1000, 0x2000 + and 0x4000. + 每块字节数。有效值是0x400, 0x800, 0x1000, 0x2000 和 0x4000。 + +10h 4 Pointers in pointers-per-block blocks, that is, number of + blocks covered by a double-indirect block. + 在pointers-per-block块中的指针数,即一个二级间接块包含的块数。 + + Valid values are 0x10000, 0x40000, 0x100000, 0x400000 and + 0x1000000. + 有效值是0x10000, 0x40000, 0x100000, 0x400000 和 0x1000000。 + +14h 4 Pointers per block, that is, number of blocks covered by an + indirect block. + 每块指针数,即一个间接块包含的块数。 + + Valid values are 0x100, 0x200, 0x400, 0x800, 0x1000. + 有效值是0x100, 0x200, 0x400, 0x800, 0x1000 。 + +18h 2 Sectors per track. + 每磁道的扇区数。 + +1Ah 2 Number of heads/sides. + 磁头数/面数 + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + 隐藏扇区数(它们位于引导扇区之前) + + Also referred to as the starting sector of the partition. + 也被成为是分区的起始扇区。 + + For floppies, it should be 0. + 对于软盘,它应当为0 。 + +20h 4 Total number of sectors in the filesystem(or in the partition). + 文件系统中的扇区总数(或者是分区的扇区总数)。 + +24h 1 BIOS drive number of the boot device. + 启动设备的 BIOS 驱动器号码。 + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + 实际此字节在读入时被忽略。引导代码将把DL的值写入到此字节中。 + BIOS或者调用程序应当在DL中设置磁盘号码。 + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + 我们假定所有的BIOS在DL中能传递正确的磁盘号码。 + 糟糕的BIOS不被支持!! + +25h 1 Partition number of this partition on the boot drive. + 此分区在启动驱动器上的分区号 + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + 0, 1, 2, 3 是主分区 。4, 5, 6, ... 等等是扩展分区中的逻辑分区。 + + 0xff is for whole drive. So for floppies, it should be 0xff. + 0xff代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 + +26h 2 inode size in bytes. (Notice! We use the formerly reserved + word here for inode size!) + 字节计数的索引节点大小。(注意!我们在此处为索引节点大小使用 + 了以前被保留的一个字,即两个字节) + +28h 4 Number of inodes per group. + 每组的i节点数 + + Normally a 1.44M floppy has only one group, and the total + number of inodes is 184. So the value should be 184 or + greater. + 通常,1.44M软盘只有一个组,并且总的i节点数是184。所以此值 + 应为184或者更大。 + +2Ch 4 The block number for group descriptors. + 组描述符的块号码。 + + Valid values are 2 for 1024-byte blocks, and 1 otherwise. + 对于1024字节的块有效值是2 ,否则是1 。 + + The value here is equal to (s_first_data_block + 1). + 这里的值等于(s_first_data_block + 1)。 + +30h 1 code for "cld"(0xFC). + 指令“cld”(即0xFC)。 + +31h 2 code for "xor ax,ax"(0x31, 0xC0). + 指令“xor ax,ax”(即0x31,0xC0) + +33h 1 code for "nop"(0x90) or "cwd"(0x99) + 指令“nop”(即0x90)或“cwd”(即0x99) + +34h 458 The rest of the machine code. + 机器码部分。 + +1FEh 2 Boot Signature AA55h. + 引导签名AA55h 。 + + +2. FAT12/FAT16 Boot Sector/Boot Record Layout (for loading grldr) +2. FAT12/FAT16 引导扇区/引导记录的布局 (用于载入grldr) + +------------------------------------------------------------------------------ +A FAT12/16 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT12/16 volume, and build the boot sector based on the +fourth sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT12/16 volume is GRUB-bootable. +一个FAT12/16的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT12/16 卷 +的根目录,并按照grldr的第四扇区建立它的引导扇区(一些需要更改的字段在下面的表中 +做了详细注释)。然后这个FAT12/16的卷就是GRUB可启动的。 + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT12/16 volume. +更新: bootlace.com 是一个dos/linux下的工具,而它能把GRLDR的引导记录安装到一个 + FAT12/16卷的引导扇区。 + +Offset Length Description +偏移 长度 说明 + +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + 近转移指令的机器码 + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + LBA指示码。CHS模式时,有效值为0x90;LBA模式时,有效值为0x0e 。 + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + 如果BIOS int13支持LBA,此字节可以安全地设置为0x0e 。 + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程序 + 应当设置这个字节为0X0e 。似乎所有的(多数)USB BIOS都能支持 LBA 。 + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 + (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, + 否则,要设为0x90。 + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + 更新:LBA 指示码这个字节已被忽略。引导记录能探测BIOS的LBA支持。 + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + 更新 (2006-07-31):尽管GRLDR不再使用LBA指示码这个字节, + 但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 + (软盘尤其如此)。如果此字节未被正确设置,Windows 98将不能识别 + 软盘或分区。这一问题由neiljoy先生报告。非常感谢! + +03h 8 OEM name string (of OS which formatted the disk). + OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) + +0Bh 2 Bytes per sector. Must be 512. + 每扇区字节数。必须为512 。 + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64和128 。但是簇大小 + 大于32K的情况不应发生。 + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区),通常是1。 + +10h 1 Number of FATs(nearly always 2). + 文件分配表数(几乎总是2)。 + +11h 2 Maximum number of root directory entries. + 根目录项的最大个数。 + +13h 2 Total number of sectors (for small disks only, if the disk is + too big this is set to 0 and offset 20h is used instead). + 扇区总数(仅用于小磁盘,如果磁盘太大此处被设置为0,而偏移 20h 处 + 则替代它使用)。 + +15h 1 Media descriptor byte, pretty meaningless now (see below). + 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 + +16h 2 Sectors per FAT. + 每个文件分配表的扇区数。 + +18h 2 Sectors per track. + 每个磁道的扇区数 + +1Ah 2 Total number of heads/sides. + 磁头或面的总数。 + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + 隐藏扇区数(位于引导扇区之前)。 + + Also referred to as the starting sector of the partition. + 也被称为是分区的开始扇区。 + + For floppies, it should be 0. + 对于软盘,它应当为0 。 + +20h 4 Total number of sectors for large disks. + 大磁盘的扇区总数。 + +24h 1 BIOS drive number of the boot device. + 引导设备的BIOS磁盘号。 + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + 实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。 + BIOS或者调用程序应当在DL中设置磁盘号码。 + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + 我们假定所有的BIOS在DL中能传递正确的磁盘号码。 + 糟糕的BIOS不被支持!! + +25h 1 Partition number of this filesystem in the boot drive. + 启动驱动器上此文件系统的分区号码。 + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 41h below. + 此字节在读入时被忽略。引导代码将分区号码写到此字节。 + 见下述偏移41h 。 + +26h 1 Signature (must be 28h or 29h to be recognised by NT). + 签名(必须是28h或者29h以便能被 NT 识别) + +27h 4 Volume serial number. + 卷的序列号。 + +2Bh 11 Volume label. + 卷标签。 + +36h 8 File system ID. "FAT12 ", "FAT16 " or "FAT ". + 文件系统ID。“FAT12”, “FAT16”或 “FAT”。 + +3Eh 1 code for "cli". + 指令“cli”。 + +3Fh 1 code for "cld". + 指令“cld”。 + +40h 1 code for "mov dh, imm8". + 指令“mov dh, imm8”。 + +41h 1 Partition number of this partition on the boot drive. + 此分区在启动驱动器的分区号。 + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + 0, 1, 2, 3 是主分区。4, 5, 6, ... 等等是扩展分区中的逻辑分区。 + + 0xff is for whole drive. So for floppies, it should be 0xff. + 0xff代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 + +42h 442 The rest of the machine code. + 机器码部分。 + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) + + +3. FAT32 Boot Sector/Boot Record Layout (for loading grldr) +3. FAT32 引导扇区/引导记录的布局 (用于载入grldr) + +------------------------------------------------------------------------------ +A FAT32 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the FAT32 volume, and build the boot sector based on the +third sector of grldr(some fields need to be changed as detailed in the +following table). And then the FAT32 volume is GRUB-bootable. +一个FAT32的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT32卷的根 +目录,并按照grldr的第三扇区建立它的引导扇区(一些需要更改的字段在下面的表中 +做了详细注释)。然后这个FAT32的卷就是GRUB可启动的。 + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the boot sector of an FAT32 volume. +更新: bootlace.com 是一个dos及linux下的工具而它能把 GRLDR 的引导记录安装 + 到一个FAT32卷的引导扇区。 + + +Offset Length Description +偏移 长度 说明 + +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + 近转移指令的机器码。 + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + LBA指示码。CHS模式时,有效值为0x90,而LBA模式时,有效值为0x0e。 + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + 如果BIOS的int13支持LBA,此字节可以安全地设置为0x0e。 + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 + 序应当设置这个字节为0X0e。似乎所有(多数)的USB BIOS都能支持LBA 。 + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 + (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, + 否则,要设为0x90。 + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + 更新: LBA 指示码这个字节已被忽略。引导记录能探测BIO的LBA支持。 + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + 更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节, + 但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 + (软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别 + 软盘或分区。这一问题由neiljoy先生报告。非常感谢! + +03h 8 OEM name string (of OS which formatted the disk). + OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) + +0Bh 2 Bytes per sector. Must be 512. + 每扇区字节数。必须为512 。 + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。 + 但是簇大小大于32K的情况不应发生。 + +0Eh 2 Reserved sectors(number of sectors before the first FAT, + including the boot sector), usually 1. + 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区), + 通常是1 。 + +10h 1 Number of FATs(nearly always 2). + 文件分配表数(几乎总是2)。 + +11h 2 (Maximum number of root directory entries)Must be 0. + (根目录项的最大个数)必须为0 。 + +13h 2 (Total number of sectors for small disks only)Must be 0. + (仅用于小磁盘的扇区总数)必须为0 。 + +15h 1 Media descriptor byte, pretty meaningless now (see below). + 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 + +16h 2 (Sectors per FAT)Must be 0. + (每个文件分配表的扇区数)必须为0 。 + +18h 2 Sectors per track. + 每个磁道的扇区数 + +1Ah 2 Total number of heads/sides. + 磁头或面的总数。 + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + 隐藏扇区数(它们位于引导扇区之前)。 + + Also referred to as the starting sector of the partition. + 也被称作是分区的起始扇区。 + + For floppies, it should be 0. + 对于软盘,它应当为0 。 + +20h 4 Total number of sectors for large disks. + 大磁盘的扇区总数。 + +24h 4 FAT32 sectors per FAT. + 每个文件分配表的 FAT32 扇区数。 + +28h 2 If bit 7 is clear then all FATs are updated, otherwise bits + 0-3 give the current active FAT, all other bits are reserved. + 如果第7位被清零,所有文件分配表将被更新,否则0-3位给出当前活 + 动的文件分配表,所有其它位被保留。 + +2Ah 2 High byte is major revision number, low byte is minor revision + number, currently both are 0. + 高字节是主修订号码,低字节是小修订号码,现在都是0 。 + +2Ch 4 Root directory starting cluster. + 根目录起始簇。 + +30h 2 File system information sector. + 文件系统信息扇区。 + +32h 2 If non-zero this gives the sector which holds a copy of the + boot record, usually 6. + 如果非零它给出具有引导记录的备份扇区,通常是6。 + +34h 12 Reserved, set to 0. + 保留,设为0 。 + +40h 1 BIOS drive number of the boot device. + 启动设备的 BIOS 驱动器号码。 + + 80h is first HDD, 00h is first FDD. + 第一硬盘是80h,第一软盘是00h。 + + Actually this byte is ignored for read. The boot code will + write DL onto this byte. The BIOS or the caller should set + drive number in DL. + 实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。 + BIOS或者调用程序应当在DL中设置磁盘号码。 + + We assume all BIOSes pass correct drive number in DL. + Buggy BIOSes are not supported!! + 我们假定所有的 BIOS 在DL中能传递正确的磁盘号码。 + 糟糕的BIOS不被支持!! + +41h 1 Partition number of this filesystem in the boot drive. + 启动驱动器上此文件系统的分区号码。 + + This byte is ignored for read. The boot code will write + partition number onto this byte. See offset 5Dh below. + 此字节在读入时被忽略。引导代码将分区号码写到此字节。 + 见下述的偏移5Dh 。 + +42h 1 Signature (must be 28h or 29h to be recognised by NT). + 签名(必须是 28h 或者 29h 以便能被 NT 识别) + +43h 4 Volume serial number. + 卷的序列号。 + +47h 11 Volume label. + 卷标签。 + +52h 8 File system ID. "FAT32 ". + 文件系统标识。“FAT32 ”。 + +5Ah 1 opcode for "cli". + 指令 “cli”。 + +5Bh 1 opcode for "cld". + 指令 “cld” 。 + +5Ch 1 opcode for "mov dh, imm8". + 指令 “mov dh, imm8”。 + +5Dh 1 Partition number of this partition on the boot drive. + 此分区在启动驱动器上的分区号。 + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + 0, 1, 2, 3 是主分区。4, 5, 6, ...等等是扩展分区中的逻辑分区。 + + 0xff is for whole drive. So for floppies, it should be 0xff. + 0xff 代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 + +5Eh 414 The rest of the machine code. + 机器码部分。 + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) + + +4. NTFS Boot Sector/Boot Record Layout (for loading grldr) + NTFS 引导扇区/引导记录的布局 (用于载入grldr) + +------------------------------------------------------------------------------ +An NTFS volume can be GRUB-bootable. Copy grldr and an optional menu.lst to +the root dir of the NTFS volume, and build the boot sector based on the +6th-9th sectors of grldr(some fields need to be changed as detailed in the +following table). And then the NTFS volume is GRUB-bootable. +一个FAT32的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT32卷的根 +目录,并按照grldr的第6至9扇区建立它的引导扇区(一些需要更改的字段在下面的表 +中做了详细注释)。然后这个FAT32的卷就是GRUB可启动的。 + +Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot +record onto the leading 4 sectors of an NTFS volume. +更新: bootlace.com是一个在dos/linux下的工具,而它能把GRLDR的引导记录安装到 + 一个NTFS卷的开头4个扇区。 + +Offset Length Description +偏移 长度 说明 + +====== ====== ============================================================== +00h 2 Machine code for short jump over the data. + 近转移指令的机器码。 + +02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for + LBA mode. + LBA指示码。CHS模式时,有效值为0x90;LAB模式时,有效值为0x0e。 + + If the BIOS int13 supports LBA, this byte can be safely set to + 0x0e. + 如果BIOS的int13支持LBA,此字节可以安全地设置为0x0e 。 + + Some USB BIOSes might have bugs when using CHS mode, so the + format program should set this byte to 0x0e. It seems that + (generally) all USB BIOSes have LBA support. + 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 + 序应当设置这个字节为0X0e 。似乎所有(多数)的USB BIOS 都能支持LBA。 + + If the format program does not know whether the BIOS has LBA + support, it may operate this way: + 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: + + if (partition_start + total_sectors_in_partition) exceeds the + CHS addressing ability(especially when it is greater than + 1024*256*63), the caller should set this byte to 0x0e, + otherwise, set to 0x90. + 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 + (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, + 否则,要设为0x90。 + + Update: this byte of LBA indicator is ignored. The boot + record can probe the LBA support of BIOS. + 更新: LBA 指示码这个字节已被忽略。引导记录能探测BIOS的LBA支持。 + + Update(2006-07-31): Though GRLDR won't use this LBA-indicator + byte, Windows 98 uses it. Usually this byte should be 0x90 for + CHS mode(especially for floppies). If this byte is not set + properly, Windows 98 will not recognize the floppy or + partition. This problem was reported by neiljoy. Many thanks! + 更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节,但 + Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 + (软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别 + 软盘或分区。这一问题由neiljoy先生报告。非常感谢! + +03h 8 OEM name string (of OS which formatted the disk). + OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) + +0Bh 2 Bytes per sector. Must be 512. + 每扇区字节数。必须为512 。 + +0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 + and 128. But a cluster size larger than 32K should not occur. + 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。 + 但是簇大小大于32K的情况不应发生。 + +0Eh 2 (Reserved sectors)Unused. + (保留的扇区数)未被使用。 + +10h 1 (Number of FATs)Must be 0. + (文件分配表数)必须为 0 。 + +11h 2 (Maximum number of root directory entries)Must be 0. + (根目录项的最大个数)必须为0 。 + +13h 2 (Total number of sectors for small disks only)Must be 0. + (仅用于小磁盘的扇区总数)必须为0 。 + +15h 1 Media descriptor byte, pretty meaningless now (see below). + 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 + +16h 2 (Sectors per FAT)Must be 0. + (每个文件分配表的扇区数)必须为0 。 + +18h 2 Sectors per track. + 每个磁道的扇区数。 + +1Ah 2 Total number of heads/sides. + 磁头/面的总数。 + +1Ch 4 Number of hidden sectors (those preceding the boot sector). + 隐藏扇区数(它们位于引导扇区之前)。 + + Also referred to as the starting sector of the partition. + 也被称作是分区的起始扇区。 + + For floppies, it should be 0. + 对于软盘,它应当为0 。 + +20h 4 (Total number of sectors for large disks)Must be 0. + (大磁盘的扇区总数)必须为 0 。 + +24h 4 (FAT32 sectors per FAT) - Usually 80 00 80 00, A value of + 80 00 00 00 has been seen on a USB thumb drive which is + formatted with NTFS under Windows XP. Note this is removable + media and is not partitioned, the drive as a whole is NTFS + formatted. + (每个文件分配表的 FAT32 扇区数)- 通常是 80 00 80 00 ,值 + 为80 00 00 00将被看作是由Windows XP格式化为NTFS的USB拇指碟 + +28h 8 Number of sectors in the volume. + 此卷的扇区号。 + +30h 8 LCN of VCN 0 of the $MFT. + $MFT的逻辑簇号。 + +38h 8 LCN of VCN 0 of the $MFTMirr. + $MFTMirr的逻辑簇号。 + +40h 4 Clusters per MFT Record. + 每个MFT记录的簇数。 + +44h 4 Clusters per Index Record. + 每个索引的簇数。 + +48h 8 Volume serial number. + 卷序列号 + +50h 4 Checksum, usually 0. + 校验和,通常为 0 。 + +54h 1 opcode for "cli". + 指令 “cli”。 + +55h 1 opcode for "cld". + 指令 “cld”。 + +56h 1 opcode for "mov dh, imm8". + 指令 “mov dh, imm8”。 + +57h 1 Partition number of this partition on the boot drive. + 此分区在启动驱动器上的分区号。 + + 0, 1, 2, 3 are primary partitions. + 4, 5, 6, ... are logical partitions in the extended partition. + 0, 1, 2, 3 是主分区。4, 5, 6, ...等等是扩展分区中的逻辑分区。 + + 0xff is for whole drive. So for floppies, it should be 0xff. + 0xff 代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 + +58h 420 The rest of the machine code in the first sector. + 机器码部分。 + +1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) + 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) + +200h 1536 The rest of the machine code in the last 3 sectors. + 末尾 3 个扇区为机器码部分。 + +------------------------------------------------------------------------------ + +附录A:FAT32 的文件系统信息扇区(不用于引导grldr) + +Offset Length Description +偏移 长度 说明 +====== ====== ============================================================== +0h 4 Leading Signature 41615252h. + 起始处签名 41615252h 。 + +4h 480 Reserved, set to 0. + 被保留,设为 0 。 + +1E4h 4 FSI structure signature 61417272h. + 故障征兆指数结构签名 61417272h + +1E8h 4 Contains the last known count of free clusters, if this is + equal to FFFFFFFFh, then the count is unknown. + 最后已知的空闲簇数,如果它等于FFFFFFFFh,簇数是未知的。 + +1ECh 4 Cluster number at which you should begin a search for a free + cluster, if this is equal to FFFFFFFFh then the field has not + been set. + 假如它等于FFFFFFFFh的话,你应当去寻找一个空闲簇的簇号码 。 + 此字段没有被设置。 + +1F0h 12 Reserved, set to 0. + 被保留,设为 0 。 + +1FCh 4 Trailing Signature AA550000h. + 结尾签名AA550000h 。 + +------------------------------------------------------------------------------ + +Appendix B: Media Descriptor Byte(not used by grldr) +附录B:媒体描述字节(非用于grldr) + +The Media descriptor byte is meaningless because of the duplications, F0h for +example. +此媒体描述字节没有意义,因为有些字节具有多重意义,例如 F0h 。 + +Byte Type of disk Sectors Heads Tracks Capacity +字节 磁盘种类 扇区 头 磁道 容量 +---- ------------ ------- ----- ------ -------- +FFh 5 1/4" 8 2 40 320KB +FEh 5 1/4" 8 1 40 160KB +FDh 5 1/4" 9 2 40 360KB +FCh 5 1/4" 9 1 40 180KB +FBh both 9 2 80 640KB +FAh both 9 1 80 320KB +F9h 5 1/4" 15 2 80 1200KB +F9h 3 1/2" 9 2 80 720KB +F0h 3 1/2" 18 2 80 1440KB +F0h 3 1/2" 36 2 80 2880KB +F8h hard disk NA NA NA NA + +****************************************************************************** +*** grldr.mbr - 怎样将grldr.mbr写到硬盘的主引导磁道 *** +****************************************************************************** + grldr.mbr包含能够用作主引导记录的代码。此代码负责搜索所有分区的grldr,并且在发现 + 它后装载它。现在被支持的分区种类是:FAT12/FAT16/FAT32,NTFS,EXT2/EXT3。在扩展分区 + 上的逻辑分区也被支持,条件是此扩展分区与微软兼容。实际上,搜索机制没有充分地测试 + 分区类型(0x85 )的Linux 的扩展分区。 + +怎样将 GRLDR.MBR 写到硬盘的主引导磁道? + + 首先,读入 Windows 磁盘签名及分区信息字节(总共72字节,从主引导记录的偏移 + 0x01b8到0x01ff处),并且放置到GRLDR.MBR的开始扇区的相同范围的偏移0x01b8 + 到0x01ff处。 + + 如果硬盘上的主引导记录是由微软的FDISK产生的单一的扇区主引导记录, + 可以选择把它复制到GRLDR.MBR的第二扇区。 + + GRLDR.MBR的第二扇区叫作“原先的主引导记录”。当找不到GRLDR后,将从“原先的主引 + 导记录”开始引导。 + + 不需要其它的步骤,当所有的上述的必要的改变已经完成后,现在只要将GRLDR.MBR写到 + 主引导磁道。这就全部完成了。 + +注意:主引导磁道表示的是硬盘的第一条磁道。 + +注意:GRLDR.MBR 的自举代码只在分区的根目录寻找GRLDR。你最好把menu.lst文件和GRLDR +放置在一起。(就是说放在和 GRLDR 相同分区的相同根目录下。) + +“grldr” 文件名在ext2分区中必须是小写字母,而且grldr的文件种类必须是纯普通文件。 +其它种类,例如,符号链接文件也是不行的。 + + 更新: bootlace.com 是一个在 DOS/LINUX 下的能把 grldr.mbr 安装到主引导记录 + 的工具。整个grldr.mbr被嵌入到bootlace.com工具内部,因此 bootlace.com可以独 + 立使用。参见后面。 + +以下内容供开发人员参考..... +****************************************************************************** +*** grldr.mbr - Details about the control bytes *** +****************************************************************************** + grldr.mbr - 其控制字节的详述 + +Six bytes can be used to control the boot process of GRLDR.MBR. +有六个字节可以控制GRLDR.MBR引导过程。 + +Offset Length Description +偏移量 长度 说明 + +====== ====== ============================================================== +02h 1 bit0=1: disable the search for GRLDR on floppy + bit0=0: enable the search for GRLDR on floppy + 第 0 位=1 :允许搜索软盘上的GRLDR 。 + 第 0 位=0 :禁止搜索软盘上的GRLDR 。 + + bit1=1: disable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + bit1=0: enable the boot of PREVIOUS MBR with invalid + partition table(usually an OS boot sector) + 第 1 位=1 :禁止引导分区表无效的原主引导记录 + (通常是一个操作系统的引导扇区) + 第 1 位=0 :允许引导分区表无效的原主引导记录 + (通常是一个操作系统的引导扇区) + + bit2=1: disable the feature of unconditional entrance to + the command-line(See below `--duce') + bit2=0: enable the feature of unconditional entrance to + the command-line(See below `--duce') + 第 2 位 = 1 :禁止无条件进入命令行 (见下面的`--duce') + 第 2 位 = 0 :允许无条件进入命令行(见下面的`--duce') + + bit3=1: disable geometry tune(See below `--chs-no-tune') + bit3=0: enable geometry tune(See below `--chs-no-tune') + 第 3 位= 1 :禁止改变磁盘几何参数(见下面的 `--chs-no-tune') + 第 3 位= 0 :允许改变磁盘几何参数(见下面的 `--chs-no-tune') + + bit4 - bit6: reserved + 第 4 位到第 6 位:被保留 + + bit7=1: try to boot PREVIOUS MBR after the search for GRLDR + bit7=0: try to boot PREVIOUS MBR before the search for GRLDR + 第 7 位=1:在搜索 GRLDR 之后尝试引导原先的主引导记录 + 第 7 位=0:在搜索 GRLDR 之前尝试引导原先的主引导记录 + +03h 1 timeout in seconds to wait for a key press. 0xff stands for + waiting all the time(endless). + 等待键被按下时的暂停秒数。0xff代表始终暂停(即无休止的)。 + + +04h 2 hot-key code. high byte is scan code, low byte is ASCII code. + the default value is 0x3920, which stands for the space bar. + if this key is pressed, GRUB will be started prior to the boot + of previous MBR. See "int 16 keyboard scan codes" below. + 热键代码。高字节是扫描码,低字节是ASCII码。默认值是0x3920,代 + 表的是空格键。如果此键被按下,GRUB将在引导原先的主引导记录之前 + 启动。见“ int16 键盘扫描码”。 + +06h 1 preferred boot drive number, 0xff for no-drive + 优先引导的驱动器号,0xff 代表没有。 + +07h 1 preferred partition number, 0xff for whole drive + 优先引导的分区号,0xff 代表整个驱动器。 + + if the preferred boot drive number is 0xff, the order of the + search for GRLDR will be: + 如果优先引导的驱动器号是0xff,搜索 GRLDR 的顺序是: + + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + otherwise, if the preferred boot drive number is Y(not equal to + 0xff) and the preferred partition number is K, then the order of + the search for GRLDR will be: + 否则,如果优先引导的驱动器号假定为Y (且不等于0xff),而优先引导 + 的分区号为K,那么搜索 GRLDR 的顺序是: + + (Y) if K=0xff; or (Y,K) otherwise + (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) + (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) + ... ... ... ... ... ... ... ... + (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) + (X=max harddrive number) + (fd0) + + Note: if Y < 0x80, then (Y) is floppy, else (Y) is harddrive, + and (Y,K) is partition number K on harddrive (Y). + 注意:如果Y小于0x80 ,那么这个(Y)驱动器代表软驱,否则就是硬盘驱动器。 + 而(Y,K)代表Y号硬盘驱动器上的 k 号分区。 + + +****************************************************************************** +*** bootlace.com - 安装GRLDR.MBR自举代码到MBR *** +****************************************************************************** + +BOOTLACE.COM 能将GRLDR的引导记录安装到硬盘驱动器或硬盘映像文件的主引导记录中, +或者安装到软盘或者软盘映像的引导扇区。 + +用法: + bootlace.com [OPTIONS] DEVICE_OR_FILE + 选项 设备或文件 +选项: + --read-only 对指定的设备或文件执行所有操作,但是并不不真正地写入。 + + --restore-mbr 恢复原先的主引导记录。 + + --mbr-no-bpb 即使最靠前的是一个FAT分区,也不复制BPB表到主引导记录。 + + --no-backup-mbr 不复制旧的主引导记录到设备或文件的第二扇区。 + + --force-backup-mbr 强行复制主引导记录到设备或文件的第二扇区。 + + --mbr-enable-floppy 允许搜索软盘上的GRLDR 。 + + --mbr-disable-floppy 禁止搜索软盘上的GRLDR 。 + + --mbr-enable-osbr 允许引导分区表无效的原先的主引导记录(通常是 + 操作系统的引导扇区) + + --mbr-disable-osbr 禁止引导分区表无效的原先的主引导记录(通常是 + 操作系统的引导扇区) + + --duce 禁止无条件进入命令行功能。 + + 任何人按‘C’键都可以正常取得命令行控制台,绕 + 过了所有的配置文件。(包括预置的配置文件)。 + 这是一种安全漏洞。所以我们需要这一选项来禁止这 + 种情况。 + + DUCE 即 Disable Unconditional Command-line Entrance + 的缩写,意为无条件的(或不受控的)命令行入口。 + + --chs-no-tune 禁止磁盘几何参数修正功能。 + + --boot-prevmbr-first 在搜索GRLDR之前,先尝试引导原先的主引导记录。 + + --boot-prevmbr-last 在搜索GRLDR之后,再尝试引导原先的主引导记录。 + + --preferred-drive=D 优先引导的驱动器号,驱动器号D应大于0而小于255 。 + + --preferred-partition=P 优先引导的分区号,分区号P应大于0 而小于255 。 + + --serial-number=SN 为硬盘驱动器设置一个新的序列号码。SN必须是非零的数。 + + --time-out=T 在引导原先的主引导记录前等待 T 秒钟。如果T是0xff, + 则始终等待。默认值是 5 。 + + --hot-key=K 如果热键被按下,在引导原先的主引导记录之前启动 + GRUB 。K 是一个双字节的值,如同 int16/AH=1 返回 + 到AX寄存器的值一样。高字节是扫描码,低字节是ASCII + 码。默认值是 0x3920,即空格键。参见“int16键盘扫描码”。 + + --floppy 如果设备或文件是软盘,使用这一选项。 + + --floppy=N 如果设备或文件是一个硬盘驱动器上的分区,使用此选项。 + N用于指定分区号码:0 ,1,2 和 3 为主分区,而 4,5, + 6,...等等为逻辑分区。 + + --sectors-per-track=S 为--floppy 选项指定每磁道扇区数。S 应大于1且小于63, + 默认值是63 。 + + --heads=H 为--floppy选项指定磁头数,H应大于1且小于256 。默认值是255 。 + + --start-sector=B 为--floppy=N 选项指定隐藏扇区。 + + --total-sectors=C 为--floppy 选项指定总扇区数。默认值是 0 。 + + --lba 对--floppy 选项使用 lba 模式。如果软盘BIOS支持LBA, + 你可以在这里指定--lba选项。理论上所有的软盘BIOS 都 + 支持CHS。因此你指定--chs选项更适当。如果--chs和--lba + 选项都未被指定,那么LBA指示码(即引导扇区的第三字节) + 将不被修改。 + + --chs 为--floppy选项使用chs模式。如果软盘BIOS不支持 + LBA,你应当指定--chs选项。我们假定所有的软盘BIOS + 都能支持CHS。所以你需要指定--chs 选项更为恰当。 + 如果既不指定--chs选项又不指定--lba选项,那么LBA + 指示码(即,引导扇区的第三字节)将不被改变。 + + --fat12 --floppy选项使用时,确认安装到FAT12系统。 + + --fat16 --floppy选项使用时,确认安装到FAT16系统。 + + --fat32 --floppy选项使用时,确认安装到FAT32系统。 + + --vfat --floppy选项使用时,确认安装到FAT12/16/32等系统。 + + --ntfs --floppy选项使用时,确认安装到NTFS系统。 + + --ext2 --floppy选项使用时,确认安装到EXT2系统。 + + --install-partition=I 将引导记录安装到指定的硬盘驱动器或硬盘映像(设备或文件) + 的第 I 号分区的引导区中。 + +DEVICE_OR_FILE: 设备或者映像文件的文件名。对于DOS,BIOS驱动器号(两位的十六进制 +或三位的十进制数)可以被用来访问驱动器。BIOS驱动器号0表示第一软盘,1表示第二硬盘; +0x80 表示第一硬盘驱动器,0x81表示第二硬盘驱动器,等等。 + +注意:BOOTLACE.COM 仅仅是把引导代码写到MBR中。引导代码需要加载GRLDR作为GRUB启动 +过程的第二(最后)阶段。因而在BOOTLACE.COM成功执行前或者是执行后,GRLDR应当被复 +制到任一受支持分区的根目录下,当前受支持分区的文件系统类型仅有FAT12,FAT16,FAT32, +NTFS,EXT2以及EXT3 。 + +注意 2:如果DEVICE_OR_FILE是硬盘设备或是硬盘映像文件,它必须包含有效的分区表, +否则,BOOTLACE.COM 将安装失败。如果设备或文件是指向软驱或者软盘映像文件,那么 +他必须包含一个受支持的文件系统(FAT12/FAT16/FAT32/NTFS/EXT2/EXT3 等之一)。 + +注意 3:如果DEVICE_OR_FILE是软驱或软盘映像文件,而它又被格式化为EXT2或EXT3, +那么你必须明确指定--sectors-per-track 和 --heads 选项。 + +重要!! 如果你安装grldr的引导代码到一个软盘或者一个分区,此软盘或分区将只能从 +grldr引导 ,而你原本的IO.SYS(DOS/Win9x/Me)和NTLDR(WinNT/2K/XP)将变为不能 +引导。这是由于软盘或分区的原始引导记录被覆盖了。而把GRLDR的引导记录安装到MBR +则没有这个问题。 +更新:在最新版本的GRUB4DOS中NTLDR,IO.SYS或KERNEL.SYS等文件,可以被直接加载。 + +提示:如果文件名的开始是短划线(-)或数字,你可以在它前面加上目录名(./) 或 (.\)。 + +示例: + 在Linux下安装GRLDR的引导代码到MBR: + bootlace.com /dev/hda + + 在DOS下安装GRLDR的引导代码到MBR: + bootlace.com 0x80 + + 在DOS或Linux下安装GRLDR的引导代码到硬盘映像: + bootlace.com hd.img + + 在Linux下安装GRLDR的引导代码到软盘: + bootlace.com --floppy --chs /dev/fd0 + + 在DOS下安装GRLDR的引导代码到软盘: + bootlace.com --floppy --chs 0x00 + + 在DOS或Linux下安装GRLDR的引导代码到软盘映像: + bootlace.com --floppy --chs floppy.img + +BOOTLACE.COM 无法在Windows NT/2000/XP/2003下正常运行。它被希望(和设计)用于 +DOS/Win9x和Linux中。 + +更新:对于映像文件,在Windows NT/2000/XP/2003下,bootlace.com 可以正常使用。 + +bootlace.com不能在 Windows NT/2000/XP/2003 中运行的原因是,bootlace.com是一个DOS工具而 Windows NT/2000/XP/2003 +不认可它对设备的访问,你可以通过WINHEX/DISKRW之类的工具来间接的完全这个操作. +一个DISKRW的例子在这里: + http://bbs.znpc.net/viewthread.php?tid=5447 + +****************************************************************************** +*** kexec-tools should be patched for the 1.101 release *** +****************************************************************************** + kexec-tools 应当打上1.101发布的补丁 + +The file kexec-tools-1.101-patch is a patch to the kexec-tools-1.101 release. +Kexec might fail to load grub.exe without this patch. +kexec-tools-1.101-patch 是为kexec-tools-1.101发布的补丁。没有这个补丁Kexec 加载 +grub.exe 会失败。 + +The home page of kexec-tools is: +kexec-tools 的主页是: + + http://www.xmission.com/~ebiederm/files/kexec/ + +Note: The Linux kernel should be KEXEC enabled before kexec can be run. +注意: 在使用 kexec 前应该使 Linux 核心支持 KEXEC 系统调用。 + + !! Important Update !! + 重要更新 + +The patch `kexec-tools-1.101-patch' is not needed now and has been deleted. +Even worse, it fails in `kexec -l grub.exe --initrd=imgfile'. So please +do not use it any more. +现在不再需要`kexec-tools-1.101-patch'补丁而且它已经被删除了。很糟糕的是,执行 +`kexec -l grub.exe --initrd=imgfile'竟会失败。所以请不要再使用它。 + +****************************************************************************** +*** Direct transition to DOS/Win9x from within Linux *** +****************************************************************************** + 从Linux直接转换到DOS/Win9x + +使用kexec,我们能够轻易地从运行中的 Linux 系统启动到 DOS/Win9x 。 + +假如 WIN98.IMG 是一个可引导的硬盘映像,按照如下操作: + +kexec -l grub.exe --initrd=WIN98.IMG --command-line="--config-file=map (rd) (hd0); map --hook; chainloader (hd0)+1; rootnoverify (hd0)" + +kexec -e + +如果DOS.IMG是一个可引导的软盘映像,按照以下方法: + +kexec -l grub.exe --initrd=DOS.IMG --command-line="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +kexec -e + +注意,按照这种方式,我们可以不用使用真实的 DOS/Win9x 磁盘就启动到 DOS/Win9x 。 +我们不需要FAT分区而只需要一个映像文件。 + +我们已经注意到通过使用 kexec 和 grub.exe,Linux本身就能够成为一个大的引导管理器。 +这给安装程序或者引导程序或者初始化程序的开发者带来了方便。 + +当然,grub.exe和可引导的磁盘映像也能够被运行中的GRUB 或LILO 或syslinux 加载。例如: + +1.通过 GRUB 加载: + + kernel (hd0,0)/grub.exe --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + initrd (hd0,0)/DOS.IMG + boot + +2.通过 LILO 加载: + + image=/boot/grub.exe + label=grub.exe + initrd=/boot/DOS.IMG + append="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +3.通过 SYSLINUX 加载: + + label grub.exe + kernel grub.exe + append initrd=DOS.IMG --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" + +注意:如果使用上面的‘map (rd) (...)’失败,你可以使用‘map (rd)+1 (...)’代替, +然后再试一次。 + +****************************************************************************** +*** Keyboard BIOS Scan Code/ASCII code tables *** +****************************************************************************** + 键盘 BIOS 扫描码和 ASCII 码表 + +Keyboard bios scan code and ascii character code tables can be obtained from +the web by, for example, googling for "3920 372A 4A2D 4E2B 352F". Here are 2 +main results: +键盘 bios 扫描码和 ASCII 字符码表能够通过 web 网获取,例如,使用 google 查找 +"3920 372A 4A2D 4E2B 352F"。这里有两项主要的结果: + +1. From "http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html": + 转自“http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html”: + +INT 16 - Keyboard Scan Codes +INT 16 - 键盘扫描码 + + Key Normal Shifted w/Ctrl w/Alt + 键位 常态 上档态 控制态 变更态 + + A 1E61 1E41 1E01 1E00 + B 3062 3042 3002 3000 + C 2E63 2E43 2E03 2E00 + D 2064 2044 2004 2000 + E 1265 1245 1205 1200 + F 2166 2146 2106 2100 + G 2267 2247 2207 2200 + H 2368 2348 2308 2300 + I 1769 1749 1709 1700 + J 246A 244A 240A 2400 + K 256B 254B 250B 2500 + L 266C 264C 260C 2600 + M 326D 324D 320D 3200 + N 316E 314E 310E 3100 + O 186F 184F 180F 1800 + P 1970 1950 1910 1900 + Q 1071 1051 1011 1000 + R 1372 1352 1312 1300 + S 1F73 1F53 1F13 1F00 + T 1474 1454 1414 1400 + U 1675 1655 1615 1600 + V 2F76 2F56 2F16 2F00 + W 1177 1157 1117 1100 + X 2D78 2D58 2D18 2D00 + Y 1579 1559 1519 1500 + Z 2C7A 2C5A 2C1A 2C00 + + Key Normal Shifted w/Ctrl w/Alt + 键位 常态 上档态 控制态 变更态 + + 1 0231 0221 7800 + 2 0332 0340 0300 7900 + 3 0433 0423 7A00 + 4 0534 0524 7B00 + 5 0635 0625 7C00 + 6 0736 075E 071E 7D00 + 7 0837 0826 7E00 + 8 0938 092A 7F00 + 9 0A39 0A28 8000 + 0 0B30 0B29 8100 + + Key Normal Shifted w/Ctrl w/Alt + 键位 常态 上档态 控制态 变更态 + + - 0C2D 0C5F 0C1F 8200 + = 0D3D 0D2B 8300 + [ 1A5B 1A7B 1A1B 1A00 + ] 1B5D 1B7D 1B1D 1B00 + ; 273B 273A 2700 + ' 2827 2822 + ` 2960 297E + \ 2B5C 2B7C 2B1C 2600 (same as Alt L) + , 332C 333C + . 342E 343E + / 352F 353F + + Key Normal Shifted w/Ctrl w/Alt + 键位 常态 上档态 控制态 变更态 + + F1 3B00 5400 5E00 6800 + F2 3C00 5500 5F00 6900 + F3 3D00 5600 6000 6A00 + F4 3E00 5700 6100 6B00 + F5 3F00 5800 6200 6C00 + F6 4000 5900 6300 6D00 + F7 4100 5A00 6400 6E00 + F8 4200 5B00 6500 6F00 + F9 4300 5C00 6600 7000 + F10 4400 5D00 6700 7100 + F11 8500 8700 8900 8B00 + F12 8600 8800 8A00 8C00 + + Key Normal Shifted w/Ctrl w/Alt + 键位 常态 上档态 控制态 变更态 + + BackSpace 0E08 0E08 0E7F 0E00 + Del 5300 532E 9300 A300 + Down Arrow 5000 5032 9100 A000 + End 4F00 4F31 7500 9F00 + Enter 1C0D 1C0D 1C0A A600 + Esc 011B 011B 011B 0100 + Home 4700 4737 7700 9700 + Ins 5200 5230 9200 A200 + Keypad 5 4C35 8F00 + Keypad * 372A 9600 3700 + Keypad - 4A2D 4A2D 8E00 4A00 + Keypad + 4E2B 4E2B 4E00 + Keypad / 352F 352F 9500 A400 + Left Arrow 4B00 4B34 7300 9B00 + PgDn 5100 5133 7600 A100 + PgUp 4900 4939 8400 9900 + PrtSc 7200 + Right Arrow 4D00 4D36 7400 9D00 + SpaceBar 3920 3920 3920 3920 + Tab 0F09 0F00 9400 A500 + Up Arrow 4800 4838 8D00 9800 + + + 一些组合键不是在所有系统中都能获取。PS/2 包括了很多不能在PC, XT和 + AT上获取的组合键。 + +- To retrieve the character from a scan code logical AND the word + with 0x00FF. + 由扫描码检索出字符可以用 0x00FF 和该字符进行逻辑与操作。 + +- see INT 16 MAKE CODES + 参见INT16 通码 + + + +2. From "http://www.hoppie.nl/ivan/keycodes.txt": + 转自“http://www.hoppie.nl/ivan/keycodes.txt”: + + + Keystroke Keypress code +-------------------------------------------------- + Esc 011B + 1 0231 + 2 0332 + 3 0433 + 4 0534 + 5 0635 + 6 0736 + 7 0837 + 8 0938 + 9 0A39 + 0 0B30 + - 0C2D + = 0D3D + Backspace 0E08 + Tab 0F09 + q 1071 + w 1177 + e 1265 + r 1372 + t 1474 + y 1579 + u 1675 + i 1769 + o 186F + p 1970 + [ 1A5B + ] 1B5D + Enter 1C0D + Ctrl ** + a 1E61 + s 1F73 + d 2064 + f 2166 + g 2267 + h 2368 + j 246A + k 256B + l 266C + ; 273B + ' 2827 + ` 2960 + Shift ** + \ 2B5C + z 2C7A + x 2D78 + c 2E63 + v 2F76 + b 3062 + n 316E + m 326D + , 332C + . 342E + / 352F + Gray * 372A + Alt ** + Space 3920 + Caps Lock ** + F1 3B00 + F2 3C00 + F3 3D00 + F4 3E00 + F5 3F00 + F6 4000 + F7 4100 + F8 4200 + F9 4300 + F10 4400 + F11 8500 + F12 8600 + Num Lock ** + Scroll Lock ** + White Home 4700 + White Up Arrow 4800 + White PgUp 4900 + Gray - 4A2D + White Left Arrow 4B00 + Center Key 4C00 + White Right Arrow 4D00 + Gray + 4E2B + White End 4F00 + White Down Arrow 5000 + White PgDn 5100 + White Ins 5200 + White Del 5300 + SysReq ** + Key 45 [1] 565C + Enter (number keypad) 1C0D + Gray / 352F + PrtSc ** + Pause ** + Gray Home 4700 + Gray Up Arrow 4800 + Gray Page Up 4900 + Gray Left Arrow 4B00 + Gray Right Arrow 4D00 + Gray End 4F00 + Gray Down Arrow 5000 + Gray Page Down 5100 + Gray Insert 5200 + Gray Delete 5300 + + Shift Esc 011B + ! 0221 + @ 0340 + # 0423 + $ 0524 + % 0625 + ^ 075E + & 0826 + * (white) 092A + ( 0A28 + ) 0B29 + _ 0C5F + + (white) 0D2B + Shift Backspace 0E08 + Shift Tab (Backtab) 0F00 + Q 1051 + W 1157 + E 1245 + R 1352 + T 1454 + Y 1559 + U 1655 + I 1749 + O 184F + P 1950 + { 1A7B + } 1B7D + Shift Enter 1C0D + Shift Ctrl ** + A 1E41 + S 1F53 + D 2044 + F 2146 + G 2247 + H 2348 + J 244A + K 254B + L 264C + : 273A + " 2822 + ~ 297E + | 2B7C + Z 2C5A + X 2D58 + C 2E43 + V 2F56 + B 3042 + N 314E + M 324D + < 333C + > 343E + ? 353F + Shift Gray * 372A + Shift Alt ** + Shift Space 3920 + Shift Caps Lock ** + Shift F1 5400 + Shift F2 5500 + Shift F3 5600 + Shift F4 5700 + Shift F5 5800 + Shift F6 5900 + Shift F7 5A00 + Shift F8 5B00 + Shift F9 5C00 + Shift F10 5D00 + Shift F11 8700 + Shift F12 8800 + Shift Num Lock ** + Shift Scroll Lock ** + Shift 7 (number pad) 4737 + Shift 8 (number pad) 4838 + Shift 9 (number pad) 4939 + Shift Gray - 4A2D + Shift 4 (number pad) 4B34 + Shift 5 (number pad) 4C35 + Shift 6 (number pad) 4D36 + Shift Gray + 4E2B + Shift 1 (number pad) 4F31 + Shift 2 (number pad) 5032 + Shift 3 (number pad) 5133 + Shift 0 (number pad) 5230 + Shift . (number pad) 532E + Shift SysReq ** + Shift Key 45 [1] 567C + Shift Enter (number pad) 1C0D + Shift Gray / 352F + Shift PrtSc ** + Shift Pause ** + Shift Gray Home 4700 + Shift Gray Up Arrow 4800 + Shift Gray Page Up 4900 + Shift Gray Left Arrow 4B00 + Shift Gray Right Arrow 4D00 + Shift Gray End 4F00 + Shift Gray Down Arrow 5000 + Shift Gray Page Down 5100 + Shift Gray Insert 5200 + Shift Gray Delete 5300 + + Ctrl Esc 011B + Ctrl 1 -- + Ctrl 2 (NUL) 0300 + Ctrl 3 -- + Ctrl 4 -- + Ctrl 5 -- + Ctrl 6 (RS) 071E + Ctrl 7 -- + Ctrl 8 -- + Ctrl 9 -- + Ctrl 0 -- + Ctrl - 0C1F + Ctrl = -- + Ctrl Backspace (DEL) 0E7F + Ctrl Tab 9400 + Ctrl q (DC1) 1011 + Ctrl w (ETB) 1117 + Ctrl e (ENQ) 1205 + Ctrl r (DC2) 1312 + Ctrl t (DC4) 1414 + Ctrl y (EM) 1519 + Ctrl u (NAK) 1615 + Ctrl i (HT) 1709 + Ctrl o (SI) 180F + Ctrl p (DEL) 1910 + Ctrl [ (ESC) 1A1B + Ctrl ] (GS) 1B1D + Ctrl Enter (LF) 1C0A + Ctrl a (SOH) 1E01 + Ctrl s (DC3) 1F13 + Ctrl d (EOT) 2004 + Ctrl f (ACK) 2106 + Ctrl g (BEL) 2207 + Ctrl h (Backspace) 2308 + Ctrl j (LF) 240A + Ctrl k (VT) 250B + Ctrl l (FF) 260C + Ctrl ; -- + Ctrl ' -- + Ctrl ` -- + Ctrl Shift ** + Ctrl \ (FS) 2B1C + Ctrl z (SUB) 2C1A + Ctrl x (CAN) 2D18 + Ctrl c (ETX) 2E03 + Ctrl v (SYN) 2F16 + Ctrl b (STX) 3002 + Ctrl n (SO) 310E + Ctrl m (CR) 320D + Ctrl , -- + Ctrl . -- + Ctrl / -- + Ctrl Gray * 9600 + Ctrl Alt ** + Ctrl Space 3920 + Ctrl Caps Lock -- + Ctrl F1 5E00 + Ctrl F2 5F00 + Ctrl F3 6000 + Ctrl F4 6100 + Ctrl F5 6200 + Ctrl F6 6300 + Ctrl F7 6400 + Ctrl F8 6500 + Ctrl F9 6600 + Ctrl F10 6700 + Ctrl F11 8900 + Ctrl F12 8A00 + Ctrl Num Lock -- + Ctrl Scroll Lock -- + Ctrl White Home 7700 + Ctrl White Up Arrow 8D00 + Ctrl White PgUp 8400 + Ctrl Gray - 8E00 + Ctrl White Left Arrow 7300 + Ctrl 5 (number pad) 8F00 + Ctrl White Right Arrow 7400 + Ctrl Gray + 9000 + Ctrl White End 7500 + Ctrl White Down Arrow 9100 + Ctrl White PgDn 7600 + Ctrl White Ins 9200 + Ctrl White Del 9300 + Ctrl SysReq ** + Ctrl Key 45 [1] -- + Ctrl Enter (number pad) 1C0A + Ctrl / (number pad) 9500 + Ctrl PrtSc 7200 + Ctrl Break 0000 + Ctrl Gray Home 7700 + Ctrl Gray Up Arrow 8DE0 + Ctrl Gray Page Up 8400 + Ctrl Gray Left Arrow 7300 + Ctrl Gray Right Arrow 7400 + Ctrl Gray End 7500 + Ctrl Gray Down Arrow 91E0 + Ctrl Gray Page Down 7600 + Ctrl Gray Insert 92E0 + Ctrl Gray Delete 93E0 + + Alt Esc 0100 + Alt 1 7800 + Alt 2 7900 + Alt 3 7A00 + Alt 4 7B00 + Alt 5 7C00 + Alt 6 7D00 + Alt 7 7E00 + Alt 8 7F00 + Alt 9 8000 + Alt 0 8100 + Alt - 8200 + Alt = 8300 + Alt Backspace 0E00 + Alt Tab A500 + Alt q 1000 + Alt w 1100 + Alt e 1200 + Alt r 1300 + Alt t 1400 + Alt y 1500 + Alt u 1600 + Alt i 1700 + Alt o 1800 + Alt p 1900 + Alt [ 1A00 + Alt ] 1B00 + Alt Enter 1C00 + Alt Ctrl ** + Alt a 1E00 + Alt s 1F00 + Alt d 2000 + Alt f 2100 + Alt g 2200 + Alt h 2300 + Alt j 2400 + Alt k 2500 + Alt l 2600 + Alt ; 2700 + Alt ' 2800 + Alt ` 2900 + Alt Shift ** + Alt \ 2B00 + Alt z 2C00 + Alt x 2D00 + Alt c 2E00 + Alt v 2F00 + Alt b 3000 + Alt n 3100 + Alt m 3200 + Alt , 3300 + Alt . 3400 + Alt / 3500 + Alt Gray * 3700 + Alt Space 3920 + Alt Caps Lock ** + Alt F1 6800 + Alt F2 6900 + Alt F3 6A00 + Alt F4 6B00 + Alt F5 6C00 + Alt F6 6D00 + Alt F7 6E00 + Alt F8 6F00 + Alt F9 7000 + Alt F10 7100 + Alt F11 8B00 + Alt F12 8C00 + Alt Num Lock ** + Alt Scroll Lock ** + Alt Gray - 4A00 + Alt Gray + 4E00 + Alt 7 (number pad) # + Alt 8 (number pad) # + Alt 9 (number pad) # + Alt 4 (number pad) # + Alt 5 (number pad) # + Alt 6 (number pad) # + Alt 1 (number pad) # + Alt 2 (number pad) # + Alt 3 (number pad) # + Alt Del -- + Alt SysReq ** + Alt Key 45 [1] -- + Alt Enter (number pad) A600 + Alt / (number pad) A400 + Alt PrtSc ** + Alt Pause ** + Alt Gray Home 9700 + Alt Gray Up Arrow 9800 + Alt Gray Page Up 9900 + Alt Gray Left Arrow 9B00 + Alt Gray Right Arrow 9D00 + Alt Gray End 9F00 + Alt Gray Down Arrow A000 + Alt Gray Page Down A100 + Alt Gray Insert A200 + Alt Gray Delete A300 + + ------------------------------------------------------------------------- + +Footnotes +脚注 + [1] In the United States, the 101/102-key keyboard is shipped + with 101 keys. Overseas versions have an additional key + sandwiched between the left Shift key and the Z key. This + additional key is identified by IBM (and in this table) as + "Key 45." + 在美国,101/102键键盘有101 个键。海外版本有一个附加的键,夹在 + 左上档键和Z 键之间。此附加键是由IBM 确定的(在本表中是 45 键)。 + + [**] Keys and key combinations marked ** are used by the ROM BIOS + but do not put values into the keyboard buffer. + 键及键组合若有 ** 标记,则被ROM BIOS所使用,但不会将键值放入键盘 + 缓冲区。 + + [--] Keys and key combinations marked -- are ignored by the ROM + BIOS. + 键及键组合若有 -- 标记,则被ROM BIOS所忽略。 + + + +3. From "http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html": + 转自“http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html”: + +INT 9 - Hardware Keyboard Make/Break Codes +INT 9 - 硬件键盘的通/断码 + + Key Make Break Key Make Break + 键位 通码 断码 键位 通码 断码 + + Backspace 0E 8E F1 3B BB + Caps Lock 3A BA F2 3C BC + Enter 1C 9C F3 3D BD + Esc 01 81 F4 3E BE + Left Alt 38 B8 F7 41 C1 + Left Ctrl 1D 9D F5 3F BF + Left Shift 2A AA F6 40 C0 + Num Lock 45 C5 F8 42 C2 + Right Shift 36 B6 F9 43 C3 + Scroll Lock 46 C6 F10 44 C4 + Space 39 B9 F11 57 D7 + Sys Req (AT) 54 D4 F12 58 D8 + Tab 0F 8F + + Keypad Keys Make Break + 数字小键盘键位 通码 断码 + + Keypad 0 (Ins) 52 D2 + Keypad 1 (End) 4F CF + Keypad 2 (Down arrow) 50 D0 + Keypad 3 (PgDn) 51 D1 + Keypad 4 (Left arrow) 4B CB + Keypad 5 4C CC + Keypad 6 (Right arrow) 4D CD + Keypad 7 (Home) 47 C7 + Keypad 8 (Up arrow) 48 C8 + Keypad 9 (PgUp) 49 C9 + Keypad . (Del) 53 D3 + Keypad * (PrtSc) 37 B7 + Keypad - 4A CA + Keypad + 4E CE + + Key Make Break Key Make Break + 键位 通码 断码 键位 通码 断码 + + A 1E 9E N 31 B1 + B 30 B0 O 18 98 + C 2E AE P 19 99 + D 20 A0 Q 10 90 + E 12 92 R 13 93 + F 21 A1 S 1F 9F + G 22 A2 T 14 94 + H 23 A3 U 16 96 + I 17 97 V 2F AF + J 24 A4 W 11 91 + K 25 A5 X 2D AD + L 26 A6 Y 15 95 + M 32 B2 Z 2C AC + + Key Make Break Key Make Break + 键位 通码 断码 键位 通码 断码 + + 1 02 82 - 0C 8C + 2 03 83 = 0D 8D + 3 04 84 [ 1A 9A + 4 05 85 ] 1B 9B + 5 06 86 ; 27 A7 + 6 07 87 ' 28 A8 + 7 08 88 ` 29 A9 + 8 09 89 \ 2B AB + 9 0A 8A , 33 B3 + 0 0B 8B . 34 B4 + / 35 B5 + + +Enhanced Keyboard Keys (101/102 keys) +键盘扩展键 (101/102 键) + + Control Keys Make Break + 控制键 通码 断码 + + Alt-PrtSc (SysReq) 54 D4 + Ctrl-PrtSc E0 37 E0 B7 + Enter E0 1C E0 9C + PrtSc E0 2A E0 37 E0 B7 E0 AA + Right Alt E0 38 E0 B8 + Right Ctrl E0 1D E0 9D + Shift-PrtSc E0 37 E0 B7 + / E0 35 E0 B5 + Pause E1 1D 45 E1 9D C5 (not typematic) + Ctrl-Pause (Ctrl-Break) E0 46 E0 C6 (not typematic) + + - Keys marked as "not typematic" generate one stream of bytes + without corresponding break scan code bytes (actually the + break codes are part of the make code). + 键位是以未使用断码扫描码字节信息的“非机器自动连续打印的"所 + 生成的一种扫描码字节流来标记的。(实际上断码是通码的一部分) + (译注:typematic 有人翻译为‘机打’) + + + Normal Mode or + Shift w/Numlock + 常态或上档态及 + 数字键盘锁定态模式 + + Key Make Break |----- Numlock on ------. + 数字键盘锁定 + Make Break + 键位 通码 断码 通码 断码 + + Del E0 53 E0 D3 E0 2A E0 53 E0 D3 E0 AA + Down arrow E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA + End E0 4F E0 CF E0 2A E0 4F E0 CF E0 AA + Home E0 47 E0 C7 E0 2A E0 47 E0 C7 E0 AA + Ins E0 52 E0 D2 E0 2A E0 52 E0 D2 E0 AA + Left arrow E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA + PgDn E0 51 E0 D1 E0 2A E0 51 E0 D1 E0 AA + PgUp E0 49 E0 C9 E0 2A E0 49 E0 C9 E0 AA + Right arrow E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA + Up arrow E0 48 E0 C8 E0 2A E0 48 E0 C8 E0 AA + + Key |--Left Shift Pressed--. |--Right Shift Pressed--. + 键位 左上档键按下时 右上档键按下时 + + Make Break Make Break + 通码 断码 通码 断码 + + Del E0 AA E0 53 E0 D3 E0 2A E0 B6 E0 53 E0 D3 E0 36 + Down arrow E0 AA E0 50 E0 D0 E0 2A E0 B6 E0 50 E0 D0 E0 36 + End E0 AA E0 4F E0 CF E0 2A E0 B6 E0 4F E0 CF E0 36 + Home E0 AA E0 47 E0 C7 E0 2A E0 B6 E0 47 E0 C7 E0 36 + Ins E0 AA E0 52 E0 D2 E0 2A E0 B6 E0 52 E0 D2 E0 36 + Left arrow E0 AA E0 4B E0 CB E0 2A E0 B6 E0 4B E0 CB E0 36 + PgDn E0 AA E0 51 E0 D1 E0 2A E0 B6 E0 51 E0 D1 E0 36 + PgUp E0 AA E0 49 E0 C9 E0 2A E0 B6 E0 49 E0 C9 E0 36 + Right arrow E0 AA E0 4D E0 CD E0 2A E0 B6 E0 4D E0 CD E0 36 + Up arrow E0 AA E0 48 E0 C8 E0 2A E0 B6 E0 48 E0 C8 E0 36 + / E0 AA E0 35 E0 B5 E0 2A E0 B6 E0 35 E0 B5 E0 36 + + + - The PS/2 models have three make/break scan code sets. The first + set matches the PC & XT make/break scan code set and is the one + listed here. Scan code sets are selected by writing the value F0 + to the keyboard via the 8042 (port 60h). The following is a brief + description of the scan code sets (see the PS/2 Technical Reference + manuals for more information on scan code sets 2 and 3): + PS/2 类型有三套通断扫描码。其中第一套是适用于PC & XT 的通断码扫描码集, + 并列在了这里。扫描码集可以通过向8042 键盘控制器(端口60)写入值 F0 来 + 选择。下面是扫描码集的简要介绍(更多第2,3套扫描码集的信息见PS/2 技术 + 参考手册) + + / set 1, each key has a base scan code. Some keys generate + extra scan codes to generate artificial shift states. This + is similar to the standard scan code set used on the PC and XT. + 第一套扫描码集,每个键具有一个基本的扫描码。一些键产生扩展扫 + 描码以便人工生成上档状态。它与 PC 和 XT 机上的标准扫描码相似。 + + / set 2, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code). This scan code + set is available on the IBM AT also. + 第二套扫描码集,每个键发送一个通码扫描码和两个断码扫描码字节 + (通码在F0之后)。这套扫描码集在 IBM AT 机上也有效。 + + / set 3, each key sends one make scan code and two break scan + codes bytes (F0 followed by the make code) and no keys are + altered by Shift/Alt/Ctrl keys. + 第三套扫描码集,每个键发送一个通码扫描码和两个断码扫描码字节 + (通码在F0之后)并且键位不随 Shift/Alt/Ctrl 等键的使用而改变。 + + / typematic scan codes are the same as the make scan code + “非机器自动连续打印的”扫描码和通码扫描码是相同的。 + + - Some Tandy 1000's do not handle Alt key combinations when multiple + shift keys are pressed. The Alt-Shift-H combination loses the Alt. + 一些 Tandy 1000 机器在多重组合键的 shift 键被按下时不能处理 ALT 键。 + 使用键组合 Alt-Shift-H 时会丢失 ALT 键。 + + - extended keys like (F11, F12) can only be read with systems that + have extended keyboard BIOS support (or INT 9 extensions); to + read these special keys on these systems INT 16,10 must be used + 扩展键比如(F11,F12)等只能在具有 BIOS 键盘扩展支持(或 INT 9 扩展) + 的系统上被读取。用INT16读取这些系统上的特别的键时,必须使用10号功能 。 + + +****************************************************************************** +*** GRLDR Error messages *** +****************************************************************************** + GRLDR 错误提示信息 + +1. Missing MBR-helper. + 缺少主引导辅助记录。 + + 紧接在主引导记录后的辅助功能程序不见了,或者是它已经被病毒或 Windows + XP/Vista等删除了。 + + 运行 bootlace.com 工具来解决这个问题。 + +2. Buggy BIOS! + 缺陷太多的BIOS! + + 你的 BIOS 太糟糕了。它甚至不能支持 INT 13/AH=8 。 + + 除了升级你的 BIOS 没有办法解决。未来,缺陷多的 BIOS 将会很常见而且 + 会对 grub4dos 造成很多问题。 + +3. This partition is NTFS but with unknown boot record. Please install +Microsoft NTFS boot sectors to this partition correctly, or create an +FAT12/16/32 partition and place the same copy of GRLDR and MENU.LST there. +此分区系统是 NTFS 但包含未知的引导记录。请安装正确的微软 NTFS 引导扇区到 +这个分区,或者建立一个FAT12/16/32的分区并将GRLDR 及MENU.LST 的相同的备份 +文件放到那里。 + + The boot record was changed or erased by Microsoft Windows XP Service + Pack 2. + 引导记录已经被微软 Windows XP Service Pack 2 改变或删除。 + + You may install the old boot record introduced with the original clean + Windows 2K/XP. As another solution, you may create an FAT partition + for your system, and copy GRLDR and your MENU.LST to its root dir. + 你可以用原来的引导记录来安装,以清理掉Windows 2K/XP的记录。另一个解决办 + 法是,你可以在系统上建立一个FAT分区,并且将GRLDR 和你的MENU.LST复制到它 + 的根目录。 + + While the startup code of grldr might fail to load GRLDR in NTFS + partitions, it always successfully loads GRLDR in FAT partitions(and + even in ext2/ext3 partitions). + 在NTFS分区grldr的自举代码在加载GRLDR时可能会失败,但在FAT分区(甚至在 + ext2/ext3分区)它总能成功加载 GRLDR 。 + + Note that NTLDR only loads the startup code of grldr(i.e., the leading + 16 sectors of grldr), not the whole grldr file. + 注意 NTLDR只能加载grldr的自举代码(即,grldr开头的16个扇区),而不能将 + 整个grldr载入。 + + + Thus, C:\GRLDR must exist(here C: can be NTFS), since it is used for + BOOT.INI and NTLDR. If C: is NTFS, X:\GRLDR should exist as well, + where X: stands for a certain FAT partition. + 因此,自从它用于 BOOT.INI 和 NTLDR 以来 ,C 盘根目录下必须存在有GRLDR + (这里的C盘可以是 NTFS 文件系统)。 + + + +****************************************************************************** +*** Known BIOS bugs *** +****************************************************************************** + 已知的BIOS 缺陷 + +1. 一些较新的 Dell 机不能支持int13/AH=43h 。当你尝试对仿真磁盘进行写访问时, + 可能会遭遇失败。 + + 注意:这个缺陷非常严重!老的安装方法"root+setup" (在实模式的grub环 + 境中)使用INT13将stage2文件写入第一扇区。在这些有缺陷的DELL机上通过 + LBA 模式来访问 stage2 文件时将会失败。 + +2.一些有缺陷的BIOS不能引导启动光盘映像文件(见前面)。(虚拟机qemu 能良好的引导) + +3.在DOS下运行GRUB.EXE时,一些较新的 Dell 机激烈地破坏那些硬件中断请求的中断向量, + 而使得机器会失去响应 。你可以尝试用BADGRUB.EXE来再试一次。 + +4.有报告称,通过Linux中的kexec启动GRUB.EXE后,一些BIOS将功能异常。报告称一些 + 机器会死机,而另一些不能访问USB驱动器。 + +****************************************************************************** +*** Known Problems *** +****************************************************************************** + 已知问题 +1. 在 Windows 9x/Me的DOS窗口运行GRUB.EXE时可能会死机,特别是在这些系统 + 使用USB的时候。在Linux下通过KEXEC运行GRUB.EXE时,你也可能碰到同样的 + 问题。 + +注意: 你不能在已进入保护模式的Win 9x 中运行GRUB.EXE,那可能会死机;作为变 + 通,你可以执行“重启并进入MS-DOS模式”选项来达到运行 GRUB.EXE 的目 + 的,这很安全。 + +2. 默认的chainloader动作将保持 A20 的状态。一些有缺陷的 DOS 扩展内存管理软 + 件可能会令机器死掉。你可以在chainloader命令行中使用--disable-a20选项 + 然后再试一次。至少,你应当避免使用那些有缺陷的内存管理软件。 + +3. THTF BIOS L4S5M Ver 1.1a(dated 2002-1-10) has a buggy int15 which + causes hang at the boot of a multi boot kernel(memdisk for example). + OEM签名为清华同方,主板为精英L4S5M, BIOS版本1.1a(日期 2002-1-10) + 的机器上,其 int15 含有缺陷,当它启动一个多重引导核心时,会失去响应。 + (比如使用syslinux的memdisk时) + +4. 在天汇标准中文系统中,较新的GRUB.EXE不能运行。 + 总之,在具有反跟踪措施的内存驻留程序的系统下GRUB.EXE不再运行。 + +****************************************************************************** +*** List of binary files and their corresponding source files *** +****************************************************************************** + 二进制文件及对应的源代码文件列表 + +binary file main source file other included source or binary files +二进制文件 源代码主文件 包含的其他源代码或二进制文件 +------------- ---------------- ------------------------------------- + +bootlace.com bootlacestart.S bootlace.inc, grldrstart.S + +grldr grldrstart.S pre_stage2(binary, See note below) + +grldr.mbr mbrstart.S grldrstart.S + +grub.exe dosstart.S pre_stage2(binary, See note below) + +hmload.com hmloadstart.S + +----------------------------------------------------------------------------- +注意:pre_stage2 是GNU GRUB的主体程序,它以二进制格式被简单的添加到grldrstart + 及dosstart部分,形成我们的grldr和grub.exe 。 + +注意:GRUB (无.exe后缀)在Linux下是一个静态链接的 ELF 格式的可执行文件,它 +可以被GRUB Shell正常调用。GRUB Shell 是一个启动管理软件,但并不是一个引导装 +载器(boot 命令在GRUB Shell里不能执行)。GRUB.EXE (通过KEXEC)能作为一个引 +导装载器直接在 Linux 下使用。 + +****************************************************************************** +*** Memory Layout for Quiting to DOS from GRUB.EXE *** +****************************************************************************** + GRUB.EXE 返回 DOS 时的内存布局 + +使用 quit 命令实现返回到DOS,是在GRUB.EXE是从DOS启动的情况下。 + +1.在GRUB.EXE 将控制权移交给 pre_stage2 之前,它将复制 640 kb的常规内存到 + 物理地址0x200000 (即,2 M)处,并将立即写入4 字节的长整数到常规内存备 + 份区之后: + At 0x2A0000: 0x50554B42, it is the "BKUP" signature. + 0x50554b42, 它是“BKUP”的签名 。 + + At 0x2A0004: Gate A20 status under DOS: non-zero means A20 on; + zero means A20 off. Update: A20 always on, see below. + DOS下的A20地址线门状态:非零表示A20开启;零表示A20 + 地址线关闭。更新:A20 始终开启,参见后面。 + + At 0x2A0008: high word is boot-CS, low word is boot-IP. The quit + command uses this entry point to return to DOS. + 高字节是引导的代码段段地址,低字节是引导的指令指针值。 + 退出命令 quit 使用这个入口点返回DOS。 + + At 0x2A000C: CheckSum: the sum of all long integers in the memory + range from 0x200000 to 0x2A000F is 0. + 校验和:内存范围从0x200000 到 0x2A000F的所有长整数的 + 和为 0 。 + +2.如果上述内存结构被某个grub命令所破坏,quit命令将发出一条错误提示信息而拒绝从grub中返回DOS。 + +3.由于GRUB可能破坏扩展内存,在DOS下你最好避免在GRUB.EXE运行前使用扩展内存。 + +4. Gate A20 will be enabled by GRUB.EXE. Hopefully this would hurt nothing. + GRUB.EXE将开启A20 地址线。真希望这不会危及任何东西。 + +****************************************************************************** +*** Memory usage in conventional/low memory area *** +****************************************************************************** + 常规内存/低端内存空间的内存使用 + +1. boot.c, fsys_reiserfs.c: 8K below 0x68000. + +2. fsys_ext2fs.c, fsys_minix.c: 1K below 0x68000. + +3. fsys_jfs.c: 4K + 256 bytes below 0x68000. + +4. fsys_reiserfs.c: 202 bytes at 0x600. + +5. fsys_xfs.c: 188 bytes at 0x600. + +6. fsys_xfs.c: (logical block size) bytes below 0x68000. + +7. geometry tune: 0x50000 - 0x5ffff. + +****************************************************************************** +*** Command-line Length about GRUB.EXE *** +****************************************************************************** + 关于GRUB.EXE的命令行长度 + +GRUB.EXE 可以通过CONFIG.SYS中的DEVICE命令来启动: + + DEVICE=grub.exe [--config-file="FILENAME_OR_COMMANDS"] + +1. 如果GRUB.EXE是被DEVICE命令调用而且FILENAME_OR_COMMANDS 参数是一个由分号分 + 隔的grub命令集合,那么FILENAME_OR_COMMANDS可以接近4 KB长 ----很吃惊?但这是 + 事实!MS-DOS 7及以上版本即使允许更长的行,但看起来4 KB对GRUB.EXE足够了。 + 当我们希望将一个大菜单嵌入到命令行时,这是非常有用的。注意 grldr 还不支持 + 任何命令行参数。 + +2. 如果GRUB.EXE是被INSTALL命令调用,那么选项长度的限制是80个字符(包括开头的 + --config-file= 这部分)。超出的话可能会立即将MS-DOS挂起。 + +3. 如果GRUB.EXE是被SHELL命令调用,那么选项长度的的限制是126个字符(包括开头的 + --config-file= 这部分)。超出的话虽然不会将 MS-DOS 挂起,但命令行将被截短。 + 这和 DOS 控制台或批处理文件中命令的限制是一样的。 + +4. DOS编辑器EDIT不支持一行4KB的长度。所以请使用其他编辑器,例如,vi for Linux 。 + +5. DEVICE=GRUB.EXE 这一行可以和其他的DEVICE命令同时使用,如DEVICE=HIMEM.SYS + 及DEVICE=EMM386.EXE等。配置命令里的GRUB.EXE所在行必须出现在EMM386.EXE所在 + 行的前面,以避免因EMM386而冲突。 + 更新 :从0.4.2版本起,GRUB.EXE在EMM386.EXE加载后,仍然可以运行。 + +6. 在以上提到的任何情况下,你都可以通过quit命令返回到DOS 。 + +7. 命令行菜单的内存占用:4KB的命令行菜单起始于物理地址0x0800而终止于0x17ff。 + +****************************************************************************** +*** New Syntax for the DEFAULT/SAVEDEFAULT Commands *** +****************************************************************************** + DEFAULT 及 SAVEDEFAULT 命令的新语法 + +相对于原来的用法"default NUM"及"default saved "增加的部分,现在有一个新用 +法"default FILE",象这样: + + default (hd0,0)/default + +注意参数FILE必须是一个有效的DEFAULT文件格式。一个简单的DEFAULT文件就包含 +在发行版中。你可以复制它到你希望的地方,但是你应该避免手工修改它的大小。 +DEFAULT文件可以按以下方法使用: +(1) 首先,你要复制一个格式有效的default文件到你运行的系统上。 + +(2) 其次,你要使用GRUB中的"default FILE"命令来表明是使用这个FILE作为我们新 + 的预设文件,以便"savedefault"命令执行时写入它。 + + +(3) 然后,你可以使用"savedefault"命令来把想要的入口数字保存到这个新的预设文 + 件中。 + +(4) 下次启动时,你可以通过使用类似上面第二步骤中的"default FILE"一样的 + 命令来读取已保存的入口数字。 + +同时,SAVEDEFAULT 命令增加了一个选项 --wait=T ,象这样: + + savedefault --wait=5 + +如果`--wait=T' 选项被指定而且 T 非零,savedefault 命令将在它就要写入磁盘 +前,给使用者一个提示信息。 + +这里是一个简单的menu.lst文件: + +#--------------------begin menu.lst--------------------------------------- +color black/cyan yellow/cyan +timeout 30 +default /default + +title find and load NTLDR of Windows NT/2K/XP +find --set-root /ntldr +chainloader /ntldr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback 2 +find --set-root /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +write 0x7C07 0x00736E6F +savedefault --wait=2 + +title find and load IO.SYS of Windows 9x/Me +find --set-root /io.sys +chainloader /io.sys +savedefault --wait=2 + +title floppy (fd0) +chainloader (fd0)+1 +rootnoverify (fd0) +savedefault --wait=2 + +title find and boot Linux with menu.lst already installed +find --set-root /sbin/init +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title find and boot Mandriva with menu.lst already installed +find --set-root /etc/mandriva-release +savedefault --wait=2 +configfile /boot/grub/menu.lst + +title back to dos +savedefault --wait=2 +quit + +title commandline +savedefault --wait=2 +commandline + +title reboot +savedefault --wait=2 +reboot + +title halt +savedefault --wait=2 +halt +#--------------------end menu.lst--------------------------------------- + +注意 1:预设文件 DEFAULT 必须是存在的而且具有和前面所述一样严格的格式。 + +注意 2:在一个有 MENU.LST 文件的相同目录中的 DEFAULT 文件将和 MENU.LST 文 + 件一起被联合调用 + +注意 3:即使没有出现`default'命令,被关联的 DEFAULT 文件也将自动生效。 + +注意 4:就在菜单文件(诸如,GRLDR 的关联文件MENU.LST,或是通过 + `grub.exe --config-file=(DEVICE)/PATH/YOUR_MENU_FILE'来指定的, + 或是通过grub的`configfile'命令来指定的)取得控制权之前,它的 + 关联文件DEFAULT只要出现就会被使用,直到遇见了一个明确的`default'命令。 + +****************************************************************************** +*** The New `cdrom' Command Syntax *** +****************************************************************************** + 新的 `cdrom' 命令的语法 + +1. 初始化ATAPI接口的CDROM设备: + + grub> cdrom --init + + 显示找到的atapi接口的cdrom光驱的数目:参数为 atapi_dev_count + +2. 停止ATAPI接口的CDROM设备: + + grub> cdrom --stop + + 这会设置参数atapi_dev_count为0 。 + +3. 增加搜索atapi cdrom设备的IO端口。例如: + + grub> cdrom --add-io-ports=0x03F601F0 + + 在执行`cdrom --init'以及`map --hook'命令后,cdrom光驱可以通过(cd0), + (cd1), ...等设备号来访问。 + +注意 1:如果系统不完全支持ATAPI CD-ROM 规范,在你试图访问这些(cdX)设备时将 + 遭遇失败。 + +注意 2:在执行一条`cdrom --stop'命令后,你应当使用一条`map --unhook'命令。当然, + 你可以再次使用`map --hook'命令,假如还有驱动器被映射着的话。 + +注意 3:在增加IO端口之后,你应当接着`cdrom --init'执行一条`map --unhook'命令然 + 后再接着执行一条`map --hook'命令。 + + 默认将使用这些端口来搜索cdrom设备(因此不需要再添加了) + 0x03F601F0, 0x03760170, 0x02F600F0, + 0x03860180, 0x6F006B00, 0x77007300. + +注意 4:BIOS可能已经提供了cdrom 的接口。它的设备号总是(cd)。在 `cdrom --init' + 和 `map --hook' 执行后,我们可以有我们自己有效的(cd0), (cd1), ...等设备。 + +注意 5:你可以用块列表的方式去访问(cd)和 (cdX) 等设备。例子: + + cat --hex (cd0)16+2 + + cdrom 扇区是大小为 2048 字节的大扇区。 + +注意 6:我们的iso9660文件系统驱动具有Rock-Ridge扩展支持,但没有Joliet扩展支持。 + 因此当你试图在一个使用Joliet扩展的光盘上读取文件时,可能遭遇失败。 + +注意 7:现在,(cd)及 (cdX)设备可以被引导了。示例: + chainloader (cd) + boot + + chainloader (cd0) + boot + + chainloader (cd1) + boot + + 在chainloader (cd)之前,你必须保证已经可以访问该设备。 + +****************************************************************************** +*** About the New `setvbe' Command *** +****************************************************************************** + 关于新命令 `setvbe' + +Gerardo Richarte contributed the `setvbe' code and the following comment: +Gerardo Richarte 先生提供了`setvbe'的源码,下面是注释: + + New command is `setvbe', and can be used to change the video mode + before executing the kernel. + `setvbe'是一个新的命令,它可以在系统核心运行前被用来改变视频模式。 + + For example, you can do + 例如,你可以执行 + + setvbe 1024x768x32 + + this will scan the list of available modes and set it, and + automatically append a `video=' option to each subsequent kernel + command-line. The appended `video=' option is like this: + 这会扫描出其可用模式的列表并设置它,并且自动在随后的每个kernel命令 + 行中增加一个选项`video='。增加的选项`video='类似于: + + video=1024x768x32@0xf0000000,4096 + + where 0xf0000000 is the video framebuffer address as reported by vbe, + and 4096 is the size of a scanline in bytes (also as reported by vbe). + 这里的0xf0000000是vbe报告的视频模式的帧缓存地址,而4096是扫描线的字节大小。 + + This is really useful if you want to give some graphics support to your + OS, but you don't want to implement any video functionality other than + writing a pixel to video memory. + 如果你想在你的操作系统上获得一些图形支持,但是除了只写一个像素点到视频内 + 存而外,你却不想使用任何视频功能,这确实有用。 + + +****************************************************************************** +*** About the DOS utility `hmload' *** +****************************************************************************** + 关于DOS工具`hmload' + +此程序由 John Cobb 先生编写(伦敦玛丽皇后学院)。 + +John Cobb先生的注释: + + To make use of the ram drive feature I wrote a program `hmload' to load + an arbitrary file to an arbitrary address in high memory. The program + is not very sophisticated and relies on XMS to turn on the A20 line. + (Also one must be very careful to steer clear of any areas of memory + already in use). + 为了使用内存驱动器的特性,我写了一个程序“hmload”来将任意文件加载 + 到高端内存的任意地址。这个程序不是十分深奥但依赖在XMS 里开启A20地址线。 + (并且必须将那些已经使用了的任何内存空间精心的清理干净) + + Under Linux we generated a disk image `dskimg' (with the kernel and + Initrd and a partition table). + 我们在linux下生成一个磁盘映象“dskimg”(包含kernel和initrd及一个分区表)。 + + Using this our boot procedure looked something like this: + 我们的引导过程看起来是下面这样: + + hmload -fdskimg -a128 + fixrb + + grub + + map --ram-drive=0x81 + map --rd-base=0x8000000 + map --rd-size=0x400000 + root (rd,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + boot + +See http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ for details. +详情参阅 http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ + +Update 2007-12-05: +更新 2007-12-05 : + + Now the MAP command can handle gzipped (rd) image. One can use this + feature with the hmload utility. For example, + + step 1. Load the gzipped image under DOS at a relatively low address: + 步骤 1. 在DOS的相对较低的地址处加载gzip压缩映像: + + hmload -fdskimg.gz -a16 + + step 2. Unload network drivers. + 步骤 2 卸载网络驱动器 + + step 3. Run GRUB.EXE. + 步骤 3. 运行 GRUB.EXE + + step 4. At the grub prompt, run these commands: + 步骤 4. 在grub 命令提示符下,执行下列命令: + + map --rd-base=0x1000000 # set rd-base address to be 16M + # 设置rd-base地址为16M + + map --rd-size= + < dsking.gz 精确的字节数 > + + map (rd)+1 (hd0) # This will decompress (rd) and place + # the decompressed image at the top end + # of the extended memory. The (rd)+1 + # here has special meaning and stands + # for the whole (rd) device. You must + # use (rd)+1 instead of (rd). + # 这会将(rd)解压并且把解压后的映像放到扩展内存的顶端。 + # 这里的(rd)+1具有特定的含义而且将整个(rd)设备放到了顶端。 + # 这里你必须使用 (rd)+1 来替代(rd)。 + map --hook + root (hd0,0) + kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... + initrd /initrd + map --unhook + map (hd0) (hd0) # Delete the map; this is needed. + # 删除map映射;这是需要的 + boot + + +****************************************************************************** +*** Notes on the use of stack *** +****************************************************************************** + 关于堆栈的注释 +The protected-mode and real-mode stack are merged at physical address 0x2000. +保护模式与实模式的堆栈被合并到物理地址 0x2000 处。 + +All functions should use at most 2K stack space(0x1800-0x2000). So each +subfunction should use as little stack as possible to avoid stack-overflow. +所有的功能应当最多使用 2K 的堆空间 (0x1800到0x2000)。因此各个子功能部分 +应当使用尽可能小的堆以避免堆栈溢出。 + +Don't use recursive functions because they could expend too much stack space. +不要使用递归功能,因为他们会消耗太多的堆空间。 + +The original protected mode stack at 0x68000(expand-down) is free now and can +be reused for any purposes. +原来位于0x68000(向下延伸)的保护模式的堆现在不再使用,并且它可以被用于任何目的。 + + +****************************************************************************** +*** A bug was found in the CDROM driver *** +****************************************************************************** + CDROM 驱动器上发现的缺陷 + +似乎 cdrom 应当连接在IDE控制器的主设备通道上。 + +如果 cdrom 是从设备,读取cdrom扇区的驱动将失败。希望有人能解决这个问题。 + +****************************************************************************** +*** BIOS and the (cd) drive *** +****************************************************************************** + BIOS 与 (cd)驱动器 + +当BIOS启动一个非模拟模式的可启动的CD-ROM设备时,它会分配一个BIOS驱动器号给这个 +CD设备。如果这个CD-ROM使用grldr或stage2_eltorito作为启动映像文件,那么GRUB可以 +通过BIOS分配的驱动器号来访问这个CD-ROM 媒体。 + +BIOS 会分配一个驱动器号给非模拟模式启动的CDROM 设备,即使这个CDROM 是不能启动的。 +虚拟机QEMU就是这样处理的。在引导的时候,GRUB4DOS将搜索那些由BIOS分配的,驱动器号 +从0x80至0xFF的,可能存在的非模拟模式的CDROM 驱动器。 所以,如果BIOS为CDROM提供了 +扩展int13(功能号41h-4eh)接口,那么这个(cd)设备自动在GRUB4DOS 中有效。 + + +****************************************************************************** +*** The way of disk emulation changed greatly *** +****************************************************************************** + 磁盘仿真方式发生了巨大变化 + +磁盘仿真方式自从0.4.2正式版之后已经发生了巨大变化。在使用磁盘仿真功能时候, +请不要将较新的版本和旧的版本混合使用。 + +较新的版本不会自动卸载之前已经在grub4dos环境建立的仿真盘。GRUB.EXE 的一个 +很古老的版本,在将控制权移交给grub主程序(即,pre_stage2)前,将会自动释放 +先前建立的仿真盘。 + + +****************************************************************************** +*** FreeDOS EMM386 v2.26 (2006-08-27) VCPI problem *** +****************************************************************************** + FreeDOS EMM386 版本2.26 (2006-08-27) VCPI服务的问题 + +The VCPI function "AX=DE0Ch - Switch From Protected Mode to V86 Mode" of +FreeDOS EMM386 v2.26 was not implemented properly(it always hangs). As an +alternative, you can use Microsoft's EMM386 instead. +FreeDOS 的 EMM386 版本2.26 中的VCPI服务,“功能号 AX=DE0Ch-选择从 +保护模式到虚拟8086模式”,不能正确的执行(总是死机)。选择之一是, +你用微软的 EMM386 来代替它。 + +Even while emm386 is running, grub.exe can be started. But if you try to quit +to DOS from grub4dos by using the `quit' command, the VCPI function DE0C will +be called. If EMM386 is of Microsoft, everything goes ok. If EMM386 is of +FreeDOS, the machine will hang. +即使emm386已经运行,grub.exe也能够启动。但是如果你试图从grub4dos中通过`quit' +命令来返回DOS,VCPI 服务的DE0C 号功能将被调用。如果是微软的 EMM386 ,接下来的 +一切都很正常 。而如果是FreeDOS 的 EMM386 ,那么将会死机。 + +****************************************************************************** +*** New options for map were added *** +****************************************************************************** + map 命令的新增选项 + +随着0.4.2 最终版的发布,map 命令有了两个新选项。它们是--safe-mbr-hook=SMH +以及--int13-scheme=SCH 。它们都和Win9x环境下(尽可能稳定的)使用磁盘仿真有关。 + +SMH参数可以是0或1这个两个值之一。作为默认,SMH参数为1 。如果你在Win9x中遇到 +磁盘仿真的问题,你可以插入这样一行到`boot'命令之前, + + map --safe-mbr-hook=0 + +然后再试一次。 + +SCH在使用时,也可以取0或1之一的值。作为默认,SCH为1 。如果你在Win9x中遇到 +磁盘仿真的问题,你可以插入这样一行到`boot'命令之前, + + map --int13-scheme=0 + +然后再试一次。 + +顺便提醒一下。类似于--safe-mbr-hook和--int13-scheme ,MAP命令中有几个其他 +选项可被用以设置全局变量。 + + map --floppies=M + +其中的M 可以是0 , 1 或者2 。MAP 将把一个恰当的M 值设置在地址0040:0010 处。 + + map --harddrives=N + +其中的N 可以是从0到127之间的值。MAP将把N 值设置在0040:0075处。 + + map --memdisk-raw=RAW + +其中的RAW默认为1 。如果RAW=0,将通过`int15/ah=87h'访问内存驱动器。 + + map --ram-drive=RD + +其中RD默认是0x7F的软驱号。如果随机内存驱动器是一个硬盘驱动器镜像(第一扇区 +含有分区表),那么你可以将 RD 设置为大于或等于0x80并且小于0xA0之间的值。 +如果是一个光盘镜像,那需要设置为大于或等0xA0并且小于0xFF之间的值。 + + map --rd-base=ADDR + + map --rd-size=SIZE + +其中的 ADDR 指定出内存映像的物理基地址。SIZE指定出内存映像的字节数大小。ADDR +默认为0 。SIZE的默认值也是0 ,但是值为0 表示4 GB ,而不是零字节长的磁盘。随机 +内存驱动器可以在 GRUB 环境中通过使用 (rd) 设备来访问。 + + +****************************************************************************** +*** About the new map option --in-situ *** +****************************************************************************** + 关于 map 的新选项 --in-situ + +--in-situ被使用于硬盘驱动器映像或者是硬盘驱动器分区。通过--in-situ ,我们可以把 +一个逻辑分区象征性的作为一个主分区来使用。 + +--in-situ 的映射是整个驱动器的映射。它只虚拟出分区表和 DBR 上的BPB里的隐藏扇区数。 + +尽管磁盘仿真在 win9x 中可能会遇到的各种问题,但在win9x中,in-situ的映射却运行得很好。 + +注意 --in-situ 的映射不会改变真实的分区表。 + +示例: + map --in-situ (hd0,4)+1 (hd0) + +****************************************************************************** +*** The PARTNEW Command Syntax *** +****************************************************************************** + PARTNEW 命令的语法 + +除了上述章节的仿真方法而外,你也可以替代选择用 PARTNEW 来建立一个新的主分区。 +PARTNEW可以为逻辑分区生成一个新的主分区项(在分区表中)。 + +例如, + partnew (hd0,3) 0x07 (hd0,4)+1 + +这里的(hd0,4)+1 代表了整个(hd0,4)分区。这条命令将建立一个分区类型为 0x07 +的新的主分区(hd0,3),并且它的内容(即数据)和逻辑分区(hd0,4)一样。 + +就像整个逻辑分区时的情况一样,一个连续的分区映像文件也可以用在PARTNEW 命令中: + + partnew (hd0,3) 0x00 (hd0,0)/my_partition.img + +The type 0x00 indicates a type-auto-detection of the image MY_PARTITION.IMG. +The above command will create a new primary partition (hd0,3) with a proper +type and with contents/data being exactly that of the contiguous file +(hd0,0)/my_partition.img. +这个 0x00 类型表示这个 MY_PARTITION.IMG 映像文件的分区类型由自动检测确定。 +上面的命令将建立一个类型恰当的新的主分区(hd0,3),并且使用这个连续的 + (hd0,0)/my_partition.img 文件中的全部内容(数据)作为它的内容(数据)。 + +PARTNEW 将自动修正 BPB 中的“隐藏扇区数”并且这个修改是永久的。而且PARTNEW +修改分区表也是永久的。 + +除了建立分区表项外,PARTNEW也可以用来删除(抹掉,擦除)一个分区表项。例如, + + partnew (hd0,3) 0 0 0 + +这样,主引导记录中最后一个分区表项将被清空。通常,你可以用"partnew PARTITION 0 0 0"的格式来 +抹掉其分区表项,但是已经存储在这个分区中的数据不被影响。 + +****************************************************************************** +*** Newly implemented operators `&&' and `||' *** +****************************************************************************** + 最近实现的运算符 `&&' and `||' + +它的实现非常简单。它不处理嵌套的运算符。 + +`&&'的用法: + command1 && command2 +说明 : + 如果 command1 返回 真,那么 command2 将执行 + +`||'的用法: + + command1 || command2 + +说明 : + 如果 command1 返回 假,那么 command2 将执行 + +示例: + is64bit && default 0 + is64bit || default 1 + +注意: + 1.只要返回值非0都是真,否则是假.比如 + read 0x60000 && command2 + command2有可能会不被执行.因为内存地址0x60000的值有可能是0. + 一般情况下命令执行失败时总是返回0(假).所以可以用于判断命令执行的结果. + 2.在菜单中使用这些符号会忽略错误检测,这是一个很有用的功能. + 比如: + find --set-root /file.ext + 在菜单中使用时可能会返回文件未找到的错误并停止执行.必要的话我们可以使用 + find --set-root /file.ext || echo file not found. + 这个命令在菜单中使用会显示find not found,但不停止执行. + +更新1: 最新版本可以使用嵌套,例子: + find --set-root /file1 || find --set-root /file2 || find --set-root /file3 + 如果没有找到file1就继续找file2,还是没有找到就找file3,如果还是没有找到将会失败 + +****************************************************************************** +*** Three new commands is64bit, errnum and errorcheck *** +****************************************************************************** + 三个新命令 is64bit, errnum 和 errorcheck + +is64bit 和 errnum 命令分别用来检索是否是 64 位的系统和错误值。 + +errcheck off|on + +errorcheck(错误检查)命令控制着错误是否被处理。默认错误检查是开启的 ,即在 +错误发生时命令脚本将停止执行。而假如错误检查是关闭的,那么脚本将一直执行到 boot +命令。一条 boot 命令可以把错误检查转变为开启。 + +****************************************************************************** +*** Use numeric keys to select a menu entry *** +****************************************************************************** + 使用数字键来选择菜单项 + +例如,如果你想要选择第25项菜单项,你可以先按下数字键2 之后再按下 5 。 + +****************************************************************************** +*** Use the INSERT key to debug step by step at startup *** +****************************************************************************** + 启动时使用 INSERT 键逐步的调试 + +在一些有缺陷机器上进入 grub4dos 环境时可能会失败。可能是意外的死机或者重启。 +在启动时尽可能快的按下 INSERT 键,你就可能获得进入单步启动进程的机会而看到它最 +多能运行到哪里,然后请上报这些bug截图 。 + +****************************************************************************** +*** The debug command syntax has been changed *** +****************************************************************************** + debug 命令的语法已经改变 + +DEBUG 命令现在可以用来控制冗余的命令输出: + debug [ on | off | normal | status | INTEGER ] + +0 或者 off 指定为静默模式 + +1 或者 normal 指定为标准模式 + +从 2 到 0x7fffffff 或者 on 指定为冗余模式 +(调试报告BUG时请使用该模式,可以获得更详细的信息) + +****************************************************************************** +*** GRUB4DOS and Windows Vista *** +****************************************************************************** + GRUB4DOS 与 Windows Vista + +首先,使用以下命令来建立一个启动项: + + bcdedit /create /d "GRUB for DOS" /application bootsector + +执行结果看起来类似这样: +The entry {05d33150-3fde-11dc-a457-00021cf82fb0} was successfully created. + +其中长字串{05d33150-3fde-11dc-a457-00021cf82fb0} 是这个项的数字标识{id}。 + +然后,通过以下命令来设置启动参数: + bcdedit /set {id} device boot + bcdedit /set {id} path \grldr.mbr + bcdedit /displayorder {id} /addlast +请用先前的命令所返回的实际的id 来替换掉 {id}。 + +最后,复制 GRLDR.MBR 到 你引导分区的根目录下,并且将 GRLDR 和 menu.lst 复制到 +任意一个 FAT16/FAT32/EXT2/NTFS 的分区根目录下。 + +注意:引导分区必须是含有 BOOTMGR 的激活的主分区。 + +LianJiang 先生写出了一个脚本来自动化的完成这个麻烦的工作: + + @echo off + rem by lianjiang + cls + echo. + echo Please run as administrator + echo. + pause + set gname=GRUB for DOS + set vid= + set timeout=5 + bcdedit >bcdtemp.txt + type bcdtemp.txt | find "\grldr.mbr" >nul && echo. && echo BCD entry existing, no need to install. && pause && goto exit + bcdedit /export "Bcd_Backup" >nul + bcdedit /create /d "%gname%" /application bootsector >vid.ini + for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do ( + set vida=%%i + ) + for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do ( + set vid={%%i} + ) + echo %vid%>vid.ini + bcdedit /set %vid% device boot >nul + bcdedit /set %vid% path \grldr.mbr >nul + bcdedit /displayorder %vid% /addlast >nul + bcdedit /timeout %timeout% >nul + if exist grldr.mbr copy grldr.mbr %systemdrive%\ /y && goto exit + echo. + echo Please copy grldr.mbr to %systemdrive%\ + echo. + pause + :exit + del bcdtemp.txt >nul +------------------------------------------------------------------- +更新: Fujianabc 先生指出以下这行 + bcdedit /set %vid% device boot >nul +必须更改为 + bcdedit /set %vid% device partition=%SystemDrive% >nul +chenall注: 其实没有必要改,使用boot可以获得更好的兼容性. +------------------------------------------------------------------- +你还需要自行复制 grldr和menu.lst文件。 + +注意: 你只需要指定BCD的位置就可以修改另一个操作系统的BCD 启动项: + bcdedit /store D:\boot\BCD ... + +注意: 执行这些命令需要提高权限,它们必须是“以管理员身份运行”于cmd.exe中。 + +注意:已有人报告说,即使使用管理员身份,Vista的某些版本也不支持在C盘根目录下建立 +无扩展名的文件。你既可以复制grldr到另外的一个分区来解决这个问题,也可以将 grldr +重命名,比如为 grub.bin 。如何改名,请参见下节。 + +****************************************************************************** +*** How to rename grldr *** +****************************************************************************** + 怎样重命名 grldr + + grldr 和 grldr.mbr引用引导文件内部的文件名来决定装载哪个文件,所以假如你 + 想更换它们的名字,那么你也必须要修改那些内嵌在文件内部的设置。你可以使用 + 辅助程序grubinst 来做到这些,grubinst 可以在以下网址下载到: + +http://download.gna.org/grubutil/ + + grubinst 能生成自定义的grldr.mbr: + + grubinst -o -b=mygrldr C:\mygrldr.mbr + + grubinst 也能编辑一个既有的 grldr 或 grldr.mbr: + + grubinst -e -b=mygrldr C:\mygrldr + + grubinst -e -b=mygrldr C:\mygrldr.mbr + +在这种情况中,你必须使用一个和 grub4dos 版本兼容的grubinst,否则修改将会失败。 + + 所以,在命令中通过加载mygrldr来代替grldr ,你可以使用下面的方法之一: + +1.使用已定制好的grldr.mbr 来加载 mygrldr 。在这种情况下,你需要修改内嵌在 + grldr.mbr中的引导文件名。grldr.mbr的名字可以被任意的改变。 + +2.直接使用mygrldr 。在这种情况下,你需要将 mygrldr 中内嵌的引导文件名改为 + 一个合适的名字。 + +注意: 引导文件名必须遵循 8.3 文件名规范。 + +****************************************************************************** +*** GRLDR as PXE boot file *** +****************************************************************************** + GRLDR 作为 PXE 启动文件 + +GRLDR 可以被用作远程或网络服务器的 PXE 启动文件。(pd) 设备被用于访问服务器上文件。 +当 GRLDR 已经通过网络启动后,它将使用预设菜单作为配置文件。不过,你可以使用 +一条"pxe detect"命令,它的表现是和pxelinux一样的方式。 + + * 首先,它将使用设备类型(使用它的 ARP 类型码)和地址来搜索配置文件,全部用 + 破折号分割的十六进制;例如,对一个以太网(ARP 类型是1)的88:99:AA:BB:CC:DD + 地址,它会用文件名01-88-99-AA-BB-CC-DD 来搜索。 + + * 其次,它将使用它本地的IP 地址大写字母的十六进制格式(即192.0.2.91 转换为 + C000025B。)来搜索配置文件。如果文件没有找到,它将去掉一个十六进制数字后再试一次。 + 最后,它会尝试寻找一个名为 default (小写字母)的文件。 + +****************************************************************************** +*** PXE device *** +****************************************************************************** + PXE 设备 + +如果使用PXE启动,GRUB4DOS 将建立一个虚拟设备 (pd),可能通过它来访问tftp服务器 +上的文件。你可以使用下面的步骤来设置一个无盘启动环境: + +客户端 +你需要从 PXE ROM 上启动。 + +服务器端 +你需要配置一个dhcp服务器和一个tftp服务器。在dhcp服务器上,使用grldr作为引导文件。 + +你可能希望为不同的客户端加载一个不同的menu.lst 。GRUB4DOS将在以下位置查找配置文件: + + [/mybootdir]/menu.lst/01-88-99-AA-BB-CC-DD + [/mybootdir]/menu.lst/C000025B + [/mybootdir]/menu.lst/C000025 + [/mybootdir]/menu.lst/C00002 + [/mybootdir]/menu.lst/C0000 + [/mybootdir]/menu.lst/C000 + [/mybootdir]/menu.lst/C00 + [/mybootdir]/menu.lst/C0 + [/mybootdir]/menu.lst/C + [/mybootdir]/menu.lst/default + +更新1: 如果/mybootdir/menu.lst 文件存在,将会优先使用,这样可以加快引导速度. + +这里,我们假设客户端的网卡mac地址是 88:99:AA:BB:CC:DD ,而ip地址是192.0.2.91 (C000025B)。 +/mybootdir 是引导文件所在目录,例如,如果引导文件是 /tftp/grldr ,那么mybootdir=tftp 。 + +如果上面的文件都未出现,grldr将使用它的内置的menu.lst 。 + +这是一个如何访问tftp服务器上文件的menu.lst文件。 + + title Create ramdisk using map + map --mem (pd)/floppy.img (fd0) + map --hook + rootnoverify (fd0) + chainloader (fd0)+1 + + title Create ramdisk using memdisk + kernel (pd)/memdisk + initrd (pd)/floppy.img + +chenall注: 1.你也可以省略(pd)/或者使用(bd)/或()/ + 这样可以使得一个菜单可以不经过修改就可以用于其它地方的启动. + +你可以看到这个 menu.lst 和在普通磁盘上引导的是相似的,你只是需要把象(hd0,0) +这样的设备用(pd) 来代替。 + +磁盘设备和 pxe 设备有一些不同点: + +1. 你不能把pxe设备上的文件以列表显示。 +更新2: 现在可以列表,但要求服务器上有dir.txt文件,使用以下命令可以创建一个dir.txt文件 + dir /b>dir.txt + 也可以直接使用TFTPD32的服务器,选择自动生成DIR.TXT文件. + +2.blocklist 命令不能用于 pxe 设备上的文件。 + +3.如果你想映射一个pxe服务器上的文件,你必须使用--mem 选项 。 + +当你使用 chainloader 命令装载一个pxe 设备上的文件时,有一个选项你可以使用: + + chainloader --raw (pd)/BOOT_FILE + +选项 --raw 的执行就和--force一样,但是它是一次性将文件装载执行。这可以改善 +一些情况下的执行效率。 + +你可以使用 pxe 命令来控制 pxe 设备。 + +1. pxe + 如果没有使用任何参数,pxe 命令将显示当前设置。 + +2. pxe blksize N + 设置tftp packet size (传输包)大小。最小值是 512 ,最大值是 1432 。这个参数主要使 + 用在那些不支持远大于 512 字节包大小的tftp 服务器上。 + +3. pxe basedir /dir + 为tftp 服务器上的文件设置基本目录。如 + pxe basedir /tftp + + 那么在pxe 设备上的所有文件都和目录 /tftp 相关。例如,(pd)/aa.img + 对应于服务器上的 /tftp/aa.img 。 + + 基本目录的默认值是引导文件所在目录,例如,如果引导文件是 /tftp/grldr , + 那么默认的基本目录就是 /tftp 。 + +4. pxe keep + 保持 pxe stack。GRUB4DOS的默认退出时自动卸载pxe strack。 + 如果你希望在引导后继续使用PXE功能,比如用于RIS安装,这时必须使用这个选项. + +5. pxe unload + 立即卸载 PXE stack。pxe占用了大量的常规内存,某些引导程序可能会无法正常引导。 + 这时你可以先卸载然后再引导。一个例子: + title Linux memtest + map --mem /memtest.bin (rd) + pxe unload + kernel (rd)+1 + 如果在PXE启动时直接kernel /memtest.bin可能会失败。 + + +****************************************************************************** +*** New Feature of Relative Path Support *** +****************************************************************************** + 相对路径支持的新特性 + +使用`root' 或 `rootnoverify'命令来指定`工作目录' 。 + +例如: + root (hd0,0)/boot/grub + +这就指定了当前工作目录是(hd0,0)/boot/grub 。因此所有继"/..."之后的文件名将实际 +提交到(hd0,0)/boot/grub/... + +也就是说: + + cat /menu.lst +将等同于 + cat (hd0,0)/boot/grub/menu.lst + + +****************************************************************************** +*** Notation For The Current Root Device *** +****************************************************************************** + 当前根设备的符号 + +符号`()'可以在访问当前根设备时使用。你可以使用`find --set-root ...'来设置当前根 +设备,但find 命令不能设置根设备的`工作目录'。这时你应该使用`()'在find命令后来设 +置工作目录。 + root ()/boot/grub + +2008-05-01 更新: + 现在 FIND 命令也可以设置`工作目录'了。例如: + + find --set-root=/tmp /boot/grub/menu.lst + + 它等同于这一组命令: + find --set-root /boot/grub/menu.lst + root ()/tmp + +****************************************************************************** +*** The new map option --a20-keep-on *** +****************************************************************************** + map 新选项 --a20-keep-on + +随着0.4.3最终版的发布,map 有了一个新选项 --a20-keep-on ,它跟内存驱动器扇区访 +问后的A20 地址线控制有关 + + map --a20-keep-on=0 + +它必须被使用于"map --hook"命令之前。 + +作为默认,在INT13 对随机内存的扇区访问之后 A20 将一直开启。如果"map --a20-keep-on=0" +被使用,那么在INT13 中断调用后的 A20 的状态将和在INT13中断调用前相同。 + +****************************************************************************** +*** The CDROM emulation (virtualization) *** +****************************************************************************** + 光盘仿真(虚拟化) +光盘仿真有时候又称为 ISO 仿真。这里是个示例: + map (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +如果myiso.iso 是不连续的并且你有足够的内存,那么要增加一个--mem选项: + map --mem (hd0,0)/myiso.iso (hd32) + map --hook + chainloader (hd32) + boot + +注意:(hd32) 是一个 grub 驱动器,驱动器号和 (0xA0) 等价。如果一个虚拟驱动器被指 +定为一个大于或等于0xA0 的驱动器号,那么它将被视为是一个光盘。(即,是 2048 字节 +的大扇区) + +就像标准的磁盘仿真一样,光盘仿真也(主要)工作于实模式操作系统中。在一个保护模式的 +操作系统核心(例如WinNT/2K/XP/VISTA/LINUX)获得控制后,操作系统一般没有能力通过BIOS +的int13 来访问虚拟光盘。 + +DOS/Win9x 的使用者可以用google搜索到 ELTORITO.SYS 然后将它作为虚拟光驱的设 +备驱动使用到CONFIG.SYS 中。 + +CONFIG.SYS 中 eltorito.sys 的用法举例: + device=eltorito.sys /D:oemcd001 + +对应的可能是放在 AUTOEXEC.BAT中的 MSCDEX 命令: + MSCDEX /D:oemcd001 /L:D + +由于在 eltorito.sys中发现了一些缺陷,驱动器可能会加载失败。假如你碰到这类问题, +那么你可以将虚拟光盘的驱动器号从(hd32)更换为(0xFF)然后再试一次。 + +****************************************************************************** +*** The New Command CHECKRANGE *** +****************************************************************************** + 新命令 CHECKRANGE + +Checkrang 命令检查一条命令的返回值是否是在指定的值域或排列中。 + +Usage: checkrange RANGE COMMAND +用法: checkrange 域 命令 + +这里是参数 RANGE 的一些示例: + 3 是仅包含数字 3 的值 + + 3:3 等价于 3 + + 3:8 是一个包含数字3, 4, 5, 6, 7, 8的值域 + 3,4,5,6,7,8 等同于3:8 + 3:5,6:8 也等同于3:8 + 3,4:7,8 也等同于3:8 + +注意:你不能把空格放在值域中。比如:以下是错误的。 + checkrange 1 2 COMMAND + +这里用一个示例来演示怎样使用 checkrange 命令: + checkrange 0x05,0x0F,0x85 parttype (hd0,1) || hide (hd0,1) +这意谓着:如果 (hd0,1) 不是一个扩展分区,那么执行hide (hd0,1)命令隐藏它。 + +****************************************************************************** +*** The New Command TPM *** +****************************************************************************** + 新命令 TPM + +"tpm --init"在地址0000:7c00处使用512字节数据作为初始化TPM(可信赖平台模块)的缓存。 + +在你引导 VISTA 的 BOOTMGR 前,你可能需要在一些机器上使用"tpm --init"。通常你应该在 +一条 CHAINLOADR 命令后执行"tpm --init"指令。 + +****************************************************************************** +*** Delimitors or comments between titles *** +****************************************************************************** + 标题间的限制或注释 + +把标题用来做限制或注释是可能的。如果一个标题(或菜单项)下所有的菜单命令都是非启动敏感的, +它被叫做是不可启动的。 + +下面的命令是启动敏感的(而其他命令是非启动敏感的) + boot + bootp + chainloader + configfile + embed + commandline + halt + install + kernel + pxe + quit + reboot + setup + +一个不可启动的标题在使用者按向上方向键或向下方向键时将被跳过。 +不可启动的菜单项可以通过使用左方向键或右方向键来被访问(和执行)的。示例: + + title This is an UNBOOTABLE entry(so this line is also a comment) + pause --wait=0 This title is a comment. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + help root + help chainloader + help parttype + clear + title ------------------------------------------------------------ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + clear + help + help boot + title ============================================================ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help + clear + help pause + title ************************************************************ + pause --wait=0 This title is a delimitor. Nothing to do. + pause --wait=0 You can use non-boot-sensitive commands here + pause --wait=0 of any kind and as many as you would like. + help kernel + help + clear + +注意:一个不可启动菜单项必须至少包含一条命令。如果标题下没有命令,标题将被简单的 +丢弃并且不被显示。 + +****************************************************************************** +*** Bifurcate drives *** +****************************************************************************** + 分支式驱动器 + +一些机器在 CHS 和 LBA 模式之间对驱动器实施不同的动作。 +当你使用标准的BIOS调用int13/AH=02h来读取扇区时,你可能会发现这个驱动器是一个软盘 +但是当你用扩展的BIOS调用(EBIOS)int13/AH=42h来读取扇区时,你会发现是一个光盘。 +这样的驱动器被叫做分支式的。 + +一个分支式的驱动器拥有两个驱动器号:一个是标准的 BIOS 驱动器号十六进制 +的 00或FF ,并且这个驱动器只使用 CHS 模式的磁盘访问(标准的BIOS int13/AH=02h); +另一个是标准的 BIOS 驱动器号(按位与)0x100 (即十进制的256),并且这个驱动器只 +使用 LBA 模式的磁盘访问(EBIOS int13/AH=42h)。 +例如,驱动器0x00(即,第一软驱)是分支式的. + 那么驱动器(0x00)使用 CHS 模式来访问它的扇区 + 而驱动器(0x100)则使用LBA 模式来访问它的扇区。 + +geometry 命令会用 BIF 代替常见的 CHS 和 LBA 来报告分支式驱动器的磁盘访问模式。 + +已知的分支式驱动器。发现虚拟机Virtual PC和一些真实机器当它们引导一个软盘模拟模式 +的可启动光盘时会建立一个分支式的软驱。命令"geometry (fd0)"将显示: + drive 0x00(BIF): C/H/S=...Sector Count/Size=.../512 + +而"geometry (0x100)"将显示 + drive 0x100(BIF): C/H/S=...Sector Count/Size=.../2048 + +实际上(0x100) 可以访问整个光盘。 +你可以执行"ls (0x100)/" 显示光盘上文件(不是那个被引导的软盘映像中的文件)。 +当然 "ls (fd0)/"可以列举那些在被引导的软盘映像中的文件。 + +注意:仅仅是某些(真实的或虚拟的)机器有这样的行为,其他的机器不会产生分支式驱动器。 + +****************************************************************************** +*** New program badgrub.exe *** +****************************************************************************** + 新程序 badgrub.exe + +新程序 badgrub.exe 是特意供那些不能运行标准 grub.exe 的‘糟糕的’机器(一些典型 +的 DELL 原型机)使用的。 + + +****************************************************************************** +*** Conditional find *** +****************************************************************************** + 条件查找 + +新的find 命令的语法允许带条件的查找设备。 + + find [OPTIONS] [FILENAME] [CONDITION] + 选项 文件名 条件 + +OPTIONS: + --set-root set the current root device. + --set-root=DIR set current root device and working directory to DIR. + please also see "Notation For The Current Root Device". + --ignore-cd skip search on (cd). + --ignore-floppies bypass all floppies. + --devices=DEVLIST specify the search devices and order. + DEVLIST u->(ud) + n->(nd) + p->(pd) + h->(hdx) + c->(cd) + f->(fdx) + default: upnhcf + + +其中的 CONDITION 是一个返回值是 TRUE 或者 FALSE 的标准 grub 命令。 + + 示例 1: 列举所有的分区,所有的软驱和 (cd) 。 + + find + + 示例 2:列举文件系统已知的所有设备。 + + find +1 + + 示例 3: 列举分区类型为0xAF的所有分区。 + + find checkrange 0xAF parttype + + 示例 4:列举分区类型为 0x07 且根目录存在 ntldr 的所有分区。 + + find /ntldr checkrange 0x07 parttype + + 示例 5: 设置当前根设备到第一个根目录有存在ntldr的分区。 + + find --set-root /ntldr + + 示例 6: 同例5,但是以下命令只查在硬盘上查找bootmgr + + find --set-root --devices=h /bootmgr + + 示例 7: 设置当前根设备为第一激活的主分区。 + + find --set-root --devices=h makeactive --status + +更新: 新的find 命令语法允许指定要查找和设备和查找的顺序。 + 新的参数 --devices=DEVLIST,用于指定查找的设备和顺序。 + DEVLIST可以下以下的字母组合。 + u,p,n,h,c,f -->分别对应 ud,pd,nd,hd,cd,fd, + 查找时根据DEVLIST指定的设备顺序进行查找。默认是upnhcf. + + + 例子: 1.只查找硬盘上的文件 + find --devices=h /file + 2.依次查找硬盘、光盘、软盘上的文件 + find --devices=hcf /file + + 注意:新的find命令有一个改变,查找的时候会优先查找当前设备(如果在列表中的话)。 + +****************************************************************************** +*** How to build grldr boot images *** +****************************************************************************** + 如何创建 grldr 引导的映像文件 + +1. 创建1.44M 软盘镜像文件 ext2grldr.img + + dd if=/dev/zero of=ext2grldr.img bs=512 count=2880 + mke2fs ext2grldr.img + mkdir ext2tmp + mount -o loop ext2grldr.img ext2tmp + cp default ext2tmp + cp menu.lst ext2tmp + cp grldr ext2tmp + umount ext2tmp + bootlace.com --floppy --chs --sectors-per-track=18 --heads=2 --start-sector=0 --total-sectors=2880 ext2grldr.img + +2. 创建1.44M 软盘镜像文件 fat12grldr.img + + dd if=/dev/zero of=fat12grldr.img bs=512 count=2880 + mkdosfs fat12grldr.img + mkdir fat12tmp + mount -o loop fat12grldr.img fat12tmp + cp default fat12tmp + cp menu.lst fat12tmp + cp grldr fat12tmp + umount fat12tmp + bootlace.com --floppy --chs fat12grldr.img + +3. 创建 iso9660 文件系统的光盘镜像文件 grldr.iso + + mkdir iso_root + cp grldr iso_root + cp menu.lst iso_root + mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root + + +****************************************************************************** +*** Use bootlace.com to install partition boot record *** +****************************************************************************** + 使用 bootlace.com 来安装分区引导记录 + +在 bootlace.com 没有实现 --install-partition 选项之前,你需要用已实现的 +--floppy=PartitionNumber 选项来替代。 + +你必须按下面的方法执行: + +步骤 1. 获取分区的引导扇区然后保存为一个文件 MYPART.TMP 。对于 NTFS 文件系统,你需要获取 + 起始的16 个扇区。对于其他类型的文件系统,你只需要获取一个扇区,但获取多个扇区 + 也是没问题的。 + +步骤 2. 执行这些命令: + + bootlace.com --floppy=Y --sectors-per-track=S --heads=H --start-sector=B --total-sectors=C --vfat --ext2 --ntfs MYPART.TMP + + 这里我们假定 MYPART.TMP 是从 (hdx,y) 获取的而且分区号 Y 必须在--floppy=Y 选项中被指定。 + + 注意:对于FAT12/16/32/NTFS等分区,你可以省略这些选项: + --sectors-per-track, --heads, --start-sector, --total-sectors, + --vfat and --ext2. + + 对于 NTFS 分区,你必须指定 --ntfs 选项。 + + 对于 ext2 分区,你可以省略 --vfat, --ntfs he --ext2 选项,但是其他选项必须被指定。 + +步骤 3. 将 MYPART.TMP 写回你原来分区(hdx,y)的引导扇区。 + +注意:现在只有一些文件系统(FAT12/16/32/NTFS/ext2/ext3)被支持。 + +注意2:在Linux 下你可以对分区直接写。也就是说,步骤1 和步骤3 是不需要的。简单使用 + 它的设备名代替 MYPART.TMP 即可。 + +注意3:grubinst 具有把 grldr 的自举代码安装到分区引导扇区的功能。 + +****************************************************************************** +*** Use a single key to select menu item *** +****************************************************************************** + 使用一个单一的键来选择菜单项 + +一些机器具有简化的键盘。这些键盘可能只有数字键 0 到 9 ,外加少数几个其他键。当 +菜单还未显示时,使用者可以按下某个键 8 次。当菜单控制模块发现一个连续的单一按 +键时,它将认为使用者希望使用这个键来选择菜单和启动。这个单一的键可以充当右方向 +键来为使用者选择菜单。然后在使用者停止按键的 5 秒之后,被选择的菜单项将自动启 +动。任何的标准键可以被作为单一的键来达到这个目的,除了少数功能键,比如 b ,e , +回车键,等等。一旦另外的键被按下,单键选择特性将立即消失。 + + +****************************************************************************** +*** Parameter file for bootlace running under DOS *** +****************************************************************************** + +你可以把所有或部分的命令行参数放到一个文件中。这个文件可以有多行。就像空格 +和制表符一样,回车符和换行符也可以在参数文件中分割命令行参数。 + +示例: + bootlace < my_parafile + bootlace --read-only my_mbr < my_other_options + +注意: 不能使用管道符"|"。你必须使用输入重定向符 (<) 。 + +****************************************************************************** +*** Use bootlace to create a triple MBR *** +****************************************************************************** + 使用 bootlace 来建立一个三重的 MBR + +虽然这也能用于硬盘,但是它典型的使用是被用于 USB 设备。 +创建三重的 MBR 的步骤: + +1. 使用一个新版的 FDISK 分区软件来建立一个从第 95 扇区开始的FAT12或16或32 的分区 +(这里是 LBA 扇区表示法,起始扇区(MBR)是 0 扇区。) + +2. 安装 grldr 的引导扇区到这个分区的引导扇区。参见上面的“使用 bootlace.com 来安装分区引导记录” + +3. 获取从起始扇区 0 扇区(MBR)开始的96个扇区,然后保存到一个文件 MYMBR96.TMP 中。 + +4. 运行 bootlace.com: + bootlace.com MYMBR96.TMP +5. 将 MYMBR96.TMP 从MBR (0 扇区)开始回写到驱动器上。 + +注意: 如果驱动器已经是一个三重的 MBR ,那么 bootlace 会删除它并且恢复为原本的分区布局。 + +****************************************************************************** +*** Use 'pxe detect' in preset-menu *** +****************************************************************************** + 在预置菜单中使用 'pxe detect' 命令 + +现在“pxe”命令有了个新的子命令“detect”: + pxe detect [BLOCK_SIZE] [MENU_FILE] + 包大小选项 菜单文件选项 + +BLOCK_SIZE 选项指定出 pxe 包的大小。如果它没有被指定或者是被指定为 0 ,那么 +grub4dos将通过一个侦测过程来获取数据传送包的一个恰当的的值。 + +MENU_FILE 选项指定出 PXE 服务器上的配置文件。如果它被省略,在 menu.lst 子目录 +中的标准配置文件将获得控制。关于menu.lst 子目录中的配置文件的描述,请查阅上面 +的“GRLDR 作为 PXE 启动文件”一节。 + +如果MENU_FILE 是以"/"开始的,那么PXE 服务器上的 MENU_FILE 将获得控制,否则 +(如果MENU_FILE不是以"/"开始)将没有菜单被执行。 + +在你的系统用 512 字节的默认包大小不能运行时,通常你应该在访问(pd)设备之前 +使用一条 "pxe blksize ..." 或 一条 "pxe detect ..."命令。 + +****************************************************************************** +*** Use 'configfile' in preset-menu *** +****************************************************************************** + 在预置菜单中使用 'configfile'命令 + +现在预置菜单具有最高控制权。它将在启动设备上的 menu.lst 之前获得控制。如果 +'configfile' 命令在初始化命令组中出现,那么控制将转到启动设备上的menu.lst文件。 + +****************************************************************************** +*** New command 'dd' to copy files *** +****************************************************************************** + 复制文件的新命令 'dd' + +用法: + +dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT] [buf=ADDR] [buflen=SIZE] + +将 IF(源文件)复制到OF (目标文件)中。BS 是以字节计数的一个块的大小,默认 +值是512 。C 是复制的块数,默认值是源文件中的总块数。IN 指定在读取时跳过的块 +数,默认值是 0 。OUT 指定在写入时跳过的块数,默认值是0 。已跳过的块不会被改 +变。源文件和目标文件必须是存在的。 +译注:新增参数buf表示dd所用的读写缓存的起始地址,buflen表示缓存的长度,即大小。 + +源文件和目标文件必须以设备名开头,即,`(...)'的格式。对于当前根设备你应该使用`()'。 + +dd 命令既不扩大也不减小目标文件的大小,源文件尾部剩余的部分将被丢弃。目标 +文件不能是gzip压缩过的文件。如果源文件是gzip 压缩过的文件,它将在复制时被 +自动解压。 + +dd 具有危险性,使用风险由你自己的承担。作为一种安全方面的考虑,你应当只使 +用 dd 来写入一个内存中的文件。 + +某些情况下在写入NTFS 中的文件的时,dd 可能会失败。 + +假如你尝试在菜单中执行dd命令来写入一个不是内存中的设备或者块文件时,你会被安全的拒绝:-) +(更新:现在不再限制) + +更新: 新选项实现了让使用者自定义dd 命令的读写缓存。默认读写缓存起始于地 +址0x50000,长度为0x10000 (即64KB)。你不能指定起始地址ADDR 低于0x100000 +(即 1 MB)的缓存位置。此外,你必须指定参数SIZE 大于0x10000(即64K)。 +通常,你需要令ADDR大于或等于0x1000000 (16MB),并且 SIZE 也要大于或等于16MB 。 +增大 SIZE 的值能够加快 dd 的读写速度。 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! Both IF and OF can be a device name which stands for !!!! +!!!! all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + 警告!IF 和 OF 都可以是一个设备名,即它代表了设备上全部的扇区。慎之又慎! + +****************************************************************************** +*** New command 'uuid' to identify partitions *** +****************************************************************************** + 确认分区的新命令 'uuid' + +用法: + + uuid [DEVICE] [UUID] + +如果 DEVICE 选项未被指定,将在所有分区中搜索指定的 UUID 号的文件系统, +然后把包含这个文件系统的分区设置为新的根 (如果 uuid 被指定时),或者只列举所 +有设备上的文件系统的 uuid 号(如果 uuid 未被指定时)。 +如果 DEVICE 选项被指定了,将返回 真 或 假 ,对应于指定的设备是否与指定的 UUID +号相符(如果uuid被指定时),或者仅仅列举指定设备的uuid 号(uuid 未被指定时)。 + +示例 1: + find --set-root uuid () 7f95820f-5e33-4e6c-8f50-0760bf06d79c + +这将查找 uuid 等于 7f95820f-5e33-4e6c-8f50-0760bf06d79c的分区,然后将这个找到的分区设置为根。 + +示例 2: + uuid () +这将显示当前根设备的 uuid 号。 + +****************************************************************************** +*** gfxmenu support in grub4dos *** +****************************************************************************** + grub4dos 的 gfxmenu 支持 + +gfxmenu 支持已经被增加到 grub4dos 当中。使用它,你首先需要找到一个你需要的mesage +文件,然后在menu.lst中用类似这样的命令来装载它: + + gfxmenu /message + +这是一个全局命令,也就是说,不能放入任何的菜单项中。同时,它只能被使用于配置文件 +中,而在控制台模式中执行它是无效的。 + +gfxmenu 不能与全局密码保护功能同时使用。 + +message 文件有两个主要的格式。老的格式是通过gfxboot 3.2版或更旧的版本创建的 +(message文件的大小通常只能是150 k),当采用 gfxboot 3.3 版或更新的版本创建 +新格式时,(message文件的大小通常可以超过 300K)。这两种格式在grub4dos 中都 +已被支持。 + +****************************************************************************** +*** Use 'write' to write a string into a device or file *** +****************************************************************************** + 使用 'write' 命令将字符串写入设备或文件中 + +用法: + + write [--offset=SKIP] ADDR_OR_FILE INTEGER_OR_STRING + +SKIP 是一个整数默认值是 0 。 + +如果 ADDR_OR_FILE选项 被指定为一个整数,那么它被作为一个内存地址对待,并且 +INTEGER_OR_STRING选项也必须是一个整数值。整数 INTEGER_OR_STRING 将被写 +入(ADDR_OR_FILE 加上 SKIP 值)的地址处。 + +如果 ADDR_OR_FILE选项 指定的是一个设备或一个文件,那么INTEGER_OR_STRING 选 +项将被作为一个字符串对待,它将被写入跳过 SKIP 个字节(字节计数)的指定的设 +备或文件当中。 + +字符串不需要被引用,也就是说,不需要单引号(') 也不用 双引号(") 来引用它。 + +空格符必须被反斜杠(\)引用。(更新:现在不需要了) +(译注:如果字符串以空格开头,开头的这个空格符还是需要反斜杠引用) + +单引号(')和双引号(")不用特别说明并且可以直接使用到字符串中。 + +下面是一些 C 语言风格的引用序列说明: + + \NNN (1到3位)八进制值 NNN 表示的字符 + \\ 反斜杠 + \a 警报 (声音) + \b 退格符 + \f 换页符 + \n 换行符 + \r 回车符 + \t 水平制表符 + \v 垂直制表符 + \xHH (1到2位)十六进制值为 HH 的字节 + +就像 dd 命令一样,write 命令既不扩大也不缩小目标文件的文件大小,字符串的 +剩余部分将被丢弃。目标文件也不能是一个压缩过的文件。 + +还是和 dd 类似,write 命令也具有危险性,使用风险你自己承担。作为一种安全 +方面的考虑,你应当只向内存中的文件写入。 + +某些情况下当写入 NTFS 中的文件时,write命令可能失败。 + +假如你尝试在菜单中执行 write 命令来写入一个不是内存中的设备或者块文件时, +你会被安全的拒绝:-) (更新:现在不再限制) + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! +!!!! Caution! The file to write can be a device name which stands !!!! +!!!! for all the sectors on the device. Take utmost care! !!!! +!!!!______________________________________________________________________!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + 警告!被write 命令写入的文件可以是一个设备名,即它代表了设备上的所有 + 扇区。慎之又慎! + + +****************************************************************************** +*** Item-by-item help text for menu entries *** +****************************************************************************** + 为菜单项添加提示信息 + +当你选择一个菜单项时,屏幕底部的提示信息将发生变化。 + +你可以在标题行中添加你的提示信息。必须用"\n" 开头,示例: + title This is the title\nThis is the help text.\nAnd this is the 2nd line of the help text. + +一些 C 语言风格的引用符号在请看前面章节的说明。 + +****************************************************************************** +*** initrd can load multiple cpio files for Linux 2.6 kernels *** +****************************************************************************** + inird 命令可以为Linux 2.6 核心装载多个cpio 格式的文件 + +用法: + initrd FILE [FILE ...] + +注意 1:你不能用这种方法装载多于一个的老式磁盘镜像,因为Linux 核心不支持。 +注意 2:其中的 FILE 必须和在syslinux中使用的顺序一样。 + +****************************************************************************** +*** access some internel variables at a fixed location *** +****************************************************************************** + 在固定位置访问一些内部变量 +地址 长度 说明 +========= ======== ============================================== +0000:8208 4字节(即双字) 启动分区号 install_partition (the boot partition) +0000:8280 4字节(即双字) 启动驱动器号(boot_drive) +0000:8284 4字节(即双字) pxe 客户端 ip (即本地ip) +0000:8288 4字节(即双字) pxe 服务器 ip +0000:828C 4字节(即双字) pxe 网关 ip +0000:8290 8字节(即四字) 最后访问的文件的大小(是执行"cat --length=0"后的文件大小) +0000:8298 4字节(即双字) 可用的扩展内存大小(以 KB 为单位) +0000:829C 4字节(即双字) 当前根分区号(current root partition) +0000:82A0 4字节(即双字) 当前根所在的驱动器(current root drive) +0000:82A4 4字节(即双字) 解压标志 (gzip非自动解压),非0时不自动解压 +0000:82A8 8字节(即四字) 最后访问的分区的起始扇区号 +0000:82B0 8字节(即四字) 最后访问的分区的扇区总数 +0000:8278 4字节(即双字) GRUB4DOS编译的日期十进制数. + 以下命令用于判断当前使用的GRUB是否在2010-12-30日编译的。 + checkrange 20101230 read 0x8278 + +注意 1:Filesize 通过执行 "cat --length=0 FILE" 来初始化和修改。 +注意 2:尽量不要改写这些变量(应该只是读取)。 +注意 3:你可以使用内存地址6000:0000开始的 1K空间作为你自己的变量区(参见注意4)。 +注意 4:read 命令现在从指定的地址处返回32位整数值。 +注意 5:grub4dos 还没有变量扩展的功能。你只能使用整数变量。你不需要申明它们,就 + 可以直接使用这些内存地址。通常你需要通过一个逻辑值或者一个条件测试命令 + 来使用这些变量,即,类似这种格式:"checkrange RANGE read ADDR" +注意 6:内部变量no_decompression, saved_drive and saved_partition 是可写的。 + +****************************************************************************** +*** possibility to run another menu.lst after gfxmenu *** +****************************************************************************** + 在 gfxmenu 之后后运行其它 menu.lst + +注意下面是在 GFXMENU 之后使用 CONFIGILE 的示例: + + # The menu.lst file for gfxmenu + default=0 + timeout=5 + gfxmenu /message + configfile /another.lst + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of menu.lst + + # Begin another.lst + default=0 + timeout=5 + title 0.......... + ................ + title 1.......... + ................ + title 2.......... + ................ + # End of another.lst + +会首先尝试执行 gfxmenu 命令。当它退出时(或者失败时)控制会转到 another.lst 菜单。 + +****************************************************************************** +*** a range of drives can be unmapped *** +****************************************************************************** + +用法: + map --unmap=RANGE + +其中的 RANGE 是一个已被映射的 BIOS 驱动器域。BIOS 驱动器号 0 表示第一软驱,1 表示 +第二软驱;0x80 表示第一硬盘,0x81 表示第二硬盘,等等;虚拟光盘(hd32) 对应于 +BIOS 驱动器号 0xA0 ,(hd33) 对应于0xA1 ,等等。 + +关于RANGE 的说明,请参阅前述的“新命令 CHECKRANGE ”这节。 + +示例 1: + map --unmap=0,0x80,0xff + +这将反映射虚拟软驱 (fd0),虚拟硬盘(hd0)和虚拟光盘(0xff)。 + +示例 2: + map --unmap=0:0xff + +这将反映射所有的虚拟软驱,所有的虚拟硬盘和所有的虚拟光盘。 + +注意 1:通常,一条‘map’命令将在驱动器映射表中为虚拟驱动器增加一个表项。而 + ‘--unmap’意味着在驱动器映射表中(具体是指虚拟驱动器)的表项会被删除。 + +Note 2: The --unhook option only breaks the INT13 hook(to the inerrupt + vector table). It will not affect the drive map table. And later on + execution of a `boot' command, the INT13 disk emulation routine will + automatically get hooked(to the interrupt vector table) when needed + (e.g., the drive map table is non-empty) even if it has been unhooked. +注意 2:--unhook 选项仅仅是断开 INT13 的挂钩(在中断矢量表中)。它不会影响到驱 + 动器映射表。而且在执行了一个‘boot’命令之后,即使是它已经被反映射了的 + 时候,INT13磁盘仿真程序也会在需要的时候(即,驱动器映射表非空时)自动建立挂钩。 + +注意 3:通常你需要在已经改变了驱动器映射表之后执行一条`map --rehook'命令。 + +****************************************************************************** +*** geometry tune and sync *** +****************************************************************************** + 磁盘几何参数的修正和同步 + +当一个USB 存储设备被连接到一台(或者是不同的)机器上时,分区表中或 BPB 中的磁盘 +几何参数值可能是无效的,并且这个机器可能在启动时死机。因此你需要为驱动器找到一个 +正确的磁盘几何参数(使用 `geometry --tune'),然后更新分区表或 BPB 中的磁盘 +几何参数(使用`geometry --sync')。 + +假如你想启动到DOS,那上面的步骤是必要的,因为 DOS 要求有正确的磁盘几何参数在分区 +表和BPB 中。Windows 及 Linux 应该也需要,因为引导程序运行在实模式中。 + +****************************************************************************** +*** 版本编号 *** +****************************************************************************** + +我们添加了一个字符 'a', 'b', 'c' or 'p' 到版本编号(e.g., 0.4.5). +所以现在版本编号是 0.4.5a, 0.4.5b, 0.4.5c, 0.4.5 or 0.4.5p. + +'a' - alpha test. 不稳定, 尤其是在有已知BUG的情况下。 +'b' - beta test. 测试版,开发人员觉得这个版本没有bug,希望有一个长期的测试。 +'c' - 候选发布版,相对比较稳定。 +''(nothing) - 正式版,比较稳定。 +'p' - 修补版,对于在正式版中发现的一些问题进行修正. + +****************************************************************************** +*** Running User Programs(外部命令,供开发人员参考) *** +****************************************************************************** + +从0.4.5起,用户可以自行编写程序以在GRUB4DOS中运行。 +该可执行程序文件必须以8字节grub4dos EXEC签名结尾。 + 0x05, 0x18, 0x05, 0x03, 0xBA, 0xA7, 0xBA, 0xBC + +The executable must have no relocations, and the entry point is at the very +beginning of the file, just like a DOS .com file(but the grub4dos executable +is 32-bit). +程序的入口点在文件头,和DOS的.com文件很像(但我们是32位的程序)。 + +注:因为使用了linux gcc的特性,所以程序只能在linux下使用gcc进行编译。 + +附上一个简单的echo.c源码,供参考。 +/*================ begin echo.c ================*/ + +/* + * 编译: +gcc -nostdlib -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE echo.c + + * disassemble: objdump -d a.out + * confirm no relocation: readelf -r a.out + * generate executable: objcopy -O binary a.out echo + * 经过这一步之后生成的echo文件就是可以在grub4dos中运行的程序。 + * and then the resultant echo will be grub4dos executable. + */ + +/* + * This is a simple ECHO command, running under grub4dos. + */ +#define sprintf ((int (*)(char *, const char *, ...))((*(int **)0x8300)[0])) +#define printf(...) sprintf(NULL, __VA_ARGS__) + +int i = 0x66666666; /* 这是必要的,看下面的注释。*/ +/* gcc treat the following as data only if a global initialization like the + * above line occurs. + */ + +/* GRUB4DOS可执行程序结尾必须有以下8个字节(EXEC签名) */ +asm(".long 0x03051805"); +asm(".long 0xBCBAA7BA"); +/* 感谢上帝, gcc 会把上面的8个字按兵不动放在最终程序的最后面。 + * 不要在这里插入其它任何代码. + */ + +int main(char *arg,int flags) +{ + return printf("%s\n",arg); +} +/*================ end echo.c ================*/ + +0x8300 是 grub4dos 系统函数(API)的入口点. 你可以在 asm.S 源码中找到它的定义. + +目前可以使用的函数和变量: + http://grubutils.googlecode.com/svn/trunk/src/include/grub4dos.h + +****************************************************************************** +*** Map options added by Karyonix *** +****************************************************************************** + +(from boot-land.net) Karyonix's note: +注:boot-land.net网站已经改成 reboot.pro +map --add-mbt= option to be used with --mem. If =0 master boot track will not + be added automatically. + 配合--mem 使用. 如果=0 则不会自动添加主引导磁道. + 说明:默认情况下把一个分区镜像map为一个硬盘时会自动添加一个主引导磁道. + 使用该参数可以禁止GRUB4DOS自动添加。一般不需要使用这个参数。 + +map --top option to be used with --mem. map --mem will try to allocate memory + at highest available address. + 配合--mem 使用. 如果=0 则不会自动添加主引导磁道. + 说明:默认情况下把一个分区镜像map为一个硬盘时会自动添加一个主引导磁道. + 使用该参数可以禁止GRUB4DOS自动添加。一般不需要使用这个参数。 +map --mem-max=, map --mem-min options to be used before map --mem. Allow user + to manually limit range of address that map --mem can use. + +safe_parse_maxint_with_suffix function parses K,M,G,T suffix after number. +注:更新的GRUB4DOS版本中已经使用这个参数替换了默认的safe_parse_maxint函数。 +所以只要支持数值的命令行都可以使用以上特性。比如: +read 0x100000 //读取内存1MB处的数值 +可以写成如下方式,方便使用。 +read 1m +其它的命令只要支持数值输入的都可以使用这个特性。 + +****************************************************************************** +*** Graphics mode 6A: 800x600 with 16 colors *** +****************************************************************************** + +现在有两2种可选的图形模式,默认的是640x480模式. +新的是800x600模式(对一些机子支持不是很好,有可能会死机)。 + +使用以下方法可以切换图形显示模式。 + +1. 确定目前是在控制台模式,你可以执行命令 "terminal console" 进行切换。 +2. 使用命令"graphicsmode 0x6a" 设置图形模式为0x6A。 +3. 进入图形模式,你可以使用命令"terminal graphics". + 如果在切换之前不是图形模式,那该命令无效,你可以使用splashimg或fontfile命令。 + +注: 1. 如果想换回默认的640x480,把上面的第2步改成"graphicsmode 0x12". + 2. 经过改进,更新的版本,可以直接改变,只要上面第2步一条命令就可以搞定。 + 例子: + 在默认图形模式中(使用splashimage或fontfile命令都会进入图形模式). + 输入以下命令可以直接切换到800x600. + graphicsmode 0x6a + +***************************************************************************** +***** GRUB4DOS的变量支持 ***** +***************************************************************************** + +新的版本支持变量,用法和MSDOS一样。 +关键命令: + set [/p] [/a|/A] [/l|/u] [VARIABLE=[STRING]] + + variable 指定环境变量名(最长8个字符)。 + string 指定要指派给变量的一系列字符串(最长512个字符)。 + + 不带参数的 SET命令会显示当前变量。 + + 要删除某个变量,只需要让=后面为空就可以 + set myvar= + 将会删除变量myvar + + 显示已使用的名称的所有变量的值。例如: + set ex_ + 会显示所有以ex_开头的变量,如果没有任何匹配返回0. + +注:1.使用和MSDOS一样的处理方用户法,一整行的命令会在执行前先进行变量替换。 + 2.变量名必须使用字母或_开头。否则你将无法访问你的变量。 + 3.长度限制请看前面说明。 + 4.输入"set *"可以清除所有已设置的变量。 + 5./a 后面的STRING是一个表达式,将调用CALC进行计算,保存结果为10进制数。 + 6./A 同上,但保存结果为16进制数。 + 7./l|/u 大小写转换。 + 8./p 显示一个提示STRING并获取用户的输入内容并设置为变量VARIABLE的值。 + + +新增的命令if + if [/I] [NOT] STRING1==STRING2 [COMMAND] + if [NOT] exist VARIABLE|FILENAME [COMMAND] + 1.如果STRING1==STRING2 字符串匹配,执行后面的COMMAND(如果有指定的话)。 + 否则返回TRUE。 + 2./I 参数指写不区分大小写匹配。 + 3.[NOT] 相反,如果STRING1==STRING2不匹配。 + 4.exist 用于判断变量VARIABLE或文件FILENAME是否存在(filename必须以"/"或"("开头). + + 例子: + 1.判断字符串是否相等,并且不区分大小写。 + if /i test==%myvar% echo this is a test + 2.判断字符是否为空。 + if %myvar%#==# echo variable myvar not defined. + 注:我们使用了一个#不防止空操作,当然也可以使用其它字符,如 + if "%myvar%"=="" echo variable myvar not defined. + +使用方法举例: + 1.显示一个包括变量的串。 + echo myvar = %myvar% + 2.使用一个变量代替命令。 + set print=echo + %print% This a test. + 3.你可以使用一个“^”来阻此被变被扩展,例子 + echo %myvar^% + 或 + echo %my^var% + 将会显示 %myvar%而不是扩展myvar之后的字符。 + 总之,只要出现了^那就不会扩展这个变量。 + +注:我们只处理在%%之间的^符号。 + +***************************************************************************** +***** GRUB4DOS的批处理脚本支持 ***** +***************************************************************************** + +新的版本支持运行一个批处理脚本,语法和MS-DOS的批处理几乎一模一样。 +你不需要学习新的知识就可以应用GRUB4DOS的批处理,唯一要做的就是学习GRUB4DOS命令。 + +例子一个简单的脚本(看一下是不是和MS-DOS一样): + =========GRUB4DOS BATCH SCRIPT START=============================== + !BAT #注:文件头!BAT是必须的用于识别这是一个GRUB4DOS批处理脚本 + echo %0 + echo Your type: %1 %2 %3 %4 %5 %6 %7 %8 %9 + call :label1 This is a test string + goto :label2 + :label1 + echo %1 %2 %3 %4 %5 %6 %7 %8 %9 + goto :eof + :label2 + echo end of batch script. + =========GRUB4DOS BATCH SCRIPT END=============================== + +一些区别说明: + 1.出现错误时将停止执行。 + 2.如果需要中途停止批处理脚本的运行可以用exit 1 + 3.%9是指剩下的所有参数。 + 4.支持shift命令。 + 5.可扩展参数 + %~d0 扩展%0到磁盘号.例如:(hd0,0),默认是()。 + %~p0 扩展%0到一个路径。 + %~n0 扩展%0到一个文件名. + %~x0 扩展%0到一个文件扩展名。 + %~f0 扩展%0到一个完整的文件路径名(相当于%~dpnx0). + %~z0 扩展%0到文件大小. + 6.其它用法请参考CMD的批处理。 +在这里可以找到一些脚本 +http://chenall.net/post/tag/grub4dos/ + +******************************************************************************** + 条件菜单(iftitle) +******************************************************************************** +自2011-12-04的版本开始支持条件菜单,可以根据某个特定的条件来决定是否显示某个菜单。 +为了区别之前的普通菜单,使用新的参数iftitle。 +语法如下: + iftitle [] Actual Title displayed\nOptional help line + iftitle [] 菜单标题\n菜单帮助 + +注意: + 1.command必须是一个合法的GRUB4DOS命令,支持调用外部命令。 + 注:像echo/pause之类的命令在条件菜单命令中被禁用。 + 大部份的命令都可以使用,如果碰到不能使用的不要奇怪,非要使用可以提交BUG。 + 2.菜单标题前至少要保留一个空格. + 3.[]是必须的,不可少。 + 4.如果[]里面的内容为空相当于title即不判断。 + 5.你可以使用该功能来快速注释整个菜单的内容(不显示菜单),只需要使用一个非法的命令即可。 \ No newline at end of file diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/badgrub.exe b/ogclient/lib/grub4dos/grub4dos-0.4.5b/badgrub.exe new file mode 100644 index 0000000..213d401 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/badgrub.exe differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/bootlace.com b/ogclient/lib/grub4dos/grub4dos-0.4.5b/bootlace.com new file mode 100755 index 0000000..1e51485 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/bootlace.com differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/config.sys b/ogclient/lib/grub4dos/grub4dos-0.4.5b/config.sys new file mode 100644 index 0000000..9aa253e --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/config.sys @@ -0,0 +1,6 @@ +rem load grub.exe before emm386.exe +device=grub.exe --bypass --time-out=5 --config-file="color black/cyan yellow/cyan;timeout 60;default 0;title find and load NTLDR of Windows NT/2K/XP;find --set-root /ntldr;chainloader /ntldr;title find and load CMLDR, the Recovery Console of Windows NT/2K/XP;find --set-root /cmldr;chainloader /cmldr;write 0x7C03 0x63646D63;write 0x7C07 0x00736E6F;title find and load IO.SYS of Windows 9x/Me;find --set-root /io.sys;chainloader /io.sys;title floppy (fd0);chainloader (fd0)+1;rootnoverify (fd0);title find and boot Linux with menu.lst already installed;find --set-root /sbin/init;configfile /boot/grub/menu.lst;title find and boot Mandriva with menu.lst already installed;find --set-root /etc/mandriva-release;configfile /boot/grub/menu.lst;title back to dos;quit;title commandline;commandline;title reboot;reboot;title halt;halt;" + +device=c:\windows\himem.sys +device=c:\windows\emm386.exe + diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/default b/ogclient/lib/grub4dos/grub4dos-0.4.5b/default new file mode 100644 index 0000000..689c3c8 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/default @@ -0,0 +1,46 @@ + +# +# +# +# +# +# +# +# +# +# +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr new file mode 100644 index 0000000..50e25d5 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr.mbr b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr.mbr new file mode 100644 index 0000000..69c013a Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grldr.mbr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.exe b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.exe new file mode 100644 index 0000000..4f23b56 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.exe differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.pif b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.pif new file mode 100644 index 0000000..28b4380 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/grub.pif differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/hmload.com b/ogclient/lib/grub4dos/grub4dos-0.4.5b/hmload.com new file mode 100644 index 0000000..04c794c Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.5b/hmload.com differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.5b/menu.lst b/ogclient/lib/grub4dos/grub4dos-0.4.5b/menu.lst new file mode 100644 index 0000000..1243616 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.5b/menu.lst @@ -0,0 +1,132 @@ +# This is a sample menu.lst file. You should make some changes to it. +# The old install method of booting via the stage-files has been removed. +# Please install GRLDR boot strap code to MBR with the bootlace.com +# utility under DOS/Win9x or Linux. + +color blue/green yellow/red white/magenta white/magenta +timeout 30 +## menu border color +color border=0xEEFFEE +## set vbe mode +graphicsmode -1 640 480:800 +## loading splashimage +splashimage /boot/grub/splashimage.xpm || splashimage /boot/grub/splashimage.bmp +default /default +## Menu AutoNumber +write 0x8274 0x2001 + +title find and load NTLDR of Windows NT/2K/XP\n find and load NTLDR of Windows NT/2K/XP +fallback 1 +find --set-root --ignore-floppies --ignore-cd /ntldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /ntldr +chainloader /ntldr +savedefault --wait=2 + +#iftitle only show when command in [] returns true +# set a variable named bootmgr where /bootmgr is found. +iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr% +chainloader %bootmgr%/bootmgr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback 3 +find --set-root --ignore-floppies --ignore-cd /cmldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +#write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +#write 0x7C07 0x00736E6F + +# or. +#write --offset=3 (md)0x3e+1 cmdcons +# or +calc *0x7c03=0x00736E6F63646D63 + +savedefault --wait=2 + +title find and load IO.SYS of Windows 9x/Me +fallback 4 +find --set-root /io.sys +chainloader /io.sys +savedefault --wait=2 +# you can also use below commands. +# find --set-root chainloader /io.sys +# boot +# the boot is necessary, +# please see "Delimitors or comments between titles" in grub4dos_readme.txt. + +title find and boot 0PE.ISO +fallback 5 +find --set-root /0PE/0PE.ISO +map /0PE/0PE.ISO (0xff) || map --mem /0PE/0PE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title find and boot MicroPE.ISO +fallback 6 +find --set-root /boot/MicroPE.ISO +map /boot/MicroPE.ISO (0xff) || map --mem /boot/MicroPE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Parted Magic ISO +fallback 7 +find --set-root /pmagic.iso +map /pmagic.iso (0xff) || map --mem /pmagic.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Ultimate Boot CD ISO +fallback 8 +find --set-root /ubcd.iso +map /ubcd.iso (0xff) || map --mem /ubcd.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title SliTaz ISO +find --set-root /slitaz.iso +map /slitaz.iso (0xff) || map --mem /slitaz.iso (0xff) +map --hook +chainloader (0xff) + +title commandline +commandline + +title floppy (fd0) +chainloader (fd0)+1 +rootnoverify (fd0) +# or use below commands. +# rootnoverify (fd0) +# chainloader +1 + +title back to dos +quit + +title reboot +reboot + +title halt +halt + +title MAXDOS.IMG +find --set-root --ignore-floppies /boot/MAXDOS.IMG +map --mem /boot/MAXDOS.IMG (fd0) +map --hook +chainloader (fd0)+1 +rootnoverify (fd0) + + diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/COPYING b/ogclient/lib/grub4dos/grub4dos-0.4.6a/COPYING new file mode 100755 index 0000000..eeb586b --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.6a/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/Get_Source_of_This_Build.txt b/ogclient/lib/grub4dos/grub4dos-0.4.6a/Get_Source_of_This_Build.txt new file mode 100755 index 0000000..886a99a --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.6a/Get_Source_of_This_Build.txt @@ -0,0 +1,8 @@ +-e Get the source code of this build in this way: + + git clone git://github.com/chenall/grub4dos.git + cd grub4dos + git checkout 34ca1a9 -b build + +-e and now you may do a "make" to compile. + diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/badgrub.exe b/ogclient/lib/grub4dos/grub4dos-0.4.6a/badgrub.exe new file mode 100755 index 0000000..060ed6d Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/badgrub.exe differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace.com b/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace.com new file mode 100755 index 0000000..a7bf25c Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace.com differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace64.com b/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace64.com new file mode 100755 index 0000000..d57e662 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/bootlace64.com differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/eltorito.sys b/ogclient/lib/grub4dos/grub4dos-0.4.6a/eltorito.sys new file mode 100755 index 0000000..d5e12d2 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/eltorito.sys differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr new file mode 100755 index 0000000..eb06427 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.mbr b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.mbr new file mode 100755 index 0000000..d168da0 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.mbr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.pbr b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.pbr new file mode 100755 index 0000000..b71b10a Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr.pbr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr_cd.bin b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr_cd.bin new file mode 100755 index 0000000..5443b11 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grldr_cd.bin differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.exe b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.exe new file mode 100755 index 0000000..24d9140 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.exe differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.pif b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.pif new file mode 100755 index 0000000..28b4380 Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/grub.pif differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/hmload.com b/ogclient/lib/grub4dos/grub4dos-0.4.6a/hmload.com new file mode 100755 index 0000000..04c794c Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/hmload.com differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/ipxegrldr b/ogclient/lib/grub4dos/grub4dos-0.4.6a/ipxegrldr new file mode 100755 index 0000000..425e6df Binary files /dev/null and b/ogclient/lib/grub4dos/grub4dos-0.4.6a/ipxegrldr differ diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/config.sys b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/config.sys new file mode 100755 index 0000000..9aa253e --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/config.sys @@ -0,0 +1,6 @@ +rem load grub.exe before emm386.exe +device=grub.exe --bypass --time-out=5 --config-file="color black/cyan yellow/cyan;timeout 60;default 0;title find and load NTLDR of Windows NT/2K/XP;find --set-root /ntldr;chainloader /ntldr;title find and load CMLDR, the Recovery Console of Windows NT/2K/XP;find --set-root /cmldr;chainloader /cmldr;write 0x7C03 0x63646D63;write 0x7C07 0x00736E6F;title find and load IO.SYS of Windows 9x/Me;find --set-root /io.sys;chainloader /io.sys;title floppy (fd0);chainloader (fd0)+1;rootnoverify (fd0);title find and boot Linux with menu.lst already installed;find --set-root /sbin/init;configfile /boot/grub/menu.lst;title find and boot Mandriva with menu.lst already installed;find --set-root /etc/mandriva-release;configfile /boot/grub/menu.lst;title back to dos;quit;title commandline;commandline;title reboot;reboot;title halt;halt;" + +device=c:\windows\himem.sys +device=c:\windows\emm386.exe + diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/default b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/default new file mode 100755 index 0000000..689c3c8 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/default @@ -0,0 +1,46 @@ + +# +# +# +# +# +# +# +# +# +# +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# WARNING: If you want to edit this file directly, do not remove any line +# from this file, including this warning. XXXXXXXXXXXXXXXXXXXXXXXXXXX +# XXXXXXXXXXXXXXXXXXXXX +# !!!!!!! The file size is 2048 bytes. Don't change the file size !!!!!!! +# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/menu.lst b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/menu.lst new file mode 100755 index 0000000..27ce716 --- /dev/null +++ b/ogclient/lib/grub4dos/grub4dos-0.4.6a/sample/menu.lst @@ -0,0 +1,151 @@ +# This is a sample menu.lst file. You should make some changes to it. +# The old install method of booting via the stage-files has been removed. +# Please install GRLDR boot strap code to MBR with the bootlace.com +# utility under DOS/Win9x or Linux. +# +# It must be UTF-8 encoding for multi-lingual support. Font lines can be +# appended to the file. The font lines should be in the unifont.hex format. + +color blue/green yellow/red white/magenta white/magenta +timeout 30 +## menu border color +color border=0xEEFFEE +## set vbe mode +graphicsmode -1 640:800 480:600 24:32 || graphicsmode -1 -1 -1 24:32 +## loading splashimage +splashimage /boot/grub/splashimage.xpm || splashimage /boot/grub/splashimage.bmp +default /default +## Menu AutoNumber +write 0x8274 0x2001 + +title find and load NTLDR of Windows NT/2K/XP\n find and load NTLDR of Windows NT/2K/XP +fallback +1 +find --set-root --ignore-floppies --ignore-cd /ntldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /ntldr +chainloader /ntldr +savedefault --wait=2 + +#iftitle only show when command in [] returns true +# set a variable named bootmgr where /bootmgr is found. +iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr% +fallback +1 +chainloader %bootmgr%/bootmgr +savedefault --wait=2 + +title find and load CMLDR, the Recovery Console of Windows NT/2K/XP +fallback +1 +find --set-root --ignore-floppies --ignore-cd /cmldr +map () (hd0) +map (hd0) () +map --rehook +find --set-root --ignore-floppies --ignore-cd /cmldr +chainloader /cmldr +##################################################################### +# write string "cmdcons" to memory 0000:7C03 in 2 steps: +##################################################################### +# step 1. Write 4 chars "cmdc" at 0000:7C03 +#write 0x7C03 0x63646D63 +# step 2. Write 3 chars "ons" and an ending null at 0000:7C07 +#write 0x7C07 0x00736E6F + +# or. +#write --offset=3 (md)0x3e+1 cmdcons\0 +# or +calc *0x7c03=0x00736E6F63646D63 + +savedefault --wait=2 + +title Chainload IO.SYS for booting MS-DOS/Windows 9x/Me +fallback +1 +find --set-root --ignore-floppies --ignore-cd /io.sys +chainloader /io.sys +savedefault --wait=2 +# +# Or in this way: +# +# find --set-root --ignore-floppies --ignore-cd chainloader /io.sys +# boot +# +# The above boot command is needed in this case. +# See "Delimitors or comments between titles" in grub4dos_readme.txt. + +title find /boot/grub/menu.lst for booting Linux (Mageia, Mandriva, etc) +fallback +1 +find --set-root --ignore-floppies --ignore-cd /boot/grub/menu.lst +configfile /boot/grub/menu.lst + +title Switch to GRUB2 core.img for booting Linux (Ubuntu, etc) +fallback +1 +find --set-root --ignore-floppies --ignore-cd /boot/grub/i386-pc/core.img +kernel /boot/grub/i386-pc/core.img + +title commandline +commandline + +title 0PE LiveISO +find --set-root --ignore-floppies --ignore-cd /0PE.ISO +map /0PE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title MicroPE LiveISO +find --set-root --ignore-floppies --ignore-cd /boot/MicroPE.ISO +map /boot/MicroPE.ISO (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Parted Magic LiveISO +find --set-root --ignore-floppies --ignore-cd /pmagic.iso +map /pmagic.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title Ultimate Boot CD LiveISO +find --set-root --ignore-floppies --ignore-cd /ubcd.iso +map /ubcd.iso (0xff) +map --hook +chainloader (0xff) +savedefault --wait=2 + +title SliTaz LiveISO +find --set-root --ignore-floppies --ignore-cd /slitaz.iso +map /slitaz.iso (0xff) +map --hook +chainloader (0xff) + +title Mageia Installation ISO +find --set-root --ignore-floppies --ignore-cd /Mageia-2-x86_64-DVD.iso +map /Mageia-2-x86_64-DVD.iso (0xff) +map --hook +chainloader (0xff) + +title reboot (重启) +reboot + +title halt (关机) +halt + +title MAXDOS.IMG +find --set-root --ignore-floppies --ignore-cd /boot/MAXDOS.IMG +map --mem /boot/MAXDOS.IMG (fd0) +map --hook +chainloader (fd0)+1 +rootnoverify (fd0) + +# In the end, font lines for unicode chars in unifont.hex format. +# It should include all unicode chars used in the above menu code. +# Surely normal ASCII chars are not necessary to be included here. + +5173:10100810082000003FF8010001000100FFFE010002800280044008203018C006 +542F:010000801FFC1004100410041FFC10001000100017FC24042404440487FC0404 +673A:100011F011101110FD10111031103910551055109110111211121212120E1400 +91CD:001000F83F000100FFFE01001FF011101FF011101FF001003FF80100FFFE0000 + + + diff --git a/ogclient/lib/grub4dos/hmload.com b/ogclient/lib/grub4dos/hmload.com new file mode 100644 index 0000000..04c794c Binary files /dev/null and b/ogclient/lib/grub4dos/hmload.com differ diff --git a/ogclient/lib/httpd/10-cgi.conf b/ogclient/lib/httpd/10-cgi.conf new file mode 100644 index 0000000..e6f4c85 --- /dev/null +++ b/ogclient/lib/httpd/10-cgi.conf @@ -0,0 +1,18 @@ +# /usr/share/doc/lighttpd-doc/cgi.txt + +server.modules += ( "mod_cgi" ) + +$HTTP["url"] =~ "^/cgi-bin/" { +alias.url += ( "/cgi-bin/" => "/usr/lib/cgi-bin/" ) +$HTTP["url"] =~ "^/cgi-bin/" { +cgi.assign = ( ".sh" => "/bin/sh" ) +} +} + +## Warning this represents a security risk, as it allow to execute any file +## with a .pl/.py even outside of /usr/lib/cgi-bin. +# +#cgi.assign = ( +# ".pl" => "/usr/bin/perl", +# ".py" => "/usr/bin/python", +#) diff --git a/ogclient/lib/httpd/LogCommand.sh b/ogclient/lib/httpd/LogCommand.sh new file mode 100755 index 0000000..09656fc --- /dev/null +++ b/ogclient/lib/httpd/LogCommand.sh @@ -0,0 +1,41 @@ +#!/bin/bash +OGLOGCOMMAND=${OGLOGCOMMAND:-"/tmp/command.log"} +OGLOGCOMMANDTMP=$OGLOGCOMMAND.tmp +echo "Content-type: text/html" +echo "" +echo "" +echo "" +echo " " +echo "Bash as CGI" + +strings -e S $OGLOGCOMMAND > $OGLOGCOMMANDTMP + +echo "" + +echo "" + + +echo "" + +echo "" + + +echo "" + +echo "" + + +echo "" + +echo "
" + + +echo "" diff --git a/ogclient/lib/httpd/LogSession.sh b/ogclient/lib/httpd/LogSession.sh new file mode 100755 index 0000000..7e39092 --- /dev/null +++ b/ogclient/lib/httpd/LogSession.sh @@ -0,0 +1,30 @@ +#!/bin/bash +OGLOGSESSION=${OGLOGSESSION:-"/tmp/session.log"} +echo "Content-type: text/html" +echo "" +echo "" +echo " " +echo " " +echo " Bash as CGI" + +echo "" + +echo "" + +echo "" + +echo "" + diff --git a/ogclient/lib/httpd/bandwidth.sh b/ogclient/lib/httpd/bandwidth.sh new file mode 100755 index 0000000..9e7833c --- /dev/null +++ b/ogclient/lib/httpd/bandwidth.sh @@ -0,0 +1,12 @@ +#!/bin/bash +echo "Content-type: text/html" +echo "" +echo " Bash as CGI " + +echo "" +echo "" \ No newline at end of file diff --git a/ogclient/lib/httpd/cache.sh b/ogclient/lib/httpd/cache.sh new file mode 100755 index 0000000..a2e4009 --- /dev/null +++ b/ogclient/lib/httpd/cache.sh @@ -0,0 +1,22 @@ +#!/bin/bash +echo "Content-type: text/html" +echo "" +echo " Listado de la Cache" +echo "" +echo "" +echo "" +echo "" +echo "" \ No newline at end of file diff --git a/ogclient/lib/httpd/httpd-log.sh b/ogclient/lib/httpd/httpd-log.sh new file mode 100755 index 0000000..4dce863 --- /dev/null +++ b/ogclient/lib/httpd/httpd-log.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +echo "Content-type: text/html" +echo "" +echo "OpenGnsys Client" +echo " " +echo "" + +echo "

$(./httpd-runengine.sh 'ogEcho $MSG_HTTPLOG_NOUSE').
host $(hostname -s)

" + +echo " " +echo "
" + +echo "" +echo "" + +echo " diff --git a/ogclient/lib/httpd/httpd-menu.sh b/ogclient/lib/httpd/httpd-menu.sh new file mode 100755 index 0000000..c5e5836 --- /dev/null +++ b/ogclient/lib/httpd/httpd-menu.sh @@ -0,0 +1,14 @@ +#!/bin/bash + + +#!/bin/bash +echo "Content-type: text/html" +echo "" + +echo "OpenGnsys Client" + +$(wget http://172.17.9.205/opengnsys/varios/menubrowser.php -O /tmp/menu.tmp) +echo "$(cat /tmp/menu.tmp)" + +echo " + diff --git a/ogclient/lib/httpd/httpd-runengine.sh b/ogclient/lib/httpd/httpd-runengine.sh new file mode 100755 index 0000000..a3fc3e6 --- /dev/null +++ b/ogclient/lib/httpd/httpd-runengine.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# Exportar parámetros del kernel. + +for i in $(cat /proc/cmdline); do + echo $i | grep -q "=" && export $i +done + + +. /opt/opengnsys/etc/preinit/loadenviron.sh > /dev/null +eval $1 diff --git a/ogclient/lib/httpd/lighttpd.conf b/ogclient/lib/httpd/lighttpd.conf new file mode 100644 index 0000000..ce1efa5 --- /dev/null +++ b/ogclient/lib/httpd/lighttpd.conf @@ -0,0 +1,167 @@ +# Debian lighttpd configuration file +# + +############ Options you really have to take care of #################### + +## modules to load +# mod_access, mod_accesslog and mod_alias are loaded by default +# all other module should only be loaded if neccesary +# - saves some time +# - saves memory + +server.modules = ( + "mod_access", + "mod_alias", + "mod_accesslog", + "mod_compress", +# "mod_rewrite", +# "mod_redirect", +# "mod_evhost", +# "mod_usertrack", +# "mod_rrdtool", +# "mod_webdav", +# "mod_expire", +# "mod_flv_streaming", +# "mod_evasive" +) + +## a static document-root, for virtual-hosting take look at the +## server.virtual-* options +server.document-root = "/var/www/" + +## where to upload files to, purged daily. +server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) + +## where to send error-messages to +server.errorlog = "/var/log/lighttpd/error.log" + +## files to check for if .../ is requested +index-file.names = ( "index.php", "index.html", + "index.htm", "default.htm", + "index.lighttpd.html" ) + + +## Use the "Content-Type" extended attribute to obtain mime type if possible +# mimetype.use-xattr = "enable" + +#### accesslog module +accesslog.filename = "/var/log/lighttpd/access.log" + +## deny access the file-extensions +# +# ~ is for backupfiles from vi, emacs, joe, ... +# .inc is often used for code includes which should in general not be part +# of the document-root +url.access-deny = ( "~", ".inc" ) + +## +# which extensions should not be handle via static-file transfer +# +# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi +static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) + + +######### Options that are good to be but not neccesary to be changed ####### + +## Use ipv6 only if available. (disabled for while, check #560837) +#include_shell "/usr/share/lighttpd/use-ipv6.pl" + +## bind to port (default: 80) +# server.port = 81 + +## bind to localhost only (default: all interfaces) +## server.bind = "localhost" + +## error-handler for status 404 +#server.error-handler-404 = "/error-handler.html" +#server.error-handler-404 = "/error-handler.php" + +## to help the rc.scripts +server.pid-file = "/var/run/lighttpd.pid" + +## +## Format: .html +## -> ..../status-404.html for 'File not found' +#server.errorfile-prefix = "/var/www/" + +## virtual directory listings +dir-listing.encoding = "utf-8" +server.dir-listing = "enable" + +## send unhandled HTTP-header headers to error-log +#debug.dump-unknown-headers = "enable" + +### only root can use these options +# +# chroot() to directory (default: no chroot() ) +#server.chroot = "/" + +## change uid to (default: don't care) +server.username = "www-data" + +## change uid to (default: don't care) +server.groupname = "www-data" + +#### compress module +compress.cache-dir = "/var/cache/lighttpd/compress/" +compress.filetype = ("text/plain", "text/html", "application/x-javascript", "text/css") + + +#### url handling modules (rewrite, redirect, access) +# url.rewrite = ( "^/$" => "/server-status" ) +# url.redirect = ( "^/wishlist/(.+)" => "http://www.123.org/$1" ) + +# +# define a pattern for the host url finding +# %% => % sign +# %0 => domain name + tld +# %1 => tld +# %2 => domain name without tld +# %3 => subdomain 1 name +# %4 => subdomain 2 name +# +# evhost.path-pattern = "/home/storage/dev/www/%3/htdocs/" + +#### expire module +# expire.url = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes") + +#### rrdtool +# rrdtool.binary = "/usr/bin/rrdtool" +# rrdtool.db-name = "/var/www/lighttpd.rrd" + +#### variable usage: +## variable name without "." is auto prefixed by "var." and becomes "var.bar" +#bar = 1 +#var.mystring = "foo" + +## integer add +#bar += 1 +## string concat, with integer cast as string, result: "www.foo1.com" +#server.name = "www." + mystring + var.bar + ".com" +## array merge +#index-file.names = (foo + ".php") + index-file.names +#index-file.names += (foo + ".php") + + +#### external configuration files +## mimetype mapping +include_shell "/usr/share/lighttpd/create-mime.conf.pl" + +## load enabled configuration files, +## read /etc/lighttpd/conf-available/README first +include "/etc/lighttpd/conf-enabled/*.conf" + +#### handle Debian Policy Manual, Section 11.5. urls +## by default allow them only from localhost +## (This must come last due to #445459) +## Note: =~ "127.0.0.1" works with ipv6 enabled, whereas == "127.0.0.1" doesn't +#$HTTP["remoteip"] =~ "127.0.0.1" { +# alias.url += ( +# "/doc/" => "/usr/share/doc/", +# "/images/" => "/usr/share/images/" +# ) +# $HTTP["url"] =~ "^/doc/|^/images/" { +# dir-listing.activate = "enable" +# } +#} + diff --git a/ogclient/lib/httpd/oglive.css b/ogclient/lib/httpd/oglive.css new file mode 100644 index 0000000..71f19ce --- /dev/null +++ b/ogclient/lib/httpd/oglive.css @@ -0,0 +1,11 @@ +TEXTAREA { +background-color: navy; +border: black 2px solid; +color: white; +font-family: arial, verdana, ms sans serif; +font-size: 8pt; +font-weight: normal +} + + example1 {color:white; background-color:navy; + font-weight:bold; text-align:center;} \ No newline at end of file diff --git a/ogclient/lib/locale/ca/LC_MESSAGES/browser.mo b/ogclient/lib/locale/ca/LC_MESSAGES/browser.mo new file mode 100644 index 0000000..6104759 Binary files /dev/null and b/ogclient/lib/locale/ca/LC_MESSAGES/browser.mo differ diff --git a/ogclient/lib/locale/en/LC_MESSAGES/browser.mo b/ogclient/lib/locale/en/LC_MESSAGES/browser.mo new file mode 100644 index 0000000..d6326d7 Binary files /dev/null and b/ogclient/lib/locale/en/LC_MESSAGES/browser.mo differ diff --git a/ogclient/lib/modules/psmouse.ko b/ogclient/lib/modules/psmouse.ko new file mode 100644 index 0000000..f305164 Binary files /dev/null and b/ogclient/lib/modules/psmouse.ko differ diff --git a/ogclient/lib/os-probes/10zvol-test b/ogclient/lib/os-probes/10zvol-test new file mode 100755 index 0000000..cdbe7a5 --- /dev/null +++ b/ogclient/lib/os-probes/10zvol-test @@ -0,0 +1,14 @@ +#!/bin/sh +# Sub-test to exclude ZVOLs +set -e +partition="$1" + +. /usr/share/os-prober/common.sh + +if [ "$(stat -L -c %t "$partition")" = "e6" ] ; then + debug "$1 is a ZVOL; skipping" + exit 0 +fi + +# No ZVOLs found +exit 1 diff --git a/ogclient/lib/os-probes/50mounted-tests b/ogclient/lib/os-probes/50mounted-tests new file mode 100755 index 0000000..6f4d7af --- /dev/null +++ b/ogclient/lib/os-probes/50mounted-tests @@ -0,0 +1,99 @@ +#!/bin/sh +# Sub-tests that require a mounted partition. +set -e +partition="$1" + +. /usr/share/os-prober/common.sh + +types="$(fs_type "$partition")" || types=NOT-DETECTED +if [ "$types" = NOT-DETECTED ] || [ -z "$types" ]; then + debug "$1 type not recognised; skipping" + exit 0 +elif [ "$types" = swap ]; then + debug "$1 is a swap partition; skipping" + exit 0 +elif [ "$types" = LVM2_member ]; then + debug "$1 is a LVM member partition; skipping" + exit 0 +elif [ "$types" = crypto_LUKS ]; then + debug "$1 is a LUKS partition; skipping" + exit 0 +elif [ "$types" = ntfs ]; then + if type ntfs-3g >/dev/null 2>&1; then + types='ntfs-3g ntfs' + fi +elif [ -z "$types" ]; then + if type cryptsetup >/dev/null 2>&1 && \ + cryptsetup luksDump "$partition" >/dev/null 2>&1; then + debug "$1 is a LUKS partition; skipping" + exit 0 + fi + for type in $(grep -v nodev /proc/filesystems); do + # hfsplus filesystems are mountable as hfs. Try hfs last so + # that we can tell the difference. + if [ "$type" = hfs ]; then + delaytypes="${delaytypes:+$delaytypes }$type" + elif [ "$type" = fuseblk ]; then + if type ntfs-3g >/dev/null 2>&1; then + types="${types:+$types }ntfs-3g" + fi + else + types="${types:+$types }$type" + fi + done +fi + +tmpmnt=/var/lib/os-prober/mount +if [ ! -d "$tmpmnt" ]; then + mkdir "$tmpmnt" +fi + +mounted= +if type grub-mount >/dev/null 2>&1 && \ + type grub-probe >/dev/null 2>&1 && \ + grub-mount "$partition" "$tmpmnt" 2>/dev/null; then + mounted=1 + type="$(grub-probe -d "$partition" -t fs)" || true + if [ "$type" ]; then + debug "mounted using GRUB $type filesystem driver" + else + debug "mounted using GRUB, but unknown filesystem?" + type=fuseblk + fi +else + echo "Failed to probe $partition for filesystem type" >&2 + exit 1 +fi + +if [ "$mounted" ]; then + for test in /usr/lib/os-probes/mounted/*; do + debug "running subtest $test" + if [ -f "$test" ] && [ -x "$test" ]; then + if "$test" "$partition" "$tmpmnt" "$type"; then + debug "os found by subtest $test" + if ! umount "$tmpmnt"; then + warn "failed to umount $tmpmnt" + fi + case "$type" in + btrfs) + # umount to account for the bind-mount + if [ -x "$tmpmnt/@/lib" ] && \ + ! umount $tmpmnt; then + warn "failed to umount $tmpmnt" + fi + ;; + esac + rmdir "$tmpmnt" || true + exit 0 + fi + fi + done + if ! umount "$tmpmnt"; then + warn "failed to umount $tmpmnt" + fi +fi + +rmdir "$tmpmnt" || true + +# No tests found anything. +exit 1 diff --git a/ogclient/lib/os-probes/init/10filesystems b/ogclient/lib/os-probes/init/10filesystems new file mode 100755 index 0000000..f50e55e --- /dev/null +++ b/ogclient/lib/os-probes/init/10filesystems @@ -0,0 +1,39 @@ +#!/bin/sh +# Make sure filesystems are available. +set +e # ignore errors from modprobe + +FILESYSTEMS='ext2 ext3 ext4 xfs jfs msdos vfat ntfs minix hfs hfsplus qnx4 ufs btrfs' +# fuse is needed to make grub-mount work. +FILESYSTEMS="$FILESYSTEMS fuse" +# The Ubuntu kernel udebs put a number of filesystem modules in +# fs-{core,secondary}-modules. It's fairly cheap to check for these too. +FILESYSTEMS="$FILESYSTEMS fs-core fs-secondary" + +if [ ! -e /var/lib/os-prober/modules ]; then + # Check for anna-install to make it easier to use os-prober outside + # d-i. + if type anna-install >/dev/null 2>&1 && [ -d /lib/debian-installer ]; then + for fs in $FILESYSTEMS; do + ANNA_QUIET=1 DEBIAN_FRONTEND=none \ + log-output -t os-prober \ + anna-install "$fs-modules" || true + done + depmod -a >/dev/null 2>&1 || true + fi + + for fs in $FILESYSTEMS; do + case "$fs" in + fs-*) + ;; + *) + modprobe "$fs" 2>/dev/null | logger -t os-prober + ;; + esac + done + + # We only want to keep this state inside d-i, so this is as good a + # check as any. + if type anna-install >/dev/null 2>&1 && [ -d /lib/debian-installer ]; then + touch /var/lib/os-prober/modules + fi +fi diff --git a/ogclient/lib/os-probes/mounted/05efi b/ogclient/lib/os-probes/mounted/05efi new file mode 100755 index 0000000..93309ce --- /dev/null +++ b/ogclient/lib/os-probes/mounted/05efi @@ -0,0 +1,71 @@ +#!/bin/sh +# Detects all Microsoft OSes on a collection of partitions. + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# This file is for UEFI platform only +if [ ! -d /sys/firmware/efi ] || [ -f /var/lib/partman/ignore_uefi ]; then + debug "Not on UEFI platform" + exit 1 +fi + +# Weed out stuff that doesn't apply to us +case "$type" in + vfat) debug "$1 is a FAT32 partition" ;; + msdos) debug "$1 is a FAT16 partition" ;; + fat) debug "$1 is a FAT partition (mounted by GRUB)" ;; + *) debug "$1 is $type partition: exiting"; exit 1 ;; +esac + +if type udevadm > /dev/null 2>&1; then + udevinfo () { + udevadm info "$@" + } +fi + +if type udevinfo > /dev/null 2>&1; then + # Skip virtual devices + if udevinfo -q path -n $partition | grep -q /virtual/; then + debug "$1 is virtual device: exiting" + exit 1 + fi + + eval "$(udevinfo -q property -n "$partition" | grep -E '^ID_PART_ENTRY_(TYPE|SCHEME)=')" + debug "$partition partition scheme is $ID_PART_ENTRY_SCHEME" + debug "$partition partition type is $ID_PART_ENTRY_TYPE" + + if [ -z "$ID_PART_ENTRY_TYPE" -o -z "$ID_PART_ENTRY_SCHEME" -o \ + \( "$ID_PART_ENTRY_SCHEME" != gpt -a "$ID_PART_ENTRY_SCHEME" != msdos \) -o \ + \( "$ID_PART_ENTRY_SCHEME" = gpt -a "$ID_PART_ENTRY_TYPE" != c12a7328-f81f-11d2-ba4b-00a0c93ec93b \) -o \ + \( "$ID_PART_ENTRY_SCHEME" = msdos -a "$ID_PART_ENTRY_TYPE" != 0xef \) ]; then + debug "$partition is not a ESP partition: exiting" + exit 1 + fi +else + debug "udevinfo and udevadm missing - cannot check partition type" +fi + +efi=$(item_in_dir efi "$mpoint") +if [ -z "$efi" ]; then + debug "$mpoint does not have /EFI directory: exiting" + exit 1 +fi + +ret=1 +for test in /usr/lib/os-probes/mounted/efi/*; do + debug "running subtest $test" + if [ -f "$test" ] && [ -x "$test" ]; then + entry=$("$test" "$mpoint/$efi") + if [ -n "$entry" ]; then + debug "bootloader $entry found by subtest $test" + ret=0 + result "${partition}@/$efi/${entry}:efi" + fi + fi +done + +exit $ret diff --git a/ogclient/lib/os-probes/mounted/10freedos b/ogclient/lib/os-probes/mounted/10freedos new file mode 100755 index 0000000..94388f3 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/10freedos @@ -0,0 +1,23 @@ +#!/bin/sh + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# Weed out stuff that doesn't apply to us +case "$type" in + vfat) debug "$1 is a FAT32 partition" ;; + msdos) debug "$1 is a FAT16 partition" ;; + fat) debug "$1 is a FAT partition (mounted by GRUB)" ;; + *) debug "$1 is not a FAT partition: exiting"; exit 1 ;; +esac + +if item_in_dir -q kernel.sys "$2" && item_in_dir -q command.com "$2"; then + label="$(count_next_label FreeDOS)" + result "$1:FreeDOS:$label:chain" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/10qnx b/ogclient/lib/os-probes/mounted/10qnx new file mode 100755 index 0000000..8d40398 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/10qnx @@ -0,0 +1,21 @@ +#!/bin/sh + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# Weed out stuff that doesn't apply to us +case "$type" in + qnx4) debug "$partition is a QNX4 partition" ;; + *) debug "$partition is not a QNX4 partition: exiting"; exit 1 ;; +esac + +if [ -e "$mpoint/.boot" ]; then + label="$(count_next_label QNX)" + result "$partition:QNX:$label:chain" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/20macosx b/ogclient/lib/os-probes/mounted/20macosx new file mode 100755 index 0000000..dd4207f --- /dev/null +++ b/ogclient/lib/os-probes/mounted/20macosx @@ -0,0 +1,30 @@ +#!/bin/sh -e +# Detects Mac OS X. I don't yet know how Mac OS <= 9 fits into this. +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +debug() { + logger -t macosx-prober "debug: $@" +} + +# Weed out stuff that doesn't apply to us +case "$type" in + hfsplus) debug "$1 is an HFS+ partition" ;; + *) debug "$1 is not an HFS+ partition: exiting"; exit 1 ;; +esac + +# Could use a better test than this. +# /System/Library/CoreServices/SystemVersion.plist has version information, +# but I don't think it exists on Mac OS <= 9, and it's XML so parsing in +# shell will be nasty. + +if [ -e "$2/mach_kernel" ]; then + label="$(count_next_label MacOSX)" + result "$1:Mac OS X:$label:macosx" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/20microsoft b/ogclient/lib/os-probes/mounted/20microsoft new file mode 100755 index 0000000..65b38bf --- /dev/null +++ b/ogclient/lib/os-probes/mounted/20microsoft @@ -0,0 +1,140 @@ +#!/bin/sh +# Detects all Microsoft OSes on a collection of partitions. + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# This script looks for legacy BIOS bootloaders only. Skip if running UEFI +if [ -d /sys/firmware/efi ] && [ ! -f /var/lib/partman/ignore_uefi ] && [ -z "$WINOSDATA" ]; then + debug "Skipping legacy bootloaders on UEFI system" + exit 1 +fi + +# Weed out stuff that doesn't apply to us +case "$type" in + ntfs|ntfs-3g) debug "$1 is a NTFS partition" ;; + vfat) debug "$1 is a FAT32 partition" ;; + msdos) debug "$1 is a FAT16 partition" ;; + fat) debug "$1 is a FAT partition (mounted by GRUB)" ;; + fuse|fuseblk) debug "$1 is a FUSE partition" ;; # might be ntfs-3g + *) debug "$1 is not a MS partition: exiting"; exit 1 ;; +esac + +found= +# Vista (previously Longhorn) +if item_in_dir -q bootmgr "$2"; then + # there might be different boot directories in different case as: + # boot Boot BOOT + for boot in $(item_in_dir boot "$2"); do + bcd=$(item_in_dir bcd "$2/$boot") + if [ -n "$bcd" ]; then + if grep -aqs "W.i.n.d.o.w.s. .1.0" "$2/$boot/$bcd"; then + long="Windows 10 (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .8" "$2/$boot/$bcd"; then + long="Windows 8 (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .7" "$2/$boot/$bcd"; then + long="Windows 7 (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .V.i.s.t.a" "$2/$boot/$bcd"; then + long="Windows Vista (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .S.e.r.v.e.r. .2.0.0.8. .R.2." "$2/$boot/$bcd"; then + long="Windows Server 2008 R2 (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .S.e.r.v.e.r. .2.0.0.8." "$2/$boot/$bcd"; then + long="Windows Server 2008 (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .R.e.c.o.v.e.r.y. .E.n.v.i.r.o.n.m.e.n.t" "$2/$boot/$bcd"; then + long="Windows Recovery Environment (loader)" + elif grep -aqs "W.i.n.d.o.w.s. .S.e.t.u.p" "$2/$boot/$bcd"; then + long="Windows Recovery Environment (loader)" + else + long="Windows Vista (loader)" + fi + short=Windows + + found=true + + break + fi + done +fi + +# 2000/XP/NT4.0 +if [ -z "$found" ] && item_in_dir -q ntldr "$2" && item_in_dir -q ntdetect.com "$2"; then + long="Windows NT/2000/XP" + short=Windows + ini=$(item_in_dir boot.ini "$2") + if [ -n "$ini" ]; then + multicount="$(grep -e "^multi" "$2/$ini" | wc -l)" + scsicount="$(grep -e "^scsi" "$2/$ini" | wc -l)" + msoscount="$(expr "${multicount}" + "${scsicount}")" + if [ "$msoscount" -eq 1 ]; then + # We need to remove a Carriage Return at the end of + # the line... + defaultmspart="$(grep -e "^default=" "$2/$ini" | cut -d '=' -f2 | tr -d '\r')" + # Escape any backslashes in defaultmspart + grepexp="^$(echo "$defaultmspart" | sed -e 's/\\/\\\\/')=" + # Colons not allowed; replace by spaces + # Accented characters (non UTF-8) cause debconf to + # hang, so we fall back to the default if the name + # contains any weird characters. + long="$(grep -e "$grepexp" "$2/$ini" | cut -d '"' -f2 | \ + tr ':' ' ' | LC_ALL=C grep -v '[^a-zA-Z0-9 &()/_-]')" + if [ -z "$long" ]; then + long="Windows NT/2000/XP" + fi + else + long="Windows NT/2000/XP (loader)" + fi + + found=true + fi +fi + +# MS-DOS +if [ -z "$found" ] && item_in_dir -q dos "$2"; then + long="MS-DOS 5.x/6.x/Win3.1" + short=MS-DOS + + found=true +fi + +# 95/98/Me +if [ -z "$found" ] && item_in_dir -q windows "$2" && + item_in_dir -q win.com "$2"/"$(item_in_dir windows "$2")"; then + long="Windows 95/98/Me" + short=Windows9xMe + + found=true +fi + + +# Restrict to partitions containing the OS +if [ -n "$WINOSDATA" ]; then + found= + if [ -d "$2/ProgramData/Microsoft/Windows/Start Menu/Programs/StartUp" ]; then + long=${long:-"Windows 8 (data)"} + short=${short:-"Windows"} + found=true + elif [ -d "$2/ProgramData/Microsoft/Windows/Start Menu/Programs/Startup" ]; then + long=${long:-"Windows 7 (data)"} + short=${short:-"Windows"} + found=true + elif [ -d "$2/Documents and Settings/All Users/Start Menu/Programs/Startup" ]; then + long=${long:-"Windows XP/Vista (data)"} + short=${short:-"Windows"} + found=true + elif [ -d "$2/Winnt/Profiles/All Users/Start Menu/Programs/Startup" ]; then + long=${long:-"Windows NT (data)"} + short=${short:-"Windows"} + found=true + fi +fi + +if [ -z "$found" ]; then + exit 1 +fi + +label="$(count_next_label "$short")" +result "${partition}:${long}:${label}:chain" +exit 0 diff --git a/ogclient/lib/os-probes/mounted/30utility b/ogclient/lib/os-probes/mounted/30utility new file mode 100755 index 0000000..af48d30 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/30utility @@ -0,0 +1,33 @@ +#!/bin/sh +# Detects utility (hw vendor recovery) partitions. + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# Weed out stuff that doesn't apply to us +case "$type" in + vfat) debug "$1 is a FAT32 partition" ;; + msdos) debug "$1 is a FAT16 partition" ;; + fat) debug "$1 is a FAT partition (mounted by GRUB)" ;; + *) debug "$1 is not a FAT partition: exiting"; exit 1 ;; +esac + +# Dell Utility partitions have partition type 0xde, but no idea how to +# cleanly detect that from shell +if item_in_dir -q dellbio.bin "$2" && \ + (item_in_dir -q delldiag.exe "$2" || item_in_dir -q delldiag.com "$2"); then + long="Dell Utility Partition" + short=DellUtility +elif item_in_dir -q f11.sys "$2"; then + long="Acronis Secure Zone" + short=AcroneZone +else + exit 1 +fi + +label="$(count_next_label "$short")" +result "${partition}:${long}:${label}:chain" +exit 0 diff --git a/ogclient/lib/os-probes/mounted/40lsb b/ogclient/lib/os-probes/mounted/40lsb new file mode 100755 index 0000000..ce8d4e1 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/40lsb @@ -0,0 +1,48 @@ +#!/bin/sh +# Test for LSB systems. +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +lsb_field () { + file="$1" + field="$2" + grep ^"$field" "$file" | cut -d = -f 2 | sed 's/^"//' | sed 's/"$//' | sed 's/:/ /g' +} + +file="$dir/etc/lsb-release" +if [ ! -e "$file" ]; then + exit 1 +fi + +release=$(lsb_field "$file" DISTRIB_RELEASE) +if [ -z "$release" ]; then + release=$(lsb_field "$file" DISTRIB_CODENAME) +fi +description=$(lsb_field "$file" DISTRIB_DESCRIPTION) +if [ -z "$description" ]; then + description=$(lsb_field "$file" DISTRIB_CODENAME) +fi + +if [ -n "$description" ]; then + if [ -n "$release" ]; then + long="$description ($release)" + else + long="$description" + fi +else + exit 1 +fi + +short=$(lsb_field "$file" DISTRIB_ID | sed 's/ //g') +if [ -z "$short" ]; then + short="UnknownLSB" +fi + +label="$(count_next_label "$short")" +result "$partition:$long:$label:linux" +exit 0 diff --git a/ogclient/lib/os-probes/mounted/70hurd b/ogclient/lib/os-probes/mounted/70hurd new file mode 100755 index 0000000..af29ff5 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/70hurd @@ -0,0 +1,16 @@ +#!/bin/sh +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +if [ -d "$dir/servers" ] && [ -d "$dir/hurd" ]; then + label="$(count_next_label Hurd)" + result "$partition:GNU/Hurd:$label:hurd" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/80minix b/ogclient/lib/os-probes/mounted/80minix new file mode 100755 index 0000000..e01f669 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/80minix @@ -0,0 +1,28 @@ +#!/bin/sh +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +# Weed out stuff that doesn't apply to us +case "$type" in + minix|minix2|ext2) ;; + *) exit 1 ;; +esac + +if [ -f "$dir/minix" ] || [ -e "$dir/boot/image_big" ]; then + if [ -e "$dir/boot/image_latest" ]; then + boot="minix" + else + boot="chain" + fi + + label="$(count_next_label Minix)" + result "$partition:Minix:$label:$boot" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/83haiku b/ogclient/lib/os-probes/mounted/83haiku new file mode 100755 index 0000000..6de7a1d --- /dev/null +++ b/ogclient/lib/os-probes/mounted/83haiku @@ -0,0 +1,35 @@ +#!/bin/sh +# Detects Haiku on BeFS partitions. + +. /usr/share/os-prober/common.sh + +partition="$1" +mpoint="$2" +type="$3" + +# Weed out stuff that doesn't apply to us +case "$type" in + befs|befs_be) debug "$partition is a BeFS partition" ;; + *) debug "$partition is not a BeFS partition: exiting"; exit 1 ;; +esac + +if head -c 512 "$partition" | grep -qs "system.haiku_loader"; then + debug "Stage 1 bootloader found" +else + debug "Stage 1 bootloader not found: exiting" + exit 1 +fi + +if system="$(item_in_dir "system" "$mpoint")" && + item_in_dir -q "haiku_loader" "$mpoint/$system" && + (item_in_dir -q "kernel_x86" "$mpoint/$system" || + item_in_dir -q "kernel_x86_64" "$mpoint/$system") +then + debug "Stage 2 bootloader and kernel found" + label="$(count_next_label Haiku)" + result "$partition:Haiku:$label:chain" + exit 0 +else + debug "Stage 2 bootloader and kernel not found: exiting" + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/90linux-distro b/ogclient/lib/os-probes/mounted/90linux-distro new file mode 100755 index 0000000..6678f22 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/90linux-distro @@ -0,0 +1,138 @@ +#!/bin/sh +# Test for linux distributions. +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +# This test is inaccurate, but given separate / and /boot partitions and the +# fact that only some architectures have ld-linux.so, I can't see anything +# better. Make sure this test has a high number so that more accurate tests +# can come first. +# Unless volumes to checked are already mounted, they will be mounted using +# GRUB's own filesystems through FUSE. Since these ATM doesn't support +# symlinks we need to also check in $dir/usr/lib* for distributions that +# moved /lib* to /usr and only left symlinks behind. +# TODO: look for ld-linux.so on arches that have it +if (ls "$dir"/lib*/ld*.so* || ls "$dir"/usr/lib*/ld*.so*) >/dev/null 2>/dev/null; then + if [ -e "$dir/etc/debian_version" ]; then + short="Debian" + long="$(printf "Debian GNU/Linux (%s)\n" "$(cat "$dir/etc/debian_version")")" + # RPM derived distributions may also have a redhat-release or + # mandrake-release, so check their files first. + elif [ -e "$dir/etc/altlinux-release" ]; then + short="ALTLinux" + long="$(cat "$dir/etc/altlinux-release")" + elif [ -e "$dir/etc/magic-release" ]; then + short="Magic" + long="$(cat "$dir/etc/magic-release")" + elif [ -e "$dir/etc/blackPanther-release" ]; then + short="blackPanther" + long="$(cat "$dir/etc/blackPanther-release")" + elif [ -e "$dir/etc/ark-release" ]; then + short="Ark" + long="$(cat "$dir/etc/ark-release")" + elif [ -e "$dir/etc/arch-release" ]; then + short="Arch" + long="$(cat "$dir/etc/arch-release")" + elif [ -e "$dir/etc/asplinux-release" ]; then + short="ASPLinux" + long="$(cat "$dir/etc/asplinux-release")" + elif [ -e "$dir/etc/lvr-release" ]; then + short="LvR" + long="$(cat "$dir/etc/lvr-release")" + elif [ -e "$dir/etc/caos-release" ]; then + short="cAos" + long="$(cat "$dir/etc/caos-release")" + elif [ -e "$dir/etc/aurox-release" ]; then + short="Aurox" + long="$(cat "$dir/etc/aurox-release")" + elif [ -e "$dir/etc/engarde-release" ]; then + short="EnGarde" + long="$(cat "$dir/etc/engarde-release")" + elif [ -e "$dir/etc/vine-release" ]; then + short="Vine" + long="$(cat "$dir/etc/vine-release")" + elif [ -e "$dir/etc/whitebox-release" ]; then + short="WhiteBox" + long="$(cat "$dir/etc/whitebox-release")" + elif [ -e "$dir/etc/pld-release" ]; then + short="PLD" + long="$(cat "$dir/etc/pld-release")" + elif [ -e "$dir/etc/startcom-release" ]; then + short="StartCom" + long="$(cat "$dir/etc/startcom-release")" + elif [ -e "$dir/etc/trustix-release" ]; then + short="Trustix" + long="$(cat "$dir/etc/trustix-release")" + elif [ -e "$dir/etc/openna-release" ]; then + short="OpenNA" + long="$(cat "$dir/etc/openna-release")" + elif [ -e "$dir/etc/conectiva-release" ]; then + short="Conectiva" + long="$(cat "$dir/etc/conectiva-release")" + elif [ -e "$dir/etc/mandrake-release" ]; then + short="Mandrake" + long="$(cat "$dir/etc/mandrake-release")" + elif [ -e "$dir/etc/fedora-release" ]; then + short="Fedora" + long="$(cat "$dir/etc/fedora-release")" + elif [ -e "$dir/etc/redhat-release" ]; then + short="RedHat" + long="$(cat "$dir/etc/redhat-release")" + elif [ -e "$dir/etc/SuSE-release" ]; then + short="SuSE" + long="$(head -n 1 "$dir/etc/SuSE-release")" + elif [ -e "$dir/etc/gentoo-release" ]; then + short="Gentoo" + long="$(cat "$dir/etc/gentoo-release")" + elif [ -e "$dir/etc/cobalt-release" ]; then + short="Cobalt" + long="$(cat "$dir/etc/cobalt-release")" + elif [ -e "$dir/etc/yellowdog-release" ]; then + short="YellowDog" + long="$(cat "$dir/etc/yellowdog-release")" + elif [ -e "$dir/etc/turbolinux-release" ]; then + short="Turbolinux" + long="$(cat "$dir/etc/turbolinux-release")" + elif [ -e "$dir/etc/pardus-release" ]; then + short="Pardus" + long="$(cat "$dir/etc/pardus-release")" + elif [ -e "$dir/etc/kanotix-version" ]; then + short="Kanotix" + long="$(cat "$dir/etc/kanotix-version")" + elif [ -e "$dir/etc/slackware-version" ]; then + short="Slackware" + long="$(printf "Slackware Linux (%s)\n" "$(cat "$dir/etc/slackware-version")")" + elif [ -e "$dir/sbin/pkgtool" ]; then + short="Slackware" + long="Slackware Linux" + elif grep -qs OpenLinux "$dir/etc/issue"; then + short="Caldera" + long="Caldera OpenLinux" + elif [ -e "$dir/etc/frugalware-release" ]; then + short="Frugalware Linux" + long="$(cat "$dir/etc/frugalware-release")" + elif [ -e "$dir/etc/kdemar-release" ]; then + short="K-DEMar" + long="$(printf "K-DEMar GNU/Linux (%s)\n" "$(cat "$dir/etc/kdemar-release")")" + elif [ -e "$dir/etc/lfs-release" ]; then + short="LFS" + long="$(printf "Linux From Scratch (%s)\n" "$(cat "$dir/etc/lfs-release")")" + elif [ -e "$dir/etc/meego-release" ]; then + short="MeeGo" + long="$(head -1 "$dir/etc/meego-release")" + else + short="Linux" + long="unknown Linux distribution" + fi + + label="$(count_next_label "$short")" + result "$partition:$long:$label:linux" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/90solaris b/ogclient/lib/os-probes/mounted/90solaris new file mode 100755 index 0000000..0e9148c --- /dev/null +++ b/ogclient/lib/os-probes/mounted/90solaris @@ -0,0 +1,19 @@ +#!/bin/sh +# Attempt to check if solaris is installed in this system +# looking at the /etc/system parameters file and /etc/vfstab. + +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +if [ -f "$dir/etc/system" ] && [ -f "$dir/etc/vfstab" ]; then + label="$(count_next_label Solaris)" + result "$partition:Solaris/IA32:$label:chain" + exit 0 +else + exit 1 +fi diff --git a/ogclient/lib/os-probes/mounted/efi/10elilo b/ogclient/lib/os-probes/mounted/efi/10elilo new file mode 100755 index 0000000..72dc462 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/efi/10elilo @@ -0,0 +1,24 @@ +#!/bin/sh +# Detects ELILO bootloader on a EFI System Partition + +. /usr/share/os-prober/common.sh + +efi="$1" + +found= + +elilo=`find $1 -name "elilo.efi"` +if [ -n "$elilo" ]; then + bdir=`dirname $elilo` + bdir=`basename $bdir` + long="ELILO Boot Manager" + short="ELILO" + path=${bdir}/elilo.efi + found=true +fi + +if [ -n "$found" ]; then + label="$(count_next_label "$short")" + result "${path}:${long}:${label}" +fi +exit 0 diff --git a/ogclient/lib/os-probes/mounted/efi/20microsoft b/ogclient/lib/os-probes/mounted/efi/20microsoft new file mode 100755 index 0000000..9532081 --- /dev/null +++ b/ogclient/lib/os-probes/mounted/efi/20microsoft @@ -0,0 +1,28 @@ +#!/bin/sh +# Detects Microsoft bootloader on a EFI System Partition + +. /usr/share/os-prober/common.sh + +efi="$1" + +found= +for microsoft in $(item_in_dir microsoft "$efi"); do + for boot in $(item_in_dir boot "$efi/$microsoft"); do + bcd=$(item_in_dir bcd "$efi/$microsoft/$boot") + bootmgfw=$(item_in_dir bootmgfw.efi "$efi/$microsoft/$boot") + if [ -n "$bcd" -a -n "$bootmgfw" ]; then + long="Windows Boot Manager" + short=Windows + path="$microsoft/$boot/$bootmgfw" + found=true + break + fi + done +done + + +if [ -n "$found" ]; then + label="$(count_next_label "$short")" + result "${path}:${long}:${label}" +fi +exit 0 diff --git a/ogclient/lib/os-probes/mounted/efi/31part-x-y b/ogclient/lib/os-probes/mounted/efi/31part-x-y new file mode 100755 index 0000000..349c36d --- /dev/null +++ b/ogclient/lib/os-probes/mounted/efi/31part-x-y @@ -0,0 +1,28 @@ +#!/bin/sh +# OG: Detects Microsoft bootloader on a EFI System Partition in directory Part-xx-yy (#802 #888) + +. /usr/share/os-prober/common.sh + +efi="$1" + +found= +for microsoft in $(item_in_dir Part-..-.. "$efi"); do + for boot in $(item_in_dir boot "$efi/$microsoft"); do + bcd=$(item_in_dir bcd "$efi/$microsoft/$boot") + bootmgfw=$(item_in_dir bootmgfw.efi "$efi/$microsoft/$boot") + if [ -n "$bcd" -a -n "$bootmgfw" ]; then + long="Windows Boot Manager" + short=Windows + path="$microsoft/$boot/$bootmgfw" + found=true + break + fi + done +done + + +if [ -n "$found" ]; then + label="$(count_next_label "$short")" + result "${path}:${long}:${label}" +fi +exit 0 diff --git a/ogclient/lib/pci.ids b/ogclient/lib/pci.ids new file mode 100644 index 0000000..3fa895a --- /dev/null +++ b/ogclient/lib/pci.ids @@ -0,0 +1,17910 @@ +# +# List of PCI ID's +# +# Version: 2009.09.18 +# Date: 2009-09-18 03:15:01 +# +# Maintained by Martin Mares and other volunteers from the +# PCI ID Project at http://pciids.sf.net/. +# +# New data are always welcome, especially if they are accurate. If you have +# anything to contribute, please follow the instructions at the web site. +# +# This file can be distributed under either the GNU General Public License +# (version 2 or higher) or the 3-clause BSD License. +# + +# Vendors, devices and subsystems. Please keep sorted. + +# Syntax: +# vendor vendor_name +# device device_name <-- single tab +# subvendor subdevice subsystem_name <-- two tabs + +0000 Gammagraphx, Inc. (or missing ID) +0010 Allied Telesis, Inc +# This is a relabelled RTL-8139 + 8139 AT-2500TX V3 Ethernet +001a Ascend Communications, Inc. +001c PEAK-System Technik GmbH + 0001 PCAN-PCI CAN-Bus controller +0033 Paradyne corp. +003d Lockheed Martin-Marietta Corp +# Real TJN ID is e159, but they got it wrong several times --mj +0059 Tiger Jet Network Inc. (Wrong ID) +0070 Hauppauge computer works Inc. + 0003 WinTV PVR-250 + 0009 WinTV PVR-150 + 0801 WinTV PVR-150 + 0807 WinTV PVR-150 + 4000 WinTV PVR-350 + 4001 WinTV PVR-250 (v1) + 4009 WinTV PVR-250 + 4800 WinTV PVR-350 + 4801 WinTV PVR-250 MCE + 4803 WinTV PVR-250 + 7444 WinTV HVR-1600 + 7801 WinTV HVR-1800 MCE + 8003 WinTV PVR-150 + 8801 WinTV PVR-150 + c801 WinTV PVR-150 + e807 WinTV PVR-500 MCE (1st tuner) + e817 WinTV PVR-500 MCE (2nd tuner) +0071 Nebula Electronics Ltd. +0095 Silicon Image, Inc. (Wrong ID) + 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD +# Wrong ID used in subsystem ID of the TELES.S0/PCI 2.x ISDN adapter +00a7 Teles AG (Wrong ID) +00f5 BFG Technologies, Inc. +0100 Ncipher Corp Ltd +0123 General Dynamics +# 018a is not LevelOne but there is a board misprogrammed +018a LevelOne + 0106 FPC-0106TX misprogrammed [RTL81xx] +# 021b is not Compaq but there is a board misprogrammed +021b Compaq Computer Corporation + 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking] +0270 Hauppauge computer works Inc. (Wrong ID) +0291 Davicom Semiconductor, Inc. + 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40) +# SpeedStream is Efficient Networks, Inc, a Siemens Company +02ac SpeedStream + 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx] +02e0 XFX Pine Group Inc +0303 Hewlett-Packard Company (Wrong ID) +0315 SK-Electronics Co., Ltd. +0357 TTTech AG + 000a TTP-Monitoring Card V2.0 +036f Trigem Computer Inc. +0403 Future Technology Devices International Ltd +0432 SCM Microsystems, Inc. + 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet] +045e Microsoft + 006e MN-510 802.11b wireless USB paddle + 00c2 MN-710 wireless USB paddle +0482 Kyocera +04cf Myson Century, Inc + 8818 CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY +050d Belkin + 001a FSD7000 802.11g PCI Wireless card + 700f F5D7001 - Wireless G Plus Desktop Card + 7050 F5D7050 802.11g Wireless USB Adapter + 705c F5D7050 v4 +058f Alcor Micro Corporation +05a9 OmniVision + 8519 OV519 series +05e3 CyberDoor + 0701 CBD516 +066f Sigmatel Inc. + 3410 SMTP3410 + 3500 SMTP3500 +0675 Dynalink + 1700 IS64PH ISDN Adapter + 1702 IS64PH ISDN Adapter + 1703 ISDN Adapter (PCI Bus, DV, W) + 1704 ISDN Adapter (PCI Bus, D, C) +069d Hughes Network Systems (HNS) +0721 Sapphire, Inc. +0795 Wired Inc. + 6663 Butane II (MPEG2 encoder board) + 6666 MediaPress (MPEG2 encoder board) +07ca AVerMedia Technologies Inc. + a301 AVerTV 301 + b808 AVerTV DVB-T Volar (USB 2.0) +07d0 ITT Space Systems Division +07e2 ELMEG Communication Systems GmbH +0842 NPG, Personal Grand Technology +# Nee Gemplus International, SA +08e6 Gemalto NV +08ff AuthenTec + afe4 [Anchor] AF-S2 FingerLoc Sensor Module +0925 First International Computer, Inc. + 1234 VA-502 Mainboard +093a PixArt Imaging Inc. + 010e Innovage Mini Digital Camera + 010f SDC-300 Webcam + 020f Digital Photo Viewer + 2468 CIF Single Chip + 2600 PAC7311 + 2603 Philips Webcam SPC500NC + 2608 Maxell MaxCam RotaWeb +09c1 Arris + 0704 CM 200E Cable Modem +0a89 BREA Technologies Inc +0ace ZyDAS + 1211 ZD1211 IEEE 802.11b+g USB Adapter +0b0b Rhino Equipment Corp. + 0105 Rhino R1T1 + 0205 Rhino R4FXO + 0206 RCB4FXO 4-channel FXO analog telphony card + 0305 Rhino R4T1 + 0405 Rhino R8FXX + 0406 RCB8FXX 8-channel modular analog telphony card + 0505 Rhino R24FXX + 0506 RCB24FXS 24-Channel FXS analog telphony card + 0605 Rhino R2T1 + 0705 Rhino R24FXS + 0706 RCB24FXO 24-Channel FXO analog telphony card + 0905 R1T3 Single T3 Digital Telephony Card + 0906 RCB24FXX 24-channel modular analog telphony card + 0a06 RCB672FXX 672-channel modular analog telphony card +0b3d Brontes Technologies +0b49 ASCII Corporation + 064f Trance Vibrator +0ccd TerraTec Electronic GmbH + 0038 Cinergy T^2 DVB-T Receiver +0e11 Compaq Computer Corporation + 0001 PCI to EISA Bridge + 0002 PCI to ISA Bridge + 0046 Smart Array 64xx + 0e11 4091 Smart Array 6i + 0e11 409a Smart Array 641 + 0e11 409b Smart Array 642 + 0e11 409c Smart Array 6400 + 0e11 409d Smart Array 6400 EM + 0049 NC7132 Gigabit Upgrade Module + 004a NC6136 Gigabit Server Adapter + 005a Remote Insight II board - Lights-Out + 007c NC7770 1000BaseTX + 007d NC6770 1000BaseTX + 0085 NC7780 1000BaseTX + 00b1 Remote Insight II board - PCI device + 00bb NC7760 + 00ca NC7771 + 00cb NC7781 + 00cf NC7772 + 00d0 NC7782 + 00d1 NC7783 + 00e3 NC7761 + 0508 Netelligent 4/16 Token Ring + 1000 Triflex/Pentium Bridge, Model 1000 + 2000 Triflex/Pentium Bridge, Model 2000 + 3032 QVision 1280/p + 3033 QVision 1280/p + 3034 QVision 1280/p + 4000 4000 [Triflex] + 4040 Integrated Array + 4048 Compaq Raid LC2 + 4050 Smart Array 4200 + 4051 Smart Array 4250ES + 4058 Smart Array 431 + 4070 Smart Array 5300 + 4080 Smart Array 5i + 4082 Smart Array 532 + 4083 Smart Array 5312 + 4091 Smart Array 6i + 409a Smart Array 641 + 409b Smart Array 642 + 409c Smart Array 6400 + 409d Smart Array 6400 EM + 6010 HotPlug PCI Bridge 6010 + 7020 USB Controller + a0ec Fibre Channel Host Controller + a0f0 Advanced System Management Controller + a0f3 Triflex PCI to ISA Bridge + a0f7 PCI Hotplug Controller + 8086 002a PCI Hotplug Controller A + 8086 002b PCI Hotplug Controller B + a0f8 ZFMicro Chipset USB + a0fc FibreChannel HBA Tachyon + ae10 Smart-2/P RAID Controller + 0e11 4030 Smart-2/P Array Controller + 0e11 4031 Smart-2SL Array Controller + 0e11 4032 Smart Array 3200 Controller + 0e11 4033 Smart Array 3100ES Controller + 0e11 4034 Smart Array 221 Controller + ae29 MIS-L + ae2a MPC + ae2b MIS-E + ae31 System Management Controller + ae32 Netelligent 10/100 TX PCI UTP + ae33 Triflex Dual EIDE Controller + ae34 Netelligent 10 T PCI UTP + ae35 Integrated NetFlex-3/P + ae40 Netelligent Dual 10/100 TX PCI UTP + ae43 Netelligent Integrated 10/100 TX UTP + ae69 CETUS-L + ae6c Northstar + ae6d NorthStar CPU to PCI Bridge + b011 Netelligent 10/100 TX Embedded UTP + b012 Netelligent 10 T/2 PCI UTP/Coax + b01e NC3120 Fast Ethernet NIC + b01f NC3122 Fast Ethernet NIC + b02f NC1120 Ethernet NIC + b030 Netelligent 10/100 TX UTP + b04a 10/100 TX PCI Intel WOL UTP Controller + b060 Smart Array 5300 Controller + b0c6 NC3161 Fast Ethernet NIC + b0c7 NC3160 Fast Ethernet NIC + b0d7 NC3121 Fast Ethernet NIC + b0dd NC3131 Fast Ethernet NIC + b0de NC3132 Fast Ethernet Module + b0df NC6132 Gigabit Module + b0e0 NC6133 Gigabit Module + b0e1 NC3133 Fast Ethernet Module + b123 NC6134 Gigabit NIC + b134 NC3163 Fast Ethernet NIC + b13c NC3162 Fast Ethernet NIC + b144 NC3123 Fast Ethernet NIC + b163 NC3134 Fast Ethernet NIC + b164 NC3165 Fast Ethernet Upgrade Module + b178 Smart Array 5i/532 + 0e11 4080 Smart Array 5i + 0e11 4082 Smart Array 532 + 0e11 4083 Smart Array 5312 + b1a4 NC7131 Gigabit Server Adapter + b200 Memory Hot-Plug Controller + b203 Integrated Lights Out Controller + b204 Integrated Lights Out Processor + c000 Remote Insight Lights-Out Edition + f130 NetFlex-3/P ThunderLAN 1.0 + f150 NetFlex-3/P ThunderLAN 2.3 +0e21 Cowon Systems, Inc. +0e55 HaSoTec GmbH +0eac SHF Communication Technologies AG + 0008 Ethernet Powerlink Managing Node 01 +0f62 Acrox Technologies Co., Ltd. +# Formerly NCR +1000 LSI Logic / Symbios Logic + 0001 53c810 + 1000 1000 LSI53C810AE PCI to SCSI I/O Processor + 0002 53c820 + 0003 53c825 + 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide) + 0004 53c815 + 0005 53c810AP + 0006 53c860 + 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor + 000a 53c1510 + 0e11 b143 Integrated Dual Channel Wide Ultra2 SCSI Controller + 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode) + 000b 53C896/897 + 0e11 6004 EOB003 Series SCSI host adapter + 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller + 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter + 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter + 13e9 1000 6221L-4U (Dual U2W SCSI, dual 10/100TX, graphics) + 000c 53c895 + 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter + 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter + 1de1 3906 DC-390U2B SCSI adapter + 1de1 3907 DC-390U2W + 000d 53c885 + 000f 53c875 + 0e11 7004 Embedded Ultra Wide SCSI Controller + 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller + 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter + 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter + 1092 8760 FirePort 40 Dual SCSI Controller + 1775 10d0 V5D Single Board Computer Wide Ultra SCSI + 1775 10d1 V5D Single Board Computer Ultra SCSI + 1de1 3904 DC390F/U Ultra Wide SCSI Adapter + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1050 CT7 mainboard + 0010 53C1510 + 0e11 4040 Integrated Smart Array Controller + 0e11 4048 RAID LC2 Controller + 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode) + 0012 53c895a + 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller + 0013 53c875a + 1000 1000 LSI53C875A PCI to Ultra SCSI Controller + 0020 53c1010 Ultra3 SCSI Adapter + 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller + 107b 1040 Server Onboard 53C1010-33 + 1de1 1020 DC-390U3W + 0021 53c1010 66MHz Ultra3 SCSI Adapter + 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller + 1000 1010 Asus TR-DLS onboard 53C1010-66 + 103c 1300 Ultra160 SCSI [AB306A] + 103c 1310 Ultra160 SCSI [A9918A] + 103c 1330 Ultra160 SCSI [A7059A] + 103c 1340 Ultra160 SCSI [A7060A] + 124b 1070 PMC-USCSI3 + 4c53 1080 CT8 mainboard + 4c53 1300 P017 mezzanine (32-bit PMC) + 4c53 1310 P017 mezzanine (64-bit PMC) + 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI + 0e11 00da ProLiant ML 350 + 1028 0123 LSI Logic 1020/1030 + 1028 014a LSI Logic 1020/1030 + 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4) + 1028 0183 LSI Logic 1020/1030 + 1028 018a PERC 4/IM + 1028 1010 LSI U320 SCSI Controller + 103c 12c5 Ultra320 SCSI [A7173A] + 103c 1323 Core I/O LAN/SCSI Combo [AB314A] + 103c 3108 Single Channel Ultra320 SCSI HBA G2 + 124b 1170 PMC-USCSI320 +# VMware's emulation of this device. Was missing from the list. + 15ad 1976 LSI Logic Parallel SCSI Controller + 1734 1052 PRIMERGY BX/RX/TX S2 series onboard SCSI(IME) + 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI + 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller + 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 1000 0033 MegaRAID SCSI 320-2XR + 1000 0066 MegaRAID SCSI 320-2XRWS + 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI + 0050 SAS1064 PCI-X Fusion-MPT SAS + 1028 1f04 SAS 5/E + 1028 1f09 SAS 5i/R + 0054 SAS1068 PCI-X Fusion-MPT SAS + 1028 1f04 SAS 5/E Adapter Controller + 1028 1f05 SAS 5/i Adapter Controller + 1028 1f06 SAS 5/i Integrated Controller + 1028 1f07 SAS 5/iR Integrated RAID Controller + 1028 1f08 SAS 5/iR Integrated RAID Controller + 1028 1f09 SAS 5/iR Adapter RAID Controller + 15ad 1976 SAS Controller + 0055 SAS1068 PCI-X Fusion-MPT SAS + 1033 8336 SAS1068 + 0056 SAS1064ET PCI-Express Fusion-MPT SAS + 0057 M1064E MegaRAID SAS + 8086 346c Embedded Software RAID Technology II (ESTRII) + 0058 SAS1068E PCI-Express Fusion-MPT SAS + 1028 021d SAS 6/iR Integrated Workstations RAID Controller + 1028 1f0e SAS 6/iR Adapter RAID Controller + 1028 1f0f SAS 6/iR Integrated Blades RAID Controller + 1028 1f10 SAS 6/iR Integrated RAID Controller + 103c 3229 SC44Ge Host Bus Adapter + 0059 MegaRAID SAS 8208ELP/8208ELP + 005a SAS1066E PCI-Express Fusion-MPT SAS + 005c SAS1064A PCI-X Fusion-MPT SAS + 005e SAS1066 PCI-X Fusion-MPT SAS + 0060 MegaRAID SAS 1078 + 1000 1006 MegaRAID SAS 8888ELP + 1000 100a MegaRAID SAS 8708ELP + 1000 100e MegaRAID SAS 8884E + 1000 100f MegaRAID SAS 8708E + 1000 1010 MegaRAID SATA 350-8ELP + 1000 1011 MegaRAID SATA 350-4ELP + 1000 1012 MegaRAID SAS 8704ELP + 1000 1016 MegaRAID SAS 8880EM2 + 1014 0363 MegaRAID SAS PCI Express ROMB + 1014 0364 SystemX MegaRAID SAS 8808E + 1014 0365 SystemX MegaRAID SAS 8884E + 1014 0379 SystemX MegaRAID SAS 8880EM2 + 1028 1f0a PERC 6/E Adapter RAID Controller + 1028 1f0b PERC 6/i Adapter RAID Controller + 1028 1f0c PERC 6/i Integrated RAID Controller + 1028 1f0d PERC 6/i Integrated RAID Controller + 1028 1f11 CERC 6/i Integrated RAID Controller + 1033 835a MegaRAID SAS PCI Express ROMB + 1043 824d MegaRAID SAS PCI Express ROMB + 1170 002f MegaRAID SAS PCI Express ROMB + 1170 0036 MegaRAID SAS PCI Express ROMB + 15d9 c080 MegaRAID SAS PCI Express ROMB + 17aa 6b7c MegaRAID SAS PCI Express ROMB + 18a1 0003 LSI MegaRAID SAS PCI Express ROMB + 8086 1006 RAID Controller SRCSAS28EP + 8086 100a RAID Controller SRCSAS28EV + 8086 1010 RAID Controller SRCSATA28E + 8086 34cc Integrated RAID Controller SROMBSAS28E + 8086 34cd Integrated RAID Controller SROMBSAS28E + 0062 SAS1078 PCI-Express Fusion-MPT SAS + 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS + 0064 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] + 0065 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] + 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire] + 0072 SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] + 1028 1f1c 6Gbps SAS HBA Adapter + 1028 1f1d PERC H200 Adapter + 1028 1f1e PERC H200 Integrated + 1028 1f1f PERC H200 Modular + 0073 MegaRAID SAS 9240 + 1000 9240 MegaRAID SAS 9240-4i + 0074 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0076 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0077 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0079 LSI MegaSAS 9260 + 1000 9262 MegaRAID SAS 9262-8i + 1000 9263 MegaRAID SAS 9261-8i + 1000 9281 MegaRAID SAS 9281-8E + 1028 1f15 PERC H800 Adapter + 1028 1f16 PERC H700 Adapter + 1028 1f17 PERC H700 Integrated + 1028 1f18 PERC H700 Modular + 1028 1f1a PERC H800 Proto Adapter + 1028 1f1b PERC H700 Integrated + 007c MegaRAID SAS 1078DE + 1014 0395 ServeRAID-AR10is SAS/SATA Controller + 0080 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0081 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0082 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0083 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0084 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0085 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0086 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0087 SAS2208 PCI-Express Fusion-MPT SAS-2 + 008f 53c875J + 1092 8000 FirePort 40 SCSI Controller + 1092 8760 FirePort 40 Dual SCSI Host Adapter + 0407 MegaRAID + 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller + 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller + 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller + 1028 0531 PowerEdge Expandable RAID Controller 4/QC + 1028 0533 PowerEdge Expandable RAID Controller 4/QC + 8086 0530 MegaRAID Intel RAID Controller SRCZCRX + 8086 0532 MegaRAID Intel RAID Controller SRCU42X + 0408 MegaRAID + 1000 0001 MegaRAID SCSI 320-1E RAID Controller + 1000 0002 MegaRAID SCSI 320-2E RAID Controller + 1025 004d MegaRAID ACER ROMB-2E RAID Controller + 1028 0001 PowerEdge RAID Controller PERC4e/SC + 1028 0002 PowerEdge RAID Controller PERC4e/DC + 1028 0012 PowerEdge RAID Controller RAC4 + 1028 0015 PowerEdge RAID Controller PERC5 + 1028 1f03 PowerEdge RAID Controller PERC5 + 1734 1065 FSC MegaRAID PCI Express ROMB + 8086 0002 MegaRAID Intel RAID Controller SRCU42E + 8086 3449 MegaRAID Intel RAID Controller SROMBU + 0409 MegaRAID + 1000 3004 MegaRAID SATA 300-4X RAID Controller + 1000 3008 MegaRAID SATA 300-8X RAID Controller + 8086 3008 MegaRAID RAID Controller SRCS28X + 8086 3431 MegaRAID RAID Controller Alief SROMBU42E + 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E + 0411 MegaRAID SAS + 1000 1001 MegaRAID SAS 8408E + 1000 1002 MegaRAID SAS 8480E + 1000 1003 MegaRAID SAS 8344ELP + 1000 1004 MegaRAID SAS 8308ELP + 1000 1008 MegaRAID SAS 84016E + 1000 100c MegaRAID SATA 300-12E + 1000 100d MegaRAID SATA 300-16E + 1000 2004 MegaRAID SATA 300-8ELP + 1000 2005 MegaRAID SATA 300-4ELP + 1033 8287 MegaRAID SAS PCI Express ROMB + 1054 3016 MegaRAID SAS RoMB Server + 1734 1081 MegaRAID SAS PCI Express ROMB + 1734 10a3 MegaRAID SAS PCI Express ROMB + 8086 1001 RAID Controller SRCSAS18E + 8086 1003 RAID Controller SRCSAS144E + 8086 3500 SROMBSAS18E RAID Controller + 8086 3501 SROMBSAS18E RAID Controller + 8086 3504 SROMBSAS18E RAID Controller + 0413 MegaRAID SAS Verde ZCR + 1000 1005 MegaRAID SAS 8300XLP + 0621 FC909 Fibre Channel Adapter + 0622 FC929 Fibre Channel Adapter + 1000 1020 44929 O Dual Fibre Channel card + 0623 FC929 LAN + 0624 FC919 Fibre Channel Adapter + 0625 FC919 LAN + 0626 FC929X Fibre Channel Adapter + 1000 1010 7202-XP-LC Dual Fibre Channel card + 0627 FC929X LAN + 0628 FC919X Fibre Channel Adapter + 0629 FC919X LAN + 0640 FC949X Fibre Channel Adapter + 0642 FC939X Fibre Channel Adapter + 0646 FC949ES Fibre Channel Adapter + 0701 83C885 NT50 DigitalScape Fast Ethernet + 0702 Yellowfin G-NIC gigabit ethernet + 1318 0000 PEI100X + 0804 SA2010 + 0805 SA2010ZC + 0806 SA2020 + 0807 SA2020ZC + 0901 61C102 + 1000 63C815 + 1960 MegaRAID + 1000 0518 MegaRAID 518 SCSI 320-2 Controller + 1000 0520 MegaRAID 520 SCSI 320-1 Controller + 1000 0522 MegaRAID 522 i4 133 RAID Controller + 1000 0523 MegaRAID SATA 150-6 RAID Controller + 1000 4523 MegaRAID SATA 150-4 RAID Controller + 1000 a520 MegaRAID ZCR SCSI 320-0 Controller + 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller + 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller + 1028 0531 PowerEdge Expandable RAID Controller 4/QC + 1028 0533 PowerEdge Expandable RAID Controller 4/QC + 8086 0520 MegaRAIDRAID Controller SRCU41L + 8086 0523 MegaRAID RAID Controller SRCS16 +1001 Kolter Electronic + 0010 PCI 1616 Measurement card with 32 digital I/O lines + 0011 OPTO-PCI Opto-Isolated digital I/O board + 0012 PCI-AD/DA Analogue I/O board + 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs + 0014 PCI-Counter/Timer Counter Timer board + 0015 PCI-DAC416 Analogue output board + 0016 PCI-MFB Analogue I/O board + 0017 PROTO-3 PCI Prototyping board + 9100 INI-9100/9100W SCSI Host +1002 ATI Technologies Inc + 3150 M24 1P [Radeon Mobility X600] + 103c 0934 nx8220 + 3151 M24 [FireMV 2400] + 3152 M22 [Radeon Mobility X300] + 3154 M24GL [Mobility FireGL V3200] + 3171 M24 [FireMV 2400] (Secondary) + 3e50 RV380 0x3e50 [Radeon X600] + 3e54 RV380 0x3e54 [FireGL V3200] + 3e70 RV380 [Radeon X600] (Secondary) + 4136 Radeon IGP 320 M + 4137 Radeon IGP330/340/350 + 4144 R300 AD [Radeon 9500 Pro] + 4145 R300 AE [Radeon 9700 Pro] + 4146 R300 AF [Radeon 9700 Pro] + 4147 R300 AG [FireGL Z1/X1] + 4148 R350 AH [Radeon 9800] + 4149 R350 AI [Radeon 9800] + 414a R350 AJ [Radeon 9800] + 414b R350 AK [FireGL X2] + 4150 RV350 AP [Radeon 9600] + 1002 0002 R9600 Pro primary (Asus OEM for HP) + 1002 0003 R9600 Pro secondary (Asus OEM for HP) + 1002 4722 All-in-Wonder 2006 AGP Edition + 1458 4024 Giga-Byte GV-R96128D (Primary) + 148c 2064 PowerColor R96A-C3N + 148c 2066 PowerColor R96A-C3N + 174b 7c19 Sapphire Atlantis Radeon 9600 Pro + 174b 7c29 GC-R9600PRO [Sapphire] (Primary) + 17ee 2002 Radeon 9600 256Mb Primary + 18bc 0101 GC-R9600PRO (Primary) + 4151 RV350 AQ [Radeon 9600] + 1043 c004 A9600SE + 4152 RV350 AR [Radeon 9600] + 1002 0002 Radeon 9600XT + 1002 4772 All-in-Wonder 9600 XT + 1043 c002 Radeon 9600 XT TVD + 1043 c01a A9600XT/TD + 174b 7c29 Sapphire Radeon 9600XT + 1787 4002 Radeon 9600 XT + 4153 RV350 AS [Radeon 9550] + 1043 010c A9550GE/TD + 1462 932c RX9550SE-TD128 (MS-8932) + 4154 RV350 AT [FireGL T2] + 4155 RV350 AU [FireGL T2] + 4156 RV350 AV [FireGL T2] + 4157 RV350 AW [FireGL T2] + 4158 68800AX [Mach32] + 4164 R300 AD [Radeon 9500 Pro] (Secondary) + 4165 R300 AE [Radeon 9700 Pro] (Secondary) + 4166 R300 AF [Radeon 9700 Pro] (Secondary) + 4168 Radeon R350 [Radeon 9800] (Secondary) + 4170 RV350 AP [Radeon 9600] (Secondary) + 1002 0003 R9600 Pro secondary (Asus OEM for HP) + 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary) + 1458 4025 Giga-Byte GV-R96128D (Secondary) + 148c 2067 PowerColor R96A-C3N (Secondary) + 174b 7c28 GC-R9600PRO [Sapphire] (Secondary) + 17ee 2003 Radeon 9600 256Mb (Secondary) + 18bc 0100 GC-R9600PRO (Secondary) + 4171 RV350 AQ [Radeon 9600] (Secondary) + 1043 c005 A9600SE (Secondary) + 4172 RV350 AR [Radeon 9600] (Secondary) + 1002 0003 Radeon 9600XT (Secondary) + 1002 4773 All-in-Wonder 9600 XT (Secondary) + 1043 c003 A9600XT (Secondary) + 1043 c01b A9600XT/TD (Secondary) + 174b 7c28 Sapphire Radeon 9600XT (Secondary) + 1787 4003 Radeon 9600 XT (Secondary) + 4173 RV350 AS [Radeon 9550] (Secondary) + 1043 010d A9550GE/TD (Secondary) + 4237 Radeon 7000 IGP + 4242 R200 BB [Radeon All in Wonder 8500DV] + 1002 02aa Radeon 8500 AIW DV Edition + 4243 R200 BC [Radeon All in Wonder 8500] + 4336 Radeon Mobility U1 + 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M) + 103c 0024 Pavilion ze4400 builtin Video + 161f 2029 eMachines M5312 builtin Video + 4337 Radeon IGP 330M/340M/350M + 1014 053a ThinkPad R40e + 103c 0850 Radeon IGP 345M + 4341 IXP150 AC'97 Audio Controller + 4342 IXP200 3COM 3C920B Ethernet Controller + 4345 EHCI USB Controller + 4347 OHCI USB Controller #1 + 4348 OHCI USB Controller #2 + 4349 Dual Channel Bus Master PCI IDE Controller + 434d IXP AC'97 Modem + 4353 SMBus + 4354 215CT [Mach64 CT] + 4358 210888CX [Mach64 CX] + 4361 IXP SB300 AC'97 Audio Controller + 4363 SMBus + 436e 436E Serial ATA Controller + 4370 IXP SB400 AC'97 Audio Controller + 1025 0079 Aspire 5024WLMMi + 1025 0091 Aspire 5032WXMi + 103c 308b MX6125 + 105b 0c81 Realtek ALC 653 + 107b 0300 MX6421 + 1462 0131 MS-1013 Notebook + 4371 IXP SB400 PCI-PCI Bridge + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4372 IXP SB400 SMBus Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 4373 IXP SB400 USB2 Host Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4374 IXP SB400 USB Host Controller + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4375 IXP SB400 USB Host Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4376 IXP SB400 IDE Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 4377 IXP SB400 PCI-ISA Bridge + 1025 0080 Aspire 5024WLMi + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4378 SB400 AC'97 Modem Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 4379 IXP SB400 Serial ATA Controller + 1462 7141 Aspire L250 + 437a IXP SB400 Serial ATA Controller + 1002 4379 4379 Serial ATA Controller + 1002 437a 437A Serial ATA Controller + 1462 7141 Aspire L250 + 14f1 8800 Leadtek WinFast TV2000XP Expert + 437b IXP SB4x0 High Definition Audio Controller + 1002 437b IXP SB4x0 High Definition Audio Controller + 10cf 1326 Fujitsu Lifebook A3040 + 1734 10b8 Realtek High Definition Audio + 4380 SB600 Non-Raid-5 SATA + 103c 2813 DC5750 Microtower + 1458 b005 Gigabyte GA-MA69G-S3H Motherboard + 1462 7327 K9AG Neo2 + 17f2 5999 KI690-AM2 Motherboard + 4381 SB600 Raid-5 SATA + 4382 SB600 AC97 Audio + 4383 SBx00 Azalia (Intel HDA) + 103c 280a DC5750 Microtower + 17f2 5000 KI690-AM2 Motherboard + 4384 SBx00 PCI to PCI Bridge + 4385 SBx00 SMBus Controller + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4386 SB600 USB Controller (EHCI) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4387 SB600 USB (OHCI0) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4388 SB600 USB (OHCI1) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4389 SB600 USB (OHCI2) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438a SB600 USB (OHCI3) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438b SB600 USB (OHCI4) + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438c SB600 IDE + 103c 280a DC5750 Microtower + 1458 5002 Gigabyte GA-MA69G-S3H Motherboard + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438d SB600 PCI to LPC Bridge + 103c 280a DC5750 Microtower + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438e SB600 AC97 Modem + 4390 SB700/SB800 SATA Controller [IDE mode] + 1849 4390 Motherboard (one of many) + 4391 SB700/SB800 SATA Controller [AHCI mode] + 4392 SB700/SB800 SATA Controller [Non-RAID5 mode] + 4393 SB700/SB800 SATA Controller [RAID5 mode] + 4394 SB700/SB800 SATA Controller [SATA and FC Enabled] + 4395 SB800 SATA Controller [Storage mode with HyperFlash-PCIE] + 4396 SB700/SB800 USB EHCI Controller + 4397 SB700/SB800 USB OHCI0 Controller + 4398 SB700 USB OHCI1 Controller + 4399 SB700/SB800 USB OHCI2 Controller + 439c SB700/SB800 IDE Controller + 439d SB700/SB800 LPC host controller + 4437 Radeon Mobility 7000 IGP + 4554 210888ET [Mach64 ET] + 4654 Mach64 VT + 4742 3D Rage Pro AGP 1X/2X + 1002 0040 Rage Pro Turbo AGP 2X + 1002 0044 Rage Pro Turbo AGP 2X + 1002 0061 Rage Pro AIW AGP 2X + 1002 0062 Rage Pro AIW AGP 2X + 1002 0063 Rage Pro AIW AGP 2X + 1002 0080 Rage Pro Turbo AGP 2X + 1002 0084 Rage Pro Turbo AGP 2X + 1002 4742 Rage Pro Turbo AGP 2X + 1002 8001 Rage Pro Turbo AGP 2X + 1028 0082 Rage Pro Turbo AGP 2X + 1028 4082 Optiplex GX1 Onboard Display Adapter + 1028 8082 Rage Pro Turbo AGP 2X + 1028 c082 Rage Pro Turbo AGP 2X + 8086 4152 Xpert 98D AGP 2X + 8086 464a Rage Pro Turbo AGP 2X + 4744 3D Rage Pro AGP 1X + 1002 4744 Rage Pro Turbo AGP + 4747 3D Rage Pro + 4749 3D Rage Pro + 1002 0061 Rage Pro AIW + 1002 0062 Rage Pro AIW + 474c Rage XC + 474d Rage XL AGP 2X + 1002 0004 Xpert 98 RXL AGP 2X + 1002 0008 Xpert 98 RXL AGP 2X + 1002 0080 Rage XL AGP 2X + 1002 0084 Xpert 98 AGP 2X + 1002 474d Rage XL AGP + 1033 806a Rage XL AGP + 474e Rage XC AGP + 1002 474e Rage XC AGP + 474f Rage XL + 1002 0008 Rage XL + 1002 474f Rage XL + 4750 3D Rage Pro 215GP + 1002 0040 Rage Pro Turbo + 1002 0044 Rage Pro Turbo + 1002 0080 Rage Pro Turbo + 1002 0084 Rage Pro Turbo + 1002 4750 Rage Pro Turbo + 4751 3D Rage Pro 215GQ + 4752 Rage XL + 0e11 001e Proliant Rage XL + 1002 0008 Rage XL + 1002 4752 Proliant Rage XL + 1002 8008 Rage XL + 1028 00ce PowerEdge 1400 + 1028 00d1 PowerEdge 2550 + 1028 00d9 PowerEdge 2500 + 1028 0134 PowerEdge 600SC + 1028 014a PowerEdge 1750 + 1028 0165 PowerEdge 750 + 103c 10e1 NetServer Rage XL + 107b 6400 6400 Server + 1734 007a PRIMERGY RX/TX series onboard VGA + 8086 3411 SDS2 Mainboard + 8086 3427 S875WP1-E mainboard + 8086 5744 S845WD1-E mainboard + 4753 Rage XC + 1002 4753 Rage XC + 4754 3D Rage I/II 215GT [Mach64 GT] + 4755 3D Rage II+ 215GTB [Mach64 GTB] + 4756 3D Rage IIC 215IIC [Mach64 GT IIC] + 1002 4756 Rage IIC + 4757 3D Rage IIC AGP + 1002 4757 Rage IIC AGP + 1028 0089 Rage 3D IIC + 1028 008e PowerEdge 1300 onboard video + 1028 4082 Rage 3D IIC + 1028 8082 Rage 3D IIC + 1028 c082 Rage 3D IIC + 4758 210888GX [Mach64 GX] + 4759 3D Rage IIC + 475a 3D Rage IIC AGP + 1002 0084 Rage 3D Pro AGP 2x XPERT 98 + 1002 0087 Rage 3D IIC + 1002 475a Rage IIC AGP + 4964 Radeon RV250 Id [Radeon 9000] + 4965 Radeon RV250 Ie [Radeon 9000] + 4966 Radeon RV250 If [Radeon 9000] + 10f1 0002 RV250 If [Tachyon G9000 PRO] + 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"] + 1509 9a00 RV250 If [Radeon 9000 "AT009"] + 1681 0040 RV250 If [3D prophet 9000] + 174b 7176 RV250 If [Sapphire Radeon 9000 Pro] + 174b 7192 RV250 If [Radeon 9000 "Atlantis"] + 17af 2005 RV250 If [Excalibur Radeon 9000 Pro] + 17af 2006 RV250 If [Excalibur Radeon 9000] + 4967 Radeon RV250 Ig [Radeon 9000] + 496e Radeon RV250 [Radeon 9000] (Secondary) + 4a48 R420 JH [Radeon X800] + 4a49 R420 JI [Radeon X800PRO] + 4a4a R420 JJ [Radeon X800SE] + 4a4b R420 JK [Radeon X800] + 4a4c R420 JL [Radeon X800] + 4a4d R420 JM [FireGL X3] + 4a4e M18 JN [Radeon Mobility 9800] + 4a4f Radeon X800 SE (R420) (AGP) + 4a50 R420 JP [Radeon X800XT] + 4a54 R420 [Radeon X800 VE] + 4a69 R420 [Radeon X800 PRO/GTO] (Secondary) + 4a6a R420 [Radeon X800] (Secondary) + 4a6b R420 [Radeon X800] (Secondary) + 4a70 R420 [X800XT-PE] (Secondary) + 4a74 R420 [Radeon X800 VE] (Secondary) + 4b48 Radeon X850 Consumer (R481) + 4b49 R480 [Radeon X850XT] + 4b4a Radeon X850 SE (R480) (AGP) + 4b4b R480 [Radeon X850Pro] + 4b4c R481 [Radeon X850XT-PE] + 4b69 R480 [Radeon X850XT] (Secondary) + 4b6b R480 [Radeon X850Pro] (Secondary) + 4b6c R481 [Radeon X850XT-PE] (Secondary) + 4c42 3D Rage LT Pro AGP-133 + 0e11 b0e7 Rage LT Pro (Compaq Presario 5240) + 0e11 b0e8 Rage 3D LT Pro + 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750) + 1002 0040 Rage LT Pro AGP 2X + 1002 0044 Rage LT Pro AGP 2X + 1002 4c42 Rage LT Pro AGP 2X + 1002 8001 Rage LT Pro AGP 2X + 1028 0085 Rage 3D LT Pro + 4c44 3D Rage LT Pro AGP-66 + 4c45 Rage Mobility M3 AGP + 4c46 Rage Mobility M3 AGP 2x + 1002 0155 IBM Thinkpad A22p + 1014 0155 IBM Thinkpad A22p + 1028 00b1 Latitude C600 + 4c47 3D Rage LT-G 215LG + 4c49 3D Rage LT Pro + 1002 0004 Rage LT Pro + 1002 0040 Rage LT Pro + 1002 0044 Rage LT Pro + 1002 4c49 Rage LT Pro + 4c4d Rage Mobility P/M AGP 2x + 0e11 b111 Armada M700 + 0e11 b160 Armada E500 + 1002 0084 Xpert 98 AGP 2X (Mobility) + 1014 0154 ThinkPad A20m/A21m + 1028 00aa Latitude CPt + 1028 00bb Latitude CPx + 1179 ff00 Satellite 1715XCDS laptop + 13bd 1019 PC-AR10 + 4c4e Rage Mobility L AGP 2x + 4c50 3D Rage LT Pro + 1002 4c50 Rage LT Pro + 4c51 3D Rage LT Pro + 4c52 Rage Mobility P/M + 1033 8112 Versa Note VXi + 4c53 Rage Mobility L + 4c54 264LT [Mach64 LT] + 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500] + 1014 0517 ThinkPad T30 + 1014 0530 ThinkPad T42 2373-4WU + 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100) + 1028 012a Latitude C640 + 1043 1622 Mobility Radeon M7 (L3C/S) + 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4 + 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7] + 4c59 Radeon Mobility M6 LY + 0e11 b111 Evo N600c + 1014 0235 ThinkPad A30/A30p (2652/2653) + 1014 0239 ThinkPad X22/X23/X24 + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 8140 PCG-Z1SP laptop + 1509 1930 Medion MD9703 + 4c5a Radeon Mobility M6 LZ + 4c64 Radeon RV250 Ld [Radeon Mobility 9000 M9] + 4c65 Radeon RV250 Le [Radeon Mobility 9000 M9] + 4c66 Radeon RV250 [Mobility FireGL 9000] + 1014 054d ThinkPad T41 + 4c67 Radeon RV250 Lg [Radeon Mobility 9000 M9] +# Secondary chip to the Lf + 4c6e Radeon RV250 Ln [Radeon Mobility 9000 M9] (Secondary) + 4d46 Rage Mobility M4 AGP + 4d4c Rage Mobility M4 AGP + 4d52 Theater 550 PRO PCI [ATI TV Wonder 550] + 4d53 Theater 550 PRO PCIe + 4e44 Radeon R300 ND [Radeon 9700 Pro] + 1002 515e Radeon ES1000 + 1002 5965 Radeon ES1000 + 4e45 Radeon R300 NE [Radeon 9500 Pro] + 1002 0002 Radeon R300 NE [Radeon 9500 Pro] + 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] + 4e46 R300 NF [Radeon 9600 TX] + 4e47 Radeon R300 NG [FireGL X1] + 4e48 Radeon R350 [Radeon 9800 Pro] + 4e49 Radeon R350 [Radeon 9800] + 4e4a R360 NJ [Radeon 9800 XT] + 1002 4e4a R360 [Radeon 9800 XT] + 4e4b R350 NK [FireGL X2] + 4e50 RV350 [Mobility Radeon 9600 M10] + 1025 005a TravelMate 290 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 144d c00c P35 notebook + 1462 0311 MSI M510A + 1734 1055 Amilo M1420W + 4e51 M10 NQ [Radeon Mobility 9600] + 4e52 RV350 [Mobility Radeon 9600 M10] + 144d c00c P35 notebook + 4e53 M10 NS [Radeon Mobility 9600] + 4e54 M10 NT [FireGL Mobility T2] + 4e56 M11 NV [FireGL Mobility T2e] + 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary) + 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary) + 1002 0003 Radeon R300 NE [Radeon 9500 Pro] + 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary) + 4e66 RV350 NF [Radeon 9600] (Secondary) + 4e67 Radeon R300 [FireGL X1] (Secondary) + 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary) + 4e69 Radeon R350 [Radeon 9800] (Secondary) + 4e6a RV350 NJ [Radeon 9800 XT] (Secondary) + 1002 4e6a R360 [Radeon 9800 XT] (Secondary) + 1002 4e71 M10 NQ [Radeon Mobility 9600] + 4e71 M10 NQ [Radeon Mobility 9600] (Secondary) + 4f72 RV250 [Radeon 9000 Series] + 4f73 Radeon RV250 [Radeon 9000 Series] (Secondary) + 5041 Rage 128 PA/PRO + 5042 Rage 128 PB/PRO AGP 2x + 5043 Rage 128 PC/PRO AGP 4x + 5044 Rage 128 PD/PRO TMDS + 1002 0028 Rage 128 AIW + 1002 0029 Rage 128 AIW + 5045 Rage 128 PE/PRO AGP 2x TMDS + 5046 Rage 128 PF/PRO AGP 4x TMDS + 1002 0004 Rage Fury Pro + 1002 0008 Rage Fury Pro/Xpert 2000 Pro + 1002 0014 Rage Fury Pro + 1002 0018 Rage Fury Pro/Xpert 2000 Pro + 1002 0028 Rage 128 Pro AIW AGP + 1002 002a Rage 128 Pro AIW AGP + 1002 0048 Rage Fury Pro + 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device) + 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!) + 5047 Rage 128 PG/PRO + 5048 Rage 128 PH/PRO AGP 2x + 5049 Rage 128 PI/PRO AGP 4x + 504a Rage 128 PJ/PRO TMDS + 504b Rage 128 PK/PRO AGP 2x TMDS + 504c Rage 128 PL/PRO AGP 4x TMDS + 504d Rage 128 PM/PRO + 504e Rage 128 PN/PRO AGP 2x + 504f Rage 128 PO/PRO AGP 4x + 5050 Rage 128 PP/PRO TMDS [Xpert 128] + 1002 0008 Xpert 128 + 5051 Rage 128 PQ/PRO AGP 2x TMDS + 5052 Rage 128 PR/PRO AGP 4x TMDS + 5053 Rage 128 PS/PRO + 5054 Rage 128 PT/PRO AGP 2x + 5055 Rage 128 PU/PRO AGP 4x + 5056 Rage 128 PV/PRO TMDS + 5057 Rage 128 PW/PRO AGP 2x TMDS + 5058 Rage 128 PX/PRO AGP 4x TMDS + 5144 Radeon R100 QD [Radeon 7200] + 1002 0008 Radeon 7000/Radeon VE + 1002 0009 Radeon 7000/Radeon + 1002 000a Radeon 7000/Radeon + 1002 001a Radeon 7000/Radeon + 1002 0029 Radeon AIW + 1002 0038 Radeon 7000/Radeon + 1002 0039 Radeon 7000/Radeon + 1002 008a Radeon 7000/Radeon + 1002 00ba Radeon 7000/Radeon + 1002 0139 Radeon 7000/Radeon + 1002 028a Radeon 7000/Radeon + 1002 02aa Radeon AIW + 1002 053a Radeon 7000/Radeon + 5145 Radeon R100 QE + 5146 Radeon R100 QF + 5147 Radeon R100 QG + 5148 Radeon R200 QH [Radeon 8500] + 1002 010a FireGL 8800 64Mb + 1002 0152 FireGL 8800 128Mb + 1002 0162 FireGL 8700 32Mb + 1002 0172 FireGL 8700 64Mb + 5149 Radeon R200 QI + 514a Radeon R200 QJ + 514b Radeon R200 QK + 514c Radeon R200 QL [Radeon 8500 LE] + 1002 003a Radeon R200 QL [Radeon 8500 LE] + 1002 013a Radeon 8500 + 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition] + 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb] + 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE] + 514d Radeon R200 QM [Radeon 9100] + 514e Radeon R200 QN [Radeon 8500LE] + 514f Radeon R200 QO [Radeon 8500LE] + 5154 R200 QT [Radeon 8500] + 5155 R200 QU [Radeon 9100] + 5157 Radeon RV200 QW [Radeon 7500] + 1002 013a Radeon 7500 + 1002 0f2b ALL-IN-WONDER VE PCI + 1002 103a Dell Optiplex GX260 + 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR] + 148c 2024 RV200 QW [Radeon 7500LE Dual Display] + 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition] + 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display] + 174b 7146 RV200 QW [Radeon 7500 LE] + 174b 7147 RV200 QW [Sapphire Radeon 7500LE] + 174b 7161 Radeon RV200 QW [Radeon 7500 LE] + 17af 0202 RV200 QW [Excalibur Radeon 7500LE] + 5158 Radeon RV200 QX [Radeon 7500] + 5159 Radeon RV100 QY [Radeon 7000/VE] + 1002 000a Radeon 7000/Radeon VE + 1002 000b Radeon 7000 + 1002 0038 Radeon 7000/Radeon VE + 1002 003a Radeon 7000/Radeon VE + 1002 00ba Radeon 7000/Radeon VE + 1002 013a Radeon 7000/Radeon VE + 1002 0908 XVR-100 (supplied by Sun) +# The IBM card doubles as an ATI PCI video adapter + 1014 029a Remote Supervisor Adapter II (RSA2) + 1014 02c8 eServer xSeries server mainboard + 1028 016c PowerEdge 1850 Embedded Radeon 7000/VE + 1028 016d PowerEdge 2850 Embedded Radeon 7000-M + 1028 0170 PowerEdge 6850 Embedded Radeon 7000/VE + 1028 019a PowerEdge SC1425 + 103c 1292 Radeon 7000 + 1043 c00a A7000/T/64M + 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series] + 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition] + 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display] + 174b 0280 Radeon RV100 QY [Radeon 7000/VE] + 174b 7112 RV100 QY [Sapphire Radeon VE 7000] + 174b 7c28 Sapphire Radeon VE 7000 DDR + 1787 0202 RV100 QY [Excalibur Radeon 7000] + 17ee 1001 Radeon 7000 64MB DDR + DVI + 515a Radeon RV100 QZ [Radeon 7000/VE] + 515e ES1000 + 1028 01bb PowerEdge 1955 Embedded ATI ES1000 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 1028 01f0 PowerEdge R900 Embedded ATI ES1000 + 1028 0205 PowerEdge 2970 Embedded ATI ES1000 + 1028 020b PowerEdge T605 Embedded ATI ES1000 + 1028 020f PowerEdge R300 Embedded ATI ES1000 + 1028 0210 PowerEdge T300 Embedded ATI ES1000 + 1028 0221 PowerEdge R805 Embedded ATI ES1000 + 1028 0223 PowerEdge R905 Embedded ATI ES1000 + 1028 0225 PowerEdge T105 Embedded ATI ES1000 + 1028 023c PowerEdge R200 Embedded ATI ES1000 + 103c 1304 Integrity iLO2 Advanced KVM VGA [AD307A] + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 S5000PSLSATA Server Board + 515f ES1000 + 5168 Radeon R200 Qh + 5169 Radeon R200 Qi + 516a Radeon R200 Qj + 516b Radeon R200 Qk +# This one is not in ATI documentation, but is in XFree86 source code + 516c Radeon R200 Ql + 5245 Rage 128 RE/SG + 1002 0008 Xpert 128 + 1002 0028 Rage 128 AIW + 1002 0029 Rage 128 AIW + 1002 0068 Rage 128 AIW + 5246 Rage 128 RF/SG AGP + 1002 0004 Magnum/Xpert 128/Xpert 99 + 1002 0008 Magnum/Xpert128/X99/Xpert2000 + 1002 0028 Rage 128 AIW AGP + 1002 0044 Rage Fury/Xpert 128/Xpert 2000 + 1002 0068 Rage 128 AIW AGP + 1002 0448 Rage Fury + 5247 Rage 128 RG + 524b Rage 128 RK/VR + 524c Rage 128 RL/VR AGP + 1002 0008 Xpert 99/Xpert 2000 + 1002 0088 Xpert 99 + 5345 Rage 128 SE/4x + 5346 Rage 128 SF/4x AGP 2x + 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL + 5347 Rage 128 SG/4x AGP 4x + 5348 Rage 128 SH + 534b Rage 128 SK/4x + 534c Rage 128 SL/4x AGP 2x + 534d Rage 128 SM/4x AGP 4x + 1002 0008 Xpert 99/Xpert 2000 + 1002 0018 Xpert 2000 + 534e Rage 128 4x + 5354 Mach 64 VT + 1002 5654 Mach 64 reference + 5446 Rage 128 Pro Ultra TF + 1002 0004 Rage Fury Pro + 1002 0008 Rage Fury Pro/Xpert 2000 Pro + 1002 0018 Rage Fury Pro/Xpert 2000 Pro + 1002 0028 Rage 128 AIW Pro AGP + 1002 0029 Rage 128 AIW + 1002 002a Rage 128 AIW Pro AGP + 1002 002b Rage 128 AIW + 1002 0048 Xpert 2000 Pro + 544c Rage 128 Pro Ultra TL + 5452 Rage 128 Pro Ultra TR + 1002 001c Rage 128 Pro 4XL + 103c 1279 Rage 128 Pro 4XL + 5453 Rage 128 Pro Ultra TS + 5454 Rage 128 Pro Ultra TT + 5455 Rage 128 Pro Ultra TU + 5460 M22 [Mobility Radeon X300] + 1775 1100 CR11/VR11 Single Board Computer + 5461 M22 [Mobility Radeon X300] + 5462 M24 [Radeon Mobility X600] + 5464 M22 [FireGL GL] + 5548 R423 UH [Radeon X800 (PCIE)] + 5549 R423 UI [Radeon X800PRO (PCIE)] + 554a R423 UJ [Radeon X800LE (PCIE)] + 554b R423 UK [Radeon X800SE (PCIE)] + 554c Radeon X800 XTP (R430) (PCIE) + 554d R430 [Radeon X800 XL] (PCIe) + 1458 2124 GV-R80L256V-B (AGP) + 554e Radeon X800 SE (R430) (PCIE) + 554f R430 [Radeon X800 (PCIE)] + 5550 R423 [FireGL V7100] + 5551 R423 [FireGL V5100 (PCIE)] + 5552 R423 UR [FireGL V5100 (PCIE)] + 5554 R423 UT [FireGL V7100 (PCIE)] + 5555 R430 GL PRO + 5569 R423 UI [Radeon X800PRO (PCIE)] (Secondary) + 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary) + 556d R430 [Radeon X800 XL] (PCIe) (Secondary) + 1458 2125 GV-R80L256V-B (AGP) + 556f R430 [Radeon X800] (PCIE) (Secondary) + 5571 R423GL-SE [FireGL V5100 (PCIE)] (Secondary) + 564a M26 [Mobility FireGL V5000] + 564b M26 [Mobility FireGL V5000] + 564f M26 [Radeon Mobility X700 XL (PCIE)] + 5652 M26 [Radeon Mobility X700] + 5653 Radeon Mobility X700 (PCIE) + 1025 0080 Aspire 5024WLMi + 103c 0940 HP Compaq NW8240 Mobile Workstation + 5654 264VT [Mach64 VT] + 1002 5654 Mach64VT Reference + 5655 264VT3 [Mach64 VT3] + 5656 264VT4 [Mach64 VT4] + 5657 Radeon X550/X700 Series (RV410) + 5830 RS300 Host Bridge + 5831 RS300 Host Bridge + 5832 RS300 Host Bridge + 5833 Radeon 9100 IGP Host Bridge + 5834 Radeon 9100 IGP + 5835 RS300M AGP [Radeon Mobility 9100IGP] + 5838 Radeon 9100 IGP AGP Bridge + 5854 Radeon Xpress Series (RS480) + 5874 Radeon Xpress Series (RS482) + 5940 RV280 [Radeon 9200 PRO] (Secondary) + 17af 2021 Excalibur Radeon 9250 (Secondary) + 5941 RV280 [Radeon 9200] (Secondary) + 1458 4019 Gigabyte Radeon 9200 + 174b 7c12 Sapphire Radeon 9200 + 17af 200d Excalibur Radeon 9200 + 18bc 0050 GeXcube GC-R9200-C3 (Secondary) + 5944 RV280 [Radeon 9200 SE (PCI)] + 5950 RS480 Host Bridge + 1025 0080 Aspire 5024WLMMi + 103c 280a DC5750 Microtower + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 5951 Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge + 5952 RD580 [CrossFire Xpress 3200] Chipset Host Bridge + 5954 RS480 [Radeon Xpress 200G Series] + 1002 5954 RV370 [Radeon Xpress 200G Series] + 5955 Radeon XPRESS 200M 5955 (PCIE) + 1002 5955 RS480 0x5955 [Radeon XPRESS 200M 5955 (PCIE)] + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 5956 RD790 Northbridge only dual slot PCI-e_GFX and HT3 K8 part + 5957 RX780/RX790 Chipset Host Bridge + 1849 5957 A770CrossFire Motherboard + 5958 RD780 Northbridge only dual slot PCI-e_GFX and HT1 K8 part + 5960 RV280 [Radeon 9200 PRO] + 17af 2020 Excalibur Radeon 9250 + 5961 RV280 [Radeon 9200] + 1002 2f72 All-in-Wonder 9200 Series + 1019 4c30 Radeon 9200 VIVO + 12ab 5961 YUAN SMARTVGA Radeon 9200 + 1458 4018 Gigabyte Radeon 9200 + 174b 7c13 Sapphire Radeon 9200 + 17af 200c Excalibur Radeon 9200 + 18bc 0050 Radeon 9200 Game Buster + 18bc 0051 GeXcube GC-R9200-C3 + 18bc 0053 Radeon 9200 Game Buster VIVO + 5962 RV280 [Radeon 9200] + 5964 RV280 [Radeon 9200 SE] + 1002 5964 Radeon 9200 SE, 64-bit 128MB DDR, 200/166MHz + 1043 c006 ASUS Radeon 9200 SE / TD / 128M + 1458 4018 Radeon 9200 SE + 1458 4032 Radeon 9200 SE 128MB + 147b 6191 R9200SE-DT + 148c 2073 CN-AG92E + 174b 7c13 Sapphire Radeon 9200 SE + 1787 5964 Excalibur 9200SE VIVO 128M + 17af 2012 Radeon 9200 SE Excalibur + 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster + 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] + 5965 RV280 [FireMV 2200 PCI] + 5969 ES1000 + 5974 RS482 [Radeon Xpress 200] + 103c 280a DC5750 Microtower + 1462 7141 Aspire L250 + 5975 RS482 [Radeon Xpress 200M] + 5978 RD790 PCI to PCI bridge (external gfx0 port A) + 1849 5957 A770CrossFire Motherboard + 5979 RD790 PCI to PCI bridge (external gfx0 port B) + 597a RD790 PCI to PCI bridge (PCI express gpp port A) + 597b RD790 PCI to PCI bridge (PCI express gpp port B) + 597c RD790 PCI to PCI bridge (PCI express gpp port C) + 597d RD790 PCI to PCI bridge (PCI express gpp port D) + 597e RD790 PCI to PCI bridge (PCI express gpp port E) + 1849 5957 A770CrossFire Motherboard + 597f RD790 PCI to PCI bridge (PCI express gpp port F) + 1849 5957 A770CrossFire Motherboard + 5980 RD790 PCI to PCI bridge (external gfx1 port A) + 5981 RD790 PCI to PCI bridge (external gfx1 port B) + 5982 RD790 PCI to PCI bridge (NB-SB link) + 5a10 RD890 Northbridge only dual slot (2x16) PCI-e GFX Hydra part + 5a11 RD890 Northbridge only single slot PCI-e GFX Hydra part + 5a12 RD890 Northbridge only dual slot (2x8) PCI-e GFX Hydra part + 5a13 RD890 PCI to PCI bridge (external gfx0 port A) + 5a14 RD890 PCI to PCI bridge (external gfx0 port B) + 5a15 RD890 PCI to PCI bridge (PCI express gpp port A) + 5a16 RD890 PCI to PCI bridge (PCI express gpp port B) + 5a17 RD890 PCI to PCI bridge (PCI express gpp port C) + 5a18 RD890 PCI to PCI bridge (PCI express gpp port D) + 5a19 RD890 PCI to PCI bridge (PCI express gpp port E) + 5a1a RD890 PCI to PCI bridge (PCI express gpp port F) + 5a1b RD890 PCI to PCI bridge (PCI express gpp port G) + 5a1c RD890 PCI to PCI bridge (PCI express gpp port H) + 5a1d RD890 PCI to PCI bridge (external gfx1 port A) + 5a1e RD890 PCI to PCI bridge (external gfx1 port B) + 5a1f RD890 PCI to PCI bridge (NB-SB link) + 5a33 Radeon Xpress 200 Host Bridge + 5a34 RS480 PCI-X Root Port +# Comes in pair with 5a3f + 5a36 RS480 PCI Bridge + 5a37 RS480 PCI Bridge + 5a38 RS480 PCI Bridge +# Comes in pair with 5a38 + 5a39 RS480 PCI Bridge + 5a3f RS480 PCI Bridge + 1462 7217 Aspire L250 + 5a41 RS400 [Radeon Xpress 200] + 5a42 RS400 [Radeon Xpress 200M] + 5a43 Radeon Xpress Series (RS400) + 5a61 RC410 [Radeon Xpress 200] + 5a62 RC410 [Radeon Xpress 200M] + 5a63 Radeon Xpress Series (RC410) + 5b60 RV370 5B60 [Radeon X300 (PCIE)] + 1043 002a Extreme AX300SE-X + 1043 032e Extreme AX300/TD + 1458 2102 GV-RX30S128D (X300SE) + 1462 0400 RX300SE-TD128E (MS-8940 REV:200) + 1462 0402 RX300SE-TD128E (MS-8940) + 174b 0500 Radeon X300 (PCIE) + 196d 1086 X300SE HM + 5b62 RV380 [Radeon X600 (PCIE)] + 5b63 RV370 [Sapphire X550 Silent] + 5b64 RV370 5B64 [FireGL V3100 (PCIE)] + 5b65 RV370 5B65 [FireGL D1100 (PCIE)] + 5b66 RV370X + 5b70 RV370 [Radeon X300SE] + 1462 0403 RX300SE-TD128E (MS-8940) (secondary display) + 174b 0501 Radeon X300SE + 196d 1087 X300SE HM + 5b72 RV380 [Radeon X600] + 5b73 RV370 secondary [Sapphire X550 Silent] + 5b74 RV370 5B64 [FireGL V3100 (PCIE)] (Secondary) + 5b75 RV370 5B75 [FireGL D1100 (PCIE)] (Secondary) + 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)] + 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)] + 1002 5c63 Apple iBook G4 2004 + 144d c00c P30 notebook + 5d44 RV280 [Radeon 9200 SE] (Secondary) + 1458 4019 Radeon 9200 SE (Secondary) + 1458 4032 Radeon 9200 SE 128MB + 147b 6190 R9200SE-DT (Secondary) + 174b 7c12 Sapphire Radeon 9200 SE (Secondary) + 1787 5965 Excalibur 9200SE VIVO 128M (Secondary) + 17af 2013 Radeon 9200 SE Excalibur (Secondary) + 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary) + 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] + 5d45 RV280 [FireMV 2200 PCI] (secondary) + 5d48 M28 [Radeon Mobility X800XT] + 5d49 M28 [Mobility FireGL V5100] + 5d4a Mobility Radeon X800 + 5d4c Radeon X850 (PCIE) + 5d4d R480 [Radeon X850XT Platinum (PCIE)] + 5d4e Radeon X850 SE (R480) (PCIE) + 5d4f R480 [Radeon X800 GTO (PCIE)] + 5d50 FireGL V7200 (R480) (PCIE) + 5d51 R480 GL 12P + 5d52 R480 [Radeon X850XT (PCIE)] (Primary) + 1002 0b12 PowerColor X850XT PCIe (Primary) + 1002 0b13 PowerColor X850XT PCIe (Secondary) + 5d57 R423 5F57 [Radeon X800XT (PCIE)] + 5d6d R480 [Radeon X850XT Platinum (PCIE)] (Secondary) + 5d6f R480 [Radeon X800 GTO (PCIE)] (Secondary) + 5d72 R480 [Radeon X850XT (PCIE)] (Secondary) + 5d77 R423 5F57 [Radeon X800XT (PCIE)] (Secondary) + 5e48 RV410 [FireGL V5000] + 5e49 RV410 [FireGL V3300] + 5e4a RV410 [Radeon X700XT] + 5e4b RV410 [Radeon X700 Pro (PCIE)] + 5e4c RV410 [Radeon X700SE] + 5e4d RV410 [Radeon X700 (PCIE)] + 148c 2116 PowerColor Bravo X700 + 5e4f RV410 [Radeon X700] + 5e6b RV410 [Radeon X700 Pro (PCIE)] (Secondary) + 5e6d RV410 [Radeon X700 (PCIE)] (Secondary) + 148c 2117 PowerColor Bravo X700 + 5f57 R423 [Radeon X800XT (PCIE)] + 700f PCI Bridge [IGP 320M] + 7010 PCI Bridge [IGP 340M] + 7100 R520 [Radeon X1800] + 7102 M58 [Radeon Mobility X1800] + 7103 M58 [Mobility FireGL V7200] + 7104 R520GL [FireGL V7200] (Primary) + 7105 R520 [FireGL] + 7106 M58 [Mobility FireGL V7100] + 7108 M58 [Radeon Mobility X1800] + 7109 R520 [Radeon X1800] + 1002 0322 All-in-Wonder X1800XL + 1002 0d02 Radeon X1800 CrossFire Edition + 710a R520 [Radeon X1800] + 710b R520 [Radeon X1800] + 710c R520 [Radeon X1800] + 7120 R520 [Radeon X1800] (Secondary) + 7124 R520GL [FireGL V7200] (Secondary) + 7129 R520 [Radeon X1800] (Secondary) + 1002 0323 All-in-Wonder X1800XL (Secondary) + 1002 0d03 Radeon X1800 CrossFire Edition (Secondary) + 7140 RV515 [Radeon X1600] + 7142 RV515 PRO [Radeon X1300/X1550 Series] + 1002 0322 All-in-Wonder 2006 PCI-E Edition + 1043 0142 EAX1300PRO/TD/256M + 7143 RV505 [Radeon X1550 Series] + 7145 Radeon Mobility X1400 + 17aa 2006 Thinkpad T60 model 2007 + 7146 RV515 [Radeon X1300] + 1002 0322 All-in-Wonder 2006 PCI-E Edition + 1545 1996 Radeon X1300 512MB PCI-e + 7147 RV505 [Radeon X1550 64-bit] + 7149 M52 [Mobility Radeon X1300] + 714a M52 [Mobility Radeon X1300] + 714b M52 [Mobility Radeon X1300] + 714c M52 [Mobility Radeon X1300] + 714d RV515 [Radeon X1300] + 714e RV515LE [Radeon X1300] + 7152 RV515GL [FireGL V3300] (Primary) + 7153 RV515GL [FireGL V3350] + 715e RV515 [Radeon X1300] + 715f RV505 CE [Radeon X1550 64-bit] + 7162 RV515 PRO [Radeon X1300/X1550 Series] (Secondary) + 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary) + 7163 RV505 [Radeon X1550 Series] (Secondary) + 7166 RV515 [Radeon X1300] (Secondary) + 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary) + 1545 1997 Radeon X1300 512MB PCI-e (Secondary) + 716e RV515LE [Radeon X1300] Secondary + 7172 RV515GL [FireGL V3300] (Secondary) + 7173 RV515GL [FireGL V3350] (Secondary) + 7180 RV516 [Radeon X1300/X1550 Series] + 7181 RV516 XT Radeon X1600 Series (Primary) + 7183 RV516 [Radeon X1300/X1550 Series] + 7186 RV515 [Radeon Mobility X1450] + 7187 RV516 [Radeon X1300/X1550 Series] + 7188 M64-S [Mobility Radeon X2300] + 103c 30c1 6910p + 718a Mobility Radeon X2300 + 718c M62CSP64 [Mobility Radeon X1350] + 718d M64CSP128 [Mobility Radeon X1450] + 7193 RV516 [Radeon X1550 Series] + 7196 RV516 [Mobility Radeon X1350] + 719b FireMV 2250 + 719f RV516LE [Radeon X1550 64-bit] + 71a0 RV516 [Radeon X1300/X1550 Series] (Secondary) + 71a1 RV516 XT Radeon X1600 Series (Secondary) + 71a3 RV516 [Radeon X1300 Pro] (Secondary) + 71a7 RV516 [Radeon X1300/X1550 Series] (Secondary) + 71bb FireMV 2250 (Secondary) + 71c0 RV530 [Radeon X1600] + 71c1 Radeon X1650 Pro + 71c2 RV530 [Radeon X1600] + 71c4 M56GL [Mobility FireGL V5200] + 17aa 2007 ThinkPad T60p + 71c5 M56P [Radeon Mobility X1600] + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq NW8440 + 1043 10b2 A6J-Q008 + 106b 0080 MacBook Pro + 71c6 RV530LE [Radeon X1600/X1650 PRO] + 71c7 RV535 [Radeon X1650 Series] + 71ce RV530LE [Radeon X1600] + 71d2 RV530GL [FireGL V3400] + 71d4 M56GL [Mobility FireGL V5250] + 71d5 M66-P [Mobility Radeon X1700] + 71d6 M66-XT [Mobility Radeon X1700] + 71de RV530LE [Radeon X1600] + 71e0 RV530 [Radeon X1600] (Secondary) + 71e1 Radeon X1650 Pro (Secondary) + 71e2 RV530 [Radeon X1600] (Secondary) + 71e6 RV530LE [Radeon X1650 PRO] (Secondary) + 71e7 RV535 [Radeon X1650 Series] + 71f2 RV530GL [FireGL V3400 (Secondary)] + 7210 M71 [Mobility Radeon X2100] + 7211 M71 [Mobility Radeon X2100] (Secondary) + 7240 R580 [Radeon X1900] + 7241 R580 [Radeon X1900] + 7242 R580 [Radeon X1900] + 7243 R580 [Radeon X1900] + 7244 R580 [Radeon X1900] + 7245 R580 [Radeon X1900] + 7246 R580 [Radeon X1900] + 7247 R580 [Radeon X1900] + 7248 R580 [Radeon X1900] + 7249 R580 [Radeon X1900 XT] (Primary) + 724a R580 [Radeon X1900] + 724b R580 [Radeon X1900] + 1002 0b12 Radeon X1900 (Primary) + 1002 0b13 Radeon X1900 (Secondary) + 724c R580 [Radeon X1900] + 724d R580 [Radeon X1900] + 724e R580 [AMD Stream Processor] + 7269 R580 [Radeon X1900 XT] (Secondary) + 726b R580 [Radeon X1900] + 726e R580 [AMD Stream Processor] (Secondary) + 7280 RV570 [Radeon X1950 Pro] + 7288 Radeon X1950 GT + 7291 Radeon X1650 XT (Primary) (PCIE) + 7293 Radeon X1650 Series + 72a0 RV570 [Radeon X1950 Pro] (secondary) + 72a8 Radeon X1950 GT (Secondary) + 72b1 Radeon X1650 XT (Secondary) (PCIE) + 72b3 Radeon X1650 Series (Secondary) + 7833 Radeon 9100 IGP Host Bridge + 7834 Radeon 9100 PRO IGP + 7835 Radeon Mobility 9200 IGP + 7838 Radeon 9100 IGP PCI/AGP Bridge + 7910 RS690 Host Bridge + 17f2 5000 KI690-AM2 Motherboard + 7911 RS690 Host Bridge + 7912 RS690 PCI to PCI Bridge (Internal gfx) + 7913 RS690 PCI to PCI Bridge (PCI Express Graphics Port 0) + 7915 RS690 PCI to PCI Bridge (PCI Express Port 1) + 7916 RS690 PCI to PCI Bridge (PCI Express Port 2) + 7917 RS690 PCI to PCI Bridge (PCI Express Port 3) + 1002 7910 RS690 PCI to PCI Bridge + 7919 Radeon X1200 Series Audio Controller + 17f2 5000 KI690-AM2 Motherboard + 791e RS690 [Radeon X1200 Series] + 1462 7327 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 791f RS690M [Radeon X1200 Series] + 7930 Radeon Xpress 7930 Host Bridge + 7932 RS7932 PCI Bridge + 7933 RS7933 PCI Bridge + 7936 RS7936 PCI Bridge + 793b RS600 audio device [Radeon Xpress 12xx Series] + 793f RS600 [Radeon Xpress 1200 Series] + 7941 RS600 [Radeon Xpress 1200 Series] + 7942 Radeon Xpress 1250 + 796e Radeon 2100 + 7c37 RV350 AQ [Radeon 9600 SE] + 9400 R600 [Radeon HD 2900 Series] + 1002 3000 Sapphire Radeon HD 2900 XT + 1002 3142 HIS Radeon HD 2900XT 512MB GDDR3 VIVO PCIe + 9403 R600 [Radeon HD 2900 PRO] + 940a R600GL [Fire GL V8650] + 940b R600GL [Fire GL V8600] + 940f R600 [FireGL V7600] + 9440 RV770 [Radeon HD 4870] + 9441 R700 [Radeon HD 4870 X2] + 9442 RV770 [Radeon HD 4850] + 174b e810 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink + 9443 R700 [Radeon HD 4850] + 944a M98L [Mobility Radeon HD 4850] + 944c RV770 LE [Radeon HD 4800 Series] + 9450 RV770 [FireStream 9270] + 9452 RV770 [FireStream 9250] + 945a M98 XT [Mobility Radeon HD 4870] + 9460 RV790 [Radeon HD 4800 Series] + 9480 M96 [Mobility Radeon HD 4650] + 103c 3628 ATI Mobility Radeon HD 4650 [dv6-1190en] + 9489 M96 XT [Mobility FireGL V5725] + 9490 RV730XT [Radeon HD 4670] + 174b e880 Radeon HD 4670 512MB DDR3 + 9491 M96 CSP [ATI RADEON E4690] + 9495 HD 4650 + 1002 9495 RV730 XT [PowerColor Radeon HD4670 AGP 1GB DDR] + 1458 0028 HD4650 + 9498 RV730 PRO [Radeon HD 4650] + 949f RV730 [FirePro V5700] + 94a0 Mobility Radeon HD 4830 [M97] + 94a1 [M97 XT] Mobility Radeon HD 4860 + 94a3 M97 GL [ATI FirePro M7740] + 94b3 Radeon HD 4770 [RV740] + 94b4 RV740 LE [ATI Radeon HD 4700 Series] + 94c1 RV610 [Radeon HD 2400 XT] + 1028 0211 Optiplex 755 + 1028 0d02 Optiplex 755 + 94c3 RV610 video device [Radeon HD 2400 PRO] + 1002 94c3 Radeon HD 2400PRO + 174b e400 Sapphire HD 2400 PRO video device + 18bc 3550 GeCube Radeon HD2400 PRO + 94c4 RV610 LE AGP [Radeon HD 2400 PRO AGP] + 94c8 Radeon HD 2400 XT + 94c9 Mobility Radeon HD 2400 + 1002 94c9 Radeon HD2400 + 94cb Radeon E2400 + 94cc RV 610LE PCI [Radeon HD 2400] + 9501 Radeon HD 3870 + 9504 Mobility Radeon HD 3850 + 9505 RV670PRO [Radeon HD 3850] + 9507 RV670 [Radeon HD 3850] + 9508 M88 XT Mobility Radeon HD 3870] + 950f R680 [Radeon HD 3870 x2] + 9511 RV670 [FireGL 7700] + 9515 RV670 AGP [Radeon HD 3850] + 9519 RV670 [FireStream 9170] + 9540 RV710 [Radeon HD 4550] + 954f RV710 [Radeon HD 4350] + 9552 M92 LP [Mobility Radeon HD 4300 Series] + 9553 M92 [Mobility Radeon HD 4500 Series] + 9555 M93 [Mobility Radeon HD 4500 Series] + 9559 Mobility Radeon HD 3600 Series + 9581 M76 [Radeon Mobility HD 2600 Series] + 9583 M76XT [Mobility Radeon HD 2600 XT] + 9586 RV 630 XT AGP [Radeon HD 2600 XT AGP] + 9587 RV630 PRO AGP [Radeon HD 2600 PRO AGP] + 9588 RV630 [Radeon HD 2600XT] + 1458 216c Radeon HD 2600 XT, 256MB GDDR3, 2x DVI, TV-out, PCIe (GV-RX26T256H) + 9589 RV630 [Radeon HD 2600 Series] + 958c RV630GL [FireGL v5600] + 958d RV630 [FireGL V3600] + 9591 Mobility Radeon HD 3650 + 1002 9591 Mobility Radeon HD 3650 + 9593 Radeon Mobility HD 3670 + 9595 M86GL [Mobility FireGL V5700] + 9596 RV635 PRO AGP [Radeon HD 3650] + 9598 Mobility Radeon HD 3600 Series + 1002 9598 Mobility Radeon HD 3600 + 1043 01d6 EAH3650 Silent + 95c0 Mobility Radeon HD 3470 + 1002 95c0 Mobility Radeon HD 3470 + 95c4 Mobility Radeon HD 3400 Series + 1002 95c4 Mobility Radeon HD 3400 + 95c5 Mobility Radeon HD 3450 + 1002 95c5 Mobility Radeon HD 3450 + 95c6 RV620 LE AGP [Radeon HD 3450] + 95c9 RV620 PCI [Radeon HD 3450] + 95cc RV620 [ATI FireGL V3700] + 95cd RV620 [FireMV 2450] + 95ce RV620 [FirePro 2260] + 95cf RV620 [FirePro 2260] + 960f RS780 Azalia controller + 9610 Radeon HD 3200 Graphics + 1458 d000 GA-MA78GM-S2H Motherboard + 9611 Radeon 3100 Graphics + 9612 RS780M/RS780MN [Radeon HD 3200 Graphics] + 9613 RS780MC [Radeon HD 3100 Graphics] + 9614 Radeon HD 3300 Graphics + 9615 RS780E [AMD 780E] + 9616 760G [Radeon 3000] + aa00 R600 Audio Device [Radeon HD 2900 Series] + aa08 RV630/M76 audio device [Radeon HD 2600 Series] + aa10 RV610 audio device [Radeon HD 2400 PRO] + 174b aa10 Sapphire HD 2400 PRO audio device + 18bc aa10 GeCube Radeon HD 2400 PRO HDCP-capable digital-only audio device + aa18 Radeon HD 3870 Audio device + aa20 RV635 Audio device [Radeon HD 3600 Series] + aa28 RV620 Audio device [Radeon HD 34xx Series] + aa30 HD48x0 audio + 174b aa30 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink + aa38 R700 Audio Device [Radeon HD 4000 Series] + 103c 3628 ATI RV710/730 [dv6-1190en] + 174b aa38 R700 Audio Device [Radeon HD 4000 Series] + ac00 Theater 600 Pro + cab0 AGP Bridge [IGP 320M] + cab2 RS200/RS200M AGP Bridge [IGP 340M] + cab3 R200 AGP Bridge [Mobility Radeon 7000 IGP] + cbb2 RS200/RS200M AGP Bridge [IGP 340M] +1003 ULSI Systems + 0201 US201 +1004 VLSI Technology Inc + 0005 82C592-FC1 + 0006 82C593-FC1 + 0007 82C594-AFC2 + 0008 82C596/7 [Wildcat] + 0009 82C597-AFC2 + 000c 82C541 [Lynx] + 000d 82C543 [Lynx] + 0101 82C532 + 0102 82C534 [Eagle] + 0103 82C538 + 0104 82C535 + 0105 82C147 + 0200 82C975 + 0280 82C925 + 0304 QSound ThunderBird PCI Audio + 1004 0304 QSound ThunderBird PCI Audio + 122d 1206 DSP368 Audio + 1483 5020 XWave Thunder 3D Audio + 0305 QSound ThunderBird PCI Audio Gameport + 1004 0305 QSound ThunderBird PCI Audio Gameport + 122d 1207 DSP368 Audio Gameport + 1483 5021 XWave Thunder 3D Audio Gameport + 0306 QSound ThunderBird PCI Audio Support Registers + 1004 0306 QSound ThunderBird PCI Audio Support Registers + 122d 1208 DSP368 Audio Support Registers + 1483 5022 XWave Thunder 3D Audio Support Registers + 0307 Thunderbird + 0308 Thunderbird + 0702 VAS96011 [Golden Gate II] + 0703 Tollgate +1005 Avance Logic Inc. [ALI] + 2064 ALG2032/2064 + 2128 ALG2364A + 2301 ALG2301 + 2302 ALG2302 + 2364 ALG2364 + 2464 ALG2364A + 2501 ALG2564A/25128A +1006 Reply Group +1007 NetFrame Systems Inc +1008 Epson +100a Phoenix Technologies +100b National Semiconductor Corporation + 0001 DP83810 + 0002 87415/87560 IDE + 000e 87560 Legacy I/O + 000f FireWire Controller + 0011 NS87560 National PCI System I/O + 0012 USB Controller + 0020 DP83815 (MacPhyter) Ethernet Controller + 103c 0024 Pavilion ze4400 builtin Network + 12d9 000c Aculab E1/T1 PMXc cPCI carrier card + 1385 f311 FA311 / FA312 (FA311 with WoL HW) + 0021 PC87200 PCI to ISA Bridge + 0022 DP83820 10/100/1000 Ethernet Controller + 1186 4900 DGE-500T + 1385 621a GA621 + 1385 622a GA622T + 0028 Geode GX2 Host Bridge + 002a CS5535 South Bridge + 002b CS5535 ISA bridge + 002d CS5535 IDE + 002e CS5535 Audio + 002f CS5535 USB + 0030 Geode GX2 Graphics Processor + 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller + 0500 SCx200 Bridge + 0501 SCx200 SMI + 0502 SCx200, SC1100 IDE controller + 100b 0502 IDE Controller + 0503 SCx200, SC1100 Audio Controller + 100b 0503 XpressAudio controller + 0504 SCx200 Video + 0505 SCx200 XBus + 0510 SC1100 Bridge + 100b 0500 GPIO and LPC support bridge + 0511 SC1100 SMI & ACPI + 100b 0501 SC1100 SMI & ACPI bridge + 0515 SC1100 XBus + 100b 0505 SC1100 PCI to XBus bridge + d001 87410 IDE +100c Tseng Labs Inc + 3202 ET4000/W32p rev A + 3205 ET4000/W32p rev B + 3206 ET4000/W32p rev C + 3207 ET4000/W32p rev D + 3208 ET6000 + 4702 ET6300 +100d AST Research Inc +100e Weitek + 9000 P9000 Viper + 9001 P9000 Viper + 9002 P9000 Viper + 9100 P9100 Viper Pro/SE +1010 Video Logic, Ltd. +1011 Digital Equipment Corporation + 0001 DECchip 21050 + 0002 DECchip 21040 [Tulip] + 0004 DECchip 21030 [TGA] + 0007 NVRAM [Zephyr NVRAM] + 0008 KZPSA [KZPSA] + 0009 DECchip 21140 [FasterNet] + 1025 0310 21140 Fast Ethernet + 10b8 2001 SMC9332BDT EtherPower 10/100 + 10b8 2002 SMC9332BVT EtherPower T4 10/100 + 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port) + 1109 2400 ANA-6944A/TX Fast Ethernet + 1112 2300 RNS2300 Fast Ethernet + 1112 2320 RNS2320 Fast Ethernet + 1112 2340 RNS2340 Fast Ethernet + 1113 1207 EN-1207-TX Fast Ethernet + 1186 1100 DFE-500TX Fast Ethernet + 1186 1112 DFE-570TX Fast Ethernet + 1186 1140 DFE-660 Cardbus Ethernet 10/100 + 1186 1142 DFE-660 Cardbus Ethernet 10/100 + 11f6 0503 Freedomline Fast Ethernet + 1282 9100 AEF-380TXD Fast Ethernet + 1385 1100 FA310TX Fast Ethernet + 2646 0001 KNE100TX Fast Ethernet + 000a 21230 Video Codec + 000d PBXGB [TGA2] + 000f PCI-to-PDQ Interface Chip [PFI] + 1011 def1 FDDI controller (DEFPA) + 103c def1 FDDI controller (3X-DEFPA) + 0014 DECchip 21041 [Tulip Pass 3] + 1186 0100 DE-530+ + 0016 DGLPB [OPPO] + 0017 PV-PCI Graphics Controller (ZLXp-L) + 0018 Memory Channel interface + 0019 DECchip 21142/43 + 1011 500a DE500A Fast Ethernet + 1011 500b DE500B Fast Ethernet + 1014 0001 10/100 EtherJet Cardbus + 1025 0315 ALN315 Fast Ethernet + 1033 800c PC-9821-CS01 100BASE-TX Interface Card + 1033 800d PC-9821NR-B06 100BASE-TX Interface Card + 103c 125a 10/100Base-TX (PCI) [A5506B] + 108d 0016 Rapidfire 2327 10/100 Ethernet + 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus + 10b8 2005 SMC8032DT Extreme Ethernet 10/100 + 10b8 8034 SMC8034 Extreme Ethernet 10/100 + 10ef 8169 Cardbus Fast Ethernet + 1109 2a00 ANA-6911A/TX Fast Ethernet + 1109 2b00 ANA-6911A/TXC Fast Ethernet + 1109 3000 ANA-6922/TX Fast Ethernet + 1113 1207 Cheetah Fast Ethernet + 1113 2220 Cardbus Fast Ethernet + 115d 0002 Cardbus Ethernet 10/100 + 1179 0203 Fast Ethernet + 1179 0204 Cardbus Fast Ethernet + 1186 1100 DFE-500TX Fast Ethernet + 1186 1101 DFE-500TX Fast Ethernet + 1186 1102 DFE-500TX Fast Ethernet + 1186 1112 DFE-570TX Quad Fast Ethernet + 1259 2800 AT-2800Tx Fast Ethernet + 1266 0004 Eagle Fast EtherMAX + 12af 0019 NetFlyer Cardbus Fast Ethernet + 1374 0001 Cardbus Ethernet Card 10/100 + 1374 0002 Cardbus Ethernet Card 10/100 + 1374 0007 Cardbus Ethernet Card 10/100 + 1374 0008 Cardbus Ethernet Card 10/100 + 1385 2100 FA510 + 1395 0001 10/100 Ethernet CardBus PC Card + 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200) + 1498 000a TPMC880-10 10/100Base-T and 10Base2 PMC Ethernet Adapter + 1498 000b TPMC880-11 Single 10/100Base-T PMC Ethernet Adapter + 1498 000c TPMC880-12 Single 10Base2 PMC Ethernet Adapter + 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card + 1668 2000 FastNet Pro (PE2000) + 2646 0001 KNE100TX + 2646 0002 KNE-CB4TX + 8086 0001 EtherExpress PRO/100 Mobile CardBus 32 + 001a Farallon PN9000SX Gigabit Ethernet + 0021 DECchip 21052 + 0022 DECchip 21150 + 0023 DECchip 21150 + 0024 DECchip 21152 + 0025 DECchip 21153 + 0026 DECchip 21154 + 0034 56k Modem Cardbus + 1374 0003 56k Modem Cardbus + 0045 DECchip 21553 + 0046 DECchip 21554 + 0e11 4050 Smart Array 4200 Controller + 0e11 4051 Smart Array 4250ES Controller + 0e11 4058 Smart Array 431 Controller + 103c 10c2 NetRAID-4M + 12d9 000a IP Telephony card + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 9005 0364 5400S (Mustang) + 9005 0365 5400S (Mustang) + 9005 1364 Dell PowerEdge RAID Controller 2 + 9005 1365 Dell PowerEdge RAID Controller 2 + e4bf 1000 CC8-1-BLUES + 1065 StrongARM DC21285 + 1069 0020 DAC960P / DAC1164P +1012 Micronics Computers Inc +1013 Cirrus Logic + 0038 GD 7548 + 0040 GD 7555 Flat Panel GUI Accelerator + 004c GD 7556 Video/Graphics LCD/CRT Ctrlr + 00a0 GD 5430/40 [Alpine] + 00a2 GD 5432 [Alpine] + 00a4 GD 5434-4 [Alpine] + 00a8 GD 5434-8 [Alpine] + 00ac GD 5436 [Alpine] + 00b0 GD 5440 + 00b8 GD 5446 + 00bc GD 5480 + 1013 00bc CL-GD5480 + 00d0 GD 5462 + 00d2 GD 5462 [Laguna I] + 00d4 GD 5464 [Laguna] + 00d5 GD 5464 BD [Laguna] + 00d6 GD 5465 [Laguna] + 13ce 8031 Barco Metheus 2 Megapixel, Dual Head + 13cf 8031 Barco Metheus 2 Megapixel, Dual Head + 00e8 GD 5436U + 1100 CL 6729 + 1110 PD 6832 PCMCIA/CardBus Ctrlr + 1112 PD 6834 PCMCIA/CardBus Ctrlr + 1113 PD 6833 PCMCIA/CardBus Ctrlr + 1200 GD 7542 [Nordic] + 1202 GD 7543 [Viking] + 1204 GD 7541 [Nordic Light] + 4000 MD 5620 [CLM Data Fax Voice] + 4400 CD 4400 + 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator] + 1014 1010 CS4610 SoundFusion Audio Accelerator + 6003 CS 4614/22/24/30 [CrystalClear SoundFusion Audio Accelerator] + 1013 4280 Crystal SoundFusion PCI Audio Accelerator + 1014 0153 ThinkPad A20m + 153b 112e DMX XFire 1024 + 153b 1136 SiXPack 5.1+ + 1681 0050 Game Theater XP + 1681 a010 Gamesurround Fortissimo II + 1681 a011 Gamesurround Fortissimo III 7.1 + 5053 3357 Santa Cruz + 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] + 6005 Crystal CS4281 PCI Audio + 1013 4281 Crystal CS4281 PCI Audio + 10cf 10a8 Crystal CS4281 PCI Audio + 10cf 10a9 Crystal CS4281 PCI Audio + 10cf 10aa Crystal CS4281 PCI Audio + 10cf 10ab Crystal CS4281 PCI Audio + 10cf 10ac Crystal CS4281 PCI Audio + 10cf 10ad Crystal CS4281 PCI Audio + 10cf 10b4 Crystal CS4281 PCI Audio + 1179 0001 Crystal CS4281 PCI Audio + 14c0 000c Crystal CS4281 PCI Audio +1014 IBM + 0002 PCI to MCA Bridge + 0005 Processor to I/O Controller [Alta Lite] + 0007 Processor to I/O Controller [Alta MP] + 000a PCI to ISA Bridge (IBM27-82376) [Fire Coral] + 0017 CPU to PCI Bridge + 0018 TR Auto LANstreamer + 001b GXT-150P + 001c Carrera + 001d SCSI-2 FAST PCI Adapter (82G2675) + 0020 GXT1000 Graphics Adapter + 0022 PCI to PCI Bridge (IBM27-82351) + 002d Processor to I/O Controller [Python] + 002e SCSI RAID Adapter [ServeRAID] + 1014 002e ServeRAID-3x + 1014 022e ServeRAID-4H + 0031 2 Port Serial Adapter +# AS400 iSeries PCI sync serial card + 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter + 0036 PCI to 32-bit LocalBus Bridge [Miami] + 0037 PowerPC to PCI Bridge (IBM27-82660) + 003a CPU to PCI Bridge + 003c GXT250P/GXT255P Graphics Adapter + 003e 16/4 Token ring UTP/STP controller + 1014 003e Token-Ring Adapter + 1014 00cd Token-Ring Adapter + Wake-On-LAN + 1014 00ce 16/4 Token-Ring Adapter 2 + 1014 00cf 16/4 Token-Ring Adapter Special + 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter + 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN + 1014 016d iSeries 2744 Card + 0045 SSA Adapter + 0046 MPIC interrupt controller + 0047 PCI to PCI Bridge + 0048 PCI to PCI Bridge + 0049 Warhead SCSI Controller + 004e ATM Controller (14104e00) + 004f ATM Controller (14104f00) + 0050 ATM Controller (14105000) + 0053 25 MBit ATM Controller + 0054 GXT500P/GXT550P Graphics Adapter + 0057 MPEG PCI Bridge + 0058 SSA Adapter [Advanced SerialRAID/X] + 005c i82557B 10/100 + 005e GXT800P Graphics Adapter + 007c ATM Controller (14107c00) + 007d 3780IDSP [MWave] + 008b EADS PCI to PCI Bridge + 008e GXT3000P Graphics Adapter + 0090 GXT 3000P + 1014 008e GXT-3000P + 0091 SSA Adapter + 0095 20H2999 PCI Docking Bridge + 0096 Chukar chipset SCSI controller + 1014 0097 iSeries 2778 DASD IOA + 1014 0098 iSeries 2763 DASD IOA + 1014 0099 iSeries 2748 DASD IOA + 009f PCI 4758 Cryptographic Accelerator + 00a5 ATM Controller (1410a500) + 00a6 ATM 155MBPS MM Controller (1410a600) + 00b7 256-bit Graphics Rasterizer [FireGL1] + 1092 00b8 FireGL1 AGP 32Mb + 00b8 GXT2000P Graphics Adapter + 00be ATM 622MBPS Controller (1410be00) + 00dc Advanced Systems Management Adapter (ASMA) + 00fc CPC710 Dual Bridge and Memory Controller (PCI-64) + 0104 Gigabit Ethernet-SX Adapter + 0105 CPC710 Dual Bridge and Memory Controller (PCI-32) + 010f Remote Supervisor Adapter (RSA) + 0142 Yotta Video Compositor Input + 1014 0143 Yotta Input Controller (ytin) + 0144 Yotta Video Compositor Output + 1014 0145 Yotta Output Controller (ytout) + 0156 405GP PLB to PCI Bridge + 015e 622Mbps ATM PCI Adapter + 0160 64bit/66MHz PCI ATM 155 MMF + 016e GXT4000P Graphics Adapter + 0170 GXT6000P Graphics Adapter + 017d GXT300P Graphics Adapter + 0180 Snipe chipset SCSI controller + 1014 0241 iSeries 2757 DASD IOA + 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780) + 0188 EADS-X PCI-X to PCI-X Bridge + 01a7 PCI-X to PCI-X Bridge + 01bd ServeRAID Controller + 1014 01bd ServeRAID 4Lx + 1014 01be ServeRAID-4M + 1014 01bf ServeRAID-4L + 1014 0208 ServeRAID-4Mx + 1014 020e ServeRAID-4Lx + 1014 022e ServeRAID-4H + 1014 0258 ServeRAID-5i + 1014 0259 ServeRAID-5i + 01c1 64bit/66MHz PCI ATM 155 UTP + 01e6 Cryptographic Accelerator + 01ef PowerPC 440GP PCI Bridge + 1734 102b PCEAS PCI-X Dual Port ESCON Adapter + 1734 10f8 PCEAT PCI-Express Dual Port ESCON Adapter + 01ff 10/100 Mbps Ethernet + 0219 Multiport Serial Adapter + 1014 021a Dual RVX + 1014 0251 Internal Modem/RVX + 1014 0252 Quad Internal Modem + 021b GXT6500P Graphics Adapter + 021c GXT4500P Graphics Adapter + 0233 GXT135P Graphics Adapter + 0266 PCI-X Dual Channel SCSI + 0268 Gigabit Ethernet-SX Adapter (PCI-X) + 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X) + 028c Citrine chipset SCSI controller + 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E) + 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B) + 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A) + 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B) + 02a1 Calgary PCI-X Host Bridge + 02bd Obsidian chipset SCSI controller + 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C) + 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D) + 1014 0338 PCI-X DDR Auxiliary Cache Adapter (575C) + 0302 Winnipeg PCI-X Host Bridge + 0308 CalIOC2 PCI-E Root Port + 0314 ZISC 036 Neural accelerator card + 032d Axon - Cell Companion Chip + 1014 03a1 PCIe PowerXCell 8i Cell Accelerator Board + 0339 Obsidian-E PCI-E SCSI controller + 1014 030a PCIe 3Gb SAS RAID Adapter (574E) + 1014 033a PCIe 3Gb SAS Adapter (57B3) + 1014 0360 PCI-E Auxiliary Cache Adapter (57B7) + 033d PCI-E IPR SAS Adapter (FPGA) + 1014 033c PCIe2 1.8GB Cache 6Gb SAS RAID Adapter Tri-port (57B5) + 1014 0356 PCIe2 1.8GB Cache 6Gb SAS RAID & SSD Adapter (574D) + 1014 035f PCIe2 6Gb SAS Adapter Quad-port (57B2) + 034a PCI-E IPR SAS Adapter (ASIC) + 1014 033b PCIe2 6Gb SAS RAID Adapter Quad-port (57B4) + 1014 0355 PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57B1) + 1014 0357 PCIe2 6Gb SAS Adapter Quad-port (57C6) + 1014 035d PCIe2 3.6GB Cache 6Gb SAS RAID & SSD Adapter (575D) + 1014 035e PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57CE) + 3022 QLA3022 Network Adapter + 4022 QLA3022 Network Adapter + ffff MPIC-2 interrupt controller +1015 LSI Logic Corp of Canada +1016 ICL Personal Systems +1017 SPEA Software AG + 5343 SPEA 3D Accelerator +1018 Unisys Systems +1019 Elitegroup Computer Systems +101a AT&T GIS (NCR) + 0005 100VG ethernet + 0007 BYNET BIC4G/2C/2G + 101a 0019 BYNET BIC2C + 101a 001c BYNET BIC2G + 101a 001f BYNET BIC4G + 0009 PQS Memory Controller + 000a BYNET BPCI Adapter + 000b BYNET 4 Port BYA Switch (BYA4P) + 000c BYNET 4 Port BYA Switch (BYA4G) + 0010 NCR AMC Memory Controller + 1dc1 BYNET BIC2M/BIC4M/BYA4M + 101a 0019 BIC2M + 101a 001f BIC4M + 101a 0ece BYA4M + 1fa8 BYNET Multi-port BIC Adapter (XBIC Based) + 101a 00c3 BYNET BIC2SE +101b Vitesse Semiconductor +# Maxim VSC452 Super BMC Controller with Video + 0452 VSC452 [SuperBMC] +101c Western Digital + 0193 33C193A + 0196 33C196A + 0197 33C197A + 0296 33C296A + 3193 7193 + 3197 7197 + 3296 33C296A + 4296 34C296 + 9710 Pipeline 9710 + 9712 Pipeline 9712 + c24a 90C +# ID for Newly Acquired Storage Products from Vitesse +101d Maxim Integrated Products +101e American Megatrends Inc. + 0009 MegaRAID 428 Ultra RAID Controller (rev 03) + 1960 MegaRAID + 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller + 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller + 101e 0477 MegaRAID 477 Elite 3100 RAID Controller + 101e 0493 MegaRAID 493 Elite 1600 RAID Controller + 101e 0494 MegaRAID 494 Elite 1650 RAID Controller + 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller + 101e 0511 MegaRAID 511 i4 IDE RAID Controller + 101e 0522 MegaRAID 522 i4133 RAID Controller + 1028 0471 PowerEdge RAID Controller 3/QC + 1028 0475 PowerEdge RAID Controller 3/SC + 1028 0493 PowerEdge RAID Controller 3/DC + 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch + 103c 60e7 NetRAID-1M + 9010 MegaRAID 428 Ultra RAID Controller + 9030 EIDE Controller + 9031 EIDE Controller + 9032 EIDE & SCSI Controller + 9033 SCSI Controller + 9040 Multimedia card + 9060 MegaRAID 434 Ultra GT RAID Controller + 9063 MegaRAC + 101e 0767 Dell Remote Assistant Card 2 +101f PictureTel +1020 Hitachi Computer Products +1021 OKI Electric Industry Co. Ltd. +1022 Advanced Micro Devices [AMD] + 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration + 1101 K8 [Athlon64/Opteron] Address Map + 1102 K8 [Athlon64/Opteron] DRAM Controller + 1103 K8 [Athlon64/Opteron] Miscellaneous Control + 1200 K10 [Opteron, Athlon64, Sempron] HyperTransport Configuration + 1201 K10 [Opteron, Athlon64, Sempron] Address Map + 1202 K10 [Opteron, Athlon64, Sempron] DRAM Controller + 1203 K10 [Opteron, Athlon64, Sempron] Miscellaneous Control + 1204 K10 [Opteron, Athlon64, Sempron] Link Control + 1300 Mobile K10 [Turion X2, Athlon X2, Sempron] HyperTransport Configuration + 1301 Family 11h [Turion X2, Athlon X2, Sempron] Address Map + 1302 Mobile K10 [Turion X2, Athlon X2, Sempron] DRAM Controller + 1303 Mobile K10 [Turion X2, Athlon X2, Sempron] Miscellaneous Control + 1304 Mobile K10 [Turion X2, Athlon X2, Sempron] Link Control + 2000 79c970 [PCnet32 LANCE] + 1014 2000 NetFinity 10/100 Fast Ethernet + 1022 2000 PCnet - Fast 79C971 + 103c 104c Ethernet with LAN remote power Adapter + 103c 1064 Ethernet with LAN remote power Adapter + 103c 1065 Ethernet with LAN remote power Adapter + 103c 106c Ethernet with LAN remote power Adapter + 103c 106e Ethernet with LAN remote power Adapter + 103c 10ea Ethernet with LAN remote power Adapter + 1113 1220 EN1220 10/100 Fast Ethernet + 1259 2450 AT-2450 10/100 Fast Ethernet + 1259 2454 AT-2450v4 10Mb Ethernet Adapter + 1259 2700 AT-2700TX 10/100 Fast Ethernet + 1259 2701 AT-2700FX 100Mb Ethernet + 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet + 1259 2703 AT-2701FX + 1259 2704 AT-2701FTX 10/100 Mb Fiber/Copper Fast Ethernet + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1010 CP5/CR6 mainboard + 4c53 1020 VR6 mainboard + 4c53 1030 PC5 mainboard + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard + 2001 79c978 [HomePNA] + 1092 0a78 Multimedia Home Network Adapter + 1668 0299 ActionLink Home Network Adapter + 2003 Am 1771 MBW [Alchemy] + 2020 53c974 [PCscsi] + 2040 79c974 + 2080 CS5536 [Geode companion] Host Bridge + 2081 Geode LX Video + 2082 Geode LX AES Security Block + 208f CS5536 GeodeLink PCI South Bridge + 2090 CS5536 [Geode companion] ISA + 2091 CS5536 [Geode companion] FLASH + 2093 CS5536 [Geode companion] Audio + 2094 CS5536 [Geode companion] OHC + 2095 CS5536 [Geode companion] EHC + 2096 CS5536 [Geode companion] UDC + 2097 CS5536 [Geode companion] UOC + 209a CS5536 [Geode companion] IDE + 3000 ELanSC520 Microcontroller + 7006 AMD-751 [Irongate] System Controller + 7007 AMD-751 [Irongate] AGP Bridge + 700a AMD-IGR4 AGP Host to PCI Bridge + 700b AMD-IGR4 PCI to PCI Bridge + 700c AMD-760 MP [IGD4-2P] System Controller + 700d AMD-760 MP [IGD4-2P] AGP Bridge + 700e AMD-760 [IGD4-1P] System Controller + 700f AMD-760 [IGD4-1P] AGP Bridge + 7400 AMD-755 [Cobra] ISA + 7401 AMD-755 [Cobra] IDE + 7403 AMD-755 [Cobra] ACPI + 7404 AMD-755 [Cobra] USB + 7408 AMD-756 [Viper] ISA + 7409 AMD-756 [Viper] IDE + 740b AMD-756 [Viper] ACPI + 740c AMD-756 [Viper] USB + 7410 AMD-766 [ViperPlus] ISA + 7411 AMD-766 [ViperPlus] IDE + 7413 AMD-766 [ViperPlus] ACPI + 7414 AMD-766 [ViperPlus] USB + 7440 AMD-768 [Opus] ISA + 1043 8044 A7M-D Mainboard + 7441 AMD-768 [Opus] IDE + 7443 AMD-768 [Opus] ACPI + 1043 8044 A7M-D Mainboard + 7445 AMD-768 [Opus] Audio + 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible) + 7448 AMD-768 [Opus] PCI + 7449 AMD-768 [Opus] USB + 7450 AMD-8131 PCI-X Bridge + 7451 AMD-8131 PCI-X IOAPIC + 7454 AMD-8151 System Controller + 7455 AMD-8151 AGP Bridge + 7458 AMD-8132 PCI-X Bridge + 7459 AMD-8132 PCI-X IOAPIC + 7460 AMD-8111 PCI + 161f 3017 HDAMB + 7461 AMD-8111 USB + 7462 AMD-8111 Ethernet + 7464 AMD-8111 USB + 161f 3017 HDAMB + 7468 AMD-8111 LPC + 161f 3017 HDAMB + 7469 AMD-8111 IDE + 1022 2b80 AMD-8111 IDE [Quartet] + 161f 3017 HDAMB + 746a AMD-8111 SMBus 2.0 + 746b AMD-8111 ACPI + 161f 3017 HDAMB + 746d AMD-8111 AC97 Audio + 161f 3017 HDAMB + 746e AMD-8111 MC97 Modem + 756b AMD-8111 ACPI + 9600 RS780 Host Bridge + 9601 RS780 Host Bridge Alternate + 9602 RS780 PCI to PCI bridge (int gfx) + 9603 RS780 PCI to PCI bridge (ext gfx port 0) + 9604 RS780 PCI to PCI bridge (PCIE port 0) + 9605 RS780 PCI to PCI bridge (PCIE port 1) + 9606 RS780 PCI to PCI bridge (PCIE port 2) + 9607 RS780 PCI to PCI bridge (PCIE port 3) + 9608 RS780 PCI to PCI bridge (PCIE port 4) + 9609 RS780 PCI to PCI bridge (PCIE port 5) + 960a RS780 PCI to PCI bridge (NB-SB link) + 960b RS780 PCI to PCI bridge (ext gfx port 1) +1023 Trident Microsystems + 0194 82C194 + 2000 4DWave DX + 2001 4DWave NX + 122d 1400 Trident PCI288-Q3DII (NX) + 2100 CyberBlade XP4m32 + 2200 XGI Volari XP5 + 8400 CyberBlade/i7 + 1023 8400 CyberBlade i7 AGP + 8420 CyberBlade/i7d + 0e11 b15a CyberBlade i7 AGP + 8500 CyberBlade/i1 + 8520 CyberBlade i1 + 0e11 b16e CyberBlade i1 AGP + 1023 8520 CyberBlade i1 AGP + 8620 CyberBlade/i1 + 1014 0502 ThinkPad R30/T30 + 1014 1025 Travelmate 352TE + 8820 CyberBlade XPAi1 + 9320 TGUI 9320 + 9350 GUI Accelerator + 9360 Flat panel GUI Accelerator + 9382 Cyber 9382 [Reference design] + 9383 Cyber 9383 [Reference design] + 9385 Cyber 9385 [Reference design] + 9386 Cyber 9386 + 9388 Cyber 9388 + 9397 Cyber 9397 + 939a Cyber 9397DVD + 9420 TGUI 9420 + 9430 TGUI 9430 + 9440 TGUI 9440 + 9460 TGUI 9460 + 9470 TGUI 9470 + 9520 Cyber 9520 + 9525 Cyber 9525 + 9540 Cyber 9540 + 9660 TGUI 9660/938x/968x + 9680 TGUI 9680 + 9682 TGUI 9682 + 9683 TGUI 9683 + 9685 ProVIDIA 9685 + 9750 3DImage 9750 + 1014 9750 3DImage 9750 + 1023 9750 3DImage 9750 + 9753 TGUI 9753 + 9754 TGUI 9754 + 9759 TGUI 975 + 9783 TGUI 9783 + 9785 TGUI 9785 + 9850 3DImage 9850 + 9880 Blade 3D PCI/AGP + 1023 9880 Blade 3D + 9910 CyberBlade/XP + 9930 CyberBlade/XPm + 9960 CyberBlade XP2 +1024 Zenith Data Systems +1025 Acer Incorporated [ALI] + 1435 M1435 + 1445 M1445 + 1449 M1449 + 1451 M1451 + 1461 M1461 + 1489 M1489 + 1511 M1511 + 1512 ALI M1512 Aladdin + 1513 M1513 + 1521 ALI M1521 Aladdin III CPU Bridge + 10b9 1521 ALI M1521 Aladdin III CPU Bridge + 1523 ALI M1523 ISA Bridge + 10b9 1523 ALI M1523 ISA Bridge + 1531 M1531 Northbridge [Aladdin IV/IV+] + 1533 M1533 PCI-to-ISA Bridge + 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge + 1535 M1535 PCI Bridge + Super I/O + FIR + 1541 M1541 Northbridge [Aladdin V] + 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge + 1542 M1542 Northbridge [Aladdin V] + 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR + 1561 M1561 Northbridge [Aladdin 7] + 1621 M1621 Northbridge [Aladdin-Pro II] + 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2] + 1641 M1641 Northbridge [Aladdin-Pro IV] + 1647 M1647 [MaGiK1] PCI North Bridge + 1671 M1671 Northbridge [ALADDiN-P4] + 1672 Northbridge [CyberALADDiN-P4] + 3141 M3141 + 3143 M3143 + 3145 M3145 + 3147 M3147 + 3149 M3149 + 3151 M3151 + 3307 M3307 MPEG-I Video Controller + 3309 M3309 MPEG-II Video w/ Software Audio Decoder + 3321 M3321 MPEG-II Audio/Video Decoder + 5212 M4803 + 5215 ALI PCI EIDE Controller + 5217 M5217H + 5219 M5219 + 5225 M5225 + 5229 M5229 + 5235 M5235 + 5237 M5237 PCI USB Host Controller + 5240 EIDE Controller + 5241 PCMCIA Bridge + 5242 General Purpose Controller + 5243 PCI to PCI Bridge Controller + 5244 Floppy Disk Controller + 5247 M1541 PCI to PCI Bridge + 5251 M5251 P1394 Controller + 5427 PCI to AGP Bridge + 5451 M5451 PCI AC-Link Controller Audio Device + 5453 M5453 PCI AC-Link Controller Modem Device + 7101 M7101 PCI PMU Power Management Controller + 10b9 7101 M7101 PCI PMU Power Management Controller +1028 Dell + 0001 PowerEdge Expandable RAID Controller 2/Si + 1028 0001 PowerEdge 2400 + 0002 PowerEdge Expandable RAID Controller 3/Di + 1028 0002 PowerEdge 4400 + 1028 00d1 PERC 3/DiV [Viper] + 1028 00d9 PERC 3/DiL [Lexus] + 0003 PowerEdge Expandable RAID Controller 3/Si + 1028 0003 PowerEdge 2450 +# PowerEdge Codename Iguana + 0004 PowerEdge Expandable RAID Controller 3/Di [Iguana] + 1028 0004 PERC 3/DiF [Iguana] + 0006 PowerEdge Expandable RAID Controller 3/Di + 0007 Remote Access Card III + 0008 Remote Access Card III + 0009 Remote Access Card III: BMC/SMIC device not present + 000a PowerEdge Expandable RAID Controller 3/Di + 1028 0106 PERC 3/DiJ [Jaguar] + 1028 011b PERC 3/DiD [Dagger] + 1028 0121 PERC 3/DiB [Boxster] + 000c Embedded Remote Access or ERA/O + 000d Embedded Remote Access: BMC/SMIC device + 000e PowerEdge Expandable RAID controller 4/Di + 000f PowerEdge Expandable RAID controller 4/Di + 1028 014a PowerEdge 1750 + 0010 Remote Access Card 4 + 0011 Remote Access Card 4 Daughter Card + 0012 Remote Access Card 4 Daughter Card Virtual UART + 0013 PowerEdge Expandable RAID controller 4 + 1028 016c PowerEdge Expandable RAID Controller 4e/Si + 1028 016d PowerEdge Expandable RAID Controller 4e/Di + 1028 016e PowerEdge Expandable RAID Controller 4e/Di + 1028 016f PowerEdge Expandable RAID Controller 4e/Di + 1028 0170 PowerEdge Expandable RAID Controller 4e/Di + 0014 Remote Access Card 4 Daughter Card SMIC interface + 0015 PowerEdge Expandable RAID controller 5 + 1028 1f01 PERC 5/E Adapter RAID Controller + 1028 1f02 PERC 5/i Adapter RAID Controller + 1028 1f03 PERC 5/i Integrated RAID Controller + 0016 PowerEdge Expandable RAID controller S300 + 1028 1f24 PERC S300 Controller +1029 Siemens Nixdorf IS +102a LSI Logic + 0000 HYDRA + 0010 ASPEN + 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers + 9005 000f 2940U2W SCSI Controller + 9005 0106 2940U2W SCSI Controller + 9005 a180 2940U2W SCSI Controller + 00c5 AIC-7899 U160/m SCSI Controller + 1028 00c5 PowerEdge 2550/2650/4600 + 00cf AIC-7899P U160/m + 1028 0106 PowerEdge 4600 + 1028 0121 PowerEdge 2650 +102b Matrox Graphics, Inc. +# DJ: I've a suspicion that 0010 is a duplicate of 0d10. + 0010 MGA-I [Impression?] + 0100 MGA 1064SG [Mystique] + 0518 MGA-II [Athena] + 0519 MGA 2064W [Millennium] + 051a MGA 1064SG [Mystique] + 102b 0100 MGA-1064SG Mystique + 102b 1100 MGA-1084SG Mystique + 102b 1200 MGA-1084SG Mystique + 1100 102b MGA-1084SG Mystique + 110a 0018 Scenic Pro C5 (D1025) + 051b MGA 2164W [Millennium II] + 102b 051b MGA-2164W Millennium II + 102b 1100 MGA-2164W Millennium II + 102b 1200 MGA-2164W Millennium II + 102b 2100 MGA-2164W Millennium II + 051e MGA 1064SG [Mystique] AGP + 051f MGA 2164W [Millennium II] AGP + 0520 MGA G200 + 102b dbc2 G200 Multi-Monitor + 102b dbc8 G200 Multi-Monitor + 102b dbe2 G200 Multi-Monitor + 102b dbe8 G200 Multi-Monitor + 102b ff03 Millennium G200 SD + 102b ff04 Marvel G200 + 0521 MGA G200 AGP + 1014 ff03 Millennium G200 AGP + 102b 48e9 Mystique G200 AGP + 102b 48f8 Millennium G200 SD AGP + 102b 4a60 Millennium G200 LE AGP + 102b 4a64 Millennium G200 AGP + 102b c93c Millennium G200 AGP + 102b c9b0 Millennium G200 AGP + 102b c9bc Millennium G200 AGP + 102b ca60 Millennium G250 LE AGP + 102b ca6c Millennium G250 AGP + 102b dbbc Millennium G200 AGP + 102b dbc2 Millennium G200 MMS (Dual G200) + 102b dbc3 G200 Multi-Monitor + 102b dbc8 Millennium G200 MMS (Dual G200) + 102b dbd2 G200 Multi-Monitor + 102b dbd3 G200 Multi-Monitor + 102b dbd4 G200 Multi-Monitor + 102b dbd5 G200 Multi-Monitor + 102b dbd8 G200 Multi-Monitor + 102b dbd9 G200 Multi-Monitor + 102b dbe2 Millennium G200 MMS (Quad G200) + 102b dbe3 G200 Multi-Monitor + 102b dbe8 Millennium G200 MMS (Quad G200) + 102b dbf2 G200 Multi-Monitor + 102b dbf3 G200 Multi-Monitor + 102b dbf4 G200 Multi-Monitor + 102b dbf5 G200 Multi-Monitor + 102b dbf8 G200 Multi-Monitor + 102b dbf9 G200 Multi-Monitor + 102b f806 Mystique G200 Video AGP + 102b ff00 MGA-G200 AGP + 102b ff02 Mystique G200 AGP + 102b ff03 Millennium G200 AGP + 102b ff04 Marvel G200 AGP + 110a 0032 MGA-G200 AGP + 0522 MGA G200e [Pilot] ServerEngines (SEP1) + 0525 MGA G400/G450 + 0e11 b16f MGA-G400 AGP + 102b 0328 Millennium G400 16Mb SDRAM + 102b 0338 Millennium G400 16Mb SDRAM + 102b 0378 Millennium G400 32Mb SDRAM + 102b 0541 Millennium G450 Dual Head + 102b 0542 Millennium G450 Dual Head LX + 102b 0543 Millennium G450 Single Head LX + 102b 0641 Millennium G450 32Mb SDRAM Dual Head + 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX + 102b 0643 Millennium G450 32Mb SDRAM Single Head LX + 102b 07c0 Millennium G450 Dual Head LE + 102b 07c1 Millennium G450 SDR Dual Head LE + 102b 0d41 Millennium G450 Dual Head PCI + 102b 0d42 Millennium G450 Dual Head LX PCI + 102b 0d43 Millennium G450 32Mb Dual Head PCI + 102b 0e00 Marvel G450 eTV + 102b 0e01 Marvel G450 eTV + 102b 0e02 Marvel G450 eTV + 102b 0e03 Marvel G450 eTV + 102b 0f80 Millennium G450 Low Profile + 102b 0f81 Millennium G450 Low Profile + 102b 0f82 Millennium G450 Low Profile DVI + 102b 0f83 Millennium G450 Low Profile DVI + 102b 19d8 Millennium G400 16Mb SGRAM + 102b 19f8 Millennium G400 32Mb SGRAM + 102b 2159 Millennium G400 Dual Head 16Mb + 102b 2179 Millennium G400 MAX/Dual Head 32Mb + 102b 217d Millennium G400 Dual Head Max + 102b 23c0 Millennium G450 + 102b 23c1 Millennium G450 + 102b 23c2 Millennium G450 DVI + 102b 23c3 Millennium G450 DVI + 102b 2f58 Millennium G400 + 102b 2f78 Millennium G400 + 102b 3693 Marvel G400 AGP + 102b 5dd0 4Sight II + 102b 5f50 4Sight II + 102b 5f51 4Sight II + 102b 5f52 4Sight II + 102b 9010 Millennium G400 Dual Head + 1458 0400 GA-G400 + 1705 0001 Millennium G450 32MB SGRAM + 1705 0002 Millennium G450 16MB SGRAM + 1705 0003 Millennium G450 32MB + 1705 0004 Millennium G450 16MB + 0527 MGA Parhelia AGP + 102b 0840 Parhelia 128Mb + 102b 0850 Parhelia 256MB AGP 4X + 0528 Parhelia 8X + 102b 1020 Parhelia 128MB + 102b 1030 Parhelia 256 MB Dual DVI + 102b 14e1 Parhelia PCI 256MB + 102b 2021 QID Pro + 0530 MGA G200EV + 0532 MGA G200eW WPCM450 + 1028 0235 PowerEdge R710 MGA G200eW WPCM450 + 1028 0236 PowerEdge R610 MGA G200eW WPCM450 + 1028 0237 PowerEdge T610 MGA G200eW WPCM450 + 1028 0287 PowerEdge M610 MGA G200eW WPCM450 + 1028 028c PowerEdge R410 MGA G200eW WPCM450 + 1028 028d PowerEdge T410 MGA G200eW WPCM450 + 1028 029c PowerEdge M710 MGA G200eW WPCM450 + 0540 M91XX + 102b 2080 M9140 LP PCIe x16 + 102b 2100 M9120 PCIe x16 + 102b 2140 M9125 PCIe x16 + 102b 2180 M9120 Plus LP PCIe x16 + 102b 21c0 M9120 Plus LP PCIe x1 + 102b 2240 M9148 LP PCIe x16 + 102b 2241 M9138 LP PCIe x16 + 0d10 MGA Ultima/Impression + 1000 MGA G100 [Productiva] + 102b ff01 Productiva G100 + 102b ff05 Productiva G100 Multi-Monitor + 1001 MGA G100 [Productiva] AGP + 102b 1001 MGA-G100 AGP + 102b ff00 MGA-G100 AGP + 102b ff01 MGA-G100 Productiva AGP + 102b ff03 Millennium G100 AGP + 102b ff04 MGA-G100 AGP + 102b ff05 MGA-G100 Productiva AGP Multi-Monitor + 110a 001e MGA-G100 AGP + 2007 MGA Mistral + 2527 MGA G550 AGP + 102b 0f83 Millennium G550 + 102b 0f84 Millennium G550 Dual Head DDR 32Mb + 102b 1e41 Millennium G550 +# Clearly the device name should not say AGP anymore... + 102b 2300 Millennium G550 LP PCIE + 2537 Millenium P650/P750 + 102b 1820 Millennium P750 64MB + 102b 1830 Millennium P650 64MB + 102b 1c10 QID 128MB + 102b 2811 Millennium P650 Low-profile PCI 64MB + 102b 2c11 QID Low-profile PCI + 2538 Millenium P650 PCIe + 102b 08c7 Millennium P650 PCIe 128MB + 102b 0907 Millennium P650 PCIe 64MB + 102b 0947 Parhelia APVe + 102b 1047 Millennium P650 LP PCIe 128MB + 102b 1087 Millennium P650 LP PCIe 64MB + 102b 2538 Parhelia APVe + 102b 3007 QID Low-profile PCIe + 2539 Millennium P690 + 4536 VIA Framegrabber + 4cdc Morphis Vision System Jpeg2000 + 4fc5 Morphis Vision System + 5e10 Morphis Vision System Aux/IO + 6573 Shark 10/100 Multiport SwitchNIC +102c Chips and Technologies + 00b8 F64310 + 00c0 F69000 HiQVideo + 102c 00c0 F69000 HiQVideo + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1010 CP5/CR6 mainboard + 4c53 1020 VR6 mainboard + 4c53 1030 PC5 mainboard + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 00d0 F65545 + 00d8 F65545 + 00dc F65548 + 00e0 F65550 + 00e4 F65554 + 00e5 F65555 HiQVPro + 0e11 b049 Armada 1700 Laptop Display Controller + 1179 0001 Satellite Pro/Satellite + 00f0 F68554 + 00f4 F68554 HiQVision + 00f5 F68555 + 0c30 F69030 + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 4c53 1080 CT8 mainboard +102d Wyse Technology Inc. + 50dc 3328 Audio +102e Olivetti Advanced Technology +102f Toshiba America + 0009 r4x00 + 000a TX3927 MIPS RISC PCI Controller + 0020 ATM Meteor 155 + 102f 00f8 ATM Meteor 155 + 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller + 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL + 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939 + 0105 TC86C001 [goku-s] IDE + 0106 TC86C001 [goku-s] USB 1.1 Host + 0107 TC86C001 [goku-s] USB Device Controller + 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller + 0180 TX4927/38 MIPS RISC PCI Controller + 0181 TX4925 MIPS RISC PCI Controller + 0182 TX4937 MIPS RISC PCI Controller + 01b4 Celleb platform IDE interface + 01b5 SCC USB 2.0 EHCI controller + 01b6 SCC USB 1.1 OHCI controller +1030 TMC Research +1031 Miro Computer Products AG + 5601 DC20 ASIC + 5607 Video I/O & motion JPEG compressor + 5631 Media 3D + 6057 MiroVideo DC10/DC30+ +1032 Compaq +1033 NEC Corporation + 0000 Vr4181A USB Host or Function Control Unit + 0001 PCI to 486-like bus Bridge + 0002 PCI to VL98 Bridge + 0003 ATM Controller + 0004 R4000 PCI Bridge + 0005 PCI to 486-like bus Bridge + 0006 PC-9800 Graphic Accelerator + 0007 PCI to UX-Bus Bridge + 0008 PC-9800 Graphic Accelerator + 0009 PCI to PC9800 Core-Graph Bridge + 0016 PCI to VL Bridge + 001a [Nile II] + 0021 Vrc4373 [Nile I] + 0029 PowerVR PCX1 + 002a PowerVR 3D + 002c Star Alpha 2 + 002d PCI to C-bus Bridge + 0035 USB + 1033 0035 Hama USB 2.0 CardBus + 103c 1293 USB add-in card + 103c 1294 USB 2.0 add-in card + 1179 0001 USB + 12ee 7000 Root Hub + 14c2 0105 PTI-205N USB 2.0 Host Controller + 1799 0001 Root Hub + 1931 000a GlobeTrotter Fusion Quad Lite (PPP data) + 1931 000b GlobeTrotter Fusion Quad Lite (GSM data) + 807d 0035 PCI-USB2 (OHCI subsystem) + 003b PCI to C-bus Bridge + 003e NAPCCARD Cardbus Controller + 0046 PowerVR PCX2 [midas] + 005a Vrc5074 [Nile 4] + 0063 Firewarden + 0067 PowerVR Neon 250 Chipset + 1010 0020 PowerVR Neon 250 AGP 32Mb + 1010 0080 PowerVR Neon 250 AGP 16Mb + 1010 0088 PowerVR Neon 250 16Mb + 1010 0090 PowerVR Neon 250 AGP 16Mb + 1010 0098 PowerVR Neon 250 16Mb + 1010 00a0 PowerVR Neon 250 AGP 32Mb + 1010 00a8 PowerVR Neon 250 32Mb + 1010 0120 PowerVR Neon 250 AGP 32Mb + 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr + 0074 56k Voice Modem + 1033 8014 RCV56ACF 56k Voice Modem + 009b Vrc5476 + 00a5 VRC4173 + 00a6 VRC5477 AC97 + 00cd IEEE 1394 [OrangeLink] Host Controller + 12ee 8011 Root hub + 00ce IEEE 1394 Host Controller + 00df Vr4131 + 00e0 USB 2.0 + 12ee 7001 Root hub + 14c2 0205 PTI-205N USB 2.0 Host Controller + 1799 0002 Root Hub + 807d 1043 PCI-USB2 (EHCI subsystem) + 00e7 uPD72873 IEEE1394 OHCI 1.1 2-port Host Controller + 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr + 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2] + 010c VR7701 + 0125 uPD720400 PCI Express - PCI/PCI-X Bridge + 013a Dual Tuner/MPEG Encoder +1034 Framatome Connectors USA Inc. +1035 Comp. & Comm. Research Lab +1036 Future Domain Corp. + 0000 TMC-18C30 [36C70] +1037 Hitachi Micro Systems +1038 AMP, Inc +1039 Silicon Integrated Systems [SiS] + 0001 Virtual PCI-to-PCI bridge (AGP) + 0002 SG86C202 + 0003 SiS AGP Port (virtual PCI-to-PCI bridge) + 0004 PCI-to-PCI bridge + 0006 85C501/2/3 + 0008 SiS85C503/5513 (LPC Bridge) + 0009 ACPI + 000a PCI-to-PCI bridge + 0016 SiS961/2 SMBus Controller + 0018 SiS85C503/5513 (LPC Bridge) + 0180 RAID bus controller 180 SATA/PATA [SiS] + 0181 SATA + 0182 182 SATA/RAID Controller + 1734 1095 D2030-A1 + 0186 AHCI Controller (0106) + 0190 190 Ethernet Adapter + 0191 191 Gigabit Ethernet Adapter + 0200 5597/5598/6326 VGA + 1039 0000 SiS5597 SVGA (Shared RAM) + 0204 82C204 + 0205 SG86C205 + 0300 300/305 PCI/AGP VGA Display Adapter + 107d 2720 Leadtek WinFast VR300 + 0310 315H PCI/AGP VGA Display Adapter + 0315 315 PCI/AGP VGA Display Adapter + 0325 315PRO PCI/AGP VGA Display Adapter + 0330 330 [Xabre] PCI/AGP VGA Display Adapter + 0406 85C501/2 + 0496 85C496 + 0530 530 Host + 0540 540 Host + 0550 550 Host + 0597 5513C + 0601 85C601 + 0620 620 Host + 0630 630 Host + 0633 633 Host + 0635 635 Host + 0645 SiS645 Host & Memory & AGP Controller + 0646 SiS645DX Host & Memory & AGP Controller + 0648 645xx + 0649 SiS649 Host + 0650 650/M650 Host + 0651 651 Host + 0655 655 Host + 0660 660 Host + 0661 661FX/M661FX/M661MX Host + 0662 662 Host + 0671 671MX + 0730 730 Host + 0733 733 Host + 0735 735 Host + 0740 740 Host + 0741 741/741GX/M741 Host + 0745 745 Host + 0746 746 Host + 0755 755 Host + 0760 760/M760 Host + 0761 761/M761 Host + 1734 1099 D2030-A1 Motherboard + 0900 SiS900 PCI Fast Ethernet + 1019 0a14 K7S5A motherboard + 1039 0900 SiS900 10/100 Ethernet Adapter onboard [Asus P4SC-EA] + 1043 8035 CUSI-FX motherboard + 1043 80a7 Motherboard P4S800D-X + 1462 0900 MS-6701 motherboard + 0961 SiS961 [MuTIOL Media IO] + 0962 SiS962 [MuTIOL Media IO] + 0963 SiS963 [MuTIOL Media IO] + 0964 SiS964 [MuTIOL Media IO] + 0965 SiS965 [MuTIOL Media IO] + 0966 SiS966 [MuTIOL Media IO] + 0968 SiS968 [MuTIOL Media IO] + 1180 SATA Controller / IDE mode + 1182 SATA Controller / RAID mode + 1183 SATA Controller / IDE mode + 1184 AHCI Controller / RAID mode + 1185 AHCI IDE Controller (0106) + 3602 83C602 + 5107 5107 + 5300 SiS540 PCI Display Adapter + 5315 550 PCI/AGP VGA Display Adapter + 5401 486 PCI Chipset + 5511 5511/5512 + 5513 5513 [IDE] + 1019 0970 P6STP-FL motherboard + 1039 5513 SiS5513 EIDE Controller (A,B step) + 1043 8035 CUSI-FX motherboard + 1462 7010 MS-6701 motherboard + 1631 5513 GA-8SIML Rev1.0 Motherboard + 1734 1095 D2030-A1 Motherboard + 5517 5517 + 5571 5571 + 5581 5581 Pentium Chipset + 5582 5582 + 5591 5591/5592 Host + 5596 5596 Pentium Chipset + 5597 5597 [SiS5582] + 5600 5600 Host + 6204 Video decoder & MPEG interface + 6205 VGA Controller + 6236 6236 3D-AGP + 6300 630/730 PCI/AGP VGA Display Adapter + 1019 0970 P6STP-FL motherboard + 1043 8035 CUSI-FX motherboard + 6306 530/620 PCI/AGP VGA Display Adapter + 6325 65x/M650/740 PCI/AGP VGA Display Adapter + 1039 6325 SiS 651 onboard [Asus P4SC-EA] + 1631 1004 SiS 651C onboard [Gigabyte GA-8SIML Rev1.0] + 6326 86C326 5598/6326 + 1039 6326 SiS6326 GUI Accelerator + 1092 0a50 SpeedStar A50 + 1092 0a70 SpeedStar A70 + 1092 4910 SpeedStar A70 + 1092 4920 SpeedStar A70 + 10b0 6326 S6110-B (AGP) + 1569 6326 SiS6326 GUI Accelerator + 6330 661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter + 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter + 1043 8113 SiS Real 256E (ASUS P5S800-VM motherboard) + 1458 d000 SiS661FX GUI 2D/3D Accelerator + 1734 1099 D2030-A1 + 6350 770/670 PCIE VGA Display Adapter + 6351 771/671 PCIE VGA Display Adapter + 7001 USB 1.1 Controller + 1019 0a14 K7S5A motherboard + 1039 7000 Onboard USB Controller + 1462 5470 ECS K7SOM+ motherboard + 1462 7010 MS-6701 motherboard + 1734 1095 D2030-A1 Motherboard + 7002 USB 2.0 Controller + 1462 5470 K7SOM+ 5.2C Motherboard + 1462 7010 MS-6701 motherboard + 1509 7002 Onboard USB Controller + 1734 1095 D2030-A1 + 7007 FireWire Controller + 1462 701d MS-6701 + 7012 AC'97 Sound Controller + 1039 7012 SiS 7012 onboard [Asus P4SC-EA] AC'97 Sound Controller + 1043 818f A8S-X Motherboard + 13f6 0300 CMI9739(A) on ECS K7SOM+ motherboard + 1462 5850 MSI 648 Max (MS-6585) + 1462 7010 MS-6701 motherboard + 15bd 1001 DFI 661FX motherboard + 1734 109f D2030-A1 Motherboard +# There are may be different modem codecs here (Intel537 compatible and incompatible) + 7013 AC'97 Modem Controller + 7016 SiS7016 PCI Fast Ethernet Adapter + 1039 7016 SiS7016 10/100 Ethernet Adapter + 7018 SiS PCI Audio Accelerator + 1014 01b6 SiS PCI Audio Accelerator + 1014 01b7 SiS PCI Audio Accelerator + 1019 7018 SiS PCI Audio Accelerator + 1025 000e SiS PCI Audio Accelerator + 1025 0018 SiS PCI Audio Accelerator + 1039 7018 SiS PCI Audio Accelerator + 1043 1453 SiS PCI Audio Accelerator + 1043 800b SiS PCI Audio Accelerator + 1054 7018 SiS PCI Audio Accelerator + 107d 5330 SiS PCI Audio Accelerator + 107d 5350 SiS PCI Audio Accelerator + 1170 3209 SiS PCI Audio Accelerator + 1462 400a SiS PCI Audio Accelerator + 14a4 2089 SiS PCI Audio Accelerator + 14cd 2194 SiS PCI Audio Accelerator + 14ff 1100 SiS PCI Audio Accelerator + 152d 8808 SiS PCI Audio Accelerator + 1558 1103 SiS PCI Audio Accelerator + 1558 2200 SiS PCI Audio Accelerator + 1563 7018 SiS PCI Audio Accelerator + 15c5 0111 SiS PCI Audio Accelerator + 270f a171 SiS PCI Audio Accelerator + a0a0 0022 SiS PCI Audio Accelerator + 7019 SiS7019 Audio Accelerator + 7502 Azalia Audio Controller +103a Seiko Epson Corporation +103b Tatung Corp. Of America +103c Hewlett-Packard Company + 002a NX9000 Notebook + 08bc NX5000 Notebook + 1005 A4977A Visualize EG + 1008 Visualize FX + 1028 Tach TL Fibre Channel Host Adapter + 1029 Tach XL2 Fibre Channel Host Adapter + 107e 000f Interphase 5560 Fibre Channel Adapter + 9004 9210 1Gb/2Gb Family Fibre Channel Controller + 9004 9211 1Gb/2Gb Family Fibre Channel Controller + 102a Tach TS Fibre Channel Host Adapter + 107e 000e Interphase 5540/5541 Fibre Channel Adapter + 9004 9110 1Gb/2Gb Family Fibre Channel Controller + 9004 9111 1Gb/2Gb Family Fibre Channel Controller + 1030 J2585A DeskDirect 10/100VG NIC + 1031 J2585B HP 10/100VG PCI LAN Adapter + 103c 1040 J2973A DeskDirect 10BaseT NIC + 103c 1041 J2585B DeskDirect 10/100VG NIC + 103c 1042 J2970A DeskDirect 10BaseT/2 NIC + 1040 J2973A DeskDirect 10BaseT NIC + 1041 J2585B DeskDirect 10/100 NIC + 1042 J2970A DeskDirect 10BaseT/2 NIC + 1048 Diva Serial [GSP] Multiport UART + 103c 1049 Tosca Console + 103c 104a Tosca Secondary + 103c 104b Maestro SP2 + 103c 1223 Superdome Console + 103c 1226 Keystone SP2 + 103c 1227 Powerbar SP2 + 103c 1282 Everest SP2 + 103c 1301 Diva RMP3 + 1054 PCI Local Bus Adapter + 1064 79C970 PCnet Ethernet Controller + 108b Visualize FXe + 10c1 NetServer Smart IRQ Router + 10ed TopTools Remote Control + 10f0 rio System Bus Adapter + 10f1 rio I/O Controller + 1200 82557B 10/100 NIC + 1219 NetServer PCI Hot-Plug Controller + 121a NetServer SMIC Controller + 121b NetServer Legacy COM Port Decoder + 121c NetServer PCI COM Port Decoder + 1229 zx1 System Bus Adapter + 122a zx1 I/O Controller + 122e PCI-X Local Bus Adapter + 127b sx1000 System Bus Adapter + 127c sx1000 I/O Controller + 1290 Auxiliary Diva Serial Port + 103c 1291 Diva SP2 + 1291 Auxiliary Diva Serial Port + 12b4 zx1 QuickSilver AGP8x Local Bus Adapter + 12eb sx2000 System Bus Adapter + 12ec sx2000 I/O Controller + 12ee PCI-X 2.0 Local Bus Adapter + 12f8 Broadcom BCM4306 802.11b/g Wireless LAN + 12fa BCM4306 802.11b/g Wireless LAN Controller + 1302 RMP-3 Shared Memory Driver + 1303 RMP-3 (Remote Management Processor) + 1361 BCM4312 802.11a/b/g WLAN Controller + 1371 Broadcom Corporation BCM4312 802.11a/b/g (rev 02) + 2910 E2910A PCIBus Exerciser + 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer + 3080 Pavilion ze2028ea + 3085 Realtek RTL8139/8139C/8139C+ + 30b5 Compaq Presario V3000Z + 31fb DL365 ATI ES1000 VGA controller + 3206 Adaptec Embedded Serial ATA HostRAID + 3220 Smart Array P600 + 103c 3225 3 Gb/s SAS RAID + 3230 Smart Array Controller + 103c 3223 Smart Array P800 + 103c 3234 P400 SAS Controller + 103c 3235 P400i SAS Controller + 103c 3237 E500 SAS Controller + 103c 323d P700m SAS Controller + 3238 Smart Array E200i (SAS Controller) + 323a Smart Array G6 controllers + 103c 3241 Smart Array P212 + 103c 3243 Smart Array P410 + 103c 3245 Smart Array P410i + 103c 3247 Smart Array P411 + 103c 3249 Smart Array P812 + 103c 324a HP Smart Array 712m (Mezzanine RAID controller) + 103c 324b Smart Array P711m (Mezzanine RAID controller) +# Will present virtual install media as mass storage, keyboard/mouse from console session, etc. + 3300 Proliant iLO2 virtual USB controller + 3301 iLO3 Serial Port +# Virtual serial port which is presented on a Java applet + 3302 Proliant iLO2 virtual UART + 3305 Proliant iLO2 [Integrated Lights Out] controller + 3306 iLO3 Slave instrumentation & System support + 3307 iLO3 Management Processor Support and Messaging + 3308 iLO3 MS Watchdog Timer + 402f PCIe Root Port + 4030 zx2 System Bus Adapter + 4031 zx2 I/O Controller + 4037 PCIe Local Bus Adapter + 403b PCIe Root Port + 60e8 NetRAID-2M : ZX1/M (OEM AMI MegaRAID 493) +103e Solliday Engineering +103f Synopsys/Logic Modeling Group +1040 Accelgraphics Inc. +1041 Computrend +1042 Micron + 1000 PC Tech RZ1000 + 1001 PC Tech RZ1001 + 3000 Samurai_0 + 3010 Samurai_1 + 3020 Samurai_IDE +1043 ASUSTeK Computer Inc. + 0675 ISDNLink P-IN100-ST-D + 0675 1704 ISDN Adapter (PCI Bus, D, C) + 0675 1707 ISDN Adapter (PCI Bus, DV, W) + 10cf 105e ISDN Adapter (PCI Bus, DV, W) + 0c11 A7N8X Motherboard nForce2 IDE/USB/SMBus + 4015 v7100 SDRAM [GeForce2 MX] + 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner] + 4057 v8200 GeForce 3 + 8043 v8240 PAL 128M [P4T] Motherboard + 8047 v8420 Deluxe [GeForce4 Ti4200] + 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI] + 8095 A7N8X Motherboard nForce2 AC97 Audio + 80ac A7N8X Motherboard nForce2 AGP/Memory + 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out] + 80c5 nForce3 chipset motherboard [SK8N] + 80df v9520 Magic/T + 815a A8N-SLI Motherboard nForce4 SATA + 8168 Realtek PCI-E Gigabit Ethernet Controller (RTL8111B) + 8187 802.11a/b/g Wireless LAN Card + 8188 Tiger Hybrid TV Capture Device +# Found on ASUS M2V motherboard + 81e7 Realtek ALC-660 6-channel CODEC + 81f4 EN7300TC512/TD/128M/A(C262G) [Graphics Card EN7300TC512] + 82ca G96 GeForce 9500 GT + 82e8 M3N72-D +1044 Adaptec (formerly DPT) + 1012 Domino RAID Engine + a400 SmartCache/Raid I-IV Controller + a500 PCI Bridge + a501 SmartRAID V Controller + 1044 c001 PM1554U2 Ultra2 Single Channel + 1044 c002 PM1654U2 Ultra2 Single Channel + 1044 c003 PM1564U3 Ultra3 Single Channel + 1044 c004 PM1564U3 Ultra3 Dual Channel + 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI) + 1044 c00a PM2554U2 Ultra2 Single Channel + 1044 c00b PM2654U2 Ultra2 Single Channel + 1044 c00c PM2664U3 Ultra3 Single Channel + 1044 c00d PM2664U3 Ultra3 Dual Channel + 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI) + 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI) + 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI) + 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI) + 1044 c016 PM3755F Fibre Channel (NON ACPI) + 1044 c01e PM3757U2 Ultra2 Single Channel + 1044 c01f PM3757U2 Ultra2 Dual Channel + 1044 c020 PM3767U3 Ultra3 Dual Channel + 1044 c021 PM3767U3 Ultra3 Quad Channel + 1044 c028 PM2865U3 Ultra3 Single Channel + 1044 c029 PM2865U3 Ultra3 Dual Channel + 1044 c02a PM2865F Fibre Channel + 1044 c03c 2000S Ultra3 Single Channel + 1044 c03d 2000S Ultra3 Dual Channel + 1044 c03e 2000F Fibre Channel + 1044 c046 3000S Ultra3 Single Channel + 1044 c047 3000S Ultra3 Dual Channel + 1044 c048 3000F Fibre Channel + 1044 c050 5000S Ultra3 Single Channel + 1044 c051 5000S Ultra3 Dual Channel + 1044 c052 5000F Fibre Channel + 1044 c05a 2400A UDMA Four Channel + 1044 c05b 2400A UDMA Four Channel DAC + 1044 c064 3010S Ultra3 Dual Channel + 1044 c065 3410S Ultra160 Four Channel + 1044 c066 3010S Fibre Channel + a511 SmartRAID V Controller + 1044 c032 ASR-2005S I2O Zero Channel + 1044 c035 ASR-2010S I2O Zero Channel + c066 3010S Ultra3 Dual Channel +1045 OPTi Inc. + a0f8 82C750 [Vendetta] USB Controller + c101 92C264 + c178 92C178 + c556 82X556 [Viper] + c557 82C557 [Viper-M] + c558 82C558 [Viper-M ISA+IDE] + c567 82C750 [Vendetta], device 0 + c568 82C750 [Vendetta], device 1 + c569 82C579 [Viper XPress+ Chipset] + c621 82C621 [Viper-M/N+] + c700 82C700 [FireStar] + c701 82C701 [FireStar Plus] + c814 82C814 [Firebridge 1] + c822 82C822 + c824 82C824 + c825 82C825 [Firebridge 2] + c832 82C832 + c861 82C861 + c895 82C895 + c935 EV1935 ECTIVA MachOne PCIAudio + d568 82C825 [Firebridge 2] + d721 IDE [FireStar] +1046 IPC Corporation, Ltd. +1047 Genoa Systems Corp +1048 Elsa AG + 0c60 Gladiac MX + 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL] + 1000 QuickStep 1000 + 3000 QuickStep 3000 + 8901 Gloria XL + 1048 0935 GLoria XL (Virge) +1049 Fountain Technologies, Inc. +# nee SGS Thomson Microelectronics +104a STMicroelectronics + 0000 STLS2F Host Bridge + 0008 STG 2000X + 0009 STG 1764X + 0010 STG4000 [3D Prophet Kyro Series] + 0201 STPC Vega Northbridge + 0209 STPC Consumer/Industrial North- and Southbridge + 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge + 020b STPC Consumer II ISA Bridge + 0210 STPC Atlas ISA Bridge + 021a STPC Consumer S Southbridge + 021b STPC Consumer IIA Southbridge + 0220 STPC Industrial PCI to PCCard bridge + 0228 STPC Atlas IDE + 0229 STPC Vega IDE + 0230 STPC Atlas/Vega OHCI USB Controller + 0238 STPC Vega LAN + 0500 ST70137 [Unicorn] ADSL DMT Transceiver + 104a 0500 BeWAN ADSL PCI st + 0564 STPC Client Northbridge + 0981 21x4x DEC-Tulip compatible 10/100 Ethernet + 1746 STG 1764X + 2774 21x4x DEC-Tulip compatible 10/100 Ethernet + 3520 MPEG-II decoder card + 55cc STPC Client Southbridge +104b BusLogic + 0140 BT-946C (old) [multimaster 01] + 1040 BT-946C (BA80C30) [MultiMaster 10] + 8130 Flashpoint LT +104c Texas Instruments + 0500 100 MBit LAN Controller + 0508 TMS380C2X Compressor Interface + 1000 Eagle i/f AS + 104c PCI1510 PC card Cardbus Controller + 3d04 TVP4010 [Permedia] + 3d07 TVP4020 [Permedia 2] + 1011 4d10 Comet + 1040 000f AccelStar II + 1040 0011 AccelStar II + 1048 0a31 WINNER 2000 + 1048 0a32 GLoria Synergy + 1048 0a34 GLoria Synergy + 1048 0a35 GLoria Synergy + 1048 0a36 GLoria Synergy + 1048 0a43 GLoria Synergy + 1048 0a44 GLoria Synergy + 107d 2633 WinFast 3D L2300 + 1092 0126 FIRE GL 1000 PRO + 1092 0127 FIRE GL 1000 PRO + 1092 0136 FIRE GL 1000 PRO + 1092 0141 FIRE GL 1000 PRO + 1092 0146 FIRE GL 1000 PRO + 1092 0148 FIRE GL 1000 PRO + 1092 0149 FIRE GL 1000 PRO + 1092 0152 FIRE GL 1000 PRO + 1092 0154 FIRE GL 1000 PRO + 1092 0155 FIRE GL 1000 PRO + 1092 0156 FIRE GL 1000 PRO + 1092 0157 FIRE GL 1000 PRO + 1097 3d01 Jeronimo Pro + 1102 100f Graphics Blaster Extreme + 3d3d 0100 Reference Permedia 2 3D + 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller + 1443 8003 FireBoard200 + e4bf 1010 CF1-1-SNARE + e4bf 1020 CF1-2-SNARE + 8009 TSB12LV22 IEEE-1394 Controller + 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller + 8017 PCI4410 FireWire Controller + 8019 TSB12LV23 IEEE-1394 Controller + 11bd 000a Studio DV500-1394 + 11bd 000e Studio DV + e4bf 1010 CF2-1-CYMBAL + 8020 TSB12LV26 IEEE-1394 Controller (Link) + 1028 00d8 Precision 530 + 11bd 000f Studio DV500-1394 + 11bd 001c Excalibur 4.1 + 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated) + 104d 80df Vaio PCG-FX403 + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) + 104c 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) + 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) + 103c 088c NC8000 laptop + 1043 808b K8N4-E Mainboard + 1043 815b P5W DH Deluxe Motherboard + 1443 8023 FireCard400 + 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link) + 107d 6620 Winfast DV2000 FireWire Controller + 1443 8024 FireBoard Blue + 1458 1000 GA-EP45-DS5 Motherboard + 8025 TSB82AA2 IEEE-1394b Link Layer Controller + 1458 1000 GA-K8N Ultra-9 Mainboard + 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) + 1025 0035 TravelMate 660 + 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard) + 103c 006a NX9500 + 1043 808d A7V333 mainboard. + 8027 PCI4451 IEEE-1394 Controller + 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100) + 8029 PCI4510 IEEE-1394 Controller + 1028 0163 Latitude D505 + 1028 0196 Inspiron 5160 + 1071 8160 MIM2900 + 802b PCI7410,7510,7610 OHCI-Lynx Controller + 1028 0139 Latitude D400 + 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Latitude D800) + 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller + 1028 018d Inspiron 700m/710m + 8031 PCIxx21/x515 Cardbus Controller + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8032 OHCI Compliant IEEE 1394 Host Controller + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8033 PCIxx21 Integrated FlashMedia Controller + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8034 PCI6411/6421/6611/6621/7411/7421/7611/7621 Secure Digital Controller + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8035 PCI6411/6421/6611/6621/7411/7421/7611/7621 Smart Card Controller + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 8036 PCI6515 Cardbus Controller + 8038 PCI6515 SmartCard Controller + 8039 PCIxx12 Cardbus Controller + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 803a PCIxx12 OHCI Compliant IEEE 1394 Host Controller + 103c 309f nx9420 + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD) + 103c 309f nx9420 + 103c 30a3 Compaq nw8440 + 803c PCIxx12 SDA Standard Compliant SD Host Controller + 103c 309f nx9420 + 103c 30a3 Compaq nw8440 + 803d PCIxx12 GemCore based SmartCard controller + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 nc8430 + 103c 30aa nc6310 + 8101 TSB43DB42 IEEE-1394a-2000 Controller (PHY/Link) + 8201 PCI1620 Firmware Loading Function + 8204 PCI7410,7510,7610 PCI Firmware Loading Function + 1028 0139 Latitude D400 + 1028 014e Latitude D800 + 8231 XIO2000(A)/XIO2200(A) PCI Express-to-PCI Bridge + 8235 XIO2200(A) IEEE-1394a-2000 Controller (PHY/Link) + 823e XIO2213A PCI Express to PCI Bridge + 823f XIO2213A 1394b OHCI with 3-Port PHY + 1546 803c FWB-PCIE1X11B + 8400 ACX 100 22Mbps Wireless Interface + 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus] + 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter + 1395 2201 WL22-PC + 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter + 8401 ACX 100 22Mbps Wireless Interface + 9000 Wireless Interface (of unknown type) + 9065 TMS320DM642 + 9066 ACX 111 54Mbps Wireless Interface + 104c 9066 WL212 Sitecom Wireless Network PCI-Card 100M (Version 1) + 104c 9096 Trendnet TEW-412PC Wireless PCI Adapter (Version A) + 1186 3b04 DWL-G520+ Wireless PCI Adapter + 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN + 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+ + 16ec 010d USR5416 802.11g Wireless Turbo PCI Adapter + 1737 0033 WPC54G Ver.2 802.11G PC Card + 17cf 0033 Z-Com XG650 Wireless miniPCI 802.11b/g + a001 TDC1570 + a100 TDC1561 + a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f + a106 TMS320C6414 TMS320C6415 TMS320C6416 + 175c 5000 ASI50xx Audio Adapter + 175c 6400 ASI6400 Cobranet series + 175c 8700 ASI87xx Radio Tuner card + ac10 PCI1050 + ac11 PCI1053 + ac12 PCI1130 + ac13 PCI1031 + ac15 PCI1131 + ac16 PCI1250 + 1014 0092 ThinkPad 600 + ac17 PCI1220 + ac18 PCI1260 + ac19 PCI1221 + ac1a PCI1210 + ac1b PCI1450 + 0e11 b113 Armada M700 + 1014 0130 ThinkPad A21m/T20/T22 + ac1c PCI1225 + 0e11 b121 Armada E500 + 1028 0088 Latitude CPi A400XT + ac1d PCI1251A + ac1e PCI1211 + ac1f PCI1251B + ac20 TI 2030 + ac21 PCI2031 + ac22 PCI2032 PCI Docking Bridge + ac23 PCI2250 PCI-to-PCI Bridge + ac28 PCI2050 PCI-to-PCI Bridge + ac2c PCI2060 PCI-to-PCI Bridge + ac30 PCI1260 PC card Cardbus Controller + ac40 PCI4450 PC card Cardbus Controller + ac41 PCI4410 PC card Cardbus Controller + ac42 PCI4451 PC card Cardbus Controller + 1028 00e6 PCI4451 PC card CardBus Controller (Inspiron 8100) + ac44 PCI4510 PC card Cardbus Controller + 1028 0149 Inspiron 5100 + 1028 0163 Latitude D505 + 1028 0196 Inspiron 5160 + 1071 8160 MIM2000 + ac46 PCI4520 PC card Cardbus Controller + 1014 0552 ThinkPad + ac47 PCI7510 PC card Cardbus Controller + 1028 0139 Latitude D400 + 1028 013f Precision M60 + 1028 014e Latitude D800 + ac48 PCI7610 PC Card Cardbus Controller + ac49 PCI7410 PC Card Cardbus Controller + ac4a PCI7510,7610 PC card Cardbus Controller + 1028 0139 Latitude D400 + 1028 014e Latitude D800 + ac4b PCI7610 SD/MMC controller + ac4c PCI7610 Memory Stick controller + ac50 PCI1410 PC card Cardbus Controller + ac51 PCI1420 PC card Cardbus Controller + 0e11 004e Evo N600c + 1014 0148 ThinkPad A20m + 1014 023b ThinkPad T23 + 1028 00b1 Latitude C600 + 1028 012a Latitude C640 + 1033 80cd Versa Note VXi + 10cf 1095 Lifebook S-4510/C6155 + e4bf 1000 CP2-2-HIPHOP + ac52 PCI1451 PC card Cardbus Controller + ac53 PCI1421 PC card Cardbus Controller + ac54 PCI1620 PC Card Controller + 103c 08b0 tc1100 tablet + ac55 PCI1520 PC card Cardbus Controller + 1014 0512 ThinkPad T30/T40 + ac56 PCI1510 PC card Cardbus Controller + 1014 0512 ThinkPad R50e + 1014 0528 ThinkPad R40e + 17aa 2012 ThinkPad T60/R60 series + ac60 PCI2040 PCI to DSP Bridge Controller + 175c 5100 ASI51xx Audio Adapter + 175c 6100 ASI61xx Audio Adapter + 175c 6200 ASI62xx Audio Adapter + 175c 8800 ASI88xx Audio Adapter + 186f 3001 WR-G303 PCI radio receiver + 186f 3005 WR-G305 PCI radio receiver + 186f 3101 WR-G313 PCI radio receiver + 186f 3105 WR-G315 PCI radio receiver + ac8d PCI 7620 + ac8e PCI7420 CardBus Controller + 1028 018d Inspiron 700m/710m + ac8f PCI7420/7620 Combo CardBus, 1394a-2000 OHCI and SD/MS-Pro Controller + 1028 018d Inspiron 700m/710m + fe00 FireWire Host Controller + fe03 12C01A FireWire Host Controller +104d Sony Corporation + 8004 DTL-H2500 [Playstation development board] + 8009 CXD1947Q i.LINK Controller + 8039 CXD3222 i.LINK Controller + 8056 Rockwell HCF 56K modem + 808a Memory Stick Controller +104e Oak Technology, Inc + 0017 OTI-64017 + 0107 OTI-107 [Spitfire] + 0109 Video Adapter + 0111 OTI-64111 [Spitfire] + 0217 OTI-64217 + 0317 OTI-64317 +104f Co-time Computer Ltd +1050 Winbond Electronics Corp + 0000 NE2000 + 0001 W83769F + 0033 W89C33D 802.11 a/b/g BB/MAC + 0105 W82C105 + 0840 W89C840 + 1050 0001 W89C840 Ethernet Adapter + 1050 0840 W89C840 Ethernet Adapter + 0940 W89C940 + 5a5a W89C940F + 6692 W6692 + 1043 1702 ISDN Adapter (PCI Bus, D, W) + 1043 1703 ISDN Adapter (PCI Bus, DV, W) + 1043 1707 ISDN Adapter (PCI Bus, DV, W) + 144f 1702 ISDN Adapter (PCI Bus, D, W) + 144f 1703 ISDN Adapter (PCI Bus, DV, W) + 144f 1707 ISDN Adapter (PCI Bus, DV, W) + 9921 W99200F MPEG-1 Video Encoder + 9922 W99200F/W9922PF MPEG-1/2 Video Encoder + 9970 W9970CF +1051 Anigma, Inc. +1052 ?Young Micro Systems +1053 Young Micro Systems +1054 Hitachi, Ltd + 3009 2Gbps Fibre Channel to PCI HBA 3009 + 300a 4Gbps Fibre Channel to PCI-X HBA 300a + 300b 4Gbps Fibre Channel to PCI-X HBA 300b + 300f ColdFusion 3 Chipset Processor to I/O Controller + 3010 ColdFusion 3 Chipset Memory Controller Hub + 3011 ColdFusion 3e Chipset Processor to I/O Controller + 3012 ColdFusion 3e Chipset Memory Controller Hub + 3017 Unassigned Hitachi Shared FC Device 3017 + 301d PCIe-to-PCIe Bridge with Virtualization IO Assist Feature + 3020 FIVE-EX based Fibre Channel to PCIe HBA + 3505 SH7751 PCI Controller (PCIC) + 350e SH7751R PCI Controller (PCIC) +1055 Efar Microsystems + 9130 SLC90E66 [Victory66] IDE + 9460 SLC90E66 [Victory66] ISA + 9462 SLC90E66 [Victory66] USB + 9463 SLC90E66 [Victory66] ACPI + e420 LAN9420/LAN9420i +1056 ICL +# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this. +1057 Motorola + 0001 MPC105 [Eagle] + 0002 MPC106 [Grackle] + 0003 MPC8240 [Kahlua] + 0004 MPC107 + 0006 MPC8245 [Unity] + 0008 MPC8540 + 0009 MPC8560 + 0012 MPC8548 [PowerQUICC III] + 0100 MC145575 [HFC-PCI] + 0431 KTI829c 100VG + 1073 Nokia N770 + 1219 Nokia N800 + 1801 DSP56301 Digital Signal Processor + 14fb 0101 Transas Radar Imitator Board [RIM] + 14fb 0102 Transas Radar Imitator Board [RIM-2] + 14fb 0202 Transas Radar Integrator Board [RIB-2] + 14fb 0611 1 channel CAN bus Controller [CanPci-1] + 14fb 0612 2 channels CAN bus Controller [CanPci-2] + 14fb 0613 3 channels CAN bus Controller [CanPci-3] + 14fb 0614 4 channels CAN bus Controller [CanPci-4] + 14fb 0621 1 channel CAN bus Controller [CanPci2-1] + 14fb 0622 2 channels CAN bus Controller [CanPci2-2] + 14fb 0810 Transas VTS Radar Integrator Board [RIB-4] + 175c 4200 ASI4215 Audio Adapter + 175c 4300 ASI43xx Audio Adapter + 175c 4400 ASI4401 Audio Adapter + ecc0 0010 Darla + ecc0 0020 Gina + ecc0 0030 Layla rev.0 + ecc0 0031 Layla rev.1 + ecc0 0040 Darla24 rev.0 + ecc0 0041 Darla24 rev.1 + ecc0 0050 Gina24 rev.0 + ecc0 0051 Gina24 rev.1 + ecc0 0070 Mona rev.0 + ecc0 0071 Mona rev.1 + ecc0 0072 Mona rev.2 + 18c0 MPC8265A/8266/8272 + 18c1 MPC8271/MPC8272 + 3052 SM56 Data Fax Modem + 3055 SM56 Data Fax Modem + 3410 DSP56361 Digital Signal Processor + ecc0 0050 Gina24 rev.0 + ecc0 0051 Gina24 rev.1 + ecc0 0060 Layla24 + ecc0 0070 Mona rev.0 + ecc0 0071 Mona rev.1 + ecc0 0072 Mona rev.2 + ecc0 0080 Mia rev.0 + ecc0 0081 Mia rev.1 + ecc0 0090 Indigo + ecc0 00a0 Indigo IO + ecc0 00b0 Indigo DJ + ecc0 0100 3G + 4801 Raven + 4802 Falcon + 4803 Hawk + 4806 CPX8216 + 4d68 20268 + 5600 SM56 PCI Modem + 1057 0300 SM56 PCI Speakerphone Modem + 1057 0301 SM56 PCI Voice Modem + 1057 0302 SM56 PCI Fax Modem + 1057 5600 SM56 PCI Voice modem + 13d2 0300 SM56 PCI Speakerphone Modem + 13d2 0301 SM56 PCI Voice modem + 13d2 0302 SM56 PCI Fax Modem + 1436 0300 SM56 PCI Speakerphone Modem + 1436 0301 SM56 PCI Voice modem + 1436 0302 SM56 PCI Fax Modem + 144f 100c SM56 PCI Fax Modem + 1494 0300 SM56 PCI Speakerphone Modem + 1494 0301 SM56 PCI Voice modem + 14c8 0300 SM56 PCI Speakerphone Modem + 14c8 0302 SM56 PCI Fax Modem + 1668 0300 SM56 PCI Speakerphone Modem + 1668 0302 SM56 PCI Fax Modem + 5608 Wildcard X100P + 5803 MPC5200 + 5806 MCF54 Coldfire + 5808 MPC8220 + 5809 MPC5200B + 6400 MPC190 Security Processor (S1 family, encryption) + 6405 MPC184 Security Processor (S1 family) +1058 Electronics & Telecommunications RSH +# Formerly: Teknor Industrial Computers Inc +1059 Kontron +105a Promise Technology, Inc. + 0d30 PDC20265 (FastTrak100 Lite/Ultra100) + 1043 8042 AV7266-E South Bridge Promise RAID + 105a 4d33 Ultra100 + 0d38 20263 + 105a 4d39 Fasttrak66 + 1275 20275 + 3318 PDC20318 (SATA150 TX4) + 3319 PDC20319 (FastTrak S150 TX4) + 8086 3427 S875WP1-E mainboard + 3371 PDC20371 (FastTrak S150 TX2plus) + 3373 PDC20378 (FastTrak 378/SATA 378) + 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard + 1462 590d KT6 Delta-FIS2R (MS-6590) + 1462 702e K8T NEO FIS2R motherboard + 3375 PDC20375 (SATA150 TX2plus) + 3376 PDC20376 (FastTrak 376) + 1043 809e A7V8X motherboard + 3515 PDC40719 [FastTrak TX4300/TX4310] + 3519 PDC40519 (FastTrak TX4200) + 3570 20771 (FastTrak TX2300) + 3571 PDC20571 (FastTrak TX2200) + 3574 PDC20579 SATAII 150 IDE Controller + 3577 PDC40779 (SATA 300 779) + 3d17 PDC40718 (SATA 300 TX4) + 3d18 PDC20518/PDC40518 (SATAII 150 TX4) + 3d73 PDC40775 (SATA 300 TX2plus) + 3d75 PDC20575 (SATAII150 TX2plus) + 3f20 PDC42819 [FastTrak TX2650/TX4650] + 4302 80333 [SuperTrak EX4350] + 4d30 PDC20267 (FastTrak100/Ultra100) + 105a 4d33 Ultra100 + 105a 4d39 FastTrak100 + 8086 5744 S845WD1-E mainboard + 4d33 20246 + 105a 4d33 20246 IDE Controller + 4d38 PDC20262 (FastTrak66/Ultra66) + 105a 4d30 Ultra Device on SuperTrak + 105a 4d33 Ultra66 + 105a 4d39 FastTrak66 + 4d68 PDC20268 (Ultra100 TX2) + 105a 4d68 Ultra100TX2 + 4d69 20269 + 105a 4d68 Ultra133TX2 + 5275 PDC20276 (MBFastTrak133 Lite) + 1043 807e A7V333 motherboard. + 105a 0275 SuperTrak SX6000 IDE + 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode) + 1458 b001 MBUltra 133 + 5300 DC5300 + 6268 PDC20270 (FastTrak100 LP/TX2/TX4) + 105a 4d68 FastTrak100 TX2 + 6269 PDC20271 (FastTrak TX2000) + 105a 6269 FastTrak TX2/TX2000 + 6300 PDC81731 [FastTrak SX8300] + 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite) + 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller + 6624 PDC20621 [FastTrak SX4100] + 6626 PDC20618 (Ultra 618) + 6629 PDC20619 (FastTrak TX4000) + 7275 PDC20277 (SBFastTrak133 Lite) + 8002 SATAII150 SX8 + 8350 80333 [SuperTrak EX8350/EX16350], 80331 [SuperTrak EX8300/EX16300] + 8650 81384 [SuperTrak EX SAS and SATA RAID Controller] + 105a 4600 SuperTrak EX4650A + 105a 4601 SuperTrak EX4650 + 105a 4610 SuperTrak EX4650EL + 105a 8600 SuperTrak EX8650EL + 105a 8601 SuperTrak EX8650A + 105a 8602 SuperTrak EX8654 + 105a 8603 SuperTrak EX8658 + 105a 8604 SuperTrak EX8650 + 105a 8610 SuperTrak EX8650M + 105a a600 SuperTrak EX12650 + 105a b600 SuperTrak EX16650 + 105a b601 SuperTrak EX16654 + 105a b602 SuperTrak EX16658 + 8760 PM8010 [SuperTrak EX SAS and SATA 6G RAID Controller] + c350 80333 [SuperTrak EX12350] + e350 80333 [SuperTrak EX24350] +105b Foxconn International, Inc. + 0c4d SiS AC'97 Sound Controller +105c Wipro Infotech Limited +105d Number 9 Computer Company + 2309 Imagine 128 + 2339 Imagine 128-II + 105d 0000 Imagine 128 series 2 4Mb VRAM + 105d 0001 Imagine 128 series 2 4Mb VRAM + 105d 0002 Imagine 128 series 2 4Mb VRAM + 105d 0003 Imagine 128 series 2 4Mb VRAM + 105d 0004 Imagine 128 series 2 4Mb VRAM + 105d 0005 Imagine 128 series 2 4Mb VRAM + 105d 0006 Imagine 128 series 2 4Mb VRAM + 105d 0007 Imagine 128 series 2 4Mb VRAM + 105d 0008 Imagine 128 series 2e 4Mb DRAM + 105d 0009 Imagine 128 series 2e 4Mb DRAM + 105d 000a Imagine 128 series 2 8Mb VRAM + 105d 000b Imagine 128 series 2 8Mb H-VRAM + 11a4 000a Barco Metheus 5 Megapixel + 13cc 0000 Barco Metheus 5 Megapixel + 13cc 0004 Barco Metheus 5 Megapixel + 13cc 0005 Barco Metheus 5 Megapixel + 13cc 0006 Barco Metheus 5 Megapixel + 13cc 0008 Barco Metheus 5 Megapixel + 13cc 0009 Barco Metheus 5 Megapixel + 13cc 000a Barco Metheus 5 Megapixel + 13cc 000c Barco Metheus 5 Megapixel + 493d Imagine 128 T2R [Ticket to Ride] + 11a4 000a Barco Metheus 5 Megapixel, Dual Head + 11a4 000b Barco Metheus 5 Megapixel, Dual Head + 13cc 0002 Barco Metheus 4 Megapixel, Dual Head + 13cc 0003 Barco Metheus 5 Megapixel, Dual Head + 13cc 0007 Barco Metheus 5 Megapixel, Dual Head + 13cc 0008 Barco Metheus 5 Megapixel, Dual Head + 13cc 0009 Barco Metheus 5 Megapixel, Dual Head + 13cc 000a Barco Metheus 5 Megapixel, Dual Head + 5348 Revolution 4 + 105d 0037 Revolution IV-FP AGP (For SGI 1600SW) + 11a4 0028 PVS5600M + 11a4 0038 PVS5600D +105e Vtech Computers Ltd +105f Infotronic America Inc +1060 United Microelectronics [UMC] + 0001 UM82C881 + 0002 UM82C886 + 0101 UM8673F + 0881 UM8881 + 0886 UM8886F + 0891 UM8891A + 1001 UM886A + 673a UM8886BF + 673b EIDE Master/DMA + 8710 UM8710 + 886a UM8886A + 8881 UM8881F + 8886 UM8886F + 888a UM8886A + 8891 UM8891A + 9017 UM9017F + 9018 UM9018 + 9026 UM9026 + e881 UM8881N + e886 UM8886N + e88a UM8886N + e891 UM8891N +1061 I.I.T. + 0001 AGX016 + 0002 IIT3204/3501 +1062 Maspar Computer Corp +1063 Ocean Office Automation +1064 Alcatel + 1102 Dynamite 2840 (ADSL PCI modem) +1065 Texas Microsystems +1066 PicoPower Technology + 0000 PT80C826 + 0001 PT86C521 [Vesuvius v1] Host Bridge + 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master + 0003 PT86C524 [Nile] PCI-to-PCI Bridge + 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge + 0005 National PC87550 System Controller + 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave +1067 Mitsubishi Electric + 0301 AccelGraphics AccelECLIPSE + 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] + 0308 Tornado 3000 [OEM Evans & Sutherland] + 1002 VG500 [VolumePro Volume Rendering Accelerator] +1068 Diversified Technology +1069 Mylex Corporation + 0001 DAC960P + 0002 DAC960PD + 0010 DAC960PG + 0020 DAC960LA + 0050 AcceleRAID 352/170/160 support Device + 1069 0050 AcceleRAID 352 support Device + 1069 0052 AcceleRAID 170 support Device + 1069 0054 AcceleRAID 160 support Device + b166 AcceleRAID 600/500/400/Sapphire support Device + 1014 0242 iSeries 2872 DASD IOA + 1014 0266 Dual Channel PCI-X U320 SCSI Adapter + 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter + 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter + 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter + 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID + 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID + 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID + 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID + ba55 eXtremeRAID 1100 support Device + ba56 eXtremeRAID 2000/3000 support Device + 1069 0030 eXtremeRAID 3000 support Device + 1069 0040 eXtremeRAID 2000 support Device + ba57 eXtremeRAID 4000/5000 support Device + 1069 0072 eXtremeRAID 5000 support Device +106a Aten Research Inc +106b Apple Computer Inc. + 0001 Bandit PowerPC host bridge + 0002 Grand Central I/O + 0003 Control Video + 0004 PlanB Video-In + 0007 O'Hare I/O + 000c DOS on Mac + 000e Hydra Mac I/O + 0010 Heathrow Mac I/O + 0017 Paddington Mac I/O + 0018 UniNorth FireWire + 0019 KeyLargo USB + 001e UniNorth Internal PCI + 001f UniNorth PCI + 0020 UniNorth AGP + 0021 UniNorth GMAC (Sun GEM) + 0022 KeyLargo Mac I/O + 0024 UniNorth/Pangea GMAC (Sun GEM) + 0025 KeyLargo/Pangea Mac I/O + 0026 KeyLargo/Pangea USB + 0027 UniNorth/Pangea AGP + 0028 UniNorth/Pangea PCI + 0029 UniNorth/Pangea Internal PCI + 002d UniNorth 1.5 AGP + 002e UniNorth 1.5 PCI + 002f UniNorth 1.5 Internal PCI + 0030 UniNorth/Pangea FireWire + 0031 UniNorth 2 FireWire + 106b 5811 iBook G4 2004 + 0032 UniNorth 2 GMAC (Sun GEM) + 0033 UniNorth 2 ATA/100 + 0034 UniNorth 2 AGP + 0035 UniNorth 2 PCI + 0036 UniNorth 2 Internal PCI + 003b UniNorth/Intrepid ATA/100 + 003e KeyLargo/Intrepid Mac I/O + 003f KeyLargo/Intrepid USB + 0040 K2 KeyLargo USB + 0041 K2 KeyLargo Mac/IO + 0042 K2 FireWire + 0043 K2 ATA/100 + 0045 K2 HT-PCI Bridge + 0046 K2 HT-PCI Bridge + 0047 K2 HT-PCI Bridge + 0048 K2 HT-PCI Bridge + 0049 K2 HT-PCI Bridge + 004a CPC945 HT Bridge + 004b U3 AGP + 004c K2 GMAC (Sun GEM) + 004f Shasta Mac I/O + 0050 Shasta IDE + 0051 Shasta (Sun GEM) + 0052 Shasta Firewire + 0053 Shasta PCI Bridge + 0054 Shasta PCI Bridge + 0055 Shasta PCI Bridge + 0056 U4 PCIe + 0057 U3 HT Bridge + 0058 U3L AGP Bridge + 0059 U3H AGP Bridge + 005b CPC945 PCIe Bridge + 0066 Intrepid2 AGP Bridge + 0067 Intrepid2 PCI Bridge + 0068 Intrepid2 PCI Bridge + 0069 Intrepid2 ATA/100 + 006a Intrepid2 Firewire + 006b Intrepid2 GMAC (Sun GEM) + 0074 U4 HT Bridge + 1645 Tigon3 Gigabit Ethernet NIC (BCM5701) +106c Hynix Semiconductor + 8801 Dual Pentium ISA/PCI Motherboard + 8802 PowerPC ISA/PCI Motherboard + 8803 Dual Window Graphics Accelerator + 8804 LAN Controller + 8805 100-BaseT LAN +106d Sequent Computer Systems +106e DFI, Inc +106f City Gate Development Ltd +1070 Daewoo Telecom Ltd +1071 Mitac + 8160 Mitac 8060B Mobile Platform +1072 GIT Co Ltd +1073 Yamaha Corporation + 0001 3D GUI Accelerator + 0002 YGV615 [RPA3 3D-Graphics Controller] + 0003 YMF-740 + 0004 YMF-724 + 1073 0004 YMF724-Based PCI Audio Adapter + 0005 DS1 Audio + 1073 0005 DS-XG PCI Audio CODEC + 0006 DS1 Audio + 0008 DS1 Audio + 1073 0008 DS-XG PCI Audio CODEC + 000a DS1L Audio + 1073 0004 DS-XG PCI Audio CODEC + 1073 000a DS-XG PCI Audio CODEC + 000c YMF-740C [DS-1L Audio Controller] + 107a 000c DS-XG PCI Audio CODEC + 000d YMF-724F [DS-1 Audio Controller] + 1073 000d DS-XG PCI Audio CODEC + 0010 YMF-744B [DS-1S Audio Controller] + 1073 0006 DS-XG PCI Audio CODEC + 1073 0010 DS-XG PCI Audio CODEC + 0012 YMF-754 [DS-1E Audio Controller] + 1073 0012 DS-XG PCI Audio Codec + 0020 DS-1 Audio + 1000 SW1000XG [XG Factory] + 2000 DS2416 Digital Mixing Card + 1073 2000 DS2416 Digital Mixing Card +1074 NexGen Microsystems + 4e78 82c500/1 +1075 Advanced Integrations Research +1076 Chaintech Computer Co. Ltd +1077 QLogic Corp. + 1016 ISP10160 Single Channel Ultra3 SCSI Processor + 1020 ISP1020 Fast-wide SCSI + 1022 ISP1022 Fast-wide SCSI + 1080 ISP1080 SCSI Host Adapter + 1216 ISP12160 Dual Channel Ultra3 SCSI Processor + 101e 8471 QLA12160 on AMI MegaRAID + 101e 8493 QLA12160 on AMI MegaRAID + 1240 ISP1240 SCSI Host Adapter + 1280 ISP1280 SCSI Host Adapter + 2020 ISP2020A Fast!SCSI Basic Adapter + 2100 QLA2100 64-bit Fibre Channel Adapter + 1077 0001 QLA2100 64-bit Fibre Channel Adapter + 2200 QLA2200 64-bit Fibre Channel Adapter + 1077 0002 QLA2200 + 2300 QLA2300 64-bit Fibre Channel Adapter + 2312 ISP2312-based 2Gb Fibre Channel to PCI-X HBA + 103c 0131 2Gb Fibre Channel - Single port [A7538A] + 103c 12ba 2Gb Fibre Channel - Dual port [A6826A] + 2322 ISP2322-based 2Gb Fibre Channel to PCI-X HBA + 2422 ISP2422-based 4Gb Fibre Channel to PCI-X HBA + 103c 12d7 4Gb Fibre Channel [AB379A] + 103c 12dd 4Gb Fibre Channel [AB429A] + 2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA + 2532 ISP2532-based 8Gb Fibre Channel to PCI Express HBA + 3022 ISP4022-based Ethernet NIC + 3032 ISP4032-based Ethernet IPv6 NIC + 4010 ISP4010-based iSCSI TOE HBA + 4022 ISP4022-based iSCSI TOE HBA + 4032 ISP4032-based iSCSI TOE IPv6 HBA + 5432 SP232-based 4Gb Fibre Channel to PCI Express HBA + 6312 SP202-based 2Gb Fibre Channel to PCI-X HBA + 6322 SP212-based 2Gb Fibre Channel to PCI-X HBA + 7220 IBA7220 InfiniBand HCA + 7322 IBA7322 QDR InfiniBand HCA + 8000 10GbE Converged Network Adapter (TCP/IP Networking) + 8001 10GbE Converged Network Adapter (FCoE) + 8432 ISP2432M-based 10GbE Converged Network Adapter (CNA) +1078 Cyrix Corporation + 0000 5510 [Grappa] + 0001 PCI Master + 0002 5520 [Cognac] + 0100 5530 Legacy [Kahlua] + 0101 5530 SMI [Kahlua] + 0102 5530 IDE [Kahlua] + 0103 5530 Audio [Kahlua] + 0104 5530 Video [Kahlua] + 0400 ZFMicro PCI Bridge + 0401 ZFMicro Chipset SMI + 0402 ZFMicro Chipset IDE + 0403 ZFMicro Expansion Bus +1079 I-Bus +107a NetWorth +107b Gateway 2000 +107c LG Electronics [Lucky Goldstar Co. Ltd] +107d LeadTek Research Inc. + 0000 P86C850 + 204d [GeForce 7800 GTX] Winfast PX7800 GTX TDH + 2134 WinFast 3D S320 II + 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo + 6609 Winfast TV 2000 XP RM + 6654 Conexant CX23883 [WinFast DTV1800 H] +107e Interphase Corporation + 0001 5515 ATM Adapter [Flipper] + 0002 100 VG AnyLan Controller + 0004 5526 Fibre Channel Host Adapter + 0005 x526 Fibre Channel Host Adapter + 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic] + 9003 5535-4P-BRI-ST + 9007 5535-4P-BRI-U + 9008 5535-1P-SR + 900c 5535-1P-SR-ST + 900e 5535-1P-SR-U + 9011 5535-1P-PRI + 9013 5535-2P-PRI + 9023 5536-4P-BRI-ST + 9027 5536-4P-BRI-U + 9031 5536-1P-PRI + 9033 5536-2P-PRI +107f Data Technology Corporation + 0802 SL82C105 +1080 Contaq Microsystems + 0600 82C599 + c691 Cypress CY82C691 + c693 82c693 +1081 Supermac Technology + 0d47 Radius PCI to NuBUS Bridge +1082 EFA Corporation of America +1083 Forex Computer Corporation + 0001 FR710 +1084 Parador +1085 Tulip Computers Int.B.V. +1086 J. Bond Computer Systems +1087 Cache Computer +1088 Microcomputer Systems (M) Son +1089 Data General Corporation +# Formerly Bit3 Computer Corp. +108a SBS Technologies + 0001 VME Bridge Model 617 + 0010 VME Bridge Model 618 + 0040 dataBLIZZARD + 3000 VME Bridge Model 2706 +108c Oakleigh Systems Inc. +108d Olicom + 0001 Token-Ring 16/4 PCI Adapter (3136/3137) + 0002 16/4 Token Ring + 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter + 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter + 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card + 0006 OC-3530 RapidFire Token-Ring 100 + 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter + 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter + 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter + 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter + 0011 OC-2315 + 0012 OC-2325 + 0013 OC-2183/2185 + 0014 OC-2326 + 0019 OC-2327/2250 10/100 Ethernet Adapter + 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter + 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter + 0021 OC-6151/6152 [RapidFire ATM 155] + 0022 ATM Adapter +108e Sun Microsystems Computer Corp. + 0001 EBUS + 1000 EBUS + 1001 Happy Meal 10/100 Ethernet [hme] + 1100 RIO EBUS + 108e 1100 RIO EBUS on Blade 100 motherboard +# Correction + 1101 RIO 10/100 Ethernet [eri] + 108e 1101 RIO GEM on Blade 100 motherboard + 1102 RIO 1394 + 108e 1102 RIO 1394 on Blade 100 motherboard + 1103 RIO USB + 108e 1103 RIO USB on Blade 100 motherboard + 1647 Broadcom 570x 10/100/1000 Ethernet [bge] + 1648 Broadcom 570x 10/100/1000 Ethernet [bge] + 16a7 Broadcom 570x 10/100/1000 Ethernet [bge] + 16a8 Broadcom 570x 10/100/1000 Ethernet [bge] + 2bad GEM 10/100/1000 Ethernet [ge] + 5000 Simba Advanced PCI Bridge + 108e 5000 Netra AX1105-500 + 5043 SunPCI Co-processor + 5ca0 Crypto Accelerator 6000 [mca] + 6300 Intel 21554 PCI-PCI bus bridge [db21554] + 6301 Intel 21554 PCI-PCI bus bridge [db21554] + 6302 Intel 21554 PCI-PCI bus bridge [db21554] + 6303 Intel 21554 PCI-PCI bus bridge [db21554] + 6310 Intel 21554 PCI-PCI bus bridge [db21554] + 6311 Intel 21554 PCI-PCI bus bridge [db21554] + 6312 Intel 21554 PCI-PCI bus bridge [db21554] + 6313 Intel 21554 PCI-PCI bus bridge [db21554] + 6320 Intel 21554 PCI-PCI bus bridge [db21554] + 6323 Intel 21554 PCI-PCI bus bridge [db21554] + 6330 Intel 21554 PCI-PCI bus bridge [db21554] + 6331 Intel 21554 PCI-PCI bus bridge [db21554] + 6332 Intel 21554 PCI-PCI bus bridge [db21554] + 6333 Intel 21554 PCI-PCI bus bridge [db21554] + 6340 Intel 21554 PCI-PCI bus bridge [db21554] + 6343 Intel 21554 PCI-PCI bus bridge [db21554] + 6350 Intel 21554 PCI-PCI bus bridge [db21554] + 6353 Intel 21554 PCI-PCI bus bridge [db21554] + 6722 Intel 21554 PCI-PCI bus bridge [db21554] + 676e SunPCiIII + 7063 SunPCiII / SunPCiIIpro + 8000 Psycho PCI Bus Module + 8001 Schizo PCI Bus Module + 8002 Schizo+ PCI Bus Module + 80f0 PCIe switch [px] + 80f8 PCIe switch [px] + 9010 PCIe/PCI bridge switch [pxb_plx] + 9020 PCIe/PCI bridge switch [pxb_plx] + 9102 Davicom Fast Ethernet driver for Davicom DM9102A [dmfe] + a000 Psycho UPA-PCI Bus Module [pcipsy] + a001 Psycho UPA-PCI Bus Module [pcipsy] + 108e a001 Ultra IIe on Blade 100 motherboard + a801 Schizo Fireplane-PCI bus bridge module [pcisch] + abba Cassini 10/100/1000 + abcd Multithreaded 10-Gigabit Ethernet Network Controller + c416 Sun Fire System/System Controller Interface chip [sbbc] +108f Systemsoft +1090 Compro Computer Services, Inc. + 4610 PCI RTOM + 4620 GPIO HSD +1091 Intergraph Corporation + 0020 3D graphics processor + 0021 3D graphics processor w/Texturing + 0040 3D graphics frame buffer + 0041 3D graphics frame buffer + 0060 Proprietary bus bridge + 00e4 Powerstorm 4D50T + 0720 Motion JPEG codec + 0780 Intense3D Wildcat 3410 (MSMT496) + 07a0 Sun Expert3D-Lite Graphics Accelerator + 1091 Sun Expert3D Graphics Accelerator +1092 Diamond Multimedia Systems + 0028 Viper V770 + 1092 4a00 Viper V770 32MB + 00a0 Speedstar Pro SE + 00a8 Speedstar 64 + 0550 Viper V550 + 08d4 Supra 2260 Modem + 094c SupraExpress 56i Pro + 1001 Video Crunch It 1001 capture card + 1092 Viper V330 + 6120 Maximum DVD + 8810 Stealth SE + 8811 Stealth 64/SE + 8880 Stealth + 8881 Stealth + 88b0 Stealth 64 + 88b1 Stealth 64 + 88c0 Stealth 64 + 88c1 Stealth 64 + 88d0 Stealth 64 + 88d1 Stealth 64 + 88f0 Stealth 64 + 88f1 Stealth 64 + 9999 DMD-I0928-1 "Monster sound" sound chip +1093 National Instruments + 0160 PCI-DIO-96 + 0162 PCI-MIO-16XE-50 + 1150 PCI-DIO-32HS High Speed Digital I/O Board + 1170 PCI-MIO-16XE-10 + 1180 PCI-MIO-16E-1 + 1190 PCI-MIO-16E-4 + 1310 PCI-6602 + 1330 PCI-6031E + 1350 PCI-6071E + 14e0 PCI-6110 + 14f0 PCI-6111 + 17d0 PCI-6503 + 1870 PCI-6713 + 1880 PCI-6711 + 18b0 PCI-6052E + 2410 PCI-6733 + 2890 PCI-6036E + 2a60 PCI-6023E + 2a70 PCI-6024E + 2a80 PCI-6025E + 2c80 PCI-6035E + 2ca0 PCI-6034E + 70a9 PCI-6528 (Digital I/O at 60V) + 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ] + 7144 PXI-5124 (12-bit 200 MS/s Digitizer) + b001 IMAQ-PCI-1408 + b011 IMAQ-PXI-1408 + b021 IMAQ-PCI-1424 + b031 IMAQ-PCI-1413 + b041 IMAQ-PCI-1407 + b051 IMAQ-PXI-1407 + b061 IMAQ-PCI-1411 + b071 IMAQ-PCI-1422 + b081 IMAQ-PXI-1422 + b091 IMAQ-PXI-1411 + c801 PCI-GPIB + c831 PCI-GPIB bridge +1094 First International Computers [FIC] +# nee CMD Technology Inc +1095 Silicon Image, Inc. + 0240 Adaptec AAR-1210SA SATA HostRAID Controller + 0640 PCI0640 + 0643 PCI0643 + 0646 PCI0646 + 0647 PCI0647 + 0648 PCI0648 + 1043 8025 CUBX motherboard + 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller + 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller + 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller + 101e 0649 AMI MegaRAID IDE 100 Controller + 0650 PBC0650A + 0670 USB0670 + 1095 0670 USB0670 + 0673 USB0673 + 0680 PCI0680 Ultra ATA-133 Host Controller + 1095 0680 SiI 0680 ATA/133 Controller + 1095 3680 Winic W-680 (Silicon Image 680 based) + 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller + 1095 3112 SiI 3112 SATALink Controller + 1095 6112 SiI 3112 SATARaid Controller + 9005 0250 SATAConnect 1205SA Host Controller + 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller + 1095 3114 SiI 3114 SATALink Controller + 1095 6114 SiI 3114 SATARaid Controller + 3124 SiI 3124 PCI-X Serial ATA Controller + 1095 3124 SiI 3124 PCI-X Serial ATA Controller + 3132 SiI 3132 Serial ATA Raid II Controller + 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller + 1095 3512 SiI 3512 SATALink Controller + 1095 6512 SiI 3512 SATARaid Controller + 3531 Sil 3531 [SATALink/SATARaid] Serial ATA Controller +1096 Alacron +1097 Appian Technology +1098 Quantum Designs (H.K.) Ltd + 0001 QD-8500 + 0002 QD-8580 +1099 Samsung Electronics Co., Ltd +109a Packard Bell +109b Gemlight Computer Ltd. +109c Megachips Corporation +109d Zida Technologies Ltd. +109e Brooktree Corporation + 032e Bt878 Video Capture + 0350 Bt848 Video Capture + 0351 Bt849A Video capture + 0369 Bt878 Video Capture + 1002 0001 TV-Wonder + 1002 0003 TV-Wonder/VE + 036c Bt879(??) Video Capture + 13e9 0070 Win/TV (Video Section) + 036e Bt878 Video Capture + 0070 13eb WinTV Series + 0070 ff01 Viewcast Osprey 200 + 0071 0101 DigiTV PCI + 107d 6606 WinFast TV 2000 + 11bd 0012 PCTV pro (TV + FM stereo receiver) + 11bd 001c PCTV Sat (DBC receiver) + 127a 0001 Bt878 Mediastream Controller NTSC + 127a 0002 Bt878 Mediastream Controller PAL BG + 127a 0003 Bt878a Mediastream Controller PAL BG + 127a 0048 Bt878/832 Mediastream Controller + 144f 3000 MagicTView CPH060 - Video + 1461 0002 TV98 Series (TV/No FM/Remote) + 1461 0003 AverMedia UltraTV PCI 350 + 1461 0004 AVerTV WDM Video Capture + 1461 0761 AverTV DVB-T + 1461 0771 AverMedia AVerTV DVB-T 771 + 14f1 0001 Bt878 Mediastream Controller NTSC + 14f1 0002 Bt878 Mediastream Controller PAL BG + 14f1 0003 Bt878a Mediastream Controller PAL BG + 14f1 0048 Bt878/832 Mediastream Controller + 1822 0001 VisionPlus DVB card + 1851 1850 FlyVideo'98 - Video + 1851 1851 FlyVideo II + 1852 1852 FlyVideo'98 - Video (with FM Tuner) + 18ac d500 DViCO FusionHDTV5 Lite + 270f fc00 Digitop DTT-1000 + bd11 1200 PCTV pro (TV + FM stereo receiver) + 036f Bt879 Video Capture + 127a 0044 Bt879 Video Capture NTSC + 127a 0122 Bt879 Video Capture PAL I + 127a 0144 Bt879 Video Capture NTSC + 127a 0222 Bt879 Video Capture PAL BG + 127a 0244 Bt879a Video Capture NTSC + 127a 0322 Bt879 Video Capture NTSC + 127a 0422 Bt879 Video Capture NTSC + 127a 1122 Bt879 Video Capture PAL I + 127a 1222 Bt879 Video Capture PAL BG + 127a 1322 Bt879 Video Capture NTSC + 127a 1522 Bt879a Video Capture PAL I + 127a 1622 Bt879a Video Capture PAL BG + 127a 1722 Bt879a Video Capture NTSC + 14f1 0044 Bt879 Video Capture NTSC + 14f1 0122 Bt879 Video Capture PAL I + 14f1 0144 Bt879 Video Capture NTSC + 14f1 0222 Bt879 Video Capture PAL BG + 14f1 0244 Bt879a Video Capture NTSC + 14f1 0322 Bt879 Video Capture NTSC + 14f1 0422 Bt879 Video Capture NTSC + 14f1 1122 Bt879 Video Capture PAL I + 14f1 1222 Bt879 Video Capture PAL BG + 14f1 1322 Bt879 Video Capture NTSC + 14f1 1522 Bt879a Video Capture PAL I + 14f1 1622 Bt879a Video Capture PAL BG + 14f1 1722 Bt879a Video Capture NTSC + 1851 1850 FlyVideo'98 - Video + 1851 1851 FlyVideo II + 1852 1852 FlyVideo'98 - Video (with FM Tuner) + 0370 Bt880 Video Capture + 1851 1850 FlyVideo'98 + 1851 1851 FlyVideo'98 EZ - video + 1852 1852 FlyVideo'98 (with FM Tuner) + 0878 Bt878 Audio Capture + 0070 13eb WinTV Series + 0070 ff01 Viewcast Osprey 200 + 0071 0101 DigiTV PCI + 1002 0001 TV-Wonder + 1002 0003 TV-Wonder/VE + 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section) + 11bd 001c PCTV Sat (DBC receiver) + 127a 0001 Bt878 Video Capture (Audio Section) + 127a 0002 Bt878 Video Capture (Audio Section) + 127a 0003 Bt878 Video Capture (Audio Section) + 127a 0048 Bt878 Video Capture (Audio Section) + 13e9 0070 Win/TV (Audio Section) + 144f 3000 MagicTView CPH060 - Audio + 1461 0002 Avermedia PCTV98 Audio Capture + 1461 0003 UltraTV PCI 350 + 1461 0004 AVerTV WDM Audio Capture + 1461 0761 AVerTV DVB-T + 1461 0771 AverMedia AVerTV DVB-T 771 + 14f1 0001 Bt878 Video Capture (Audio Section) + 14f1 0002 Bt878 Video Capture (Audio Section) + 14f1 0003 Bt878 Video Capture (Audio Section) + 14f1 0048 Bt878 Video Capture (Audio Section) + 1822 0001 VisionPlus DVB Card + 18ac d500 DViCO FusionHDTV5 Lite + 270f fc00 Digitop DTT-1000 + bd11 1200 PCTV pro (TV + FM stereo receiver, audio section) + 0879 Bt879 Audio Capture + 127a 0044 Bt879 Video Capture (Audio Section) + 127a 0122 Bt879 Video Capture (Audio Section) + 127a 0144 Bt879 Video Capture (Audio Section) + 127a 0222 Bt879 Video Capture (Audio Section) + 127a 0244 Bt879 Video Capture (Audio Section) + 127a 0322 Bt879 Video Capture (Audio Section) + 127a 0422 Bt879 Video Capture (Audio Section) + 127a 1122 Bt879 Video Capture (Audio Section) + 127a 1222 Bt879 Video Capture (Audio Section) + 127a 1322 Bt879 Video Capture (Audio Section) + 127a 1522 Bt879 Video Capture (Audio Section) + 127a 1622 Bt879 Video Capture (Audio Section) + 127a 1722 Bt879 Video Capture (Audio Section) + 14f1 0044 Bt879 Video Capture (Audio Section) + 14f1 0122 Bt879 Video Capture (Audio Section) + 14f1 0144 Bt879 Video Capture (Audio Section) + 14f1 0222 Bt879 Video Capture (Audio Section) + 14f1 0244 Bt879 Video Capture (Audio Section) + 14f1 0322 Bt879 Video Capture (Audio Section) + 14f1 0422 Bt879 Video Capture (Audio Section) + 14f1 1122 Bt879 Video Capture (Audio Section) + 14f1 1222 Bt879 Video Capture (Audio Section) + 14f1 1322 Bt879 Video Capture (Audio Section) + 14f1 1522 Bt879 Video Capture (Audio Section) + 14f1 1622 Bt879 Video Capture (Audio Section) + 14f1 1722 Bt879 Video Capture (Audio Section) + 0880 Bt880 Audio Capture + 2115 BtV 2115 Mediastream controller + 2125 BtV 2125 Mediastream controller + 2164 BtV 2164 + 2165 BtV 2165 + 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC) + 8472 Bt8472 + 8474 Bt8474 +109f Trigem Computer Inc. +10a0 Meidensha Corporation +10a1 Juko Electronics Ind. Co. Ltd +10a2 Quantum Corporation +10a3 Everex Systems Inc +10a4 Globe Manufacturing Sales +10a5 Smart Link Ltd. + 3052 SmartPCI562 56K Modem + 5449 SmartPCI561 modem +10a6 Informtech Industrial Ltd. +10a7 Benchmarq Microelectronics +10a8 Sierra Semiconductor + 0000 STB Horizon 64 +10a9 Silicon Graphics, Inc. + 0001 Crosstalk to PCI Bridge + 0002 Linc I/O controller + 0003 IOC3 I/O controller + 0004 O2 MACE + 0005 RAD Audio + 0006 HPCEX + 0007 RPCEX + 0008 DiVO VIP + 0009 AceNIC Gigabit Ethernet + 10a9 8002 AceNIC Gigabit Ethernet + 0010 AMP Video I/O + 0011 GRIP + 0012 SGH PSHAC GSN + 0208 SSIM1 SAS Adapter + 1001 Magic Carpet + 1002 Lithium + 1003 Dual JPEG 1 + 1004 Dual JPEG 2 + 1005 Dual JPEG 3 + 1006 Dual JPEG 4 + 1007 Dual JPEG 5 + 1008 Cesium + 100a IOC4 I/O controller + 1504 SSIM1 Fibre Channel Adapter + 2001 Fibre Channel + 2002 ASDE + 4001 TIO-CE PCI Express Bridge + 4002 TIO-CE PCI Express Port + 8001 O2 1394 + 8002 G-net NT + 8010 Broadcom e-net [SGI IO9/IO10 BaseIO] + 8018 Broadcom e-net [SGI A330 Server BaseIO] +10aa ACC Microelectronics + 0000 ACCM 2188 + 2051 2051 CPU bridge + 5842 2051 ISA bridge +10ab Digicom +10ac Honeywell IAC +10ad Symphony Labs + 0001 W83769F + 0003 SL82C103 + 0005 SL82C105 + 0103 SL82c103 + 0105 SL82c105 + 0565 W83C553F/W83C554F +10ae Cornerstone Technology +10af Micro Computer Systems Inc +10b0 CardExpert Technology +10b1 Cabletron Systems Inc +10b2 Raytheon Company +10b3 Databook Inc + 3106 DB87144 + b106 DB87144 +10b4 STB Systems Inc + 1b1d Velocity 128 3D + 10b4 237e Velocity 4400 +10b5 PLX Technology, Inc. + 0001 i960 PCI bus interface + 1024 Acromag, Inc. IndustryPack Carrier Card + 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36 + 106a Dual OX16C952 4 port serial adapter [Megawolf Romulus/4] + 1076 VScom 800 8 port serial adaptor + 1077 VScom 400 4 port serial adaptor + 1078 VScom 210 2 port serial and 1 port parallel adaptor + 1103 VScom 200 2 port serial adaptor + 1146 VScom 010 1 port parallel adaptor + 1147 VScom 020 2 port parallel adaptor + 2540 IXXAT CAN-Interface PC-I 04/PCI + 2724 Thales PCSM Security Card + 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge + 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge + 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge + 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge + 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge + 6466 PCI6466 64-bit 66MHz PCI-to-PCI Bridge + 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge + 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side) + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side) + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 8111 PEX 8111 PCI Express-to-PCI Bridge + 8112 PEX8112 x1 Lane PCI Express-to-PCI Bridge + 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge + 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge + 8505 PEX 8505 5-lane, 5-port PCI Express Switch + 8508 PEX 8508 8-lane, 5-port PCI Express Switch + 8509 PEX 8509 8-lane, 8-port PCI Express Switch + 8512 PEX 8512 12-lane, 5-port PCI Express Switch + 8516 PEX 8516 Versatile PCI Express Switch + 8517 PEX 8517 16-lane, 5-port PCI Express Switch + 8518 PEX 8518 16-lane, 5-port PCI Express Switch + 8524 PEX 8524 24-lane, 6-port PCI Express Switch + 8525 PEX 8525 24-lane, 5-port PCI Express Switch + 8532 PEX 8532 Versatile PCI Express Switch + 8533 PEX 8533 32-lane, 6-port PCI Express Switch + 8547 PEX 8547 48-lane, 3-port PCI Express Switch + 8548 PEX 8548 48-lane, 9-port PCI Express Switch + 8647 PEX 8647 48-Lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch + 9030 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 2695 Hilscher CIF50-PB Profibus Master Board + 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board + 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board + 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board + 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board + 10b5 2978 SH ARC-PCIu SOHARD ARCNET card + 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board + 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board + 12fe 0111 CPCI-ASIO4 (ESD 4-port Serial Interface Board) + 1369 9c01 VX222v2 + 1369 9d01 VX222-Mic + 1369 9d02 VX222-Mic + 1369 9e01 PCX924v2 + 1369 9f01 PCX924-Mic + 1369 9f02 PCX924-Mic + 1369 a001 PCX22v2 + 1369 a701 LCM220v2 + 1369 a801 LCM200 + 1397 3136 4xS0-ISDN PCI Adapter + 1397 3137 S2M-E1-ISDN PCI Adapter + 1518 0200 Kontron ThinkIO-C + 15ed 1002 MCCS 8-port Serial Hot Swap + 15ed 1003 MCCS 16-port Serial Hot Swap + 9036 9036 + 9050 PCI <-> IOBus Bridge + 10b5 1067 IXXAT CAN i165 + 10b5 114e Wasco WITIO PCI168extended + 10b5 1169 Wasco OPTOIO32standard 32 digital in, 32 digital out + 10b5 1172 IK220 (Heidenhain) + 10b5 2036 SatPak GPS + 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board + 10b5 2273 SH ARC-PCI SOHARD ARCNET card + 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board + 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board + 10b5 3196 Goramo PLX200SYN sync serial card + 10b5 9050 PCI-I04 PCI Passive PC/CAN Interface + 1369 8901 PCX11+ PCI + 1369 8f01 VX222 + 1369 9401 PCX924 + 1369 9501 PCX22 + 1498 0362 TPMC866 8 Channel Serial Card + 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem + 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem + 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem + 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem + 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem + 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem + 15ed 1000 Macrolink MCCS 8-port Serial + 15ed 1001 Macrolink MCCS 16-port Serial + 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap + 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap + 5654 2036 OpenSwitch 6 Telephony card + 5654 3132 OpenSwitch 12 Telephony card + 5654 5634 OpenLine4 Telephony Card + d531 c002 PCIntelliCAN 2xSJA1000 CAN bus + d84d 4006 EX-4006 1P + d84d 4008 EX-4008 1P EPP/ECP + d84d 4014 EX-4014 2P + d84d 4018 EX-4018 3P EPP/ECP + d84d 4025 EX-4025 1S(16C550) RS-232 + d84d 4027 EX-4027 1S(16C650) RS-232 + d84d 4028 EX-4028 1S(16C850) RS-232 + d84d 4036 EX-4036 2S(16C650) RS-232 + d84d 4037 EX-4037 2S(16C650) RS-232 + d84d 4038 EX-4038 2S(16C850) RS-232 + d84d 4052 EX-4052 1S(16C550) RS-422/485 + d84d 4053 EX-4053 2S(16C550) RS-422/485 + d84d 4055 EX-4055 4S(16C550) RS-232 + d84d 4058 EX-4055 4S(16C650) RS-232 + d84d 4065 EX-4065 8S(16C550) RS-232 + d84d 4068 EX-4068 8S(16C650) RS-232 + d84d 4078 EX-4078 2S(16C552) RS-232+1P + 9052 PCI9052 PCI <-> IOBus Bridge + 9054 PCI9054 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 2455 Wessex Techology PHIL-PCI + 10b5 2696 Innes Corp AM Radcap card + 10b5 2717 Innes Corp Auricon card + 10b5 2844 Innes Corp TVS Encoder card + 12c7 4001 Intel Dialogic DM/V960-4T1 PCI + 12d9 0002 PCI Prosody Card rev 1.5 + 14b4 d100 Dektec DTA-100 + 14b4 d114 Dektec DTA-120 + 16df 0011 PIKA PrimeNet MM PCI + 16df 0012 PIKA PrimeNet MM cPCI 8 + 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling) + 16df 0014 PIKA PrimeNet MM cPCI 4 + 16df 0015 PIKA Daytona MM + 16df 0016 PIKA InLine MM + 9056 PCI9056 32-bit 66MHz PCI <-> IOBus Bridge + 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1 + 10b5 3352 Alpermann+Velte PCL PCIe HD: Timecode Reader Board + 10b5 3353 Alpermann+Velte PCL PCIe D: Timecode Reader Board + 10b5 3354 Alpermann+Velte PCL PCIe LV: Timecode Reader Board + 10b5 3355 Alpermann+Velte PCL PCIe L: Timecode Reader Board + 10b5 3415 Alpermann+Velte PCIe TS: Time Synchronisation Board + 1369 c001 LX6464ES + 1369 c201 LX1616ES + 14b4 d140 Dektec DTA-140 + 9060 PCI9060 32-bit 33MHz PCI <-> IOBus Bridge + 906d 9060SD + 125c 0640 Aries 16000P + 906e 9060ES + 9080 PCI9080 32-bit; 33MHz PCI <-> IOBus Bridge + 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface + 103c 10ec (Agilent) E6978-66442 PCI CIC + 10b5 1123 Sectra KK631 encryption board + 10b5 9080 9080 [real subsystem ID not set] + 12d9 0002 PCI Prosody Card + 12df 4422 4422PCI ["Do-All" Telemetry Data Aquisition System] + 1369 9601 PCX822np + 1369 a102 PCX822v2 + 1369 a201 PCX442 + 1369 a301 LCM440v2 + 1369 a401 VX822 + 1369 a402 VX822v2 + 1369 a901 LCM420 + 1369 aa01 VX820v2 + 1517 000b ECSG-1R3ADC-PMC Clock synthesizer + 9656 PCI9656 PCI <-> IOBus Bridge + 1517 000f ECDR-GC314-PMC Receiver + 1885 0700 Tsunami FPGA PMC with Altera Stratix S40 + 1885 0701 Tsunami FPGA PMC with Altera Stratix S30 + a100 Blackmagic Design DeckLink + bb04 B&B 3PCIOSD1A Isolated PCI Serial + c001 CronyxOmega-PCI (8-port RS232) +10b6 Madge Networks + 0001 Smart 16/4 PCI Ringnode + 0002 Smart 16/4 PCI Ringnode Mk2 + 10b6 0002 Smart 16/4 PCI Ringnode Mk2 + 10b6 0006 16/4 CardBus Adapter + 0003 Smart 16/4 PCI Ringnode Mk3 + 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL + 10b6 0003 Smart 16/4 PCI Ringnode Mk3 + 10b6 0007 Presto PCI Plus Adapter + 0004 Smart 16/4 PCI Ringnode Mk1 + 0006 16/4 Cardbus Adapter + 10b6 0006 16/4 CardBus Adapter + 0007 Presto PCI Adapter + 10b6 0007 Presto PCI + 0009 Smart 100/16/4 PCI-HS Ringnode + 10b6 0009 Smart 100/16/4 PCI-HS Ringnode + 000a Smart 100/16/4 PCI Ringnode + 10b6 000a Smart 100/16/4 PCI Ringnode + 000b 16/4 CardBus Adapter Mk2 + 10b6 0008 16/4 CardBus Adapter Mk2 + 10b6 000b 16/4 Cardbus Adapter Mk2 + 000c RapidFire 3140V2 16/4 TR Adapter + 10b6 000c RapidFire 3140V2 16/4 TR Adapter + 1000 Collage 25/155 ATM Client Adapter + 1001 Collage 155 ATM Server Adapter +10b7 3Com Corporation + 0001 3c985 1000BaseSX (SX/TX) + 0013 AR5212 802.11abg NIC (3CRDAG675) + 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter + 0910 3C910-A01 + 1006 MINI PCI type 3B Data Fax Modem + 1007 Mini PCI 56k Winmodem + 10b7 615b Mini PCI 56K Modem + 10b7 615c Mini PCI 56K Modem + 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra] + 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra] + 1700 3c940 10/100/1000Base-T [Marvell] + 1043 80eb A7V600/P4P800/K8V motherboard + 10b7 0010 3C940 Gigabit LOM Ethernet Adapter + 10b7 0020 3C941 Gigabit LOM Ethernet Adapter + 147b 1407 KV8-MAX3 motherboard + 3390 3c339 TokenLink Velocity + 3590 3c359 TokenLink Velocity XL + 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B) + 4500 3c450 HomePNA [Tornado] + 5055 3c555 Laptop Hurricane + 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang] + 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone] + 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 5257 3cCFE575CT CardBus [Cyclone] + 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet + 5900 3c590 10BaseT [Vortex] + 5920 3c592 EISA 10mbps Demon/Vortex + 5950 3c595 100BaseTX [Vortex] + 5951 3c595 100BaseT4 [Vortex] + 5952 3c595 100Base-MII [Vortex] + 5970 3c597 EISA Fast Demon/Vortex + 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang] + 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 6000 3CRSHPW796 [OfficeConnect Wireless CardBus] + 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter] + 6055 3c556 Hurricane CardBus [Cyclone] + 6056 3c556B CardBus [Tornado] + 10b7 6556 10/100 Mini PCI Ethernet Adapter + 6560 3cCFE656 CardBus [Cyclone] + 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus + 6561 3cCFEM656 10/100 LAN+56K Modem CardBus + 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus + 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone] + 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus + 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus + 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus + 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado] + 7646 3cSOHO100-TX Hurricane + 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect] + 7940 3c803 FDDILink UTP Controller + 7980 3c804 FDDILink SAS Controller + 7990 3c805 FDDILink DAS Controller + 80eb 3c940B 10/100/1000Base-T + 8811 Token ring + 9000 3c900 10BaseT [Boomerang] + 9001 3c900 10Mbps Combo [Boomerang] + 9004 3c900B-TPO Etherlink XL [Cyclone] + 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb + 9005 3c900B-Combo Etherlink XL [Cyclone] + 10b7 9005 3C900B-Combo Etherlink XL Combo + 9006 3c900B-TPC Etherlink XL [Cyclone] + 900a 3c900B-FL 10base-FL [Cyclone] + 9050 3c905 100BaseTX [Boomerang] + 9051 3c905 100BaseT4 [Boomerang] + 9054 3C905B-TX Fast Etherlink XL PCI + 10b7 9054 3C905B-TX Fast Etherlink XL PCI + 9055 3c905B 100BaseTX [Cyclone] + 1028 0080 3C905B Fast Etherlink XL 10/100 + 1028 0081 3C905B Fast Etherlink XL 10/100 + 1028 0082 3C905B Fast Etherlink XL 10/100 + 1028 0083 3C905B Fast Etherlink XL 10/100 + 1028 0084 3C905B Fast Etherlink XL 10/100 + 1028 0085 3C905B Fast Etherlink XL 10/100 + 1028 0086 3C905B Fast Etherlink XL 10/100 + 1028 0087 3C905B Fast Etherlink XL 10/100 + 1028 0088 3C905B Fast Etherlink XL 10/100 + 1028 0089 3C905B Fast Etherlink XL 10/100 + 1028 0090 3C905B Fast Etherlink XL 10/100 + 1028 0091 3C905B Fast Etherlink XL 10/100 + 1028 0092 3C905B Fast Etherlink XL 10/100 + 1028 0093 3C905B Fast Etherlink XL 10/100 + 1028 0094 3C905B Fast Etherlink XL 10/100 + 1028 0095 3C905B Fast Etherlink XL 10/100 + 1028 0096 3C905B Fast Etherlink XL 10/100 + 1028 0097 3C905B Fast Etherlink XL 10/100 + 1028 0098 3C905B Fast Etherlink XL 10/100 + 1028 0099 3C905B Fast Etherlink XL 10/100 + 10b7 9055 3C905B Fast Etherlink XL 10/100 + 9056 3c905B-T4 Fast EtherLink XL [Cyclone] + 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone] + 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone] + 9200 3c905C-TX/TX-M [Tornado] + 1028 0095 3C920 Integrated Fast Ethernet Controller + 1028 0097 3C920 Integrated Fast Ethernet Controller + 1028 00b4 OptiPlex GX110 + 1028 00d8 Precision 530 + 1028 00fe Optiplex GX240 + 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640] + 10b7 1000 3C905CX-TX/TX-M Fast Etherlink for PC Management NIC + 10b7 7000 10/100 Mini PCI Ethernet Adapter + 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller) + 144d c005 X10 Laptop + 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado] + 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller + 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller + 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller + 9300 3CSOHO100B-TX 910-A01 [tulip] + 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone] + 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter + 9805 3c980-C 10/100baseTX NIC [Python-T] + 10b7 1201 EtherLink Server 10/100 Dual Port A + 10b7 1202 EtherLink Server 10/100 Dual Port B + 10b7 9805 3c980 10/100baseTX NIC [Python-T] + 10f1 2462 Thunder K7 S2462 + 9900 3C990-TX [Typhoon] + 9902 3CR990-TX-95 [Typhoon 56-bit] + 9903 3CR990-TX-97 [Typhoon 168-bit] + 9904 3C990B-TX-M/3C990BSVR [Typhoon2] + 10b7 1000 3CR990B-TX-M [Typhoon2] + 10b7 2000 3CR990BSVR [Typhoon2 Server] + 9905 3CR990-FX-95/97/95 [Typhon Fiber] + 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit] + 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit] + 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit] + 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit] + 9908 3CR990SVR95 [Typhoon Server 56-bit] + 9909 3CR990SVR97 [Typhoon Server 168-bit] + 990a 3C990SVR [Typhoon Server] + 990b 3C990SVR [Typhoon Server] +10b8 Standard Microsystems Corp [SMC] + 0005 83c170 EPIC/100 Fast Ethernet Adapter + 1055 e000 LANEPIC 10/100 [EVB171Q-PCI] + 1055 e002 LANEPIC 10/100 [EVB171G-PCI] + 10b8 a011 EtherPower II 10/100 + 10b8 a014 EtherPower II 10/100 + 10b8 a015 EtherPower II 10/100 + 10b8 a016 EtherPower II 10/100 + 10b8 a017 EtherPower II 10/100 + 0006 83c175 EPIC/100 Fast Ethernet Adapter + 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter + 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter + 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter + 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter + 1000 FDC 37c665 + 1001 FDC 37C922 + 2802 SMC2802W [EZ Connect g] + a011 83C170QF + b106 SMC34C90 +10b9 ALi Corporation + 0101 CMI8338/C3DX PCI Audio Device + 0111 C-Media CMI8738/C3DX Audio Device (OEM) + 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM) + 0780 Multi-IO Card + 0782 Multi-IO Card + 1435 M1435 + 1445 M1445 + 1449 M1449 + 1451 M1451 + 1461 M1461 + 1489 M1489 + 1511 M1511 [Aladdin] + 1512 M1512 [Aladdin] + 1513 M1513 [Aladdin] + 1521 M1521 [Aladdin III] + 10b9 1521 ALI M1521 Aladdin III CPU Bridge + 1523 M1523 + 10b9 1523 ALI M1523 ISA Bridge + 1531 M1531 [Aladdin IV] + 1533 M1533/M1535/M1543 PCI to ISA Bridge [Aladdin IV/V/V+] + 1014 053b ThinkPad R40e + 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge + 1541 M1541 + 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller + 1543 M1543 + 1563 M1563 HyperTransport South Bridge + 10b9 1563 ASRock 939Dual-SATA2 Motherboard + 1849 1563 ASRock 939Dual-SATA2 Motherboard + 1573 PCI to LPC Controller + 1575 M1575 South Bridge + 1621 M1621 + 1631 ALI M1631 PCI North Bridge Aladdin Pro III + 1632 M1632M Northbridge+Trident + 1641 ALI M1641 PCI North Bridge Aladdin Pro IV + 1644 M1644/M1644T Northbridge+Trident + 1646 M1646 Northbridge+Trident + 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1] + 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM] + 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR] + 1672 M1672 Northbridge [CyberALADDiN-P4] + 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR] + 1687 M1687 K8 Northbridge [AGP8X and HyperTransport] + 1689 M1689 K8 Northbridge [Super K8 Single Chip] + 1695 M1695 K8 Northbridge [PCI Express and HyperTransport] + 1697 M1697 HTT Host Bridge + 3141 M3141 + 3143 M3143 + 3145 M3145 + 3147 M3147 + 3149 M3149 + 3151 M3151 + 3307 M3307 + 3309 M3309 + 3323 M3325 Video/Audio Decoder + 5212 M4803 + 5215 MS4803 + 5217 M5217H + 5219 M5219 + 5225 M5225 + 5228 M5228 ALi ATA/RAID Controller + 5229 M5229 IDE + 1014 050f ThinkPad R30 + 1014 053d ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin IDE + 1043 8053 A7A266 Motherboard IDE + 1849 5229 ASRock 939Dual-SATA2 Motherboard IDE (PATA) + 5235 M5225 + 5237 USB 1.1 Controller + 1014 0540 ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin USB + 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0 + 10b9 5237 ASRock 939Dual-SATA2 Motherboard + 1849 5237 ASRock 939Dual-SATA2 Motherboard + 5239 USB 2.0 Controller + 10b9 5239 ASRock 939Dual-SATA2 Motherboard + 1849 5239 ASRock 939Dual-SATA2 Motherboard + 5243 M1541 PCI to AGP Controller + 5246 AGP8X Controller + 5247 PCI to AGP Controller + 5249 M5249 HTT to PCI Bridge + 524b PCI Express Root Port + 524c PCI Express Root Port + 524d PCI Express Root Port + 524e PCI Express Root Port + 5251 M5251 P1394 OHCI 1.0 Controller + 5253 M5253 P1394 OHCI 1.1 Controller + 5261 M5261 Ethernet Controller + 5263 ULi 1689,1573 integrated ethernet. + 5281 ALi M5281 Serial ATA / RAID Host Controller + 5287 ULi 5287 SATA + 5288 ULi M5288 SATA + 1043 8056 A8R-MVP Mainboard + 5289 ULi 5289 SATA + 5450 Lucent Technologies Soft Modem AMR + 5451 M5451 PCI AC-Link Controller Audio Device + 1014 0506 ThinkPad R30 + 1014 053e ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin Audio + 5453 M5453 PCI AC-Link Controller Modem Device + 5455 M5455 PCI AC-Link Controller Audio Device + 10b9 5455 ASRock 939Dual-SATA2 Motherboard + 1849 0850 ASRock 939Dual-SATA2 Motherboard + 5457 M5457 AC'97 Modem Controller + 1014 0535 ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin Modem Device + 5459 SmartLink SmartPCI561 56K Modem + 545a SmartLink SmartPCI563 56K Modem + 5461 High Definition Audio/AC'97 Host Controller + 5471 M5471 Memory Stick Controller + 5473 M5473 SD-MMC Controller + 7101 M7101 Power Management Controller [PMU] + 1014 0510 ThinkPad R30 + 1014 053c ThinkPad R40e + 103c 0024 Pavilion ze4400 + 1849 7101 ASRock 939Dual-SATA2 Motherboard +10ba Mitsubishi Electric Corp. + 0301 AccelGraphics AccelECLIPSE + 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] + 0308 Tornado 3000 [OEM Evans & Sutherland] + 10dd 0024 Tornado 3000 + 1002 VG500 [VolumePro Volume Rendering Accelerator] +10bb Dapha Electronics Corporation +10bc Advanced Logic Research +10bd Surecom Technology + 0e34 NE-34 +10be Tseng Labs International Co. +10bf Most Inc +10c0 Boca Research Inc. +10c1 ICM Co., Ltd. +10c2 Auspex Systems Inc. +10c3 Samsung Semiconductors, Inc. + 1100 Smartether100 SC1100 LAN Adapter (i82557B) +10c4 Award Software International Inc. +10c5 Xerox Corporation +10c6 Rambus Inc. +10c7 Media Vision +10c8 Neomagic Corporation + 0001 NM2070 [MagicGraph 128] + 0002 NM2090 [MagicGraph 128V] + 0003 NM2093 [MagicGraph 128ZV] + 0004 NM2160 [MagicGraph 128XD] + 1014 00ba MagicGraph 128XD + 1025 1007 MagicGraph 128XD + 1028 0074 MagicGraph 128XD + 1028 0075 MagicGraph 128XD + 1028 007d MagicGraph 128XD + 1028 007e MagicGraph 128XD + 1033 802f MagicGraph 128XD + 104d 801b MagicGraph 128XD + 104d 802f MagicGraph 128XD + 104d 830b MagicGraph 128XD + 10ba 0e00 MagicGraph 128XD + 10c8 0004 MagicGraph 128XD + 10cf 1029 MagicGraph 128XD + 10f7 8308 MagicGraph 128XD + 10f7 8309 MagicGraph 128XD + 10f7 830b MagicGraph 128XD + 10f7 830d MagicGraph 128XD + 10f7 8312 MagicGraph 128XD + 0005 NM2200 [MagicGraph 256AV] + 1014 00dd ThinkPad 570 + 1028 0088 Latitude CPi A + 0006 NM2360 [MagicMedia 256ZX] + 0016 NM2380 [MagicMedia 256XL+] + 10c8 0016 MagicMedia 256XL+ + 0025 NM2230 [MagicGraph 256AV+] + 0083 NM2093 [MagicGraph 128ZV+] + 8005 NM2200 [MagicMedia 256AV Audio] + 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery + 0e11 b126 MagicMedia 256AV Audio Device on Durango + 1014 00dd ThinkPad 390/i1720/i1721 + 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720 + 1028 0088 Latitude CPi A + 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron + 103c 0007 MagicMedia 256AV Audio Device on Voyager II + 103c 0008 MagicMedia 256AV Audio Device on Voyager III + 103c 000d MagicMedia 256AV Audio Device on Omnibook 900 + 10c8 8005 MagicMedia 256AV Audio Device on FireAnt + 110a 8005 MagicMedia 256AV Audio Device + 14c0 0004 MagicMedia 256AV Audio Device + 8006 NM2360 [MagicMedia 256ZX Audio] + 8016 NM2380 [MagicMedia 256XL+ Audio] +10c9 Dataexpert Corporation +10ca Fujitsu Microelectr., Inc. +10cb Omron Corporation +# nee Mentor ARC Inc +10cc Mai Logic Incorporated + 0660 Articia S Host Bridge + 0661 Articia S PCI Bridge +10cd Advanced System Products, Inc + 1100 ASC1100 + 1200 ASC1200 [(abp940) Fast SCSI-II] + 1300 ABP940-U / ABP960-U + 10cd 1310 ASC1300 SCSI Adapter + 1195 1320 Ultra-SCSI CardBus PC Card REX CB31 + 2300 ABP940-UW + 2500 ABP940-U2W + 2700 ABP3950-U3W +10ce Radius +# nee Citicorp TTI +10cf Fujitsu Limited. + 1414 On-board USB 1.1 companion controller + 1415 On-board USB 2.0 EHCI controller + 1422 E8410 nVidia graphics adapter + 142d HD audio (Realtek ALC262) + 1430 82566MM Intel 1Gb copper LAN interface + 2001 mb86605 + 200c MB86613L IEEE1394 OHCI 1.0 Controller + 2019 MB86295S [CORAL P] + 201e MB86296S [CORAL PA] + 202b MB86297A [Carmine Graphics Controller] +10d1 FuturePlus Systems Corp. +10d2 Molex Incorporated +10d3 Jabil Circuit Inc +10d4 Hualon Microelectronics +10d5 Autologic Inc. +10d6 Cetia +10d7 BCM Advanced Research +10d8 Advanced Peripherals Labs +10d9 Macronix, Inc. [MXIC] + 0431 MX98715 + 0512 MX98713 + 0531 MX987x5 + 1186 1200 DFE-540TX ProFAST 10/100 Adapter + 8625 MX86250 + 8626 Macronix MX86251 + 3Dfx Voodoo Rush + 8888 MX86200 +10da Compaq IPG-Austin + 0508 TC4048 Token Ring 4/16 + 3390 Tl3c3x9 +10db Rohm LSI Systems, Inc. +10dc CERN/ECP/EDU + 0001 STAR/RD24 SCI-PCI (PMC) + 0002 TAR/RD24 SCI-PCI (PMC) + 0021 HIPPI destination + 0022 HIPPI source + 10dc ATT2C15-3 FPGA +10dd Evans & Sutherland + 0100 Lightning 1200 + 10dd 0023 Lightning 1200 15+16M +10de nVidia Corporation + 0008 NV1 [EDGE 3D] + 0009 NV1 [EDGE 3D] + 0010 NV2 [Mutara V08] + 0020 NV4 [RIVA TNT] + 1043 0200 V3400 TNT + 1048 0c18 Erazor II SGRAM + 1048 0c19 Erazor II + 1048 0c1b Erazor II + 1048 0c1c Erazor II + 1092 0550 Viper V550 + 1092 0552 Viper V550 + 1092 4804 Viper V550 + 1092 4808 Viper V550 + 1092 4810 Viper V550 + 1092 4812 Viper V550 + 1092 4815 Viper V550 + 1092 4820 Viper V550 with TV out + 1092 4822 Viper V550 + 1092 4904 Viper V550 + 1092 4914 Viper V550 + 1092 8225 Viper V550 + 10b4 273d Velocity 4400 + 10b4 273e Velocity 4400 + 10b4 2740 Velocity 4400 + 10de 0020 Riva TNT + 1102 1015 Graphics Blaster CT6710 + 1102 1016 Graphics Blaster RIVA TNT + 0028 NV5 [RIVA TNT2/TNT2 Pro] + 1043 0200 AGP-V3800 SGRAM + 1043 0201 AGP-V3800 SDRAM + 1043 0205 PCI-V3800 + 1043 4000 AGP-V3800PRO + 1048 0c21 Synergy II + 1048 0c28 Erazor III + 1048 0c29 Erazor III + 1048 0c2a Erazor III + 1048 0c2b Erazor III + 1048 0c31 Erazor III Pro + 1048 0c32 Erazor III Pro + 1048 0c33 Erazor III Pro + 1048 0c34 Erazor III Pro + 107d 2134 WinFast 3D S320 II + TV-Out + 1092 4804 Viper V770 + 1092 4a00 Viper V770 + 1092 4a02 Viper V770 Ultra + 1092 5a00 RIVA TNT2/TNT2 Pro + 1092 6a02 Viper V770 Ultra + 1092 7a02 Viper V770 Ultra + 10de 0005 RIVA TNT2 Pro + 10de 000f Compaq NVIDIA TNT2 Pro + 1102 1020 3D Blaster RIVA TNT2 + 1102 1026 3D Blaster RIVA TNT2 Digital + 14af 5810 Maxi Gamer Xentor + 0029 NV5 [RIVA TNT2 Ultra] + 1043 0200 AGP-V3800 Deluxe + 1043 0201 AGP-V3800 Ultra SDRAM + 1043 0205 PCI-V3800 Ultra + 1048 0c2e Erazor III Ultra + 1048 0c2f Erazor III Ultra + 1048 0c30 Erazor III Ultra + 1102 1021 3D Blaster RIVA TNT2 Ultra + 1102 1029 3D Blaster RIVA TNT2 Ultra + 1102 102f 3D Blaster RIVA TNT2 Ultra + 14af 5820 Maxi Gamer Xentor 32 + 002a NV5 [Riva TNT2] + 002b NV5 [Riva TNT2] + 002c NV6 [Vanta/Vanta LT] + 1043 0200 AGP-V3800 Combat SDRAM + 1043 0201 AGP-V3800 Combat + 1048 0c20 TNT2 Vanta + 1048 0c21 TNT2 Vanta + 1092 6820 Viper V730 + 1102 1031 CT6938 VANTA 8MB + 1102 1034 CT6894 VANTA 16MB + 14af 5008 Maxi Gamer Phoenix 2 + 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro] + 1043 0200 AGP-V3800M + 1043 0201 AGP-V3800M + 1048 0c3a Erazor III LT + 1048 0c3b Erazor III LT + 10de 0006 RIVA TNT2 Model 64/Model 64 Pro + 10de 001e M64 AGP4x + 1102 1023 CT6892 RIVA TNT2 Value + 1102 1024 CT6932 RIVA TNT2 Value 32Mb + 1102 102c CT6931 RIVA TNT2 Value [Jumper] + 1462 8808 MSI-8808 + 1554 1041 Pixelview RIVA TNT2 M64 + 1569 002d Palit Microsystems Daytona TNT2 M64 + 002e NV6 [Vanta] + 002f NV6 [Vanta] + 0034 MCP04 SMBus + 0035 MCP04 IDE + 0036 MCP04 Serial ATA Controller + 0037 MCP04 Ethernet Controller + 0038 MCP04 Ethernet Controller + 003a MCP04 AC'97 Audio Controller + 003b MCP04 USB Controller + 003c MCP04 USB Controller + 003d MCP04 PCI Bridge + 003e MCP04 Serial ATA Controller + 0040 NV40 [GeForce 6800 Ultra] + 0041 NV40 [GeForce 6800] + 1043 817b V9999 Gamer Edition + 0042 NV40.2 [GeForce 6800 LE] + 0043 NV40.3 [GeForce 6800 XE] + 0044 NV40 [GeForce 6800 XT] + 0045 NV40 [GeForce 6800 GT] + 0046 NV45 [GeForce 6800 GT] + 0047 NV40 [GeForce 6800 GS] + 1682 2109 GeForce 6800 GS + 0048 NV40 [GeForce 6800 XT] + 0049 NV40GL + 004d NV40GL [Quadro FX 4000] + 004e NV40GL [Quadro FX 4000] + 0050 CK804 ISA Bridge + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 0c11 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0051 CK804 ISA Bridge + 1028 0225 PowerEdge T105 ISA Bridge + 0052 CK804 SMBus + 1028 0225 PowerEdge T105 SMBus + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 0c11 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0053 CK804 IDE + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5002 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0054 CK804 Serial ATA Controller + 1028 0225 PowerEdge T105 Serial ATA + 1043 815a A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 b003 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 5401 NF4 AM2L Mainboard + 0055 CK804 Serial ATA Controller + 1028 0225 PowerEdge T105 Serial ATA + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 b003 GA-K8N Ultra-9 Mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 5401 NF4 AM2L Mainboard + 0056 CK804 Ethernet Controller + 0057 CK804 Ethernet Controller + 1043 8141 K8N4-E or A8N-E Mainboard + 10de cb84 NF4 Lanparty + 10f1 2865 Tomcat K8E (S2865) + 1458 e000 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 2501 NF4 AM2L Mainboard + 0058 CK804 AC'97 Modem + 0059 CK804 AC'97 Audio Controller + 1043 812a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 147b 1c1a KN8-Ultra Mainboard + 1565 8211 NF4 AM2L Mainboard + 005a CK804 USB Controller + 1028 0225 PowerEdge T105 onboard USB + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5004 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005b CK804 USB Controller + 1028 0225 PowerEdge T105 onboard USB + 1043 815a K8N4-E or A8N-E Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5004 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005c CK804 PCI Bridge + 005d CK804 PCIE Bridge + 005e CK804 Memory Controller + 1028 0225 PowerEdge T105 Memory Controller + 1043 815a A8N-E Mainboard + 10de 005e ECS Elitegroup NFORCE3-A939 motherboard. + 10f1 2865 Tomcat K8E (S2865) + 10f1 2891 Thunder K8SRE Mainboard + 1458 5000 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005f CK804 Memory Controller + 0060 nForce2 ISA Bridge + 1043 80ad A7N8X Mainboard + 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X + a0a0 03ba UK79G-1394 motherboard + 0064 nForce2 SMBus (MCP) + 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X + a0a0 03bb UK79G-1394 motherboard + 0065 nForce2 IDE + 10de 0c11 nForce 2 EIDE Controller + a0a0 03b2 UK79G-1394 motherboard + 0066 nForce2 Ethernet Controller + 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet + 10de 0c11 nForce MCP-T Networking Adapter + a0a0 03b3 UK79G-1394 motherboard + 0067 nForce2 USB Controller + 1043 0c11 A7N8X Mainboard + a0a0 03b4 UK79G-1394 motherboard + 0068 nForce2 USB Controller + 1043 0c11 A7N8X Mainboard + a0a0 03b4 UK79G-1394 motherboard + 006a nForce2 AC97 Audio Controler (MCP) + 1043 8095 nForce2 AC97 Audio Controler (MCP) + a0a0 0304 UK79G-1394 motherboard + 006b nForce Audio Processing Unit + 10de 006b nForce2 MCP Audio Processing Unit + a0a0 0304 UK79G-1394 motherboard + 006c nForce2 External PCI Bridge + 006d nForce2 PCI Bridge + 006e nForce2 FireWire (IEEE 1394) Controller + a0a0 0306 UK79G-1394 motherboard + 0080 MCP2A ISA bridge + 147b 1c09 NV7 Motherboard + 0084 MCP2A SMBus + 147b 1c09 NV7 Motherboard + 0085 MCP2A IDE + 147b 1c09 NV7 Motherboard + 0086 MCP2A Ethernet Controller + 0087 MCP2A USB Controller + 147b 1c09 NV7 Motherboard + 0088 MCP2A USB Controller + 147b 1c09 NV7 Motherboard + 008a MCP2S AC'97 Audio Controller + 147b 1c09 NV7 Motherboard + 008b MCP2A PCI Bridge + 008c MCP2A Ethernet Controller + 008e nForce2 Serial ATA Controller + 0090 G70 [GeForce 7800 GTX] + 0091 G70 [GeForce 7800 GTX] + 0092 G70 [GeForce 7800 GT] + 0093 G70 [GeForce 7800 GS] + 0095 G70 [GeForce 7800 SLI] + 0098 G70 [GeForce Go 7800] + 0099 G70 [GeForce Go 7800 GTX] + 009d G70GL [Quadro FX 4500] + 00a0 NV5 [Aladdin TNT2] + 14af 5810 Maxi Gamer Xentor + 00c0 NV41 [GeForce 6800 GS] + 00c1 NV41.1 [GeForce 6800] + 00c2 NV41.2 [GeForce 6800 LE] + 00c3 NV42 [GeForce 6800 XT] + 00c8 NV41.8 [GeForce Go 6800] + 00c9 NV41.9 [GeForce Go 6800 Ultra] + 00cc NV41 [Quadro FX Go1400] + 00cd NV41 [Quadro FX 3450/4000 SDI] + 10de 029b wx4300 Workstation + 00ce NV41GL [Quadro FX 1400] + 00d0 nForce3 LPC Bridge + 00d1 nForce3 Host Bridge + 00d2 nForce3 AGP Bridge + 00d3 CK804 Memory Controller + 00d4 nForce3 SMBus + 00d5 nForce3 IDE + 00d6 nForce3 Ethernet + 00d7 nForce3 USB 1.1 + 00d8 nForce3 USB 2.0 + 00d9 nForce3 Audio + 00da nForce3 Audio + 00dd nForce3 PCI Bridge + 00df CK8S Ethernet Controller + 1043 80a7 K8N-E + 105b 0c43 Winfast NF3250K8AA + 147b 1c0b NF8 Mainboard + 00e0 nForce3 250Gb LPC Bridge + 1043 813f K8N-E + 10de 0c11 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e0 Motherboard (one of many) + 00e1 nForce3 250Gb Host Bridge + 1043 813f K8N-E + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e1 Motherboard (one of many) + 00e2 nForce3 250Gb AGP Host to PCI Bridge + 00e3 nForce3 Serial ATA Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 147b 1c0b NF8 Mainboard + 1849 00e3 Motherboard (one of many) + 00e4 nForce 250Gb PCI System Management + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e4 Motherboard (one of many) + 00e5 CK8S Parallel ATA Controller (v2.5) + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + f849 00e5 Motherboard (one of many) + 00e6 CK8S Ethernet Controller + 00e7 CK8S USB Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e7 Motherboard (one of many) + 00e8 nForce3 EHCI USB 2.0 Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e8 Motherboard (one of many) + 00ea nForce3 250Gb AC'97 Audio Controller + 1043 819d K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 b010 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 00ed nForce3 250Gb PCI-to-PCI Bridge + 00ee nForce3 Serial ATA Controller 2 + 00f0 NV40 [GeForce 6800 Ultra] + 00f1 NV43 [GeForce 6600 GT] + 1043 81a6 N6600GT TD 128M AGP + 1043 81c6 N6600GT TD 128M AGP + 1458 3150 GV-N66T128VP + 1554 1191 PixelView PV-N43UA (128KD) + 1682 2119 GeForce 6600 GT AGP 128MB DDR3 DUAL DVI TV + 00f2 NV43 [GeForce 6600] + 1554 1194 PixelView PV-N43AT (256KD) + 1682 211c GeForce 6600 256MB DDR DUAL DVI TV + 00f3 NV43 [GeForce 6200] + 00f4 NV43 [GeForce 6600 LE] + 00f5 G70 [GeForce 7800 GS] + 00f6 NV43 [GeForce 6800 GS] + 1682 217e XFX GeForce 6800 XTreme 256MB DDR3 AGP + 00f8 NV45GL [Quadro FX 3400/4400] + 00f9 NV45 [GeForce 6800 GTO] + 10de 00f9 NV40 [GeForce 6800 GT] + 1682 2120 GEFORCE 6800 GT PCI-E + 00fa NV36 [GeForce PCX 5750] + 00fb NV35 [GeForce PCX 5900] + 00fc NV37GL [Quadro FX 330/GeForce PCX 5300] + 00fd NV37GL [Quadro PCI-E Series] + 00fe NV38GL [Quadro FX 1300] + 00ff NV18 [GeForce PCX 4300] + 0100 NV10 [GeForce 256 SDR] + 1043 0200 AGP-V6600 SGRAM + 1043 0201 AGP-V6600 SDRAM + 1043 4008 AGP-V6600 SGRAM + 1043 4009 AGP-V6600 SDRAM + 1048 0c41 Erazor X + 1048 0c43 ERAZOR X PCI + 1048 0c48 Synergy Force + 1102 102d CT6941 GeForce 256 + 14af 5022 3D Prophet SE + 0101 NV10DDR [GeForce 256 DDR] + 1043 0202 AGP-V6800 DDR + 1043 400a AGP-V6800 DDR SGRAM + 1043 400b AGP-V6800 DDR SDRAM + 1048 0c42 Erazor X + 107d 2822 WinFast GeForce 256 + 1102 102e CT6971 GeForce 256 DDR + 14af 5021 3D Prophet DDR-DVI + 0103 NV10GL [Quadro] + 1048 0c40 GLoria II-64 + 1048 0c44 GLoria II + 1048 0c45 GLoria II + 1048 0c4a GLoria II-64 Pro + 1048 0c4b GLoria II-64 Pro DVII + 0110 NV11 [GeForce2 MX/MX 400] + 1043 4015 AGP-V7100 Pro + 1043 4021 V7100 Deluxe Combo + 1043 4031 V7100 Pro with TV output + 1048 0c60 Gladiac MX + 1048 0c61 Gladiac 511PCI + 1048 0c63 Gladiac 511TV-OUT 32MB + 1048 0c64 Gladiac 511TV-OUT 64MB + 1048 0c65 Gladiac 511TWIN + 1048 0c66 Gladiac 311 + 10de 0091 Dell OEM GeForce 2 MX 400 + 10de 00a1 Apple OEM GeForce2 MX + 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817] + 14af 7102 3D Prophet II MX + 14af 7103 3D Prophet II MX Dual-Display + 1545 0023 Xtasy Rev. B2 + 0111 NV11DDR [GeForce2 MX200] + 0112 NV11 [GeForce2 Go] + 0113 NV11GL [Quadro2 MXR/EX/Go] + 0140 NV43 [GeForce 6600 GT] + 0141 NV43 [GeForce 6600] + 1043 81b0 EN6600 Silencer + 1458 3124 GV-NX66128DP Turbo Force Edition + 0142 NV43 [GeForce 6600 LE] + 0143 NV43 [GeForce 6600 VE] + 0144 NV43 [GeForce Go 6600] + 0145 NV43 [GeForce 6610 XL] + 0146 NV43 [Geforce Go 6600TE/6200TE] + 0147 NV43 [GeForce 6700 XL] + 0148 NV43 [GeForce Go 6600] + 0149 NV43 [GeForce Go 6600 GT] + 014a NV43 [Quadro NVS 440] + 014c NV43 [Quadro FX 540 MXM] + 014d NV43GL [Quadro FX 550] + 014e NV43GL [Quadro FX 540] + 014f NV43 [GeForce 6200] + 0150 NV15 [GeForce2 GTS/Pro] + 1043 4016 V7700 AGP Video Card + 1048 0c50 Gladiac + 1048 0c52 Gladiac-64 + 107d 2840 WinFast GeForce2 GTS with TV output + 107d 2842 WinFast GeForce 2 Pro + 10de 002e GeForce2 GTS + 1462 8831 Creative GeForce2 Pro + 0151 NV15DDR [GeForce2 Ti] + 1043 405f V7700Ti + 1462 5506 Creative 3D Blaster Geforce2 Titanium + 0152 NV15BR [GeForce2 Ultra, Bladerunner] + 1048 0c56 GLADIAC Ultra + 0153 NV15GL [Quadro2 Pro] + 0160 NV44 [GeForce 6500] + 0161 NV44 [GeForce 6200 TurboCache(TM)] + 0162 NV44 [GeForce 6200SE TurboCache (TM)] + 0163 NV44 [GeForce 6200 LE] + 0164 NV44 [GeForce Go 6200] + 0165 NV44 [Quadro NVS 285] + 0166 NV43 [GeForce Go 6400] + 0167 NV43 [GeForce Go 6200/6400] + 0168 NV43 [GeForce Go 6200/6400] + 0169 NV44 [GeForce 6250] + 016a NV44 [GeForce 7100 GS] + 0170 NV17 [GeForce4 MX 460] + 0171 NV17 [GeForce4 MX 440] + 10b0 0002 Gainward Pro/600 TV + 10de 0008 Apple OEM GeForce4 MX 440 + 1462 8661 G4MX440-VTP + 1462 8730 MX440SES-T (MS-8873) + 1462 8852 GeForce4 MX440 PCI + 147b 8f00 Abit Siluro GeForce4MX440 + 0172 NV17 [GeForce4 MX 420] + 0173 NV17 [GeForce4 MX 440-SE] + 0174 NV17 [GeForce4 440 Go] + 0175 NV17 [GeForce4 420 Go] + 0176 NV17 [GeForce4 420 Go 32M] + 103c 08b0 tc1100 tablet + 144d c005 X10 Laptop + 4c53 1090 Cx9 / Vx9 mainboard + 0177 NV17 [GeForce4 460 Go] + 0178 NV17GL [Quadro4 550 XGL] + 0179 NV17 [GeForce4 440 Go 64M] + 10de 0179 GeForce4 MX (Mac) + 017a NV17GL [Quadro NVS] + 017b NV17GL [Quadro4 550 XGL] + 017c NV17GL [Quadro4 500 GoGL] + 017d NV17 [GeForce4 410 Go 16M] + 0181 NV18 [GeForce4 MX 440 AGP 8x] + 1043 8063 GeForce4 MX 440 AGP 8X + 1043 806f V9180 Magic + 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X + 1462 8900 MS-8890 GeForce 4 MX440 AGP8X + 1462 9350 MSI Geforce4 MX T8X with AGP8X + 147b 8f0d Siluro GF4 MX-8X + 1554 1111 PixelView MVGA-NVG18A + 0182 NV18 [GeForce4 MX 440SE AGP 8x] + 0183 NV18 [GeForce4 MX 420 AGP 8x] + 0184 NV18 [GeForce4 MX] + 0185 NV18 [GeForce4 MX 4000] + 0186 NV18M [GeForce4 448 Go] + 0187 NV18M [GeForce4 488 Go] + 0188 NV18GL [Quadro4 580 XGL] + 0189 NV18 [GeForce4 MX with AGP8X (Mac)] + 018a NV18GL [Quadro NVS 280 SD] + 018b NV18GL [Quadro4 380 XGL] + 018c NV18GL [Quadro NVS 50 PCI] + 018d NV18M [GeForce4 448 Go] + 0191 G80 [GeForce 8800 GTX] + 0193 G80 [GeForce 8800 GTS] + 0194 G80 [GeForce 8800 Ultra] +# Found in GPU server Tesla D870 and S870 + 0197 G80 [Tesla C870] + 019d G80 [Quadro FX 5600] + 019e G80 [Quadro FX 4600] + 01a0 NVCrush11 [GeForce2 MX Integrated Graphics] + 01a4 nForce CPU bridge + 01ab nForce 420 Memory Controller (DDR) + 01ac nForce 220/420 Memory Controller + 01ad nForce 220/420 Memory Controller + 01b0 nForce Audio Processing Unit + 01b1 nForce AC'97 Audio Controller + 01b2 nForce ISA Bridge + 01b4 nForce PCI System Management + 01b7 nForce AGP to PCI Bridge + 01b8 nForce PCI-to-PCI bridge + 01bc nForce IDE + 01c1 nForce AC'97 Modem Controller + 01c2 nForce USB Controller + 01c3 nForce Ethernet Controller + 01d0 G72 [GeForce 7350 LE] + 01d1 G72 [GeForce 7300 LE] + 1462 0345 7300LE PCI Express Graphics Adapter + 01d3 G72 [GeForce 7300 SE/7200 GS] + 01d6 G72M [GeForce Go 7200] + 01d7 G72M [Quadro NVS 110M/GeForce Go 7300] + 01d8 G72M [GeForce Go 7400] + 1028 01d7 XPS M1210 + 01d9 G72M [GeForce Go 7450] + 01da G72M [Quadro NVS 110M] + 01db G72M [Quadro NVS 120M] + 01dc G72GL [Quadro FX 350M] + 01dd G72 [GeForce 7500 LE] + 01de G72GL [Quadro FX 350] + 10de 01dc Quadro FX Go350M + 01df G71 [GeForce 7300 GS] + 01e0 nForce2 IGP2 + 147b 1c09 NV7 Motherboard + 01e8 nForce2 AGP + 01ea nForce2 Memory Controller 0 + a0a0 03b9 UK79G-1394 motherboard + 01eb nForce2 Memory Controller 1 + a0a0 03b9 UK79G-1394 motherboard + 01ec nForce2 Memory Controller 2 + a0a0 03b9 UK79G-1394 motherboard + 01ed nForce2 Memory Controller 3 + a0a0 03b9 UK79G-1394 motherboard + 01ee nForce2 Memory Controller 4 + 10de 01ee MSI Delta-L nForce2 memory controller + a0a0 03b9 UK79G-1394 motherboard + 01ef nForce2 Memory Controller 5 + a0a0 03b9 UK79G-1394 motherboard + 01f0 NV18 [GeForce4 MX - nForce GPU] + a0a0 03b5 UK79G-1394 motherboard + 0200 NV20 [GeForce3] + 1043 402f AGP-V8200 DDR + 1048 0c70 GLADIAC 920 + 0201 NV20 [GeForce3 Ti 200] + 0202 NV20 [GeForce3 Ti 500] + 1043 405b V8200 T5 + 1545 002f Xtasy 6964 + 0203 NV20DCC [Quadro DCC] + 0211 NV48 [GeForce 6800] + 0212 NV48 [GeForce 6800 LE] + 0215 NV48 [GeForce 6800 GT] + 0218 NV48 [GeForce 6800 XT] + 0221 NV44A [GeForce 6200] + 3842 a341 256A8N341DX + 0222 NV44 [GeForce 6200 A-LE] + 0240 C51PV [GeForce 6150] + 1043 81cd A8N-VM CSM + 1462 7207 K8NGM2 series + 0241 C51 [GeForce 6150 LE] + 0242 C51G [GeForce 6100] + 105b 0cad Winfast 6100K8MB + 0243 C51 PCI Express Bridge + 0244 C51 [Geforce Go 6150] + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 10de 0244 GeForce Go 6150 + 0245 C51 [Quadro NVS 210S/GeForce 6150LE] + 0246 C51 PCI Express Bridge + 0247 C51 [GeForce Go 6100] + 1043 1382 MCP51 PCI-X GeForce Go 6100 + 0248 C51 PCI Express Bridge + 0249 C51 PCI Express Bridge + 024a C51 PCI Express Bridge + 024b C51 PCI Express Bridge + 024c C51 PCI Express Bridge + 024d C51 PCI Express Bridge + 024e C51 PCI Express Bridge + 024f C51 PCI Express Bridge + 0250 NV25 [GeForce4 Ti 4600] + 0251 NV25 [GeForce4 Ti 4400] + 1043 8023 v8440 GeForce 4 Ti4400 + 10de 0251 PNY GeForce4 Ti 4400 + 1462 8710 PNY GeForce4 Ti 4400 + 0252 NV25 [GeForce4 Ti] + 0253 NV25 [GeForce4 Ti 4200] + 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI) + 147b 8f09 Siluro (Dual VGA/TV-out/DVI) + 0258 NV25GL [Quadro4 900 XGL] + 0259 NV25GL [Quadro4 750 XGL] + 025b NV25GL [Quadro4 700 XGL] + 0260 MCP51 LPC Bridge + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1458 5001 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0261 MCP51 LPC Bridge + 105b 0cad Winfast 6100K8MB + 0262 MCP51 LPC Bridge + 0263 MCP51 LPC Bridge + 0264 MCP51 SMBus + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 0265 MCP51 IDE + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series +# Foxconn has used a wrong vendor ID for this one + f05b 0cad Winfast 6100K8MB + 0266 MCP51 Serial ATA Controller + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 0267 MCP51 Serial ATA Controller + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 0268 MCP51 Ethernet Controller + 0269 MCP51 Ethernet Controller + 103c 30b7 Presario V6133CL + 1043 8141 A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 026a MCP51 MCI + 026b MCP51 AC97 Audio Controller + 105b 0cad Winfast 6100K8MB + 026c MCP51 High Definition Audio + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 10de cb84 A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 026d MCP51 USB Controller + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 026e MCP51 USB Controller + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 026f MCP51 PCI Bridge + 103c 30b7 Presario V6133CL + 0270 MCP51 Host Bridge + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1458 5001 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0271 MCP51 PMU + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 0272 MCP51 Memory Controller 0 + 105b 0cad Winfast 6100K8MB + 027e C51 Memory Controller 2 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 027f C51 Memory Controller 3 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0280 NV28 [GeForce4 Ti 4800] + 0281 NV28 [GeForce4 Ti 4200 AGP 8x] + 0282 NV28 [GeForce4 Ti 4800 SE] + 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x] + 0288 NV28GL [Quadro4 980 XGL] + 0289 NV28GL [Quadro4 780 XGL] + 028c NV28GLM [Quadro4 Go700] + 0290 G71 [GeForce 7900 GTX] + 0291 G71 [GeForce 7900 GT/GTO] + 10de 042b NX7900GTO-T2D512E [7900 GTO] + 0292 G71 [GeForce 7900 GS] + 0293 G71 [GeForce 7900 GX2] + 0294 G71 [GeForce 7950 GX2] + 0295 G71 [GeForce 7950 GT] + 1043 8225 GeForce 7950 GT + 107d 2a68 WinFast PX7950GT TDH + 1462 0663 NX7950GT-VT2D512EZ-HD + 0297 G71 [GeForce Go 7950 GTX] + 0298 G71 [GeForce Go 7900 GS] + 0299 G71 [GeForce Go 7900 GTX] + 029a G71 [Quadro FX 2500M] + 029b G71 [Quadro FX 1500M] + 029c G71 [Quadro FX 5500] + 029d G71GL [Quadro FX 3500] + 029e G71 [Quadro FX 1500] + 029f G70 [Quadro FX 4500 X2] +# Xbox Graphics Processing Unit (Integrated). GeForce3 derivative (NV20 < NV2A < NV25). + 02a0 NV2A [XGPU] + 02a5 MCPX CPU Bridge + 02a6 MCPX Memory Controller + 02e0 G73 [GeForce 7600 GT] + 02e0 2249 GF 7600GT 560M 256MB DDR3 DUAL DVI TV + 02e1 G73 [GeForce 7600 GS] + 1682 222b PV-T73K-UAL3 (256MB) + 1682 2247 GF 7600GS 512MB DDR2 + 02e2 G73 [GeForce 7300 GT] + 02e3 G71 [GeForce 7900 GS] + 02e4 G71 [GeForce 7950 GT] + 1682 2271 PV-T71A-YDF7 (512MB) + 02f0 C51 Host Bridge + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 02f1 C51 Host Bridge + 1458 5000 GA-M55plus-S3G + 02f2 C51 Host Bridge + 02f3 C51 Host Bridge + 02f4 C51 Host Bridge + 02f5 C51 Host Bridge + 02f6 C51 Host Bridge + 02f7 C51 Host Bridge + 02f8 C51 Memory Controller 5 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02f9 C51 Memory Controller 4 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02fa C51 Memory Controller 0 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02fb C51 PCI Express Bridge + 02fc C51 PCI Express Bridge + 103c 30b7 Presario V6133CL + 02fd C51 PCI Express Bridge + 103c 30b7 Presario V6133CL + 02fe C51 Memory Controller 1 + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02ff C51 Host Bridge + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0300 NV30 [GeForce FX] + 0301 NV30 [GeForce FX 5800 Ultra] + 0302 NV30 [GeForce FX 5800] + 0308 NV30GL [Quadro FX 2000] + 0309 NV30GL [Quadro FX 1000] + 0311 NV31 [GeForce FX 5600 Ultra] + 0312 NV31 [GeForce FX 5600] + 0313 NV31 + 0314 NV31 [GeForce FX 5600XT] + 1043 814a V9560XT/TD + 0316 NV31M + 0317 NV31M Pro + 031a NV31M [GeForce FX Go5600] + 031b NV31M [GeForce FX Go5650] + 031c NV31 [Quadro FX Go700] + 031d NV31GLM + 031e NV31GLM Pro + 031f NV31GLM Pro + 0320 NV34 [GeForce FX 5200] + 0321 NV34 [GeForce FX 5200 Ultra] + 0322 NV34 [GeForce FX 5200] + 1043 02fb V9250 Magic + 1043 8180 V9520-X/TD/128M + 1462 9110 MS-8911 (FX5200-TD128) + 1462 9171 MS-8917 (FX5200-T128) + 1462 9360 MS-8936 (FX5200-T128) + 0323 NV34 [GeForce FX 5200LE] + 0324 NV34M [GeForce FX Go5200 64M] + 1028 0196 Inspiron 5160 + 103c 006a Pavillon ZD7000 laptop + 1071 8160 MIM2000 + 0325 NV34M [GeForce FX Go5250] + 0326 NV34 [GeForce FX 5500] + 1458 310d GeForce FX 5500 128 MB + 1682 2034 GeForce 5500 256 MB + 0327 NV34 [GeForce FX 5100] + 0328 NV34M [GeForce FX Go5200 32M/64M] + 0329 NV34M [GeForce FX Go5200] + 10de 0010 Powerbook G4 + 032a NV34GL [Quadro NVS 280 PCI] + 032b NV34GL [Quadro FX 500/600 PCI] + 032c NV34GLM [GeForce FX Go 5300] + 032d NV34 [GeForce FX Go5100] + 032f NV34GL + 0330 NV35 [GeForce FX 5900 Ultra] + 1043 8137 V9950 Ultra / 256 MB + 0331 NV35 [GeForce FX 5900] + 1043 8145 V9950GE + 0332 NV35 [GeForce FX 5900XT] + 0333 NV38 [GeForce FX 5950 Ultra] + 0334 NV35 [GeForce FX 5900ZT] + 1462 9373 FX5900ZT-VTD128 (MS-8937) + 0338 NV35GL [Quadro FX 3000] + 033f NV35GL [Quadro FX 700] + 0341 NV36.1 [GeForce FX 5700 Ultra] + 1462 9380 MS-8938 (FX5700U-TD128) + 0342 NV36.2 [GeForce FX 5700] + 0343 NV36 [GeForce FX 5700LE] + 0344 NV36.4 [GeForce FX 5700VE] + 0345 NV36.5 + 0347 NV36 [GeForce FX Go5700] + 103c 006a NX9500 + 0348 NV36 [GeForce FX Go5700] + 0349 NV36M Pro + 034b NV36MAP + 034c NV36 [Quadro FX Go1000] + 034e NV36GL [Quadro FX 1100] + 034f NV36GL + 0360 MCP55 LPC Bridge + 0361 MCP55 LPC Bridge + 1028 0221 PowerEdge R805 MCP55 LPC Bridge + 0362 MCP55 LPC Bridge + 147b 12c4 KN9-Ultra Mainboard + 0363 MCP55 LPC Bridge + 0364 MCP55 LPC Bridge + 1028 0221 PowerEdge R805 MCP55 LPC Bridge + 0365 MCP55 LPC Bridge + 0366 MCP55 LPC Bridge + 0367 MCP55 LPC Bridge + 0368 MCP55 SMBus + 1028 020c PowerEdge M605 MCP55 SMBus + 1028 0221 PowerEdge R805 MCP55 SMBus + 147b 12c4 KN9-Ultra Mainboard + 0369 MCP55 Memory Controller + 147b 12c4 KN9-Ultra Mainboard + 036a MCP55 Memory Controller + 036b MCP55 SMU + 036c MCP55 USB Controller + 1028 020c PowerEdge M605 MCP55 USB Controller + 1028 0221 PowerEdge R805 MCP55 USB Controller + 147b 12c4 KN9-Ultra Mainboard + 036d MCP55 USB Controller + 1028 020c PowerEdge M605 MCP55 USB Controller + 1028 0221 PowerEdge R805 MCP55 USB Controller + 147b 12c4 KN9-Ultra Mainboard + 036e MCP55 IDE + 147b 12c4 KN9-Ultra Mainboard + 0370 MCP55 PCI bridge + 0371 MCP55 High Definition Audio + 0372 MCP55 Ethernet + 0373 MCP55 Ethernet + 147b 12c4 KN9-Ultra Mainboard + 0374 MCP55 PCI Express bridge + 0375 MCP55 PCI Express bridge + 0376 MCP55 PCI Express bridge + 0377 MCP55 PCI Express bridge + 0378 MCP55 PCI Express bridge + 037a MCP55 Memory Controller + 037e MCP55 SATA Controller + 037f MCP55 SATA Controller + 1028 0221 PowerEdge R805 MCP55 SATA Controller + 147b 12c4 KN9-Ultra Mainboard + 0390 G73 [GeForce 7650 GS] + 0391 G73 [GeForce 7600 GT] + 1458 3427 GV-NX76T128D-RH + 0392 G73 [GeForce 7600 GS] + 1462 0622 NX7600GS-T2D256EH + 0393 G73 [GeForce 7300 GT] + 10de 0412 NX7300GT-TD256EH + 1462 0412 NX7300GT-TD256EH + 0394 G73 [GeForce 7600 LE] + 0395 G73 [GeForce 7300 GT] + 0397 G73 [GeForce Go 7700] + 0398 G73 [GeForce Go 7600] + 1025 006c Acer 9814 WKMI + 0399 G73 [GeForce Go 7600 GT] + 039a G73M [Quadro NVS 300M] + 039b G73 [GeForce Go 7900 SE] + 039c G73 [Quadro FX 550M] + 10de 039c Quadro FX 560M + 039e G73GL [Quadro FX 560] + 03a0 C55 Host Bridge + 03a1 C55 Host Bridge + 03a2 C55 Host Bridge + 03a3 C55 Host Bridge + 03a4 C55 Host Bridge + 03a5 C55 Host Bridge + 03a6 C55 Host Bridge + 03a7 C55 Host Bridge + 03a8 C55 Memory Controller + 03a9 C55 Memory Controller + 03aa C55 Memory Controller + 03ab C55 Memory Controller + 03ac C55 Memory Controller + 03ad C55 Memory Controller + 03ae C55 Memory Controller + 03af C55 Memory Controller + 03b0 C55 Memory Controller + 03b1 C55 Memory Controller + 03b2 C55 Memory Controller + 03b3 C55 Memory Controller + 03b4 C55 Memory Controller + 03b5 C55 Memory Controller + 03b6 C55 Memory Controller + 03b7 C55 PCI Express bridge + 03b8 C55 PCI Express bridge + 03b9 C55 PCI Express bridge + 03ba C55 Memory Controller + 03bb C55 PCI Express bridge + 03bc C55 Memory Controller + 03d0 C61 [GeForce 6150SE nForce 430] + 03d1 C61 [GeForce 6100 nForce 405] + 03d2 C61 [GeForce 6100 nForce 400] + 03d5 C61 [GeForce 6100 nForce 420] + 03d6 C61 [GeForce 7025 / nForce 630a] + 03e0 MCP61 LPC Bridge + 1849 03e0 939NF6G-VSTA Board + 03e1 MCP61 LPC Bridge + 03e2 MCP61 LPC Bridge + 03e3 MCP61 LPC Bridge + 03e4 MCP61 High Definition Audio + 03e5 MCP61 Ethernet + 03e6 MCP61 Ethernet + 03e7 MCP61 SATA Controller + 03e8 MCP61 PCI Express bridge + 1849 03e8 939NF6G-VSTA Board + 03e9 MCP61 PCI Express bridge + 1849 03e9 939NF6G-VSTA Board + 03ea MCP61 Memory Controller + 1849 03ea 939NF6G-VSTA Board + 03eb MCP61 SMBus + 1849 03eb 939NF6G-VSTA Board + 03ec MCP61 IDE + 1849 03ec 939NF6G-VSTA Board + 03ee MCP61 Ethernet + 03ef MCP61 Ethernet + 1849 03ef 939NF6G-VSTA Board + 03f0 MCP61 High Definition Audio + 1849 0888 939NF6G-VSTA Board + 03f1 MCP61 USB Controller + 1849 03f1 939NF6G-VSTA Board + 03f2 MCP61 USB Controller + 1849 03f2 939NF6G-VSTA Board + 03f3 MCP61 PCI bridge + 1849 03f3 939NF6G-VSTA Board + 03f4 MCP61 SMU + 03f5 MCP61 Memory Controller + 1849 03eb 939NF6G-VSTA Board + 03f6 MCP61 SATA Controller + 1849 03f6 939NF6G-VSTA Board + 03f7 MCP61 SATA Controller + 0400 G84 [GeForce 8600 GTS] + 0401 G84 [GeForce 8600GT] + 0402 G84 [GeForce 8600 GT] + 1462 0910 NX8600GT-T2D256EZ + 0403 G84 [GeForce 8600 GS] + 0404 G84 [GeForce 8400 GS] + 1462 1230 NX8400GS-TD256E + 0405 G84 [GeForce 9500M GS] + 0407 G84 [GeForce 8600M GT] + 0408 G84 [GeForce 9650M GS] + 0409 G84 [GeForce 8700M GT] + 040a G84 [Quadro FX 370] + 040b Quadro NVS 320M + 040c Quadro FX 570M + 17aa 20d9 ThinkPad T61p + 040d Quadro FX 1600M + 040e G84 [Quadro FX 570] + 040f G84 [Quadro FX 1700] + 0420 G86 [GeForce 8400 SE] + 0421 G86 [GeForce 8500 GT] + 1462 0960 NX8500GT-TD512EH/M2 + 0422 G86 [GeForce 8400 GS] + 0423 G86 [GeForce 8300 GS] + 0424 G86 [GeForce 8400 GS] + 0425 G86 [GeForce 8600M GS] + 1025 0121 Aspire 5920G + 0426 G86 [GeForce 8400M GT] + 0427 G86 [GeForce 8400M GS] + 0428 G86 [GeForce 8400M G] + 0429 Quadro NVS 140M + 17aa 20d8 ThinkPad T61 + 042a Quadro NVS 130M + 042b Quadro NVS 135M + 042c G86 [GeForce 9400 GT] + 042d Quadro FX 360M + 042e G86 [GeForce 9300M G] + 042f G86 [Quadro NVS 290] + 0440 MCP65 LPC Bridge + 0441 MCP65 LPC Bridge + 0442 MCP65 LPC Bridge + 0443 MCP65 LPC Bridge + 0444 MCP65 Memory Controller + 0445 MCP65 Memory Controller + 0446 MCP65 SMBus + 0447 MCP65 SMU + 0448 MCP65 IDE + 0449 MCP65 PCI bridge + 044a MCP65 High Definition Audio + 044b MCP65 High Definition Audio + 044c MCP65 AHCI Controller + 044d MCP65 AHCI Controller + 044e MCP65 AHCI Controller + 044f MCP65 AHCI Controller + 0450 MCP65 Ethernet + 0451 MCP65 Ethernet + 0452 MCP65 Ethernet + 0453 MCP65 Ethernet + 0454 MCP65 USB Controller + 0455 MCP65 USB Controller + 0456 MCP65 USB Controller + 0457 MCP65 USB Controller + 0458 MCP65 PCI Express bridge + 0459 MCP65 PCI Express bridge + 045a MCP65 PCI Express bridge + 045c MCP65 SATA Controller + 045d MCP65 SATA Controller + 045e MCP65 SATA Controller + 045f MCP65 SATA Controller + 0531 C67 [GeForce 7150M / nForce 630M] + 0533 C67 [GeForce 7000M / nForce 610M] + 053a C68 [GeForce 7050 PV / nForce 630a] + 053b C68 [GeForce 7050 PV / nForce 630a] + 1043 8308 M2N68-AM Motherbord + 053e C68 [GeForce 7025 / nForce 630a] + 0541 MCP67 Memory Controller + 0542 MCP67 SMBus + 1043 8308 M2N68-AM Motherbord + 0543 MCP67 Co-processor + 0547 MCP67 Memory Controller + 1043 8308 M2N68-AM Motherbord + 1849 0547 ALiveNF7G-HDready + 0548 MCP67 ISA Bridge + 1043 8308 M2N68-AM Motherboard + 054c MCP67 Ethernet + 1043 8308 M2N68-AM Motherbord + 1849 054c ALiveNF7G-HDready, MCP67 Gigabit Ethernet + 054d MCP67 Ethernet + 054e MCP67 Ethernet +# forcedeth source code from Nvidi + 054f MCP67 Ethernet + 0550 MCP67 AHCI Controller + 1043 8308 M2N68-AM Motherboard + 0554 MCP67 AHCI Controller + 1043 8308 M2N68-AM Motherboard + 0555 MCP67 SATA Controller + 1043 8308 M2N68-AM Motherboard + 055c MCP67 High Definition Audio + 1043 8290 M2N68-AM Motherboard + 055d MCP67 High Definition Audio + 055e MCP67 OHCI USB 1.1 Controller + 1043 8308 M2N68-AM Motherboard + 055f MCP67 EHCI USB 2.0 Controller + 1043 8308 M2N68-AM Motherboard + 0560 MCP67 IDE Controller + f043 8308 M2N68-AM Motherboard + 0561 MCP67 PCI Bridge + 0562 MCP67 PCI Express Bridge + 1849 0562 ALiveNF7G-HDready + 0563 MCP67 PCI Express Bridge + 0568 MCP78S [GeForce 8200] Memory Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0568 K10N78FullHD-hSLI R3.0 Memory Controller + 0569 MCP78S [GeForce 8200] PCI Express Bridge + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0569 K10N78FullHD-hSLI R3.0 PCI Express Bridge + 056a MCP73 [nForce 630i] USB 2.0 Controller (EHCI) + 056c MCP73 IDE + 1afa 7150 JW-IN7150-HD + 056d MCP73 PCI Express bridge + 056e MCP73 PCI Express bridge + 056f MCP73 PCI Express bridge + 05b8 PCI express bridge for GTX 295 + 05be PCI express bridge for Quadro Plex S4 / Tesla S870 / Tesla S1070 + 05e0 GT200b [GeForce GTX 295] + 05e1 GT200 [GeForce GTX 280] +# GT200 [GTX 260] or GT200 [GTX 260-216] or GT200b [GTX 260-216] + 05e2 GT200 [GeForce GTX 260] + 05e3 GT200b [GeForce GTX 285] + 05e6 GT200b [GeForce GTX 275] +# Found in GPU server Tesla S1070 + 05e7 GT200 [Tesla C1060] + 05ed GT200GL [Quadro Plex 2200 D2] + 05f8 GT200GL [Quadro Plex 2200 S4] + 05f9 GT200GL [Quadro CX] + 05fd GT200GL [Quadro FX 5800] + 05fe GT200GL [Quadro FX 4800] + 0600 G92 [GeForce 8800 GTS 512] + 0601 G92 [GeForce 9800 GT] + 0602 G92 [GeForce 8800 GT] + 0604 G92 [GeForce 9800 GX2] + 0605 G92 [GeForce 9800 GT] + 0606 G92 [GeForce 8800 GS] + 0608 G92 [GeForce 9800M GTX] + 0609 G92 [GeForce 8800M GTS] + 060a GT200 [GeForce GTX 280M] + 060b G92 [GeForce 9800M GT] + 060c G92 [GeForce 8800M GTX] + 060d G92 [GeForce 8800 GS] + 0610 G92 [GeForce 9600 GSO] + 1682 2385 GeForce 9600 GSO 768mb + 0611 G92 [GeForce 8800 GT] + 107d 2ab0 Winfast PX8800 GT PCI-E + 19da 1040 ZT-88TES2P-FSP + 0612 G92 [GeForce 9800 GTX] + 0613 G92 [GeForce 9800 GTX+] + 0614 G92 [GeForce 9800 GT] + 107d 2ab3 WinFast PX9800 GT (S-Fanpipe) + 0615 G92 [GeForce GTS 250] + 3842 1150 GeForce GTS 250 P/N 512-P3-1150-TR +# Overclocked + 3842 1151 GeForce GTS 250 P/N 512-P3-1151-TR + 3842 1155 GeForce GTS 250 P/N 01G-P3-1155-TR +# Overclocked + 3842 1156 GeForce GTS 250 P/N 01G-P3-1156-TR + 0617 G92 [GeForce 9800M GTX] + 0618 GT200 [GeForce GTX 260M] + 0619 G92GL [Quadro FX 4700 X2] + 061a G92 [Quadro FX 3700] + 061b G92GL [Quadro VX 200] + 061c G92M [Quadro FX 3600M] + 0622 G94 [GeForce 9600 GT] + 107d 2ac1 WinFast PX9600GT 1024MB + 1458 3481 GV-NX96T512HP + 0623 G94 [GeForce 9600 GS] + 0625 G94 [GeForce 9600 GSO 512] + 0626 G94 [GeForce GT 130] + 0627 G94 [GeForce GT 140] + 0628 G94 [GeForce 9800M GTS] + 062a G94 [GeForce 9700M GTS] + 062b G94 [GeForce 9800M GS] + 062c G94 [GeForce 9800M GTS] + 0631 G94M [GeForce GTS 160M] + 0632 G94M [GeForce GTS 150M] + 0638 G94 [Quadro FX 1800] + 063a G94M [Quadro FX 2700M] + 0640 G96 [GeForce 9500 GT] + 0641 G96 [GeForce 9400 GT] + 0643 G96 [GeForce 9500 GT] + 0644 G96 [GeForce 9500 GS] + 0645 G96 [GeForce 9500 GS] + 0646 G96 [GeForce GT 120] + 0647 G96 [GeForce 9600M GT] + 0648 G96 [GeForce 9600M GS] + 0649 G96 [GeForce 9600M GT] + 064a G96 [GeForce 9700M GT] + 064b G96 [GeForce 9500M G] + 064c G96 [GeForce 9650M GT] + 0651 G96 [GeForce G 110M] + 0652 G96 [GeForce GT 130M] + 0653 G96M [GeForce GT 120M] + 0658 G96 [Quadro FX 380] + 0659 G96 [Quadro FX 580] + 065b G96 [GeForce 9400 GT] + 065c G96M [Quadro FX 770M] + 06e0 G98 [GeForce 9300 GE] + 06e1 G98 [GeForce 9300 GS] + 06e2 G98 [GeForce 8400] + 06e3 G98 [GeForce 8300 GS] + 06e4 G98 [GeForce 8400 GS] + 1458 3475 GV-NX84S256HE [GeForce 8400 GS] + 06e5 G98 [GeForce 9300M GS] + 06e6 G98 [GeForce G100] + 06e7 G98 [GeForce 9300 SE] + 06e8 G98 [GeForce 9200M GS] + 06e9 G98 [GeForce 9300M GS] + 1043 19b2 U6V laptop + 06ea G86M [Quadro NVS 150M] + 06eb G98M [Quadro NVS 160M] + 06ec G98M [GeForce G 105M] + 06ef G98M [GeForce G 103M] + 06f8 G98 [Quadro NVS 420] + 06f9 G98 [Quadro FX 370 LP] + 06fa G98 [Quadro NVS 450] + 0751 MCP78S [GeForce 8200] Memory Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0751 K10N78FullHD-hSLI R3.0 Memory Controller + 0752 MCP78S [GeForce 8200] SMBus + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0752 K10N78FullHD-hSLI R3.0 SMBus + 0753 MCP78S [GeForce 8200] Co-Processor + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0753 K10N78FullHD-hSLI R3.0 Co-Processor + 0754 MCP78S [GeForce 8200] Memory Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0754 K10N78FullHD-hSLI R3.0 Memory Controller + 0759 MCP78S [GeForce 8200] IDE + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0759 K10N78FullHD-hSLI R3.0 IDE + 075a MCP78S [GeForce 8200] PCI Bridge + 1043 82e8 M3N72-D + 1849 075a K10N78FullHD-hSLI R3.0 PCI Bridge + 075b MCP78S [GeForce 8200] PCI Express Bridge + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 075b K10N78FullHD-hSLI R3.0 PCI Express Bridge + 075c MCP78S [GeForce 8200] LPC Bridge + 1462 7508 K9N2GM-FIH + 1849 075c K10N78FullHD-hSLI R3.0 LPC Bridge + 075d nForce 750a LPC Bridge + 1043 82e8 M3N72-D + 0760 MCP77 Ethernet + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0760 K10N78FullHD-hSLI R3.0 Ethernet + 0761 MCP77 Ethernet + 0762 MCP77 Ethernet + 0763 MCP77 Ethernet + 0774 MCP72XE/MCP72P/MCP78U/MCP78S High Definition Audio +# has a Realtek ALC1200 HDAudio Codec + 1043 82fe M3N72-D + 1462 7508 K9N2GM-FIH + 1849 3662 K10N78FullHD-hSLI R3.0 High Definition Audio + 0778 MCP78S [GeForce 8200] PCI Express Bridge + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0778 K10N78FullHD-hSLI R3.0 PCI Express Bridge + 077a MCP78S [GeForce 8200] PCI Bridge + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077a K10N78FullHD-hSLI R3.0 PCI Bridge + 077b MCP78S [GeForce 8200] OHCI USB 1.1 Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077b K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller + 077c MCP78S [GeForce 8200] EHCI USB 2.0 Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077c K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller + 077d MCP78S [GeForce 8200] OHCI USB 1.1 Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077d K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller + 077e MCP78S [GeForce 8200] EHCI USB 2.0 Controller + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077e K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller + 07c0 MCP73 Host Bridge + 1afa 7150 JW-IN7150-HD + 07c1 MCP73 Host Bridge + 07c2 MCP73 Host Bridge + 07c5 MCP73 Host Bridge + 07c8 MCP73 Memory Controller + 1afa 7150 JW-IN7150-HD + 07cb nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07cd nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07ce nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07cf nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d0 nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d1 nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d2 nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d3 nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d6 nForce 630i memory controller + 1afa 7150 JW-IN7150-HD + 07d7 MCP73 LPC Bridge + 1afa 7150 JW-IN7150-HD + 07d8 MCP73 SMBus + 1afa 7150 JW-IN7150-HD + 07d9 MCP73 Memory Controller + 1afa 7150 JW-IN7150-HD + 07da MCP73 Co-processor + 1afa 7150 JW-IN7150-HD + 07dc MCP73 Ethernet + 07dd MCP73 Ethernet + 07de MCP73 Ethernet + 07df MCP73 Ethernet + 07e0 C73 [GeForce 7150 / nForce 630i] + 1afa 7150 JW-IN7150-HD + 07e1 C73 [GeForce 7100 / nForce 630i] + 07e2 GeForce 7050 / nForce 630i + 07e3 C73 [GeForce 7050 / nForce 610i] + 07e5 C73 [GeForce 7100 / nForce 620i] + 07f0 MCP73 IDE + 07f4 GeForce 7100/nForce 630i SATA + 07f8 MCP73 SATA RAID Controller + 07fc MCP73 High Definition Audio + 10de 07fc MCP73 High Definition Audio + 07fe GeForce 7100/nForce 630i USB + 1afa 7150 JW-IN7150-HD + 0844 C77 [GeForce 9100M G] + 0845 C77 [GeForce 8200M G] + 0847 C78 [GeForce 9100] + 0848 C77 [GeForce 8300] + 0849 C77 [GeForce 8200] + 1462 7508 K9N2GM-FIH + 1849 0849 K10N78FullHD-hSLI R3.0 GeForce 8200 + 084a C77 [nForce 730a] + 084b C77 [GeForce 8200] + 084c C77 [nForce 780a SLI] + 084d C77 [nForce 750a SLI] + 1043 82e8 M3N72-D mGPU + 084f C77 [GeForce 8100 / nForce 720a] + 0860 C79 [GeForce 9300] + 0861 C79 [GeForce 9400] + 0862 C79 [GeForce 9400M G] + 0863 C79 [GeForce 9400M] + 0864 C79 [GeForce 9300] + 0865 C79 [GeForce 9300] + 0866 C79 [GeForce 9400M G] + 0867 C79 [GeForce 9400] + 0868 C79 [nForce 760i SLI] + 086a C79 [GeForce 9400] + 086c C79 [GeForce 9300 / nForce 730i] + 086d C79 [GeForce 9200] + 086e C79 [GeForce 9100M G] + 086f C79 [GeForce 9200M G] + 0870 C79 [GeForce 9400M] + 0871 C79 [GeForce 9200] + 0872 C79 [GeForce G102M] + 0873 C79 [GeForce G102M] + 087a C79 [Quadro FX 470] + 087d ION VGA + 087f C79 [Quadro FX 470M] + 0a20 GT200 [GeForce GT 220] + 0a60 GT200 [GeForce G210] + 0a65 GT200 [GeForce 210] + 0a80 MCP79 Host Bridge + 0a81 MCP79 Host Bridge + 0a82 MCP79 Host Bridge + 0a83 MCP79 Host Bridge + 0a84 MCP79 Host Bridge + 0a85 MCP79 Host Bridge + 0a86 MCP79 Host Bridge + 0a87 MCP79 Host Bridge + 0a88 MCP79 Memory Controller + 0a89 MCP79 Memory Controller + 0aa0 MCP79 PCI Express Bridge + 0aa2 MCP79 SMBus + 0aa3 MCP79 Co-processor + 0aa4 MCP79 Memory Controller + 0aa5 MCP79 OHCI USB 1.1 Controller + 0aa6 MCP79 EHCI USB 2.0 Controller + 0aa7 MCP79 OHCI USB 1.1 Controller + 0aa8 MCP79 OHCI USB 1.1 Controller + 0aa9 MCP79 EHCI USB 2.0 Controller + 0aaa MCP79 EHCI USB 2.0 Controller + 0aab MCP79 PCI Bridge + 0aac MCP79 LPC Bridge + 0aad MCP79 LPC Bridge + 0aae MCP79 LPC Bridge + 0aaf MCP79 LPC Bridge + 0ab0 MCP79 Ethernet + 0ab1 MCP79 Ethernet + 0ab2 MCP79 Ethernet + 0ab3 MCP79 Ethernet + 0ab4 MCP79 SATA Controller + 0ab5 MCP79 SATA Controller + 0ab6 MCP79 SATA Controller + 0ab7 MCP79 SATA Controller + 0ab8 MCP79 AHCI Controller + 0ab9 MCP79 AHCI Controller + 0aba MCP79 AHCI Controller + 0abb MCP79 AHCI Controller + 0abc MCP79 RAID Controller + 0abd MCP79 RAID Controller + 0abe MCP79 RAID Controller + 0abf MCP79 RAID Controller + 0ac0 MCP79 High Definition Audio + 0ac1 MCP79 High Definition Audio + 0ac2 MCP79 High Definition Audio + 0ac3 MCP79 High Definition Audio + 0ac4 MCP79 PCI Express Bridge + 0ac5 MCP79 PCI Express Bridge + 0ac6 MCP79 PCI Express Bridge + 0ac7 MCP79 PCI Express Bridge + 0ac8 MCP79 PCI Express Bridge + 0ad0 MCP78S [GeForce 8200] SATA Controller (non-AHCI mode) + 1462 7508 K9N2GM-FIH + 1849 0ad0 K10N78FullHD-hSLI R3.0 IDE + 0ad4 MCP78S [GeForce 8200] AHCI Controller + 1043 82e8 M3N72-D + 1849 0ad4 K10N78FullHD-hSLI R3.0 AHCI Controller + 0ad8 MCP78S [GeForce 8200] SATA Controller (RAID mode) +10df Emulex Corporation + 1ae5 LP6000 Fibre Channel Host Adapter + e100 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + e180 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + f011 Saturn: LightPulse Fibre Channel Host Adapter + f015 Saturn: LightPulse Fibre Channel Host Adapter + f085 LP850 Fibre Channel Host Adapter + f095 LP952 Fibre Channel Host Adapter + f098 LP982 Fibre Channel Host Adapter + f0a1 Thor LightPulse Fibre Channel Host Adapter + f0a5 Thor LightPulse Fibre Channel Host Adapter + f0b5 Viper LightPulse Fibre Channel Host Adapter + f0d1 Helios LightPulse Fibre Channel Host Adapter + f0d5 Helios LightPulse Fibre Channel Host Adapter + f0e1 Zephyr LightPulse Fibre Channel Host Adapter + f0e5 Zephyr LightPulse Fibre Channel Host Adapter + f0f5 Neptune LightPulse Fibre Channel Host Adapter + f100 Saturn-X: LightPulse Fibre Channel Host Adapter + f111 Saturn-X LightPulse Fibre Channel Host Adapter + f112 Saturn-X LightPulse Fibre Channel Host Adapter + f700 LP7000 Fibre Channel Host Adapter + f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f800 LP8000 Fibre Channel Host Adapter + f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f900 LP9000 Fibre Channel Host Adapter + f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f980 LP9802 Fibre Channel Host Adapter + f981 LP9802 Fibre Channel Host Adapter Alternate ID + f982 LP9802 Fibre Channel Host Adapter Alternate ID + fa00 Thor-X LightPulse Fibre Channel Host Adapter + fb00 Viper LightPulse Fibre Channel Host Adapter + fc00 Thor-X LightPulse Fibre Channel Host Adapter + 10df fc00 LP10000 LightPulse Fibre Channel Host Adapter + fc10 Helios-X LightPulse Fibre Channel Host Adapter + fc20 Zephyr-X LightPulse Fibre Channel Host Adapter + fc40 Saturn-X: LightPulse Fibre Channel Host Adapter + fc50 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + fd00 Helios-X LightPulse Fibre Channel Host Adapter + fd11 Helios-X LightPulse Fibre Channel Host Adapter + fd12 Helios-X LightPulse Fibre Channel Host Adapter + fe00 Zephyr-X LightPulse Fibre Channel Host Adapter + fe05 Zephyr-X: LightPulse FCoE Adapter + fe11 Zephyr-X LightPulse Fibre Channel Host Adapter + fe12 Zephyr-X LightPulse FCoE Adapter + ff00 Neptune LightPulse Fibre Channel Host Adapter +10e0 Integrated Micro Solutions Inc. + 5026 IMS5026/27/28 + 5027 IMS5027 + 5028 IMS5028 + 8849 IMS8849 + 8853 IMS8853 + 9128 IMS9128 [Twin turbo 128] +10e1 Tekram Technology Co.,Ltd. + 0391 TRM-S1040 + 10e1 0391 DC-315U SCSI-3 Host Adapter + 690c DC-690c + dc29 DC-290 +10e2 Aptix Corporation +10e3 Tundra Semiconductor Corp. + 0000 CA91C042 [Universe] + 0108 Tsi108 Host Bridge for Single PowerPC + 0148 Tsi148 [Tempe] + 1775 1100 VR11 Single Board Computer + 0860 CA91C860 [QSpan] + 0862 CA91C862A [QSpan-II] + 8260 CA91L8200B [Dual PCI PowerSpan II] + 8261 CA91L8260B [Single PCI PowerSpan II] + a108 Tsi109 Host Bridge for Dual PowerPC +10e4 Tandem Computers + 8029 Realtek 8029 Network Card +10e5 Micro Industries Corporation +10e6 Gainbery Computer Products Inc. +10e7 Vadem +10e8 Applied Micro Circuits Corp. + 1072 INES GPIB-PCI (AMCC5920 based) + 2011 Q-Motion Video Capture/Edit board + 4750 S5930 [Matchmaker] + 5920 S5920 + 8043 LANai4.x [Myrinet LANai interface chip] + 8062 S5933_PARASTATION + 807d S5933 [Matchmaker] + 8088 Kongsberg Spacetec Format Synchronizer + 8089 Kongsberg Spacetec Serial Output Board + 809c S5933_HEPC3 + 80b9 Harmonix Hi-Card P8 (4x active ISDN BRI) + 80d7 PCI-9112 + 80d9 PCI-9118 + 80da PCI-9812 + 80fc APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs) + 811a PCI-IEEE1355-DS-DE Interface + 814c Fastcom ESCC-PCI (Commtech, Inc.) + 8170 S5933 [Matchmaker] (Chipset Development Tool) + 81e6 Multimedia video controller + 828d APCI3001 Signal processing controller (up to 16 analog inputs) + 8291 Fastcom 232/8-PCI (Commtech, Inc.) + 82c4 Fastcom 422/4-PCI (Commtech, Inc.) + 82c5 Fastcom 422/2-PCI (Commtech, Inc.) + 82c6 Fastcom IG422/1-PCI (Commtech, Inc.) + 82c7 Fastcom IG232/2-PCI (Commtech, Inc.) + 82ca Fastcom 232/4-PCI (Commtech, Inc.) + 82db AJA HDNTV HD SDI Framestore + 82e2 Fastcom DIO24H-PCI (Commtech, Inc.) + 8406 PCIcanx/PCIcan CAN interface [Kvaser AB] + 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB] + 8851 S5933 on Innes Corp FM Radio Capture card +10e9 Alps Electric Co., Ltd. +10ea Intergraphics Systems + 1680 IGA-1680 + 1682 IGA-1682 + 1683 IGA-1683 + 2000 CyberPro 2000 + 2010 CyberPro 2000A + 5000 CyberPro 5000 + 5050 CyberPro 5050 + 5202 CyberPro 5202 +# CyberPro5202 Audio Function + 5252 CyberPro5252 +10eb Artists Graphics + 0101 3GA + 8111 Twist3 Frame Grabber +10ec Realtek Semiconductor Co., Ltd. + 0139 Zonet Zen3200 + 0260 Realtek 260 High Definition Audio + 0261 Realtek 261 High Definition Audio + 0262 Realtek 262 High Definition Audio + 0280 Realtek 280 High Definition Audio + 0660 Realtek 660 High Definition Audio + 0662 Realtek 662 High Definition Audio + 0861 Realtek 861 High Definition Audio + 0862 Realtek 862 High Definition Audio + 0880 Realtek 880 High Definition Audio + 0883 Realtek 883 High Definition Audio + 1025 1605 TravelMate 5600 series + 0885 Realtek 885 High Definition Audio + 0888 Realtek 888 High Definition Audio + 8029 RTL-8029(AS) + 10b8 2011 EZ-Card (SMC1208) + 10ec 8029 RTL-8029(AS) + 1113 1208 EN1208 + 1186 0300 DE-528 + 1259 2400 AT-2400 + 1af4 1100 Qemu virtual machine + 8129 RTL-8129 + 10ec 8129 RT8129 Fast Ethernet Adapter + 11ec 8129 RT8129 Fast Ethernet Adapter + 8136 RTL8101E/RTL8102E PCI Express Fast Ethernet controller + 1179 ff64 RTL8102E PCI-E Fast Ethernet NIC + 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter + 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter + 8139 RTL-8139/8139C/8139C+ + 0357 000a TTP-Monitoring Card V2.0 + 1025 005a TravelMate 290 + 1025 8920 ALN-325 + 1025 8921 ALN-325 + 103c 006a NX9500 + 103c 30d9 Presario C700 + 1043 1045 L8400B or L3C/S notebook + 1043 8109 P5P800-MX Mainboard + 1071 8160 MIM2000 + 10bd 0320 EP-320X-R + 10f7 8338 Panasonic CF-Y5 laptop + 1113 ec01 FNC-0107TX + 1186 1300 DFE-538TX + 1186 1320 SN5200 + 1186 8139 DRN-32TX + 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter + 1259 2500 AT-2500TX + 1259 2503 AT-2500TX/ACPI + 1385 f31d FA311 v2 + 1395 2100 AMB2100 + 1429 d010 ND010/ND012 + 1432 9130 EN-9130TX + 1436 8139 RT8139 + 144d c00c P30/P35 notebook + 1458 e000 GA-7VM400M/7VT600 Motherboard + 1462 0131 MS-1013 Notebook + 1462 217c Aspire L250 + 1462 788c 865PE Neo2-V Mainboard + 146c 1439 FE-1439TX + 1489 6001 GF100TXRII + 1489 6002 GF100TXRA + 149c 139a LFE-8139ATX + 149c 8139 LFE-8139TX + 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet + 1565 2300 P4TSV Onboard LAN (RTL8100B) + 1631 7003 Onboard RTL8111 on GA-8SIML Rev1.0 Mainboard + 1695 9001 Onboard RTL8101L 10/100 MBit + 16ec 00ff USR997900A + 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card + 1799 5010 F5D5010 CardBus Notebook Network Card + 187e 3303 FN312 + 1904 8139 RTL8139D Fast Ethernet Adapter + 2646 0001 KNE120TX + 8e2e 7000 KF-230TX + 8e2e 7100 KF-230TX/2 + a0a0 0007 ALN-325C + 8167 RTL-8110SC/8169SC Gigabit Ethernet + 1458 e000 GA-MA69G-S3H Motherboard + 1462 235c P965 Neo MS-7235 mainboard + 1462 236c 945P Neo3-F motherboard + 8168 RTL8111/8168B PCI Express Gigabit Ethernet controller + 1043 11f5 A6J-Q008 + 1043 16d5 U6V laptop + 1043 81aa P5B + 1458 e000 GA-EP45-DS5 Motherboard + 1462 238c Onboard RTL8111b on MSI P965 Platinum Mainboard + 1462 368c K9AG Neo2 + 1775 11cc CC11/CL11 + 1849 8168 Motherboard (one of many) + 8169 RTL-8169 Gigabit Ethernet + 1025 0079 Aspire 5024WLMi + 10bd 3202 EP-320G-TX1 32-bit PCI Gigabit Ethernet Adapter + 1259 c107 CG-LAPCIGT + 1371 434e ProG-2000L + 1385 311a GA311 + 1458 e000 GA-8I915ME-G Mainboard + 1462 030c K8N Neo-FSR v2.0 mainboard + 1462 065c Hetis 865GV-E (MS-7065) + 1462 702c K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 16ec 011f USR997903 + 1734 1091 D2030-A1 + a0a0 0449 AK86-L motherboard + 8180 RTL8180L 802.11b MAC + 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller + 8197 SmartLAN56 56K Modem + 8199 RTL8187SE Wireless LAN Controller +10ed Ascii Corporation + 7310 V7310 +10ee Xilinx Corporation + 0001 EUROCOM for PCI (ECOMP) + 0002 Octal E1/T1 for PCI ETP Card + 0205 Wildcard TE205P + 0210 Wildcard TE210P + 0314 Wildcard TE405P/TE410P (1st Gen) + 0405 Wildcard TE405P (2nd Gen) + 0410 Wildcard TE410P (2nd Gen) + 3fc0 RME Digi96 + 3fc1 RME Digi96/8 + 3fc2 RME Digi96/8 Pro + 3fc3 RME Digi96/8 Pad + 3fc4 RME Digi9652 (Hammerfall) + 3fc5 RME Hammerfall DSP + 3fc6 RME Hammerfall DSP MADI + 8380 Ellips ProfiXpress Profibus Master + 8381 Ellips Santos Frame Grabber + d154 Copley Controls CAN card (PCI-CAN-02) +# SED is assigned Xilinx PCI device IDs ebf0 through ebff + ebf0 SED Systems Modulator/Demodulator + ebf1 SED Systems Audio Interface Card + ebf2 SED Systems Common PCI Interface +10ef Racore Computer Products, Inc. + 8154 M815x Token Ring Adapter +10f0 Peritek Corporation +10f1 Tyan Computer + 2865 Tyan Thunder K8E S2865 + 5300 Tyan S5380 Mainboard +10f2 Achme Computer, Inc. +10f3 Alaris, Inc. +10f4 S-MOS Systems, Inc. +10f5 NKK Corporation + a001 NDR4000 [NR4600 Bridge] +10f6 Creative Electronic Systems SA +10f7 Matsushita Electric Industrial Co., Ltd. +10f8 Altos India Ltd +10f9 PC Direct +10fa Truevision + 000c TARGA 1000 +10fb Thesys Gesellschaft fuer Mikroelektronik mbH + 186f TH 6255 +10fc I-O Data Device, Inc. +# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives + 0003 Cardbus IDE Controller + 0005 Cardbus SCSI CBSC II +10fd Soyo Computer, Inc +10fe Fast Multimedia AG +10ff NCube +1100 Jazz Multimedia +1101 Initio Corporation + 0002 INI-920 Ultra SCSI Adapter + 1060 INI-A100U2W + 1622 INI-1623 PCI SATA-II Controller + 9100 INI-9100/9100W + 9400 INI-940 Fast Wide SCSI Adapter + 9401 INI-935 Fast Wide SCSI Adapter + 9500 INI-950 SCSI Adapter + 9502 INI-950P Ultra Wide SCSI Adapter +1102 Creative Labs + 0002 SB Live! EMU10k1 + 100a 1102 SB Live! 5.1 Digital OEM SB0220 EMU10K1-JFF + 1102 0020 CT4850 SBLive! Value + 1102 0021 CT4620 SBLive! + 1102 002f SBLive! mainboard implementation + 1102 100a SB Live! 5.1 Digital OEM [SB0220] + 1102 4001 E-mu APS + 1102 8022 CT4780 SBLive! Value + 1102 8023 CT4790 SoundBlaster PCI512 + 1102 8024 CT4760 SBLive! + 1102 8025 SBLive! Mainboard Implementation + 1102 8026 CT4830 SBLive! Value + 1102 8027 CT4832 SBLive! Value + 1102 8028 CT4760 SBLive! OEM version + 1102 8031 CT4831 SBLive! Value + 1102 8040 CT4760 SBLive! + 1102 8051 CT4850 SBLive! Value + 1102 8061 SBLive! Player 5.1 + 1102 8064 SBLive! 5.1 Model SB0100 + 1102 8065 SBLive! 5.1 Digital Model SB0220 + 1102 8066 Live! 5.1 Digital [SB0228] + 1102 8067 SBLive! 5.1 eMicro 28028 + 0004 SB Audigy + 1102 0051 SB0090 Audigy Player + 1102 0053 SB0090 Audigy Player/OEM + 1102 0058 SB0090 Audigy Player/OEM + 1102 1002 SB Audigy2 Platinum + 1102 1007 SB0240 Audigy 2 Platinum 6.1 + 1102 1009 SB Audigy2 OEM HP + 1102 2002 SB Audigy 2 ZS (SB0350) + 1102 4001 E-MU 1010 + 0005 SB X-Fi + 1102 0021 X-Fi Platinum + 1102 002c X-Fi XtremeGamer FATAL1TY PRO + 1102 1003 X-Fi XtremeMusic + 0006 [SB Live! Value] EMU10k1X + 0007 CA0106 Soundblaster + 1102 0007 SBLive! 24bit + 1102 1001 SB0310 Audigy LS + 1102 1002 SB0312 Audigy LS + 1102 1006 SB0410 SBLive! 24-bit + 1102 100a SB0570 [SB Audigy SE] + 1102 1012 SB0790 X-Fi XA + 1102 1013 Soundblaster X-Fi Xtreme Audio + 1462 1009 K8N Diamond + 0008 SB0400 Audigy2 Value + 1102 0008 EMU0404 Digital Audio System + 1102 4004 EMU1010 Digital Audio System [MAEM8960] + 0009 [SB X-Fi Xtreme Audio] CA0110-IBG + 1102 0010 [SB X-Fi Xtreme Audio] CA0110-IBG + 1102 0018 SB1040 + 000b X-Fi Titanium series [EMU20k2] + 1102 0041 SB X-Fi Titanium PCI-e [SB0880] + 4001 SB Audigy FireWire Port + 1102 0010 SB Audigy FireWire Port + 7002 SB Live! Game Port + 1102 0020 Gameport Joystick + 7003 SB Audigy Game Port + 1102 0040 SB Audigy Game Port + 1102 0060 SB Audigy2 MIDI/Game Port + 7004 [SB Live! Value] Input device controller + 7005 SB Audigy LS Game Port + 1102 1001 SB0310 Audigy LS MIDI/Game port + 1102 1002 SB0312 Audigy LS MIDI/Game port + 7006 [SB X-Fi Xtreme Audio] CA0110-IBG PCI to PCIe Bridge + 8938 Ectiva EV1938 + 1033 80e5 SlimTower-Jim (NEC) + 1071 7150 Mitac 7150 + 110a 5938 Siemens Scenic Mobile 510PIII + 13bd 100c Ceres-C (Sharp, Intel BX) + 13bd 100d Sharp, Intel Banister + 13bd 100e TwinHead P09S/P09S3 (Sharp) + 13bd f6f1 Marlin (Sharp) + 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp) + 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp) + 156d b400 G400 - Geo (AlphaTop (Taiwan)) + 156d b550 G560 (AlphaTop (Taiwan)) + 156d b560 G560 (AlphaTop (Taiwan)) + 156d b700 G700/U700 (AlphaTop (Taiwan)) + 156d b795 G795 (AlphaTop (Taiwan)) + 156d b797 G797 (AlphaTop (Taiwan)) +# nee Triones Technologies, Inc. +1103 HighPoint Technologies, Inc. + 0003 HPT343/345/346/363 + 0004 HPT366/368/370/370A/372/372N + 1103 0001 HPT370A + 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4) + 1103 0005 HPT370 UDMA100 + 1103 0006 HPT302/302N + 0005 HPT372A/372N + 0006 HPT302/302N + 0007 HPT371/371N + 0008 HPT374 + 0009 HPT372N + 1720 RocketRAID 1720 (2x SATA II RAID Controller) + 1740 RocketRAID 1740 + 1742 RocketRAID 1742 + 2300 RocketRAID 230x 4 Port SATA-II Controller + 2310 RocketRAID 2310 4 Port SATA-II Controller + 2320 RocketRAID 2320 SATA-II Controller + 2322 RocketRAID 2322 SATA-II Controller + 2340 RocketRAID 2340 16 Port SATA-II Controller + 2640 RocketRAID 2640 SAS/SATA Controller + 3220 RocketRAID 3220 + 3320 RocketRAID 3320 +1104 RasterOps Corp. +1105 Sigma Designs, Inc. + 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder + 8300 REALmagic Hollywood Plus DVD Decoder + 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder + 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder + 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder + 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder + 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder + 1105 0001 REALmagic X-Card + 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder + 127d 0000 CineView II + 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder + 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder + c622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder +1106 VIA Technologies, Inc. + 0102 Embedded VIA Ethernet Controller + 0130 VT6305 1394.A Controller + 0198 P4X600 Host Bridge + 0204 K8M800 Host Bridge + 0208 PT890 Host Bridge + 0238 K8T890 Host Bridge + 0258 PT880 Host Bridge + 0259 CN333/CN400/PM880 Host Bridge + 0269 KT880 Host Bridge + 0282 K8T800Pro Host Bridge + 1043 80a3 A8V Deluxe + 0290 K8M890 Host Bridge + 0293 PM896 Host Bridge + 0296 P4M800 Host Bridge + 0305 VT8363/8365 [KT133/KM133] + 1019 0987 K7VZA Mainboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard + 0308 PT880 Ultra/PT894 Host Bridge + 1043 8199 P4V800D-X Mainboard + 0314 CN700/VN800/P4M800CE/Pro Host Bridge + 0324 CX700/VX700 Host Bridge + 0327 P4M890 Host Bridge + 0336 K8M890CE Host Bridge + 0340 PT900 Host Bridge + 0351 K8T890CF Host Bridge + 0353 VX800 Host Bridge + 0364 CN896/VN896/P4M900 Host Bridge + 1043 81ce P5VD2-VM mothervoard + 0391 VT8371 [KX133] + 0409 VX855/VX875 Host Bridge: Host Control + 0415 PATA IDE Host Controller + 0501 VT8501 [Apollo MVP4] + 0505 VT82C505 +# Shares chip with :0576. The VT82C576M has :1571 instead of :0561. + 0561 VT82C576MV + 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE + 1019 0985 P6VXA Motherboard + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 8052 VT8233A Bus Master ATA100/66/33 IDE + 1043 808c A7V8X / A7V333 motherboard + 1043 80a1 A7V8X-X motherboard rev. 1.01 + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE + 1179 0001 Magnia Z310 + 1297 f641 FX41 motherboard + 1458 5002 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 1849 0571 K7VT2/K7VT6 motherboard + 0576 VT82C576 3V [Apollo Master] + 0581 CX700/VX700 RAID Controller +# Upgrade bios to get correct ID: 5324 instead of 0581 + 1106 0581 Wrong IDE ID + 0585 VT82C585VP [Apollo VP1/VPX] + 0586 VT82C586/A/B PCI-to-ISA [Apollo VP] + 1106 0000 MVP3 ISA Bridge + 0591 VT8237A SATA 2-Port Controller + 0595 VT82C595 [Apollo VP2] + 0596 VT82C596 ISA [Mobile South] + 1106 0000 VT82C596/A/B PCI to ISA Bridge + 1458 0596 VT82C596/A/B PCI to ISA Bridge + 0597 VT82C597 [Apollo VP3] + 0598 VT82C598 [Apollo MVP3] + 0601 VT8601 [Apollo ProMedia] + 0605 VT8605 [ProSavage PM133] + 103c 1254 D9840-60001 [Brio BA410 Motherboard] + 1043 802c CUV4X mainboard + 0680 VT82C680 [Apollo P6] + 0686 VT82C686 [Apollo Super South] + 1019 0985 P6VXA Motherboard + 103c 1256 D9840-60001 [Brio BA410 Motherboard] + 1043 802c CUV4X mainboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8040 A7M266 Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 1106 0000 VT82C686/A PCI to ISA Bridge + 1106 0686 VT82C686/A PCI to ISA Bridge + 1179 0001 Magnia Z310 + 147b a702 KG7-Lite Mainboard + 0691 VT82C693A/694x [Apollo PRO133x] + 1019 0985 P6VXA Motherboard + 1179 0001 Magnia Z310 + 1458 0691 VT82C691 Apollo Pro System Controller + 0693 VT82C693 [Apollo Pro Plus] + 0698 VT82C693A [Apollo Pro133 AGP] + 0926 VT82C926 [Amazon] + 1000 VT82C570MV + 1106 VT82C570MV + 1122 VX800/VX820 Chrome 9 HC3 Integrated Graphics + 1204 K8M800 Host Bridge + 1208 PT890 Host Bridge + 1238 K8T890 Host Bridge + 1258 PT880 Host Bridge + 1259 CN333/CN400/PM880 Host Bridge + 1269 KT880 Host Bridge + 1282 K8T800Pro Host Bridge + 1290 K8M890 Host Bridge + 1293 PM896 Host Bridge + 1296 P4M800 Host Bridge + 1308 PT894 Host Bridge + 1314 CN700/VN800/P4M800CE/Pro Host Bridge + 1324 CX700/VX700 Host Bridge + 1327 P4M890 Host Bridge + 1336 K8M890CE Host Bridge + 1340 PT900 Host Bridge + 1351 VT3351 Host Bridge + 1353 VX800/VX820 Error Reporting + 1364 CN896/VN896/P4M900 Host Bridge + 1409 VX855/VX875 Error Reporting + 1571 VT82C576M/VT82C586 + 1595 VT82C595/97 [Apollo VP2/97] + 1732 VT1732 [Envy24 II] PCI Multi-Channel Audio Controller + 2106 VIA Rhine Family Fast Ethernet Adapter (VT6105) + 2204 K8M800 Host Bridge + 2208 PT890 Host Bridge + 2238 K8T890 Host Bridge + 2258 PT880 Host Bridge + 2259 CN333/CN400/PM880 CPU Host Bridge + 2269 KT880 Host Bridge + 2282 K8T800Pro Host Bridge + 2290 K8M890 Host Bridge + 2293 PM896 Host Bridge + 2296 P4M800 Host Bridge + 2308 PT894 Host Bridge + 2314 CN700/VN800/P4M800CE/Pro Host Bridge + 2324 CX700/VX700 Host Bridge + 2327 P4M890 Host Bridge + 2336 K8M890CE Host Bridge + 2340 PT900 Host Bridge + 2351 VT3351 Host Bridge + 2353 VX800/VX820 Host Bus Control + 2364 CN896/VN896/P4M900 Host Bridge + 2409 VX855/VX875 Host Bus Control + 287a VT8251 PCI to PCI Bridge + 287b VT8251 Host Bridge + 287c VT8251 PCIE Root Port + 287d VT8251 PCIE Root Port + 287e VT8251 Ultra VLINK Controller + 3022 CLE266 + 3038 VT82xxxxx UHCI USB 1.1 Controller +# possibly Hewlett-Packard D9840-60001 [Brio BA410 Motherboard] + 0925 1234 VA-502 Mainboard + 1019 0985 P6VXA Motherboard + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 8080 A7V333 motherboard + 1043 808c VT6202 USB2.0 4 port controller + 1043 80a1 A7V8X-X motherboard + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1179 0001 Magnia Z310 + 1458 5004 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 182d 201d CN-029 USB2.0 4 port PCI Card + 1849 3038 K7VT6 + 3040 VT82C586B ACPI + 3043 VT86C100A [Rhine] + 10bd 0000 VT86C100A Fast Ethernet Adapter + 1106 0100 VT86C100A Fast Ethernet Adapter + 1186 1400 DFE-530TX rev A + 3044 VT6306 Fire II IEEE 1394 OHCI Link Layer Controller + 0010 0001 IEEE 1394 4port DCST 1394-3+1B + 1025 005a TravelMate 290 + 1043 808a A8V/A8N/P4P800 series motherboard + 1458 1000 GA-7VT600-1394 Motherboard + 1462 207d K8NGM2 series motherboard + 1462 217d Aspire L250 + 1462 590d KT6 Delta-FIS2R (MS-6590) + 1462 702d K8T NEO 2 motherboard + 1462 971d MS-6917 + 3050 VT82C596 Power Management + 3051 VT82C596 Power Management + 3053 VT6105M [Rhine-III] + 3057 VT82C686 [Apollo Super ACPI] + 1019 0985 P6VXA Motherboard + 1019 0987 K7VZA Motherboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8040 A7M266 Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 1179 0001 Magnia Z310 + 3058 VT82C686 AC97 Audio Controller + 0e11 0097 SoundMax Digital Integrated Audio + 0e11 b194 Soundmax integrated digital audio + 1019 0985 P6VXA Motherboard + 1019 0987 K7VZA Motherboard + 103c 1251 D9840-60001 [Brio BA410 Motherboard] + 1043 1106 A7V133/A7V133-C Mainboard + 1106 4511 Onboard Audio on EP7KXA + 1106 aa03 VT1612A AC'97 Audio Controller + 11d4 5348 AD1881A audio + 1458 7600 Onboard Audio + 1462 3091 MS-6309 Onboard Audio + 1462 3092 MS-6309 v2.x Mainboard (VIA VT1611A codec) + 1462 3300 MS-6330 Onboard Audio + 15dd 7609 Onboard Audio + 3059 VT8233/A/8235/8237 AC97 Audio Controller + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1019 1877 K8M800-M2 (V2.0) onboard audio + 1043 8095 A7V8X Motherboard (Realtek ALC650 codec) + 1043 80a1 A7V8X-X Motherboard + 1043 80b0 A7V600/K8V-X/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX]) + 1043 810d Asus P5VD1-X (AD1888 codec [SoundMax]) + 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec) + 10ec 8168 High Definition Audio + 1106 3059 L7VMM2 Motherboard + 1106 4161 K7VT2 motherboard + 1106 4170 PCPartner P4M800-8237R Motherboard + 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650) + 1297 c160 FX41 motherboard (Realtek ALC650 codec) + 1413 147b KV8 Pro motherboard onboard audio + 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650) + 1462 0080 K8T NEO 2 motherboard + 1462 3800 KT266 onboard audio + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 1695 300c EP-8KRA2+ Mainboard + 1849 0850 ASRock 775Dual-880 Pro onboard audio (Realtek ALC850) + 1849 9739 P4VT8 Mainboard (C-Media CMI9739A codec) + 1849 9761 K7VT6 motherboard + 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P) + a0a0 01b6 AK77-8XN onboard audio + a0a0 0342 AK86-L motherboard + 3065 VT6102 [Rhine-II] + 1043 80a1 A7V8X-X Motherboard + 1043 80ed A7V600-X Motherboard + 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235 + 1186 1400 DFE-530TX rev A + 1186 1401 DFE-530TX rev B + 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B) + 1462 7061 MS-7061 + 1462 7181 K8MM3-V mainboard + 147b 1c09 NV7 Motherboard + 1695 3005 VT6103 + 1695 300c Realtek ALC655 sound chip + 1849 3065 K7VT6 motherboard +# This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs + 3068 AC'97 Modem Controller + 1462 309e MS-6309 Saturn Motherboard + 3074 VT8233 PCI to ISA Bridge + 1043 8052 VT8233A + 3091 VT8633 [Apollo Pro266] + 3099 VT8366/A/7 [Apollo KT266/A/333] + 1043 8064 A7V266-E Mainboard + 1043 807f A7V333 Mainboard + 1849 3099 K7VT2 motherboard + 3101 VT8653 Host Bridge + 3102 VT8662 Host Bridge + 3103 VT8615 Host Bridge + 3104 USB 2.0 + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 808c A7V8X motherboard + 1043 80a1 A7V8X-X motherboard rev 1.01 + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1297 f641 FX41 motherboard + 1458 5004 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 182d 201d CN-029 USB 2.0 4 port PCI Card + 1849 3104 K7VT6 motherboard + 3106 VT6105/VT6106S [Rhine-III] + 1106 0105 VT6106S [Rhine-III] + 1186 1403 DFE-530TX rev C + 1186 1406 DFE-530TX+ rev F2 + 1186 1407 DFE-538TX + 3108 K8M800/K8N800/K8N800A [S3 UniChrome Pro] + 3109 VT8233C PCI to ISA Bridge + 3112 VT8361 [KLE133] Host Bridge + 3113 VPX/VPX2 PCI to PCI Bridge Controller + 3116 VT8375 [KM266/KL266] Host Bridge + 1297 f641 FX41 motherboard + 3118 CN400/PM800/PM880/PN800/PN880 [S3 UniChrome Pro] + 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter + 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics + 3123 VT8623 [Apollo CLE266] + 3128 VT8753 [P4X266 AGP] + 3133 VT3133 Host Bridge + 3147 VT8233A ISA Bridge + 1043 808c A7V333 motherboard + 3148 P4M266 Host Bridge + 3149 VIA VT6420 SATA RAID Controller + 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard + 1458 b003 GA-7VM400AM(F) Motherboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T Neo 2 Motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 147b 1408 KV7 + 1849 3149 K7VT6 motherboard + a0a0 04ad AK86-L motherboard + 3156 P/KN266 Host Bridge + 3157 CX700/VX700 [S3 UniChrome Pro] + 3164 VT6410 ATA133 RAID controller + 1043 80f4 P4P800 Mainboard Deluxe ATX + 1462 7028 915P/G Neo2 + 3168 P4X333/P4X400/PT800 AGP Bridge + 1849 3168 P4VT8 Mainboard + 3177 VT8235 ISA Bridge + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 808c A7V8X motherboard + 1043 80a1 A7V8X-X motherboard + 1106 0000 KT4AV motherboard + 1297 f641 FX41 motherboard + 1458 5001 GA-7VAX Mainboard + 1849 3177 K7VT2 motherboard + 3178 ProSavageDDR P4N333 Host Bridge + 3188 VT8385 [K8T800 AGP] Host Bridge + 1043 80a3 K8V Deluxe/K8V-X motherboard + 147b 1407 KV8-MAX3 motherboard + 3189 VT8377 [KT400/KT600 AGP] Host Bridge + 1043 807f A7V8X motherboard + 1106 0000 KT4AV motherboard (KT400A) + 1458 5000 GA-7VAX Mainboard + 1849 3189 K7VT6 motherboard + 3204 K8M800 Host Bridge + 3205 VT8378 [KM400/A] Chipset Host Bridge + 1458 5000 GA-7VM400M Motherboard + 3208 PT890 Host Bridge + 3213 VPX/VPX2 PCI to PCI Bridge Controller + 3218 K8T800M Host Bridge + 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South] + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1106 3227 DFI KT600-AL / Soltek SL-B9D-FGR Motherboard + 1458 5001 GA-7VT600 Motherboard + 147b 1407 KV8-MAX3 motherboard + 1849 3227 K7VT4 motherboard + 3230 K8M890CE/K8N890CE [Chrome 9] + 3238 K8T890 Host Bridge + 3249 VT6421 IDE RAID Controller + 324a CX700/VX700 PCI to PCI Bridge + 324b CX700/VX700 Host Bridge + 324e CX700/VX700 Internal Module Bus + 3253 VIA VT6655 WiFi Adapter, 802.11a/b/g + 3258 PT880 Host Bridge + 3259 CN333/CN400/PM880 Host Bridge + 3260 VIA Chrome9 HC IGP + 3269 KT880 Host Bridge + 3282 K8T800Pro Host Bridge + 3287 VT8251 PCI to ISA Bridge + 3288 VT1708/A [Azalia HDAC] (VIA High Definition Audio Controller) + 3290 K8M890 Host Bridge + 3296 P4M800 Host Bridge + 3324 CX700/VX700 Host Bridge + 3327 P4M890 Host Bridge + 3336 K8M890CE Host Bridge + 3337 VT8237A PCI to ISA Bridge + 3340 PT900 Host Bridge + 3343 P4M890 [S3 UniChrome Pro] + 3344 CN700/P4M800 Pro/P4M800 CE/VN800 [S3 UniChrome Pro] + 3349 VT8251 AHCI/SATA 4-Port Controller + 3351 VT3351 Host Bridge + 3353 VX800 PCI to PCI Bridge + 3364 CN896/VN896/P4M900 Host Bridge + 3371 CN896/VN896/P4M900 [Chrome 9 HC] + 3372 VT8237S PCI to ISA Bridge + 337a VT8237A PCI to PCI Bridge + 337b VT8237A Host Bridge + 3409 VX855/VX875 DRAM Bus Control + 4149 VIA VT6420 (ATA133) Controller + 4204 K8M800 Host Bridge + 4208 PT890 Host Bridge + 4238 K8T890 Host Bridge + 4258 PT880 Host Bridge + 4259 CN333/CN400/PM880 Host Bridge + 4269 KT880 Host Bridge + 4282 K8T800Pro Host Bridge + 4290 K8M890 Host Bridge + 4293 PM896 Host Bridge + 4296 P4M800 Host Bridge + 4308 PT894 Host Bridge + 4314 CN700/VN800/P4M800CE/Pro Host Bridge + 4324 CX700/VX700 Host Bridge + 4327 P4M890 Host Bridge + 4336 K8M890CE Host Bridge + 4340 PT900 Host Bridge + 4351 VT3351 Host Bridge + 4353 VX800/VX820 Power Management Control + 4364 CN896/VN896/P4M900 Host Bridge + 4409 VX855/VX875 Power Management Control + 5030 VT82C596 ACPI [Apollo PRO] + 5122 VX855/VX875 Chrome 9 HCM Integrated Graphics + 5208 PT890 I/O APIC Interrupt Controller + 5238 K8T890 I/O APIC Interrupt Controller + 5287 VT8251 Serial ATA Controller + 5290 K8M890 I/O APIC Interrupt Controller + 5308 PT894 I/O APIC Interrupt Controller + 5324 VX800 Serial ATA and EIDE Controller + 5327 P4M890 I/O APIC Interrupt Controller + 5336 K8M890CE I/O APIC Interrupt Controller + 5340 PT900 I/O APIC Interrupt Controller + 5351 VT3351 I/O APIC Interrupt Controller + 5353 VX800/VX820 APIC and Central Traffic Control + 5364 CN896/VN896/P4M900 I/O APIC Interrupt Controller + 5409 VX855/VX875 APIC and Central Traffic Control + 6100 VT85C100A [Rhine II] + 6287 SATA RAID Controller + 6327 P4M890 Security Device + 6353 VX800/VX820 Scratch Registers + 6364 CN896/VN896/P4M900 Security Device + 6409 VX855/VX875 Scratch Registers + 7204 K8M800 Host Bridge + 7205 KM400/KN400/P4M800 [S3 UniChrome] + 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard + 1462 7061 MS-7061 + 7208 PT890 Host Bridge + 7238 K8T890 Host Bridge + 7258 PT880 Host Bridge + 7259 CN333/CN400/PM880 Host Bridge + 7269 KT880 Host Bridge + 7282 K8T800Pro Host Bridge + 7290 K8M890 Host Bridge + 7293 PM896 Host Bridge + 7296 P4M800 Host Bridge + 7308 PT894 Host Bridge + 7314 CN700/VN800/P4M800CE/Pro Host Bridge + 7324 CX700/VX700 Host Bridge + 7327 P4M890 Host Bridge + 7336 K8M890CE Host Bridge + 7340 PT900 Host Bridge + 7351 VT3351 Host Bridge + 7353 VX800/VX820 North-South Module Interface Control + 7364 CN896/VN896/P4M900 Host Bridge + 7409 VX855/VX875 North-South Module Interface Control + 8231 VT8231 [PCI-to-ISA Bridge] + 8235 VT8235 ACPI + 8305 VT8363/8365 [KT133/KM133 AGP] + 8324 CX700/VX700 PCI to ISA Bridge + 8353 VX800/VX820 Bus Control and Power Management + 8391 VT8371 [KX133 AGP] + 8400 MVP4 + 8409 VX855/VX875 Bus Control and Power Management + 8500 KLE133/PLE133/PLE133T + 8501 VT8501 [Apollo MVP4 AGP] + 8596 VT82C596 [Apollo PRO AGP] + 8597 VT82C597 [Apollo VP3 AGP] + 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP] + 1019 0985 P6VXA Motherboard + 8601 VT8601 [Apollo ProMedia AGP] + 8605 VT8605 [PM133 AGP] + 8691 VT82C691 [Apollo Pro] + 8693 VT82C693 [Apollo Pro Plus] PCI Bridge + 8a25 PL133/PL133T [S3 ProSavage] + 8a26 KL133/KL133A/KM133/KM133A [S3 ProSavage] + 8d01 PN133/PN133T [S3 Twister] + 8d04 KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR] + 9530 Secure Digital Memory Card Controller + 95d0 SDIO Host Controller + a208 PT890 PCI to PCI Bridge Controller + a238 K8T890 PCI to PCI Bridge Controller + a327 P4M890 PCI to PCI Bridge Controller + a353 VX8xx South-North Module Interface Control + a364 CN896/VN896/P4M900 PCI to PCI Bridge Controller + a409 VX855/VX875 USB Device Controller + b091 VT8633 [Apollo Pro266 AGP] + b099 VT8366/A/7 [Apollo KT266/A/333 AGP] + b101 VT8653 AGP Bridge + b102 VT8362 AGP Bridge + b103 VT8615 AGP Bridge + b112 VT8361 [KLE133] AGP Bridge + b113 VPX/VPX2 I/O APIC Interrupt Controller + b115 VT8363/8365 [KT133/KM133] PCI Bridge + b168 VT8235 PCI Bridge + b188 VT8237 PCI bridge [K8T800/K8T890 South] + 147b 1407 KV8-MAX3 motherboard + b198 VT8237/VX700 PCI Bridge + b213 VPX/VPX2 I/O APIC Interrupt Controller + b353 VX855/VX875 PCI to PCI Bridge + b999 [K8T890 North / VT8237 South] PCI Bridge + c208 PT890 PCI to PCI Bridge Controller + c238 K8T890 PCI to PCI Bridge Controller + c327 P4M890 PCI to PCI Bridge Controller + c340 PT900 PCI to PCI Bridge Controller + c353 VX800/VX820 PCI Express Root Port + c364 CN896/VN896/P4M900 PCI to PCI Bridge Controller + c409 VX855/VX875 EIDE Controller + d104 VT8237R USB UDCI Controller + d208 PT890 PCI to PCI Bridge Controller + d213 VPX/VPX2 PCI to PCI Bridge Controller + d238 K8T890 PCI to PCI Bridge Controller + d340 PT900 PCI to PCI Bridge Controller + e208 PT890 PCI to PCI Bridge Controller + e238 K8T890 PCI to PCI Bridge Controller + e340 PT900 PCI to PCI Bridge Controller + e353 VX800/VX820 PCI Express Root Port + e721 VT1708B 8-channel High Definition Audio CODEC + f208 PT890 PCI to PCI Bridge Controller + f238 K8T890 PCI to PCI Bridge Controller + f340 PT900 PCI to PCI Bridge Controller + f353 VX800/VX820 PCI Express Root Port +1107 Stratus Computers + 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!) +1108 Proteon, Inc. + 0100 p1690plus_AA + 0101 p1690plus_AB + 0105 P1690Plus + 0108 P1690Plus + 0138 P1690Plus + 0139 P1690Plus + 013c P1690Plus + 013d P1690Plus +1109 Cogent Data Technologies, Inc. + 1400 EM110TX [EX110TX] +110a Siemens Nixdorf AG + 0002 Pirahna 2-port + 0005 Tulip controller, power management, switch extender + 0006 FSC PINC (I/O-APIC) + 0015 FSC Multiprocessor Interrupt Controller + 001d FSC Copernicus Management Controller + 007b FSC Remote Service Controller, mailbox device + 007c FSC Remote Service Controller, shared memory device + 007d FSC Remote Service Controller, SMIC device + 2101 HST SAPHIR V Primary PCI (ISDN/PMx) +# Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter + 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels + 2104 Eicon Diva 2.02 compatible passive ISDN card + 3141 SIMATIC NET CP 5611 (Profibus Adapter) + 3142 SIMATIC NET CP 5613A1 (Profibus Adapter) + 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter) + 4029 SIMATIC NET CP 5613A2 (Profibus Adapter) + 4942 FPGA I-Bus Tracer for MBD + 6120 SZB6120 +110b Chromatic Research Inc. + 0001 Mpact Media Processor + 0004 Mpact 2 +110c Mini-Max Technology, Inc. +110d Znyx Advanced Systems +110e CPU Technology +110f Ross Technology +1110 Powerhouse Systems + 6037 Firepower Powerized SMP I/O ASIC + 6073 Firepower Powerized SMP I/O ASIC +1111 Santa Cruz Operation +# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom +1112 Osicom Technologies Inc + 2200 FDDI Adapter + 2300 Fast Ethernet Adapter + 2340 4 Port Fast Ethernet Adapter + 2400 ATM Adapter +1113 Accton Technology Corporation + 1211 SMC2-1211TX + 103c 1207 EN-1207D Fast Ethernet Adapter + 1113 1211 EN-1207D Fast Ethernet Adapter + 1216 EN-1216 Ethernet Adapter + 1113 1216 EN1207F series PCI Fast Ethernet Adapter + 1113 2220 EN2220A Cardbus Fast Ethernet Adapter + 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card + 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?] + 1217 EN-1217 Ethernet Adapter + 5105 10Mbps Network card + 9211 EN-1207D Fast Ethernet Adapter + 1113 9211 EN-1207D Fast Ethernet Adapter + 9511 21x4x DEC-Tulip compatible Fast Ethernet + d301 CPWNA100 (Philips wireless PCMCIA) + ec02 SMC 1244TX v3 + ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter +1114 Atmel Corporation + 0506 at76c506 802.11b Wireless Network Adaptor +1115 3D Labs +1116 Data Translation + 0022 DT3001 + 0023 DT3002 + 0024 DT3003 + 0025 DT3004 + 0026 DT3005 + 0027 DT3001-PGL + 0028 DT3003-PGL + 0051 DT322 + 0060 DT340 + 0069 DT332 +1117 Datacube, Inc + 9500 Max-1C SVGA card + 9501 Max-1C image processing +1118 Berg Electronics +1119 ICP Vortex Computersysteme GmbH + 0000 GDT 6000/6020/6050 + 0001 GDT 6000B/6010 + 0002 GDT 6110/6510 + 0003 GDT 6120/6520 + 0004 GDT 6530 + 0005 GDT 6550 + 0006 GDT 6117/6517 + 0007 GDT 6127/6527 + 0008 GDT 6537 + 0009 GDT 6557/6557-ECC + 000a GDT 6115/6515 + 000b GDT 6125/6525 + 000c GDT 6535 + 000d GDT 6555/6555-ECC + 0100 GDT 6117RP/6517RP + 0101 GDT 6127RP/6527RP + 0102 GDT 6537RP + 0103 GDT 6557RP + 0104 GDT 6111RP/6511RP + 0105 GDT 6121RP/6521RP + 0110 GDT 6117RD/6517RD + 0111 GDT 6127RD/6527RD + 0112 GDT 6537RD + 0113 GDT 6557RD + 0114 GDT 6111RD/6511RD + 0115 GDT 6121RD/6521RD + 0118 GDT 6118RD/6518RD/6618RD + 0119 GDT 6128RD/6528RD/6628RD + 011a GDT 6538RD/6638RD + 011b GDT 6558RD/6658RD + 0120 GDT 6117RP2/6517RP2 + 0121 GDT 6127RP2/6527RP2 + 0122 GDT 6537RP2 + 0123 GDT 6557RP2 + 0124 GDT 6111RP2/6511RP2 + 0125 GDT 6121RP2/6521RP2 + 0136 GDT 6113RS/6513RS + 0137 GDT 6123RS/6523RS + 0138 GDT 6118RS/6518RS/6618RS + 0139 GDT 6128RS/6528RS/6628RS + 013a GDT 6538RS/6638RS + 013b GDT 6558RS/6658RS + 013c GDT 6533RS/6633RS + 013d GDT 6543RS/6643RS + 013e GDT 6553RS/6653RS + 013f GDT 6563RS/6663RS + 0166 GDT 7113RN/7513RN/7613RN + 0167 GDT 7123RN/7523RN/7623RN + 0168 GDT 7118RN/7518RN/7518RN + 0169 GDT 7128RN/7528RN/7628RN + 016a GDT 7538RN/7638RN + 016b GDT 7558RN/7658RN + 016c GDT 7533RN/7633RN + 016d GDT 7543RN/7643RN + 016e GDT 7553RN/7653RN + 016f GDT 7563RN/7663RN + 01d6 GDT 4x13RZ + 01d7 GDT 4x23RZ + 01f6 GDT 8x13RZ + 01f7 GDT 8x23RZ + 01fc GDT 8x33RZ + 01fd GDT 8x43RZ + 01fe GDT 8x53RZ + 01ff GDT 8x63RZ + 0210 GDT 6519RD/6619RD + 0211 GDT 6529RD/6629RD + 0260 GDT 7519RN/7619RN + 0261 GDT 7529RN/7629RN + 02ff GDT MAXRP + 0300 GDT NEWRX + 0301 GDT NEWRX2 +111a Efficient Networks, Inc + 0000 155P-MF1 (FPGA) + 0002 155P-MF1 (ASIC) + 0003 ENI-25P ATM + 111a 0000 ENI-25p Miniport ATM Adapter + 0005 SpeedStream (LANAI) + 111a 0001 ENI-3010 ATM + 111a 0009 ENI-3060 ADSL (VPI=0) + 111a 0101 ENI-3010 ATM + 111a 0109 ENI-3060CO ADSL (VPI=0) + 111a 0809 ENI-3060 ADSL (VPI=0 or 8) + 111a 0909 ENI-3060CO ADSL (VPI=0 or 8) + 111a 0a09 ENI-3060 ADSL (VPI=<0..15>) + 0007 SpeedStream ADSL + 111a 1001 ENI-3061 ADSL [ASIC] + 1203 SpeedStream 1023 Wireless PCI Adapter +111b Teledyne Electronic Systems +111c Tricord Systems Inc. + 0001 Powerbis Bridge +111d Integrated Device Technology, Inc. + 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR] + 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller + 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller + 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller + 8018 PES12N3A PCI Express Switch + 801c PES24N3A PCI Express Switch + 8028 PES4T4 PCI Express Switch + 802b PES8T5A PCI Express Switch + 802c PES16T4 PCI Express Switch + 802d PES16T7 PCI Express Switch + 802e PES24T6 PCI Express Switch + 802f PES32T8 PCI Express Switch + 8032 PES48T12 PCI Express Switch + 8034 PES16/22/34H16 PCI Express Switch + 8035 PES32H8 PCI Express Switch + 8036 PES48H12 PCI Express Switch + 8037 PES64H16 PCI Express Switch + 8039 PES3T3 PCI Express Switch + 803a PES4T4 PCI Express Switch + 803c PES5T5 PCI Express Switch + 803d PES6T5 PCI Express Switch + 8048 PES8NT2 PCI Express Switch + 8049 PES8NT2 PCI Express Switch + 804a PES8NT2 PCI Express Internal NTB + 804b PES8NT2 PCI Express External NTB + 804c PES16NT2 PCI Express Switch + 804d PES16NT2 PCI Express Switch + 804e PES16NT2 PCI Express Internal NTB + 804f PES16NT2 PCI Express External NTB + 8058 PES12NT3 PCI Express Switch + 8059 PES12NT3 PCI Express Switch + 805a PES12NT3 PCI Express Internal NTB + 805b PES12NT3 PCI Express External NTB + 805c PES24NT3 PCI Express Switch + 805d PES24NT3 PCI Express Switch + 805e PES24NT3 PCI Express Internal NTB + 805f PES24NT3 PCI Express External NTB + 8060 PES16T4G2 PCI Express Gen2 Switch + 8061 PES12T3G2 PCI Express Gen2 Switch + 8068 PES6T6G2 PCI Express Gen2 Switch + 806a PES24T3G2 PCI Express Gen2 Switch + 14c1 000c 10G-PCIE2-8B2 + 806c PES16T4A/4T4G2 PCI Express Gen2 Switch + 806e PES24T6G2 PCI Express Gen2 Switch + 806f HIO524G2 PCI Express Gen2 Switch +111e Eldec +111f Precision Digital Images + 4a47 Precision MX Video engine interface + 5243 Frame capture bus interface +1120 EMC Corporation +1121 Zilog +1122 Multi-tech Systems, Inc. +1123 Excellent Design, Inc. +1124 Leutron Vision AG + 2581 Picport Monochrome +1125 Eurocore +1126 Vigra +1127 FORE Systems Inc + 0200 ForeRunner PCA-200 ATM + 0210 PCA-200PC + 0250 ATM + 0300 ForeRunner PCA-200EPC ATM + 0310 ATM + 0400 ForeRunnerHE ATM Adapter + 1127 0400 ForeRunnerHE ATM +1129 Firmworks +112a Hermes Electronics Company, Ltd. +112b Linotype - Hell AG +112c Zenith Data Systems +112d Ravicad +112e Infomedia Microelectronics Inc. +112f Dalsa Inc. + 0000 MVC IC-PCI + 0001 MVC IM-PCI Video frame grabber/processor + 0008 PC-CamLink PCI framegrabber +1130 Computervision +1131 Philips Semiconductors + 1561 USB 1.1 Host Controller + 1775 c200 C2K onboard USB 1.1 host controller + 1562 USB 2.0 Host Controller + 1775 c200 C2K onboard USB 2.0 host controller + 3400 SmartPCI56(UCB1500) 56K Modem + 5400 TriMedia TM1000/1100 + 12ca 0000 BlueICE + 5402 TriMedia TM1300 + 1244 0f00 Fritz!Card DSL + 15eb 1300 DT1300 + 15eb 1302 DT1302 + 15eb 1304 DT1304 + 15eb 1305 DT1305 + 15eb 1306 PMCDT1306 + 15eb 1308 DT1308 + 15eb 1331 DT1301 with SAA7121 + 15eb 1337 DT1301 with SAA7127 + 15eb 2d3d X3D + 15eb 7022 PTM1300 + 5405 TriMedia TM1500 + 1136 0005 LCP-1500 + 5406 TriMedia TM1700 + 540b PNX1005 Media Processor + 1131 0020 PNXLite PCI Demo Board + 7130 SAA7130 Video Broadcast Decoder + 102b 48d0 Matrox CronosPlus + 1048 226b ELSA EX-VISION 300TV + 107d 6655 WinFast DTV1000S + 1131 2001 10MOONS PCI TV CAPTURE CARD + 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670) + 1461 050c Nagase Sangyo TransGear 3000TV + 1461 10ff AVerMedia DVD EZMaker + 1461 2108 AverMedia AverTV/305 + 1461 2115 AverMedia AverTV Studio 305 + 153b 1152 Terratec Cinergy 200 TV + 185b c100 Compro VideoMate TV PVR/FM + 185b c901 Videomate DVB-T200 + 5168 0138 LifeView FlyVIDEO2000 + 7133 SAA7131/SAA7133/SAA7135 Video Broadcast Decoder + 0000 4091 Beholder BeholdTV 409 FM +# Deleting vendor name after rereading submit instructions + 0070 6701 WinTV HVR-1110 + 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) + 1043 0210 FlyTV mini Asus Digimatrix + 1043 4843 ASUS TV-FM 7133 + 1043 4845 TV-FM 7135 + 1043 4862 P7131 Dual + 1043 4876 My Cinema-P7131 Hybrid + 1131 0000 KWorld V-Stream Studio TV Terminator + 1131 2001 Proteus Pro [philips reference design] + 1131 2018 Tiger reference design + 1131 4ee9 MonsterTV Mobile + 11bd 002b PCTV Stereo + 11bd 002e PCTV 110i (saa7133) + 12ab 0800 PURPLE TV + 13c2 2804 Technotrend Budget T-3000 Hybrid + 1421 0335 Instant TV DVB-T Cardbus + 1421 1370 Instant TV (saa7135) + 1435 7330 VFG7330 + 1435 7350 VFG7350 + 1461 1044 AVerTVHD MCE A180 + 1461 4836 M10D Hybrid DVBT + 1461 861e M105 PAL/SECAM/NTSC/FM Tuner + 1461 a14b AVerTV Studio 509 + 1461 a836 M115 DVB-T, PAL/SECAM/NTSC Tuner + 1461 f01d DVB-T Super 007 + 1461 f31f Avermedia AVerTV GO 007 FM + 1461 f936 Hybrid+FM PCI (rev A16D) + 1462 6231 TV@nywhere Plus + 1489 0214 LifeView FlyTV Platinum FM + 14c0 1212 LifeView FlyTV Platinum Mini2 + 153b 1160 Cinergy 250 PCI TV + 153b 1162 Terratec Cinergy 400 mobile + 17de 7350 ATSC 110 Digital / Analog HDTV Tuner + 17de 7352 ATSC 115 Digital / Analog HDTV Tuner + 185b c100 VideoMate TV + 185b c900 VideoMate T750 + 5168 0306 LifeView FlyDVB-T DUO + 5168 0319 LifeView FlyDVB Trio + 5168 0502 LifeView FlyDVB-T Duo CardBus + 5168 0520 LifeView FlyDVB Trio CardBus + 5168 1502 LifeView FlyTV CardBus + 5168 2502 LifeView FlyDVB-T CardBus + 5168 2520 LifeView FlyDVB-S Duo CardBus + 5168 3502 LifeView FlyDVB-T Hybrid CardBus + 5168 3520 LifeView FlyDVB Trio N CardBus + 7134 SAA7134/SAA7135HL Video Broadcast Decoder + 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) + 1043 0210 Digimatrix TV + 1043 4840 ASUS TV-FM 7134 + 1043 4842 TV-FM 7134 + 1131 2004 EUROPA V3 reference design + 1131 4e85 SKNet Monster TV + 1131 6752 EMPRESS + 11bd 002b PCTV Stereo + 11bd 002d PCTV 300i DVB-T + PAL + 1461 2c00 AverTV Hybrid+FM PCI + 1461 9715 AVerTV Studio 307 + 1461 a70a Avermedia AVerTV 307 + 1461 a70b AverMedia M156 / Medion 2819 + 1461 d6ee Cardbus TV/Radio (E500) + 1471 b7e9 AVerTV Cardbus plus + 153b 1142 Terratec Cinergy 400 TV + 153b 1143 Terratec Cinergy 600 TV + 153b 1158 Terratec Cinergy 600 TV MK3 + 1540 9524 ProVideo PV952 + 16be 0003 Medion 7134 + 185b c200 Compro VideoMate Gold+ Pal + 185b c900 Videomate DVB-T300 + 1894 a006 KNC One TV-Station DVR + 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS + 5168 0138 FLY TV PRIME 34FM + 7145 SAA7145 + 7146 SAA7146 + 110a 0000 Fujitsu/Siemens DVB-C card rev1.5 + 110a ffff Fujitsu/Siemens DVB-C card rev1.5 + 1124 2581 Leutron Vision PicPort + 1131 4f56 KNC1 DVB-S Budget + 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL + 1131 4f61 Activy DVB-S Budget Rev GR + 1131 5f61 Activy DVB-T Budget + 114b 2003 DVRaptor Video Edit/Capture Card + 11bd 0006 DV500 Overlay + 11bd 000a DV500 Overlay + 11bd 000f DV500 Overlay + 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5 + 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 + 13c2 0002 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0003 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0004 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 + 13c2 0008 Technotrend/Hauppauge DVB-T + 13c2 000a Octal/Technotrend DVB-C for iTV + 13c2 000e Technotrend/Hauppauge DVB card rev2.3 + 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card + 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card + 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card + 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card + 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card + 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card + 13c2 1012 DVB T-1500 + 13c2 1013 SATELCO Multimedia DVB + 13c2 1016 WinTV-NOVA-SE DVB card + 13c2 1018 DVB S-1401 + 13c2 1019 S2-3200 + 13c2 1102 Technotrend/Hauppauge DVB card rev2.1 + 153b 1155 Cinergy 1200 DVB-S + 153b 1156 Terratec Cynergy 1200C + 153b 1157 Cinergy 1200 DVB-T + 1894 0020 KNC One DVB-C V1.0 + 1894 0023 TVStation DVB-C plus + 7162 Pinnacle PCTV 3010iX Dual Analog + DVB-T (VT8251 Ultra VLINK Controller) + 9730 SAA9730 Integrated Multimedia and Peripheral Controller + 1131 0000 Integrated Multimedia and Peripheral Controller +1132 Mitel Corp. +1133 Dialogic Corporation + 7701 Eiconcard C90 + 7711 Eiconcard C91 + 7901 EiconCard S90 + 7902 EiconCard S90 + 7911 EiconCard S91 + 7912 EiconCard S91 + 7921 Eiconcard S92 + 7941 EiconCard S94 + 7942 EiconCard S94 + 7943 EiconCard S94 + 7944 EiconCard S94 + 7945 Eiconcard S94 + 7948 Eiconcard S94 64bit/66MHz + 9711 Eiconcard S91 V2 + 9911 Eiconcard S91 V2 + 9941 Eiconcard S94 V2 + 9a41 Eiconcard S94 PCIe + b921 EiconCard P92 + b922 EiconCard P92 + b923 EiconCard P92 + e001 Diva Pro 2.0 S/T + e002 Diva 2.0 S/T PCI + e003 Diva Pro 2.0 U + e004 Diva 2.0 U PCI + e005 Diva 2.01 S/T PCI + e006 Diva CT S/T PCI + e007 Diva CT U PCI + e008 Diva CT Lite S/T PCI + e009 Diva CT Lite U PCI + e00a Diva ISDN+V.90 PCI + e00b Diva ISDN PCI 2.02 + e00c Diva 2.02 PCI U + e00d Diva Pro 3.0 PCI + e00e Diva ISDN+CT S/T PCI Rev 2 + e010 Diva Server BRI-2M PCI + 110a 0021 Fujitsu Siemens ISDN S0 + e011 Diva Server BRI S/T Rev 2 + e012 Diva Server 4BRI-8M PCI + e013 4BRI + 1133 1300 Diva V-4BRI-8 PCI v2 + 1133 e013 Diva 4BRI-8 PCI v2 + e014 Diva Server PRI-30M PCI + e015 Diva PRI PCI v2 + e016 Diva Server Voice 4BRI PCI + e017 Diva Server Voice 4BRI Rev 2 + 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI + e018 BRI + 1133 1800 Diva V-BRI-2 PCI v2 + 1133 e018 Diva BRI-2 PCI v2 + e019 Diva Server Voice PRI Rev 2 + 1133 e019 Diva Server Voice PRI 2.0 PCI + e01a Diva BRI-2FX PCI v2 + e01b Diva Server Voice BRI-2M 2.0 PCI + 1133 e01b Diva Server Voice BRI-2M 2.0 PCI + e01c PRI + 1133 1c01 Diva PRI/E1/T1-8 PCI v3 + 1133 1c02 Diva PRI/T1-24 PCI(e) v3 + 1133 1c03 Diva PRI/E1-30 PCI(e) v3 + 1133 1c04 Diva PRI/E1/T1-CTI PCI(e) v3 + 1133 1c05 Diva V-PRI/T1-24 PCI(e) v3 + 1133 1c06 Diva V-PRI/E1-30 PCI(e) v3 + 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ + 1133 1c08 Diva Server PRI/T1-24 Cornet NQ + 1133 1c09 Diva Server PRI/E1-30 Cornet NQ + 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ + 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ + 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ + e01e 2PRI + 1133 1e01 Diva 2PRI/E1/T1-60 PCI v1 + 1133 e01e Diva V-2PRI/E1/T1-60 PCI v1 + e020 4PRI + 1133 2001 Diva 4PRI/E1/T1-120 PCI v1 + 1133 e020 Diva V-4PRI/E1/T1-120 PCI v1 + e022 Analog-2 + 1133 2200 Diva V-Analog-2 PCI v1 + 1133 e022 Diva Analog-2 PCI v1 + e024 Analog-4 + 1133 2400 Diva V-Analog-4 PCI v1 + 1133 e024 Diva Analog-4 PCI v1 + e028 Analog-8 + 1133 2800 Diva V-Analog-8 PCI v1 + 1133 e028 Diva Analog-8 PCI v1 + e02a Diva IPM-300 PCI v1 + e02c Diva IPM-600 PCI v1 + e02e 4BRI + 1133 2e01 Diva V-4BRI-8 PCIe v2 + 1133 e02e Diva 4BRI-8 PCIe v2 + e032 BRI + 1133 3201 Diva V-BRI-2 PCIe v2 + 1133 e032 Diva BRI-2 PCIe v2 + e034 Diva BRI-CTI PCI v2 +1134 Mercury Computer Systems + 0001 Raceway Bridge + 0002 Dual PCI to RapidIO Bridge +1135 Fuji Xerox Co Ltd + 0001 Printer controller +1136 Momentum Data Systems + 0002 PCI-JTAG +1137 Cisco Systems Inc + 0023 81 VIC PCIe Upstream Port + 0040 VIC PCIe Upstream Port + 0041 VIC PCIe Downstream Port + 0043 VIC Ethernet NIC + 1137 0048 M81KR Mezzanine + 0045 VIC FCoE HBA + 1137 0048 M81KR Mezzanine +1138 Ziatech Corporation + 8905 8905 [STD 32 Bridge] +1139 Dynamic Pictures, Inc + 0001 VGA Compatable 3D Graphics +113a FWB Inc +113b Network Computing Devices +113c Cyclone Microsystems, Inc. + 0000 PCI-9060 i960 Bridge + 0001 PCI-SDK [PCI i960 Evaluation Platform] + 0911 PCI-911 [i960Jx-based Intelligent I/O Controller] + 0912 PCI-912 [i960CF-based Intelligent I/O Controller] + 0913 PCI-913 + 0914 PCI-914 [I/O Controller w/ secondary PCI bus] +113d Leading Edge Products Inc +113e Sanyo Electric Co - Computer Engineering Dept +113f Equinox Systems, Inc. + 0808 SST-64P Adapter + 1010 SST-128P Adapter + 80c0 SST-16P DB Adapter + 80c4 SST-16P RJ Adapter + 80c8 SST-16P Adapter + 8888 SST-4P Adapter + 9090 SST-8P Adapter +1140 Intervoice Inc +1141 Crest Microsystem Inc +1142 Alliance Semiconductor Corporation + 3210 AP6410 + 6422 ProVideo 6422 + 6424 ProVideo 6424 + 6425 ProMotion AT25 + 643d ProMotion AT3D +1143 NetPower, Inc +1144 Cincinnati Milacron + 0001 Noservo controller +1145 Workbit Corporation + 8007 NinjaSCSI-32 Workbit + f007 NinjaSCSI-32 KME + f010 NinjaSCSI-32 Workbit + f012 NinjaSCSI-32 Logitec + f013 NinjaSCSI-32 Logitec + f015 NinjaSCSI-32 Melco + f020 NinjaSCSI-32 Sony PCGA-DVD51 + f021 NinjaPATA-32 Delkin Cardbus UDMA + f024 NinjaPATA-32 Delkin Cardbus UDMA + f103 NinjaPATA-32 Delkin Cardbus UDMA +1146 Force Computers +1147 Interface Corp +# Nee Schneider & Koch +1148 SysKonnect + 4000 FDDI Adapter + 0e11 b03b Netelligent 100 FDDI DAS Fibre SC + 0e11 b03c Netelligent 100 FDDI SAS Fibre SC + 0e11 b03d Netelligent 100 FDDI DAS UTP + 0e11 b03e Netelligent 100 FDDI SAS UTP + 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC + 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP) + 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS) + 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP) + 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP) + 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS) + 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64) + 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS) + 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64) + 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64) + 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) + 4200 Token Ring adapter + 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) + 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) + 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) + 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) + 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) + 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) + 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) + 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) + 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) + 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + 1259 2970 AT-2970SX Gigabit Ethernet Adapter + 1259 2971 AT-2970LX Gigabit Ethernet Adapter + 1259 2972 AT-2970TX Gigabit Ethernet Adapter + 1259 2973 AT-2971SX Gigabit Ethernet Adapter + 1259 2974 AT-2971T Gigabit Ethernet Adapter + 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter + 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter + 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter + 4320 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter, PCI64, Fiber ZX/SC + 1148 0121 Marvell RDK-8001 Adapter + 1148 0221 Marvell RDK-8002 Adapter + 1148 0321 Marvell RDK-8003 Adapter + 1148 0421 Marvell RDK-8004 Adapter + 1148 0621 Marvell RDK-8006 Adapter + 1148 0721 Marvell RDK-8007 Adapter + 1148 0821 Marvell RDK-8008 Adapter + 1148 0921 Marvell RDK-8009 Adapter + 1148 1121 Marvell RDK-8011 Adapter + 1148 1221 Marvell RDK-8012 Adapter + 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter + 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter + 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter + 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter + 1148 9521 SK-9521 10/100/1000Base-T Adapter + 4400 SK-9Dxx Gigabit Ethernet Adapter + 4500 SK-9Mxx Gigabit Ethernet Adapter + 9000 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45 + 9843 [Fujitsu] Gigabit Ethernet + 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45 + 1148 2100 SK-9E21 Server Adapter + 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter + 1148 2200 SK-9E22 Server Adapter + 1148 8100 SK-9E81 Server Adapter + 1148 8200 SK-9E82 Server Adapter + 1148 9100 SK-9E91 Server Adapter + 1148 9200 SK-9E92 Server Adapter +1149 Win System Corporation +114a VMIC + 5579 VMIPCI-5579 (Reflective Memory Card) + 5587 VMIPCI-5587 (Reflective Memory Card) + 6504 VMIC PCI 7755 FPGA + 7587 VMIVME-7587 +114b Canopus Co., Ltd +114c Annabooks +114d IC Corporation +114e Nikon Systems Inc +114f Digi International + 0002 AccelePort EPC + 0003 RightSwitch SE-6 + 0004 AccelePort Xem + 0005 AccelePort Xr + 0006 AccelePort Xr,C/X + 0009 AccelePort Xr/J + 000a AccelePort EPC/J + 000c DataFirePRIme T1 (1-port) + 000d SyncPort 2-Port (x.25/FR) + 0011 AccelePort 8r EIA-232 (IBM) + 0012 AccelePort 8r EIA-422 + 0013 AccelePort Xr + 0014 AccelePort 8r EIA-422 + 0015 AccelePort Xem + 0016 AccelePort EPC/X + 0017 AccelePort C/X + 001a DataFirePRIme E1 (1-port) + 001b AccelePort C/X (IBM) + 001d DataFire RAS T1/E1/PRI + 114f 0050 DataFire RAS E1 Adapter + 114f 0051 DataFire RAS Dual E1 Adapter + 114f 0052 DataFire RAS T1 Adapter + 114f 0053 DataFire RAS Dual T1 Adapter + 0023 AccelePort RAS + 0024 DataFire RAS B4 ST/U + 114f 0030 DataFire RAS BRI U Adapter + 114f 0031 DataFire RAS BRI S/T Adapter + 0026 AccelePort 4r 920 + 0027 AccelePort Xr 920 + 0028 ClassicBoard 4 + 0029 ClassicBoard 8 + 0034 AccelePort 2r 920 + 0035 DataFire DSP T1/E1/PRI cPCI + 0040 AccelePort Xp + 114f 0042 AccelePort 2p PCI + 114f 0043 AccelePort 4p PCI + 114f 0044 AccelePort 8p PCI + 114f 0045 AccelePort 16p PCI + 114f 004e AccelePort 32p PCI + 0042 AccelePort 2p + 0043 AccelePort 4p + 0044 AccelePort 8p + 0045 AccelePort 16p + 004e AccelePort 32p + 0070 Datafire Micro V IOM2 (Europe) + 0071 Datafire Micro V (Europe) + 0072 Datafire Micro V IOM2 (North America) + 0073 Datafire Micro V (North America) + 00b0 Digi Neo 4 + 00b1 Digi Neo 8 + 00c8 Digi Neo 2 DB9 + 00c9 Digi Neo 2 DB9 PRI + 00ca Digi Neo 2 RJ45 + 00cb Digi Neo 2 RJ45 PRI + 00cc Digi Neo 1 422 + 00cd Digi Neo 1 422 485 + 00ce Digi Neo 2 422 485 + 00d0 ClassicBoard 4 422 + 00d1 ClassicBoard 8 422 + 00f1 Digi Neo PCI-E 4 port + 00f4 Digi Neo 4 (IBM version) + 6001 Avanstar +1150 Thinking Machines Corp +1151 JAE Electronics Inc. +1152 Megatek +1153 Land Win Electronic Corp +1154 Melco Inc +1155 Pine Technology Ltd +1156 Periscope Engineering +1157 Avsys Corporation +1158 Voarx R & D Inc + 3011 Tokenet/vg 1001/10m anylan + 9050 Lanfleet/Truevalue + 9051 Lanfleet/Truevalue +1159 Mutech Corp + 0001 MV-1000 + 0002 MV-1500 +115a Harlequin Ltd +115b Parallax Graphics +115c Photron Ltd. +115d Xircom + 0003 Cardbus Ethernet 10/100 + 1014 0181 10/100 EtherJet Cardbus Adapter + 1014 1181 10/100 EtherJet Cardbus Adapter + 1014 8181 10/100 EtherJet Cardbus Adapter + 1014 9181 10/100 EtherJet Cardbus Adapter + 115d 0181 Cardbus Ethernet 10/100 + 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100) + 115d 1181 Cardbus Ethernet 10/100 + 1179 0181 Cardbus Ethernet 10/100 + 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter + 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter + 0005 Cardbus Ethernet 10/100 + 1014 0182 10/100 EtherJet Cardbus Adapter + 1014 1182 10/100 EtherJet Cardbus Adapter + 115d 0182 Cardbus Ethernet 10/100 + 115d 1182 Cardbus Ethernet 10/100 + 0007 Cardbus Ethernet 10/100 + 1014 0182 10/100 EtherJet Cardbus Adapter + 1014 1182 10/100 EtherJet Cardbus Adapter + 115d 0182 Cardbus Ethernet 10/100 + 115d 1182 Cardbus Ethernet 10/100 + 000b Cardbus Ethernet 10/100 + 1014 0183 10/100 EtherJet Cardbus Adapter + 115d 0183 Cardbus Ethernet 10/100 + 000c Mini-PCI V.90 56k Modem + 000f Cardbus Ethernet 10/100 + 1014 0183 10/100 EtherJet Cardbus Adapter + 115d 0183 Cardbus Ethernet 10/100 + 00d4 Mini-PCI K56Flex Modem + 0101 Cardbus 56k modem + 115d 1081 Cardbus 56k Modem + 0103 Cardbus Ethernet + 56k Modem + 1014 9181 Cardbus 56k Modem + 1115 1181 Cardbus Ethernet 100 + 56k Modem + 115d 1181 CBEM56G-100 Ethernet + 56k Modem + 8086 9181 PRO/100 LAN + Modem56 CardBus +115e Peer Protocols Inc +115f Maxtor Corporation +1160 Megasoft Inc +1161 PFU Limited +1162 OA Laboratory Co Ltd +1163 Rendition + 0001 Verite 1000 + 2000 Verite V2000/V2100/V2200 + 1092 2000 Stealth II S220 +1164 Advanced Peripherals Technologies +1165 Imagraph Corporation + 0001 Motion TPEG Recorder/Player with audio +# nee ServerWorks +1166 Broadcom + 0000 CMIC-LE + 0005 CNB20-LE Host Bridge + 0006 CNB20HE Host Bridge + 0007 CNB20-LE Host Bridge + 0008 CNB20HE Host Bridge + 0009 CNB20LE Host Bridge + 0010 CIOB30 + 0011 CMIC-HE + 0012 CMIC-WS Host Bridge (GC-LE chipset) + 0013 CNB20-HE Host Bridge + 0014 CMIC-LE Host Bridge (GC-LE chipset) + 0015 CMIC-GC Host Bridge + 0016 CMIC-GC Host Bridge + 0017 GCNB-LE Host Bridge + 0031 HT1100 HPX0 HT Host Bridge + 0036 BCM5785 [HT1000] PCI/PCI-X Bridge + 0101 CIOB-X2 PCI-X I/O Bridge + 0103 EPB PCI-Express to PCI-X Bridge + 0104 BCM5785 [HT1000] PCI/PCI-X Bridge + 0110 CIOB-E I/O Bridge with Gigabit Ethernet + 0130 BCM5780 [HT2000] PCI-X bridge + 0132 BCM5780 [HT2000] PCI-Express Bridge + 1166 0132 HT2000 PCI-Express bridge + 0140 HT2100 PCI-Express Bridge + 0141 HT2100 PCI-Express Bridge + 0142 HT2100 PCI-Express Bridge + 0144 HT2100 PCI-Express Bridge + 0200 OSB4 South Bridge + 0201 CSB5 South Bridge + 4c53 1080 CT8 mainboard + 0203 CSB6 South Bridge + 1734 1012 PRIMERGY RX/TX series + 0205 BCM5785 [HT1000] Legacy South Bridge + 0211 OSB4 IDE Controller + 0212 CSB5 IDE Controller + 1028 014a PowerEdge 1750 + 1028 810b PowerEdge 1650/2550 + 4c53 1080 CT8 mainboard + 0213 CSB6 RAID/IDE Controller + 1028 4134 PowerEdge 600SC + 1028 c134 Poweredge SC600 + 1734 1012 PRIMERGY RX/TX series onboard IDE + 0214 BCM5785 [HT1000] IDE + 1028 0205 PowerEdge 2970 HT1000 IDE + 0217 CSB6 IDE Controller + 1028 4134 Poweredge SC600 + 021b HT1100 HD Audio + 0220 OSB4/CSB5 OHCI USB Controller + 4c53 1080 CT8 mainboard + 0221 CSB6 OHCI USB Controller + 1734 1012 PRIMERGY RX/TX series onboard OHCI + 0223 BCM5785 [HT1000] USB + 1028 0205 PowerEdge 2970 HT1000 USB Controller + 1028 020b PowerEdge T605 HT1000 USB Controller + 0225 CSB5 LPC bridge + 1166 0230 Dell PowerEdge 1650/1750 + 0227 GCLE-2 Host Bridge + 1734 1012 PRIMERGY RX/TX series + 0230 CSB5 LPC bridge + 4c53 1080 CT8 mainboard + 0234 BCM5785 [HT1000] LPC + 1028 0205 PowerEdge 2970 HT1000 LPC + 1028 020b PowerEdge T605 HT1000 LPC + 0235 BCM5785 [HT1000] XIOAPIC0-2 + 0238 BCM5785 [HT1000] WDTimer + 0240 K2 SATA + 0241 RAIDCore RC4000 + 0242 RAIDCore BC4000 + 024a BCM5785 [HT1000] SATA (Native SATA Mode) + 1028 020b PowerEdge T605 onboard SATA Controller +# The device starts as 024A, and changes to 024B if set to PATA mode in BIOS + 024b BCM5785 [HT1000] SATA (PATA/IDE Mode) + 1028 0205 PowerEdge 2970 HT1000 SATA controller + 0406 HT1100 PCI-X Bridge + 0408 HT1100 Legacy Device + 040a HT1100 ISA-LPC Bridge + 1028 0223 PowerEdge R905 HT1100 ISA-LPC Bridge + 0410 HT1100 SATA Controller (Native SATA Mode) + 0411 HT1100 SATA Controller (PATA / IDE Mode) + 0412 HT1100 USB OHCI Controller + 0414 HT1100 USB EHCI Controller + 0416 HT1100 USB EHCI Controller (with Debug Port) + 0420 HT1100 PCI-Express Bridge + 0421 HT1100 SAS/SATA Controller + 0422 HT1100 PCI-Express Bridge +1167 Mutoh Industries Inc +1168 Thine Electronics Inc +1169 Centre for Development of Advanced Computing +# nee Polaris Communications +116a Luminex Software, Inc. + 6100 Bus/Tag Channel + 6800 Escon Channel + 7100 Bus/Tag Channel + 7800 Escon Channel +116b Connectware Inc +116c Intelligent Resources Integrated Systems +116d Martin-Marietta +116e Electronics for Imaging +116f Workstation Technology +1170 Inventec Corporation +1171 Loughborough Sound Images Plc +1172 Altera Corporation +1173 Adobe Systems, Inc +1174 Bridgeport Machines +1175 Mitron Computer Inc. +1176 SBE Incorporated +1177 Silicon Engineering +1178 Alfa, Inc. + afa1 Fast Ethernet Adapter +1179 Toshiba America Info Systems + 0102 Extended IDE Controller + 0103 EX-IDE Type-B + 0404 DVD Decoder card + 0406 Tecra Video Capture device + 0407 DVD Decoder card (Version 2) + 0601 CPU to PCI bridge + 1179 0001 Satellite Pro + 0603 ToPIC95 PCI to CardBus Bridge for Notebooks + 060a ToPIC95 + 1179 0001 Satellite Pro + 060f ToPIC97 + 1179 0001 Satellite 4010 + 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support + 0618 CPU to PCI and PCI to ISA bridge + 0701 FIR Port Type-O + 0804 TC6371AF SmartMedia Controller + 0805 SD TypA Controller + 0d01 FIR Port Type-DO + 1179 0001 FIR Port Type-DO +117a A-Trend Technology +117b L G Electronics, Inc. +117c Atto Technology + 002c SAS RAID Adapter + 0030 Ultra320 SCSI Host Adapter + 117c 8013 ExpressPCI UL4D + 117c 8014 ExpressPCI UL4S + 117c 8027 ExpressPCI UL5D + 117c 802f ExpressPCI UL5D Low Profile + 0033 SAS Adapter +117d Becton & Dickinson +117e T/R Systems +117f Integrated Circuit Systems +1180 Ricoh Co Ltd + 0465 RL5c465 + 0466 RL5c466 + 0475 RL5c475 + 144d c006 vpr Matrix 170B4 CardBus bridge + 0476 RL5c476 II + 1014 0185 ThinkPad A/T/X Series + 1014 056c ThinkPad Z60t + 1028 014f Latitude X300 laptop + 1028 0188 Inspiron 6000 laptop + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 1237 A6J-Q008 + 1043 1967 V6800V + 1043 1987 Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines ) + 104d 80df Vaio PCG-FX403 + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 814e VAIO GRZ390Z + 10f7 8338 Panasonic CF-Y5 laptop + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 14ef 0220 PCD-RP-220S + 17aa 201c ThinkPad X60s + 17aa 20c4 ThinkPad T61 + 0477 RL5c477 + 0478 RL5c478 + 1014 0184 ThinkPad A30p + 0511 R5C511 + 0522 R5C522 IEEE 1394 Controller + 1014 01cf ThinkPad A30p + 1043 1967 V6800V + 0551 R5C551 IEEE 1394 Controller + 144d c006 vpr Matrix 170B4 + 0552 R5C552 IEEE 1394 Controller + 1014 0511 ThinkPad A/T/X Series + 1028 014f Latitude X300 laptop + 1028 0188 Inspiron 6000 laptop + 1043 1237 A6J-Q008 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 17aa 201e ThinkPad X60s + 0554 R5C554 + 0575 R5C575 SD Bus Host Adapter + 0576 R5C576 SD Bus Host Adapter + 0592 R5C592 Memory Stick Bus Host Adapter + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 1043 1237 A6J-Q008 + 1043 1967 V6800V + 144d c018 X20 IV + 17aa 20ca ThinkPad T61 + 0811 R5C811 + 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter + 1014 0556 ThinkPad X60s / Z60t + 1014 0598 ThinkPad Z60m + 1025 0121 Aspire 5920G + 1028 0188 Inspiron 6000 laptop + 1028 01a2 Inspiron 9200 + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 103c 03b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30c1 Compaq 6910p + 1043 1237 A6J-Q008 + 1043 1967 ASUS V6800V + 10f7 8338 Panasonic CF-Y5 laptop + 144d c018 X20 IV + 17aa 201d ThinkPad X60s + 17aa 20c7 ThinkPad T61 + 0832 R5C832 IEEE 1394 Controller + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30c1 Compaq 6910p + 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394 + 0843 R5C843 MMC Host Controller + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 1028 01f5 Dell Inspiron 1501 + 103c 03b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 1183 0843 Alienware Aurora m9700 + 0852 xD-Picture Card Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 1043 1967 V6800V + 1180 0852 Pavilion 2410us + 1324 10cf P7120 +1181 Telmatics International +1183 Fujikura Ltd +1184 Forks Inc +1185 Dataworld International Ltd +1186 D-Link System Inc + 0100 DC21041 + 1002 DL10050 Sundance Ethernet + 1186 1002 DFE-550TX/FX + 1186 1012 DFE-580TX + 1025 AirPlus Xtreme G DWL-G650 Adapter + 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter + 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter + 1300 RTL8139 Ethernet + 1186 1300 DFE-538TX 10/100 Ethernet Adapter + 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter + 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter + 1340 DFE-690TXD CardBus PC Card + 1405 DFE-520TX Fast Ethernet PCI Adapter + 1540 DFE-680TX + 1541 DFE-680TXD CardBus PC Card + 1561 DRP-32TXD Cardbus PC Card + 2027 AirPlus Xtreme G DWL-G520 Adapter + 3203 AirPlus Xtreme G DWL-G520 Adapter + 3300 DWL-510 2.4GHz Wireless PCI Adapter + 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B) + 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter + 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter + 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter + 3a08 AirXpert DWL-AG520 Wireless PCI Adapter + 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B) + 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B) + 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C) + 3a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B) + 3a14 AirPremier DWL-AG530 Wireless PCI Adapter + 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter + 3a70 DWA-556 Xtreme N PCI Express Desktop Adapter + 3c00 D-link DWL-G650X + 3c09 AirPlus G DWL-G510 + 4000 DL2000-based Gigabit Ethernet + 4001 DGE-550SX PCI-X Gigabit Ethernet Adapter + 4300 DGE-528T Gigabit Ethernet Adapter +# There are at least 3 revisions of this adapter; 4800 is board revision A1 as far as I can tell, revision B1 is 4c00. + 4800 DGE-530T Gigabit Ethernet Adapter (rev 11) + 4b00 DGE-560T PCI Express Gigabit Ethernet Adapter + 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11) + 4b02 DGE-560SX PCI Express Gigabit Ethernet Adapter + 4b03 DGE-550T Gigabit Ethernet Adapter V.B1 + 4c00 Gigabit Ethernet Adapter + 1186 4c00 DGE-530T Gigabit Ethernet Adapter + 8400 D-Link DWL-650+ CardBus PC Card +1187 Advanced Technology Laboratories, Inc. +1188 Shima Seiki Manufacturing Ltd. +1189 Matsushita Electronics Co Ltd +118a Hilevel Technology +118b Hypertec Pty Limited +118c Corollary, Inc + 0014 PCIB [C-bus II to PCI bus host bridge chip] + 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter] +118d BitFlow Inc + 0001 Raptor-PCI framegrabber + 0012 Model 12 Road Runner Frame Grabber + 0014 Model 14 Road Runner Frame Grabber + 0024 Model 24 Road Runner Frame Grabber + 0044 Model 44 Road Runner Frame Grabber + 0112 Model 12 Road Runner Frame Grabber + 0114 Model 14 Road Runner Frame Grabber + 0124 Model 24 Road Runner Frame Grabber + 0144 Model 44 Road Runner Frame Grabber + 0212 Model 12 Road Runner Frame Grabber + 0214 Model 14 Road Runner Frame Grabber + 0224 Model 24 Road Runner Frame Grabber + 0244 Model 44 Road Runner Frame Grabber + 0312 Model 12 Road Runner Frame Grabber + 0314 Model 14 Road Runner Frame Grabber + 0324 Model 24 Road Runner Frame Grabber + 0344 Model 44 Road Runner Frame Grabber +118e Hermstedt GmbH +118f Green Logic +1190 Tripace + c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter +1191 Artop Electronic Corp + 0003 SCSI Cache Host Adapter + 0004 ATP8400 + 0005 ATP850UF + 0006 ATP860 NO-BIOS + 0007 ATP860 + 0008 ATP865 NO-ROM + 0009 ATP865 + 000a ATP867-A + 000b ATP867-B + 000d ATP8620 + 000e ATP8620 + 8002 AEC6710 SCSI-2 Host Adapter + 8010 AEC6712UW SCSI + 8020 AEC6712U SCSI + 8030 AEC6712S SCSI + 8040 AEC6712D SCSI + 8050 AEC6712SUW SCSI + 8060 AEC6712 SCSI + 8080 AEC67160 SCSI + 8081 AEC67160S SCSI + 808a AEC67162 2-ch. LVD SCSI +1192 Densan Company Ltd +1193 Zeitnet Inc. + 0001 1221 + 0002 1225 +1194 Toucan Technology +1195 Ratoc System Inc +1196 Hytec Electronics Ltd +1197 Gage Applied Sciences, Inc. + 010c CompuScope 82G 8bit 2GS/s Analog Input Card +1198 Lambda Systems Inc +1199 Attachmate Corporation +119a Mind Share, Inc. +119b Omega Micro Inc. + 1221 82C092G +119c Information Technology Inst. +119d Bug, Inc. Sapporo Japan +119e Fujitsu Microelectronics Ltd. + 0001 FireStream 155 + 0003 FireStream 50 +119f Bull HN Information Systems +11a0 Convex Computer Corporation +11a1 Hamamatsu Photonics K.K. +11a2 Sierra Research and Technology +11a3 Deuretzbacher GmbH & Co. Eng. KG +11a4 Barco Graphics NV +11a5 Microunity Systems Eng. Inc +11a6 Pure Data Ltd. +11a7 Power Computing Corp. +11a8 Systech Corp. +11a9 InnoSys Inc. + 4240 AMCC S933Q Intelligent Serial Card +11aa Actel +# Nee Galileo Technology, Inc. +11ab Marvell Technology Group Ltd. + 0146 GT-64010/64010A System Controller + 0f53 88E6318 Link Street network controller + 11ab MV88SE614x SATA II PCI-E controller + 138f W8300 802.11 Adapter (rev 07) + 1fa6 Marvell W8300 802.11 Adapter + 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset + 1faa 88w8335 [Libertas] 802.11b/g Wireless + 1385 4e00 WG511v2 54 Mbps Wireless PC Card + 1385 6b00 WG311v3 802.11g Wireless PCI Adapter + 2a01 88W8335 [Libertas] 802.11b/g Wireless + 2a02 88W8361 [TopDog] 802.11n Wireless + 4101 OLPC Cafe Controller Secure Digital Controller + 4320 88E8001 Gigabit Ethernet Controller + 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS) + 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS) + 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus) + 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus) + 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn) + 10b8 b452 EZ Card 1000 (SMC9452TXV.2) + 11ab 0121 Marvell RDK-8001 + 11ab 0321 Marvell RDK-8003 + 11ab 1021 Marvell RDK-8010 + 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus) + 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit) + 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit) + 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte) + 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit) + 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill) + 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox) + 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron) + 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech) + 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller + 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller + 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller + 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller + 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller + 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller + 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller + 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller + 4c53 10d0 Telum ASLP10 PrAMC Gigabit Ethernet + 4350 88E8035 PCI-E Fast Ethernet Controller + 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba) + 11ab 3521 Marvell RDK-8035 + 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE) + 4351 88E8036 PCI-E Fast Ethernet Controller + 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron) + 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic) + 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba) + 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal) + 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec) + 11ab 3621 Marvell RDK-8036 + 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard + 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima) + 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE) + 4352 88E8038 PCI-E Fast Ethernet Controller + 4353 88E8039 PCI-E Fast Ethernet Controller + 4354 88E8040 PCI-E Fast Ethernet Controller + 4355 88E8040T PCI-E Fast Ethernet Controller + 4356 88EC033 Ethernet Controller + 435a 88E8048 PCI-E Fast Ethernet Controller + 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller + 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus) + 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron) + 11ab 5221 Marvell RDK-8052 + 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) + 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI) + 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock) + a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen) + 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller + 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway) + 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel) + 8086 3063 D925XCVLK mainboard + 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel) + 4362 88E8053 PCI-E Gigabit Ethernet Controller + 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus) + 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus) + 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem) + 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic) + 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO) + 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba) + 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal) + 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec) + 11ab 5321 Marvell RDK-8053 + 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 13d1 ac11 EGE5K - Giga Ethernet Expresscard + 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) + 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI) + 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal) + 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo) + 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI) + 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima) + 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima) + 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox) + 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron) + 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta) + 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock) + 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech) + a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen) + 4363 88E8055 PCI-E Gigabit Ethernet Controller + 4364 88E8056 PCI-E Gigabit Ethernet Controller + 4365 88E8070 based Ethernet Controller + 4366 88EC036 PCI-E Gigabit Ethernet Controller + 4367 88EC032 Ethernet Controller + 4368 88EC034 Ethernet Controller + 4369 88EC042 Ethernet Controller + 436a Marvell Yukon 88E8058 PCI-E Gigabit Ethernet Controller + 436b 88E8071 PCI-E Gigabit Ethernet Controller + 4370 88E8075 PCI-E Gigabit Ethernet Controller + 4611 GT-64115 System Controller + 4620 GT-64120/64120A/64121A System Controller + 4801 GT-48001 + 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card + 5040 MV88SX5040 4-port SATA I PCI-X Controller + 5041 MV88SX5041 4-port SATA I PCI-X Controller + 5080 MV88SX5080 8-port SATA I PCI-X Controller + 5081 MV88SX5081 8-port SATA I PCI-X Controller + 5181 88f5181 [Orion-1] ARM SoC + 5182 88f5182 [Orion-NAS] ARM SoC + 5281 88f5281 [Orion-2] ARM SoC + 6041 MV88SX6041 4-port SATA II PCI-X Controller + 6042 88SX6042 PCI-X 4-Port SATA-II + 6081 MV88SX6081 8-port SATA II PCI-X Controller + 6101 88SE6101 single-port PATA133 interface + 6102 88SE6102 single-port PATA133(IDE) interface + 6111 88SE6111 1-port PATA133(IDE) and 1-port SATA II Controllers + 6121 88SE6121 SATA II Controller + 6141 88SE614x SATA II PCI-E controller + 6145 88SE6145 SATA II PCI-E controller + 6450 64560 System Controller + 6460 MV64360/64361/64362 System Controller + 6480 MV64460/64461/64462 System Controller + 1775 c200 C2K CompactPCI single board computer + 6485 MV64460/64461/64462 System Controller, Revision B + 7042 88SX7042 PCI-e 4-port SATA-II + 16b8 434b Tempo SATA E4P + f003 GT-64010 Primary Image Piranha Image Generator +11ac Canon Information Systems Research Aust. +11ad Lite-On Communications Inc + 0002 LNE100TX + 11ad 0002 LNE100TX + 11ad 0003 LNE100TX + 11ad f003 LNE100TX + 11ad ffff LNE100TX + 1385 f004 FA310TX + 2646 f002 KNE110TX EtheRx Fast Ethernet + c115 LNE100TX [Linksys EtherFast 10/100] + 11ad c001 LNE100TX [ver 2.0] + 2646 000b KNE111TX +11ae Aztech System Ltd +11af Avid Technology Inc. + 0001 Cinema + ee40 Digidesign Audiomedia III +11b0 V3 Semiconductor Inc. + 0002 V300PSC + 0292 V292PBC [Am29030/40 Bridge] + 0960 V96xPBC + c960 V96DPC +11b1 Apricot Computers +11b2 Eastman Kodak +11b3 Barr Systems Inc. +11b4 Leitch Technology International +11b5 Radstone Technology Plc +11b6 United Video Corp +11b7 Motorola +11b8 XPoint Technologies, Inc + 0001 Quad PeerMaster +11b9 Pathlight Technology Inc. + c0ed SSA Controller +11ba Videotron Corp +11bb Pyramid Technology +11bc Network Peripherals Inc + 0001 NP-PCI +11bd Pinnacle Systems Inc. + 002e PCTV 40i + 0040 Royal TS Function 1 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 1 + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 1 + 0041 RoyalTS Function 2 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 2 + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 2 + 0042 Royal TS Function 3 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Common + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Common + 0051 PCTV HD 800i + bede AV/DV Studio Capture Card +11be International Microcircuits Inc +11bf Astrodesign, Inc. +11c0 Hewlett Packard +# Nee Lucent Microelectronics +11c1 Agere Systems + 0440 56k WinModem + 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd + 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd + 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd + 10cf 102c LB LT Modem V.90 56k + 10cf 104a BIBLO LT Modem 56k + 10cf 105f LB2 LT Modem V.90 56k + 1179 0001 Internal V.90 Modem + 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 122d 4101 MDP7800-U Modem + 122d 4102 MDP7800SP-U Modem + 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd + 144d 2101 LT56PV Modem + 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 0441 56k WinModem + 1033 804d LT WinModem 56k Data+Fax + 1033 8065 LT WinModem 56k Data+Fax + 1092 0440 Supra 56i + 1179 0001 Internal V.90 Modem + 11c1 0440 LT WinModem 56k Data+Fax + 11c1 0441 LT WinModem 56k Data+Fax + 122d 4100 MDP7800-U Modem + 13e0 0040 LT WinModem 56k Data+Fax + 13e0 0100 LT WinModem 56k Data+Fax + 13e0 0410 LT WinModem 56k Data+Fax + 13e0 0420 TelePath Internet 56k WinModem + 13e0 0440 LT WinModem 56k Data+Fax + 13e0 0443 LT WinModem 56k Data+Fax + 13e0 f102 LT WinModem 56k Data+Fax + 1416 9804 CommWave 56k Modem + 141d 0440 LT WinModem 56k Data+Fax + 144f 0441 Lucent 56k V.90 DF Modem + 144f 0449 Lucent 56k V.90 DF Modem + 144f 110d Lucent Win Modem + 1468 0441 Presario 56k V.90 DF Modem + 1668 0440 Lucent Win Modem + 0442 56k WinModem + 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 144d 2104 LT56PT Modem + 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 0443 LT WinModem + 0444 LT WinModem + 0445 LT WinModem + 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card) + 8086 2204 PRO/100+ MiniPCI on Armada E500 + 0446 LT WinModem + 0447 LT WinModem + 0448 WinModem 56k + 1014 0131 Lucent Win Modem + 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0030 56k Voice Modem + 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd +# Actiontech eth+modem card as used by Dell &c. + 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem) + 0449 WinModem 56k + 0e11 b14d 56k V.90 Modem + 13e0 0020 LT WinModem 56k Data+Fax + 13e0 0041 TelePath Internet 56k WinModem + 1436 0440 Lucent Win Modem + 144f 0449 Lucent 56k V.90 DFi Modem + 1468 0410 IBM ThinkPad T23 + 1468 0440 Lucent Win Modem + 1468 0449 Presario 56k V.90 DFi Modem + 044a F-1156IV WinModem (V90, 56KFlex) + 10cf 1072 LB Global LT Modem + 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 044b LT WinModem + 044c LT WinModem + 044d LT WinModem + 044e LT WinModem + 044f V90 WildWire Modem + 0450 LT WinModem + 1033 80a8 Versa Note Vxi + 144f 4005 Magnia SG20 + 1468 0450 Evo N600c + 0451 LT WinModem + 0452 LT WinModem + 0453 LT WinModem + 0454 LT WinModem + 0455 LT WinModem + 0456 LT WinModem + 0457 LT WinModem + 0458 LT WinModem + 0459 LT WinModem + 045a LT WinModem + 045c LT WinModem + 0461 V90 WildWire Modem + 0462 V90 WildWire Modem + 0480 Venus Modem (V90, 56KFlex) + 048c V.92 56K WinModem +# InPorte Home Internal 56k Modem/fax/answering machine/SMS Features + 048f V.92 56k WinModem + 0620 Lucent V.92 Data/Fax Modem + 1040 HDA softmodem + 2600 StarPro26XX family (SP2601, SP2603, SP2612) DSP + 5400 OR3TP12 FPSC + 5656 Agere Systems Venus Modem + 5801 USB + 5802 USS-312 USB Controller + 5803 USS-344S USB Controller + 5811 FW322/323 + 1043 8294 IEEE 1394a Firewire Controller + 8086 524c D865PERL mainboard + dead 0800 FireWire Host Bus Adapter + 5901 FW643 PCI Express1394b Controller (PHY/Link) + 1443 0643 FireBoard800-e V.2 + 1546 0643 FWB-PCIE1X20 + 8110 T8110 H.100/H.110 TDM switch + 12d9 000c E1/T1 PMXc cPCI carrier card + ab10 WL60010 Wireless LAN MAC + ab11 WL60040 Multimode Wireles LAN MAC + 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102) + 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512) + 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106) + 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516) + ab20 ORiNOCO PCI Adapter + ab21 Agere Wireless PCI Adapter + ab30 Hermes2 Mini-PCI WaveLAN a/b/g + 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g + ed00 ET-131x PCI-E Ethernet Controller + ed01 ET-131x PCI-E Ethernet Controller +11c2 Sand Microelectronics +11c3 NEC Corporation +11c4 Document Technologies, Inc +11c5 Shiva Corporation +11c6 Dainippon Screen Mfg. Co. Ltd +11c7 D.C.M. Data Systems +11c8 Dolphin Interconnect Solutions AS + 0658 PSB32 SCI-Adapter D31x + d665 PSB64 SCI-Adapter D32x + d667 PSB66 SCI-Adapter D33x +11c9 Magma + 0010 16-line serial port w/- DMA + 0011 4-line serial port w/- DMA +11ca LSI Systems, Inc +11cb Specialix Research Ltd. + 2000 PCI_9050 + 11cb 0200 SX + 11cb b008 I/O8+ + 4000 SUPI_1 + 8000 T225 +11cc Michels & Kleberhoff Computer GmbH +11cd HAL Computer Systems, Inc. +11ce Netaccess +11cf Pioneer Electronic Corporation +11d0 Lockheed Martin Federal Systems-Manassas +11d1 Auravision + 01f7 VxP524 + 01f9 VxP951 +11d2 Intercom Inc. +11d3 Trancell Systems Inc +11d4 Analog Devices + 0078 AD1986HD sound chip + 1535 Blackfin BF535 processor + 1805 SM56 PCI modem + 1889 AD1889 sound chip + 1981 AD1981HD sound chip + 1983 AD1983HD sound chip + 1984 AD1984HD sound chip + 17aa 20bb T61p Notebook + 1986 AD1986A sound chip + 11d4 1986 Lenovo N100 B9G + 198b AD1988B Sound Chip + 5340 AD1881 sound chip +11d5 Ikon Corporation + 0115 10115 + 0117 10117 +11d6 Tekelec Telecom +11d7 Trenton Technology, Inc. +11d8 Image Technologies Development +11d9 TEC Corporation +11da Novell +11db Sega Enterprises Ltd +11dc Questra Corporation +11dd Crosfield Electronics Limited +11de Zoran Corporation + 6017 miroVIDEO DC30 + 6057 ZR36057PQC Video cutting chipset + 1031 7efe DC10 Plus + 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board + 12f8 8a02 Tekram Video Kit + 13ca 4231 JPEG/TV Card + 6120 ZR36120 + 1328 f001 Cinemaster C DVD Decoder + 13c2 0000 MediaFocus Satellite TV Card + 1de1 9fff Video Kit C210 +11df New Wave PDG +11e0 Cray Communications A/S +11e1 GEC Plessey Semi Inc. +11e2 Samsung Information Systems America +11e3 Quicklogic Corporation + 0001 COM-ON-AIR Dosch&Amand DECT + 0560 QL5064 Companion Design Demo Board + 5030 PC Watchdog + 8417 QL5064 [QuickPCI] PCI v2.2 bridge for SMT417 Dual TMS320C6416T PMC Module +11e4 Second Wave Inc +11e5 IIX Consulting +11e6 Mitsui-Zosen System Research +11e7 Toshiba America, Elec. Company +11e8 Digital Processing Systems Inc. +11e9 Highwater Designs Ltd. +11ea Elsag Bailey +11eb Formation Inc. +11ec Coreco Inc + 000d Oculus-F/64P + 1800 Cobra/C6 +11ed Mediamatics +11ee Dome Imaging Systems Inc +11ef Nicolet Technologies B.V. +11f0 Compu-Shack + 4231 FDDI + 4232 FASTline UTP Quattro + 4233 FASTline FO + 4234 FASTline UTP + 4235 FASTline-II UTP + 4236 FASTline-II FO + 4731 GIGAline +11f1 Symbios Logic Inc +11f2 Picture Tel Japan K.K. +11f3 Keithley Metrabyte + 0011 KPCI-PIO24 +11f4 Kinetic Systems Corporation + 2915 CAMAC controller +11f5 Computing Devices International +11f6 Compex + 0112 ENet100VG4 + 0113 FreedomLine 100 + 1401 ReadyLink 2000 + 2011 RL100-ATX 10/100 + 11f6 2011 RL100-ATX + 2201 ReadyLink 100TX (Winbond W89C840) + 11f6 2011 ReadyLink 100TX + 9881 RL100TX Fast Ethernet +11f7 Scientific Atlanta +11f8 PMC-Sierra Inc. + 7364 PM7364 [FREEDM - 32 Frame Engine & Datalink Mgr] + 7375 PM7375 [LASAR-155 ATM SAR] + 7384 PM7384 [FREEDM - 84P672 Frm Engine & Datalink Mgr] + 8000 PM8000 [SPC - SAS Protocol Controller] +11f9 I-Cube Inc +11fa Kasan Electronics Company, Ltd. +11fb Datel Inc +11fc Silicon Magic +11fd High Street Consultants +11fe Comtrol Corporation + 0001 RocketPort 32 port w/external I/F + 0002 RocketPort 8 port w/external I/F + 0003 RocketPort 16 port w/external I/F + 0004 RocketPort 4 port w/quad cable + 0005 RocketPort 8 port w/octa cable + 0006 RocketPort 8 port w/RJ11 connectors + 0007 RocketPort 4 port w/RJ11 connectors + 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector + 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector + 000a RocketPort Plus 4 port + 000b RocketPort Plus 8 port + 000c RocketModem 6 port + 000d RocketModem 4-port + 000e RocketPort Plus 2 port RS232 + 000f RocketPort Plus 2 port RS422 + 0040 RocketPort Infinity Octa, 8port, RJ45 + 0041 RocketPort Infinity 32port, External Interface + 0042 RocketPort Infinity 8port, External Interface + 0043 RocketPort Infinity 16port, External Interface + 0044 RocketPort Infinity Quad, 4port, DB + 0045 RocketPort Infinity Octa, 8port, DB + 0047 RocketPort Infinity 4port, RJ45 + 004f RocketPort Infinity 2port, SMPTE + 0052 RocketPort Infinity Octa, 8port, SMPTE + 0801 RocketPort UPCI 32 port w/external I/F + 0802 RocketPort UPCI 8 port w/external I/F + 0803 RocketPort UPCI 16 port w/external I/F + 0805 RocketPort UPCI 8 port w/octa cable + 080c RocketModem III 8 port + 080d RocketModem III 4 port + 0811 RocketPort UPCI Plus 8 port RS232 + 0812 RocketPort UPCI Plus 8 port RS422 + 0903 RocketPort Compact PCI 16 port w/external I/F + 8015 RocketPort 4-port UART 16954 +11ff Scion Corporation + 0003 AG-5 +1200 CSS Corporation +1201 Vista Controls Corp +1202 Network General Corp. + 4300 Gigabit Ethernet Adapter + 1202 9841 SK-9841 LX + 1202 9842 SK-9841 LX dual link + 1202 9843 SK-9843 SX + 1202 9844 SK-9843 SX dual link +1203 Bayer Corporation, Agfa Division +1204 Lattice Semiconductor Corporation +1205 Array Corporation +1206 Amdahl Corporation +1208 Parsytec GmbH + 4853 HS-Link Device +1209 SCI Systems Inc +120a Synaptel +120b Adaptive Solutions +120c Technical Corp. +120d Compression Labs, Inc. +120e Cyclades Corporation + 0100 Cyclom-Y below first megabyte + 0101 Cyclom-Y above first megabyte + 0102 Cyclom-4Y below first megabyte + 0103 Cyclom-4Y above first megabyte + 0104 Cyclom-8Y below first megabyte + 0105 Cyclom-8Y above first megabyte + 0200 Cyclades-Z below first megabyte + 0201 Cyclades-Z above first megabyte + 0300 PC300/RSV or /X21 (2 ports) + 0301 PC300/RSV or /X21 (1 port) + 0310 PC300/TE (2 ports) + 0311 PC300/TE (1 port) + 0320 PC300/TE-M (2 ports) + 0321 PC300/TE-M (1 port) + 0400 PC400 +120f Essential Communications + 0001 Roadrunner serial HIPPI +1210 Hyperparallel Technologies +1211 Braintech Inc +1212 Kingston Technology Corp. +1213 Applied Intelligent Systems, Inc. +1214 Performance Technologies, Inc. +1215 Interware Co., Ltd +1216 Purup Prepress A/S +1217 O2 Micro, Inc. + 00f7 Firewire (IEEE 1394) + 6729 OZ6729 + 673a OZ6730 + 6832 OZ6832/6833 CardBus Controller + 6836 OZ6836/6860 CardBus Controller + 6872 OZ6812 CardBus Controller + 6925 OZ6922 CardBus Controller + 6933 OZ6933/711E1 CardBus/SmartCardBus Controller + 1025 1016 Travelmate 612 TX + 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller + 1014 020c ThinkPad R30 + 1179 0001 Magnia Z310 + 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 1734 106c Amilo A1645 + 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller + 7113 OZ711EC1 SmartCardBus Controller + 1025 0035 TravelMate 660 + 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller + 7120 Integrated MMC/SD Controller + 7130 Integrated MS/xD Controller + 7134 OZ711MP1/MS1 MemoryCardBus Controller + 7135 Cardbus bridge + 7136 OZ711SP1 Memory CardBus Controller + 71e2 OZ711E2 SmartCardBus Controller + 7212 OZ711M2 4-in-1 MemoryCardBus Controller + 7213 OZ6933E CardBus Controller + 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 10cf 11c4 Lifebook P5020D Laptop + 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller +1218 Hybricon Corp. +1219 First Virtual Corporation +121a 3Dfx Interactive, Inc. + 0001 Voodoo + 0002 Voodoo 2 + 0003 Voodoo Banshee + 1092 0003 Monster Fusion + 1092 4000 Monster Fusion + 1092 4002 Monster Fusion + 1092 4801 Monster Fusion AGP + 1092 4803 Monster Fusion AGP + 1092 8030 Monster Fusion + 1092 8035 Monster Fusion AGP + 10b0 0001 Dragon 4000 + 1102 1017 3D Blaster Banshee PCI (CT6760) + 1102 1018 3D Blaster Banshee VE + 121a 0001 Voodoo Banshee AGP + 121a 0003 Voodoo Banshee AGP SGRAM + 121a 0004 Voodoo Banshee + 139c 0016 Raven + 139c 0017 Raven + 14af 0002 Maxi Gamer Phoenix + 0004 Voodoo Banshee [Velocity 100] + 0005 Voodoo 3 + 121a 0004 Voodoo3 AGP + 121a 0030 Voodoo3 AGP + 121a 0031 Voodoo3 AGP + 121a 0034 Voodoo3 AGP + 121a 0036 Voodoo3 2000 PCI + 121a 0037 Voodoo3 AGP + 121a 0038 Voodoo3 AGP + 121a 003a Voodoo3 AGP + 121a 0044 Voodoo3 + 121a 004b Velocity 100 + 121a 004c Velocity 200 + 121a 004d Voodoo3 AGP + 121a 004e Voodoo3 AGP + 121a 0051 Voodoo3 AGP + 121a 0052 Voodoo3 AGP + 121a 0057 Voodoo3 3000 PCI + 121a 0060 Voodoo3 3500 TV (NTSC) + 121a 0061 Voodoo3 3500 TV (PAL) + 121a 0062 Voodoo3 3500 TV (SECAM) + 0009 Voodoo 4 / Voodoo 5 + 121a 0003 Voodoo5 PCI 5500 + 121a 0009 Voodoo5 AGP 5500/6000 + 0057 Voodoo 3/3000 [Avenger] +121b Advanced Telecommunications Modules +121c Nippon Texaco., Ltd +121d Lippert Automationstechnik GmbH +121e CSPI + 0201 Myrinet 2000 Scalable Cluster Interconnect +121f Arcus Technology, Inc. +1220 Ariel Corporation + 1220 AMCC 5933 TMS320C80 DSP/Imaging board +1221 Contec Co., Ltd + 9172 PO-64L(PCI)H [Isolated Digital Output Board for PCI] + 91a2 PO-32L(PCI)H [Isolated Digital Output Board for PCI] + 91c3 DA16-16(LPCI)L [Un-insulated highly precise analog output board for Low Profile PCI] + b152 DIO-96D2-LPCI + c103 ADA16-32/2(PCI)F [High-Speed Analog I/O Board for PCI] +1222 Ancor Communications, Inc. +1223 Artesyn Communication Products + 0003 PM/Link + 0004 PM/T1 + 0005 PM/E1 + 0008 PM/SLS + 0009 BajaSpan Resource Target + 000a BajaSpan Section 0 + 000b BajaSpan Section 1 + 000c BajaSpan Section 2 + 000d BajaSpan Section 3 + 000e PM/PPC +1224 Interactive Images +1225 Power I/O, Inc. +1227 Tech-Source + 0006 Raptor GFX 8P + 0023 Raptor GFX [1100T] +1228 Norsk Elektro Optikk A/S +1229 Data Kinesis Inc. +122a Integrated Telecom +122b LG Industrial Systems Co., Ltd +122c Sican GmbH +122d Aztech System Ltd + 1206 368DSP + 1400 Trident PCI288-Q3DII (NX) + 50dc 3328 Audio + 122d 0001 3328 Audio + 80da 3328 Audio + 122d 0001 3328 Audio +122e Xyratex + 7722 Napatech XL1 + 7724 Napatech XL2/XA + 7729 Napatech XD +122f Andrew Corporation +1230 Fishcamp Engineering +1231 Woodward McCoach, Inc. + 04e1 Desktop PCI Telephony 4 + 05e1 Desktop PCI Telephony 5/6 + 0d00 LightParser + 0d02 LightParser 2 + 0d13 Desktop PCI L1/L3 Telephony +1232 GPT Limited +1233 Bus-Tech, Inc. +# Also Bochs uses this for virtual VGA... +1234 Technical Corp. +1235 Risq Modular Systems, Inc. +1236 Sigma Designs Corporation + 0000 RealMagic64/GX + 6401 REALmagic 64/GX (SD 6425) +1237 Alta Technology Corporation +1238 Adtran +1239 3DO Company +123a Visicom Laboratories, Inc. +123b Seeq Technology, Inc. +123c Century Systems, Inc. +123d Engineering Design Team, Inc. + 0000 EasyConnect 8/32 + 0002 EasyConnect 8/64 + 0003 EasyIO +123e Simutech, Inc. +123f C-Cube Microsystems + 00e4 MPEG + 8120 E4? + 11bd 0006 DV500 E4 + 11bd 000a DV500 E4 + 11bd 000f DV500 E4 + 1809 0016 Emuzed MAUI-III PCI PVR FM TV + 8888 Cinemaster C 3.0 DVD Decoder + 1002 0001 Cinemaster C 3.0 DVD Decoder + 1002 0002 Cinemaster C 3.0 DVD Decoder + 1328 0001 Cinemaster C 3.0 DVD Decoder +1240 Marathon Technologies Corp. +1241 DSC Communications +# Formerly Jaycor Networks, Inc. +1242 JNI Corporation + 1560 JNIC-1560 PCI-X Fibre Channel Controller + 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter + 1242 656a FCX-6562 PCI-X Fibre Channel Adapter + 4643 FCI-1063 Fibre Channel Adapter + 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter + 656a FCX-6562 PCI-X Fibre Channel Adapter +1243 Delphax +# Audio-Visuelles Marketing und Computersysteme +1244 AVM GmbH + 0700 B1 ISDN + 0800 C4 ISDN + 0a00 A1 ISDN [Fritz] + 1244 0a00 FRITZ!Card ISDN Controller + 0e00 Fritz!PCI v2.0 ISDN + 1100 C2 ISDN + 1200 T1 ISDN + 2700 Fritz!Card DSL SL + 2900 Fritz!Card DSL v2.0 +1245 A.P.D., S.A. +1246 Dipix Technologies, Inc. +1247 Xylon Research, Inc. +1248 Central Data Corporation +1249 Samsung Electronics Co., Ltd. +124a AEG Electrocom GmbH +124b SBS/Greenspring Modular I/O + 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier + 124b 9080 PCI9080 Bridge +124c Solitron Technologies, Inc. +124d Stallion Technologies, Inc. + 0000 EasyConnection 8/32 + 0002 EasyConnection 8/64 + 0003 EasyIO + 0004 EasyConnection/RA +124e Cylink +124f Infortrend Technology, Inc. + 0041 IFT-2000 Series RAID Controller +1250 Hitachi Microcomputer System Ltd +1251 VLSI Solutions Oy +1253 Guzik Technical Enterprises +1254 Linear Systems Ltd. + 0065 DVB Master FD + 007c DVB Master Quad/o +1255 Optibase Ltd + 1110 MPEG Forge + 1210 MPEG Fusion + 2110 VideoPlex + 2120 VideoPlex CC + 2130 VideoQuest +1256 Perceptive Solutions, Inc. + 4201 PCI-2220I + 4401 PCI-2240I + 5201 PCI-2000 +1257 Vertex Networks, Inc. +1258 Gilbarco, Inc. +1259 Allied Telesyn International + 2560 AT-2560 Fast Ethernet Adapter (i82557B) + 2801 AT-2801FX (RTL-8139) + a117 RTL81xx Fast Ethernet + a11e RTL81xx Fast Ethernet + a120 21x4x DEC-Tulip compatible 10/100 Ethernet +125a ABB Power Systems +125b Asix Electronics Corporation + 1400 AX88141 Fast Ethernet Controller + 1186 1100 AX8814X Based PCI Fast Ethernet Adapter +125c Aurora Technologies, Inc. + 0101 Saturn 4520P + 0640 Aries 16000P +125d ESS Technology + 0000 ES336H Fax Modem (Early Model) + 1948 ES1948 Maestro-1 + 1968 ES1968 Maestro 2 + 1028 0085 ES1968 Maestro-2 PCI + 1033 8051 ES1968 Maestro-2 Audiodrive + 1969 ES1969 Solo-1 Audiodrive + 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard + 125d 8888 Solo-1 Audio Adapter + 153b 111b Terratec 128i PCI + 1978 ES1978 Maestro 2E + 0e11 b112 Armada M700/E500 + 1033 803c ES1978 Maestro-2E Audiodrive + 1033 8058 ES1978 Maestro-2E Audiodrive + 1092 4000 Monster Sound MX400 + 1179 0001 ES1978 Maestro-2E Audiodrive + 1988 ES1988 Allegro-1 + 0e11 0098 Evo N600c + 1092 4100 Sonic Impact S100 + 125d 0431 Allegro AudioDrive + 125d 1988 ESS Allegro-1 Audiodrive + 125d 1998 Allegro AudioDrive + 125d 1999 Allegro-1 AudioDrive + 1989 ESS Modem + 125d 1989 ESS Modem + 1998 ES1983S Maestro-3i PCI Audio Accelerator + 1028 00b1 Latitude C600 + 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100) + 1999 ES1983S Maestro-3i PCI Modem Accelerator + 199a ES1983S Maestro-3i PCI Audio Accelerator + 199b ES1983S Maestro-3i PCI Modem Accelerator + 2808 ES336H Fax Modem (Later Model) + 2838 ES2838/2839 SuperLink Modem + 2898 ES2898 Modem + 125d 0424 ES56-PI Data Fax Modem + 125d 0425 ES56T-PI Data Fax Modem + 125d 0426 ES56V-PI Data Fax Modem + 125d 0427 VW-PI Data Fax Modem + 125d 0428 ES56ST-PI Data Fax Modem + 125d 0429 ES56SV-PI Data Fax Modem + 147a c001 ES56-PI Data Fax Modem + 148d 1030 HCF WV-PI56 [ESS ES56-PI Data Fax Modem] + 14fe 0428 ES56-PI Data Fax Modem + 14fe 0429 ES56-PI Data Fax Modem +125e Specialvideo Engineering SRL +125f Concurrent Technologies, Inc. +1260 Intersil Corporation + 3872 Prism 2.5 Wavelan chipset + 1468 0202 LAN-Express IEEE 802.11b Wireless LAN + 3873 Prism 2.5 Wavelan chipset + 1186 3501 DWL-520 Wireless PCI Adapter + 1186 3700 DWL-520 Wireless PCI Adapter, Rev E1 + 1385 4105 MA311 802.11b wireless adapter + 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter + 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter + 1737 3874 WMP11 Wireless 802.11b PCI Adapter + 8086 2510 M3AWEB Wireless 802.11b MiniPCI Adapter + 8086 2513 Wireless 802.11b MiniPCI Adapter + 3886 ISL3886 [Prism Javelin/Prism Xbow] + 17cf 0037 XG-901 and clones Wireless Adapter + 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow] + 10b8 2802 SMC2802W Wireless PCI Adapter + 10b8 2835 SMC2835W Wireless Cardbus Adapter + 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter + 1113 4203 WN4201B + 1113 8201 T-Com T-Sinus 154pcicard Wireless PCI Adapter + 1113 b301 T-Sinus 154card Cardbus + 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886] + 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter + 1186 3202 DWL-G650 A1 Wireless Adapter + 1259 c104 CG-WLCB54GT Wireless Adapter + 1260 0000 WG511 Wireless Adapter + 1385 4800 WG511 Wireless Adapter + 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter + 17cf 0014 XG-600 and clones Wireless Adapter + 17cf 0020 XG-900 and clones Wireless Adapter + 8130 HMP8130 NTSC/PAL Video Decoder + 8131 HMP8131 NTSC/PAL Video Decoder +# This is probably more likely a HW fault, but I am keeping it for now --mj + ffff ISL3886IK + 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter +1261 Matsushita-Kotobuki Electronics Industries, Ltd. +1262 ES Computer Company, Ltd. +1263 Sonic Solutions +1264 Aval Nagasaki Corporation +1265 Casio Computer Co., Ltd. +1266 Microdyne Corporation + 0001 NE10/100 Adapter (i82557B) + 1910 NE2000Plus (RT8029) Ethernet Adapter + 1266 1910 NE2000Plus Ethernet Adapter +1267 S. A. Telecommunications + 5352 PCR2101 + 5a4b Telsat Turbo +1268 Tektronix +1269 Thomson-CSF/TTM +126a Lexmark International, Inc. +126b Adax, Inc. +126c Northern Telecom + 1211 10/100BaseTX [RTL81xx] + 126c 802.11b Wireless Ethernet Adapter +126d Splash Technology, Inc. +126e Sumitomo Metal Industries, Ltd. +126f Silicon Motion, Inc. + 0501 SM501 VoyagerGX Rev. AA + 0510 SM501 VoyagerGX Rev. B + 0710 SM710 LynxEM + 0712 SM712 LynxEM+ + 0720 SM720 Lynx3DM + 0730 SM731 Cougar3DR + 0810 SM810 LynxE + 0811 SM811 LynxE + 0820 SM820 Lynx3D + 0910 SM910 +1270 Olympus Optical Co., Ltd. +1271 GW Instruments +1272 Telematics International +1273 Hughes Network Systems + 0002 DirecPC +1274 Ensoniq + 1171 ES1373 [AudioPCI] (also Creative Labs CT5803) + 1371 ES1371 [AudioPCI-97] + 0e11 0024 AudioPCI on Motherboard Compaq Deskpro + 0e11 b1a7 ES1371, ES1373 AudioPCI + 1033 80ac ES1371, ES1373 AudioPCI + 1042 1854 Tazer + 107b 8054 Tabor2 + 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128 + 1274 8001 CT4751 board + 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A + 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10 + 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A + 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A + 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A + 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A + 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00 + 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A + 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00 + 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00 + 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00 + 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191 + 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193 + 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A + 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A + 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639 + 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800 + 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801 + 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739 + 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11 + 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31 + 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11 + 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13 + 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E + 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810 + 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E + 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S + 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S + 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR + 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX + 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV + 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2 + 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV + 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2 + 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX + 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX + 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX + 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman + 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod + 8086 4541 D815EEA Motherboard + 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island + 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX + 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal + 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX + 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX + 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver + 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver + 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX + 5000 ES1370 [AudioPCI] + 5880 5880B [AudioPCI] + 1274 2000 Creative Sound Blaster AudioPCI128 + 1274 2003 Creative SoundBlaster AudioPCI 128 + 1274 5880 Creative Sound Blaster AudioPCI128 + 1274 8001 Sound Blaster 16PCI 4.1ch + 1458 a000 5880 AudioPCI On Motherboard 6OXET + 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00 + 270f 2001 5880 AudioPCI On Motherboard 6CTR + 270f 2200 5880 AudioPCI On Motherboard 6WTX + 270f 7040 5880 AudioPCI On Motherboard 6ATA4 + 8001 CT5880 [AudioPCI] + 8002 5880A [AudioPCI] +1275 Network Appliance Corporation +1276 Switched Network Technologies, Inc. +1277 Comstream +1278 Transtech Parallel Systems Ltd. + 0701 TPE3/TM3 PowerPC Node + 0710 TPE5 PowerPC PCI board + 1101 TS-C43 card with 4 ADSP-TS101 processors +1279 Transmeta Corporation + 0060 TM8000 Northbridge + 0061 TM8000 AGP bridge + 0295 Northbridge + 0395 LongRun Northbridge + 0396 SDRAM controller + 0397 BIOS scratchpad +127a Rockwell International + 1002 HCF 56k Data/Fax Modem + 1092 094c SupraExpress 56i PRO [Diamond SUP2380] + 122d 4002 HPG / MDP3858-U + 122d 4005 MDP3858-E + 122d 4007 MDP3858-A/-NZ + 122d 4012 MDP3858-SA + 122d 4017 MDP3858-W + 122d 4018 MDP3858-W + 127a 1002 Rockwell 56K D/F HCF Modem + 1003 HCF 56k Data/Fax Modem + 0e11 b0bc 229-DF Zephyr + 0e11 b114 229-DF Cheetah + 1033 802b 229-DF + 13df 1003 PCI56RX Modem + 13e0 0117 IBM + 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem + 13e0 0197 IBM + 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem + 13e0 01f7 IBM + 1436 1003 IBM + 1436 1103 IBM 5614PM3G V.90 Modem + 1436 1602 Compaq 229-DF Ducati + 1004 HCF 56k Data/Fax/Voice Modem + 1048 1500 MicroLink 56k Modem + 10cf 1059 Fujitsu 229-DFRT + 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1005 127a AOpen FM56-P + 1033 8029 229-DFSV + 1033 8054 Modem + 10cf 103c Fujitsu + 10cf 1055 Fujitsu 229-DFSV + 10cf 1056 Fujitsu 229-DFSV + 122d 4003 MDP3858SP-U + 122d 4006 Packard Bell MDP3858V-E + 122d 4008 MDP3858SP-A/SP-NZ + 122d 4009 MDP3858SP-E + 122d 4010 MDP3858V-U + 122d 4011 MDP3858SP-SA + 122d 4013 MDP3858V-A/V-NZ + 122d 4015 MDP3858SP-W + 122d 4016 MDP3858V-W + 122d 4019 MDP3858V-SA + 13df 1005 PCI56RVP Modem + 13e0 0187 IBM + 13e0 01a7 IBM + 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem + 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem + 1436 1005 IBM + 1436 1105 IBM + 1437 1105 IBM 5614PS3G V.90 Modem + 1022 HCF 56k Modem + 1436 1303 M3-5614PM3G V.90 Modem + 1023 HCF 56k Data/Fax Modem + 122d 4020 Packard Bell MDP3858-WE + 122d 4023 MDP3858-UE + 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem + 13e0 0297 IBM + 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem + 1436 1203 IBM + 1436 1303 IBM + 1024 HCF 56k Data/Fax/Voice Modem + 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 106a Fujitsu 235-DFSV + 122d 4021 Packard Bell MDP3858V-WE + 122d 4022 MDP3858SP-WE + 122d 4024 MDP3858V-UE + 122d 4025 MDP3858SP-UE + 1026 HCF 56k PCI Speakerphone Modem + 1032 HCF 56k Modem + 1033 HCF 56k Modem + 1034 HCF 56k Modem + 1035 HCF 56k PCI Speakerphone Modem + 1036 HCF 56k Modem + 1085 HCF 56k Volcano PCI Modem + 2005 HCF 56k Data/Fax Modem + 104d 8044 229-DFSV + 104d 8045 229-DFSV + 104d 8055 PBE/Aztech 235W-DFSV + 104d 8056 235-DFSV + 104d 805a Modem + 104d 805f Modem + 104d 8074 Modem + 2013 HSF 56k Data/Fax Modem + 1179 0001 Modem + 1179 ff00 Modem + 2014 HSF 56k Data/Fax/Voice Modem + 10cf 1057 Fujitsu Citicorp III + 122d 4050 MSP3880-U + 122d 4055 MSP3880-W + 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 1063 Fujitsu + 10cf 1064 Fujitsu + 1468 2015 Fujitsu + 2016 HSF 56k Data/Fax/Voice/Spkp Modem + 122d 4051 MSP3880V-W + 122d 4052 MSP3880SP-W + 122d 4054 MSP3880V-U + 122d 4056 MSP3880SP-U + 122d 4057 MSP3880SP-A + 4311 Riptide HSF 56k PCI Modem + 127a 4311 Ring Modular? Riptide HSF RT HP Dom + 13e0 0210 HP-GVC + 4320 Riptide PCI Audio Controller + 1235 4320 Riptide PCI Audio Controller + 4321 Riptide HCF 56k PCI Modem + 1235 4321 Hewlett Packard DF + 1235 4324 Hewlett Packard DF + 13e0 0210 Hewlett Packard DF + 144d 2321 Riptide + 4322 Riptide PCI Game Controller + 1235 4322 Riptide PCI Game Controller + 8234 RapidFire 616X ATM155 Adapter + 108d 0022 RapidFire 616X ATM155 Adapter + 108d 0027 RapidFire 616X ATM155 Adapter +127b Pixera Corporation +127c Crosspoint Solutions, Inc. +127d Vela Research +127e Winnov, L.P. + 0010 Videum 1000 Plus +127f Fujifilm +1280 Photoscript Group Ltd. +1281 Yokogawa Electric Corporation +1282 Davicom Semiconductor, Inc. + 6585 DM562P V90 Modem + 9009 Ethernet 100/10 MBit + 9100 21x4x DEC-Tulip compatible 10/100 Ethernet + 9102 21x4x DEC-Tulip compatible 10/100 Ethernet +# Subsystem ID is main ID reveresed. + 0291 8212 DM9102A (DM9102AE, SM9102AF) Ethernet 100/10 MBit + 9132 Ethernet 100/10 MBit +1283 Integrated Technology Express, Inc. + 673a IT8330G + 8152 IT8152F/G Advanced RISC-to-PCI Companion Chip + 8211 ITE 8211F Single Channel UDMA 133 + 1043 8138 P5GD1-VW Mainboard +# PCI version seems to be IT8212, embedded seems to be ITE8212 + 8212 IT/ITE8212 Dual channel ATA RAID controller + 1283 0001 IT/ITE8212 Dual channel ATA RAID controller + 8213 IT8213 IDE Controller + 8330 IT8330G + 8872 IT8874F PCI Dual Serial Port Controller + 8888 IT8888F/G PCI to ISA Bridge with SMB [Golden Gate] + 8889 IT8889F PCI to ISA Bridge + e886 IT8330G +1284 Sahara Networks, Inc. +1285 Platform Technologies, Inc. + 0100 AGOGO sound chip (aka ESS Maestro 1) +1286 Mazet GmbH +1287 M-Pact, Inc. + 001e LS220D DVD Decoder + 001f LS220C DVD Decoder +1288 Timestep Corporation +1289 AVC Technology, Inc. +128a Asante Technologies, Inc. +128b Transwitch Corporation +128c Retix Corporation +128d G2 Networks, Inc. + 0021 ATM155 Adapter +128e Hoontech Corporation/Samho Multi Tech Ltd. + 0008 ST128 WSS/SB + 0009 ST128 SAM9407 + 000a ST128 Game Port + 000b ST128 MPU Port + 000c ST128 Ctrl Port +128f Tateno Dennou, Inc. +1290 Sord Computer Corporation +1291 NCS Computer Italia +1292 Tritech Microelectronics Inc + fc02 Pyramid3D TR25202 +1293 Media Reality Technology +1294 Rhetorex, Inc. +1295 Imagenation Corporation + 0800 PXR800 + 1000 PXD1000 +1296 Kofax Image Products +1297 Holco Enterprise Co, Ltd/Shuttle Computer +1298 Spellcaster Telecommunications Inc. +1299 Knowledge Technology Lab. +129a VMetro, inc. + 0615 PBT-615 PCI-X Bus Analyzer +129b Image Access +129c Jaycor +129d Compcore Multimedia, Inc. +129e Victor Company of Japan, Ltd. +129f OEC Medical Systems, Inc. +12a0 Allen-Bradley Company +12a1 Simpact Associates, Inc. +12a2 Newgen Systems Corporation +12a3 Lucent Technologies + 8105 T8105 H100 Digital Switch +12a4 NTT Electronics Technology Company +12a5 Vision Dynamics Ltd. +12a6 Scalable Networks, Inc. +12a7 AMO GmbH +12a8 News Datacom +12a9 Xiotech Corporation +12aa SDL Communications, Inc. +12ab Yuan Yuan Enterprise Co., Ltd. + 0000 MPG160/Kuroutoshikou ITVC15-STVLP + 0002 AU8830 [Vortex2] Based Sound Card With A3D Support + 2300 Club-3D Zap TV2100 + 3000 MPG-200C PCI DVD Decoder Card + 4789 MPC788 MiniPCI Hybrid TV Tuner + fff3 MPG600/Kuroutoshikou ITVC16-STVLP + ffff MPG600/Kuroutoshikou ITVC16-STVLP +12ac Measurex Corporation +12ad Multidata GmbH +12ae Alteon Networks Inc. + 0001 AceNIC Gigabit Ethernet + 1014 0104 Gigabit Ethernet-SX PCI Adapter + 12ae 0001 Gigabit Ethernet-SX (Universal) + 1410 0104 Gigabit Ethernet-SX PCI Adapter + 0002 AceNIC Gigabit Ethernet (Copper) + 10a9 8002 Acenic Gigabit Ethernet + 12ae 0002 Gigabit Ethernet-T (3C986-T) + 00fa Farallon PN9100-T Gigabit Ethernet +12af TDK USA Corp +12b0 Jorge Scientific Corp +12b1 GammaLink +12b2 General Signal Networks +12b3 Inter-Face Co Ltd +12b4 FutureTel Inc +12b5 Granite Systems Inc. +12b6 Natural Microsystems +12b7 Cognex Modular Vision Systems Div. - Acumen Inc. +12b8 Korg +# Nee US Robotics +12b9 3Com Corp, Modem Division + 1006 WinModem + 12b9 005c USR 56k Internal Voice WinModem (Model 3472) + 12b9 005e USR 56k Internal WinModem (Models 662975) + 12b9 0062 USR 56k Internal Voice WinModem (Model 662978) + 12b9 0068 USR 56k Internal Voice WinModem (Model 5690) + 12b9 007a USR 56k Internal Voice WinModem (Model 662974) + 12b9 007f USR 56k Internal WinModem (Models 5698, 5699) + 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528) + 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529) + 12b9 0091 USR 56k Internal Voice WinModem (Model 2978) + 1007 USR 56k Internal WinModem + 12b9 00a3 USR 56k Internal WinModem (Model 3595) + 12b9 00c4 U.S. Robotics V.92 Voice Faxmodem (2884A/B/C) + 1008 56K FaxModem Model 5610 + 12b9 00a2 USR 56k Internal FAX Modem (Model 2977) + 12b9 00aa USR 56k Internal Voice Modem (Model 2976) + 12b9 00ab USR 56k Internal Voice Modem (Model 5609) + 12b9 00ac USR 56k Internal Voice Modem (Model 3298) + 12b9 00ad USR 56k Internal FAX Modem (Model 5610) + 12b9 00d3 USR 56K Internal V92 FAX Modem (Model 5610) + 12b9 baba USR 56K Internal Voice Modem 3CP3298-DEL (Model 5601) [Hawk] +12ba BittWare, Inc. +12bb Nippon Unisoft Corporation +12bc Array Microsystems +12bd Computerm Corp. +12be Anchor Chips Inc. + 3041 AN3041Q CO-MEM + 3042 AN3042Q CO-MEM Lite + 12be 3042 Anchor Chips Lite Evaluation Board +12bf Fujifilm Microdevices +12c0 Infimed +12c1 GMM Research Corp +12c2 Mentec Limited +12c3 Holtek Microelectronics Inc + 0058 PCI NE2K Ethernet + 5598 PCI NE2K Ethernet +12c4 Connect Tech Inc + 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11) + 0002 Blue HEAT/PCI 4 (RS232) + 0003 Blue HEAT/PCI 2 (RS232) + 0004 Blue HEAT/PCI 8 (UNIV, RS485) + 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485) + 0006 Blue HEAT/PCI 4 (OPTO, RS485) + 0007 Blue HEAT/PCI 2+2 (RS232/485) + 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485) + 0009 Blue HEAT/PCI 2+6 (RS232/485) + 000a Blue HEAT/PCI 8 (Tx, RS485) + 000b Blue HEAT/PCI 4 (Tx, RS485) + 000c Blue HEAT/PCI 2 (20 MHz, RS485) + 000d Blue HEAT/PCI 2 PTM + 0100 NT960/PCI + 0201 cPCI Titan - 2 Port + 0202 cPCI Titan - 4 Port + 0300 CTI PCI UART 2 (RS232) + 0301 CTI PCI UART 4 (RS232) + 0302 CTI PCI UART 8 (RS232) + 0310 CTI PCI UART 1+1 (RS232/485) + 0311 CTI PCI UART 2+2 (RS232/485) + 0312 CTI PCI UART 4+4 (RS232/485) + 0320 CTI PCI UART 2 + 0321 CTI PCI UART 4 + 0322 CTI PCI UART 8 + 0330 CTI PCI UART 2 (RS485) + 0331 CTI PCI UART 4 (RS485) + 0332 CTI PCI UART 8 (RS485) +12c5 Picture Elements Incorporated + 007e Imaging/Scanning Subsystem Engine + 007f Imaging/Scanning Subsystem Engine + 0081 PCIVST [Grayscale Thresholding Engine] + 0085 Video Simulator/Sender + 0086 THR2 Multi-scale Thresholder +12c6 Mitani Corporation +12c7 Dialogic Corp +# 12 Line, 6 port, CT-BUS/SC-BUS, loopstart FXO adaptor. + 0546 Springware D/120JCT-LS +# 24 Channel, 1 Port, CT-BUS/SC-BUS, T1/PRI adaptor. + 0647 Springware D/240JCT-T1 +# 4 Line, 4 port, CT-BUS/SC-BUS, loopstart FXO adaptor. Revision 01 + 0676 Springware D/41JCT-LS +# 48 Channel, 2 Port, CT-BUS/SC-BUS, T1/PRI adaptor. + 0685 Springware D/480JCT-2T1 +12c8 G Force Co, Ltd +12c9 Gigi Operations +12ca Integrated Computing Engines +12cb Antex Electronics Corporation + 0027 SC4 (StudioCard) +12cc Pluto Technologies International +12cd Aims Lab +12ce Netspeed Inc. +12cf Prophet Systems, Inc. +12d0 GDE Systems, Inc. +12d1 PSITech +12d2 NVidia / SGS Thomson (Joint Venture) + 0008 NV1 + 0009 DAC64 + 0018 Riva128 + 1048 0c10 VICTORY Erazor + 107b 8030 STB Velocity 128 + 1092 0350 Viper V330 + 1092 1092 Viper V330 + 10b4 1b1b STB Velocity 128 + 10b4 1b1d STB Velocity 128 + 10b4 1b1e STB Velocity 128, PAL TV-Out + 10b4 1b20 STB Velocity 128 Sapphire + 10b4 1b21 STB Velocity 128 + 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out + 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out + 10b4 1b27 STB Velocity 128 DVD + 10b4 1b88 MVP Pro 128 + 10b4 222a STB Velocity 128 AGP + 10b4 2230 STB Velocity 128 + 10b4 2232 STB Velocity 128 + 10b4 2235 STB Velocity 128 AGP + 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000 + 0019 Riva128ZX + 0020 TNT + 0028 TNT2 + 0029 UTNT2 + 002c VTNT2 + 00a0 ITNT2 +12d3 Vingmed Sound A/S +12d4 Ulticom (Formerly DGM&S) + 0200 T1 Card +12d5 Equator Technologies Inc + 0003 BSP16 + 1000 BSP15 +12d6 Analogic Corp +12d7 Biotronic SRL +12d8 Pericom Semiconductor + 01a7 PI7C21P100 PCI to PCI Bridge + 71e2 PI7C7300A/PI7C7300D PCI-to-PCI Bridge + 71e3 PI7C7300A/PI7C7300D PCI-to-PCI Bridge (Secondary Bus 2) + 8140 PI7C8140A PCI-to-PCI Bridge + 8148 PI7C8148A/PI7C8148B PCI-to-PCI Bridge + 8150 PCI to PCI Bridge + 8152 PI7C8152A/PI7C8152B/PI7C8152BI PCI-to-PCI Bridge + 8154 PI7C8154A/PI7C8154B/PI7C8154BI PCI-to-PCI Bridge + e110 PI7C9X110 PCI Express to PCI bridge + 1775 11cc CC11/CL11 CompactPCI Bridge + e130 PCI Express to PCI-XPI7C9X130 PCI-X Bridge +12d9 Aculab PLC + 0002 PCI Prosody + 0004 cPCI Prosody + 0005 Aculab E1/T1 PCI card + 1078 Prosody X class e1000 device + 12d9 000d Prosody X PCI + 12d9 000e Prosody X cPCI +12da True Time Inc. +12db Annapolis Micro Systems, Inc +12dc Symicron Computer Communication Ltd. +12dd Management Graphics +12de Rainbow Technologies + 0200 CryptoSwift CS200 +12df SBS Technologies Inc +12e0 Chase Research + 0010 ST16C654 Quad UART + 0020 ST16C654 Quad UART + 0030 ST16C654 Quad UART +12e1 Nintendo Co, Ltd +12e2 Datum Inc. Bancomm-Timing Division +12e3 Imation Corp - Medical Imaging Systems +12e4 Brooktrout Technology Inc +12e5 Apex Semiconductor Inc +12e6 Cirel Systems +12e7 Sunsgroup Corporation +12e8 Crisc Corp +12e9 GE Spacenet +12ea Zuken +12eb Aureal Semiconductor + 0001 Vortex 1 + 104d 8036 AU8820 Vortex Digital Audio Processor + 1092 2000 Sonic Impact A3D + 1092 2100 Sonic Impact A3D + 1092 2110 Sonic Impact A3D + 1092 2200 Sonic Impact A3D + 122d 1002 AU8820 Vortex Digital Audio Processor + 12eb 0001 AU8820 Vortex Digital Audio Processor + 5053 3355 Montego + 0002 Vortex 2 + 104d 8049 AU8830 Vortex 3D Digital Audio Processor + 104d 807b AU8830 Vortex 3D Digital Audio Processor + 1092 3000 Monster Sound II + 1092 3001 Monster Sound II + 1092 3002 Monster Sound II + 1092 3003 Monster Sound II + 1092 3004 Monster Sound II + 12eb 0002 AU8830 Vortex 3D Digital Audio Processor + 12eb 0088 AU8830 Vortex 3D Digital Audio Processor + 144d 3510 AU8830 Vortex 3D Digital Audio Processor + 5053 3356 Montego II + 0003 AU8810 Vortex Digital Audio Processor + 104d 8049 AU8810 Vortex Digital Audio Processor + 104d 8077 AU8810 Vortex Digital Audio Processor + 109f 1000 AU8810 Vortex Digital Audio Processor + 12eb 0003 AU8810 Vortex Digital Audio Processor + 1462 6780 AU8810 Vortex Digital Audio Processor + 14a4 2073 AU8810 Vortex Digital Audio Processor + 14a4 2091 AU8810 Vortex Digital Audio Processor + 14a4 2104 AU8810 Vortex Digital Audio Processor + 14a4 2106 AU8810 Vortex Digital Audio Processor + 8803 Vortex 56k Software Modem + 12eb 8803 Vortex 56k Software Modem +12ec 3A International, Inc. +12ed Optivision Inc. +12ee Orange Micro +12ef Vienna Systems +12f0 Pentek +12f1 Sorenson Vision Inc +12f2 Gammagraphx, Inc. +12f3 Radstone Technology +12f4 Megatel +12f5 Forks +12f6 Dawson France +12f7 Cognex +12f8 Electronic Design GmbH + 0002 VideoMaker +12f9 Four Fold Ltd +12fb Spectrum Signal Processing + 0001 PMC-MAI + 00f5 F5 Dakar + 02ad PMC-2MAI + 2adc ePMC-2ADC + 3100 PRO-3100 + 3500 PRO-3500 + 4d4f Modena + 8120 ePMC-8120 + da62 Daytona C6201 PCI (Hurricane) + db62 Ingliston XBIF + dc62 Ingliston PLX9054 + dd62 Ingliston JTAG/ISP + eddc ePMC-MSDDC + fa01 ePMC-FPGA +12fc Capital Equipment Corp +12fd I2S +12fe ESD Electronic System Design GmbH +12ff Lexicon +1300 Harman International Industries Inc +1302 Computer Sciences Corp +1303 Innovative Integration + 0030 X3-SDF 4-channel XMC acquisition board +1304 Juniper Networks +1305 Netphone, Inc +1306 Duet Technologies +# Nee ComputerBoards +1307 Measurement Computing + 0001 PCI-DAS1602/16 + 000b PCI-DIO48H + 000c PCI-PDISO8 + 000d PCI-PDISO16 + 000f PCI-DAS1200 + 0010 PCI-DAS1602/12 + 0014 PCI-DIO24H + 0015 PCI-DIO24H/CTR3 + 0016 PCI-DIO48H/CTR15 + 0017 PCI-DIO96H + 0018 PCI-CTR05 + 0019 PCI-DAS1200/JR + 001a PCI-DAS1001 + 001b PCI-DAS1002 + 001c PCI-DAS1602JR/16 + 001d PCI-DAS6402/16 + 001e PCI-DAS6402/12 + 001f PCI-DAS16/M1 + 0020 PCI-DDA02/12 + 0021 PCI-DDA04/12 + 0022 PCI-DDA08/12 + 0023 PCI-DDA02/16 + 0024 PCI-DDA04/16 + 0025 PCI-DDA08/16 + 0026 PCI-DAC04/12-HS + 0027 PCI-DAC04/16-HS + 0028 PCI-DIO24 + 0029 PCI-DAS08 + 002c PCI-INT32 + 0033 PCI-DUAL-AC5 + 0034 PCI-DAS-TC + 0035 PCI-DAS64/M1/16 + 0036 PCI-DAS64/M2/16 + 0037 PCI-DAS64/M3/16 + 004c PCI-DAS1000 + 004d PCI-QUAD04 + 0052 PCI-DAS4020/12 + 0053 PCIM-DDA06/16 + 0054 PCI-DIO96 + 005d PCI-DAS6023 + 005e PCI-DAS6025 + 005f PCI-DAS6030 + 0060 PCI-DAS6031 + 0061 PCI-DAS6032 + 0062 PCI-DAS6033 + 0063 PCI-DAS6034 + 0064 PCI-DAS6035 + 0065 PCI-DAS6040 + 0066 PCI-DAS6052 + 0067 PCI-DAS6070 + 0068 PCI-DAS6071 + 006f PCI-DAS6036 + 0078 PCI-DAS6013 + 0079 PCI-DAS6014 +1308 Jato Technologies Inc. + 0001 NetCelerator Adapter + 1308 0001 NetCelerator Adapter +1309 AB Semiconductor Ltd +130a Mitsubishi Electric Microcomputer +130b Colorgraphic Communications Corp +130c Ambex Technologies, Inc +130d Accelerix Inc +130e Yamatake-Honeywell Co. Ltd +130f Advanet Inc +1310 Gespac +1311 Videoserver, Inc +1312 Acuity Imaging, Inc +1313 Yaskawa Electric Co. +1315 Wavesat +1316 Teradyne Inc +1317 ADMtek + 0981 21x4x DEC-Tulip compatible 10/100 Ethernet + 0985 NC100 Network Everywhere Fast Ethernet 10/100 + 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter + 1985 21x4x DEC-Tulip compatible 10/100 Ethernet + 1385 511a FA511 + 1395 2103 CB100-EZ (4-LED version) + 2850 HSP MicroModem 56 + 5120 ADM5120 OpenGate System-on-Chip + 8201 ADM8211 802.11b Wireless Interface + 10b8 2635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card + 1317 8201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card + 8211 ADM8211 802.11b Wireless Interface + 9511 21x4x DEC-Tulip compatible 10/100 Ethernet +1318 Packet Engines Inc. + 0911 GNIC-II PCI Gigabit Ethernet [Hamachi] +1319 Fortemedia, Inc + 0801 Xwave QS3000A [FM801] + 1319 1319 FM801 PCI Audio + 0802 Xwave QS3000A [FM801 game port] + 1319 1319 FM801 PCI Joystick + 1000 FM801 PCI Audio + 1001 FM801 PCI Joystick +131a Finisar Corp. +131c Nippon Electro-Sensory Devices Corp +131d Sysmic, Inc. +131e Xinex Networks Inc +131f Siig Inc + 1000 CyberSerial (1-port) 16550 + 1001 CyberSerial (1-port) 16650 + 1002 CyberSerial (1-port) 16850 + 1010 Duet 1S(16550)+1P + 1011 Duet 1S(16650)+1P + 1012 Duet 1S(16850)+1P + 1020 CyberParallel (1-port) + 1021 CyberParallel (2-port) + 1030 CyberSerial (2-port) 16550 + 1031 CyberSerial (2-port) 16650 + 1032 CyberSerial (2-port) 16850 + 1034 Trio 2S(16550)+1P + 1035 Trio 2S(16650)+1P + 1036 Trio 2S(16850)+1P + 1050 CyberSerial (4-port) 16550 + 1051 CyberSerial (4-port) 16650 + 1052 CyberSerial (4-port) 16850 + 2000 CyberSerial (1-port) 16550 + 2001 CyberSerial (1-port) 16650 + 2002 CyberSerial (1-port) 16850 + 2010 Duet 1S(16550)+1P + 2011 Duet 1S(16650)+1P + 2012 Duet 1S(16850)+1P + 2020 CyberParallel (1-port) + 2021 CyberParallel (2-port) + 2030 CyberSerial (2-port) 16550 + 131f 2030 PCI Serial Card + 2031 CyberSerial (2-port) 16650 + 2032 CyberSerial (2-port) 16850 + 2040 Trio 1S(16550)+2P + 2041 Trio 1S(16650)+2P + 2042 Trio 1S(16850)+2P + 2050 CyberSerial (4-port) 16550 + 2051 CyberSerial (4-port) 16650 + 2052 CyberSerial (4-port) 16850 + 2060 Trio 2S(16550)+1P + 2061 Trio 2S(16650)+1P + 2062 Trio 2S(16850)+1P + 2081 CyberSerial (8-port) ST16654 +1320 Crypto AG +1321 Arcobel Graphics BV +1322 MTT Co., Ltd +1323 Dome Inc +1324 Sphere Communications +1325 Salix Technologies, Inc +1326 Seachange international +1327 Voss scientific +1328 quadrant international +1329 Productivity Enhancement +132a Microcom Inc. +132b Broadband Technologies +132c Micrel Inc +132d Integrated Silicon Solution, Inc. +1330 MMC Networks +1331 RadiSys Corporation + 0030 ENP-2611 + 8200 82600 Host Bridge + 8201 82600 IDE + 8202 82600 USB + 8210 82600 PCI Bridge +1332 Micro Memory + 5415 MM-5415CN PCI Memory Module with Battery Backup + 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup + 6140 MM-6140D +1334 Redcreek Communications, Inc +1335 Videomail, Inc +1337 Third Planet Publishing +1338 BT Electronics +133a Vtel Corp +133b Softcom Microsystems +133c Holontech Corp +133d SS Technologies +133e Virtual Computer Corp +133f SCM Microsystems +1340 Atalla Corp +1341 Kyoto Microcomputer Co +1342 Promax Systems Inc +1343 Phylon Communications Inc +1344 Crucial Technology +1345 Arescom Inc +1347 Odetics +1349 Sumitomo Electric Industries, Ltd. +134a DTC Technology Corp. + 0001 Domex 536 + 0002 Domex DMX3194UP SCSI Adapter +134b ARK Research Corp. +134c Chori Joho System Co. Ltd +134d PCTel Inc + 2189 HSP56 MicroModem + 2486 2304WT V.92 MDC Modem + 7890 HSP MicroModem 56 + 134d 0001 PCT789 adapter + 7891 HSP MicroModem 56 + 134d 0001 HSP MicroModem 56 + 7892 HSP MicroModem 56 + 7893 HSP MicroModem 56 + 7894 HSP MicroModem 56 + 7895 HSP MicroModem 56 + 7896 HSP MicroModem 56 + 7897 HSP MicroModem 56 +134e CSTI +134f Algo System Co Ltd +1350 Systec Co. Ltd +1351 Sonix Inc +1353 Thales Idatys + 0002 Proserver + 0003 PCI-FUT + 0004 PCI-S0 + 0005 PCI-FUT-S0 +1354 Dwave System Inc +1355 Kratos Analytical Ltd +1356 The Logical Co +1359 Prisa Networks +135a Brain Boxes + 0a61 UC-324 [VELOCITY RS422/485] +135b Giganet Inc +135c Quatech Inc + 0010 QSC-100 + 0020 DSC-100 + 0030 DSC-200/300 + 0040 QSC-200/300 + 0050 ESC-100D + 0060 ESC-100M + 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230) + 0170 QSCLP-100 + 0180 DSCLP-100 + 0190 SSCLP-100 + 01a0 QSCLP-200/300 + 01b0 DSCLP-200/300 + 01c0 SSCLP-200/300 + 0258 DSPSX-200/300 +135d ABB Network Partner AB +135e Sealevel Systems Inc + 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32) + 7101 Single Port RS-232/422/485/530 + 7201 Dual Port RS-232/422/485 Interface + 7202 Dual Port RS-232 Interface + 7401 Four Port RS-232 Interface + 7402 Four Port RS-422/485 Interface + 7801 Eight Port RS-232 Interface + 7804 Eight Port RS-232/422/485 Interface + 8001 8001 Digital I/O Adapter +135f I-Data International A-S +1360 Meinberg Funkuhren + 0101 PCI32 DCF77 Radio Clock + 0102 PCI509 DCF77 Radio Clock + 0103 PCI510 DCF77 Radio Clock + 0104 PCI511 DCF77 Radio Clock + 0105 PEX511 DCF77 Radio Clock (PCI Express) + 0201 GPS167PCI GPS Receiver + 0202 GPS168PCI GPS Receiver + 0203 GPS169PCI GPS Receiver + 0204 GPS170PCI GPS Receiver + 0205 GPS170PEX GPS Receiver (PCI Express) + 0301 TCR510PCI IRIG Timecode Reader + 0302 TCR167PCI IRIG Timecode Reader + 0303 TCR511PCI IRIG Timecode Reader + 0304 TCR511PEX IRIG Timecode Reader (PCI Express) + 0305 TCR170PEX IRIG Timecode Reader (PCI Express) + 0501 PTP270PEX PTP/IEEE1588 slave card (PCI Express) + 0601 FRC511PEX Free Running Clock (PCI Express) +1361 Soliton Systems K.K. +1362 Fujifacom Corporation +1363 Phoenix Technology Ltd +1364 ATM Communications Inc +1365 Hypercope GmbH +1366 Teijin Seiki Co. Ltd +1367 Hitachi Zosen Corporation +1368 Skyware Corporation +1369 Digigram +136a High Soft Tech + 0004 HST Saphir VII mini PCI + 0007 HST Saphir III E MultiLink 4 + 0008 HST Saphir III E MultiLink 8 + 000a HST Saphir III E MultiLink 2 +136b Kawasaki Steel Corporation + ff01 KL5A72002 Motion JPEG +136c Adtek System Science Co Ltd +136d Gigalabs Inc +136f Applied Magic Inc +1370 ATL Products +1371 CNet Technology Inc + 434e GigaCard Network Adapter + 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) +1373 Silicon Vision Inc +1374 Silicom Ltd. + 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter + 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter + 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter + 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter + 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter + 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter + 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI) + 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI) + 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI) + 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX) + 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL) + 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter + 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter + 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter + 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter + 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter + 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter + 0037 Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter + 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter + 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter + 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter + 003b Silicom Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI) + 003c Silicom Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB) + 003e Silicom Dual port Fiber Giga Ethernet PCI-E 571 TAP/Bypass Server Adapter (PEG2TBFI) + 003f Silicom Dual port Copper Giga Ethernet PCI-X 546 TAP/Bypass Server Adapter (PXG2TBI) + 0040 Silicom Quad port Fiber-SX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI) + 0043 Silicom Quad port Fiber-SX Giga Ethernet 546 Bypass Server Adapter (PXG4BPFID) + 0045 Silicom 6 port Copper Giga Ethernet 546 Bypass Server Adapter (PXG6BPI) + 0047 Silicom Dual port Fiber-SX Giga Ethernet 571 Bypass Disconnect Server Adapter (PEG2BPFID) + 004a Silicom Quad port Fiber-LX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI-LX) +1375 Argosystems Inc +1376 LMC +1377 Electronic Equipment Production & Distribution GmbH +1378 Telemann Co. Ltd +1379 Asahi Kasei Microsystems Co Ltd +137a Mark of the Unicorn Inc + 0001 PCI-324 Audiowire Interface +137b PPT Vision +137c Iwatsu Electric Co Ltd +137d Dynachip Corporation +137e Patriot Scientific Corporation +137f Japan Satellite Systems Inc +1380 Sanritz Automation Co Ltd +1381 Brains Co. Ltd +1382 Marian - Electronic & Software + 0001 ARC88 audio recording card + 2008 Prodif 96 Pro sound system + 2048 Prodif Plus sound system + 2088 Marc 8 Midi sound system + 20c8 Marc A sound system + 4008 Marc 2 sound system + 4010 Marc 2 Pro sound system + 4048 Marc 4 MIDI sound system + 4088 Marc 4 Digi sound system + 4248 Marc X sound system + 4424 TRACE D4 Sound System +1383 Controlnet Inc +1384 Reality Simulation Systems Inc +1385 Netgear + 0013 WG311T 108 Mbps Wireless PCI Adapter + 006b WA301 802.11b Wireless PCI Adapter + 4100 MA301 802.11b Wireless PCI Adapter + 4105 MA311 802.11b Wireless PCI Adapter + 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card + 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card + 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card + 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card + 4800 WG511(v1) 54 Mbps Wireless PC Card + 4900 WG311v1 54 Mbps Wireless PCI Adapter + 4a00 WAG311 802.11a/g Wireless PCI Adapter + 4b00 WG511T 108 Mbps Wireless PC Card + 4c00 WG311v2 54 Mbps Wireless-G PCI Adapter + 4d00 WG311T 108 Mbps Wireless PCI Adapter + 4e00 WG511v2 54 Mbps Wireless PC Card + 4f00 WG511U Double 108 Mbps Wireless PC Card + 5200 GA511 Gigabit PC Card + 620a GA620 Gigabit Ethernet + 630a GA630 Gigabit Ethernet + 6b00 WG311v3 54 Mbps Wireless PCI Adapter + 6d00 WPNT511 RangeMax 240 Mbps Wireless PC Card + 7b00 WN511B RangeMax Next 270 Mbps Wireless PC Card + 7c00 WN511T RangeMax Next 300 Mbps Wireless PC Card + 7d00 WN311B RangeMax Next 270 Mbps Wireless PCI Adapter + 7e00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter + f004 FA310TX + f312 FA312 REV-A1 Fast Ethernet PCI Adapter +1386 Video Domain Technologies +1387 Systran Corp +1388 Hitachi Information Technology Co Ltd +1389 Applicom International + 0001 PCI1500PFB [Intelligent fieldbus adaptor] +138a Fusion Micromedia Corp +138b Tokimec Inc +138c Silicon Reality +138d Future Techno Designs pte Ltd +138e Basler GmbH +138f Patapsco Designs Inc +1390 Concept Development Inc +1391 Development Concepts Inc +1392 Medialight Inc +1393 Moxa Technologies Co Ltd + 0001 UC7000 Serial + 1020 CP102 (2-port RS-232 PCI) + 1021 CP102UL (2-port RS-232 Universal PCI) + 1022 CP102U (2-port RS-232 Universal PCI) + 1023 CP-102UF + 1040 Smartio C104H/PCI + 1041 CP104U (4-port RS-232 Universal PCI) + 1042 CP104JU (4-port RS-232 Universal PCI) + 1043 CP104EL (4-port RS-232 Smart PCI Express) + 1044 POS104UL (4-port RS-232 Universal PCI) + 1080 CB108 (8-port RS-232 PC/104-plus Module) + 1140 CT-114 series + 1141 Industrio CP-114 + 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module) + 1143 CP-114UL (4-port RS-232/422/485 Smart Universal PCI Serial Board) + 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI) + 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express) + 1320 CP132 (2-port RS-422/485 PCI) + 1321 CP132U (2-Port RS-422/485 Universal PCI) + 1340 CP134U (4-Port RS-422/485 Universal PCI) + 1341 CB134I (4-port RS-422/485 PC/104-plus Module) + 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI) + 1680 Smartio C168H/PCI + 1681 CP-168U V2 Smart Serial Board (8-port RS-232) + 1682 CP168EL (8-port RS-232 Smart PCI Express) + 2040 Intellio CP-204J + 2180 Intellio C218 Turbo PCI + 3200 Intellio C320 Turbo PCI +1394 Level One Communications + 0001 LXT1001 Gigabit Ethernet + 1186 4800 DGE-500SX + 1394 0001 NetCelerator Adapter +1395 Ambicom Inc +1396 Cipher Systems Inc +1397 Cologne Chip Designs GmbH + 08b4 ISDN network Controller [HFC-4S] + 1397 b520 HFC-4S [IOB4ST] + 1397 b540 HFC-4S [Swyx 4xS0 SX2 QuadBri] + 1397 b556 HFC-4S [Junghanns DuoDBRI] + 1397 e888 HFC-4S [OpenVox B200P / B400P] + 16b8 ISDN network Controller [HFC-8S] + 2bd0 ISDN network controller [HFC-PCI] + 0675 1704 ISDN Adapter (PCI Bus, D, C) + 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI) + 1397 2bd0 ISDN Board + e4bf 1000 CI1-1-Harp + 30b1 ISDN network Controller [HFC-E1] + b700 ISDN network controller PrimuX S0 [HFC-PCI] + f001 GSM Network Controller [HFC-4GSM] +1398 Clarion co. Ltd +1399 Rios systems Co Ltd +139a Alacritech Inc + 0001 Quad Port 10/100 Server Accelerator + 0003 Single Port 10/100 Server Accelerator + 0005 Single Port Gigabit Server Accelerator +139b Mediasonic Multimedia Systems Ltd +139c Quantum 3d Inc +139d EPL limited +139e Media4 +139f Aethra s.r.l. +13a0 Crystal Group Inc +13a1 Kawasaki Heavy Industries Ltd +13a2 Ositech Communications Inc +13a3 Hifn Inc. + 0005 7751 Security Processor + 0006 6500 Public Key Processor + 0007 7811 Security Processor + 0012 7951 Security Processor + 0014 78XX Security Processor + 0016 8065 Security Processor + 0017 8165 Security Processor + 0018 8154 Security Processor + 001d 7956 Security Processor + 001f 7855 Security Processor + 0020 7955 Security Processor + 0026 8155 Security Processor + 002e 9630 Compression Processor + 0037 DS4100 Secure Multi-Gigabit Server Adapter with Compression +13a4 Rascom Inc +13a5 Audio Digital Imaging Inc +13a6 Videonics Inc +13a7 Teles AG +13a8 Exar Corp. + 0152 XR17C/D152 Dual PCI UART + 0154 XR17C154 Quad UART + 0158 XR17C158 Octal UART + 0252 XR17V252 Dual UART PCI controller + 0254 XR17V254 Quad UART PCI controller + 0258 XR17V258 Octal UART PCI controller +13a9 Siemens Medical Systems, Ultrasound Group +13aa Broadband Networks Inc +13ab Arcom Control Systems Ltd +13ac Motion Media Technology Ltd +13ad Nexus Inc +13ae ALD Technology Ltd +13af T.Sqware +13b0 Maxspeed Corp +13b1 Tamura corporation +13b2 Techno Chips Co. Ltd +13b3 Lanart Corporation +13b4 Wellbean Co Inc +13b5 ARM +13b6 Dlog GmbH +13b7 Logic Devices Inc +13b8 Nokia Telecommunications oy +13b9 Elecom Co Ltd +13ba Oxford Instruments +13bb Sanyo Technosound Co Ltd +13bc Bitran Corporation +13bd Sharp corporation +13be Miroku Jyoho Service Co. Ltd +13bf Sharewave Inc +13c0 Microgate Corporation + 0010 SyncLink Adapter v1 + 0020 SyncLink SCC Adapter + 0030 SyncLink Multiport Adapter + 0070 SyncLink GT Adapter + 0080 SyncLink GT4 Adapter + 00a0 SyncLink GT2 Adapter + 0210 SyncLink Adapter v2 +13c1 3ware Inc + 1000 5xxx/6xxx-series PATA-RAID + 1001 7xxx/8xxx-series PATA/SATA-RAID + 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID + 1002 9xxx-series SATA-RAID + 1003 9550SX SATA-II RAID PCI-X + 1004 9650SE SATA-II RAID PCIe + 1005 9690SA SAS/SATA-II RAID PCIe +13c2 Technotrend Systemtechnik GmbH + 000e Technotrend/Hauppauge DVB card rev2.3 + 1019 TTechnoTrend-budget DVB S2-3200 +13c3 Janz Computer AG +13c4 Phase Metrics +13c5 Alphi Technology Corp +13c6 Condor Engineering Inc + 0520 CEI-520 A429 Card + 0620 CEI-620 A429 Card + 0820 CEI-820 A429 Card + 0830 CEI-830 A429 Card + 1004 P-SER Multi-channel PMC to RS-485/422/232 adapter +13c7 Blue Chip Technology Ltd + 0adc PCI-ADC + 0b10 PCI-PIO + 0d10 PCI-DIO + 524c PCI-RLY + 5744 PCI-WDT +13c8 Apptech Inc +13c9 Eaton Corporation +13ca Iomega Corporation +13cb Yano Electric Co Ltd +13cc Metheus Corporation +13cd Compatible Systems Corporation +13ce Cocom A/S +13cf Studio Audio & Video Ltd +13d0 Techsan Electronics Co Ltd + 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card + 2104 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card (rev 01) + 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card +13d1 Abocom Systems Inc + ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter + ab03 21x4x DEC-Tulip compatible 10/100 Ethernet + ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter + ab08 21x4x DEC-Tulip compatible 10/100 Ethernet +13d2 Shark Multimedia Inc +13d3 IMC Networks + 3211 DTV-DVB 704A + 3216 AzureWare AD-TU200 + 3219 DTV-DVB 7049A DVB-T USB Stick +13d4 Graphics Microsystems Inc +13d5 Media 100 Inc +13d6 K.I. Technology Co Ltd +13d7 Toshiba Engineering Corporation +13d8 Phobos corporation +13d9 Apex PC Solutions Inc +13da Intresource Systems pte Ltd +13db Janich & Klass Computertechnik GmbH +13dc Netboost Corporation +13dd Multimedia Bundle Inc +13de ABB Robotics Products AB +13df E-Tech Inc + 0001 PCI56RVP Modem + 13df 0001 PCI56RVP Modem +13e0 GVC Corporation +13e1 Silicom Multimedia Systems Inc +13e2 Dynamics Research Corporation +13e3 Nest Inc +13e4 Calculex Inc +13e5 Telesoft Design Ltd +13e6 Argosy research Inc +13e7 NAC Incorporated +13e8 Chip Express Corporation +13e9 Intraserver Technology Inc +13ea Dallas Semiconductor +13eb Hauppauge Computer Works Inc +13ec Zydacron Inc + 000a NPC-RC01 Remote control receiver +13ed Raytheion E-Systems +13ee Hayes Microcomputer Products Inc +13ef Coppercom Inc +13f0 Sundance Technology Inc / IC Plus Corp + 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY + 1043 8213 NX1001 + 0201 ST201 Sundance Ethernet + 1021 TC9020 Gigabit Ethernet + 1023 IP1000 Family Gigabit Ethernet + 1043 8180 NX1101 +13f1 Oce' - Technologies B.V. +13f2 Ford Microelectronics Inc +13f3 Mcdata Corporation +13f4 Troika Networks, Inc. + 1401 Zentai Fibre Channel Adapter +13f5 Kansai Electric Co. Ltd +13f6 C-Media Electronics Inc + 0011 CMI8738 + 0100 CM8338A + 13f6 ffff CMI8338/C3DX PCI Audio Device + 0101 CM8338B + 13f6 0101 CMI8338-031 PCI Audio Device + 0111 CM8738 + 1019 0970 P6STP-FL motherboard + 1043 8035 CUSI-FX motherboard + 1043 8077 CMI8738 6-channel audio controller + 1043 80e2 CMI8738 6ch-MX + 13f6 0111 CMI8738/C3DX PCI Audio Device + 13f6 9761 Theatron Agrippa + 153b 1144 Aureon 5.1 + 153b 1170 Aureon 7.1 + 1681 a000 Gamesurround MUSE XL + 270f 1103 CT-7NJS Ultra motherboard + 270f f462 7NJL1 motherboard + 584d 3731 Digital X-Mystique + 584d 3741 X-Plosion 7.1 + 584d 3751 X-Raider 7.1 + 584d 3761 X-Mystique 7.1 LP + 584d 3771 X-Mystique 7.1 LP Value + 7284 8384 Striker 7.1 + 0211 CM8738 + 8788 CMI8788 [Oxygen HD Audio] + 1043 8269 Virtuoso 200 (Xonar D2) + 1043 8275 Virtuoso 100 (Xonar DX) + 1043 82b7 Virtuoso 200 (Xonar D2X) + 1043 8314 Virtuoso 200 (Xonar HDAV1.3) + 1043 8327 Virtuoso 100 (Xonar DX) + 1043 834f Virtuoso 100 (Xonar D1) + 1043 835c Virtuoso 100 (Xonar Essence STX) + 1043 835d Virtuoso 100 (Xonar ST) + 1043 835e Virtuoso 200 (Xonar HDAV1.3 Slim) + 1043 838e Virtuoso 200 (Xonar DS) + 14c3 1710 HIFIER + 1a58 0910 Barracuda AC-1 + 415a 5431 X-Meridian 7.1 + 584d 3781 HDA X-Purity 7.1 Platinum + 7284 9761 CLARO + 7284 9781 CLARO halo + 9880 CM9880 +13f7 Wildfire Communications +13f8 Ad Lib Multimedia Inc +13f9 NTT Advanced Technology Corp. +13fa Pentland Systems Ltd +13fb Aydin Corp +13fc Computer Peripherals International +13fd Micro Science Inc +13fe Advantech Co. Ltd + 1240 PCI-1240 4-channel stepper motor controller card + 1600 PCI-16xx series PCI multiport serial board (function 0) +# This board has two PCI functions, appears as two PCI devices + 1601 0002 PCI-1601 2-port unisolated RS-422/485 +# This board has two PCI functions, appears as two PCI devices + 1602 0002 PCI-1602 2-port isolated RS-422/485 + 1612 0004 PCI-1612 4-port RS-232/422/485 + 1603 PCI-1603 2-port isolated RS-232/current loop + 1604 PCI-1604 2-port RS-232 + 16ff PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD) + 1601 0000 PCI-1601 2-port unisolated RS-422/485 PCI communications card + 1602 0000 PCI-1602 2-port isolated RS-422/485 + 1612 0000 PCI-1612 4-port RS-232/422/485 + 1711 PCI-1711 16-channel data acquisition card 12-bit, 100kS/s + 1733 PCI-1733 32-channel isolated digital input card + 1752 PCI-1752 + 1754 PCI-1754 + 1756 PCI-1756 +13ff Silicon Spice Inc +1400 Artx Inc + 1401 9432 TX +1401 CR-Systems A/S +1402 Meilhaus Electronic GmbH + 0630 ME-630 + 0940 ME-94 + 0950 ME-95 + 0960 ME-96 + 1000 ME-1000 + 100a ME-1000 + 100b ME-1000 + 1400 ME-1400 + 140a ME-1400A + 140b ME-1400B + 140c ME-1400C + 140d ME-1400D + 140e ME-1400E + 14ea ME-1400EA + 14eb ME-1400EB + 1604 ME-1600/4U + 1608 ME-1600/8U + 160c ME-1600/12U + 160f ME-1600/16U + 168f ME-1600/16U8I + 4610 ME-4610 + 4650 ME-4650 + 4660 ME-4660 + 4661 ME-4660I + 4662 ME-4660 + 4663 ME-4660I + 4670 ME-4670 + 4671 ME-4670I + 4672 ME-4670S + 4673 ME-4670IS + 4680 ME-4680 + 4681 ME-4680I + 4682 ME-4680S + 4683 ME-4680IS + 6004 ME-6000/4 + 6008 ME-6000/8 + 600f ME-6000/16 + 6014 ME-6000I/4 + 6018 ME-6000I/8 + 601f ME-6000I/16 + 6034 ME-6000ISLE/4 + 6038 ME-6000ISLE/8 + 603f ME-6000ISLE/16 + 6044 ME-6000/4/DIO + 6048 ME-6000/8/DIO + 604f ME-6000/16/DIO + 6054 ME-6000I/4/DIO + 6058 ME-6000I/8/DIO + 605f ME-6000I/16/DIO + 6074 ME-6000ISLE/4/DIO + 6078 ME-6000ISLE/8/DIO + 607f ME-6000ISLE/16/DIO + 6104 ME-6100/4 + 6108 ME-6100/8 + 610f ME-6100/16 + 6114 ME-6100I/4 + 6118 ME-6100I/8 + 611f ME-6100I/16 + 6134 ME-6100ISLE/4 + 6138 ME-6100ISLE/8 + 613f ME-6100ISLE/16 + 6144 ME-6100/4/DIO + 6148 ME-6100/8/DIO + 614f ME-6100/16/DIO + 6154 ME-6100I/4/DIO + 6158 ME-6100I/8/DIO + 615f ME-6100I/16/DIO + 6174 ME-6100ISLE/4/DIO + 6178 ME-6100ISLE/8/DIO + 617f ME-6100ISLE/16/DIO + 6259 ME-6200I/9/DIO + 6359 ME-6300I/9/DIO + 810a ME-8100A + 810b ME-8100B + 820a ME-8200A + 820b ME-8200B +1403 Ascor Inc +1404 Fundamental Software Inc +1405 Excalibur Systems Inc +1406 Oce' Printing Systems GmbH +1407 Lava Computer mfg Inc + 0100 Lava Dual Serial + 0101 Lava Quatro A + 0102 Lava Quatro B + 0110 Lava DSerial-PCI Port A + 0111 Lava DSerial-PCI Port B + 0120 Quattro-PCI A + 0121 Quattro-PCI B + 0180 Lava Octo A + 0181 Lava Octo B + 0200 Lava Port Plus + 0201 Lava Quad A + 0202 Lava Quad B + 0220 Lava Quattro PCI Ports A/B + 0221 Lava Quattro PCI Ports C/D + 0400 Lava 8255-PIO-PCI + 0500 Lava Single Serial + 0520 Lava RS422-SS-PCI + 0600 Lava Port 650 + 8000 Lava Parallel + 8001 Dual parallel port controller A + 8002 Lava Dual Parallel port A + 8003 Lava Dual Parallel port B + 8800 BOCA Research IOPPAR +1408 Aloka Co. Ltd +1409 Timedia Technology Co Ltd + 7168 PCI2S550 (Dual 16550 UART) + 1409 0002 SER4036A3V (2x RS232 port) + 1409 4027 SER4027A (1x RS232 port) + 1409 4037 SER4037A (2x RS232 port) +# Single DC-37 connector + 1409 4056 SER4056A (4x RS232) + 1409 5027 SER4027D + 1409 5037 SER4037D (2x RS232 port) +# Single DC-62 connector + 1409 5066 SER4066R (8x RS232) +# 4x 8p8c connectors + 1409 6056 SER4056D (4x RS232 port) + 7268 SUN1888 (Dual IEEE1284 parallel port) + 1409 0103 PAR4008A + 1409 0104 PAR4018A +140a DSP Research Inc +140b Ramix Inc +140c Elmic Systems Inc +140d Matsushita Electric Works Ltd +140e Goepel Electronic GmbH +140f Salient Systems Corp +1410 Midas lab Inc +1411 Ikos Systems Inc +# Nee IC Ensemble Inc. +1412 VIA Technologies Inc. + 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller + 1412 1712 Hoontech ST Audio DSP 24 + 1412 3632 M-Audio Delta Audiophile 192 + 1412 d630 M-Audio Delta 1010 + 1412 d631 M-Audio Delta DiO + 1412 d632 M-Audio Delta 66 + 1412 d633 M-Audio Delta 44 + 1412 d634 M-Audio Delta Audiophile 2496 + 1412 d635 M-Audio Delta TDIF + 1412 d637 M-Audio Delta RBUS + 1412 d638 M-Audio Delta 410 + 1412 d63b M-Audio Delta 1010LT + 1412 d63c Digigram VX442 + 1416 1712 Hoontech ST Audio DSP 24 Media 7.1 + 153b 1115 EWS88 MT + 153b 1125 EWS88 MT (Master) + 153b 112b EWS88 D + 153b 112c EWS88 D (Master) + 153b 1130 EWX 24/96 + 153b 1138 DMX 6fire 24/96 + 153b 1151 PHASE88 + 16ce 1040 Edirol DA-2496 + 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller + 1412 1724 Albatron PX865PE 7.1 + 1412 3630 M-Audio Revolution 7.1 + 1412 3631 M-Audio Revolution 5.1 + 153b 1145 Aureon 7.1 Space + 153b 1147 Aureon 5.1 Sky + 153b 1150 PHASE 22 + 153b 1153 Aureon 7.1 Universe + 17ab 1906 PSC 724 [Ultimate Edge] + 270f f641 ZNF3-150 + 270f f645 ZNF3-250 + 3130 4154 MAYA 44 MKII +1413 Addonics +1414 Microsoft Corporation + 0001 MN-120 (ADMtek Centaur-C based) + 0002 MN-130 (ADMtek Centaur-P based) + 5801 XMA Decoder (Xenon) + 5802 SATA Controller - CdRom (Xenon) + 5803 SATA Controller - Disk (Xenon) + 5804 OHCI Controller 0 (Xenon) + 5805 EHCI Controller 0 (Xenon) + 5806 OHCI Controller 1 (Xenon) + 5807 EHCI Controller 1 (Xenon) + 580a Fast Ethernet Adapter (Xenon) + 580b Secure Flash Controller (Xenon) + 580d System Management Controller (Xenon) + 5811 Xenos GPU (Xenon) +1415 Oxford Semiconductor Ltd + 8401 OX9162 Mode 1 (8-bit bus) + 8403 OX9162 Mode 0 (parallel port) + 9500 OX16PCI954 (Quad 16950 UART) function 0 (Disabled) + 9501 OX16PCI954 (Quad 16950 UART) function 0 (Uart) + 12c4 0201 Titan/cPCI (2 port) + 12c4 0202 Titan/cPCI (4 port) + 12c4 0203 Titan/cPCI (8 port) + 12c4 0210 Titan/104-Plus (8 port, p1-4) + 131f 2050 CyberPro (4-port) +# Model IO1085, Part No: JJ-P46012 + 131f 2051 CyberSerial 4S Plus + 15ed 2000 MCCR Serial p0-3 of 8 + 15ed 2001 MCCR Serial p0-3 of 16 + 9505 16950 Compatible (dual) serial controller + 950a EXSYS EX-41092 Dual 16950 Serial adapter + 950b OXCB950 Cardbus 16950 UART + 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled) + 12c4 0200 Titan/cPCI (Unused) + 9511 OX16PCI954 (Quad 16950 UART) function 1 (8bit bus) + 12c4 0211 Titan/104-Plus (8 port, p5-8) + 15ed 2000 MCCR Serial p4-7 of 8 + 15ed 2001 MCCR Serial p4-15 of 16 + 9512 OX16PCI954 (Quad 16950 UART) function 1 (32bit bus) + 9513 OX16PCI954 (Quad 16950 UART) function 1 (parallel port) + 9521 OX16PCI952 (Dual 16950 UART) + 9523 OX16PCI952 Integrated Parallel Port +1416 Multiwave Innovation pte Ltd +1417 Convergenet Technologies Inc +1418 Kyushu electronics systems Inc +1419 Excel Switching Corp +141a Apache Micro Peripherals Inc +141b Zoom Telephonics Inc +141d Digitan Systems Inc +141e Fanuc Ltd +141f Visiontech Ltd +1420 Psion Dacom plc + 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part) + 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part) +1421 Ads Technologies Inc +1422 Ygrec Systems Co Ltd +1423 Custom Technology Corp. +1424 Videoserver Connections +1425 Chelsio Communications Inc + 000b T210 Protocol Engine + 000c T204 Protocol Engine + 0022 10GbE Ethernet Adapter + 0030 T310 10GbE Single Port Adapter + 103c 705e PCIe 10GBase-SR [AD386A] + 0031 T320 10GbE Dual Port Adapter + 0032 T302 1GbE Dual Port Adapter + 0033 T304 1GbE Quad Port Adapter +1426 Storage Technology Corp. +1427 Better On-Line Solutions +1428 Edec Co Ltd +1429 Unex Technology Corp. +142a Kingmax Technology Inc +142b Radiolan +142c Minton Optic Industry Co Ltd +142d Pix stream Inc +142e Vitec Multimedia + 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder + 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder +142f Radicom Research Inc +1430 ITT Aerospace/Communications Division +1431 Gilat Satellite Networks +1432 Edimax Computer Co. + 9130 RTL81xx Fast Ethernet +1433 Eltec Elektronik GmbH +# Nee Real Time Devices US Inc. +1435 RTD Embedded Technologies, Inc. + 4520 PCI4520 + 6020 SPM6020 + 6030 SPM6030 + 6420 SPM186420 + 6430 SPM176430 + 6431 SPM176431 + 7520 DM7520 + 7540 SDM7540 + 7820 DM7820 +1436 CIS Technology Inc +1437 Nissin Inc Co +1438 Atmel-dream +1439 Outsource Engineering & Mfg. Inc +143a Stargate Solutions Inc +143b Canon Research Center, America +143c Amlogic Inc +143d Tamarack Microelectronics Inc +143e Jones Futurex Inc +143f Lightwell Co Ltd - Zax Division +1440 ALGOL Corp. +1441 AGIE Ltd +1442 Phoenix Contact GmbH & Co. +1443 Unibrain S.A. +1444 TRW +1445 Logical DO Ltd +1446 Graphin Co Ltd +1447 AIM GmBH +1448 Alesis Studio Electronics +1449 TUT Systems Inc +144a Adlink Technology + 6208 PCI-6208V + 7250 PCI-7250 + 7296 PCI-7296 + 7432 PCI-7432 + 7433 PCI-7433 + 7434 PCI-7434 + 7841 PCI-7841 + 8133 PCI-8133 + 8164 PCI-8164 + 8554 PCI-8554 + 9111 PCI-9111 + 9113 PCI-9113 + 9114 PCI-9114 +# nee Loronix Information Systems Inc. +144b Verint Systems Inc. +144c Catalina Research Inc +144d Samsung Electronics Co Ltd + c00c P35 laptop + c511 R20 Laptop +144e OLITEC +144f Askey Computer Corp. +1450 Octave Communications Ind. +1451 SP3D Chip Design GmBH +1453 MYCOM Inc +1454 Altiga Networks +1455 Logic Plus Plus Inc +1456 Advanced Hardware Architectures +1457 Nuera Communications Inc +1458 Giga-byte Technology + 9001 GC-PTV-TAF Hybrid TV card + e911 GN-WIAG02 +1459 DOOIN Electronics +145a Escalate Networks Inc +145b PRAIM SRL +145c Cryptek +145d Gallant Computer Inc +145e Aashima Technology B.V. +145f Baldor Electric Company + 0001 NextMove PCI +1460 DYNARC INC +1461 Avermedia Technologies Inc + a3ce M179 + a3cf M179 + a836 M115 DVB-T, PAL/SECAM/NTSC Tuner + e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner + f436 AVerTV Hybrid+FM +1462 Micro-Star International Co., Ltd. + 5501 nVidia NV15DDR [GeForce2 Ti] + 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G] + 6825 PCI Card wireless 11g [PC54G] + 6834 RaLink RT2500 802.11g [PC54G2] + 7125 MS-7125 [K8N Neo4 Platinum] + 7235 P965 Neo MS-7235 mainboard + 7242 K9AGM RS485 Motherboard + 7250 MS-7250 Motherboard [K9N Platinum SLI/non-SLI] + 7327 K9AGM2-FIH Motherboard + 7650 Hetis 865GV-E (MS-7065) + 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter + 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter + 9110 GeFORCE FX5200 + 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter + 9123 NVIDIA NV31 [GeForce FX 5600] FX5600-VTDR128 [MS-8912] + 9510 Radeon 9600XT + 9511 Radeon 9600XT + 9591 nVidia Corporation NV36 [GeForce FX 5700LE] + b834 Wireless 11g Turbo G PCI card [MSI PC60G] +1463 Fast Corporation +1464 Interactive Circuits & Systems Ltd +1465 GN NETTEST Telecom DIV. +1466 Designpro Inc. +1467 DIGICOM SPA +1468 AMBIT Microsystem Corp. +1469 Cleveland Motion Controls +146a IFR +146b Parascan Technologies Ltd +146c Ruby Tech Corp. + 1430 FE-1430TX Fast Ethernet PCI Adapter +146d Tachyon, INC. +146e Williams Electronics Games, Inc. +146f Multi Dimensional Consulting Inc +1470 Bay Networks +1471 Integrated Telecom Express Inc +1472 DAIKIN Industries, Ltd +1473 ZAPEX Technologies Inc +1474 Doug Carson & Associates +1475 PICAZO Communications +1476 MORTARA Instrument Inc +1477 Net Insight +1478 DIATREND Corporation +1479 TORAY Industries Inc +147a FORMOSA Industrial Computing +147b ABIT Computer Corp. + 1084 IP35 [Dark Raider] +147c AWARE, Inc. +147d Interworks Computer Products +147e Matsushita Graphic Communication Systems, Inc. +147f NIHON UNISYS, Ltd. +1480 SCII Telecom +1481 BIOPAC Systems Inc +1482 ISYTEC - Integrierte Systemtechnik GmBH + 0001 PCI-16 Host Interface for ITC-16 +1483 LABWAY Corporation +1484 Logic Corporation +1485 ERMA - Electronic GmBH +1486 L3 Communications Telemetry & Instrumentation +1487 MARQUETTE Medical Systems +1488 KONTRON Electronik GmBH +1489 KYE Systems Corporation +148a OPTO +148b INNOMEDIALOGIC Inc. +148c C.P. Technology Co. Ltd +148d DIGICOM Systems, Inc. + 1003 HCF 56k Data/Fax Modem +148e OSI Plus Corporation +148f Plant Equipment, Inc. +1490 Stone Microsystems PTY Ltd. +1491 ZEAL Corporation +1492 Time Logic Corporation +1493 MAKER Communications +1494 WINTOP Technology, Inc. +1495 TOKAI Communications Industry Co. Ltd +1496 JOYTECH Computer Co., Ltd. +1497 SMA Regelsysteme GmBH + 1497 SMA Technologie AG +1498 TEWS Technologies GmbH + 0330 TPMC816 2 Channel CAN bus controller. + 035d TPMC861 4-Channel Isolated Serial Interface RS422/RS485 + 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller + 21cc TCP460 CompactPCI 16 Channel Serial Interface RS232/RS422 + 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422 + 30c8 TPCI200 +1499 EMTEC CO., Ltd +149a ANDOR Technology Ltd +149b SEIKO Instruments Inc +149c OVISLINK Corp. +149d NEWTEK Inc + 0001 Video Toaster for PC +149e Mapletree Networks Inc. +149f LECTRON Co Ltd +14a0 SOFTING GmBH +14a1 Systembase Co Ltd +14a2 Millennium Engineering Inc +14a3 Maverick Networks +14a4 GVC/BCM Advanced Research +14a5 XIONICS Document Technologies Inc +14a6 INOVA Computers GmBH & Co KG +14a7 MYTHOS Systems Inc +14a8 FEATRON Technologies Corporation +14a9 HIVERTEC Inc +14aa Advanced MOS Technology Inc +14ab Mentor Graphics Corp. +14ac Novaweb Technologies Inc +14ad Time Space Radio AB +14ae CTI, Inc +14af Guillemot Corporation + 7102 3D Prophet II MX +14b0 BST Communication Technology Ltd +14b1 Nextcom K.K. +14b2 ENNOVATE Networks Inc +14b3 XPEED Inc + 0000 DSL NIC +14b4 PHILIPS Business Electronics B.V. +14b5 Creamware GmBH + 0200 Scope + 0300 Pulsar + 0400 PulsarSRB + 0600 Pulsar2 + 0800 DSP-Board + 0900 DSP-Board + 0a00 DSP-Board + 0b00 DSP-Board +14b6 Quantum Data Corp. +14b7 PROXIM Inc + 0001 Symphony 4110 +14b8 Techsoft Technology Co Ltd +14b9 AIRONET Wireless Communications + 0001 PC4800 + 0340 PC4800 + 0350 PC4800 + 4500 PC4500 + 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800 + a504 Cisco Aironet Wireless 802.11b + a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter + a506 Cisco Aironet Mini PCI b/g +14ba INTERNIX Inc. +# ARCNET interface card based on SMSC COM20022 chip and manufactured for SMSC Japan + 0600 ARC-PCI/22 +14bb SEMTECH Corporation +14bc Globespan Semiconductor Inc. + d002 Pulsar [PCI ADSL Card] + d00f Pulsar [PCI ADSL Card] +14bd CARDIO Control N.V. +14be L3 Communications +14bf SPIDER Communications Inc. +14c0 COMPAL Electronics Inc +14c1 MYRICOM Inc. + 0008 Myri-10G Dual-Protocol NIC + 14c1 0008 10G-PCIE-8A + 14c1 0009 10G-PCIE-8A (MSI-X firmware) + 14c1 000a 10G-PCIE-8B + 14c1 000b 10G-PCIE-8B2 + 14c1 000c 10G-PCIE2-8B2 + 8043 Myrinet 2000 Scalable Cluster Interconnect + 103c 1240 Myrinet M2L-PCI64/2-3.0 LANai 7.4 (HP OEM) +14c2 DTK Computer +14c3 MEDIATEK Corp. +14c4 IWASAKI Information Systems Co Ltd +14c5 Automation Products AB +14c6 Data Race Inc +14c7 Modular Technology Holdings Ltd +14c8 Turbocomm Tech. Inc. +14c9 ODIN Telesystems Inc +14ca PE Logic Corp. +14cb Billionton Systems Inc +14cc NAKAYO Telecommunications Inc +14cd Universal Scientific Ind. +14ce Whistle Communications +14cf TEK Microsystems Inc. +14d0 Ericsson Axe R & D +14d1 Computer Hi-Tech Co Ltd +14d2 Titan Electronics Inc + 8001 VScom 010L 1 port parallel adaptor + 8002 VScom 020L 2 port parallel adaptor + 8010 VScom 100L 1 port serial adaptor + 8011 VScom 110L 1 port serial and 1 port parallel adaptor + 8020 VScom 200L 1 port serial adaptor + 8021 VScom 210L 2 port serial and 1 port parallel adaptor + 8028 VScom 200I/200I-SI 2-port serial adapter + 8040 VScom 400L 4 port serial adaptor + 8043 VScom 430L 4-port serial and 3-port parallel adapter + 8048 VScom 400I 4-port serial adapter + 8080 VScom 800L 8 port serial adaptor + 8088 VScom 800I 8-port serial adapter + a000 VScom 010H 1 port parallel adaptor + a001 VScom 100H 1 port serial adaptor + a003 VScom 400H 4 port serial adaptor + a004 VScom 400HF1 4 port serial adaptor + a005 VScom 200H 2 port serial adaptor + a007 VScom PCI800EH (PCIe) 8-port serial adapter Port 1-4 + a008 VScom PCI800EH (PCIe) 8-port serial adapter Port 5-8 + a009 VScom PCI400EH (PCIe) 4-port serial adapter + e001 VScom 010HV2 1 port parallel adaptor + e010 VScom 100HV2 1 port serial adaptor + e020 VScom 200HV2 2 port serial adaptor +14d3 CIRTECH (UK) Ltd +14d4 Panacom Technology Corp +14d5 Nitsuko Corporation +14d6 Accusys Inc + 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA + 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller +14d7 Hirakawa Hewtech Corp +14d8 HOPF Elektronik GmBH +# Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc. +14d9 Alliance Semiconductor Corporation + 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon] + 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge +14da National Aerospace Laboratories +14db AFAVLAB Technology Inc + 2120 TK9902 + 2182 AFAVLAB Technology Inc. 8-port serial card +14dc Amplicon Liveline Ltd + 0000 PCI230 + 0001 PCI242 + 0002 PCI244 + 0003 PCI247 + 0004 PCI248 + 0005 PCI249 + 0006 PCI260 + 0007 PCI224 + 0008 PCI234 + 0009 PCI236 + 000a PCI272 + 000b PCI215 +14dd Boulder Design Labs Inc +14de Applied Integration Corporation +14df ASIC Communications Corp +14e1 INVERTEX +14e2 INFOLIBRIA +14e3 AMTELCO +14e4 Broadcom Corporation + 0800 Sentry5 Chipcommon I/O Controller + 0804 Sentry5 PCI Bridge + 0805 Sentry5 MIPS32 CPU + 0806 Sentry5 Ethernet Controller + 080b Sentry5 Crypto Accelerator + 080f Sentry5 DDR/SDR RAM Controller + 0811 Sentry5 External Interface Core + 0816 BCM3302 Sentry5 MIPS32 CPU + 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express + 1028 01c2 Latitude D620 + 103c 3015 PCIe LAN on Motherboard + 107b 5048 E4500 Onboard + 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express + 1612 BCM70012 Video Decoder [Crystal HD] + 1639 NetXtreme II BCM5709 Gigabit Ethernet + 1028 0235 PowerEdge R710 BCM5709 Gigabit Ethernet + 1028 0236 PowerEdge R610 BCM5709 Gigabit Ethernet + 1028 0237 PowerEdge T610 BCM5709 Gigabit Ethernet + 103c 7055 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter + 103c 7059 NC382T PCI Express Dual Port Multifunction Gigabit Server Adapter + 10a9 8027 Quad port Gigabit Ethernet Controller + 163a NetXtreme II BCM5709S Gigabit Ethernet + 1028 027b PowerEdge M805 Broadcom NetXtreme II BCM5709S + 1028 029c PowerEdge M710 BCM5709S Gigabit Ethernet + 103c 171d NC382m Dual Port 1GbE Multifunction BL-c Adapter + 103c 7056 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter + 163b NetXtreme II BCM5716 Gigabit Ethernet + 1028 028c PowerEdge R410 BCM5716 Gigabit Ethernet + 1028 028d PowerEdge T410 BCM5716 Gigabit Ethernet + 163c NetXtreme II BCM5716S Gigabit Ethernet + 1644 NetXtreme BCM5700 Gigabit Ethernet + 1014 0277 Broadcom Vigil B5700 1000Base-T + 1028 00d1 Broadcom BCM5700 + 1028 0106 Broadcom BCM5700 + 1028 0109 Broadcom BCM5700 1000Base-T + 1028 010a Broadcom BCM5700 1000BaseTX + 10b7 1000 3C996-T 1000Base-T + 10b7 1001 3C996B-T 1000Base-T + 10b7 1002 3C996C-T 1000Base-T + 10b7 1003 3C997-T 1000Base-T Dual Port + 10b7 1004 3C996-SX 1000Base-SX + 10b7 1005 3C997-SX 1000Base-SX Dual Port + 10b7 1008 3C942 Gigabit LOM (31X31) + 14e4 0002 NetXtreme 1000Base-SX + 14e4 0003 NetXtreme 1000Base-SX + 14e4 0004 NetXtreme 1000Base-T + 14e4 1028 NetXtreme 1000BaseTX + 14e4 1644 BCM5700 1000Base-T + 1645 NetXtreme BCM5701 Gigabit Ethernet + 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) + 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL) + 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL) + 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) + 1028 0121 Broadcom BCM5701 1000Base-T + 103c 128a BCM5701 1000Base-T (HP, OEM 3COM) + 103c 128b 1000Base-SX (PCI) [A7073A] + 103c 12a4 Core Lan 1000Base-T + 103c 12c1 IOX Core Lan 1000Base-T [A7109AX] + 103c 1300 Core LAN/SCSI Combo [A6794A] + 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper) + 10a9 8011 Gigabit Ethernet (Copper) + 10a9 8012 Gigabit Ethernet (Fiber) + 10b7 1004 3C996-SX 1000Base-SX + 10b7 1006 3C996B-T 1000Base-T + 10b7 1007 3C1000-T 1000Base-T + 10b7 1008 3C940-BR01 1000Base-T + 14e4 0001 BCM5701 1000Base-T + 14e4 0005 BCM5701 1000Base-T + 14e4 0006 BCM5701 1000Base-T + 14e4 0007 BCM5701 1000Base-SX + 14e4 0008 BCM5701 1000Base-T + 14e4 1645 NetXtreme BCM5701 Gigabit Ethernet + 14e4 8008 BCM5701 1000Base-T + 1646 NetXtreme BCM5702 Gigabit Ethernet + 0e11 00bb NC7760 1000BaseTX + 1028 0126 Broadcom BCM5702 1000BaseTX + 14e4 8009 BCM5702 1000BaseTX + 1647 NetXtreme BCM5703 Gigabit Ethernet + 0e11 0099 NC7780 1000BaseTX + 0e11 009a NC7770 1000BaseTX + 10a9 8010 SGI IO9 Gigabit Ethernet (Copper) + 14e4 0009 BCM5703 1000BaseTX + 14e4 000a BCM5703 1000BaseSX + 14e4 000b BCM5703 1000BaseTX + 14e4 8009 BCM5703 1000BaseTX + 14e4 800a BCM5703 1000BaseTX + 1648 NetXtreme BCM5704 Gigabit Ethernet + 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 1028 014a PowerEdge 1750 + 1028 0170 PowerEdge 6850 Broadcom NetXtreme BCM5704 + 103c 310f NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 10a9 8013 Dual Port Gigabit Ethernet (PCI-X,Copper) + 10a9 8018 Dual Port Gigabit Ethernet (A330) + 10a9 801a Dual Port Gigabit Ethernet (IA-blade) + 10a9 801b Quad Port Gigabit Ethernet (PCI-E,Copper) + 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X + 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X + 1166 1648 NetXtreme CIOB-E 1000Base-T + 1734 100b PRIMERGY RX/TX series onboard LAN + 1649 NetXtreme BCM5704S_2 Gigabit Ethernet + 164a NetXtreme II BCM5706 Gigabit Ethernet + 103c 1709 NC371i Integrated PCI-X Multifunction Gigabit Server Adapter + 103c 3070 NC380T PCI Express Dual Port Multifunction Gigabit Server Adapter + 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter + 103c 3106 NC370i Multifunction Gigabit Server Adapter + 164c NetXtreme II BCM5708 Gigabit Ethernet + 1028 01f0 PowerEdge R900 Broadcom NetXtreme II BCM5708 + 1028 0205 PowerEdge 2970 Broadcom NetXtreme II BCM5708 + 1028 020b PowerEdge T605 Broadcom NetXtreme II BCM5708 + 1028 0221 PowerEdge R805 Broadcom NetXtreme II BCM5708 + 1028 0223 PowerEdge R905 Broadcom NetXtreme II BCM5708 + 1028 1f12 PowerEdge R805/R905 Broadcom NetXtreme II BCM5708 + 103c 7037 NC373T PCI Express Multifunction Gigabit Server Adapter + 103c 7038 NC373i Integrated Multifunction Gigabit Server Adapter + 103c 7045 NC374m PCI Express Dual Port Multifunction Gigabit Server Adapter + 164d NetXtreme BCM5702FE Gigabit Ethernet + 164e NetXtreme II BCM57710 10-Gigabit PCIe [Everest] + 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter + 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter + 164f NetXtreme II BCM57711 10-Gigabit PCIe + 1650 NetXtreme II BCM57711E 10-Gigabit PCIe + 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter + 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter + 1653 NetXtreme BCM5705 Gigabit Ethernet + 0e11 00e3 NC7761 Gigabit Server Adapter + 1654 NetXtreme BCM5705_2 Gigabit Ethernet + 0e11 00e3 NC7761 Gigabit Server Adapter + 103c 3100 NC1020 ProLiant Gigabit Server Adapter 32 PCI + 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter + 1658 NetXtreme BCM5720 Gigabit Ethernet + 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express + 1014 02c6 eServer xSeries server mainboard + 1028 01e6 PowerEdge 860 + 1028 023c PowerEdge R200 Broadcom NetXtreme BCM5721 + 103c 170b NC320m PCI Express Dual Port Gigabit Server Adapter + 103c 7031 NC320T PCIe Gigabit Server Adapter + 103c 7032 NC320i PCIe Gigabit Server Adapter + 1734 1061 PRIMERGY RX/TX S2 series onboard LAN + 165a NetXtreme BCM5722 Gigabit Ethernet PCI Express +# Dual NIC server + 1014 0378 IBM System x3350 (Machine type 4192) + 1028 020f PowerEdge R300 Broadcom NetXtreme 5722 + 1028 0210 PowerEdge T300 Broadcom NetXtreme 5722 + 1028 0225 PowerEdge T105 Broadcom NetXtreme 5722 + 103c 7051 NC105i PCIe Gigabit Server Adapter + 103c 7052 NC105T PCIe Gigabit Server Adapter + 165b NetXtreme BCM5723 Gigabit Ethernet PCIe + 103c 705d NC107i Integrated PCI Express Gigabit Server Adapter + 165d NetXtreme BCM5705M Gigabit Ethernet + 1028 865d Latitude D400 + 14e4 165d Dell Latitude D600 + 165e NetXtreme BCM5705M_2 Gigabit Ethernet + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 099c NX6110/NC6120 + 10cf 1279 LifeBook E8010D + 1668 NetXtreme BCM5714 Gigabit Ethernet + 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter + 1669 NetXtreme 5714S Gigabit Ethernet + 166a NetXtreme BCM5780 Gigabit Ethernet + 103c 7035 NC325i Integrated Dual port PCIe Express Gigabit Server Adapter + 166b NetXtreme BCM5780S Gigabit Ethernet + 166e 570x 10/100 Integrated Controller + 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express + 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express + 1674 NetXtreme BCM5756ME Gigabit Ethernet PCI Express + 1676 NetXtreme BCM5750 Gigabit Ethernet + 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express + 1028 0176 Dimension XPS Gen 4 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1028 0182 Latitude D610 + 1028 0187 Precision M70 + 1028 01a8 Precision 380 + 1028 01ad OptiPlex GX620 + 103c 3006 DC7100 SFF(DX878AV) + 1462 028c 915P/G Neo2 + 1734 105d Scenic W620 + 1678 NetXtreme BCM5715 Gigabit Ethernet + 103c 703e NC326i PCIe Dual Port Gigabit Server Adapter + 1679 NetXtreme BCM5715S Gigabit Ethernet + 103c 1707 NC326m PCIe Dual Port Adapter + 103c 170c NC325m PCIe Quad Port Adapter + 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter + 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express + 1028 01da OptiPlex 745 + 1028 01de Precision 390 + 1028 01df PowerEdge SC440 + 1028 0214 Precision T3400 + 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express + 103c 280a DC5750 Microtower + 167c NetXtreme BCM5750M Gigabit Ethernet + 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express + 1014 0577 ThinkPad Z60t + 103c 0940 HP Compaq nw8240 Mobile Workstation + 17aa 2081 ThinkPad R60e + 167e NetXtreme BCM5751F Fast Ethernet PCI Express + 167f NetLink BCM5787F Fast Ethernet PCI Express + 1680 NetXtreme BCM5761e Gigabit Ethernet PCIe + 1681 NetXtreme BCM5761 Gigabit Ethernet PCIe + 1684 NetXtreme BCM5764M Gigabit Ethernet PCIe + 1690 NetXtreme BCM57760 Gigabit Ethernet PCIe + 1691 NetLink BCM57788 Gigabit Ethernet PCIe + 1692 NetLink BCM57780 Gigabit Ethernet PCIe + 1693 NetLink BCM5787M Gigabit Ethernet PCI Express + 1025 0121 Aspire 5920G + 103c 30c0 6710b + 1694 NetLink BCM57790 Gigabit Ethernet PCIe + 1696 NetXtreme BCM5782 Gigabit Ethernet + 103c 12bc d530 CMT (DG746A) + 14e4 000d NetXtreme BCM5782 1000Base-T + 1698 NetLink BCM5784M Gigabit Ethernet PCIe + 1699 NetLink BCM5785 Gigabit Ethernet + 169a NetLink BCM5786 Gigabit Ethernet PCI Express + 169b NetLink BCM5787 Gigabit Ethernet PCI Express + 169c NetXtreme BCM5788 Gigabit Ethernet + 103c 308b MX6125 + 103c 30a1 NC2400 + 144d c018 X20 + 1462 590c KT6 Delta-FIS2R (MS-6590) + 169d NetLink BCM5789 Gigabit Ethernet PCI Express + 16a0 NetLink BCM5785 Fast Ethernet + 16a6 NetXtreme BCM5702X Gigabit Ethernet + 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 1028 0126 BCM5702 1000Base-T + 14e4 000c BCM5702 1000Base-T + 14e4 8009 BCM5702 1000Base-T + 16a7 NetXtreme BCM5703X Gigabit Ethernet + 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 14e4 0009 NetXtreme BCM5703 1000Base-T + 14e4 000a NetXtreme BCM5703 1000Base-SX + 14e4 000b NetXtreme BCM5703 1000Base-T + 14e4 800a NetXtreme BCM5703 1000Base-T + 16a8 NetXtreme BCM5704S Gigabit Ethernet + 103c 132b PCI-X 1000Mbps Dual-port Built-in + 10a9 8014 Dual Port Gigabit Ethernet (PCI-X,Fiber) + 10a9 801c Quad Port Gigabit Ethernet (PCI-E,Fiber) + 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X + 16aa NetXtreme II BCM5706S Gigabit Ethernet + 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter + 103c 310c NC370i Multifunction Gigabit Server Adapter + 16ac NetXtreme II BCM5708S Gigabit Ethernet + 1014 0304 NetXtreme II BCM5708S Gigabit Ethernet + 1028 01bb PowerEdge 1955 Broadcom NetXtreme II BCM5708S + 1028 020c PowerEdge M605 Broadcom NetXtreme II BCM5708S + 103c 1706 NC373m Multifunction Gigabit Server Adapter + 103c 7038 NC373i PCI Express Multifunction Gigabit Server Adapter + 103c 703b NC373i Integrated Multifunction Gigabit Server Adapter + 103c 703d NC373F PCI Express Multifunction Gigabit Server Adapter + 16c6 NetXtreme BCM5702A3 Gigabit Ethernet + 10b7 1100 3C1000B-T 10/100/1000 PCI + 14e4 000c BCM5702 1000Base-T + 14e4 8009 BCM5702 1000Base-T + 16c7 NetXtreme BCM5703 Gigabit Ethernet + 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 103c 12c3 Combo FC/GigE-SX [A9782A] + 103c 12ca Combo FC/GigE-T [A9784A] + 103c 1321 Core I/O LAN/SCSI Combo [AB314A] + 14e4 0009 NetXtreme BCM5703 1000Base-T + 14e4 000a NetXtreme BCM5703 1000Base-SX + 16dd NetLink BCM5781 Gigabit Ethernet PCI Express + 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express + 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 16fe NetXtreme BCM5753F Fast Ethernet PCI Express + 170c BCM4401-B0 100Base-TX + 1028 0188 Inspiron 6000 laptop + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 1028 01af Inspiron 6400 + 1028 01cd Inspiron 9400 Laptop + 1028 01d7 XPS M1210 + 1028 01d8 Inspiron E1405 + 103c 099c NX6110/NC6120 + 103c 30a2 NX7300 laptop + 14e4 170c HP Compaq 6720t Mobile Thin Client + 170d NetXtreme BCM5901 100Base-TX + 1014 0545 ThinkPad R40e + 170e NetXtreme BCM5901 100Base-TX + 1712 NetLink BCM5906 Fast Ethernet PCI Express + 1713 NetLink BCM5906M Fast Ethernet PCI Express + 1028 01f3 Inspiron 1420 + 1028 0209 XPS M1330 + 103c 30c0 Compaq 6710b + 17aa 3a23 IdeaPad S10e + 3352 BCM3352 + 3360 BCM3360 + 4210 BCM4210 iLine10 HomePNA 2.0 + 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem + 4212 BCM4212 v.90 56k modem + 4220 802-11b/g Wireless PCI controller, packaged as a Linksys WPC54G ver 1.2 PCMCIA card + 4222 NetXtreme BCM5753M Gigabit Ethernet PCI Express + 4301 BCM4303 802.11b Wireless LAN Controller + 1028 0407 TrueMobile 1180 Onboard WLAN + 1043 0120 WL-103b Wireless LAN PC Card + 4305 BCM4307 V.90 56k Modem + 4306 BCM4307 Ethernet Controller + 4307 BCM4307 802.11b Wireless LAN Controller + 4310 BCM4310 Chipcommon I/OController + 4311 BCM4311 802.11b/g WLAN + 1028 0007 Wireless 1390 WLAN Mini-Card + 1028 0008 Wireless 1390 WLAN ExpressCard + 103c 1363 BCM4311 802.11b/g Wireless LAN Controller + 103c 1364 BCM4311 802.11b/g Wireless LAN Controller + 103c 1365 BCM4311 802.11b/g Wireless LAN Controller + 103c 1374 BCM4311 802.11b/g Wireless LAN Controller + 103c 1375 BCM4311 802.11b/g Wireless LAN Controller + 103c 1376 BCM4311 802.11b/g Wireless LAN Controller + 103c 1377 BCM4311 802.11b/g Wireless LAN Controller + 103c 137f BCM4322 802.11a/b/g/n Wireless LAN Controller + 103c 1380 BCM4322 802.11a/b/g/n Wireless LAN Controller + 14e4 4311 BCM94311MCG + 4312 BCM4312 802.11a/b/g + 1028 0007 Wireless 1490 Dual Band WLAN Mini-Card + 1028 0008 Wireless 1490 Dual Band WLAN ExpressCard + 103c 135a Broadcom 802.11a/b/g WLAN + 103c 135f Broadcom 802.11a/b/g WLAN + 103c 1360 Broadcom 802.11a/b/g WLAN + 103c 1361 Broadcom 802.11a/b/g WLAN + 103c 1362 Broadcom 802.11a/b/g WLAN + 103c 1370 Broadcom 802.11a/b/g WLAN + 103c 1371 Broadcom 802.11a/b/g WLAN + 103c 1372 Broadcom 802.11a/b/g WLAN + 103c 1373 Broadcom 802.11a/b/g WLAN + 103c 30b5 Presario V3242AU + 1371 103c Broadcom 802.11 Multiband-netwerkadapter(6715s) + 4313 BCM4310 Ethernet Controller + 4315 BCM4312 802.11b/g + 1028 000b Wireless 1395 WLAN Mini-Card + 1028 000c Wireless 1397 WLAN Mini-Card + 103c 137c BCM4312 802.11b/g Wireless LAN Controller + 103c 137d BCM4312 802.11b/g Wireless LAN Controller + 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller + 1028 0005 Wireless 1370 WLAN Mini-PCI Card + 1028 0006 Wireless 1370 WLAN PC Card + 103c 1355 Broadcom 802.11b/g WLAN + 103c 1356 Broadcom 802.11b/g WLAN + 103c 1357 Broadcom 802.11b/g WLAN + 1043 100f WL-138G V2 802.11g WLAN PCI Card + 1043 120f A6U notebook embedded card + 1154 0355 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Adapter + 1468 0311 Aspire 3022WLMi, 5024WLMi, 5020 + 1468 0312 TravelMate 2410 + 14e4 0449 Gateway 7510GX + 14e4 4318 WPC54G version 3 [Wireless-G Notebook Adapter] 802.11g Wireless Lan Controller + 16ec 0119 U.S.Robotics Wireless MAXg PC Card + 1737 0042 WMP54GS version 1.1 [Wireless-G PCI Adapter] 802.11g w/SpeedBooster + 1737 0048 WPC54G-EU version 3 [Wireless-G Notebook Adapter] + 4319 BCM4311 [AirForce 54g] 802.11a/b/g PCI Express Transceiver + 1028 0005 Wireless 1470 Dual Band WLAN Mini-PCI Card + 1028 0006 Wireless 1470 Dual Band WLAN PC Card + 103c 1358 Broadcom 802.11a/b/g WLAN + 103c 1359 Broadcom 802.11a/b/g WLAN + 103c 135a Broadcom 802.11a/b/g WLAN + 4320 BCM4306 802.11b/g Wireless LAN Controller + 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card + 1028 0002 TrueMobile 1300 WLAN PC Card + 1028 0003 Wireless 1350 WLAN Mini-PCI Card + 1028 0004 Wireless 1350 WLAN PC Card + 103c 12f4 Broadcom 802.11b/g WLAN + 103c 12f8 Broadcom 802.11b/g WLAN + 103c 12fa Broadcom 802.11b/g WLAN + 103c 12fb Broadcom 802.11b/g WLAN + 1043 100f WL-100G + 1057 7025 WN825G + 106b 004e AirPort Extreme + 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter + 144f 7050 eMachines M6805 802.11g Built-in Wireless + 144f 7051 Sonnet Aria Extreme PCI + 14e4 4320 Linksys WMP54G PCI + 1737 4320 WPC54G + 1799 7000 F5D7000uk 54G Wireless Network Card + 1799 7001 Belkin F5D7001 High-Speed Mode Wireless G Network Card + 1799 7010 Belkin F5D7010 54g Wireless Network card + 1799 7011 F5D7011 54g+ Wireless Network card + 185f 1220 TravelMate 290E WLAN Mini-PCI Card + 4321 BCM4306 802.11a Wireless LAN Controller + 4322 BCM4306 UART + 4324 BCM4309 802.11a/b/g + 1028 0001 Truemobile 1400 + 1028 0002 TrueMobile 1400 Dual Band WLAN PC Card + 1028 0003 Truemobile 1450 MiniPCI + 1028 0004 Wireless 1450 Dual Band WLAN PC Card + 103c 12f9 Broadcom 802.11a/b/g WLAN + 103c 12fc Broadcom 802.11a/b/g WLAN + 4325 BCM43xG 802.11b/g + 1414 0003 Wireless Notebook Adapter MN-720 + 1414 0004 Wireless PCI Adapter MN-730 + 4326 BCM4307 Chipcommon I/O Controller? + 4328 BCM4328 802.11a/b/g/n + 1028 0009 Wireless 1500 Draft 802.11n WLAN Mini-Card + 1028 000a Wireless 1500 Draft 802.11n WLAN Mini-card + 103c 1366 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1367 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1368 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1369 BCM4321 802.11a/b/g/n Wireless LAN Controller + 14e4 4328 BCM4328 802.11a/b/g/n + 4329 BCM43XG + 432b BCM4322 802.11a/b/g/n Wireless LAN Controller + 1028 000d Wireless 1510 Wireless-N WLAN Mini-Card + 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89] + 4401 BCM4401 100Base-T + 1025 0035 TravelMate 660 + 103c 08b0 tc1100 tablet + 1043 80a8 A7V8X motherboard + 4402 BCM4402 Integrated 10/100BaseT + 4403 BCM4402 V.90 56k Modem + 4410 BCM4413 iLine32 HomePNA 2.0 + 4411 BCM4413 V.90 56k modem + 4412 BCM4412 10/100BaseT + 4430 BCM44xx CardBus iLine32 HomePNA 2.0 + 4432 BCM4432 CardBus 10/100BaseT + 4610 BCM4610 Sentry5 PCI to SB Bridge + 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0 + 4612 BCM4610 Sentry5 V.90 56k Modem + 4613 BCM4610 Sentry5 Ethernet Controller + 4614 BCM4610 Sentry5 External Interface + 4615 BCM4610 Sentry5 USB Controller + 4704 BCM4704 PCI to SB Bridge + 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller + 4706 BCM4704 Sentry5 Ethernet Controller + 4707 BCM4704 Sentry5 USB Controller + 4708 BCM4704 Crypto Accelerator + 4710 BCM4710 Sentry5 PCI to SB Bridge + 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0 + 4712 BCM47xx V.92 56k modem + 4713 Sentry5 Ethernet Controller + 4714 BCM47xx Sentry5 External Interface + 4715 Sentry5 USB Controller + 4716 BCM47xx Sentry5 USB Host Controller + 4717 BCM47xx Sentry5 USB Device Controller + 4718 Sentry5 Crypto Accelerator + 4719 BCM47xx/53xx RoboSwitch Core + 4720 BCM4712 MIPS CPU + 5365 BCM5365P Sentry5 Host Bridge + 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller + 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller + 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller + 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller + 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller + 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric + 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller + 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch + 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller + 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch + 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch + 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch + 5820 BCM5820 Crypto Accelerator + 5821 BCM5821 Crypto Accelerator + 5822 BCM5822 Crypto Accelerator + 5823 BCM5823 Crypto Accelerator + 5824 BCM5824 Crypto Accelerator + 5840 BCM5840 Crypto Accelerator + 5841 BCM5841 Crypto Accelerator + 5850 BCM5850 Crypto Accelerator + b800 BCM56800 StrataXGS 10GE Switch Controller +14e5 Pixelfusion Ltd +14e6 SHINING Technology Inc +14e7 3CX +14e8 RAYCER Inc +14e9 GARNETS System CO Ltd +14ea Planex Communications, Inc + ab06 FNW-3603-TX CardBus Fast Ethernet + ab07 RTL81xx RealTek Ethernet + ab08 FNW-3602-TX CardBus Fast Ethernet +14eb SEIKO EPSON Corp +14ec ACQIRIS +14ed DATAKINETICS Ltd +14ee MASPRO KENKOH Corp +14ef CARRY Computer ENG. CO Ltd +14f0 CANON RESEACH CENTRE FRANCE +14f1 Conexant Systems, Inc. + 1002 HCF 56k Modem + 1003 HCF 56k Modem + 1004 HCF 56k Modem + 1005 HCF 56k Modem + 1006 HCF 56k Modem + 1022 HCF 56k Modem + 1023 HCF 56k Modem + 1024 HCF 56k Modem + 1025 HCF 56k Modem + 1026 HCF 56k Modem + 1032 HCF 56k Modem + 1033 HCF 56k Data/Fax Modem + 1033 8077 NEC + 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem + 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem + 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem + 13e0 020d Dell Copper + 13e0 020e Dell Silver + 13e0 0261 IBM + 13e0 0290 Compaq Goldwing + 13e0 02a0 IBM + 13e0 02b0 IBM + 13e0 02c0 Compaq Scooter + 13e0 02d0 IBM + 144f 1500 IBM P85-DF (1) + 144f 1501 IBM P85-DF (2) + 144f 150a IBM P85-DF (3) + 144f 150b IBM P85-DF Low Profile (1) + 144f 1510 IBM P85-DF Low Profile (2) + 1034 HCF 56k Data/Fax/Voice Modem + 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 1098 Fujitsu P85-DFSV + 1036 HCF 56k Data/Fax/Voice/Spkp Modem + 104d 8067 HCF 56k Modem + 122d 4029 MDP3880SP-W + 122d 4031 MDP3880SP-U + 13e0 0209 Dell Titanium + 13e0 020a Dell Graphite + 13e0 0260 Gateway Red Owl + 13e0 0270 Gateway White Horse + 1052 HCF 56k Data/Fax Modem (Worldwide) + 1053 HCF 56k Data/Fax Modem (Worldwide) + 1054 HCF 56k Data/Fax/Voice Modem (Worldwide) + 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide) + 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) + 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) + 1059 HCF 56k Data/Fax/Voice Modem (Worldwide) + 1063 HCF 56k Data/Fax Modem + 1064 HCF 56k Data/Fax/Voice Modem + 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1066 HCF 56k Data/Fax/Voice/Spkp Modem + 122d 4033 Dell Athena - MDP3900V-U + 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem + 10b6 CX06834-11 HCF V.92 56k Data/Fax/Voice/Spkp Modem + 1433 HCF 56k Data/Fax Modem + 1434 HCF 56k Data/Fax/Voice Modem + 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1436 HCF 56k Data/Fax Modem + 1453 HCF 56k Data/Fax Modem + 13e0 0240 IBM + 13e0 0250 IBM + 144f 1502 IBM P95-DF (1) + 144f 1503 IBM P95-DF (2) + 1454 HCF 56k Data/Fax/Voice Modem + 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1456 HCF 56k Data/Fax/Voice/Spkp Modem + 122d 4035 Dell Europa - MDP3900V-W + 122d 4302 Dell MP3930V-W(C) MiniPCI + 1610 ADSL AccessRunner PCI Arbitration Device + 1611 AccessRunner PCI ADSL Interface Device + 1620 AccessRunner V2 PCI ADSL Arbitration Device + 1621 AccessRunner V2 PCI ADSL Interface Device + 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter + 1803 HCF 56k Modem + 0e11 0023 623-LAN Grizzly + 0e11 0043 623-LAN Yogi + 1811 MiniPCI Network Adapter + 1815 HCF 56k Modem + 0e11 0022 Grizzly + 0e11 0042 Yogi + 2003 HSF 56k Data/Fax Modem + 2004 HSF 56k Data/Fax/Voice Modem + 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 2006 HSF 56k Data/Fax/Voice/Spkp Modem + 2013 HSF 56k Data/Fax Modem + 0e11 b195 Bear + 0e11 b196 Seminole 1 + 0e11 b1be Seminole 2 + 1025 8013 Acer + 1033 809d NEC + 1033 80bc NEC + 155d 6793 HP + 155d 8850 E Machines + 2014 HSF 56k Data/Fax/Voice Modem + 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 2016 HSF 56k Data/Fax/Voice/Spkp Modem + 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA) + 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA) + 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA) + 14f1 2045 Generic SoftK56 + 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA) + 2063 HSF 56k Data/Fax Modem (SmartDAA) + 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA) + 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA) + 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA) + 2093 HSF 56k Modem + 155d 2f07 Legend + 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA) + 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA) + 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA) + 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA) + 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA) + 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA) + 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA) + 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA) + 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA) + 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA) + 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA) + 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA) + 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA) + 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA) + 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA) + 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA) + 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA) + 104d 8075 Modem + 104d 8083 Modem + 104d 8097 Modem + 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA) + 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA) + 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA) + 2463 HSF 56k Data/Fax Modem (Mob SmartDAA) + 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA) + 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA) + 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA) + 2bfa D110 HDAudio Soft Data Fax Modem with SmartCP + 1025 0009 Aspire 5622WLMi + 2f00 HSF 56k HSFi Modem + 13e0 8d84 IBM HSFi V.90 + 13e0 8d85 Compaq Stinger + 14f1 2004 Dynalink 56PMi + 2f02 HSF 56k HSFi Data/Fax + 2f11 HSF 56k HSFi Modem + 2f20 HSF 56k Data/Fax Modem + 14f1 200c Soft Data Fax Modem with SmartCP + 14f1 200f Dimension 3000 + 2f30 SoftV92 SpeakerPhone SoftRing Modem with SmartSP + 14f1 2014 Devolo MikroLink 56K Modem PCI + 2f50 Conexant SoftK56 Data/Fax Modem + 5045 CX20549 (Venice) + 5047 High Definition Audio [Waikiki] + 5051 High Definition Audio (HERMOSA) + 5b7a CX23418 Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder + 0070 7444 WinTV HVR-1600 + 8234 RS8234 ATM SAR Controller [ServiceSAR Plus] + 8800 CX23880/1/2/3 PCI Video and Audio Decoder + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 0070 3401 Hauppauge WinTV 34xxx models + 0070 6902 WinTV HVR-4000-HD + 0070 7801 WinTV HVR-1800 MCE + 0070 9001 Nova-T DVB-T + 0070 9200 Nova-SE2 DVB-S + 0070 9202 Nova-S-Plus DVB-S + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x Video + 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile) + 1002 00f8 ATI TV Wonder Pro + 1002 a101 HDTV Wonder + 1043 4823 ASUS PVR-416 + 107d 6611 Winfast TV 2000XP Expert + 107d 6613 Leadtek Winfast 2000XP Expert + 107d 6620 Leadtek Winfast DV2000 + 107d 663c Leadtek PVR 2000 + 107d 665f WinFast DTV1000-T + 10fc d003 IODATA GV-VCP3/PCI + 10fc d035 IODATA GV/BCTV7E + 1421 0334 Instant TV DVB-T PCI + 1461 000a AVerTV 303 (M126) + 1461 000b AverTV Studio 303 (M126) + 1461 8011 UltraTV Media Center PCI 550 + 1462 8606 MSI TV-@nywhere Master + 14c7 0107 GDI Black Gold + 14f1 0187 Conexant DVB-T reference design + 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC) + 153b 1166 Cinergy 1400 DVB-T + 1540 2580 Provideo PV259 + 1554 4811 PixelView + 1554 4813 Club 3D ZAP1000 MCE Edition + 17de 08a1 KWorld/VStream XPert DVB-T with cx22702 + 17de 08a6 KWorld/VStream XPert DVB-T + 17de 08b2 KWorld DVB-S 100 + 17de a8a6 digitalnow DNTV Live! DVB-T + 1822 0025 digitalnow DNTV Live! DVB-T Pro + 185b e000 VideoMate X500 + 18ac d500 FusionHDTV 5 Gold + 18ac d810 FusionHDTV 3 Gold-Q + 18ac d820 FusionHDTV 3 Gold-T + 18ac db00 FusionHDTV DVB-T1 + 18ac db11 FusionHDTV DVB-T Plus + 18ac db50 FusionHDTV DVB-T Dual Digital + 7063 3000 pcHDTV HD3000 HDTV + 7063 5500 pcHDTV HD-5500 + 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port] + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 185b e000 VideoMate X500 + 7063 5500 pcHDTV HD-5500 + 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 0070 6902 WinTV HVR-4000-HD + 0070 9002 Nova-T DVB-T Model 909 + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x MPEG Encoder + 1043 4823 ASUS PVR-416 + 107d 663c Leadtek PVR 2000 + 107d 665f WinFast DTV1000-T + 14f1 0187 Conexant DVB-T reference design + 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture + 17de 08a6 KWorld/VStream XPert DVB-T + 18ac d500 DViCO FusionHDTV5 Gold + 18ac d810 DViCO FusionHDTV3 Gold-Q + 18ac d820 DViCO FusionHDTV3 Gold-T + 18ac db00 DVICO FusionHDTV DVB-T1 + 18ac db10 DVICO FusionHDTV DVB-T Plus + 7063 3000 pcHDTV HD3000 HDTV + 7063 5500 pcHDTV HD-5500 + 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port] + 0070 6902 WinTV HVR-4000-HD + 0070 9002 Nova-T DVB-T Model 909 + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 7063 5500 pcHDTV HD-5500 + 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port] + 0070 3401 Hauppauge WinTV 34xxx models + 0070 6902 WinTV HVR-4000-HD + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x Audio + 1462 8606 MSI TV-@nywhere Master + 18ac d500 DViCO FusionHDTV5 Gold + 18ac d810 DViCO FusionHDTV3 Gold-Q + 18ac d820 DViCO FusionHDTV3 Gold-T + 18ac db00 DVICO FusionHDTV DVB-T1 + 8852 CX23885 PCI Video and Audio Decoder + 0070 8010 Hauppauge WinTV HVR-1400 ExpressCard + 1461 c039 AVerTV Hybrid Express (A577) + 18ac db78 FusionHDTV DVB-T Dual Express + 8880 Hauppauge Inc. HDPVR-1250 model 1196 +14f2 MOBILITY Electronics + 0120 EV1000 bridge + 0121 EV1000 Parallel port + 0122 EV1000 Serial port + 0123 EV1000 Keyboard controller + 0124 EV1000 Mouse controller +14f3 BroadLogic + 2030 2030 DVB-S Satellite Receiver + 2035 2035 DVB-S Satellite Receiver + 2050 2050 DVB-T Terrestrial (Cable) Receiver + 2060 2060 ATSC Terrestrial (Cable) Receiver +14f4 TOKYO Electronic Industry CO Ltd +14f5 SOPAC Ltd +14f6 COYOTE Technologies LLC +14f7 WOLF Technology Inc +14f8 AUDIOCODES Inc + 2077 TP-240 dual span E1 VoIP PCI card +14f9 AG COMMUNICATIONS +14fa WANDEL & GOLTERMANN +14fb TRANSAS MARINE (UK) Ltd +14fc Quadrics Ltd + 0000 QsNet Elan3 Network Adapter + 0001 QsNetII Elan4 Network Adapter + 0002 QsNetIII Elan5 Network Adapter +14fd JAPAN Computer Industry Inc +14fe ARCHTEK TELECOM Corp +14ff TWINHEAD INTERNATIONAL Corp +1500 DELTA Electronics, Inc + 1360 RTL81xx RealTek Ethernet +1501 BANKSOFT CANADA Ltd +1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd +1503 KAWASAKI LSI USA Inc +1504 KAISER Electronics +1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH +1506 CHAMELEON Systems Inc +# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057). +1507 Motorola ?? / HTEC + 0001 MPC105 [Eagle] + 0002 MPC106 [Grackle] + 0003 MPC8240 [Kahlua] + 0100 MC145575 [HFC-PCI] + 0431 KTI829c 100VG + 4801 Raven + 4802 Falcon + 4803 Hawk + 4806 CPX8216 +1508 HONDA CONNECTORS/MHOTRONICS Inc +1509 FIRST INTERNATIONAL Computer Inc +150a FORVUS RESEARCH Inc +150b YAMASHITA Systems Corp +150c KYOPAL CO Ltd +150d WARPSPPED Inc +150e C-PORT Corp +150f INTEC GmbH +1510 BEHAVIOR TECH Computer Corp +1511 CENTILLIUM Technology Corp +1512 ROSUN Technologies Inc +1513 Raychem +1514 TFL LAN Inc +1515 Advent design +1516 MYSON Technology Inc + 0800 MTD-8xx 100/10M Ethernet PCI Adapter + 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter + 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter + 0891 MTD-8xx 100/10M Ethernet PCI Adapter +1517 ECHOTEK Corp +# nee PEP MODULAR Computers GmbH +1518 Kontron Modular Computers GmbH +1519 TELEFON AKTIEBOLAGET LM Ericsson +151a Globetek + 1002 PCI-1002 + 1004 PCI-1004 + 1008 PCI-1008 +151b COMBOX Ltd +151c DIGITAL AUDIO LABS Inc + 0003 Prodif T 2496 + 4000 Prodif 88 +151d Fujitsu Computer Products Of America +151e MATRIX Corp +151f TOPIC SEMICONDUCTOR Corp + 0000 TP560 Data/Fax/Voice 56k modem +1520 CHAPLET System Inc +1521 BELL Corp +1522 MainPine Ltd + 0100 PCI <-> IOBus Bridge + 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem + 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem + 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 2000 RockForceD1 1 Port V.90 Data Modem + 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem + 1522 2200 RockForceD2 2 Port V.90 Data Modem + 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem + 1522 2400 RockForceD4 4 Port V.90 Data Modem + 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem + 1522 2600 RockForceD8 8 Port V.90 Data Modem + 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem + 1522 3000 IQ Express D1 - 1 Port V.92 Data Modem + 1522 3100 IQ Express F1 - 1 Port V.34 Super-G3 Fax Modem + 1522 3200 IQ Express D2 - 2 Port V.92 Data Modem + 1522 3300 IQ Express F2 - 2 Port V.34 Super-G3 Fax Modem + 1522 3400 IQ Express D4 - 4 Port V.92 Data Modem + 1522 3500 IQ Express F4 - 4 Port V.34 Super-G3 Fax Modem + 1522 3c00 IQ Express D8 - 8 Port V.92 Data Modem + 1522 3d00 IQ Express F8 - 8 Port V.34 Super-G3 Fax Modem + 4000 PCI Express UART + 1522 4001 IQ Express 1-port V.34 Super-G3 Fax + 1522 4002 IQ Express 2-port V.34 Super-G3 Fax + 1522 4004 IQ Express 4-port V.34 Super-G3 Fax + 1522 4008 IQ Express 8-port V.34 Super-G3 Fax + 1522 4100 IQ Express SideBand +1523 MUSIC Semiconductors +1524 ENE Technology Inc + 0510 CB710 Memory Card Reader Controller + 103c 006a NX9500 + 0520 FLASH memory: ENE Technology Inc: + 0530 ENE PCI Memory Stick Card Reader Controller + 0550 ENE PCI Secure Digital Card Reader Controller + 0551 SD/MMC Card Reader Controller + 0610 PCI Smart Card Reader Controller + 0720 Memory Stick Card Reader Controller + 0730 ENE PCI Memory Stick Card Reader Controller + 0750 ENE PCI SmartMedia / xD Card Reader Controller + 0751 ENE PCI Secure Digital / MMC Card Reader Controller + 1211 CB1211 Cardbus Controller + 1225 CB1225 Cardbus Controller + 1410 CB1410 Cardbus Controller + 1025 003c CL50 motherboard + 1025 005a TravelMate 290 + 1411 CB-710/2/4 Cardbus Controller + 103c 006a NX9500 + 1412 CB-712/4 Cardbus Controller + 1420 CB1420 Cardbus Controller + 1421 CB-720/2/4 Cardbus Controller + 1422 CB-722/4 Cardbus Controller +1525 IMPACT Technologies +1526 ISS, Inc +1527 SOLECTRON +1528 ACKSYS +1529 AMERICAN MICROSystems Inc +152a QUICKTURN DESIGN Systems +152b FLYTECH Technology CO Ltd +152c MACRAIGOR Systems LLC +152d QUANTA Computer Inc +152e MELEC Inc +152f PHILIPS - CRYPTO +1530 ACQIS Technology Inc +1531 CHRYON Corp +1532 ECHELON Corp + 0020 LonWorks PCLTA-20 PCI LonTalk Adapter +1533 BALTIMORE +1534 ROAD Corp +1535 EVERGREEN Technologies Inc +1536 ACTIS Computer +1537 DATALEX COMMUNCATIONS +1538 ARALION Inc + 0303 ARS106S Ultra ATA 133/100/66 Host Controller +1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A. +153a ONO SOKKI +153b TERRATEC Electronic GmbH + 1144 Aureon 5.1 +# Terratec seems to use several IDs for the same card. + 1147 Aureon 5.1 Sky + 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV] +153c ANTAL Electronic +153d FILANET Corp +153e TECHWELL Inc +153f MIPS Technologies, Inc. + 0001 SOC-it 101 System Controller +1540 PROVIDEO MULTIMEDIA Co Ltd +1541 MACHONE Communications +1542 Concurrent Computer Corporation + 9260 RCIM-II Real-Time Clock & Interrupt Module +1543 SILICON Laboratories + 3052 Intel 537 [Winmodem] + 3155 Motorola SM56 Speakerphone Modem + 4c22 Si3036 MC'97 DAA +1544 DCM DATA Systems +1545 VISIONTEK +1546 IOI Technology Corp +1547 MITUTOYO Corp +1548 JET PROPULSION Laboratory +1549 INTERCONNECT Systems Solutions +154a MAX Technologies Inc +154b COMPUTEX Co Ltd +154c VISUAL Technology Inc +154d PAN INTERNATIONAL Industrial Corp +154e SERVOTEST Ltd +154f STRATABEAM Technology +1550 OPEN NETWORK Co Ltd +1551 SMART Electronic DEVELOPMENT GmBH +1552 RACAL AIRTECH Ltd +1553 CHICONY Electronics Co Ltd +1554 PROLINK Microsystems Corp +1555 GESYTEC GmBH +1556 PLD APPLICATIONS +1557 MEDIASTAR Co Ltd +1558 CLEVO/KAPOK Computer +1559 SI LOGIC Ltd +155a INNOMEDIA Inc +155b PROTAC INTERNATIONAL Corp +155c Cemax-Icon Inc +155d Mac System Co Ltd +155e LP Elektronik GmbH +155f Perle Systems Ltd +1560 Terayon Communications Systems +1561 Viewgraphics Inc +1562 Symbol Technologies +1563 A-Trend Technology Co Ltd +1564 Yamakatsu Electronics Industry Co Ltd +1565 Biostar Microtech Int'l Corp +1566 Ardent Technologies Inc +1567 Jungsoft +1568 DDK Electronics Inc +1569 Palit Microsystems Inc. +156a Avtec Systems +156b 2wire Inc +156c Vidac Electronics GmbH +156d Alpha-Top Corp +156e Alfa Inc +156f M-Systems Flash Disk Pioneers Ltd +1570 Lecroy Corp +1571 Contemporary Controls + a001 CCSI PCI20-485 ARCnet + a002 CCSI PCI20-485D ARCnet + a003 CCSI PCI20-485X ARCnet + a004 CCSI PCI20-CXB ARCnet + a005 CCSI PCI20-CXS ARCnet + a006 CCSI PCI20-FOG-SMA ARCnet + a007 CCSI PCI20-FOG-ST ARCnet + a008 CCSI PCI20-TB5 ARCnet + a009 CCSI PCI20-5-485 5Mbit ARCnet + a00a CCSI PCI20-5-485D 5Mbit ARCnet + a00b CCSI PCI20-5-485X 5Mbit ARCnet + a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet + a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet + a201 CCSI PCI22-485 10Mbit ARCnet + a202 CCSI PCI22-485D 10Mbit ARCnet + a203 CCSI PCI22-485X 10Mbit ARCnet + a204 CCSI PCI22-CHB 10Mbit ARCnet + a205 CCSI PCI22-FOG_ST 10Mbit ARCnet + a206 CCSI PCI22-THB 10Mbit ARCnet +1572 Otis Elevator Company +1573 Lattice - Vantis +1574 Fairchild Semiconductor +1575 Voltaire Advanced Data Security Ltd +1576 Viewcast COM +1578 HITT + 4d34 VPMK4 [Video Processor Mk IV] + 5615 VPMK3 [Video Processor Mk III] +1579 Dual Technology Corp +157a Japan Elecronics Ind Inc +157b Star Multimedia Corp +157c Eurosoft (UK) + 8001 Fix2000 PCI Y2K Compliance Card +157d Gemflex Networks +157e Transition Networks +157f PX Instruments Technology Ltd +1580 Primex Aerospace Co +1581 SEH Computertechnik GmbH +1582 Cytec Corp +1583 Inet Technologies Inc +1584 Uniwill Computer Corp +1585 Logitron +1586 Lancast Inc +1587 Konica Corp +1588 Solidum Systems Corp +1589 Atlantek Microsystems Pty Ltd + 0008 Leutron Vision PicPortExpress CL + 0009 Leutron Vision PicPortExpress CL Stereo +158a Digalog Systems Inc +158b Allied Data Technologies +158c Hitachi Semiconductor & Devices Sales Co Ltd +158d Point Multimedia Systems +158e Lara Technology Inc +158f Ditect Coop +1590 3PAR Inc. + 0001 Eagle Cluster Manager + 0002 Osprey Cluster Manager + 0003 Harrier Cluster Manager + a01d FC044X Fibre Channel HBA +1591 ARN +1592 Syba Tech Ltd + 0781 Multi-IO Card + 0782 Parallel Port Card 2xEPP + 0783 Multi-IO Card + 0785 Multi-IO Card + 0786 Multi-IO Card + 0787 Multi-IO Card + 0788 Multi-IO Card + 078a Multi-IO Card +1593 Bops Inc +1594 Netgame Ltd +1595 Diva Systems Corp +1596 Folsom Research Inc +1597 Memec Design Services +1598 Granite Microsystems +1599 Delta Electronics Inc +159a General Instrument +159b Faraday Technology Corp +159c Stratus Computer Systems +159d Ningbo Harrison Electronics Co Ltd +159e A-Max Technology Co Ltd +159f Galea Network Security +15a0 Compumaster SRL +15a1 Geocast Network Systems +15a2 Catalyst Enterprises Inc + 0001 TA700 PCI Bus Analyzer/Exerciser +15a3 Italtel +15a4 X-Net OY +15a5 Toyota Macs Inc +15a6 Sunlight Ultrasound Technologies Ltd +15a7 SSE Telecom Inc +15a8 Shanghai Communications Technologies Center +15aa Moreton Bay +15ab Bluesteel Networks Inc +15ac North Atlantic Instruments +15ad VMware + 0405 SVGA II Adapter + 0710 SVGA Adapter + 0720 VMXNET Ethernet Controller + 0740 Virtual Machine Communication Interface + 0770 USB2 EHCI Controller + 0790 PCI bridge + 07a0 PCI Express Root Port + 07b0 VMXNET3 Ethernet Controller + 07c0 PVSCSI SCSI Controller + 0801 Virtual Machine Interface + 15ad 0800 Hypervisor ROM Interface +15ae Amersham Pharmacia Biotech +15b0 Zoltrix International Ltd +15b1 Source Technology Inc +15b2 Mosaid Technologies Inc +15b3 Mellanox Technologies + 0191 MT25408 [ConnectX IB SDR Flash Recovery] + 5274 MT21108 InfiniBridge + 5a44 MT23108 InfiniHost + 5a45 MT23108 [Infinihost HCA Flash Recovery] + 5a46 MT23108 PCI Bridge + 5e8c MT24204 [InfiniHost III Lx HCA] + 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery] + 6274 MT25204 [InfiniHost III Lx HCA] + 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) + 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery] + 6282 MT25208 [InfiniHost III Ex] + 6340 MT25408 [ConnectX VPI - IB SDR / 10GigE] + 634a MT25418 [ConnectX VPI PCIe 2.0 2.5GT/s - IB DDR / 10GigE] + 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s] + 6372 MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe 2.0 2.5GT/s] + 6732 MT26418 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE] + 673c MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] + 6746 MT25408 [ConnectX EN 40GigE PCIe 2.0 5GT/s] + 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] + 675a MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s] + 6764 MT26468 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] +15b4 CCI/TRIAD +15b5 Cimetrics Inc +15b6 Texas Memory Systems Inc + 0001 XP15 DSP Accelerator + 0002 XP30 DSP Accelerator + 0003 XP00 Data Acquisition Device + 0004 XP35 DSP Accelerator + 0007 XP100 DSP Accelerator [XP100-T0] + 0008 XP100 DSP Accelerator [XP100-T1] + 0009 XP100 DSP Accelerator [XP100-E0] + 000a XP100 DSP Accelerator [XP100-E1] + 000e XP100 DSP Accelerator [XP100-0] + 000f XP100 DSP Accelerator [XP100-1] + 0010 XP100 DSP Accelerator [XP100-P0] + 0011 XP100 DSP Accelerator [XP100-P1] + 0012 XP100 DSP Accelerator [XP100-P2] + 0013 XP100 DSP Accelerator [XP100-P3] + 0014 RamSan Flash SSD + 0015 ZBox +15b7 Sandisk Corp +15b8 ADDI-DATA GmbH + 1003 APCI1032 SP controller (32 digi inputs w/ opto coupler) + 1005 APCI2200 SP controller (8/16 digi outputs (relay)) + 100a APCI1696 SP controller (96 TTL I/Os) + 3001 APCI3501 SP controller (analog output board) + 300f APCI3600 Noise and vibration measurement board + 7001 APCI7420 2-port Serial Controller + 7002 APCI7300 Serial Controller +15b9 Maestro Digital Communications +15ba Impacct Technology Corp +15bb Portwell Inc +15bc Agilent Technologies + 0103 QX4 PCI Express quad 4-gigabit Fibre Channel controller + 0105 Celerity FC-42XS Fibre Channel Adapter + 117c 0022 Celerity FC-42XS Fibre Channel Adapter + 1100 E8001-66442 PCI Express CIC + 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker + 2928 64 Bit, 66MHz PCI Exerciser & Analyzer + 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser +15bd DFI Inc +15be Sola Electronics +15bf High Tech Computer Corp (HTC) +15c0 BVM Ltd +15c1 Quantel +15c2 Newer Technology Inc +15c3 Taiwan Mycomp Co Ltd +15c4 EVSX Inc +15c5 Procomp Informatics Ltd + 8010 1394b - 1394 Firewire 3-Port Host Adapter Card +15c6 Technical University of Budapest +15c7 Tateyama System Laboratory Co Ltd + 0349 Tateyama C-PCI PLC/NC card Rev.01A +15c8 Penta Media Co Ltd +15c9 Serome Technology Inc +15ca Bitboys OY +15cb AG Electronics Ltd +15cc Hotrail Inc +15cd Dreamtech Co Ltd +15ce Genrad Inc +15cf Hilscher GmbH +15d1 Infineon Technologies AG +15d2 FIC (First International Computer Inc) +15d3 NDS Technologies Israel Ltd +15d4 Iwill Corp +15d5 Tatung Co +15d6 Entridia Corp +15d7 Rockwell-Collins Inc +15d8 Cybernetics Technology Co Ltd +15d9 Super Micro Computer Inc +15da Cyberfirm Inc +15db Applied Computing Systems Inc +15dc Litronic Inc + 0001 Argus 300 PCI Cryptography Module +15dd Sigmatel Inc +15de Malleable Technologies Inc +15df Infinilink Corp +15e0 Cacheflow Inc +15e1 Voice Technologies Group Inc +15e2 Quicknet Technologies Inc + 0500 PhoneJack-PCI +15e3 Networth Technologies Inc +15e4 VSN Systemen BV +15e5 Valley technologies Inc +15e6 Agere Inc +15e7 Get Engineering Corp +15e8 National Datacomm Corp + 0130 Wireless PCI Card + 0131 NCP130A2 Wireless NIC +15e9 Pacific Digital Corp + 1841 ADMA-100 DiscStaQ ATA Controller +15ea Tokyo Denshi Sekei K.K. +15eb DResearch Digital Media Systems GmbH +15ec Beckhoff GmbH + 3101 FC3101 Profibus DP 1 Channel PCI + 5102 FC5102 +15ed Macrolink Inc +15ee In Win Development Inc +15ef Intelligent Paradigm Inc +15f0 B-Tree Systems Inc +15f1 Times N Systems Inc +15f2 Diagnostic Instruments Inc +15f3 Digitmedia Corp +15f4 Valuesoft +15f5 Power Micro Research +15f6 Extreme Packet Device Inc +15f7 Banctec +15f8 Koga Electronics Co +15f9 Zenith Electronics Corp +15fa J.P. Axzam Corp +15fb Zilog Inc +15fc Techsan Electronics Co Ltd +15fd N-CUBED.NET +15fe Kinpo Electronics Inc +15ff Fastpoint Technologies Inc +1600 Northrop Grumman - Canada Ltd +1601 Tenta Technology +1602 Prosys-tec Inc +1603 Nokia Wireless Communications +1604 Central System Research Co Ltd +1605 Pairgain Technologies +1606 Europop AG +1607 Lava Semiconductor Manufacturing Inc +1608 Automated Wagering International +1609 Scimetric Instruments Inc +1612 Telesynergy Research Inc. +1619 FarSite Communications Ltd + 0400 FarSync T2P (2 port X.21/V.35/V.24) + 0440 FarSync T4P (4 port X.21/V.35/V.24) + 0610 FarSync T1U (1 port X.21/V.35/V.24) + 0620 FarSync T2U (2 port X.21/V.35/V.24) + 0640 FarSync T4U (4 port X.21/V.35/V.24) + 1610 FarSync TE1 (T1,E1) + 2610 FarSync DSL-S1 (SHDSL) + 3640 FarSync T4E (4-port X.21/V.35/V.24) + 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24) + 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24) +161f Rioworks +1626 TDK Semiconductor Corp. + 8410 RTL81xx Fast Ethernet +1629 Kongsberg Spacetec AS + 1003 Format synchronizer v3.0 + 1006 Format synchronizer, model 10500 + 1007 Format synchronizer, model 21000 + 2002 Fast Universal Data Output +1631 Packard Bell B.V. +# This seems to occur on their 802.11b Wireless card WMP-11 +1637 Linksys + 3874 Linksys 802.11b WMP11 PCI Wireless card +1638 Standard Microsystems Corp [SMC] + 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000 +163c Smart Link Ltd. + 3052 SmartLink SmartPCI562 56K Modem + 5449 SmartPCI561 Modem +1641 MKNet Corp. +1657 Brocade Communications Systems, Inc. + 0013 425 4Gb/825 8Gb PCIe Dual port FC HBA + 0014 BR-1020 FC/FCOE 10GB Eth / FC over Eth + 0017 415 4Gb/815 8Gb PCIe FC HBA +# Same Device_ID used for 410 (1port) and 420 (2 port) HBAs. + 0646 Brocade 400 4Gb PCIe FC HBA +165a Epix Inc + c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232] + d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232] + d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232] +165d Hsing Tech. Enterprise Co., Ltd. +165f Linux Media Labs, LLC + 1020 LMLM4 MPEG-4 encoder +1661 Worldspace Corp. +1668 Actiontec Electronics Inc + 0100 Mini-PCI bridge +# Formerly SiByte, Inc. +166d Broadcom Corporation + 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI + 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport + 0012 SiByte BCM1280/BCM1480 System-on-a-Chip PCI-X + 0014 Sibyte BCM1280/BCM1480 System-on-a-Chip HyperTransport +1677 Bernecker + Rainer + 104e 5LS172.6 B&R Dual CAN Interface Card + 12d7 5LS172.61 B&R Dual CAN Interface Card + 20ad 5ACPCI.MFIO-K01 Profibus DP / K-Feldbus / COM +1678 NetEffect + 0100 NE020 10Gb Accelerated Ethernet Adapter (iWARP RNIC) +1679 Tokyo Electron Device Ltd. + 3000 SD Standard host controller [Ellen] +167b ZyDAS Technology Corp. + 2102 ZyDAS ZD1202 + 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card + 2116 ZD1212B Wireless Adapter +167d Samsung Electro-Mechanics Co., Ltd. + a000 IPW2200 miniPCI Wireless +167e ONNTO Corp. +1681 Hercules + 0010 Hercules 3d Prophet II Ultra 64MB (350 MHz NV15BR core) +1682 XFX Pine Group Inc. +1688 CastleNet Technology Inc. + 1170 WLAN 802.11b card +168c Atheros Communications Inc. + 0007 AR5000 802.11a Wireless Adapter + 0011 AR5210 802.11a NIC + 0012 AR5211 802.11ab NIC + 126c 8031 2201 Mobile Adapter + 0013 Atheros AR5001X+ Wireless Network Adapter + 0e11 00e5 NC6000 laptop + 1113 d301 Philips CPWNA100 Wireless CardBus adapter + 1113 ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter + 1186 3202 D-link DWL-G650 (Rev B3,B5) Wireless cardbus adapter + 1186 3203 DWL-G520 Wireless PCI Adapter + 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C) + 1186 3a13 D-Link AirPlus DWL-G520 Wireless PCI Adapter(rev.B) + 1186 3a14 D-Link AirPremier DWL-AG530 Wireless PCI Adapter + 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter + 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter + 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter + 1186 3a93 Conceptronic C54I Wireless 801.11g PCI card + 1186 3a94 C54C Wireless 801.11g cardbus + 1186 3ab0 Allnet ALL0281 Wireless PCI Card + 1385 4d00 Netgear WG311T Wireless PCI Adapter + 1458 e911 Gigabyte GN-WIAG02 + 1468 0408 ThinkPad 11b/g Wireless LAN Mini PCI Adapter + 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter + 1668 1026 IBM HighRate 11 a/b/g Wireless CardBus Adapter + 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter + 168c 1025 DWL-G650B2 Wireless CardBus Adapter + 168c 1027 Engenius NL-3054CB ARIES b/g CardBus Adapter + 168c 1042 Ubiquiti Networks SuperRange a/b/g Cardbus Adapter + 168c 1051 EZ Connect g 802.11g 108Mbps Wireless PCI Adapter + 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter + 168c 2041 Engenius 5354MP Plus ARIES2 b/g MiniPCI Adapter + 168c 2042 Engenius 5354MP Plus ARIES2 a/b/g MiniPCI Adapter + 168c 2051 TRENDnet TEW-443PI Wireless PCI Adapter + 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter + 1737 0017 WPC55AG + 1737 0026 WMP55AG v1.1 + 17cf 0042 Z-COMAX Highpower XG-622H (400mw) 802.11b/g mini-PCI Adapter + 185f 1012 CM9 Wireless a/b/g MiniPCI Adapter + 185f 2012 Wistron NeWeb WLAN a+b+g model CB9 +# the name AR5005G is used for the reference design using AR2413 + 001a AR2413 802.11bg NIC + 1052 168c Sweex Wireless Lan PC Card 54Mbps + 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU) + 1113 ee24 SMC Wireless PCI Card WPCI-G + 1186 3a15 D-Link AirPlus G DWL-G630 Wireless Cardbus Adapter(rev.D) + 1186 3a16 D-Link AirPlus G DWL-G510 Wireless PCI Adapter(rev.B) + 1186 3a1d WDA-1320 Desktop Adapter + 1186 3a23 D-Link AirPlus G DWL-G520+A Wireless PCI Adapter + 1186 3a24 D-Link AirPlus G DWL-G650+A Wireless Cardbus Adapter + 1186 3b08 AirPlus G DWL-G630 + 168c 001a Belkin FD7000 + 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter + 168c 2052 Compex Wireless 802.11 b/g MiniPCI Adapter, Rev A1 [WLM54G] + 16ec 0122 Wireless PCI Adapter Model 5418 +# the name AR5006X is used for the reference design using AR5413 + 001b AR5413 802.11abg NIC + 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter + 1186 3a22 D-Link AirPremier AG DWL-AG530 Wireless PCI Adapter + 1458 e901 GN-WI01HT Wireless a/b/g MiniPCI Adapter + 168c 001b Wireless LAN PCI LiteOn + 168c 2062 EnGenius EMP-8602 (400mw) or Compex WLM54AG (SuperAG) + 168c 2063 EnGenius EMP-8602 (400mw) or Compex WLM54AG + 185f 1600 DCMA-82 High Power WLAN 802.11a/b/g mini-PCI Module (Super A/G, eXtended Range, 400mW) + a727 6804 Wireless 11a/b/g PC Card with XJACK(r) Antenna + 001c AR5001 Wireless Network Adapter + 1468 0428 AR5BXB63 802.11bg NIC + 1468 042a AR5007EG 802.11bg NIC + 147b 1033 AirPace Wi-Fi + 168c 001c AR242x 802.11abg NIC (PCI Express) + 168c 3061 AR5006EGS 802.11bg NIC (2.4GHz, PCI Express) + 168c 3062 AR5006EXS 802.11abg NIC (2.4/5.0GHz, PCI Express) + 168c 3063 AR5006EX 802.11abg NIC (2.4/5.0GHz, PCI Express) + 168c 3065 AR5006EG 802.11bg NIC (2.4GHz, PCI Express) + 168c 3067 AR242x 802.11abg Wireless PCI Express Adapter (rev 01) + 1a3b 1026 AR5007EG 802.11bg Wi-Fi mini PCI express card + 001d AR5007G Wireless Network Adapter +# the name AR5005VL is used for some AR5513 based designs + 0020 AR5513 802.11abg Wireless NIC + 0023 AR5008 Wireless Network Adapter + 0024 AR5008 Wireless Network Adapter + 0027 AR9160 802.11abgn Wireless PCI Adapter + 0029 AR922X Wireless Network Adapter + 002a AR928X Wireless Network Adapter (PCI-Express) + 002b AR9285 Wireless Network Adapter (PCI-Express) + 0033 11a/b/g/n Wireless LAN Mini-PCI Express Adapter + 0207 AR5210 + 1014 AR5212 802.11abg NIC + 1014 058a ThinkPad 11a/b/g Wireless LAN Mini Express Adapter (AR5BXB6) + 3b08 D-Link AirPlus G DWL-G630 + ff19 AR5006X Wireless Network Adapter + ff1c AR5008 Wireless Network Adapter + ff1d AR5008 Wireless Network Adapter +1695 EPoX Computer Co., Ltd. +169c Netcell Corporation + 0044 Revolution Storage Processing Card +# The right ID is 196d, but they got it nibble-swapped in 2202. +169d Club-3D VB (Wrong ID) + 3306 ZAP TV 2202 +16a5 Tekram Technology Co.,Ltd. +16ab Global Sun Technology Inc + 1100 GL24110P + 1101 PLX9052 PCMCIA-to-PCI Wireless LAN + 1102 PCMCIA-to-PCI Wireless Network Bridge + 8501 WL-8305 Wireless LAN PCI Adapter +16ae SafeNet Inc + 0001 SafeXcel 1140 + 000a SafeXcel 1841 + 1141 SafeXcel 1141 + 1841 SafeXcel 1842 +16af SparkLAN Communications, Inc. +16b4 Aspex Semiconductor Ltd +16b8 Sonnet Technologies, Inc. +16be Creatix Polymedia GmbH +16c6 Micrel-Kendin + 8695 Centaur KS8695 ARM processor + 8842 KSZ8842-PMQL 2-Port Ethernet Switch +16c8 Octasic Inc. +16c9 EONIC B.V. The Netherlands +16ca CENATEK Inc + 0001 Rocket Drive DL +16cd Densitron Technologies +16ce Roland Corp. +16d5 Acromag, Inc. + 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O + 0520 PMC520 Serial Communication, 232 Octal + 0521 PMC521 Serial Communication, 422/485 Octal + 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A + 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A + 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O + 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A + 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A + 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A + 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A + 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module + 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module + 424b PMC-DX2002 Reconfigurable FPGA with Differential I/O + 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O + 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O + 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O + 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O + 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O + 4350 PMC-DX501 Reconfigurable Digital I/O Module + 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O + 4357 PMC-DX502 Reconfigurable Differential I/O Module + 4457 PMC730, APC730, AcPC730 Multifunction Module + 464d PMC408 32-Channel Digital Input/Output Module + 4850 PMC220-16 12-Bit Analog Output Module + 4a42 PMC483, APC483, AcPC483 Counter Timer Module + 4a50 PMC484, APC484, AcPC484 Counter Timer Module + 4a56 PMC230 16-Bit Analog Output Module + 4b47 PMC330, APC330, AcPC330 Analog Input Module, 16-bit A/D + 4c40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O + 4c60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O + 4d4d PMC341, APC341, AcPC341 Analog Input Module, Simultaneous Sample & Hold + 4d4e PMC482, APC482, AcPC482 Counter Timer Board + 524d PMC-DX2001 Reconfigurable FPGA with TTL I/O + 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O + 5456 PMC470 48-Channel Digital Input/Output Module + 5601 PMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5602 PMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5603 PMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5604 PMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5605 PMC-VFX70 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5606 PMC-VLX155-1M Reconfigurable Virtex-5 FPGA with plug-in I/O +16da Advantech Co., Ltd. + 0011 INES GPIB-PCI +16df PIKA Technologies Inc. +16e3 European Space Agency + 1e0f LEON2FT Processor +16e5 Intellon Corp. + 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV] + 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV] +16ec U.S. Robotics + 0116 USR997902 10/100/1000 Mbps PCI Network Card + 2f00 USR5660A (USR265660A, USR5660A-BP) 56K PCI Faxmodem + 3685 Wireless Access PCI Adapter Model 022415 + 4320 USR997904 10/100/1000 64-bit NIC (Marvell Yukon) + ab06 USR997901A 10/100 Cardbus NIC +16ed Sycron N. V. + 1001 UMIO communication card +16f3 Jetway Information Co., Ltd. +16f4 Vweb Corp + 8000 VW2010 +16f6 VideoTele.com, Inc. +1702 Internet Machines Corporation (IMC) +1705 Digital First, Inc. +170b NetOctave + 0100 NSP2000-SSL crypto accelerator +170c YottaYotta Inc. +1719 EZChip Technologies +# Seems to be a 2nd ID for Vitesse Semiconductor +1725 Vitesse Semiconductor + 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller +172a Accelerated Encryption + 13c8 AEP SureWare Runner 1000V3 +1734 Fujitsu Technology Solutions + 1078 Amilo Pro v2010 + 1085 Celsius M450 + 1098 Amilo L 1310G +1735 Aten International Co. Ltd. +1737 Linksys + 0013 WMP54G Wireless Pci Card + 0015 WMP54GS Wireless Pci Card + 0029 WPG54G ver. 4 PCI Card + 1032 Gigabit Network Adapter + 1737 0015 EG1032 v2 Instant Gigabit Network Adapter + 1737 0024 EG1032 v3 Instant Gigabit Network Adapter + 1064 Gigabit Network Adapter + 1737 0016 EG1064 v2 Instant Gigabit Network Adapter + ab08 21x4x DEC-Tulip compatible 10/100 Ethernet + ab09 21x4x DEC-Tulip compatible 10/100 Ethernet +173b Altima (nee Broadcom) + 03e8 AC1000 Gigabit Ethernet + 03e9 AC1001 Gigabit Ethernet + 03ea AC9100 Gigabit Ethernet + 173b 0001 AC1002 + 03eb AC1003 Gigabit Ethernet +1743 Peppercon AG + 8139 ROL/F-100 Fast Ethernet Adapter with ROL +1745 ViXS Systems, Inc. + 2020 XCode II Series + 2100 XCode 2100 Series +1749 RLX Technologies +174b PC Partner Limited +174d WellX Telecom SA +175c AudioScience Inc +175e Sanera Systems, Inc. +1760 TEDIA spol. s r. o. +1771 InnoVISION Multimedia Ltd. +# nee SBS Technologies +1775 GE Fanuc Intelligent Platforms +177d Cavium Networks + 0001 Nitrox XL N1 + 0003 Nitrox XL N1 Lite + 0004 Octeon (and older) FIPS + 0005 Octeon CN38XX Network Processor Pass 3.x + 0006 RoHS + 0010 Nitrox XL NPX + 0020 Octeon CN31XX Network Processor + 0030 Octeon CN30XX Network Processor + 0040 Octeon CN58XX Network Processor + 0050 Octeon CN57XX Network Processor (CN54XX/CN55XX/CN56XX) + 0070 Octeon CN50XX Network Processor + 0080 Octeon CN52XX Network Processor +1787 Hightech Information System Ltd. +1789 Ennyah Technologies Corp. +# also used by Struck Innovative Systeme for joint developments +1796 Research Centre Juelich + 0001 SIS1100 [Gigabit link] + 0002 HOTlink + 0003 Counter Timer + 0004 CAMAC Controller + 0005 PROFIBUS + 0006 AMCC HOTlink + 000d Synchronisation Slave + 000e SIS1100-eCMC + 000f TDC (GPX) + 0010 PCIe Counter Timer + 0011 SIS1100-e single link + 0012 SIS1100-e quad link +1797 Techwell Inc. + 6801 TW6802 multimedia video card + 6802 TW6802 multimedia other device +1799 Belkin + 6001 Wireless PCI Card - F5D6001 + 6020 Wireless PCMCIA Card - F5D6020 + 6060 Wireless PDA Card - F5D6060 + 7000 Wireless PCI Card - F5D7000 + 700a Wireless PCI Card - F5D7000UK + 7010 BCM4306 802.11b/g Wireless Lan Controller F5D7010 +179a id Quantique + 0001 Quantis PCI 16Mbps +179c Data Patterns + 0557 DP-PCI-557 [PCI 1553B] + 0566 DP-PCI-566 [Intelligent PCI 1553B] + 1152 DP-cPCI-1152 (8-channel Isolated ADC Module) + 5031 DP-CPCI-5031-Synchro Module +# cPCI Carrier for Mezzanine Modules + 5112 DP-cPCI-5112 [MM-Carrier] + 5121 DP-CPCI-5121-IP Carrier + 5211 DP-CPCI-5211-IP Carrier + 5679 AGE Display Module +17a0 Genesys Logic, Inc + 7163 GL9701 PCIe to PCI Bridge + 8083 GL880 USB 1.1 UHCI controller + 8084 GL880 USB 2.0 EHCI controller +17aa Lenovo + 20b1 ThinkPad T61p +17ab Phillips Components +17af Hightech Information System Ltd. +17b3 Hawking Technologies + ab08 PN672TX 10/100 Ethernet +17b4 Indra Networks, Inc. + 0011 WebEnhance 100 GZIP Compression Card + 0012 WebEnhance 200 GZIP Compression Card + 0015 WebEnhance 300 GZIP Compression Card + 0016 StorCompress 300 GZIP Compression Card + 0017 StorSecure 300 GZIP Compression and AES Encryption Card +17c0 Wistron Corp. +17c2 Newisys, Inc. +17cb Airgo Networks Inc + 0001 AGN100 802.11 a/b/g True MIMO Wireless Card + 0002 AGN300 802.11 a/b/g True MIMO Wireless Card +17cc NetChip Technology, Inc + 2280 USB 2.0 +17cf Z-Com, Inc. +17d3 Areca Technology Corp. + 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller + 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller + 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller + 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller + 1170 ARC-1170 24-Port PCI-X to SATA RAID Controller + 1201 ARC-1200 2-Port PCI-Express to SATA II RAID Controller + 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller + 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller + 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller + 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller + 1280 ARC-1231 12-Port PCI-Express to SATA RAID Controller + 1680 ARC-1680 8 port PCIe/PCI-X to SAS/SATA II RAID Controller +# Nee S2io Inc. +17d5 Neterion Inc. + 5731 Xframe 10-Gigabit Ethernet PCI-X + 5732 Xframe II 10-Gigabit Ethernet PCI-X 2.0 + 5831 Xframe 10-Gigabit Ethernet PCI-X + 103c 12d5 PCI-X 133MHz 10GbE SR Fiber + 10a9 8020 Single Port 10-Gigabit Ethernet (PCI-X, Fiber) + 10a9 8024 Single Port 10-Gigabit Ethernet (PCI-X, Fiber) + 5832 Xframe II 10-Gigabit Ethernet PCI-X 2.0 + 103c 1337 PCI-X 266MHz 10GigE SR [AD385A] + 10a9 8021 Single Port 10-Gigabit Ethernet II (PCI-X, Fiber) + 17d5 6020 Xframe II SR + 17d5 6021 Xframe II SR, Low Profile + 17d5 6022 Xframe E SR + 17d5 6420 Xframe II LR + 17d5 6421 Xframe II LR, Low Profile + 17d5 6422 Xframe E LR + 17d5 6c20 Xframe II CX4 + 17d5 6c21 Xframe II CX4, Low Profile + 17d5 6c22 Xframe E CX4 + 5833 X3100 Series 10 Gigabit Ethernet PCIe + 17d5 6030 X3110 Single Port SR + 17d5 6031 X3120 Dual Port SR + 17d5 6430 X3110 Single Port LR + 17d5 6431 X3120 Dual Port LR + 17d5 7030 X3110 Single Port LRM + 17d5 7031 X3120 Dual Port LRM + 17d5 7430 X3110 Single Port 10GBase-T + 17d5 7431 X3120 Dual Port 10GBase-T + 17d5 7830 X3110 Single Port 10GBase-CR + 17d5 7831 X3120 Dual Port 10GBase-CR +17db Cray Inc + 0101 XT Series [Seastar] 3D Toroidal Router +17de KWorld Computer Co. Ltd. +17e4 Sectra AB + 0001 KK671 Cardbus encryption board + 0002 KK672 Cardbus encryption board +17e6 Entropic Communications Inc. + 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface) + 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface) + 0021 EN2210 [c.Link] MoCA Network Controller (Coax) + 0025 EN2510 [c.Link] MoCA Network Controller (Coax, PCIe interface) +17ee Connect Components Ltd +17f2 Albatron Corp. +17f3 RDC Semiconductor, Inc. + 1010 R1010 IDE Controller + 6020 R6020 North Bridge + 6021 R6021 Host Bridge + 6030 R6030 ISA Bridge + 6031 R6031 ISA Bridge + 6040 R6040 MAC Controller + 6060 R6060 USB 1.1 Controller + 6061 R6061 USB 2.0 Controller +17f7 Topdek Semiconductor Inc. +17fe Linksys, A Division of Cisco Systems + 2120 WMP11v4 802.11b PCI card + 2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01) + 17fe 2220 WPC54G ver. 4 +17ff Benq Corporation +1803 ProdaSafe GmbH +1805 Euresys S.A. +1809 Lumanate, Inc. +1813 Ambient Technologies Inc + 4000 HaM controllerless modem + 16be 0001 V9x HAM Data Fax Modem + 4100 HaM plus Data Fax Modem + 16be 0002 V9x HAM 1394 +1814 RaLink + 0101 Wireless PCI Adapter RT2400 / RT2460 + 1043 0127 WiFi-b add-on Card + 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card + 0200 RT2500 802.11g PCI [PC54G2] + 0201 RT2500 802.11g Cardbus/mini-PCI + 1043 130f WL-130g + 1371 001e CWC-854 Wireless-G CardBus Adapter + 1371 001f CWM-854 Wireless-G Mini PCI Adapter + 1371 0020 CWP-854 Wireless-G PCI Adapter + 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter + 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter + 1462 6833 Unknown 802.11g mini-PCI Adapter + 1462 6835 Wireless 11G CardBus CB54G2 + 1737 0032 WMP54G 2.0 PCI Adapter + 1799 700a F5D7000 Wireless G Desktop Network Card + 1799 701a F5D7010 Wireless G Notebook Network Card + 185f 22a0 CN-WF513 Wireless Cardbus Adapter + 0300 Wireless Adapter Canyon CN-WF511 + 0301 RT2561/RT61 802.11g PCI + 1186 3c08 DWL-G630 Rev E + 1186 3c09 DWL-G510 Rev C + 13d1 abe3 miniPCI Pluscom 802.11 a/b/g + 1458 e934 GN-WP01GS + 1737 0055 WMP54G ver 4.1 + 1814 2561 EW-7108PCg + 0302 RT2561/RT61 rev B 802.11g + 1186 3c08 DWL-G630 Rev E + 1186 3c09 AirPlus G DWL-G510 Wireless Network Adapter (Rev.C) + 1462 b834 PC54G3 Wireless 11g PCI Card + 0401 RT2600 802.11 MIMO + 0601 RT2800 802.11n PCI + 0681 RT2860 Wireless 802.11n PCIe + 0701 RT2760 Wireless 802.11n 1T/2R Cardbus + 0781 RT2860 + 3090 RT3090 Wireless 802.11n 1T/1R PCIe + 3091 RT3091 Wireless 802.11n 1T/2R PCIe + 3092 RT3092 Wireless 802.11n 2T/2R PCIe + e932 RT2560F 802.11 b/g PCI +1815 Devolo AG +1820 InfiniCon Systems Inc. +1822 Twinhan Technology Co. Ltd + 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0] +182d SiteCom Europe BV +# HFC-based ISDN card + 3069 ISDN PCI DC-105V2 + 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3] +182e Raza Microelectronics, Inc. + 0008 XLR516 Processor +# Strange vendor ID used by BCM5785 when in RAID mode +182f Broadcom +# HT1000 uses 3 IDs 1166:024a (Native SATA Mode), 1166:024b (PATA/IDE Mode), 182f:000b (RAID Mode) depends on SATA BIOS setting + 000b BCM5785 [HT1000] SATA (RAID Mode) +1830 Credence Systems Corporation +183b MikroM GmbH + 08a7 MVC100 DVI + 08a8 MVC101 SDI + 08a9 MVC102 DVI+Audio + 08b0 MVC200-DC +1849 ASRock Incorporation +184a Thales Computers +1851 Microtune, Inc. +1852 Anritsu Corp. +1853 SMSC Automotive Infotainment System Group +1854 LG Electronics, Inc. +185b Compro Technology, Inc. +185f Wistron NeWeb Corp. +1864 SilverBack + 2110 ISNAP 2110 +1867 Topspin Communications + 5a44 MT23108 InfiniHost HCA + 5a45 MT23108 InfiniHost HCA flash recovery + 5a46 MT23108 InfiniHost HCA bridge + 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) + 6282 MT25208 InfiniHost III Ex +186c Humusoft, s.r.o. + 0612 AD612 Data Acquisition Device + 0614 MF614 Multifunction I/O Card + 0622 AD622 Data Acquisition Device + 0624 MF624 Multifunction I/O Card + 0625 MF625 3-phase Motor Driver +186f WiNRADiO Communications +1876 L-3 Communications + a101 VigraWATCH PCI + a102 VigraWATCH PMC + a103 Vigra I/O +187e ZyXEL Communication Corporation + 3403 ZyAir G-110 802.11g + 340e M-302 802.11g XtremeMIMO +1885 Avvida Systems Inc. +1888 Varisys Ltd + 0301 VMFX1 FPGA PMC module + 0601 VSM2 dual PMC carrier + 0710 VS14x series PowerPC PCI board + 0720 VS24x series PowerPC PCI board +188a Ample Communications, Inc +1890 Egenera, Inc. +1894 KNC One +1896 B&B Electronics Manufacturing Company, Inc. + 4202 MIport 3PCIU2 2-port Serial + 4204 MIport 3PCIU4 4-port Serial + 4208 MIport 3PCIU8 8-port Serial + 4211 MIport 3PCIOU1 1-port Isolated Serial + 4212 MIport 3PCIOU2 2-port Isolated Serial + 4214 MIport 3PCIOU4 4-port Isolated Serial + bb10 3PCI2 2-Port Serial + bb11 3PCIO1 1-Port Isolated Serial +1897 AMtek +18a1 Astute Networks Inc. +18a3 AT&T +18ac DViCO Corporation + d500 FusionHDTV 5 + d800 FusionHDTV 3 Gold + d810 FusionHDTV 3 Gold-Q + d820 FusionHDTV 3 Gold-T + db30 FusionHDTV DVB-T Pro + db40 FusionHDTV DVB-T Hybrid + db78 FusionHDTV DVB-T Dual Express +18b8 Ammasso + b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor +18bc Info-Tek Corp. +18c3 Micronas Semiconductor Holding AG +# Nee Octigabay System +18c8 Cray Inc +18c9 ARVOO Engineering BV +18ca XGI Technology Inc. (eXtreme Graphics Innovation) + 0020 Z7/Z9 (XG20 core) + 0021 Z9s/Z9m (XG21 core) +# duh! Device name, not my name :) + 0027 Z11/Z11M + 0040 Volari V3XT/V5/V8 + 0047 Volari 8300 (chip: XP10, codename: XG47) +18d2 Sitecom +# Sitecom HFC-S based ISDN controller card DC-105v2 + 3069 DC-105v2 ISDN controller +18d8 Dialogue Technology Corp. +18dd Artimi Inc + 4c6f Artimi RTMI-100 UWB adapter +18e6 MPL AG + 0001 OSCI [Octal Serial Communication Interface] +18eb Advance Multimedia Internet Technology, Inc. +18ec Cesnet, z.s.p.o. + 6d05 ML555 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c006 COMBO6 + 18ec d001 COMBO-4MTX + 18ec d002 COMBO-4SFP + 18ec d003 COMBO-4SFPRO + 18ec d004 COMBO-2XFP + c032 COMBO-LXT110 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c045 COMBO6E + c050 COMBO-PTM + c058 COMBO6X + 18ec d001 COMBO-4MTX + 18ec d002 COMBO-4SFP + 18ec d003 COMBO-4SFPRO + 18ec d004 COMBO-2XFP + c132 COMBO-LXT155 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c232 COMBO-FXT100 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design +18ee Chenming Mold Ind. Corp. +18f1 Spectrum GmbH +18f4 Napatech A/S + 0051 NT20-X Capture Card + 0061 NT20E Capture Card + 0071 NT4E Capture Card + 0081 NT4E 8-port Expansion Card + 0091 NT20X Capture Card [New Rev] +18f6 NextIO + 1000 [Nexsis] Switch Virtual P2P PCIe Bridge + 1050 [Nexsis] Switch Virtual P2P PCI Bridge + 2000 [Nexsis] Switch Integrated Mgmt. Endpoint +18f7 Commtech, Inc. + 0001 Fastcom ESCC-PCI-335 + 0002 Fastcom 422/4-PCI-335 + 0003 Fastcom 232/4-1M-PCI + 0004 Fastcom 422/2-PCI-335 + 0005 Fastcom IGESCC-PCI-ISO/1 + 000a Fastcom 232/4-PCI-335 + 000f Fastcom FSCC + 0010 Fastcom GSCC +# Dual Serocco + 0011 Fastcom QSSB + 0014 SuperFSCC + 0015 SuperFSCC-104 + 0016 Fastcom FSCC-232 + 0017 SuperFSCC-104-NOUART +18fb Resilience Corporation +1904 Hangzhou Silan Microelectronics Co., Ltd. + 2031 SC92031 PCI Fast Ethernet Adapter + 8139 RTL8139D [Realtek] PCI 10/100BaseTX ethernet adaptor +1905 Micronas USA, Inc. +1912 Renesas Technology Corp. + 0002 SH7780 PCI Controller (PCIC) +1919 Soltek Computer Inc. +1923 Sangoma Technologies Corp. + 0040 A200/Remora FXO/FXS Analog AFT card + 0100 A104d QUAD T1/E1 AFT card + 0300 A101 single-port T1/E1 + 0400 A104u Quad T1/E1 AFT +# nee Level 5 Networks +1924 Solarflare Communications + 0703 SFC4000 rev A net [Solarstorm] + 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0101 SFE4001-A1 + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0301 SFE4003-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + 0710 SFC4000 rev B [Solarstorm] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + 1924 5102 SFN4111T-A2 + 1924 5103 SFN4111T-R3 + 1924 5104 SFN4111T-R4 + 1924 5105 SFN4111T-R5 + 1924 5201 SFN4112F-R1 + 1924 5202 SFN4112F-R2 + 0803 SFL9021 [Solarstorm] + 1924 6200 SFN5122F-R0 + 6703 SFC4000 rev A iSCSI/Onload [Solarstorm] + 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0101 SFE4001-A1 + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0301 SFE4003-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + c101 EF1-21022T [EtherFabric] +192e TransDimension +1931 Option N.V. + 000c Qualcomm MSM6275 UMTS chip +1932 DiBcom +193c MAXIM Integrated Products +193f Comtech AHA Corp. + 0001 AHA36x-PCIX + 0363 AHA363-PCIe + 0364 AHA364-PCIe + 0367 AHA367-PCIe +1942 ClearSpeed Technology plc + e511 Advance X620 accelerator card + e521 Advance e620 accelerator card +1947 C-guys, Inc. + 4743 CG200 Dual SD/SDIO Host controller device +194a DapTechnology B.V. + 1111 FireSpy3850 + 1112 FireSpy450b + 1113 FireSpy450bT + 1114 FireSpy850 + 1115 FireSpy850bT +1954 Curtis, Inc. +1957 Freescale Semiconductor Inc + 0012 MPC8548E + 0013 MPC8548 + 0014 MPC8543E + 0015 MPC8543 + 0018 MPC8547E + 0019 MPC8545E + 001a MPC8545 + 0020 MPC8568E + 0021 MPC8568 + 0022 MPC8567E + 0023 MPC8567 + 0030 MPC8533E + 0031 MPC8533 + 0032 MPC8544E + 0033 MPC8544 + 0040 MPC8572E + 0041 MPC8572 + 0050 MPC8536E + 0051 MPC8536 + 0052 MPC8535E + 0053 MPC8535 + 0060 MPC8569 + 0061 MPC8569E + 0070 P2020E + 0071 P2020 + 0080 MPC8349E + 0081 MPC8349 + 0082 MPC8347E TBGA + 0083 MPC8347 TBGA + 0084 MPC8347E PBGA + 0085 MPC8347 PBGA + 0086 MPC8343E + 0087 MPC8343 + 7010 MPC8641 PCI Host Bridge + 7011 MPC8641D PCI Host Bridge + 7018 MPC8610 +1958 Faster Technology, LLC. +1959 PA Semi, Inc + a000 PA6T Core + a001 PWRficient Host Bridge + a002 PWRficient PCI-Express Port + a003 PWRficient SMBus Controller + a004 PWRficient 16550 UART + a005 PWRficient Gigabit Ethernet + a006 PWRficient 10-Gigabit Ethernet + a007 PWRficient DMA Controller + a008 PWRficient LPC/Localbus Interface + a009 PWRficient L2 Cache + a00a PWRficient DDR2 Memory Controller + a00b PWRficient SERDES + a00c PWRficient System/Debug Controller + a00d PWRficient PCI-Express Internal Endpoint +1966 Orad Hi-Tec Systems + 1975 DVG64 family +1969 Attansic Technology Corp. + 1026 Atheros AR8121/AR8113/AR8114 PCI-E Ethernet Controller + 1043 8304 P5KPL-CM Motherboard + 1048 L1 Gigabit Ethernet Adapter + 1043 8226 P5KPL-VM Motherboard + 1062 Atheros AR8132 / L1c Gigabit Ethernet Adapter + 1066 L2c Gigabit Ethernet Adapter + 1067 L1c Gigabit Ethernet Adapter + 2048 L2 100 Mbit Ethernet Adapter +196a Sensory Networks Inc. + 0101 NodalCore C-1000 Content Classification Accelerator + 0102 NodalCore C-2000 Content Classification Accelerator + 0105 NodalCore C-3000 Content Classification Accelerator +196d Club-3D BV +1971 AGEIA Technologies, Inc. + 1011 Physics Processing Unit [PhysX] + 1043 0001 PhysX P1 +1974 TransferZentrum Mikroelektronik +1977 Parsec +197b JMicron Technology Corp. + 0250 JMC250 PCI Express Gigabit Ethernet Controller + 0260 JMC260 PCI Express Fast Ethernet Controller + 2360 JMB360 AHCI Controller + 2361 JMB361 AHCI/IDE + 1462 7235 P965 Neo MS-7235 mainboard + 2363 JMB362/JMB363 AHCI Controller + 1043 81e4 P5B [JMB363] + 1458 b000 GA-EP45-DS5 Motherboard + 1849 2363 Motherboard (one of many) + 2365 JMB365 AHCI/IDE + 2366 JMB366 AHCI/IDE + 2368 JMB368 IDE controller + 2380 IEEE 1394 Host Controller + 2381 Standard SD Host Controller + 2382 SD/MMC Host Controller + 2383 MS Host Controller + 2384 xD Host Controller + 2386 Standard SD Host Controller + 2387 SD/MMC Host Controller + 2388 MS Host Controller + 2389 xD Host Controller +1982 Distant Early Warning Communications Inc + 1600 OX16C954 HOST-A + 16ff OX16C954 HOST-B +1989 Montilio Inc. + 0001 RapidFile Bridge + 8001 RapidFile +198a Nallatech Ltd. +1993 Innominate Security Technologies AG +199a Pulse-LINK, Inc. +199f Auvitek + 8501 AU85X1 PCI REV1.1 +19a2 ServerEngines Corp. + 0200 BladeEngine 10Gb PCI-E iSCSI adapter + 0201 BladeEngine 10Gb PCIe Network Adapter + 0211 BladeEngine2 10Gb Gen2 PCIe Network Adapter + 0212 BladeEngine2 10Gb Gen2 PCIe iSCSI Adapter + 0700 Emulex OneConnect 10Gb NIC + 0702 Emulex OneConnect 10Gb iSCSI Initiator + 0704 Emulex OneConnect 10Gb FCoE Initiator + 0710 Emulex OneConnect 10Gb NIC (be3) + 0712 Emulex OneConnect 10Gb iSCSI Initiator (be3) + 0714 Emulex OneConnect 10Gb FCoE Initiator (be3) +19a8 DAQDATA GmbH +19ac Kasten Chase Applied Research + 0001 ACA2400 Crypto Accelerator +19ae Progeny Systems Corporation + 0520 4135 HFT Interface Controller + 0521 Decimator +19c1 Exegy Inc. +# nee NextNet Wireless +19d1 Motorola Expedience +19d4 Quixant Limited +19da ZOTAC International (MCO) Ltd. +19de Pico Computing +19e2 Vector Informatik GmbH +19e3 DDRdrive LLC + dd52 DDRdrive X1 +19e7 NET (Network Equipment Technologies) + 1001 STIX DSP Card + 1002 STIX - 1 Port T1/E1 Card + 1003 STIX - 2 Port T1/E1 Card + 1004 STIX - 4 Port T1/E1 Card + 1005 STIX - 4 Port FXS Card +19ee Netronome Systems, Inc. +1a03 ASPEED Technology, Inc. + 2000 ASPEED Graphics Family +1a07 Kvaser AB + 0006 CAN interface PC104+ HS/HS + 0007 CAN interface PCIcanx II HS or HS/HS + 0008 CAN interface PCIEcan HS or HS/HS + 0009 CAN interface PCI104 HS/HS +1a08 Sierra semiconductor + 0000 SC15064 +1a0e DekTec Digital Video B.V. + 0069 DTA-105 +1a17 Force10 Networks, Inc. + 8002 PB-10GE-2P 10GbE Security Card +1a1d GFaI e.V. + 1a17 Meta Networks MTP-1G IDPS NIC +1a1e 3Leaf Systems, Inc. +1a22 Ambric Inc. +1a29 Fortinet, Inc. +1a2b Ascom AG + 0000 GESP v1.2 + 0001 GESP v1.3 + 0002 ECOMP v1.3 + 0005 ETP v1.4 + 000a ETP-104 v1.1 + 000e DSLP-104 v1.1 +1a51 Hectronic AB +1a56 Bigfoot Networks, Inc. +1a57 Highly Reliable Systems +1a58 Razer USA Ltd. +1a5d Celoxica +1a5e Aprius Inc. +1a5f System TALKS Inc. +1a68 VirtenSys Limited +1a71 XenSource, Inc. +1a73 Violin Memory, Inc + 0001 Mozart [Memory Appliance 1010] +1a76 Wavesat +1a77 Lightfleet Corporation +1a78 Virident Systems Inc. +1a84 Commex Technologies + 0001 Vulcan SP HT6210 10-Gigabit Ethernet (rev 02) +1a88 MEN Mikro Elektronik + 4d45 Multifunction IP core +1a8c Verigy Pte. Ltd. + 1100 E8001-66443 PCI Express CIC +1a8e DRS Technologies + 2090 Model 2090 PCI Express +1aa8 Ciprico, Inc. + 0009 RAIDCore Controller + 000a RAIDCore Controller +1aae Global Velocity, Inc. +1ab6 CalDigit, Inc. + 6201 RAID Card +1ab9 Espia Srl +1ade Spin Master Ltd. + 1501 Swipetech barcode scanner +1ae0 Google, Inc. +1ae8 Silicon Software GmbH + 0a40 microEnable IV-BASE x1 + 0a41 microEnable IV-FULL x1 + 0a44 microEnable IV-FULL x4 + 0e44 microEnable IV-GigE x4 +1aec Wolfson Microelectronics +1aed Fusion-io + 1003 ioDrive (NAND Flash Storage) + 1005 ioDIMM3 320GB +1aee Caustic Graphics Inc. +1af4 Qumranet, Inc. + 1000 Virtio network device + 1001 Virtio block device + 1002 Virtio memory balloon + 1003 Virtio console +1af5 Netezza Corp. +1afa J & W Electronics Co., Ltd. +1b13 Jaton Corp +1b1a K&F Computing Research Co. + 0e70 GRAPE +1b36 Red Hat, Inc. +1b3e Teradata Corp. + 1fa8 BYNET BIC2SE/X + 1b3e 00a3 BYNET BIC2SX + 1b3e 00c3 BYNET BIC2SE +1b40 Schooner Information Technology, Inc. +1b55 NetUP Inc. + 2a2c Dual DVB-S2-CI card +1c1c Symphony + 0001 82C101 +1d44 DPT + a400 PM2x24/PM3224 +1de1 Tekram Technology Co.,Ltd. + 0391 TRM-S1040 + 2020 DC-390 + 690c 690c + dc29 DC290 +# nee Tumsan Oy +1fc0 Ascom (Finland) Oy + 0300 E2200 Dual E1/Rawpipe Card + 0301 C5400 SHDSL/E1 Card +# nee PathScale, Inc +1fc1 QLogic, Corp. + 000d IBA6110 InfiniBand HCA + 0010 IBA6120 InfiniBand HCA +1fc9 Tehuti Networks Ltd. + 3009 10-Giga TOE SmartNIC + 3010 10-Giga TOE SmartNIC + 3014 10-Giga TOE SmartNIC 2-Port +1fce Cognio Inc. + 0001 Spectrum Analyzer PC Card (SAgE) +1fd4 SUNIX Co., Ltd. + 0001 Matrix multiport serial adapter +2000 Smart Link Ltd. + 2800 SmartPCI2800 V.92 PCI Soft DFT +2001 Temporal Research Ltd +2003 Smart Link Ltd. + 8800 LM-I56N +2004 Smart Link Ltd. +2116 ZyDAS Technology Corp. +21c3 21st Century Computer Corp. +# (Probably only the Mobile Phone Division) +22b8 Motorola, Inc. +2304 Colorgraphic Communications Corp. +2348 Racore + 2010 8142 100VG/AnyLAN +2646 Kingston Technologies +270b Xantel Corporation +270f Chaintech Computer Co. Ltd +2711 AVID Technology Inc. +29b4 82q35 Express MEI Controller +2a15 3D Vision(???) +3000 Hansol Electronics Inc. +3142 Post Impression Systems. +3388 Hint Corp + 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller + 0014 HiNT HC4 PCI to ISDN bridge, Network controller + 0020 HB6 Universal PCI-PCI bridge (transparent mode) + 0021 HB6 Universal PCI-PCI bridge (non-transparent mode) + 1775 c200 C2K CompactPCI interface bridge + 1775 ce90 CE9 + 4c53 1050 CT7 mainboard + 4c53 1080 CT8 mainboard + 4c53 1090 Cx9 mainboard + 4c53 10a0 CA3/CR3 mainboard + 4c53 3010 PPCI mezzanine (32-bit PMC) + 4c53 3011 PPCI mezzanine (64-bit PMC) + 4c53 4000 PMCCARR1 carrier board + 0022 HiNT HB4 PCI-PCI Bridge (PCI6150) + 0026 HB2 PCI-PCI Bridge + 101a E.Band [AudioTrak Inca88] + 101b E.Band [AudioTrak Inca88] + 8011 VXPro II Chipset + 3388 8011 VXPro II Chipset CPU to PCI Bridge + 8012 VXPro II Chipset + 3388 8012 VXPro II Chipset PCI to ISA Bridge + 8013 VXPro II IDE + 3388 8013 VXPro II Chipset EIDE Controller + a103 Blackmagic Design DeckLink HD Pro +3411 Quantum Designs (H.K.) Inc +3442 Bihl+Wiedemann GmbH + 1783 AS-i 3.0 cPCI Master + 1922 AS-i 3.0 PCI Master +3475 Arastra Inc. +3513 ARCOM Control Systems Ltd +3842 eVga.com. Corp. +38ef 4Links +3d3d 3DLabs + 0001 GLINT 300SX + 0002 GLINT 500TX + 0000 0000 GLoria L + 0003 GLINT Delta + 0000 0000 GLoria XL + 0004 Permedia + 0005 Permedia + 0006 GLINT MX + 0000 0000 GLoria XL + 1048 0a42 GLoria XXL + 0007 3D Extreme + 0008 GLINT Gamma G1 + 1048 0a42 GLoria XXL + 0009 Permedia II 2D+3D + 1040 0011 AccelStar II + 1048 0a42 GLoria XXL + 13e9 1000 6221L-4U + 3d3d 0100 AccelStar II 3D Accelerator + 3d3d 0111 Permedia 3:16 + 3d3d 0114 Santa Ana + 3d3d 0116 Oxygen GVX1 + 3d3d 0119 Scirocco + 3d3d 0120 Santa Ana PCL + 3d3d 0125 Oxygen VX1 + 3d3d 0127 Permedia3 Create! + 000a GLINT R3 + 3d3d 0121 Oxygen VX1 + 000c GLINT R3 [Oxygen VX1] + 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4] + 000d GLint R4 rev A + 000e GLINT Gamma G2 + 0011 GLint R4 rev B + 0012 GLint R5 rev A + 0013 GLint R5 rev B + 0020 VP10 visual processor + 0022 VP10 visual processor + 0024 VP9 visual processor + 002c Wildcat Realizm 100/200 + 0030 Wildcat Realizm 800 + 0032 Wildcat Realizm 500 + 0100 Permedia II 2D+3D + 07a1 Wildcat III 6210 + 07a2 Sun XVR-500 Graphics Accelerator + 07a3 Wildcat IV 7210 + 1004 Permedia + 3d04 Permedia + ffff Glint VGA +4005 Avance Logic Inc. + 0300 ALS300 PCI Audio Device + 0308 ALS300+ PCI Audio Device + 0309 PCI Input Controller + 1064 ALG-2064 + 2064 ALG-2064i + 2128 ALG-2364A GUI Accelerator + 2301 ALG-2301 + 2302 ALG-2302 + 2303 AVG-2302 GUI Accelerator + 2364 ALG-2364A + 2464 ALG-2464 + 2501 ALG-2564A/25128A + 4000 ALS4000 Audio Chipset + 4005 4000 ALS4000 Audio Chipset + 4710 ALC200/200P +4033 Addtron Technology Co, Inc. + 1360 RTL8139 Ethernet +4040 NetXen Incorporated + 0001 NXB-10GXSR 10-Gigabit Ethernet PCIe Adapter with SR-XFP optical interface + 103c 7047 NC510F PCIe 10-Gigabit Server Adapter + 0002 NXB-10GCX4 10-Gigabit Ethernet PCIe Adapter with CX4 copper interface + 103c 7048 NC510c PCIe 10-Gigabit Server Adapter + 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface + 0004 BladeCenter-H 10-Gigabit Ethernet High Speed Daughter Card + 0005 NetXen Dual Port 10GbE Multifunction Adapter for c-Class + 103c 170e NC512m Dual Port 10GbE Multifunction BL-C Adapter + 0024 XG Mgmt + 0025 XG Mgmt + 0100 NX3031 Multifunction 1/10-Gigabit Server Adapter + 103c 171b NC522m Dual Port 10GbE Multifunction BL-c Adapter + 103c 3251 NC375i 1G w/NC524SFP 10G Module + 103c 705a NC375i Integrated Quad Port Multifunction Gigabit Server Adapter + 103c 705b NC522SFP Dual Port 10GbE Server Adapter + 152d 896b TG20 Dual Port 10GbE Server/Storage Adapter + 4040 0124 NX3031 Quad Port Gigabit Server Adapter + 4040 0126 Dual Port SFP+ 10GbE Server Adapter +4143 Digital Equipment Corp +4144 Alpha Data + 0044 ADM-XRCIIPro +4150 ONA Electroerosion + 0001 PCI32TLITE FILSTRUP1 PCI to VME Bridge Controller + 0006 PCI32TLITE UART 16550 Opencores + 0007 PCI32TLITE CAN Controller Opencores +415a Auzentech, Inc. +416c Aladdin Knowledge Systems + 0100 AladdinCARD + 0200 CPC +4321 Tata Power Strategic Electronics Division +434e CAST Navigation LLC +4444 Internext Compression Inc + 0016 iTVC16 (CX23416) MPEG-2 Encoder + 0070 0003 WinTV PVR 250 + 0070 0009 WinTV PVR 150 + 0070 0801 WinTV PVR 150 + 0070 0807 WinTV PVR 150 + 0070 4001 WinTV PVR 250 + 0070 4009 WinTV PVR 250 + 0070 4801 WinTV PVR 250 + 0070 4803 WinTV PVR 250 + 0070 8003 WinTV PVR 150 + 0070 8801 WinTV PVR 150 + 0070 c801 WinTV PVR 150 + 0070 e807 WinTV PVR 500 (1st unit) + 0070 e817 WinTV PVR 500 (2nd unit) + 0070 ff92 WiNTV PVR-550 + 0270 0801 WinTV PVR 150 + 104d 013d ENX-26 TV Encoder + 10fc d038 GV-MVP/RX2W (1st unit) + 10fc d039 GV-MVP/RX2W (2nd unit) + 12ab fff3 MPG600 + 12ab ffff MPG600 + 1461 c00a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK3 tuner) + 1461 c00b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK3 tuner) + 1461 c00c M113 PCI Analog TV (NTSC, JAPAN version, Philips FI1286MK2 tuner) + 1461 c010 M113 PCI Analog TV (NTSC, Philips FI1236MK3 tuner) + 1461 c011 M113 PCI Analog TV (NTSC+FM, Philips FM1236MK3 tuner) + 1461 c018 M113 PCI Analog TV (NTSC, Philips FQ1236MK5 tuner) + 1461 c019 UltraTV 1500 MCE, a.k.a. M113 PCI Analog TV (NTSC+FM, Philips FQ1236MK5 tuner) + 1461 c01a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK5 tuner) + 1461 c01b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK5 tuner) + 1461 c030 M113 PCI Analog TV (NTSC-J, Partsnic tuner) + 1461 c031 M113 PCI Analog TV (NTSC-J+FM, Partsnic tuner) + 1461 c032 M113 PCI Analog TV (PAL/SECAM, Partsnic tuner) + 1461 c033 M113 PCI Analog TV (PAL/SECAM+FM, Partsnic tuner) + 1461 c034 M113 PCI Analog TV (NTSC, Partsnic tuner) + 1461 c035 M113 PCI Analog TV (NTSC+FM, Partsnic tuner) + 1461 c03f C115 PCI video capture card (no tuner) + 1461 c136 M104 mini-PCI Analog TV + 1461 c20a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK3 tuner) + 1461 c218 M755 AVerTV Video Capture (NTSC, Philips FQ1236MK5 tuner) + 1461 c219 M755 AVerTV Video Capture (NTSC+FM, Philips FQ1236MK5 tuner) + 1461 c21a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK5 tuner) + 1461 c21b M755 AVerTV Video Capture (PAL/SECAM+FM, Philips FM1216MK5 tuner) + 1461 c230 M755 AVerTV Video Capture (NTSC-J, Partsnic tuner) + 1461 c231 M755 AVerTV Video Capture (NTSC-J+FM, Partsnic tuner) + 1461 c232 M755 AVerTV Video Capture (PAL/SECAM, Partsnic tuner) + 1461 c233 M755 AVerTV Video Capture (PAL/SECAM+FM, Partsnic tuner) + 1461 c234 M755 AVerTV Video Capture (NTSC, Partsnic tuner) + 1461 c235 M755 AVerTV Video Capture (NTSC+FM, Partsnic tuner) + 1461 c337 E106 AVerMedia AVerTV Video Capture + 1461 c439 M116 AVerMedia AVerTV MCE 116 Plus (NTSC/PAL/SECAM+FM+REMOTE, Xceive 2028 tuner) + 1461 c5ff C755 AVerTV Video Capture card (no tuner) + 1461 c6ff C115 PCI video capture card (no tuner) + 1461 c739 M785 AVerMedia PCI Analog TV (NTSC/PAL/SECAM+FM, Xceive 2028 tuner) + 9005 0092 VideOh! AVC-2010 + 9005 0093 VideOh! AVC-2410 + 0803 iTVC15 MPEG-2 Encoder + 0070 4000 WinTV PVR-350 + 0070 4001 WinTV PVR-250 + 0070 4800 WinTV PVR-350 (V1) + 12ab 0000 MPG160 + 1461 a3ce M179 + 1461 a3cf M179 +4468 Bridgeport machines +4594 Cogetec Informatique Inc +45fb Baldor Electric Company +4624 Budker Institute of Nuclear Physics + adc1 ADC200ME High speed ADC + de01 DL200ME High resolution delay line PCI based card + de02 DL200ME Middle resolution delay line PCI based card +4680 Umax Computer Corp +4843 Hercules Computer Technology Inc +4916 RedCreek Communications Inc + 1960 RedCreek PCI adapter +4943 Growth Networks +494f ACCES I/O Products, Inc. + 0520 PCI-IDO-48 + 0920 PCI-IDI-48 + 0c50 PCI-DIO-24H + 0c51 PCI-DIO-24D + 0c60 PCI-DIO-48(H) + 0c68 PCI-DIO-72 + 0c70 PCI-DIO-96 + 0c78 PCI-DIO-120 + 0dc8 PCI-IDIO-16 + 0e50 PCI-DIO-24S + 0e51 PCI-DIO-24H(C) + 0e52 PCI-DIO-24D(C) + 0e60 PCI-DIO-48S(H) + 0e61 P104-DIO-24S + 0f00 PCI-IIRO-8 + 0f01 LPCI-IIRO-8 + 0f08 PCI-IIRO-16 + 1050 PCI-422/485-2 + 1058 PCI-COM422/4 + 1059 PCI-COM485/4 + 1068 PCI-COM422/8 + 1069 PCI-COM485/8 + 1088 PCI-COM232/1 + 1090 PCI-COM232/2 + 10a8 P104-COM232-8 + 10c9 PCI-COM-1S + 10d0 PCI-COM2S + 10e8 PCI-COM-8SM + 1148 PCI-ICM-1S + 1150 PCI-ICM-2S + 1158 PCI-ICM422/4 + 1159 PCI-ICM485/4 + 1250 PCI-WDG-2S + 12d0 PCI-WDG-IMPAC + 22c0 PCI-WDG-CSM + 2c50 PCI-DIO-96CT + 2c58 PCI-DIO-96C3 + 5ed0 PCI-DAC + 6c90 PCI-DA12-2 + 6c98 PCI-DA12-4 + 6ca0 PCI-DA12-6 + 6ca8 PCI-DA12-8 + 6ca9 PCI-DA12-8V + 6cb0 PCI-DA12-16 + 6cb1 PCI-DA12-16V + 8ef0 P104-FAS16-16 + aca8 PCI-AI12-16 + aca9 PCI-AI12-16A + eca8 PCI-AIO12-16 + eca9 PCI-A12-16 + ecaa PCI-A12-16A + ece8 PCI-A16-16 +4978 Axil Computer Inc +4a14 NetVin + 5000 NV5000SC + 4a14 5000 RT8029-Based Ethernet Adapter +4b10 Buslogic Inc. +4c48 LUNG HWA Electronics +4c53 SBS Technologies + 0000 PLUSTEST device + 4c53 3000 PLUSTEST card (PC104+) + 4c53 3001 PLUSTEST card (PMC) + 0001 PLUSTEST-MM device + 4c53 3002 PLUSTEST-MM card (PMC) +4ca1 Seanix Technology Inc +4d51 MediaQ Inc. + 0200 MQ-200 +4d54 Microtechnica Co Ltd +4d56 MATRIX VISION GmbH + 0000 [mvHYPERION-CLe/CLb] CameraLink PCI Express x1 Frame Grabber + 0001 [mvHYPERION-CLf/CLm] CameraLink PCI Express x4 Frame Grabber + 0010 [mvHYPERION-16R16/-32R16] 16 Video Channel PCI Express x4 Frame Grabber +4ddc ILC Data Device Corp + 0100 DD-42924I5-300 (ARINC 429 Data Bus) + 0801 BU-65570I1 MIL-STD-1553 Test and Simulation + 0802 BU-65570I2 MIL-STD-1553 Test and Simulation + 0811 BU-65572I1 MIL-STD-1553 Test and Simulation + 0812 BU-65572I2 MIL-STD-1553 Test and Simulation + 0881 BU-65570T1 MIL-STD-1553 Test and Simulation + 0882 BU-65570T2 MIL-STD-1553 Test and Simulation + 0891 BU-65572T1 MIL-STD-1553 Test and Simulation + 0892 BU-65572T2 MIL-STD-1553 Test and Simulation + 0901 BU-65565C1 MIL-STD-1553 Data Bus + 0902 BU-65565C2 MIL-STD-1553 Data Bus + 0903 BU-65565C3 MIL-STD-1553 Data Bus + 0904 BU-65565C4 MIL-STD-1553 Data Bus + 0b01 BU-65569I1 MIL-STD-1553 Data Bus + 0b02 BU-65569I2 MIL-STD-1553 Data Bus + 0b03 BU-65569I3 MIL-STD-1553 Data Bus + 0b04 BU-65569I4 MIL-STD-1553 Data Bus +5045 University of Toronto + 4243 BLASTbus PCI Interface Card v1 +5046 GemTek Technology Corporation + 1001 PCI Radio +5053 Voyetra Technologies + 2010 Daytona Audio Adapter +50b2 TerraTec Electronic GmbH + 1111 Terratec XLerate +5136 S S Technologies +5143 Qualcomm Inc +5145 Ensoniq (Old) + 3031 Concert AudioPCI +5168 Animation Technologies Inc. + 0300 FlyDVB-S + 0301 FlyDVB-T +5301 Alliance Semiconductor Corp. + 0001 ProMotion aT3D +5333 S3 Inc. + 0551 Plato/PX (system) + 5631 86c325 [ViRGE] + 8800 86c866 [Vision 866] + 8801 86c964 [Vision 964] + 8810 86c764_0 [Trio 32 vers 0] + 8811 86c764/765 [Trio32/64/64V+] + 8812 86cM65 [Aurora64V+] + 8813 86c764_3 [Trio 32/64 vers 3] + 8814 86c767 [Trio 64UV+] + 8815 86cM65 [Aurora 128] + 883d 86c988 [ViRGE/VX] + 8870 FireGL + 8880 86c868 [Vision 868 VRAM] vers 0 + 8881 86c868 [Vision 868 VRAM] vers 1 + 8882 86c868 [Vision 868 VRAM] vers 2 + 8883 86c868 [Vision 868 VRAM] vers 3 + 88b0 86c928 [Vision 928 VRAM] vers 0 + 88b1 86c928 [Vision 928 VRAM] vers 1 + 88b2 86c928 [Vision 928 VRAM] vers 2 + 88b3 86c928 [Vision 928 VRAM] vers 3 + 88c0 86c864 [Vision 864 DRAM] vers 0 + 88c1 86c864 [Vision 864 DRAM] vers 1 + 88c2 86c864 [Vision 864-P DRAM] vers 2 + 88c3 86c864 [Vision 864-P DRAM] vers 3 + 88d0 86c964 [Vision 964 VRAM] vers 0 + 88d1 86c964 [Vision 964 VRAM] vers 1 + 88d2 86c964 [Vision 964-P VRAM] vers 2 + 88d3 86c964 [Vision 964-P VRAM] vers 3 + 88f0 86c968 [Vision 968 VRAM] rev 0 + 88f1 86c968 [Vision 968 VRAM] rev 1 + 88f2 86c968 [Vision 968 VRAM] rev 2 + 88f3 86c968 [Vision 968 VRAM] rev 3 + 8900 86c755 [Trio 64V2/DX] + 5333 8900 86C775 Trio64V2/DX + 8901 86c775/86c785 [Trio 64V2/DX or /GX] + 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX + 8902 Plato/PX + 8903 Trio 3D business multimedia + 8904 Trio 64 3D + 1014 00db Integrated Trio3D + 4843 314a Terminator 128/3D GLH + 5333 8904 86C365 Trio3D AGP + 8905 Trio 64V+ family + 8906 Trio 64V+ family + 8907 Trio 64V+ family + 8908 Trio 64V+ family + 8909 Trio 64V+ family + 890a Trio 64V+ family + 890b Trio 64V+ family + 890c Trio 64V+ family + 890d Trio 64V+ family + 890e Trio 64V+ family + 890f Trio 64V+ family + 8a01 ViRGE/DX or /GX + 0e11 b032 ViRGE/GX + 10b4 1617 Nitro 3D + 10b4 1717 Nitro 3D + 5333 8a01 ViRGE/DX + 8a10 ViRGE/GX2 + 1092 8a10 Stealth 3D 4000 + 8a13 86c368 [Trio 3D/2X] + 5333 8a13 Trio3D/2X + 8a20 86c794 [Savage 3D] + 5333 8a20 86C391 Savage3D + 8a21 86c390 [Savage 3D/MV] + 5333 8a21 86C390 Savage3D/MV + 8a22 Savage 4 + 1033 8068 Savage 4 + 1033 8069 Savage 4 + 1033 8110 Savage 4 LT + 105d 0018 SR9 8Mb SDRAM + 105d 002a SR9 Pro 16Mb SDRAM + 105d 003a SR9 Pro 32Mb SDRAM + 105d 092f SR9 Pro+ 16Mb SGRAM + 1092 4207 Stealth III S540 + 1092 4800 Stealth III S540 + 1092 4807 SpeedStar A90 + 1092 4808 Stealth III S540 + 1092 4809 Stealth III S540 + 1092 480e Stealth III S540 + 1092 4904 Stealth III S520 + 1092 4905 SpeedStar A200 + 1092 4a09 Stealth III S540 + 1092 4a0b Stealth III S540 Xtreme + 1092 4a0f Stealth III S540 + 1092 4e01 Stealth III S540 + 1102 101d 3d Blaster Savage 4 + 1102 101e 3d Blaster Savage 4 + 5333 8100 86C394-397 Savage4 SDRAM 100 + 5333 8110 86C394-397 Savage4 SDRAM 110 + 5333 8125 86C394-397 Savage4 SDRAM 125 + 5333 8143 86C394-397 Savage4 SDRAM 143 + 5333 8a22 86C394-397 Savage4 + 5333 8a2e 86C394-397 Savage4 32bit + 5333 9125 86C394-397 Savage4 SGRAM 125 + 5333 9143 86C394-397 Savage4 SGRAM 143 + 8a23 Savage 4 + 8a25 ProSavage PM133 + 0303 0303 D9840-60001 [Brio BA410 Motherboard] + 8a26 ProSavage KM133 + 8c00 ViRGE/M3 + 8c01 ViRGE/MX + 1179 0001 ViRGE/MX + 8c02 ViRGE/MX+ + 8c03 ViRGE/MX+MV + 8c10 86C270-294 Savage/MX-MV + 8c11 82C270-294 Savage/MX + 8c12 86C270-294 Savage/IX-MV + 1014 017f ThinkPad T20/T22 + 1179 0001 86C584 SuperSavage/IXC Toshiba + 8c13 86C270-294 Savage/IX + 1179 0001 Magnia Z310 + 8c22 SuperSavage MX/128 + 8c24 SuperSavage MX/64 + 8c26 SuperSavage MX/64C + 8c2a SuperSavage IX/128 SDR + 8c2b SuperSavage IX/128 DDR + 8c2c SuperSavage IX/64 SDR + 8c2d SuperSavage IX/64 DDR + 8c2e SuperSavage IX/C SDR + 1014 01fc ThinkPad T23 + 8c2f SuperSavage IX/C DDR + 8d01 86C380 [ProSavageDDR K4M266] + 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK) + 8d03 VT8751 [ProSavageDDR P4M266] + 8d04 VT8375 [ProSavage8 KM266/KL266] + 8e48 Chrome S27 PCIE + 5333 0130 Chrome S27 256M DDR2 + 9102 86C410 Savage 2000 + 1092 5932 Viper II Z200 + 1092 5934 Viper II Z200 + 1092 5952 Viper II Z200 + 1092 5954 Viper II Z200 + 1092 5a35 Viper II Z200 + 1092 5a37 Viper II Z200 + 1092 5a55 Viper II Z200 + 1092 5a57 Viper II Z200 + ca00 SonicVibes +544c Teralogic Inc + 0350 TL880-based HDTV/ATSC tuner +5455 Technische University Berlin + 4458 S5933 +5456 GoTView +5519 Cnet Technologies, Inc. +5544 Dunord Technologies + 0001 I-30xx Scanner Interface +5555 Genroco, Inc + 0003 TURBOstor HFP-832 [HiPPI NIC] +5654 VoiceTronix Pty Ltd +5700 Netpower +584d AuzenTech Co., Ltd. +5851 Exacq Technologies +5853 XenSource, Inc. + 0001 Xen Platform Device +5ace Beholder International Ltd. + 5050 BeholdTV 505 FM +631c SmartInfra Ltd + 1652 PXI-1652 Signal Generator + 2504 PXI-2504 Signal Interrogator +6356 UltraStor +6374 c't Magazin fuer Computertechnik + 6773 GPPCI +6409 Logitec Corp. +6549 Teradici Corp. +6666 Decision Computer International Co. + 0001 PCCOM4 + 0002 PCCOM8 + 0004 PCCOM2 + 0101 PCI 8255/8254 I/O Card + 0200 12-bit AD/DA Card + 0201 14-bit AD/DA Card + 1011 Industrial Card + 1021 8 photo couple 8 relay Card + 1022 4 photo couple 4 relay Card + 1025 16 photo couple 16 relay Card + 4000 WatchDog Card +6900 Qumranet +7063 pcHDTV + 2000 HD-2000 + 3000 HD-3000 + 5500 HD5500 HDTV +7284 HT OMEGA Inc. +7604 O.N. Electronic Co Ltd. +7bde MIDAC Corporation +7fed PowerTV +8008 Quancom Electronic GmbH + 0010 WDOG1 [PCI-Watchdog 1] + 0011 PWDOG2 [PCI-Watchdog 2] + 0015 Clock77/PCI & Clock77/PCIe (DCF-77 receiver) +# Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card. +807d Asustek Computer, Inc. +8086 Intel Corporation + 0007 82379AB + 0008 Extended Express System Support Controller + 0039 21145 Fast Ethernet + 0040 Clarkdake DRAM Controller + 0041 Clarkdale PCI Express x16 Root Port + 0042 Clarkdale Integrated Graphics Controller + 0043 Clarkdale Secondary PCI Express Root Port + 0044 Arrandale DRAM Controller + 0045 Arrandale PCI Express x16 Root Port + 0046 Arrandale Integrated Graphics Controller + 0047 Arrandale Secondary PCI Express Root Port + 0048 Arrandale/Clarkdale DRAM Controller + 0050 Arrandale/Clarkdale Thermal Management Controller + 0082 WiFi Link 6000 Series + 0083 WiFi Link 100 Series + 0084 WiFi Link 100 Series + 0085 WiFi Link 6000 Series + 0086 WiMAX/WiFi Link 6050 Series + 0087 WiMAX/WiFi Link 6050 Series + 0088 WiMAX/WiFi Link 6050 Series + 0089 WiMAX/WiFi Link 6050 Series + 0122 82437FX + 0309 80303 I/O Processor PCI-to-PCI Bridge + 030d 80312 I/O Companion Chip PCI-to-PCI Bridge + 0326 6700/6702PXH I/OxAPIC Interrupt Controller A + 1775 1100 CR11/VR11 Single Board Computer + 0327 6700PXH I/OxAPIC Interrupt Controller B + 1775 1100 CR11/VR11 Single Board Computer + 0329 6700PXH PCI Express-to-PCI Bridge A + 032a 6700PXH PCI Express-to-PCI Bridge B + 032c 6702PXH PCI Express-to-PCI Bridge A + 0330 80332 [Dobson] I/O processor (A-Segment Bridge) + 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC) + 0332 80332 [Dobson] I/O processor (B-Segment Bridge) + 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC) + 0334 80332 [Dobson] I/O processor (ATU) + 0335 80331 [Lindsay] I/O processor (PCI-X Bridge) + 0336 80331 [Lindsay] I/O processor (ATU) + 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge) + 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge) + 0370 80333 Segment-A PCI Express-to-PCI Express Bridge + 0371 80333 A-Bus IOAPIC + 0372 80333 Segment-B PCI Express-to-PCI Express Bridge + 0373 80333 B-Bus IOAPIC + 0374 80333 Address Translation Unit + 0482 82375EB/SB PCI to EISA Bridge + 0483 82424TX/ZX [Saturn] CPU to PCI bridge + 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge + 0486 82425EX/ZX [Aries] PCIset with ISA bridge + 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge + 04d0 82437FX [Triton FX] + 0500 E8870 Processor bus control + 0501 E8870 Memory controller +# and registers common to both SPs + 0502 E8870 Scalability Port 0 +# and global performance monitoring + 0503 E8870 Scalability Port 1 + 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port) + 0511 E8870IO Hub Interface Port 1 registers + 0512 E8870IO Hub Interface Port 2 registers + 0513 E8870IO Hub Interface Port 3 registers + 0514 E8870IO Hub Interface Port 4 registers + 0515 E8870IO General SIOH registers + 0516 E8870IO RAS registers + 0530 E8870SP Scalability Port 0 registers + 0531 E8870SP Scalability Port 1 registers + 0532 E8870SP Scalability Port 2 registers + 0533 E8870SP Scalability Port 3 registers + 0534 E8870SP Scalability Port 4 registers + 0535 E8870SP Scalability Port 5 registers +# (bi-interleave 0) and global registers that are neither per-port nor per-interleave + 0536 E8870SP Interleave registers 0 and 1 +# (bi-interleave 1) + 0537 E8870SP Interleave registers 2 and 3 + 0600 RAID Controller + 8086 0136 SRCU31L + 8086 01af SRCZCR + 8086 01c1 ICP Vortex GDT8546RZ + 8086 01f7 SCRU32 +# uninitialized SRCU32 RAID Controller + 061f 80303 I/O Processor + 0960 80960RP (i960RP) Microprocessor/Bridge + 0962 80960RM (i960RM) Bridge + 0964 80960RP (i960RP) Microprocessor/Bridge + 1000 82542 Gigabit Ethernet Controller (Fiber) + 0e11 b0df NC6132 Gigabit Ethernet Adapter (1000-SX) + 0e11 b0e0 NC6133 Gigabit Ethernet Adapter (1000-LX) + 0e11 b123 NC6134 Gigabit Ethernet Adapter (1000-LX) + 1014 0119 Netfinity Gigabit Ethernet SX Adapter + 8086 1000 PRO/1000 Gigabit Server Adapter + 1001 82543GC Gigabit Ethernet Controller (Fiber) + 0e11 004a NC6136 Gigabit Server Adapter + 1014 01ea Netfinity Gigabit Ethernet SX Adapter + 8086 1002 PRO/1000 F Server Adapter + 8086 1003 PRO/1000 F Server Adapter + 1002 Pro 100 LAN+Modem 56 Cardbus II + 8086 200e Pro 100 LAN+Modem 56 Cardbus II + 8086 2013 Pro 100 SR Mobile Combo Adapter + 8086 2017 Pro 100 S Combo Mobile Adapter + 1004 82543GC Gigabit Ethernet Controller (Copper) + 0e11 0049 NC7132 Gigabit Upgrade Module + 0e11 b1a4 NC7131 Gigabit Server Adapter + 1014 10f2 Gigabit Ethernet Server Adapter + 8086 1004 PRO/1000 T Server Adapter + 8086 2004 PRO/1000 T Server Adapter + 1008 82544EI Gigabit Ethernet Controller (Copper) + 1014 0269 iSeries 1000/100/10 Ethernet Adapter + 1028 011b PowerEdge 1650/2550 + 1028 011c PRO/1000 XT Network Connection + 8086 1107 PRO/1000 XT Server Adapter + 8086 2107 PRO/1000 XT Server Adapter + 8086 2110 PRO/1000 XT Desktop Adapter + 8086 3108 PRO/1000 XT Network Connection + 1009 82544EI Gigabit Ethernet Controller (Fiber) + 1014 0268 iSeries Gigabit Ethernet Adapter + 8086 1109 PRO/1000 XF Server Adapter + 8086 2109 PRO/1000 XF Server Adapter + 100a 82540EM Gigabit Ethernet Controller + 100c 82544GC Gigabit Ethernet Controller (Copper) + 8086 1112 PRO/1000 T Desktop Adapter + 8086 2112 PRO/1000 T Desktop Adapter + 100d 82544GC Gigabit Ethernet Controller (LOM) + 1028 0123 PRO/1000 XT Network Connection + 1079 891f 82544GC Based Network Connection + 4c53 1080 CT8 mainboard + 8086 110d 82544GC Based Network Connection + 100e 82540EM Gigabit Ethernet Controller + 1014 0265 PRO/1000 MT Network Connection + 1014 0267 PRO/1000 MT Network Connection + 1014 026a PRO/1000 MT Network Connection + 1028 002e Optiplex GX260 + 1028 0134 PowerEdge 600SC + 1028 0151 Optiplex GX270 + 107b 8920 PRO/1000 MT Desktop Adapter + 8086 001e PRO/1000 MT Desktop Adapter + 8086 002e PRO/1000 MT Desktop Adapter + 8086 1376 PRO/1000 GT Desktop Adapter + 8086 1476 PRO/1000 GT Desktop Adapter + 100f 82545EM Gigabit Ethernet Controller (Copper) + 1014 0269 iSeries 1000/100/10 Ethernet Adapter + 1014 028e PRO/1000 MT Network Connection + 15ad 0750 PRO/1000 MT Single Port Adapter + 8086 1000 PRO/1000 MT Network Connection + 8086 1001 PRO/1000 MT Server Adapter + 1010 82546EB Gigabit Ethernet Controller (Copper) + 0e11 00db NC7170 Gigabit Server Adapter + 1014 027c PRO/1000 MT Dual Port Network Adapter + 15ad 0760 PRO/1000 MT Dual Port Adapter + 18fb 7872 RESlink-X + 1fc1 0026 Niagara 2260 Bypass Card + 4c53 1080 CT8 mainboard + 4c53 10a0 CA3/CR3 mainboard + 8086 1011 PRO/1000 MT Dual Port Server Adapter + 8086 1012 PRO/1000 MT Dual Port Server Adapter + 8086 101a PRO/1000 MT Dual Port Network Connection + 8086 3424 SE7501HG2 Mainboard + 1011 82545EM Gigabit Ethernet Controller (Fiber) + 1014 0268 iSeries Gigabit Ethernet Adapter + 8086 1002 PRO/1000 MF Server Adapter + 8086 1003 PRO/1000 MF Server Adapter (LX) + 1012 82546EB Gigabit Ethernet Controller (Fiber) + 0e11 00dc NC6170 Gigabit Server Adapter + 8086 1012 PRO/1000 MF Dual Port Server Adapter + 1013 82541EI Gigabit Ethernet Controller + 8086 0013 PRO/1000 MT Network Connection + 8086 1013 PRO/1000 MT Network Connection + 8086 1113 PRO/1000 MT Desktop Adapter + 1014 82541ER Gigabit Ethernet Controller + 8086 0014 PRO/1000 MT Desktop Connection + 8086 1014 PRO/1000 MT Network Connection + 1015 82540EM Gigabit Ethernet Controller (LOM) + 8086 1015 PRO/1000 MT Mobile Connection + 1016 82540EP Gigabit Ethernet Controller (Mobile) + 1014 052c PRO/1000 MT Mobile Connection + 1179 0001 PRO/1000 MT Mobile Connection + 8086 1016 PRO/1000 MT Mobile Connection + 1017 82540EP Gigabit Ethernet Controller + 8086 1017 PR0/1000 MT Desktop Connection + 1018 82541EI Gigabit Ethernet Controller + 8086 1018 PRO/1000 MT Mobile Connection + 1019 82547EI Gigabit Ethernet Controller + 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE) + 1458 e000 Intel Gigabit Ethernet (Kenai II) + 8086 1019 ASUS PC-DL Deluxe mainboard (Socket 603) + 8086 301f D865PERL mainboard + 8086 3025 D875PBZ motherboard + 8086 302c Intel 82865G Mainboard (D865GBF) + 8086 3427 S875WP1-E mainboard + 101a 82547EI Gigabit Ethernet Controller (Mobile) + 8086 101a PRO/1000 CT Mobile Connection + 101d 82546EB Gigabit Ethernet Controller + 8086 1000 PRO/1000 MT Quad Port Server Adapter + 101e 82540EP Gigabit Ethernet Controller (Mobile) + 1014 0549 Thinkpad + 1179 0001 PRO/1000 MT Mobile Connection + 8086 101e PRO/1000 MT Mobile Connection + 1026 82545GM Gigabit Ethernet Controller + 1028 0169 Precision 470 + 8086 1000 PRO/1000 MT Server Connection + 8086 1001 PRO/1000 MT Server Adapter + 8086 1002 PRO/1000 MT Server Adapter + 8086 1003 PRO/1000 GT Server Adapter + 8086 1026 PRO/1000 MT Server Connection + 1027 82545GM Gigabit Ethernet Controller + 103c 3103 NC310F PCI-X Gigabit Server Adapter + 8086 1001 PRO/1000 MF Server Adapter(LX) + 8086 1002 PRO/1000 MF Server Adapter(LX) + 8086 1003 PRO/1000 MF Server Adapter(LX) + 8086 1027 PRO/1000 MF Server Adapter + 1028 82545GM Gigabit Ethernet Controller + 8086 1028 PRO/1000 MB Server Connection + 1029 82559 Ethernet Controller + 1030 82559 InBusiness 10/100 + 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller + 1014 0209 ThinkPad A/T/X Series + 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 813c Vaio PCG-GRV616G + 107b 5350 EtherExpress PRO/100 VE + 1179 0001 EtherExpress PRO/100 VE + 144d c000 EtherExpress PRO/100 VE + 144d c001 EtherExpress PRO/100 VE + 144d c003 EtherExpress PRO/100 VE + 144d c006 vpr Matrix 170B4 + 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller + 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller + 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller + 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller + 1036 82801CAM (ICH3) 82562EH Ethernet Controller + 1037 82801CAM (ICH3) Chipset Ethernet Controller + 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller + 0e11 0098 Evo N600c + 1039 82801DB PRO/100 VE (LOM) Ethernet Controller + 1014 0267 NetVista A30p + 114a 0582 PC8 onboard ethernet ETH1 + 103a 82801DB PRO/100 VE (CNR) Ethernet Controller + 103b 82801DB PRO/100 VM (LOM) Ethernet Controller + 103c 82801DB PRO/100 VM (CNR) Ethernet Controller + 103d 82801DB PRO/100 VE (MOB) Ethernet Controller + 1014 0522 ThinkPad R40 + 8086 103d 82562EZ 10/100 Ethernet Controller + 103e 82801DB PRO/100 VM (MOB) Ethernet Controller + 1040 536EP Data Fax Modem + 16be 1040 V.9X DSP Data Fax Modem + 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter + 103c 08b0 tc1100 tablet + 8086 2522 Samsung X10/P30 integrated WLAN + 8086 2527 MIM2000/Centrino + 8086 2561 Dell Latitude D800 + 8086 2581 Toshiba Satellite M10 + 1048 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE LR Server Adapter + 8086 a11f PRO/10GbE LR Server Adapter + 1049 82566MM Gigabit Network Connection + 103c 30c1 Compaq 6910p + 17aa 20b9 ThinkPad T61 + 104a 82566DM Gigabit Network Connection + 104b 82566DC Gigabit Network Connection + 104c 82562V 10/100 Network Connection + 104d 82566MC Gigabit Network Connection + 1050 82562EZ 10/100 Ethernet Controller + 1028 019d Dimension 3000 + 1462 728c 865PE Neo2 (MS-6728) + 1462 758c MS-6758 (875P Neo) + 8086 3020 D865PERL mainboard + 8086 302f Desktop Board D865GBF + 8086 3427 S875WP1-E mainboard + 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller + 1052 PRO/100 VM Network Connection + 1053 PRO/100 VM Network Connection + 1054 PRO/100 VE Network Connection + 1055 PRO/100 VM Network Connection + 1056 PRO/100 VE Network Connection + 1057 PRO/100 VE Network Connection + 1059 82551QM Ethernet Controller + 105b 82546GB Gigabit Ethernet Controller (Copper) + 105e 82571EB Gigabit Ethernet Controller + 103c 7044 NC360T PCI Express Dual Port Gigabit Server Adapter + 103c 704e Dual Port 1000Base-T (PCIe) [AD337A] + 1775 1100 CR11/VR11 Single Board Computer + 1775 6003 Telum GE-QT + 8086 005e PRO/1000 PT Dual Port Server Connection + 8086 105e PRO/1000 PT Dual Port Network Connection + 8086 10d5 82571PT Gigabit PT Quad Port Server ExpressModule + 8086 115e PRO/1000 PT Dual Port Server Adapter + 8086 125e PRO/1000 PT Dual Port Server Adapter + 8086 135e PRO/1000 PT Dual Port Server Adapter + 105f 82571EB Gigabit Ethernet Controller + 103c 704f Dual Port 1000Base-SX (PCIe) [AD338A] + 8086 005a PRO/1000 PF Dual Port Server Adapter + 8086 115f PRO/1000 PF Dual Port Server Adapter + 8086 125f PRO/1000 PF Dual Port Server Adapter + 8086 135f PRO/1000 PF Dual Port Server Adapter + 1060 82571EB Gigabit Ethernet Controller + 8086 0060 PRO/1000 PB Dual Port Server Connection + 8086 1060 PRO/1000 PB Dual Port Server Connection + 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller + 1043 80f8 P5GD1-VW Mainboard + 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller + 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller + 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller + 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile + 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile + 106a 82562G - PRO/100 VE (LOM) Ethernet Controller + 106b 82562G - PRO/100 VE Ethernet Controller Mobile + 1075 82547GI Gigabit Ethernet Controller + 1028 0165 PowerEdge 750 + 8086 0075 PRO/1000 CT Network Connection + 8086 1075 PRO/1000 CT Network Connection + 1076 82541GI Gigabit Ethernet Controller + 1028 0165 PRO/1000 MT Network Connection + 1028 016d PRO/1000 MT Network Connection + 1028 019a PRO/1000 MT Network Connection + 1028 106d PRO/1000 MT Network Connection + 8086 0076 PRO/1000 MT Network Connection + 8086 1076 PRO/1000 MT Network Connection + 8086 1176 PRO/1000 MT Desktop Adapter + 8086 1276 PRO/1000 MT Network Adapter + 1077 82541GI Gigabit Ethernet Controller + 1179 0001 PRO/1000 MT Mobile Connection + 8086 0077 PRO/1000 MT Mobile Connection + 8086 1077 PRO/1000 MT Mobile Connection + 1078 82541ER Gigabit Ethernet Controller + 8086 1078 82541ER-based Network Connection + 1079 82546GB Gigabit Ethernet Controller + 103c 12a6 Dual Port 1000Base-T [A9900A] + 103c 12cf Core Dual Port 1000Base-T [AB352A] + 1775 10d0 V5D Single Board Computer Gigabit Ethernet + 1775 ce90 CE9 + 1fc1 0027 Niagara 2261 Failover NIC + 4c53 1090 Cx9 / Vx9 mainboard + 4c53 10b0 CL9 mainboard + 8086 0079 PRO/1000 MT Dual Port Network Connection + 8086 1079 PRO/1000 MT Dual Port Network Connection + 8086 1179 PRO/1000 MT Dual Port Server Adapter + 8086 117a PRO/1000 MT Dual Port Server Adapter + 107a 82546GB Gigabit Ethernet Controller + 103c 12a8 Dual Port 1000base-SX [A9899A] + 8086 107a PRO/1000 MF Dual Port Server Adapter + 8086 127a PRO/1000 MF Dual Port Server Adapter + 107b 82546GB Gigabit Ethernet Controller + 8086 007b PRO/1000 MB Dual Port Server Connection + 8086 107b PRO/1000 MB Dual Port Server Connection + 107c 82541PI Gigabit Ethernet Controller + 8086 1376 PRO/1000 GT Desktop Adapter + 8086 1476 PRO/1000 GT Desktop Adapter + 107d 82572EI Gigabit Ethernet Controller (Copper) + 8086 1082 PRO/1000 PT Server Adapter + 8086 1084 PRO/1000 PT Server Adapter + 8086 1092 PRO/1000 PT Server Adapter + 107e 82572EI Gigabit Ethernet Controller (Fiber) + 8086 1084 PRO/1000 PF Server Adapter + 8086 1085 PRO/1000 PF Server Adapter + 8086 1094 PRO/1000 PF Server Adapter + 107f 82572EI Gigabit Ethernet Controller + 1080 FA82537EP 56K V.92 Data/Fax Modem PCI + 1081 631xESB/632xESB LAN Controller Copper + 1082 631xESB/632xESB LAN Controller fiber + 1083 631xESB/632xESB LAN Controller SERDES + 1084 631xESB/632xESB IDE Redirection + 1085 631xESB/632xESB Serial Port Redirection + 1086 631xESB/632xESB IPMI/KCS0 + 1087 631xESB/632xESB UHCI Redirection + 1089 631xESB/632xESB BT + 108a 82546GB Gigabit Ethernet Controller + 8086 108a PRO/1000 P Dual Port Server Adapter + 8086 118a PRO/1000 P Dual Port Server Adapter + 108b 82573V Gigabit Ethernet Controller (Copper) + 1462 176c on board on MSI 945P - NEO (MS-7176) + 108c 82573E Gigabit Ethernet Controller (Copper) + 108e 82573E KCS (Active Management) + 108f Active Management Technology - SOL + 1091 PRO/100 VM Network Connection + 1092 PRO/100 VE Network Connection + 1093 PRO/100 VM Network Connection + 1094 PRO/100 VE Network Connection + 1095 PRO/100 VE Network Connection + 1096 80003ES2LAN Gigabit Ethernet Controller (Copper) + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 1097 631xESB/632xESB DPT LAN Controller (Fiber) + 1098 80003ES2LAN Gigabit Ethernet Controller (Serdes) + 1099 82546GB Gigabit Ethernet Controller (Copper) + 8086 1099 PRO/1000 GT Quad Port Server Adapter + 109a 82573L Gigabit Ethernet Controller + 1179 ff10 PRO/1000 PL + 17aa 2001 ThinkPad T60 + 17aa 207e ThinkPad X60s + 8086 109a PRO/1000 PL Network Connection + 8086 309c DeskTop Board D945GTP + 8086 30a5 DeskTop Board D975XBX + 109b 82546GB PRO/1000 GF Quad Port Server Adapter + 109e 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE CX4 Server Adapter + 8086 a11f PRO/10GbE CX4 Server Adapter + 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter + 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter + 10a4 82571EB Gigabit Ethernet Controller + 8086 10a4 PRO/1000 PT Quad Port Server Adapter + 8086 11a4 PRO/1000 PT Quad Port Server Adapter + 10a5 82571EB Gigabit Ethernet Controller (Fiber) + 8086 10a5 PRO/1000 PF Quad Port Server Adapter + 8086 10a6 PRO/1000 PF Quad Port Server Adapter + 10a7 82575EB Gigabit Network Connection + 8086 10a8 82575EB Gigabit Riser Card + 10a9 82575EB Gigabit Backplane Connection + 10b0 82573L PRO/1000 PL Network Connection + 10b2 82573V PRO/1000 PM Network Connection + 10b3 82573E PRO/1000 PM Network Connection + 10b4 82573L PRO/1000 PL Network Connection + 10b5 82546GB Gigabit Ethernet Controller (Copper) + 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter + 8086 1099 PRO/1000 GT Quad Port Server Adapter + 8086 1199 PRO/1000 GT Quad Port Server Adapter + 10b6 82598 10GbE PCI-Express Ethernet Controller + 10b9 82572EI Gigabit Ethernet Controller (Copper) + 103c 704a HP 110T PCIe Gigabit Server Adapter + 8086 1083 PRO/1000 PT Desktop Adapter + 8086 1093 PRO/1000 PT Desktop Adapter + 10ba 80003ES2LAN Gigabit Ethernet Controller (Copper) + 10bb 80003ES2LAN Gigabit Ethernet Controller (Serdes) + 10bc 82571EB Gigabit Ethernet Controller (Copper) + 103c 704b NC364T PCI Express Quad Port Gigabit Server Adapter + 108e 11bc x4 PCI-Express Quad Gigabit Ethernet UTP Low Profile Adapter + 8086 10bc PRO/1000 PT Quad Port LP Server Adapter + 8086 11bc PRO/1000 PT Quad Port LP Server Adapter + 10bd 82566DM-2 Gigabit Network Connection + 1028 0211 OptiPlex 755 + 10be 82567 Gigabit Network Connection + 10bf 82567LF Gigabit Network Connection + 10c0 82562V-2 10/100 Network Connection + 10c2 82562G-2 10/100 Network Connection + 10c3 82562GT-2 10/100 Network Connection + 10c4 82562GT 10/100 Network Connection + 10c5 82562G 10/100 Network Connection + 10c6 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a05f 10-Gigabit XF SR Dual Port Server Adapter + 8086 a15f 10-Gigabit XF SR Dual Port Server Adapter + 10c7 82598EB 10-Gigabit AF Network Connection + 1014 037f 10-Gigabit XF SR Server Adapter + 1014 0380 10-Gigabit XF LR Server Adapter + 8086 a05f 10-Gigabit XF SR Server Adapter + 8086 a15f 10-Gigabit XF SR Server Adapter + 8086 a16f 10-Gigabit XF SR Server Adapter + 10c8 82598EB 10-Gigabit AT Network Connection + 8086 a10c 10-Gigabit AT Server Adapter + 8086 a11c 10-Gigabit AT Server Adapter + 8086 a12c 10-Gigabit AT Server Adapter + 10c9 82576 Gigabit Network Connection + 103c 31ef NC362i Integrated Dual port Gigabit Server Adapter + 103c 323f NC362i Integrated Dual port Gigabit Server Adapter + 10a9 8028 UV-BaseIO dual-port GbE + 13a3 0037 DS4100 Secure Multi-Gigabit Server Adapter with Compression + 8086 a01c Gigabit ET Dual Port Server Adapter + 8086 a03c Gigabit ET Dual Port Server Adapter + 10ca 82576 Virtual Function + 10cb 82567V Gigabit Network Connection + 10cc 82567LM-2 Gigabit Network Connection + 10cd 82567LF-2 Gigabit Network Connection + 10ce 82567V-2 Gigabit Network Connection + 10d3 82574L Gigabit Network Connection + 103c 3250 NC112T PCI Express single Port Gigabit Server Adapter + 8086 a01f Gigabit CT Desktop Adapter + 10d5 82571PT Gigabit PT Quad Port Server ExpressModule + 10d6 82575GB Gigabit Network Connection + 8086 10d6 Gigabit VT Quad Port Server Adapter + 8086 145a Gigabit VT Quad Port Server Adapter + 8086 147a Gigabit VT Quad Port Server Adapter + 10d9 82571EB Dual Port Gigabit Mezzanine Adapter + 103c 1716 NC360m Dual Port 1GbE BL-c Adapter + 10da 82571EB Quad Port Gigabit Mezzanine Adapter + 103c 1717 NC364m Quad Port 1GbE BL-c Adapter + 10db 82598EB 10-Gigabit Dual Port Network Connection + 10dd 82598EB 10-Gigabit AT CX4 Network Connection + 10de 82567LM-3 Gigabit Network Connection + 10df 82567LF-3 Gigabit Network Connection + 10e1 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a15f 10-Gigabit SR Dual Port Express Module + 10e2 82575GB Gigabit Network Connection + 8086 10e2 Gigabit VT Quad Port Server Adapter + 10e5 82567LM-4 Gigabit Network Connection + 10e6 82576 Gigabit Network Connection + 8086 a01f Gigabit EF Dual Port Server Adapter + 8086 a02f Gigabit EF Dual Port Server Adapter + 10e7 82576 Gigabit Network Connection + 103c 31ff NC362i Integrated Dual Port BL-c Gigabit Server Adapter + 10e8 82576 Gigabit Network Connection + 8086 a02b Gigabit ET Quad Port Server Adapter + 8086 a02c Gigabit ET Quad Port Server Adapter + 10ea 82577LM Gigabit Network Connection + 10eb 82577LC Gigabit Network Connection + 10ec 82598EB 10-Gigabit AT CX4 Network Connection + 8086 a01f 10-Gigabit CX4 Dual Port Server Adapter + 8086 a11f 10-Gigabit CX4 Dual Port Server Adapter + 10ef 82578DM Gigabit Network Connection + 10f0 82578DC Gigabit Network Connection + 10f1 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a20f 10-Gigabit AF DA Dual Port Server Adapter + 8086 a21f 10-Gigabit AF DA Dual Port Server Adapter + 10f4 82598EB 10-Gigabit AF Network Connection + 8086 106f 10-Gigabit XF LR Server Adapter + 8086 a06f 10-Gigabit XF LR Server Adapter + 10f5 82567LM Gigabit Network Connection + 10f6 82574L Gigabit Network Connection + 10f7 82599EB 10-Gigabit KX4 Network Connection + 8086 000d Ethernet Mezzanine Adapter X520-KX4-2 + 10fb 82599EB 10-Gigabit Network Connection + 108e 7b11 Ethernet Server Adapter X520-2 + 8086 0002 Ethernet Server Adapter X520-DA2 + 8086 0003 Ethernet Server Adapter X520-2 + 8086 0006 Ethernet Server Adapter X520-1 + 8086 000a Ethernet Server Adapter X520-1 + 8086 000c Ethernet Server Adapter X520-2 + 10fc 82599EB 10-Gigabit Dual Port Network Connection + 10fe 82552 10/100 Network Connection + 1107 PRO/1000 MF Server Adapter (LX) + 1130 82815 815 Chipset Host Bridge and Memory Controller Hub + 1025 1016 Travelmate 612 TX + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 8086 4532 D815EEA2 mainboard + 8086 4557 D815EGEW Mainboard + 1131 82815 815 Chipset AGP Bridge + 1132 82815 Chipset Graphics Controller (CGC) + 1025 1016 Travelmate 612 TX + 103c 2001 e-pc 40 + 104d 80df Vaio PCG-FX403 + 8086 4532 D815EEA2 Mainboard + 8086 4541 D815EEA Motherboard + 8086 4557 D815EGEW Mainboard + 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller + 8086 1161 82806AA PCI64 Hub APIC + 1162 Xscale 80200 Big Endian Companion Chip + 1200 IXP1200 Network Processor + 172a 0000 AEP SSL Accelerator + 1209 8255xER/82551IT Fast Ethernet Controller + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 4c53 1070 PC6 mainboard + 1221 82092AA PCI to PCMCIA Bridge + 1222 82092AA IDE Controller + 1223 SAA7116 + 1225 82452KX/GX [Orion] + 1226 82596 PRO/10 PCI + 1227 82865 EtherExpress PRO/100A + 1228 82556 EtherExpress PRO/100 Smart + 1229 82557/8/9/0/1 Ethernet Pro 100 + 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 b01e NC3120 Fast Ethernet NIC + 0e11 b01f NC3122 Fast Ethernet NIC (dual port) + 0e11 b02f NC1120 Ethernet NIC + 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN + 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL) + 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded) + 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL) + 0e11 b0dd NC3131 Fast Ethernet NIC (dual port) + 0e11 b0de NC3132 Fast Ethernet Module (dual port) + 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX) + 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL) + 0e11 b13c NC3162 Fast Ethernet NIC (embedded) + 0e11 b144 NC3123 Fast Ethernet NIC (WOL) + 0e11 b163 NC3134 Fast Ethernet NIC (dual port) + 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port) + 0e11 b1a4 NC7131 Gigabit Server Adapter + 1014 005c 82558B Ethernet Pro 10/100 + 1014 01bc 82559 Fast Ethernet LAN On Motherboard + 1014 01f1 10/100 Ethernet Server Adapter + 1014 01f2 10/100 Ethernet Server Adapter + 1014 0207 Ethernet Pro/100 S + 1014 0232 10/100 Dual Port Server Adapter + 1014 023a ThinkPad R30 + 1014 105c Netfinity 10/100 + 1014 2205 ThinkPad A22p + 1014 305c 10/100 EtherJet Management Adapter + 1014 405c 10/100 EtherJet Adapter with Alert on LAN + 1014 505c 10/100 EtherJet Secure Management Adapter + 1014 605c 10/100 EtherJet Secure Management Adapter + 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter + 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter + 1028 009b 10/100 Ethernet Server Adapter + 1028 00ce 10/100 Ethernet Server Adapter + 1033 8000 PC-9821X-B06 + 1033 8016 PK-UG-X006 + 1033 801f PK-UG-X006 + 1033 8026 PK-UG-X006 + 1033 8063 82559-based Fast Ethernet Adapter + 1033 8064 82559-based Fast Ethernet Adapter + 103c 10c0 NetServer 10/100TX + 103c 10c3 NetServer 10/100TX + 103c 10ca NetServer 10/100TX + 103c 10cb NetServer 10/100TX + 103c 10e3 NetServer 10/100TX + 103c 10e4 NetServer 10/100TX + 103c 1200 NetServer 10/100TX + 108e 10cf EtherExpress PRO/100(B) + 10c3 1100 SmartEther100 SC1100 + 10cf 1115 8255x-based Ethernet Adapter (10/100) + 10cf 1143 8255x-based Ethernet Adapter (10/100) + 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller + 114a 0582 PC8 onboard ethernet ETH2 + 1179 0001 8255x-based Ethernet Adapter (10/100) + 1179 0002 PCI FastEther LAN on Docker + 1179 0003 8255x-based Fast Ethernet + 1259 2560 AT-2560 100 + 1259 2561 AT-2560 100 FX Ethernet Adapter + 1266 0001 NE10/100 Adapter + 13e9 1000 6221L-4U + 144d 2501 SEM-2000 MiniPCI LAN Adapter + 144d 2502 SEM-2100IL MiniPCI LAN Adapter + 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem) + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 1080 CT8 mainboard + 4c53 10e0 PSL09 PrPMC + 8086 0001 EtherExpress PRO/100B (TX) + 8086 0002 EtherExpress PRO/100B (T4) + 8086 0003 EtherExpress PRO/10+ + 8086 0004 EtherExpress PRO/100 WfM + 8086 0005 82557 10/100 + 8086 0006 82557 10/100 with Wake on LAN + 8086 0007 82558 10/100 Adapter + 8086 0008 82558 10/100 with Wake on LAN + 8086 0009 82558B PRO/100+ PCI (TP) + 8086 000a EtherExpress PRO/100+ Management Adapter + 8086 000b EtherExpress PRO/100+ + 8086 000c EtherExpress PRO/100+ Management Adapter + 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter + 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN* + 8086 000f EtherExpress PRO/100 Desktop Adapter + 8086 0010 EtherExpress PRO/100 S Management Adapter + 8086 0011 EtherExpress PRO/100 S Management Adapter + 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D) + 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E) + 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC + 8086 0031 EtherExpress PRO/100 Desktop Adapter + 8086 0040 EtherExpress PRO/100 S Desktop Adapter + 8086 0041 EtherExpress PRO/100 S Desktop Adapter + 8086 0042 EtherExpress PRO/100 Desktop Adapter + 8086 0050 EtherExpress PRO/100 S Desktop Adapter + 8086 1009 EtherExpress PRO/100+ Server Adapter + 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B) + 8086 1012 EtherExpress PRO/100 S Server Adapter (D) + 8086 1013 EtherExpress PRO/100 S Server Adapter (E) + 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter + 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter + 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server + 8086 1040 EtherExpress PRO/100 S Server Adapter + 8086 1041 EtherExpress PRO/100 S Server Adapter + 8086 1042 EtherExpress PRO/100 Server Adapter + 8086 1050 EtherExpress PRO/100 S Server Adapter + 8086 1051 EtherExpress PRO/100 Server Adapter + 8086 1052 EtherExpress PRO/100 Server Adapter + 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter + 8086 1229 82557/8/9 [Ethernet Pro 100] + 8086 2009 EtherExpress PRO/100 S Mobile Adapter + 8086 200d EtherExpress PRO/100 Cardbus + 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem + 8086 200f EtherExpress PRO/100 SR Mobile Adapter + 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter + 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter + 8086 2016 EtherExpress PRO/100 S Mobile Adapter + 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter + 8086 2018 EtherExpress PRO/100 SR Mobile Adapter + 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter + 8086 2101 EtherExpress PRO/100 P Mobile Adapter + 8086 2102 EtherExpress PRO/100 SP Mobile Adapter + 8086 2103 EtherExpress PRO/100 SP Mobile Adapter + 8086 2104 EtherExpress PRO/100 SP Mobile Adapter + 8086 2105 EtherExpress PRO/100 SP Mobile Adapter + 8086 2106 EtherExpress PRO/100 P Mobile Adapter + 8086 2107 EtherExpress PRO/100 Network Connection + 8086 2108 EtherExpress PRO/100 Network Connection + 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2203 EtherExpress PRO/100+ MiniPCI + 8086 2204 EtherExpress PRO/100+ MiniPCI + 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2402 EtherExpress PRO/100+ MiniPCI + 8086 2407 EtherExpress PRO/100+ MiniPCI + 8086 2408 EtherExpress PRO/100+ MiniPCI + 8086 2409 EtherExpress PRO/100+ MiniPCI + 8086 240f EtherExpress PRO/100+ MiniPCI + 8086 2410 EtherExpress PRO/100+ MiniPCI + 8086 2411 EtherExpress PRO/100+ MiniPCI + 8086 2412 EtherExpress PRO/100+ MiniPCI + 8086 2413 EtherExpress PRO/100+ MiniPCI + 8086 3000 82559 Fast Ethernet LAN on Motherboard + 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN* + 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II* + 8086 3006 EtherExpress PRO/100 S Network Connection + 8086 3007 EtherExpress PRO/100 S Network Connection + 8086 3008 EtherExpress PRO/100 Network Connection + 8086 3010 EtherExpress PRO/100 S Network Connection + 8086 3011 EtherExpress PRO/100 S Network Connection + 8086 3012 EtherExpress PRO/100 Network Connection + 8086 301a S845WD1-E mainboard + 8086 3411 SDS2 Mainboard + 122d 430FX - 82437FX TSC [Triton I] + 122e 82371FB PIIX ISA [Triton I] + 1230 82371FB PIIX IDE [Triton I] + 1231 DSVD Modem + 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX) + 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP) + 1237 440FX - 82441FX PMC [Natoma] + 1af4 1100 Qemu virtual machine + 1239 82371FB PIIX IDE Interface + 123b 82380PB PCI to PCI Docking Bridge + 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge + 123d 683053 Programmable Interrupt Device + 123e 82466GX (IHPC) Integrated Hot-Plug Controller (hidden mode) + 123f 82466GX Integrated Hot-Plug Controller (IHPC) + 1240 82752 (752) AGP Graphics Accelerator + 124b 82380FB (MPCI2) Mobile Docking Controller + 1250 430HX - 82439HX TXC [Triton II] + 1360 82806AA PCI64 Hub PCI Bridge + 1361 82806AA PCI64 Hub Controller (HRes) + 8086 1361 82806AA PCI64 Hub Controller (HRes) + 8086 8000 82806AA PCI64 Hub Controller (HRes) + 1460 82870P2 P64H2 Hub PCI Bridge + 1461 82870P2 P64H2 I/OxAPIC + 15d9 3480 P4DP6 + 4c53 1090 Cx9/Vx9 mainboard + 1462 82870P2 P64H2 Hot Plug Controller + 1508 82598EB Gigabit BX Network Connection + 150a 82576NS Gigabit Network Connection + 150b 82598EB 10-Gigabit AT2 Server Adapter + 8086 a10c 82598EB 10-Gigabit AT2 Server Adapter + 8086 a11c 82598EB 10-Gigabit AT2 Server Adapter + 8086 a12c 82598EB 10-Gigabit AT2 Server Adapter + 150c 82583V Gigabit Network Connection + 150d 82576 Gigabit Backplane Connection + 8086 a10c Gigabit ET Quad Port Mezzanine Card + 1518 82576NS SerDes Gigabit Network Connection + 1960 80960RP (i960RP) Microprocessor + 101e 0431 MegaRAID 431 RAID Controller + 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller + 101e 0466 MegaRAID 466 Express Plus RAID Controller + 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller + 101e 0490 MegaRAID 490 Express 300 RAID Controller + 101e 0762 MegaRAID 762 Express RAID Controller + 101e 09a0 PowerEdge Expandable RAID Controller 2/SC + 1028 0467 PowerEdge Expandable RAID Controller 2/DC + 1028 1111 PowerEdge Expandable RAID Controller 2/SC + 103c 03a2 MegaRAID + 103c 10c6 MegaRAID 438, NetRAID-3Si + 103c 10c7 MegaRAID T5, Integrated NetRAID + 103c 10cc MegaRAID, Integrated NetRAID + 103c 10cd NetRAID-1Si + 105a 0000 SuperTrak + 105a 2168 SuperTrak Pro + 105a 5168 SuperTrak66/100 + 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC + 1111 1112 PowerEdge Expandable RAID Controller 2/SC + 113c 03a2 MegaRAID + e4bf 1010 CG1-RADIO + e4bf 1020 CU2-QUARTET + e4bf 1040 CU1-CHORUS + e4bf 3100 CX1-BAND + 1962 80960RM (i960RM) Microprocessor + 105a 0000 SuperTrak SX6000 I2O CPU + 1a21 82840 840 [Carmel] Chipset Host Bridge (Hub A) + 1a23 82840 840 [Carmel] Chipset AGP Bridge + 1a24 82840 840 [Carmel] Chipset PCI Bridge (Hub B) + 1a30 82845 845 [Brookdale] Chipset Host Bridge + 1028 010e Optiplex GX240 + 15d9 3280 Supermicro P4SBE Mainboard + 1a31 82845 845 [Brookdale] Chipset AGP Bridge + 1a38 5000 Series Chipset DMA Engine + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 1a48 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE SR Server Adapter + 8086 a11f PRO/10GbE SR Server Adapter + 1b48 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE LR Server Adapter + 8086 a11f PRO/10GbE LR Server Adapter + 2410 82801AA ISA Bridge (LPC) + 2411 82801AA IDE Controller + 2412 82801AA USB Controller + 2413 82801AA SMBus Controller + 2415 82801AA AC'97 Audio Controller + 1028 0095 Precision Workstation 220 Integrated Digital Audio + 1028 00b4 OptiPlex GX110 + 110a 0051 Activy 2xx + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 11d4 5340 SoundMAX Integrated Digital Audio + 1734 1025 Activy 3xx + 2416 82801AA AC'97 Modem Controller + 2418 82801AA PCI Bridge + 2420 82801AB ISA Bridge (LPC) + 2421 82801AB IDE Controller + 2422 82801AB USB Controller + 2423 82801AB SMBus Controller + 2425 82801AB AC'97 Audio Controller + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 2426 82801AB AC'97 Modem Controller + 2428 82801AB PCI Bridge + 2440 82801BA ISA Bridge (LPC) + 8086 5744 S845WD1-E + 2442 82801BA/BAM USB Controller #1 + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0507 TH7II-RAID + 8086 4532 D815EEA2 mainboard + 8086 4557 D815EGEW Mainboard + 8086 5744 S845WD1-E mainboard + 2443 82801BA/BAM SMBus Controller + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0507 TH7II-RAID + 15d9 3280 Supermicro P4SBE Mainboard + 8086 4532 D815EEA2 mainboard + 8086 4557 D815EGEW Mainboard + 8086 5744 S845WD1-E mainboard + 2444 82801BA/BAM USB Controller #1 + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0507 TH7II-RAID + 8086 4532 D815EEA2 mainboard + 8086 5744 S845WD1-E mainboard + 2445 82801BA/BAM AC'97 Audio Controller + 0e11 000b Compaq Deskpro EN Audio + 0e11 0088 Evo D500 + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00d8 Precision 530 + 103c 126f e-pc 40 + 104d 80df Vaio PCG-FX403 + 1462 3370 STAC9721 AC + 147b 0507 TH7II-RAID + 8086 4557 D815EGEW Mainboard + 2446 82801BA/BAM AC'97 Modem Controller + 1025 1016 Travelmate 612 TX + 104d 80df Vaio PCG-FX403 + 2448 82801 Mobile PCI Bridge +# (rev d3) (prog-if (rev d3) (prog-if 01 [Subtractive decode]) + 103c 0934 HP Compaq nw8240 Mobile Workstation + 103c 099c NX6110/NC6120 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 103c 30c1 Compaq 6910p + 144d c00c P30 notebook + 1734 1055 Amilo M1420 + 17aa 20ae ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2449 82801BA/BAM/CA/CAM Ethernet Controller + 0e11 0012 EtherExpress PRO/100 VM + 0e11 0091 EtherExpress PRO/100 VE + 1014 01ce EtherExpress PRO/100 VE + 1014 01dc EtherExpress PRO/100 VE + 1014 01eb EtherExpress PRO/100 VE + 1014 01ec EtherExpress PRO/100 VE + 1014 0202 EtherExpress PRO/100 VE + 1014 0205 EtherExpress PRO/100 VE + 1014 0217 EtherExpress PRO/100 VE + 1014 0234 EtherExpress PRO/100 VE + 1014 023d EtherExpress PRO/100 VE + 1014 0244 EtherExpress PRO/100 VE + 1014 0245 EtherExpress PRO/100 VE + 1014 0265 PRO/100 VE Desktop Connection + 1014 0267 PRO/100 VE Desktop Connection + 1014 026a PRO/100 VE Desktop Connection + 109f 315d EtherExpress PRO/100 VE + 109f 3181 EtherExpress PRO/100 VE + 1179 ff01 PRO/100 VE Network Connection + 1186 7801 EtherExpress PRO/100 VE + 144d 2602 HomePNA 1M CNR + 8086 3010 EtherExpress PRO/100 VE + 8086 3011 EtherExpress PRO/100 VM + 8086 3012 82562EH based Phoneline + 8086 3013 EtherExpress PRO/100 VE + 8086 3014 EtherExpress PRO/100 VM + 8086 3015 82562EH based Phoneline + 8086 3016 EtherExpress PRO/100 P Mobile Combo + 8086 3017 EtherExpress PRO/100 P Mobile + 8086 3018 EtherExpress PRO/100 + 244a 82801BAM IDE U100 Controller + 1025 1016 Travelmate 612TX + 104d 80df Vaio PCG-FX403 + 244b 82801BA IDE U100 Controller + 1014 01c6 Netvista A40/A40p + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 147b 0507 TH7II-RAID + 15d9 3280 Supermicro P4SBE Mainboard + 8086 4532 D815EEA2 mainboard + 8086 4557 D815EGEW Mainboard + 8086 5744 S845WD1-E mainboard + 244c 82801BAM ISA Bridge (LPC) + 244e 82801 PCI Bridge + 1014 0267 NetVista A30p + 1028 0211 Optiplex 755 + 1458 5000 GA-EP45-DS5 Motherboard + 1775 11cc CC11/CL11 + 2450 82801E ISA Bridge (LPC) + 2452 82801E USB Controller + 2453 82801E SMBus Controller + 2459 82801E Ethernet Controller 0 + 245b 82801E IDE U100 Controller + 245d 82801E Ethernet Controller 1 + 245e 82801E PCI Bridge + 2480 82801CA LPC Interface Controller + 2482 82801CA/CAM USB Controller #1 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 8086 3424 SE7501HG2 Mainboard + 8086 4541 Latitude C640 + 2483 82801CA/CAM SMBus Controller + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 2484 82801CA/CAM USB Controller #2 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 2485 82801CA/CAM AC'97 Audio Controller + 1013 5959 Crystal WMD Audio Codec + 1014 0222 ThinkPad A30/A30p/T23 + 1014 0508 ThinkPad T30 + 1014 051c ThinkPad A/T/X Series + 1043 1583 L3C (SPDIF) + 1043 1623 L2B (no SPDIF) + 1043 1643 L3F + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 144d c006 vpr Matrix 170B4 + 2486 82801CA/CAM AC'97 Modem Controller + 1014 0223 ThinkPad A/T/X Series + 1014 0503 ThinkPad R31 + 1014 051a ThinkPad A/T/X Series + 101f 1025 620 Series + 1043 1496 PCtel HSP56 MR + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 134d 4c21 Dell Inspiron 2100 internal modem + 144d 2115 vpr Matrix 170B4 internal modem + 14f1 5421 MD56ORD V.92 MDC Modem + 2487 82801CA/CAM USB Controller #3 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 248a 82801CAM IDE U100 Controller + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 8086 1958 vpr Matrix 170B4 + 8086 4541 Latitude C640 + 248b 82801CA Ultra ATA Storage Controller + 15d9 3480 P4DP6 + 248c 82801CAM ISA Bridge (LPC) + 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge + 1014 0267 NetVista A30p + 1462 5800 845PE Max (MS-6580) + 24c1 82801DBL (ICH4-L) IDE Controller + 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1028 0126 Optiplex GX260 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 114a 0582 PC8 onboard USB 1.x + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H laptop + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1028 0126 Optiplex GX260 + 1028 014f Latitude X300 + 1028 018d Inspiron 700m/710m + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1071 8160 MIM2000 + 114a 0582 PC8 onboard SMbus + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1458 24c2 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 4c53 1090 Cx9 / Vx9 mainboard + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1028 0126 Optiplex GX260 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller + 0e11 00b8 Analog Devices Inc. codec [SoundMAX] + 1014 0267 NetVista A30p + 1014 0537 ThinkPad T41 + 1014 055f Thinkpad R50e model 1634 + 1025 005a TravelMate 290 + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m [SigmaTel STAC9750,51] + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 1713 M6800N + 1043 80b0 P4B533 + 1071 8160 MIM2000 + 1179 0201 Toshiba Tecra M1 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1458 a002 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T + 1734 1055 Amilo M1420 + 8086 24c5 Dell Dimension 2400 + 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller + 1014 0524 ThinkPad T41 + 1014 0525 ThinkPad + 1014 0559 ThinkPad R50e + 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation + 1025 005a TravelMate 290 + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 1826 M6800N + 1071 8160 MIM2000 + 144d 2115 X10 Laptop + 144d c00c P30/P35 notebook +# Conexant HSF Softmodem (CXT22) + 14f1 5422 D480 MDC V.9x Modem + 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1028 0126 Optiplex GX260 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24ca 82801DBM (ICH4-M) IDE Controller + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1071 8160 MIM2000 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1734 1055 Amilo M1420 + 8086 4541 Latitude D400 + 24cb 82801DB (ICH4) IDE Controller + 1014 0267 NetVista A30p + 1028 0126 Optiplex GX260 + 1043 8089 P4B533 + 114a 0582 PC8 onboard IDE + 1458 24c2 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24cc 82801DBM (ICH4-M) LPC Interface Bridge + 144d c00c P30 notebook + 1734 1055 Amilo M1420 + 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller + 1014 0267 NetVista A30p + 1014 052e ThinkPad + 1025 005a TravelMate 290 + 1028 011d Latitude D600 + 1028 0126 Optiplex GX260 + 1028 0139 Latitude D400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 114a 0582 PC8 onboard USB 2.0 + 1179 ff00 Satellite 2430 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1462 3981 845PE Max (MS-6580) + 1509 1968 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge + 24d1 82801EB (ICH5) SATA Controller + 1028 0169 Precision 470 + 1028 019a PowerEdge SC1425 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800 series motherboard + 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 5200 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000/8KNXP motherboard + 1462 7280 865PE Neo2 (MS-6728) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0156 Precision 360 + 1028 0169 Precision 470 + 103c 12bc d330 uT + 1043 80a6 P4P800 Mainboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series SMBus + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller + 100a 147b Abit IS7-E motherboard + 1028 0169 Precision 470 + 103c 006a NX9500 + 103c 12bc d330 uT + 1043 80f3 P4P800 Mainboard + 1043 810f P5P800-MX Mainboard + 1458 a002 GA-8IPE1000/8KNXP motherboard + 1462 0080 865PE Neo2-V (MS-6788) Mainboard + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 8086 a000 D865PERL mainboard + 8086 e000 D865PERL mainboard + 8086 e001 Desktop Board D865GBF + 8086 e002 SoundMax Intergrated Digital Audio + 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller + 103c 006a NX9500 + 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 + 1014 02ed xSeries server mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24db 82801EB/ER (ICH5/ICH5R) IDE Controller + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 IDE Controller + 1028 016d PowerEdge 2850 IDE Controller + 1028 0170 PowerEdge 6850 IDE Controller + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7580 MSI 875P + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard IDE + 8086 24db P4C800 Mainboard + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24dc 82801EB (ICH5) LPC Interface Bridge + 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard EHCI + 1028 016d PowerEdge 2850 onboard EHCI + 1028 0170 PowerEdge 6850 onboard EHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 + 1014 02ed xSeries server mainboard + 1028 0169 Precision 470 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24df 82801ER (ICH5R) SATA Controller + 2500 82820 820 (Camino) Chipset Host Bridge (MCH) + 1028 0095 Precision Workstation 220 Chipset + 1043 801c P3C-2000 system chipset + 2501 82820 820 (Camino) Chipset Host Bridge (MCH) + 1043 801c P3C-2000 system chipset + 250b 82820 820 (Camino) Chipset Host Bridge + 250f 82820 820 (Camino) Chipset AGP Bridge + 2520 82805AA MTH Memory Translator Hub + 2521 82804AA MRH-S Memory Repeater Hub for SDRAM + 2530 82850 850 (Tehama) Chipset Host Bridge (MCH) + 1028 00c7 Dimension 8100 + 147b 0507 TH7II-RAID + 2531 82860 860 (Wombat) Chipset Host Bridge (MCH) + 1028 00d8 Precision 530 + 2532 82850 850 (Tehama) Chipset AGP Bridge + 2533 82860 860 (Wombat) Chipset AGP Bridge + 2534 82860 860 (Wombat) Chipset PCI Bridge + 2540 E7500 Memory Controller Hub + 15d9 3480 P4DP6 + 2541 E7500/E7501 Host RASUM Controller + 15d9 3480 P4DP6 + 4c53 1090 Cx9 / Vx9 mainboard + 8086 3424 SE7501HG2 Mainboard + 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge + 2544 E7500/E7501 Hub Interface B RASUM Controller + 4c53 1090 Cx9 / Vx9 mainboard + 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge + 2546 E7500/E7501 Hub Interface C RASUM Controller + 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge + 2548 E7500/E7501 Hub Interface D RASUM Controller + 254c E7501 Memory Controller Hub + 4c53 1090 Cx9 / Vx9 mainboard + 8086 3424 SE7501HG2 Mainboard + 2550 E7505 Memory Controller Hub + 2551 E7505/E7205 Series RAS Controller + 2552 E7505/E7205 PCI-to-AGP Bridge + 2553 E7505 Hub Interface B PCI-to-PCI Bridge + 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller + 255d E7205 Memory Controller Hub + 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface + 1028 0126 Optiplex GX260 + 1458 2560 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge + 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device + 0e11 00b9 Evo D510 SFF + 1014 0267 NetVista A30p + 1734 1003 D1521 Mainboard (Fujitsu-Siemens) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 2570 82865G/PE/P DRAM Controller/Host-Hub Interface + 103c 006a NX9500 + 103c 12bc d330 uT + 1043 80f2 P4P800/P5P800 series motherboard + 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE) + 2571 82865G/PE/P PCI to AGP Controller + 2572 82865G Integrated Graphics Controller + 1028 019d Dimension 3000 + 103c 12bc D530 sff(dc578av) + 1043 80a5 P5P800-MX Mainboard + 1462 7650 Hetis 865GV-E (MS-7065) + 1734 101b Fujitsu-Siemens Scenic E300 i865GV + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 2573 82865G/PE/P PCI to CSA Bridge + 2576 82865G/PE/P Processor to I/O Memory Interface + 2578 82875P/E7210 Memory Controller Hub + 1458 2578 GA-8KNXP motherboard (875P) + 1462 7580 MS-6758 (875P Neo) + 15d9 4580 P4SCE Motherboard + 2579 82875P Processor to AGP Controller + 257b 82875P/E7210 Processor to PCI to CSA Bridge + 257e 82875P/E7210 Processor to I/O Memory Interface + 2580 82915G/P/GV/GL/PL/910GL Memory Controller Hub + 1458 2580 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105b Scenic W620 + 2581 82915G/P/GV/GL/PL/910GL PCI Express Root Port + 2582 82915G/GV/910GL Integrated Graphics Controller + 1028 1079 Optiplex GX280 + 103c 3006 DC7100 SFF(DX878AV) + 1043 2582 P5GD1-VW Mainboard + 1458 2582 GA-8I915ME-G Mainboard + 1734 105b Scenic W620 + 1849 2582 ASRock P4Dual-915GL + 2584 82925X/XE Memory Controller Hub + 1028 0177 Dimension 8400 + 2585 82925X/XE PCI Express Root Port + 2588 E7220/E7221 Memory Controller Hub + 2589 E7220/E7221 PCI Express Root Port + 258a E7221 Integrated Graphics Controller + 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller + 1014 0575 ThinkPad Z60t + 1028 0182 Dell Latidude C610 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 104d 81b7 Vaio VGN-S3XP + a304 81b7 Vaio VGN-S3XP + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2591 Mobile 915GM/PM Express PCI Express Root Port + 103c 0934 HP Compaq nw8240 Mobile Workstation + 2592 Mobile 915GM/GMS/910GML Express Graphics Controller + 103c 099c NX6110/NC6120 + 103c 308a NC6220 + 1043 1881 GMA 900 915GM Integrated Graphics + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 25a1 6300ESB LPC Interface Controller + 25a2 6300ESB PATA Storage Controller + 1775 10d0 V5D Single Board Computer IDE + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 25a3 6300ESB SATA Storage Controller + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25a4 6300ESB SMBus Controller + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25a6 6300ESB AC'97 Audio Controller + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 25a7 6300ESB AC'97 Modem Controller + 25a9 6300ESB USB Universal Host Controller + 1775 10d0 V5D Single Board Computer USB + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25aa 6300ESB USB Universal Host Controller + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ab 6300ESB Watchdog Timer + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ac 6300ESB I/O Advanced Programmable Interrupt Controller + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ad 6300ESB USB2 Enhanced Host Controller + 1775 10d0 V5D Single Board Computer USB 2.0 + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ae 6300ESB 64-bit PCI-X Bridge + 25b0 6300ESB SATA RAID Controller + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25c0 5000X Chipset Memory Controller Hub + 25d0 5000Z Chipset Memory Controller Hub + 25d4 5000V Chipset Memory Controller Hub + 15d9 8680 X7DVL-E-O motherboard + 25d8 5000P Chipset Memory Controller Hub + 8086 3476 Intel S5000PSLSATA Server Board + 25e2 5000 Series Chipset PCI Express x4 Port 2 + 25e3 5000 Series Chipset PCI Express x4 Port 3 + 25e4 5000 Series Chipset PCI Express x4 Port 4 + 25e5 5000 Series Chipset PCI Express x4 Port 5 + 25e6 5000 Series Chipset PCI Express x4 Port 6 + 25e7 5000 Series Chipset PCI Express x4 Port 7 + 25f0 5000 Series Chipset FSB Registers + 1028 01bb PowerEdge 1955 FSB Registers + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 25f1 5000 Series Chipset Reserved Registers + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 25f3 5000 Series Chipset Reserved Registers + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 25f5 5000 Series Chipset FBD Registers + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 25f6 5000 Series Chipset FBD Registers + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 25f7 5000 Series Chipset PCI Express x8 Port 2-3 + 25f8 5000 Series Chipset PCI Express x8 Port 4-5 + 25f9 5000 Series Chipset PCI Express x8 Port 6-7 + 25fa 5000X Chipset PCI Express x16 Port 4-7 + 2600 E8500/E8501 Hub Interface 1.5 + 1028 0170 PowerEdge 6850 Hub Interface + 2601 E8500/E8501 PCI Express x4 Port D + 2602 E8500/E8501 PCI Express x4 Port C0 + 2603 E8500/E8501 PCI Express x4 Port C1 + 2604 E8500/E8501 PCI Express x4 Port B0 + 2605 E8500/E8501 PCI Express x4 Port B1 + 2606 E8500/E8501 PCI Express x4 Port A0 + 2607 E8500/E8501 PCI Express x4 Port A1 + 2608 E8500/E8501 PCI Express x8 Port C + 2609 E8500/E8501 PCI Express x8 Port B + 260a E8500/E8501 PCI Express x8 Port A + 260c E8500/E8501 IMI Registers + 2610 E8500/E8501 FSB Registers + 2611 E8500/E8501 Address Mapping Registers + 2612 E8500/E8501 RAS Registers + 2613 E8500/E8501 Reserved Registers + 2614 E8500/E8501 Reserved Registers + 2615 E8500/E8501 Miscellaneous Registers + 2617 E8500/E8501 Reserved Registers + 2618 E8500/E8501 Reserved Registers + 2619 E8500/E8501 Reserved Registers + 261a E8500/E8501 Reserved Registers + 261b E8500/E8501 Reserved Registers + 261c E8500/E8501 Reserved Registers + 261d E8500/E8501 Reserved Registers + 261e E8500/E8501 Reserved Registers + 2620 E8500/E8501 eXternal Memory Bridge + 1028 0170 PowerEdge 6850 Memory Bridge + 2621 E8500/E8501 XMB Miscellaneous Registers + 1028 0170 PowerEdge 6850 XMB Registers + 2622 E8500/E8501 XMB Memory Interleaving Registers + 1028 0170 PowerEdge 6850 Memory Interleaving Registers + 2623 E8500/E8501 XMB DDR Initialization and Calibration + 1028 0170 PowerEdge 6850 DDR Initialization and Calibration + 2624 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2625 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2626 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2627 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2641 82801FBM (ICH6M) LPC Interface Bridge + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge + 2651 82801FB/FW (ICH6/ICH6W) SATA Controller + 1028 0179 Optiplex GX280 + 1043 2601 P5GD1-VW Mainboard + 1734 105c Scenic W620 + 8086 4147 D915GAG Motherboard + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller + 1028 0177 Dimension 8400 + 1462 7028 915P/G Neo2 + 2653 82801FBM (ICH6M) SATA Controller + 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 2558 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 2659 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 265a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 265a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 5006 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + 8086 265c Dimension 3100 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 + 103c 0934 HP Compaq nw8240 Mobile Workstation + 103c 099c NX6110/NC6120 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2 + 103c 0934 HP Compaq nw8240 Mobile Workstation + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller + 1014 05b7 ThinkPad Z60t +# based on the PTGD1-LA motherboard + 103c 2a09 PufferM-UL8E + 1043 1173 Asus A6VC + 1043 814e P5GD1-VW Mainboard + 1462 7028 915P/G Neo2 + 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1043 80a6 P5GD1-VW Mainboard + 1458 266a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller + 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller + 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop) + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller + 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop) + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1028 0182 Latitude D610 Laptop + 1028 0187 Dell Precision M70 Laptop + 1028 0188 Inspiron 6000 laptop + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq NC6220 + 103c 099c NX6110/NC6120 + 103c 3006 DC7100 SFF(DX878AV) + 1458 a002 GA-8I915ME-G Mainboard + 152d 0745 Packard Bell A8550 Laptop + 1734 105a Scenic W620 + 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller + 1028 0177 Dimension 8400 + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 266f GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2670 631xESB/632xESB/3100 Chipset LPC Interface Controller + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 2680 631xESB/632xESB/3100 Chipset SATA IDE Controller + 2681 631xESB/632xESB SATA AHCI Controller + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 2682 631xESB/632xESB SATA RAID Controller + 2683 631xESB/632xESB SATA RAID Controller + 2688 631xESB/632xESB/3100 Chipset UHCI USB Controller #1 + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 2689 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 268a 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 268b 631xESB/632xESB/3100 Chipset UHCI USB Controller #4 + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 268c 631xESB/632xESB/3100 Chipset EHCI USB2 Controller + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 2690 631xESB/632xESB/3100 Chipset PCI Express Root Port 1 + 2692 631xESB/632xESB/3100 Chipset PCI Express Root Port 2 + 2694 631xESB/632xESB/3100 Chipset PCI Express Root Port 3 + 2696 631xESB/632xESB/3100 Chipset PCI Express Root Port 4 + 2698 631xESB/632xESB AC '97 Audio Controller + 2699 631xESB/632xESB AC '97 Modem Controller + 269a 631xESB/632xESB High Definition Audio Controller + 269b 631xESB/632xESB/3100 Chipset SMBus Controller + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 Intel S5000PSLSATA Server Board + 269e 631xESB/632xESB IDE Controller + 15d9 8680 X7DVL-E-O motherboard + 2770 82945G/GZ/P/PL Memory Controller Hub + 1028 01ad OptiPlex GX620 + 107b 5048 E4500 + 8086 544e DeskTop Board D945GTP + 2771 82945G/GZ/P/PL PCI Express Root Port + 2772 82945G/GZ Integrated Graphics Controller + 8086 544e DeskTop Board D945GTP + 8086 d605 Intel Desktop Board D945GCCR + 2774 82955X Memory Controller Hub + 2775 82955X PCI Express Root Port + 2776 82945G/GZ Integrated Graphics Controller + 2778 E7230/3000/3010 Memory Controller Hub + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 2779 E7230/3000/3010 PCI Express Root Port + 277a 82975X/3010 PCI Express Root Port + 277c 82975X Memory Controller Hub + 1043 8178 P5WDG2 WS Professional motherboard + 277d 82975X PCI Express Root Port + 2782 82915G Integrated Graphics Controller + 1043 2582 P5GD1-VW Mainboard + 1734 105b Scenic W620 + 2792 Mobile 915GM/GMS/910GML Express Graphics Controller + 103c 099c NX6110/NC6120 + 1043 1881 GMA 900 915GM Integrated Graphics + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 27a0 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 17aa 2015 ThinkPad T60 + 17aa 2017 ThinkPad T60/R60 series + 27a1 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express PCI Express Root Port + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 27a2 Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller + 103c 30a1 NC2400 + 17aa 201a ThinkPad T60/R60 series + 9902 1584 CCE MPL-D10H120F + 27a6 Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller + 103c 30a1 NC2400 + 1775 11cc CC11/CL11 integrated graphics (secondary) + 17aa 201a ThinkPad T60/R60 series + 27ac Mobile 945GME Express Memory Controller Hub + 1775 11cc CC11/CL11 + 27ad Mobile 945GME Express PCI Express Root Port + 27ae Mobile 945GME Express Integrated Graphics Controller + 1775 11cc CC11/CL11 integrated graphics (primary) + 27b0 82801GH (ICH7DH) LPC Interface Bridge + 8086 544e DeskTop Board D945GTP + 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge + 1028 01e6 PowerEdge 860 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1775 11cc CC11/CL11 + 8086 544e DeskTop Board D945GTP + 27b9 82801GBM (ICH7-M) LPC Interface Bridge + 1028 01d7 XPS M1210 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 10f7 8338 Panasonic CF-Y5 laptop + 17aa 2009 ThinkPad T60/R60 series + 27bc Tigerpoint LPC Controller + 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge + 1025 006c 9814 WKMI + 27c0 82801GB/GR/GH (ICH7 Family) SATA IDE Controller + 1028 01ad OptiPlex GX620 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1462 2310 MSI Hetis 945 + 1462 7236 945P Neo3-F Rev. 2.2 motherboard + 1775 11cc CC11/CL11 + 8086 544e DeskTop Board D945GTP + 27c1 82801GR/GH (ICH7 Family) SATA AHCI Controller + 1028 01df PowerEdge SC440 + 1775 11cc CC11/CL11 + 8086 5842 DeskTop Board D975XBX + 27c3 82801GR/GH (ICH7 Family) SATA RAID Controller + 1775 11cc CC11/CL11 + 8086 544e DeskTop Board D945GTP + 27c4 82801GBM/GHM (ICH7 Family) SATA IDE Controller + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 17aa 200e Thinkpad T60 model 2007 + 27c5 82801GBM/GHM (ICH7 Family) SATA AHCI Controller + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 17aa 200d ThinkPad T60/R60 series + 27c6 82801GHM (ICH7-M DH) SATA RAID Controller + 27c8 82801G (ICH7 Family) USB UHCI Controller #1 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27c9 82801G (ICH7 Family) USB UHCI Controller #2 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27ca 82801G (ICH7 Family) USB UHCI Controller #3 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27cb 82801G (ICH7 Family) USB UHCI Controller #4 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27cc 82801G (ICH7 Family) USB2 EHCI Controller + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 1775 11cc CC11/CL11 + 17aa 200b ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27d0 82801G (ICH7 Family) PCI Express Port 1 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 1775 11cc CC11/CL11 + 27d2 82801G (ICH7 Family) PCI Express Port 2 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 1775 11cc CC11/CL11 + 27d4 82801G (ICH7 Family) PCI Express Port 3 + 1775 11cc CC11/CL11 + 27d6 82801G (ICH7 Family) PCI Express Port 4 + 103c 30a3 Compaq nw8440 + 1775 11cc CC11/CL11 + 27d8 82801G (ICH7 Family) High Definition Audio Controller + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1123 A6J-Q008 + 1043 13c4 Asus G2P + 1043 8290 P5KPL-VM Motherboard + 1043 82ea P5KPL-CM Motherboard + 107b 5048 E4500 + 10f7 8338 Panasonic CF-Y5 laptop + 1179 ff10 Toshiba Satellite A100-796 audio (Realtek ALC861) + 1179 ff31 AC97 Data Fax SoftModem with SmartCP + 1458 a102 GA-8I945PG-RH Mainboard + 152d 0753 Softmodem + 1734 10ad Conexant softmodem SmartCP + 17aa 2010 ThinkPad T60/R60 series + 17aa 3802 Lenovo 3000 C200 audio [Realtek ALC861VD] + 8086 1112 DeskTop Board D945GTP + 8086 27d8 DeskTop Board D945GTP + 27da 82801G (ICH7 Family) SMBus Controller + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 1043 8179 P5KPL-VM Motherboard + 10f7 8338 Panasonic CF-Y5 laptop + 1458 5001 GA-8I945PG-RH Mainboard + 1775 11cc CC11/CL11 + 17aa 200f ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 8086 5842 DeskTop Board D975XBX + 27dc 82801G (ICH7 Family) LAN Controller + 8086 308d DeskTop Board D945GTP + 27dd 82801G (ICH7 Family) AC'97 Modem Controller + 27de 82801G (ICH7 Family) AC'97 Audio Controller + 1028 01ad OptiPlex GX620 + 1462 7267 Realtek ALC883 Audio Controller + 1775 11cc CC11 integrated audio (AD1981BL codec) + 27df 82801G (ICH7 Family) IDE Controller + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5KPL-VM Motherboard + 107b 5048 E4500 + 10f7 8338 Panasonic CF-Y5 laptop + 1775 11cc CC11/CL11 + 17aa 200c ThinkPad T60/R60 series + 8086 544e DeskTop Board D945GTP + 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5 + 1775 11cc CC11/CL11 + 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6 + 1775 11cc CC11/CL11 + 2810 82801HB/HR (ICH8/R) LPC Interface Controller + 1043 81ec P5B + 2811 82801HBM (ICH8M-E) LPC Interface Controller + 103c 30c1 Compaq 6910p + 17aa 20b6 T61 + e4bf cc47 CCG-RUMBA + 2812 82801HH (ICH8DH) LPC Interface Controller + 2814 82801HO (ICH8DO) LPC Interface Controller + 2815 82801HEM (ICH8M) LPC Interface Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30d9 Presario C700 + 104d 9005 Vaio VGN-FZ260E + 2820 82801H (ICH8 Family) 4 port SATA IDE Controller + 1028 01da OptiPlex 745 + 1462 7235 P965 Neo MS-7235 mainboard + 2821 82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA AHCI Controller + 2822 82801 SATA RAID Controller + 2824 82801HB (ICH8) 4 port SATA AHCI Controller + 1043 81ec P5B + 2825 82801H (ICH8 Family) 2 port SATA IDE Controller + 1028 01da OptiPlex 745 + 1462 7235 P965 Neo MS-7235 mainboard + 2828 82801HBM/HEM (ICH8M/ICH8M-E) SATA IDE Controller + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + e4bf cc47 CCG-RUMBA + 2829 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller + 1025 0121 Aspire 5920G + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 104d 9005 Vaio VGN-FZ260E + 17aa 20a7 ThinkPad T61 + 282a Mobile 82801 SATA RAID Controller + 2830 82801H (ICH8 Family) USB UHCI Controller #1 + 1025 0121 Acer Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2831 82801H (ICH8 Family) USB UHCI Controller #2 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b +# Name mistyped on previous submission + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2832 82801H (ICH8 Family) USB UHCI Controller #3 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 17aa 20aa ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2834 82801H (ICH8 Family) USB UHCI Controller #4 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2835 82801H (ICH8 Family) USB UHCI Controller #5 + 1025 0121 Acer Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 17aa 20aa ThinkPad T60 + e4bf cc47 CCG-RUMBA + 2836 82801H (ICH8 Family) USB2 EHCI Controller #1 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20ab ThinkPad T61 + e4bf cc47 CCG-RUMBA + 283a 82801H (ICH8 Family) USB2 EHCI Controller #2 + 1025 0121 Acer Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 17aa 20ab ThinkPad T61 + e4bf cc47 CCG-RUMBA + 283e 82801H (ICH8 Family) SMBus Controller + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 103c 30d9 Presario C700 + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20a9 ThinkPad T61 + e4bf cc47 CCG-RUMBA + 283f 82801H (ICH8 Family) PCI Express Port 1 + 1028 01da OptiPlex 745 + 103c 30c1 Compaq 6910p + 17aa 20ad ThinkPad T61 + 2841 82801H (ICH8 Family) PCI Express Port 2 + 103c 30c1 Compaq 6910p + 17aa 20ad ThinkPad T61 + 2843 82801H (ICH8 Family) PCI Express Port 3 + 17aa 20ad ThinkPad T61 + 2845 82801H (ICH8 Family) PCI Express Port 4 + 17aa 20ad ThinkPad T61 + 2847 82801H (ICH8 Family) PCI Express Port 5 + 1028 01da OptiPlex 745 + 103c 30c1 Compaq 6910p + 17aa 20ad ThinkPad T61 + 2849 82801H (ICH8 Family) PCI Express Port 6 + 284b 82801H (ICH8 Family) HD Audio Controller + 1025 011f Realtek ALC268 audio codec + 1025 0121 Aspire 5920G + 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theather) + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 01f9 Dell Latitude D630 + 1028 01ff Dell Precision M4300 + 1028 0256 Studio 1735 + 103c 2802 HP Compaq dc7700p + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 1339 Asus M51S series + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 9016 Sony VAIO VGN-AR51M + 14f1 5051 Presario C700 + 17aa 20ac ThinkPad T61 + 8384 7616 Dell Vostro 1400 + 284f 82801H (ICH8 Family) Thermal Reporting Device + 2850 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 104d 9005 Vaio VGN-FZ260E + 17aa 20a6 ThinkPad T61 + e4bf cc47 CCG-RUMBA + 2912 82801IH (ICH9DH) LPC Interface Controller + 2914 82801IO (ICH9DO) LPC Interface Controller + 1028 0211 Optiplex 755 + 2916 82801IR (ICH9R) LPC Interface Controller + 2917 ICH9M-E LPC Interface Controller + 2918 82801IB (ICH9) LPC Interface Controller + 1028 0236 PowerEdge R610 82801IB (ICH9) LPC Interface Controller + 2919 ICH9M LPC Interface Controller + 2920 82801IR/IO/IH (ICH9R/DO/DH) 4 port SATA IDE Controller + 1028 020f PowerEdge R300 onboard SATA Controller + 1028 0210 PowerEdge T300 onboard SATA Controller + 1028 0211 Optiplex 755 + 1028 023c PowerEdge R200 onboard SATA Controller + 2921 82801IB (ICH9) 2 port SATA IDE Controller + 1028 0235 PowerEdge R710 SATA IDE Controller + 1028 0236 PowerEdge R610 SATA IDE Controller + 1028 0237 PowerEdge T610 SATA IDE Controller + 2922 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller + 2923 82801IB (ICH9) 4 port SATA AHCI Controller + 2925 82801IR/IO (ICH9R/DO) SATA RAID Controller + 1734 10e0 System Board D2542 + 8086 2925 System Board D2542 + 2926 82801I (ICH9 Family) 2 port SATA IDE Controller + 1028 020f PowerEdge R300 onboard SATA Controller + 1028 0210 PowerEdge T300 onboard SATA Controller + 1028 0211 Optiplex 755 + 2928 ICH9M/M-E 2 port SATA IDE Controller + 2929 ICH9M/M-E SATA AHCI Controller + 103c 3628 dv6-1190en + 292c ICH9M-E SATA RAID Controller + 292d ICH9M/M-E 2 port SATA IDE Controller + 292e ICH9M SATA IDE Controller + 2930 82801I (ICH9 Family) SMBus Controller + 1028 0211 Optiplex 755 + 103c 3628 dv6-1190en + 2932 82801I (ICH9 Family) Thermal Subsystem + 103c 3628 dv6-1190en + 2934 82801I (ICH9 Family) USB UHCI Controller #1 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 1028 2011 Optiplex 755 + 2935 82801I (ICH9 Family) USB UHCI Controller #2 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 2936 82801I (ICH9 Family) USB UHCI Controller #3 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 2937 82801I (ICH9 Family) USB UHCI Controller #4 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 1028 2011 Optiplex 755 + 8086 2937 Optiplex 755 + 8086 2942 828011 (ICH9 Family ) USB UHCI Controller + 2938 82801I (ICH9 Family) USB UHCI Controller #5 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 8086 2938 Optiplex 755 + 2939 82801I (ICH9 Family) USB UHCI Controller #6 + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0237 PowerEdge T610 USB UHCI Controller + 293a 82801I (ICH9 Family) USB2 EHCI Controller #1 + 1028 020f PowerEdge R300 onboard EHCI + 1028 0210 PowerEdge T300 onboard EHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB EHCI Controller + 1028 0236 PowerEdge R610 USB EHCI Controller + 1028 0237 PowerEdge T610 USB EHCI Controller + 1028 023c PowerEdge R200 onboard EHCI + 1028 0287 PowerEdge M610 onboard EHCI + 1028 029c PowerEdge M710 USB EHCI Controller + 293c 82801I (ICH9 Family) USB2 EHCI Controller #2 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB EHCI Controller + 1028 0236 PowerEdge R610 USB EHCI Controller + 1028 0237 PowerEdge T610 USB EHCI Controller + 1028 0287 PowerEdge M610 onboard EHCI + 1028 029c PowerEdge M710 USB EHCI Controller + 8086 293c Optiplex 755 + 293e 82801I (ICH9 Family) HD Audio Controller + 1028 0211 Optiplex 755 + 103c 3628 dv6-1190en + 8086 293e Optiplex 755 + 8086 2940 Optiplex 755 + 2940 82801I (ICH9 Family) PCI Express Port 1 + 1028 0211 Optiplex 755 + 8086 2940 Optiplex 755 + 2942 82801I (ICH9 Family) PCI Express Port 2 + 2944 82801I (ICH9 Family) PCI Express Port 3 + 2946 82801I (ICH9 Family) PCI Express Port 4 + 2948 82801I (ICH9 Family) PCI Express Port 5 + 294a 82801I (ICH9 Family) PCI Express Port 6 + 294c 82566DC-2 Gigabit Network Connection + 17aa 302e 82566DM-2 Gigabit Network Connection + 2970 82946GZ/PL/GL Memory Controller Hub + 2971 82946GZ/PL/GL PCI Express Root Port + 2972 82946GZ/GL Integrated Graphics Controller + 2973 82946GZ/GL Integrated Graphics Controller + 2974 82946GZ/GL HECI Controller + 2975 82946GZ/GL HECI Controller + 2976 82946GZ/GL PT IDER Controller + 2977 82946GZ/GL KT Controller + 2980 82G35 Express DRAM Controller + 2981 82G35 Express PCI Express Root Port + 2982 82G35 Express Integrated Graphics Controller + 2983 82G35 Express Integrated Graphics Controller + 2984 82G35 Express HECI Controller + 2990 82Q963/Q965 Memory Controller Hub + 1028 01da OptiPlex 745 + 2991 82Q963/Q965 PCI Express Root Port + 2992 82Q963/Q965 Integrated Graphics Controller + 2993 82Q963/Q965 Integrated Graphics Controller + 2994 82Q963/Q965 HECI Controller + 2995 82Q963/Q965 HECI Controller + 2996 82Q963/Q965 PT IDER Controller + 2997 82Q963/Q965 KT Controller + 29a0 82P965/G965 Memory Controller Hub + 1043 81ea P5B + 1462 7276 MS-7276 [G965MDH] + 29a1 82P965/G965 PCI Express Root Port + 29a2 82G965 Integrated Graphics Controller + 1462 7276 MS-7276 [G965MDH] + 29a3 82G965 Integrated Graphics Controller + 29a4 82P965/G965 HECI Controller + 29a5 82P965/G965 HECI Controller + 29a6 82P965/G965 PT IDER Controller + 29a7 82P965/G965 KT Controller + 29b0 82Q35 Express DRAM Controller + 1028 0211 OptiPlex 755 + 29b1 82Q35 Express PCI Express Root Port + 1028 0211 OptiPlex 755 + 29b2 82Q35 Express Integrated Graphics Controller + 1028 0211 OptiPlex 755 + 29b3 82Q35 Express Integrated Graphics Controller + 1028 0211 OptiPlex 755 + 29b4 82Q35 Express MEI Controller + 1028 0211 OptiPlex 755 + 29b5 82Q35 Express MEI Controller + 29b6 82Q35 Express PT IDER Controller + 1028 0211 OptiPlex 755 + 29b7 82Q35 Express Serial KT Controller + 1028 0211 OptiPlex 755 + 29c0 82G33/G31/P35/P31 Express DRAM Controller + 1043 82b0 P5KPL-VM Motherboard + 29c1 82G33/G31/P35/P31 Express PCI Express Root Port + 29c2 82G33/G31 Express Integrated Graphics Controller + 1043 82b0 P5KPL-VM Motherboard + 29c3 82G33/G31 Express Integrated Graphics Controller + 1043 82b0 P5KPL-VM Motherboard + 29c4 82G33/G31/P35/P31 Express MEI Controller + 29c5 82G33/G31/P35/P31 Express MEI Controller + 29c6 82G33/G31/P35/P31 Express PT IDER Controller + 29c7 82G33/G31/P35/P31 Express Serial KT Controller + 29cf Virtual HECI Controller + 29d0 82Q33 Express DRAM Controller + 29d1 82Q33 Express PCI Express Root Port + 29d2 82Q33 Express Integrated Graphics Controller + 29d3 82Q33 Express Integrated Graphics Controller + 29d4 82Q33 Express MEI Controller + 29d5 82Q33 Express MEI Controller + 29d6 82Q33 Express PT IDER Controller + 29d7 82Q33 Express Serial KT Controller + 29e0 82X38/X48 Express DRAM Controller + 29e1 82X38/X48 Express Host-Primary PCI Express Bridge + 29e4 82X38/X48 Express MEI Controller + 29e5 82X38/X48 Express MEI Controller + 29e6 82X38/X48 Express PT IDER Controller + 29e7 82X38/X48 Express Serial KT Controller + 29e9 82X38/X48 Express Host-Secondary PCI Express Bridge + 29f0 3200/3210 Chipset DRAM Controller + 29f1 3200/3210 Chipset Host-Primary PCI Express Bridge + 29f4 3200/3210 Chipset MEI Controller + 29f5 3200/3210 Chipset MEI Controller + 29f6 3200/3210 Chipset PT IDER Controller + 29f7 3200/3210 Chipset Serial KT Controller + 29f9 3210 Chipset Host-Secondary PCI Express Bridge + 2a00 Mobile PM965/GM965/GL960 Memory Controller Hub + 1025 0121 Acer Aspire 5920G + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30d9 Presario C700 + 104d 9005 Vaio VGN-FZ260E + 17aa 20b1 ThinkPad T61 + 17aa 20b3 T61 + e4bf cc47 CCG-RUMBA + 2a01 Mobile PM965/GM965/GL960 PCI Express Root Port + 2a02 Mobile GM965/GL960 Integrated Graphics Controller + 1028 01f3 Inspiron 1420 + 1028 01f9 Latitude D630 + 103c 30c0 Compaq 6710b + 103c 30d9 Presario C700 + 17aa 20b5 T61 + e4bf cc47 CCG-RUMBA + 2a03 Mobile GM965/GL960 Integrated Graphics Controller + 1028 01f3 Dell Inspiron 1420 + 103c 30c0 Compaq 6710b + 103c 30d9 Presario C700 + 17aa 20b5 T61 + e4bf cc47 CCG-RUMBA + 2a04 Mobile PM965/GM965 MEI Controller + 103c 30c1 Compaq 6910p + 2a05 Mobile PM965/GM965 MEI Controller + 2a06 Mobile PM965/GM965 PT IDER Controller + 103c 30c1 Compaq 6910p + 2a07 Mobile PM965/GM965 KT Controller + 103c 30c1 Compaq 6910p + 2a10 Mobile GME965/GLE960 Memory Controller Hub + e4bf cc47 CCG-RUMBA + 2a11 Mobile GME965/GLE960 PCI Express Root Port + 2a12 Mobile GME965/GLE960 Integrated Graphics Controller + e4bf cc47 CCG-RUMBA + 2a13 Mobile GME965/GLE960 Integrated Graphics Controller + e4bf cc47 CCG-RUMBA + 2a14 Mobile GME965/GLE960 MEI Controller + 2a15 Mobile GME965/GLE960 MEI Controller + 2a16 Mobile GME965/GLE960 PT IDER Controller + 2a17 Mobile GME965/GLE960 KT Controller + 2a40 Mobile 4 Series Chipset Memory Controller Hub + 2a41 Mobile 4 Series Chipset PCI Express Graphics Port + 2a42 Mobile 4 Series Chipset Integrated Graphics Controller + 2a43 Mobile 4 Series Chipset Integrated Graphics Controller + 2a44 Mobile 4 Series Chipset MEI Controller + 2a45 Mobile 4 Series Chipset MEI Controller + 2a46 Mobile 4 Series Chipset PT IDER Controller + 2a47 Mobile 4 Series Chipset AMT SOL Redirection + 2a50 Cantiga MEI Controller + 2a51 Cantiga MEI Controller + 2a52 Cantiga PT IDER Controller + 2a53 Cantiga AMT SOL Redirection + 2b00 Nehalem-EX System Configuration Controller 1 + 2b02 Nehalem-EX System Configuration Controller 2 + 2b04 Nehalem-EX Power Controller + 2b08 Nehalem-EX Caching Agent 0 + 2b0c Nehalem-EX Caching Agent 1 + 2b10 Nehalem-EX QPI Home Agent 0 + 2b13 Nehalem-EX Memory Controller 0c + 2b14 Nehalem-EX Memory Controller 0a + 2b16 Nehalem-EX Memory Controller 0b + 2b18 Nehalem-EX QPI Home Agent 1 + 2b1b Nehalem-EX Memory Controller 1c + 2b1c Nehalem-EX Memory Controller 1a + 2b1e Nehalem-EX Memory Controller 1b + 2b20 Nehalem-EX Last Level Cache Coherence Engine 0 + 2b24 Nehalem-EX Last Level Cache Coherence Engine 1 + 2b28 Nehalem-EX Last Level Cache Coherence Engine 2 + 2b2c Nehalem-EX Last Level Cache Coherence Engine 3 + 2b30 Nehalem-EX Last Level Cache Coherence Engine 4 + 2b34 Nehalem-EX Last Level Cache Coherence Engine 5 + 2b38 Nehalem-EX Last Level Cache Coherence Engine 6 + 2b3c Nehalem-EX Last Level Cache Coherence Engine 7 + 2b40 Nehalem-EX QPI Router Port 0-1 + 2b42 Nehalem-EX QPI Router Port 2-3 + 2b44 Nehalem-EX QPI Router Port 4-5 + 2b46 Nehalem-EX QPI Router Port 6-7 + 2b48 Nehalem-EX Test and Debug 0 + 2b4c Nehalem-EX Test and Debug 1 + 2b50 Nehalem-EX QPI Physical Port 0: REUT control/status + 2b52 Nehalem-EX QPI Physical Port 0: Misc. control/status + 2b54 Nehalem-EX QPI Physical Port 1: REUT control/status + 2b56 Nehalem-EX QPI Physical Port 1: Misc. control/status + 2b58 Nehalem-EX QPI Physical Port 2: REUT control/status + 2b5a Nehalem-EX QPI Physical Port 2: Misc. control/status + 2b5c Nehalem-EX QPI Physical Port 3: REUT control/status + 2b5e Nehalem-EX QPI Physical Port 3: Misc. control/status + 2b60 Nehalem-EX SMI Physical Port 0: REUT control/status + 2b62 Nehalem-EX SMI Physical Port 0: Misc control/status + 2b64 Nehalem-EX SMI Physical Port 0: REUT control/status + 2b66 Nehalem-EX SMI Physical Port 1: Misc control/status + 2b68 Nehalem-EX System Configuration Controller 3 + 2b6a Nehalem-EX System Configuration Controller 4 + 2c01 Xeon 5500/Core i7 QuickPath Architecture System Address Decoder + 2c10 Xeon 5500/Core i7 QPI Link 0 + 2c11 Xeon 5500/Core i7 QPI Physical 0 + 2c14 Xeon 5500/Core i7 QPI Link 1 + 2c15 Xeon 5500/Core i7 QPI Physical 1 + 2c18 Xeon 5500/Core i7 Integrated Memory Controller + 2c19 Xeon 5500/Core i7 Integrated Memory Controller Target Address Decoder + 2c1a Xeon 5500/Core i7 Integrated Memory Controller RAS Registers + 2c1c Xeon 5500/Core i7 Integrated Memory Controller Test Registers + 2c20 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Control Registers + 2c21 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Address Registers + 2c22 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Rank Registers + 2c23 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Thermal Control Registers + 2c28 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Control Registers + 2c29 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Address Registers + 2c2a Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Rank Registers + 2c2b Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Thermal Control Registers + 2c30 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Control Registers + 2c31 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Address Registers + 2c32 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Rank Registers + 2c33 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Thermal Control Registers + 2c40 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers + 2c41 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers + 2c50 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c51 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c52 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c53 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c54 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c55 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c56 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c57 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c58 Jasper Forest QPI Generic Non-core Registers + 2c59 Jasper Forest QPI Generic Non-core Registers + 2c5a Jasper Forest QPI Generic Non-core Registers + 2c5b Jasper Forest QPI Generic Non-core Registers + 2c5c Jasper Forest QPI Generic Non-core Registers + 2c5d Jasper Forest QPI Generic Non-core Registers + 2c5e Jasper Forest QPI Generic Non-core Registers + 2c5f Jasper Forest QPI Generic Non-core Registers + 2c62 QuickPath Architecture Generic Non-core Registers + 2c70 QuickPath Architecture Generic Non-core Registers + 2c81 Core Processor QuickPath Architecture System Address Decoder + 2c90 Core Processor QPI Link 0 + 2c91 Core Processor QPI Physical 0 + 2c98 Core Processor Integrated Memory Controller + 2c99 Core Processor Integrated Memory Controller Target Address Decoder + 2c9c Core Processor Integrated Memory Controller Test Registers + 2ca0 Core Processor Integrated Memory Controller Channel 0 Control Registers + 2ca1 Core Processor Integrated Memory Controller Channel 0 Address Registers + 2ca2 Core Processor Integrated Memory Controller Channel 0 Rank Registers + 2ca3 Core Processor Integrated Memory Controller Channel 0 Thermal Control Registers + 2ca8 Core Processor Integrated Memory Controller Channel 1 Control Registers + 2ca9 Core Processor Integrated Memory Controller Channel 1 Address Registers + 2caa Core Processor Integrated Memory Controller Channel 1 Rank Registers + 2cab Core Processor Integrated Memory Controller Channel 1 Thermal Control Registers + 2cc1 Jasper Forest QPI System Address Decoder + 2cd0 Jasper Forest QPI Link 0 + 2cd1 Jasper Forest QPI Physical 0 + 2cd4 Jasper Forest QPI Link 1 + 2cd5 Jasper Forest QPI Physical 1 + 2cd8 Jasper Forest Integrated Memory Controller Registers + 2cd9 Jasper Forest Integrated Memory Controller Target Address Decoder + 2cda Jasper Forest Integrated Memory Controller RAS Registers + 2cdc Jasper Forest Integrated Memory Controller Test Registers + 2ce0 Jasper Forest Integrated Memory Controller Channel 0 Control + 2ce1 Jasper Forest Integrated Memory Controller Channel 0 Address + 2ce2 Jasper Forest Integrated Memory Controller Channel 0 Rank + 2ce3 Jasper Forest Integrated Memory Controller Channel 0 Thermal Control + 2ce8 Jasper Forest Integrated Memory Controller Channel 1 Control + 2ce9 Jasper Forest Integrated Memory Controller Channel 1 Address + 2cea Jasper Forest Integrated Memory Controller Channel 1 Rank + 2ceb Jasper Forest Integrated Memory Controller Channel 1 Thermal Control + 2cf0 Jasper Forest Integrated Memory Controller Channel 2 Control + 2cf1 Jasper Forest Integrated Memory Controller Channel 2 Address + 2cf2 Jasper Forest Integrated Memory Controller Channel 2 Rank + 2cf3 Jasper Forest Integrated Memory Controller Channel 2 Thermal Control + 2d01 QuickPath Architecture System Address Decoder + 2d10 QPI Link 0 + 2d11 QPI Physical 0 + 2d81 QuickPath Architecture System Address Decoder + 2d90 QPI Link 0 + 2d91 QPI Physical 0 + 2d92 Mirror Port Link 0 + 2d93 Mirror Port Link 1 + 2d94 QPI Link 1 + 2d95 QPI Physical 1 + 2d98 Integrated Memory Controller Registers + 2d99 Integrated Memory Controller Target Address Decoder + 2d9a Integrated Memory Controller RAS Registers + 2d9c Integrated Memory Controller Test Registers + 2da0 Integrated Memory Controller Channel 0 Control + 2da1 Integrated Memory Controller Channel 0 Address + 2da2 Integrated Memory Controller Channel 0 Rank + 2da3 Integrated Memory Controller Channel 0 Thermal Control + 2da8 Integrated Memory Controller Channel 1 Control + 2da9 Integrated Memory Controller Channel 1 Address + 2daa Integrated Memory Controller Channel 1 Rank + 2dab Integrated Memory Controller Channel 1 Thermal Control + 2db0 Integrated Memory Controller Channel 2 Control + 2db1 Integrated Memory Controller Channel 2 Address + 2db2 Integrated Memory Controller Channel 2 Rank + 2db3 Integrated Memory Controller Channel 2 Thermal Control + 2e00 4 Series Chipset DRAM Controller + 2e01 4 Series Chipset PCI Express Root Port + 2e02 4 Series Chipset Integrated Graphics Controller + 2e03 4 Series Chipset Integrated Graphics Controller + 2e04 4 Series Chipset HECI Controller + 2e05 4 Series Chipset HECI Controller + 2e06 4 Series Chipset PT IDER Controller + 2e07 4 Series Chipset Serial KT Controller + 2e10 4 Series Chipset DRAM Controller + 2e11 4 Series Chipset PCI Express Root Port + 2e12 4 Series Chipset Integrated Graphics Controller + 2e13 4 Series Chipset Integrated Graphics Controller + 2e14 4 Series Chipset HECI Controller + 2e15 4 Series Chipset HECI Controller + 2e16 4 Series Chipset PT IDER Controller + 2e17 4 Series Chipset Serial KT Controller + 2e20 4 Series Chipset DRAM Controller + 1458 5000 GA-EP45-DS5 Motherboard + 2e21 4 Series Chipset PCI Express Root Port + 1458 5000 GA-EP45-DS5 Motherboard + 2e22 4 Series Chipset Integrated Graphics Controller + 2e23 4 Series Chipset Integrated Graphics Controller + 2e24 4 Series Chipset HECI Controller + 2e25 4 Series Chipset HECI Controller + 2e26 4 Series Chipset PT IDER Controller + 2e27 4 Series Chipset Serial KT Controller + 2e29 4 Series Chipset PCI Express Root Port + 2e30 4 Series Chipset DRAM Controller + 2e31 4 Series Chipset PCI Express Root Port + 2e32 4 Series Chipset Integrated Graphics Controller + 2e33 4 Series Chipset Integrated Graphics Controller + 2e34 4 Series Chipset HECI Controller + 2e35 4 Series Chipset HECI Controller + 2e36 4 Series Chipset PT IDER Controller + 2e37 4 Series Chipset Serial KT Controller + 2e40 4 Series Chipset DRAM Controller + 2e41 4 Series Chipset PCI Express Root Port + 2e42 4 Series Chipset Integrated Graphics Controller + 2e43 4 Series Chipset Integrated Graphics Controller + 2e44 4 Series Chipset HECI Controller + 2e45 4 Series Chipset HECI Controller + 2e46 4 Series Chipset PT IDER Controller + 2e47 4 Series Chipset Serial KT Controller + 2e91 4 Series Chipset PCI Express Root Port + 2e92 4 Series Chipset Integrated Graphics Controller + 2e93 4 Series Chipset Integrated Graphics Controller + 2e94 4 Series Chipset HECI Controller + 2e95 4 Series Chipset HECI Controller + 2e96 4 Series Chipset PT IDER Controller + 3200 GD31244 PCI-X SATA HBA + 1775 c200 C2K onboard SATA host bus adapter + 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA + 331b IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA + 3331 IOC340 I/O Controller (VV8e) SAS/SATA + 3339 IOC340 I/O Controller (VV8x) SAS/SATA + 3340 82855PM Processor to I/O Controller + 1014 0529 Thinkpad T40 series + 1025 005a TravelMate 290 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 3341 82855PM Processor to AGP Controller + 144d c00c P30 notebook + 3363 IOC340 I/O Controller in IOC Mode SAS/SATA + 3382 81342 [Chevelon] I/O Processor (ATUe) + 33c3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA + 33cb IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA + 3400 5520/5500/X58 I/O Hub to ESI Port + 3401 5520/5500/X58 I/O Hub to ESI Port + 3402 5520/5500/X58 I/O Hub to ESI Port + 3403 5500 I/O Hub to ESI Port + 1028 0236 PowerEdge R610 I/O Hub to ESI Port + 1028 0287 PowerEdge M610 I/O Hub to ESI Port + 1028 028c PowerEdge R410 I/O Hub to ESI Port + 1028 028d PowerEdge T410 I/O Hub to ESI Port + 3404 5520/5500/X58 I/O Hub to ESI Port + 3405 X58 I/O Hub to ESI Port + 3406 5520 I/O Hub to ESI Port + 3407 5520/5500/X58 I/O Hub to ESI Port + 3408 5520/5500/X58 I/O Hub PCI Express Root Port 1 + 3409 5520/5500/X58 I/O Hub PCI Express Root Port 2 + 340a 5520/5500/X58 I/O Hub PCI Express Root Port 3 + 340b 5520/X58 I/O Hub PCI Express Root Port 4 + 340c 5520/X58 I/O Hub PCI Express Root Port 5 + 340d 5520/X58 I/O Hub PCI Express Root Port 6 + 340e 5520/5500/X58 I/O Hub PCI Express Root Port 7 + 340f 5520/5500/X58 I/O Hub PCI Express Root Port 8 + 3410 5520/5500/X58 I/O Hub PCI Express Root Port 9 + 3411 5520/5500/X58 I/O Hub PCI Express Root Port 10 + 3418 5520/5500/X58 Physical Layer Port 0 + 3419 5520/5500 Physical Layer Port 1 + 3420 5500 Non-Legacy I/O Hub PCI Express Root Port 0 + 3421 5520 Non-Legacy I/O Hub PCI Express Root Port 0 + 3422 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers + 3423 5520/5500/X58 I/O Hub Control Status and RAS Registers + 3425 5520/5500/X58 Physical and Link Layer Registers Port 0 + 3426 5520/5500/X58 Routing and Protocol Layer Registers Port 0 + 3427 5520/5500 Physical and Link Layer Registers Port 1 + 3428 5520/5500 Routing & Protocol Layer Register Port 1 + 3429 5520/5500/X58 Chipset QuickData Technology Device + 342a 5520/5500/X58 Chipset QuickData Technology Device + 342b 5520/5500/X58 Chipset QuickData Technology Device + 342c 5520/5500/X58 Chipset QuickData Technology Device + 342d 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller + 342e 5520/5500/X58 I/O Hub System Management Registers + 342f 5520/5500/X58 Trusted Execution Technology Registers + 3430 5520/5500/X58 Chipset QuickData Technology Device + 3431 5520/5500/X58 Chipset QuickData Technology Device + 3432 5520/5500/X58 Chipset QuickData Technology Device + 3433 5520/5500/X58 Chipset QuickData Technology Device + 3438 5520/5500/X58 I/O Hub Throttle Registers + 3500 6311ESB/6321ESB PCI Express Upstream Port + 3501 6310ESB PCI Express Upstream Port + 3504 6311ESB/6321ESB I/OxAPIC Interrupt Controller + 3505 6310ESB I/OxAPIC Interrupt Controller + 350c 6311ESB/6321ESB PCI Express to PCI-X Bridge + 350d 6310ESB PCI Express to PCI-X Bridge + 3510 6311ESB/6321ESB PCI Express Downstream Port E1 + 3511 6310ESB PCI Express Downstream Port E1 + 3514 6311ESB/6321ESB PCI Express Downstream Port E2 + 3515 6310ESB PCI Express Downstream Port E2 + 3518 6311ESB/6321ESB PCI Express Downstream Port E3 + 3519 6310ESB PCI Express Downstream Port E3 + 3575 82830 830 Chipset Host Bridge + 0e11 0030 Evo N600c + 1014 021d ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 3576 82830 830 Chipset AGP Bridge + 3577 82830 CGC [Chipset Graphics Controller] + 1014 0513 ThinkPad A/T/X Series + 3578 82830 830 Chipset Host Bridge + 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055c ThinkPad R50e + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller + 1734 1055 Amilo M1420 + 3582 82852/855GM Integrated Graphics Device + 1014 0562 ThinkPad R50e + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 114a 0582 PC8 integrated graphics + 1775 10d0 V5D Single Board Computer VGA + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055d ThinkPad R50e + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055e ThinkPad R50e + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 358c 82854 GMCH + 358e 82854 GMCH Integrated Graphics Device + 3590 E7520 Memory Controller Hub + 1014 02dd eServer xSeries server mainboard + 1028 016c PowerEdge 1850 Memory Controller Hub + 1028 016d PowerEdge 2850 Memory Controller Hub + 1028 019a PowerEdge SC1425 + 1734 103e PRIMERGY RX/TX S2 series + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 3591 E7525/E7520 Error Reporting Registers + 1014 02dd eServer xSeries server mainboard + 1028 0169 Precision 470 + 4c53 10d0 Telum ASLP10 Processor AMC + 3592 E7320 Memory Controller Hub + 3593 E7320 Error Reporting Registers + 3594 E7520 DMA Controller + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 3595 E7525/E7520/E7320 PCI Express Port A + 1775 1100 CR11/VR11 Single Board Computer + 3596 E7525/E7520/E7320 PCI Express Port A1 + 3597 E7525/E7520 PCI Express Port B + 1775 1100 CR11/VR11 Single Board Computer + 3598 E7520 PCI Express Port B1 + 1775 1100 CR11/VR11 Single Board Computer + 3599 E7520 PCI Express Port C + 1775 1100 CR11/VR11 Single Board Computer + 359a E7520 PCI Express Port C1 + 359b E7525/E7520/E7320 Extended Configuration Registers + 1014 02dd eServer xSeries server mainboard + 359e E7525 Memory Controller Hub + 1028 0169 Precision 470 + 35b0 3100 Chipset Memory I/O Controller Hub + 35b1 3100 DRAM Controller Error Reporting Registers + 35b5 3100 Chipset Enhanced DMA Controller + 35b6 3100 Chipset PCI Express Port A + 35b7 3100 Chipset PCI Express Port A1 + 35c8 3100 Extended Configuration Test Overflow Registers + 3600 7300 Chipset Memory Controller Hub + 3604 7300 Chipset PCI Express Port 1 + 3605 7300 Chipset PCI Express Port 2 + 3606 7300 Chipset PCI Express Port 3 + 3607 7300 Chipset PCI Express Port 4 + 3608 7300 Chipset PCI Express Port 5 + 3609 7300 Chipset PCI Express Port 6 + 360a 7300 Chipset PCI Express Port 7 + 360b 7300 Chipset QuickData Technology Device + 360c 7300 Chipset FSB Registers + 1028 01f0 PowerEdge R900 7300 Chipset FSB Registers + 360d 7300 Chipset Snoop Filter Registers + 360e 7300 Chipset Debug and Miscellaneous Registers + 360f 7300 Chipset FBD Branch 0 Registers + 3610 7300 Chipset FBD Branch 1 Registers + 3700 Jasper Forest DMI + 3701 Jasper Forest DMI + 3702 Jasper Forest DMI + 3703 Jasper Forest DMI + 3704 Jasper Forest DMI + 3705 Jasper Forest DMI + 3706 Jasper Forest DMI + 3707 Jasper Forest DMI + 3708 Jasper Forest DMI + 3709 Jasper Forest DMI + 370a Jasper Forest DMI + 370b Jasper Forest DMI + 370c Jasper Forest DMI + 370d Jasper Forest DMI + 370e Jasper Forest DMI + 370f Jasper Forest DMI + 3710 Jasper Forest CB3 DMA + 3711 Jasper Forest CB3 DMA + 3712 Jasper Forest CB3 DMA + 3713 Jasper Forest CB3 DMA + 3714 Jasper Forest CB3 DMA + 3715 Jasper Forest CB3 DMA + 3716 Jasper Forest CB3 DMA + 3717 Jasper Forest CB3 DMA + 3718 Jasper Forest CB3 DMA + 3719 Jasper Forest CB3 DMA + 371a Jasper Forest QPI Link + 371b Jasper Forest QPI Routing and Protocol + 371d Jasper Forest QPI Routing and Protocol + 3721 Jasper Forest PCI Express Root Port 1 + 3722 Jasper Forest PCI Express Root Port 2 + 3723 Jasper Forest PCI Express Root Port 3 + 3724 Jasper Forest PCI Express Root Port 4 + 3725 Jasper Forest NTB Primary + 3726 Jasper Forest NTB Primary + 3727 Jasper Forest NTB Secondary + 3728 Jasper Forest Core + 3729 Jasper Forest Core + 372a Jasper Forest Core + 372b Jasper Forest Core + 372c Jasper Forest Reserved + 373f Jasper Forest IOxAPIC + 3a00 82801JD/DO (ICH10 Family) 4-port SATA IDE Controller + 3a02 82801JD/DO (ICH10 Family) SATA AHCI Controller + 3a05 82801JD/DO (ICH10 Family) SATA RAID Controller + 3a06 82801JD/DO (ICH10 Family) 2-port SATA IDE Controller + 3a14 82801JDO (ICH10DO) LPC Interface Controller + 3a16 82801JIR (ICH10R) LPC Interface Controller + 1028 028c PowerEdge R410 LPC Interface Controller + 1028 028d PowerEdge T410 LPC Interface Controller + 1458 5001 GA-EP45-DS5 Motherboard + 3a18 82801JIB (ICH10) LPC Interface Controller + 3a1a 82801JD (ICH10D) LPC Interface Controller + 3a20 82801JI (ICH10 Family) 4 port SATA IDE Controller + 1028 028c PowerEdge R410 SATA IDE Controller + 1028 028d PowerEdge T410 SATA IDE Controller + 3a22 82801JI (ICH10 Family) SATA AHCI Controller + 1043 82d4 P5Q Deluxe Motherboard + 1458 b005 GA-EP45-DS5 Motherboard + 3a25 82801JIR (ICH10R) SATA RAID Controller + 1028 028c PERC S100 Controller (PE R410) + 1028 028d PERC S100 Controller (PE T410) + 1028 02f1 PERC S100 Controller (PE R510) + 3a26 82801JI (ICH10 Family) 2 port SATA IDE Controller + 1028 028c PowerEdge R410 SATA IDE Controller + 1028 028d PowerEdge T410 SATA IDE Controller + 3a30 82801JI (ICH10 Family) SMBus Controller + 1458 5001 GA-EP45-DS5 Motherboard + 3a32 82801JI (ICH10 Family) Thermal Subsystem + 3a34 82801JI (ICH10 Family) USB UHCI Controller #1 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a35 82801JI (ICH10 Family) USB UHCI Controller #2 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a36 82801JI (ICH10 Family) USB UHCI Controller #3 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a37 82801JI (ICH10 Family) USB UHCI Controller #4 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a38 82801JI (ICH10 Family) USB UHCI Controller #5 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a39 82801JI (ICH10 Family) USB UHCI Controller #6 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 1458 5004 GA-EP45-DS5 Motherboard + 3a3a 82801JI (ICH10 Family) USB2 EHCI Controller #1 + 1028 028c PowerEdge R410 USB EHCI Controller + 1028 028d PowerEdge T410 USB EHCI Controller + 1458 5006 GA-EP45-DS5 Motherboard + 3a3c 82801JI (ICH10 Family) USB2 EHCI Controller #2 + 1028 028c PowerEdge R410 USB EHCI Controller + 1028 028d PowerEdge T410 USB EHCI Controller + 1458 5006 GA-EP45-DS5 Motherboard + 3a3e 82801JI (ICH10 Family) HD Audio Controller + 1458 a102 GA-EP45-DS5 Motherboard + 3a40 82801JI (ICH10 Family) PCI Express Port 1 + 1028 028c PowerEdge R410 PCI Express Port 1 + 1028 028d PowerEdge T410 PCI Express Port 1 + 1458 5001 GA-EP45-DS5 Motherboard + 3a42 82801JI (ICH10 Family) PCI Express Port 2 + 3a44 82801JI (ICH10 Family) PCI Express Port 3 + 3a46 82801JI (ICH10 Family) PCI Express Port 4 + 1458 5001 GA-EP45-DS5 Motherboard + 3a48 82801JI (ICH10 Family) PCI Express Port 5 + 1458 5001 GA-EP45-DS5 Motherboard + 3a4a 82801JI (ICH10 Family) PCI Express Port 6 + 1458 5001 GA-EP45-DS5 Motherboard + 3a4c 82801JI (ICH10 Family) Gigabit Ethernet Controller + 3a51 82801JDO (ICH10DO) VECI Controller + 3a55 82801JD/DO (ICH10 Family) Virtual SATA Controller + 3a60 82801JD/DO (ICH10 Family) SMBus Controller + 3a62 82801JD/DO (ICH10 Family) Thermal Subsystem + 3a64 82801JD/DO (ICH10 Family) USB UHCI Controller #1 + 3a65 82801JD/DO (ICH10 Family) USB UHCI Controller #2 + 3a66 82801JD/DO (ICH10 Family) USB UHCI Controller #3 + 3a67 82801JD/DO (ICH10 Family) USB UHCI Controller #4 + 3a68 82801JD/DO (ICH10 Family) USB UHCI Controller #5 + 3a69 82801JD/DO (ICH10 Family) USB UHCI Controller #6 + 3a6a 82801JD/DO (ICH10 Family) USB2 EHCI Controller #1 + 3a6c 82801JD/DO (ICH10 Family) USB2 EHCI Controller #2 + 3a6e 82801JD/DO (ICH10 Family) HD Audio Controller + 3a70 82801JD/DO (ICH10 Family) PCI Express Port 1 + 3a72 82801JD/DO (ICH10 Family) PCI Express Port 2 + 3a74 82801JD/DO (ICH10 Family) PCI Express Port 3 + 3a76 82801JD/DO (ICH10 Family) PCI Express Port 4 + 3a78 82801JD/DO (ICH10 Family) PCI Express Port 5 + 3a7a 82801JD/DO (ICH10 Family) PCI Express Port 6 + 3a7c 82801JD/DO (ICH10 Family) Gigabit Ethernet Controller + 3b00 5 Series/3400 Series Chipset LPC Interface Controller + 3b01 Mobile 5 Series Chipset LPC Interface Controller + 3b02 5 Series Chipset LPC Interface Controller + 3b03 Mobile 5 Series Chipset LPC Interface Controller + 3b04 5 Series Chipset LPC Interface Controller + 3b05 Mobile 5 Series Chipset LPC Interface Controller + 3b06 5 Series Chipset LPC Interface Controller + 3b07 Mobile 5 Series Chipset LPC Interface Controller + 3b08 5 Series Chipset LPC Interface Controller + 3b09 Mobile 5 Series Chipset LPC Interface Controller + 3b0a 5 Series Chipset LPC Interface Controller + 3b0b Mobile 5 Series Chipset LPC Interface Controller + 3b0c 5 Series Chipset LPC Interface Controller + 3b0d 5 Series/3400 Series Chipset LPC Interface Controller + 3b0e 5 Series/3400 Series Chipset LPC Interface Controller + 3b0f 5 Series/3400 Series Chipset LPC Interface Controller + 3b10 5 Series/3400 Series Chipset LPC Interface Controller + 3b11 5 Series/3400 Series Chipset LPC Interface Controller + 3b12 3400 Series Chipset LPC Interface Controller + 3b13 5 Series/3400 Series Chipset LPC Interface Controller + 3b14 3400 Series Chipset LPC Interface Controller + 3b15 5 Series/3400 Series Chipset LPC Interface Controller + 3b16 3400 Series Chipset LPC Interface Controller + 3b17 5 Series/3400 Series Chipset LPC Interface Controller + 3b18 5 Series/3400 Series Chipset LPC Interface Controller + 3b19 5 Series/3400 Series Chipset LPC Interface Controller + 3b1a 5 Series/3400 Series Chipset LPC Interface Controller + 3b1b 5 Series/3400 Series Chipset LPC Interface Controller + 3b1c 5 Series/3400 Series Chipset LPC Interface Controller + 3b1d 5 Series/3400 Series Chipset LPC Interface Controller + 3b1e 5 Series/3400 Series Chipset LPC Interface Controller + 3b1f 5 Series/3400 Series Chipset LPC Interface Controller + 3b20 5 Series/3400 Series Chipset 4 port SATA IDE Controller + 3b21 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 3b22 5 Series/3400 Series Chipset 6 port SATA AHCI Controller + 3b23 5 Series/3400 Series Chipset 4 port SATA AHCI Controller + 3b25 5 Series/3400 Series Chipset SATA RAID Controller + 3b26 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 3b28 5 Series/3400 Series Chipset 4 port SATA IDE Controller + 3b29 5 Series/3400 Series Chipset 4 port SATA AHCI Controller + 3b2c 5 Series/3400 Series Chipset SATA RAID Controller + 3b2d 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 3b2e 5 Series/3400 Series Chipset 4 port SATA IDE Controller + 3b2f 5 Series/3400 Series Chipset 6 port SATA AHCI Controller + 3b30 5 Series/3400 Series Chipset SMBus Controller + 3b32 5 Series/3400 Series Chipset Thermal Subsystem + 3b34 5 Series/3400 Series Chipset USB2 Enhanced Host Controller + 3b36 5 Series/3400 Series Chipset USB Universal Host Controller + 3b37 5 Series/3400 Series Chipset USB Universal Host Controller + 3b38 5 Series/3400 Series Chipset USB Universal Host Controller + 3b39 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3a 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3b 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3c 5 Series/3400 Series Chipset USB2 Enhanced Host Controller + 3b3e 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3f 5 Series/3400 Series Chipset USB Universal Host Controller + 3b40 5 Series/3400 Series Chipset USB Universal Host Controller + 3b41 5 Series/3400 Series Chipset LAN Controller + 3b42 5 Series/3400 Series Chipset PCI Express Root Port 1 + 3b44 5 Series/3400 Series Chipset PCI Express Root Port 2 + 3b46 5 Series/3400 Series Chipset PCI Express Root Port 3 + 3b48 5 Series/3400 Series Chipset PCI Express Root Port 4 + 3b4a 5 Series/3400 Series Chipset PCI Express Root Port 5 + 3b4c 5 Series/3400 Series Chipset PCI Express Root Port 6 + 3b4e 5 Series/3400 Series Chipset PCI Express Root Port 7 + 3b50 5 Series/3400 Series Chipset PCI Express Root Port 8 + 3b53 5 Series/3400 Series Chipset VECI Controller + 3b56 5 Series/3400 Series Chipset High Definition Audio + 3b64 5 Series/3400 Series Chipset HECI Controller + 3b65 5 Series/3400 Series Chipset HECI Controller + 3b66 5 Series/3400 Series Chipset PT IDER Controller + 3b67 5 Series/3400 Series Chipset KT Controller + 4000 5400 Chipset Memory Controller Hub + 4001 5400 Chipset Memory Controller Hub + 4003 5400 Chipset Memory Controller Hub + 4021 5400 Chipset PCI Express Port 1 + 4022 5400 Chipset PCI Express Port 2 + 4023 5400 Chipset PCI Express Port 3 + 4024 5400 Chipset PCI Express Port 4 + 4025 5400 Chipset PCI Express Port 5 + 4026 5400 Chipset PCI Express Port 6 + 4027 5400 Chipset PCI Express Port 7 + 4028 5400 Chipset PCI Express Port 8 + 4029 5400 Chipset PCI Express Port 9 + 402d 5400 Chipset IBIST Registers + 402e 5400 Chipset IBIST Registers + 402f 5400 Chipset QuickData Technology Device + 4030 5400 Chipset FSB Registers + 4031 5400 Chipset CE/SF Registers + 4032 5400 Chipset IOxAPIC + 4035 5400 Chipset FBD Registers + 4036 5400 Chipset FBD Registers + 4220 PRO/Wireless 2200BG [Calexico2] Network Connection + 103c 0934 Compaq nw8240/nx8220 + 103c 12f6 Compaq nw8240/nx8220 + 8086 2712 IBM ThinkPad R50e + 8086 2721 Dell B130 laptop integrated WLAN + 8086 2722 Dell Latitude D600 + 8086 2731 Samsung P35 integrated WLAN + 4222 PRO/Wireless 3945ABG [Golan] Network Connection + 103c 135c Compaq 6710b or nx9420 Notebook + 8086 1000 PRO/Wireless 3945ABG Network Connection + 8086 1001 PRO/Wireless 3945ABG Network Connection + 8086 1005 PRO/Wireless 3945BG Network Connection + 8086 1034 PRO/Wireless 3945BG Network Connection + 8086 1044 PRO/Wireless 3945BG Network Connection + 8086 1c00 PRO/Wireless 3945ABG Network Connection + 4223 PRO/Wireless 2915ABG [Calexico2] Network Connection + 1000 8086 mPCI 3B Americas/Europe ZZA + 1001 8086 mPCI 3B Europe ZZE + 1002 8086 mPCI 3B Japan ZZJ + 1003 8086 mPCI 3B High-Band ZZH + 1351 103c Compaq NC6220 + 4224 PRO/Wireless 2915ABG [Calexico2] Network Connection + 4227 PRO/Wireless 3945ABG [Golan] Network Connection + 8086 1011 ThinkPad R60e/X60s + 8086 1014 PRO/Wireless 3945BG Network Connection + 4229 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection + 422b WiFi Link 6000 Series + 4230 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection + 8086 1110 Lenovo ThinkPad T51 + 8086 1111 Lenovo ThinkPad T61 + 4232 Wireless WiFi Link 5100 + 8086 1205 PRO/Wireless 5100BG Network Connection + 8086 1206 PRO/Wireless 5100ABG Network Connection + 8086 1216 PRO/Wireless 5100ABG Network Connection + 8086 1305 PRO/Wireless 5100BG Network Connection + 8086 1306 PRO/Wireless 5100ABG Network Connection + 8086 1321 Wireless WiFi Link 5100 + 8086 1326 PRO/Wireless 5100ABG Network Connection + 4235 PRO/Wireless 5300 AGN [Shiloh] Network Connection + 4236 Wireless WiFi Link 5300 + 4237 PRO/Wireless 5100 AGN [Shiloh] Network Connection + 4238 WiFi Link 6000 Series + 423a PRO/Wireless 5350 AGN [Echo Peak] Network Connection + 423b PRO/Wireless 5350 AGN [Echo Peak] Network Connection + 423c WiMAX/WiFi Link 5050 Series + 423d WiMAX/WiFi Link 5050 Series + 444e Turbo Memory Controller + 5001 LE80578 + 5002 LE80578 Graphics Processor Unit + 5009 LE80578 Video Display Controller + 500d LE80578 Expansion Bus + 500e LE80578 UART Controller + 500f LE80578 General Purpose IO + 5010 LE80578 I2C Controller + 5012 LE80578 Serial Peripheral Interface Bus + 5020 EP80579 Memory Controller Hub + 5021 EP80579 DRAM Error Reporting Registers + 5023 EP80579 EDMA Controller + 5024 EP80579 PCI Express Port PEA0 + 5025 EP80579 PCI Express Port PEA1 + 5028 EP80579 S-ATA IDE + 5029 EP80579 S-ATA AHCI + 502a EP80579 S-ATA Reserved + 502b EP80579 S-ATA Reserved + 502c EP80579 Integrated Processor ASU + 502d EP80579 Integrated Processor with QuickAssist ASU + 502e EP80579 Reserved + 502f EP80579 Reserved + 5030 EP80579 Reserved + 5031 EP80579 LPC Bus + 5032 EP80579 SMBus Controller + 5033 EP80579 USB 1.1 Controller + 5035 EP80579 USB 2.0 Controller + 5037 EP80579 PCI-PCI Bridge (transparent mode) + 5039 EP80579 Controller Area Network (CAN) interface #1 + 503a EP80579 Controller Area Network (CAN) interface #2 + 503b EP80579 Synchronous Serial Port (SPP) + 503c EP80579 IEEE 1588 Hardware Assist + 503d EP80579 Local Expansion Bus + 503e EP80579 Global Control Unit (GCU) + 503f EP80579 Reserved + 5040 EP80579 Integrated Processor Gigabit Ethernet MAC + 5041 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 5042 EP80579 Reserved + 5043 EP80579 Reserved + 5044 EP80579 Integrated Processor Gigabit Ethernet MAC + 5045 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 5046 EP80579 Reserved + 5047 EP80579 Reserved + 5048 EP80579 Integrated Processor Gigabit Ethernet MAC + 5049 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 504a EP80579 Reserved + 504b EP80579 Reserved + 504c EP80579 Integrated Processor with QuickAssist TDM + 5200 EtherExpress PRO/100 Intelligent Server + 5201 EtherExpress PRO/100 Intelligent Server + 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter + 530d 80310 (IOP) IO Processor + 65c0 5100 Chipset Memory Controller Hub + 65e2 5100 Chipset PCI Express x4 Port 2 + 65e3 5100 Chipset PCI Express x4 Port 3 + 65e4 5100 Chipset PCI Express x4 Port 4 + 65e5 5100 Chipset PCI Express x4 Port 5 + 65e6 5100 Chipset PCI Express x4 Port 6 + 65e7 5100 Chipset PCI Express x4 Port 7 + 65f0 5100 Chipset FSB Registers + 1028 020f PowerEdge R300 + 1028 0210 PowerEdge T300 + 65f1 5100 Chipset Reserved Registers + 1028 0210 PowerEdge T300 + 65f3 5100 Chipset Reserved Registers + 65f5 5100 Chipset DDR Channel 0 Registers + 65f6 5100 Chipset DDR Channel 1 Registers + 65f7 5100 Chipset PCI Express x8 Port 2-3 + 65f8 5100 Chipset PCI Express x8 Port 4-5 + 65f9 5100 Chipset PCI Express x8 Port 6-7 + 65fa 5100 Chipset PCI Express x16 Port 4-7 + 65ff 5100 Chipset DMA Engine + 7000 82371SB PIIX3 ISA [Natoma/Triton II] + 1af4 1100 Qemu virtual machine + 7010 82371SB PIIX3 IDE [Natoma/Triton II] + 1af4 1100 Qemu virtual machine + 7020 82371SB PIIX3 USB [Natoma/Triton II] + 1af4 1100 Qemu virtual machine + 7030 430VX - 82437VX TVX [Triton VX] + 7050 Intercast Video Capture Card + 7051 PB 642365-003 (Business Video Conferencing Card) + 7100 430TX - 82439TX MTXC + 7110 82371AB/EB/MB PIIX4 ISA + 15ad 1976 Virtual Machine Chipset + 7111 82371AB/EB/MB PIIX4 IDE + 15ad 1976 Virtual Machine Chipset + 7112 82371AB/EB/MB PIIX4 USB + 15ad 1976 Virtual Machine Chipset + 7113 82371AB/EB/MB PIIX4 ACPI + 15ad 1976 Virtual Machine Chipset + 1af4 1100 Qemu virtual machine + 7120 82810 GMCH (Graphics Memory Controller Hub) + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard + 7121 82810 (CGC) Chipset Graphics Controller + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard + 8086 4341 Cayman (CA810) Mainboard + 7122 82810 DC-100 (GMCH) Graphics Memory Controller Hub + 7123 82810 DC-100 (CGC) Chipset Graphics Controller + 7124 82810E DC-133 (GMCH) Graphics Memory Controller Hub + 1028 00b4 OptiPlex GX110 + 7125 82810E DC-133 (CGC) Chipset Graphics Controller + 1028 00b4 OptiPlex GX110 + 7126 82810 DC-133 System and Graphics Controller + 7128 82810-M DC-100 System and Graphics Controller + 712a 82810-M DC-133 System and Graphics Controller + 7180 440LX/EX - 82443LX/EX Host bridge + 7181 440LX/EX - 82443LX/EX AGP bridge + 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge + 0e11 0500 Armada 1750 Laptop System Chipset + 0e11 b110 Armada M700/E500 + 1028 008e PowerEdge 1300 mainboard + 1043 803b CUBX-L/E Mainboard + 1179 0001 Toshiba Tecra 8100 Laptop System Chipset + 15ad 1976 Virtual Machine Chipset + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge + 1028 008e PowerEdge 1300 mainboard + 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) + 0e11 0460 Armada 1700 Laptop System Chipset + 1179 0001 Satellite 4010 + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 8086 7190 Dell PowerEdge 350 + 7194 82440MX Host Bridge + 1033 0000 Versa Note Vxi + 4c53 10a0 CA3/CR3 mainboard + 7195 82440MX AC'97 Audio Controller + 1033 80cc Versa Note VXi + 10cf 1099 QSound_SigmaTel Stac97 PCI Audio + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 7196 82440MX AC'97 Modem Controller + 7198 82440MX ISA Bridge + 7199 82440MX EIDE Controller + 719a 82440MX USB Universal Host Controller + 719b 82440MX Power Management Controller + 71a0 440GX - 82443GX Host bridge + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 71a1 440GX - 82443GX AGP bridge + 71a2 440GX - 82443GX Host bridge (AGP disabled) + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 7600 82372FB PIIX5 ISA + 7601 82372FB PIIX5 IDE + 7602 82372FB PIIX5 USB + 7603 82372FB PIIX5 SMBus + 7800 82740 (i740) AGP Graphics Accelerator + 003d 0008 Starfighter AGP + 003d 000b Starfighter AGP + 1092 0100 Stealth II G460 + 10b4 201a Lightspeed 740 + 10b4 202f Lightspeed 740 + 8086 0000 Terminator 2x/i + 8086 0100 Intel740 Graphics Accelerator + 8002 Trusted Execution Technology Registers + 8003 Trusted Execution Technology Registers + 8100 System Controller Hub (SCH Poulsbo) + 8108 System Controller Hub (SCH Poulsbo) Graphics Controller + 8110 System Controller Hub (SCH Poulsbo) PCI Express Port 1 + 8112 System Controller Hub (SCH Poulsbo) PCI Express Port 2 + 8114 System Controller Hub (SCH Poulsbo) USB UHCI #1 + 8115 System Controller Hub (SCH Poulsbo) USB UHCI #2 + 8116 System Controller Hub (SCH Poulsbo) USB UHCI #3 + 8117 System Controller Hub (SCH Poulsbo) USB EHCI #1 + 8118 System Controller Hub (SCH Poulsbo) USB Client Controller + 8119 System Controller Hub (SCH Poulsbo) LPC Bridge + 811a System Controller Hub (SCH Poulsbo) IDE Controller + 811b System Controller Hub (SCH Poulsbo) HD Audio Controller + 811c System Controller Hub (SCH Poulsbo) SDIO Controller #1 + 811d System Controller Hub (SCH Poulsbo) SDIO Controller #2 + 811e System Controller Hub (SCH Poulsbo) SDIO Controller #3 + 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge + 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller + 84ca 450NX - 82451NX Memory & I/O Controller + 84cb 450NX - 82454NX/84460GX PCI Expander Bridge + 84e0 460GX - 84460GX System Address Controller (SAC) + 84e1 460GX - 84460GX System Data Controller (SDC) + 84e2 460GX - 84460GX AGP Bridge (GXB function 2) + 84e3 460GX - 84460GX Memory Address Controller (MAC) + 84e4 460GX - 84460GX Memory Data Controller (MDC) + 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB) + 84ea 460GX - 84460GX AGP Bridge (GXB function 1) + 8500 IXP4XX Network Processor (IXP420/421/422/425/IXC1100) + 1993 0ded mGuard-PCI AV#2 + 1993 0dee mGuard-PCI AV#1 + 1993 0def mGuard-PCI AV#0 + 9000 IXP2000 Family Network Processor + 9001 IXP2400 Network Processor + 9002 IXP2300 Network Processor + 9004 IXP2800 Network Processor + 9621 Integrated RAID + 9622 Integrated RAID + 9641 Integrated RAID + 96a1 Integrated RAID + a000 Pineview DMI Bridge + a001 Pineview Integrated Graphics Controller + a002 Pineview Integrated Graphics Controller + a003 Pineview CHAPS counter + a010 Pineview DMI Bridge + a011 Pineview Integrated Graphics Controller + a012 Pineview Integrated Graphics Controller + a013 Pineview CHAPS counter + a620 6400/6402 Advanced Memory Buffer (AMB) + b152 21152 PCI-to-PCI Bridge + 8086 b152 21152 PCI-to-PCI Bridge +# observed, and documented in Intel revision note; new mask of 1011:0026 + b154 21154 PCI-to-PCI Bridge + b555 21555 Non transparent PCI-to-PCI Bridge + 12c7 5005 SS7HD PCI Adaptor Card + 12c7 5006 SS7HDC cPCI Adaptor Card + 12d9 000a PCI VoIP Gateway + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + e4bf 1000 CC8-1-BLUES + d130 Core Processor DMI + d131 Core Processor DMI + d132 Core Processor DMI + d133 Core Processor DMI + d134 Core Processor DMI + d135 Core Processor DMI + d136 Core Processor DMI + d137 Core Processor DMI + d138 Core Processor PCI Express Root Port 1 + d139 Core Processor PCI Express Root Port 2 + d13a Core Processor PCI Express Root Port 3 + d13b Core Processor PCI Express Root Port 4 + d150 Core Processor QPI Link + d151 Core Processor QPI Routing and Protocol Registers + d155 Core Processor System Management Registers + d156 Core Processor Semaphore and Scratchpad Registers + d157 Core Processor System Control and Status Registers + d158 Core Processor Miscellaneous Registers +80ee InnoTek Systemberatung GmbH + beef VirtualBox Graphics Adapter + cafe VirtualBox Guest Service +8322 Sodick America Corp. +8384 SigmaTel + 7618 High Definition Audio Codec + 7634 9250 HD Audio Codec + 7664 High Definition Audio Codec + 7670 9770 High Definition Audio + 7672 9772 High Definition Audio + 7682 IDT High Definition Audio Codec + 7690 9200 HD Audio Codec +8401 TRENDware International Inc. +8686 ScaleMP + 1010 vSMPowered system controller [vSMP CTL] +8800 Trigem Computer Inc. + 2008 Video assistent component +8866 T-Square Design Inc. +8888 Silicon Magic +8912 TRX +# 8c4a is not Winbond but there is a board misprogrammed +8c4a Winbond + 1980 W89C940 misprogrammed [ne2k] +8e0e Computone Corporation +8e2e KTI + 3000 ET32P2 +9004 Adaptec + 0078 AHA-2940U_CN + 1078 AIC-7810 + 1160 AIC-1160 [Family Fibre Channel Adapter] + 2178 AIC-7821 + 3860 AHA-2930CU + 3b78 AHA-4844W/4844UW + 5075 AIC-755x + 5078 AIC-7850 + 9004 7850 AHA-2904/Integrated AIC-7850 + 5175 AIC-755x + 5178 AIC-7851 + 5275 AIC-755x + 5278 AIC-7852 + 5375 AIC-755x + 5378 AIC-7850 + 5475 AIC-755x + 5478 AIC-7850 + 5575 AVA-2930 + 5578 AIC-7855 + 5647 ANA-7711 TCP Offload Engine + 9004 7710 ANA-7711F TCP Offload Engine - Optical + 9004 7711 ANA-7711LP TCP Offload Engine - Copper + 5675 AIC-755x + 5678 AIC-7856 + 5775 AIC-755x + 5778 AIC-7850 + 5800 AIC-5800 + 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter + 5905 ANA-5910A/5930A/5940A ATM Adapter + 6038 AIC-3860 + 6075 AIC-1480 / APA-1480 + 9004 7560 AIC-1480 / APA-1480 Cardbus + 6078 AIC-7860 + 6178 AIC-7861 + 9004 7861 AHA-2940AU Single + 6278 AIC-7860 + 6378 AIC-7860 + 6478 AIC-786x + 6578 AIC-786x + 6678 AIC-786x + 6778 AIC-786x + 6915 ANA620xx/ANA69011A + 9004 0008 ANA69011A/TX 10/100 + 9004 0009 ANA69011A/TX 10/100 + 9004 0010 ANA62022 2-port 10/100 + 9004 0018 ANA62044 4-port 10/100 + 9004 0019 ANA62044 4-port 10/100 + 9004 0020 ANA62022 2-port 10/100 + 9004 0028 ANA69011A/TX 10/100 + 9004 8008 ANA69011A/TX 64 bit 10/100 + 9004 8009 ANA69011A/TX 64 bit 10/100 + 9004 8010 ANA62022 2-port 64 bit 10/100 + 9004 8018 ANA62044 4-port 64 bit 10/100 + 9004 8019 ANA62044 4-port 64 bit 10/100 + 9004 8020 ANA62022 2-port 64 bit 10/100 + 9004 8028 ANA69011A/TX 64 bit 10/100 + 7078 AHA-294x / AIC-7870 + 7178 AHA-2940/2940W / AIC-7871 + 7278 AHA-3940/3940W / AIC-7872 + 7378 AHA-3985 / AIC-7873 + 7478 AHA-2944/2944W / AIC-7874 + 7578 AHA-3944/3944W / AIC-7875 + 7678 AHA-4944W/UW / AIC-7876 + 7710 ANA-7711F Network Accelerator Card (NAC) - Optical + 7711 ANA-7711C Network Accelerator Card (NAC) - Copper + 7778 AIC-787x + 7810 AIC-7810 + 7815 AIC-7815 RAID+Memory Controller IC + 9004 7815 ARO-1130U2 RAID Controller + 9004 7840 AIC-7815 RAID+Memory Controller IC + 7850 AIC-7850 + 7855 AHA-2930 + 7860 AIC-7860 + 7870 AIC-7870 + 7871 AHA-2940 + 7872 AHA-3940 + 7873 AHA-3980 + 7874 AHA-2944 + 7880 AIC-7880P + 7890 AIC-7890 + 7891 AIC-789x + 7892 AIC-789x + 7893 AIC-789x + 7894 AIC-789x + 7895 AHA-2940U/UW / AHA-39xx / AIC-7895 + 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7891 AHA-2940U/2940UW Dual + 9004 7892 AHA-3940AU/AUW/AUWD/UWD + 9004 7894 AHA-3944AUWD + 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 7896 AIC-789x + 7897 AIC-789x + 8078 AIC-7880U + 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset + 8178 AHA-2940U/UW/D / AIC-7881U + 9004 7881 AHA-2940UW SCSI Host Adapter + 8278 AHA-3940U/UW/UWD / AIC-7882U + 8378 AHA-3940U/UW / AIC-7883U + 8478 AHA-2944UW / AIC-7884U + 8578 AHA-3944U/UWD / AIC-7885 + 8678 AHA-4944UW / AIC-7886 + 8778 AHA-2940UW Pro / AIC-788x + 9004 7887 2940UW Pro Ultra-Wide SCSI Controller + 8878 AHA-2930UW / AIC-7888 + 9004 7888 AHA-2930UW SCSI Controller + 8b78 ABA-1030 + ec78 AHA-4944W/UW +9005 Adaptec + 0010 AHA-2940U2/U2W + 9005 2180 AHA-2940U2 SCSI Controller + 9005 8100 AHA-2940U2B SCSI Controller + 9005 a100 AHA-2940U2B SCSI Controller + 9005 a180 AHA-2940U2W SCSI Controller + 9005 e100 AHA-2950U2B SCSI Controller + 0011 AHA-2930U2 + 0013 78902 + 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller + 9005 000f AIC7890_ARO + 001f AHA-2940U2/U2W / 7890/7891 + 9005 000f 2940U2W SCSI Controller + 9005 a180 2940U2W SCSI Controller + 0020 AIC-7890 + 002f AIC-7890 + 0030 AIC-7890 + 003f AIC-7890 + 0050 AHA-3940U2x/395U2x + 9005 f500 AHA-3950U2B + 9005 ffff AHA-3950U2B + 0051 AHA-3950U2D + 9005 b500 AHA-3950U2D + 0053 AIC-7896 SCSI Controller + 9005 ffff AIC-7896 SCSI Controller mainboard implementation + 005f AIC-7896U2/7897U2 + 0080 AIC-7892A U160/m + 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter + 9005 6220 AHA-29160C + 9005 62a0 29160N Ultra160 SCSI Controller + 9005 e220 29160LP Low Profile Ultra160 SCSI Controller + 9005 e2a0 29160 Ultra160 SCSI Controller + 0081 AIC-7892B U160/m + 9005 62a1 19160 Ultra160 SCSI Controller + 0083 AIC-7892D U160/m + 008f AIC-7892P U160/m + 1179 0001 Magnia Z310 + 15d9 9005 Onboard SCSI Host Adapter + 0092 AVC-2010 [VideoH!] + 0093 AVC-2410 [VideoH!] + 00c0 AHA-3960D / AIC-7899A U160/m + 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter + 9005 f620 AHA-3960D U160/m + 00c1 AIC-7899B U160/m + 00c3 AIC-7899D U160/m + 00c5 RAID subsystem HBA + 1028 00c5 PowerEdge 2400,2500,2550,4400 + 00cf AIC-7899P U160/m + 1028 00ce PowerEdge 1400 + 1028 00d1 PowerEdge 2550 + 1028 00d9 PowerEdge 2500 + 10f1 2462 Thunder K7 S2462 + 15d9 9005 Onboard SCSI Host Adapter + 8086 3411 SDS2 Mainboard + 0241 Serial ATA II RAID 1420SA + 0242 Serial ATA II RAID 1220SA + 0243 Serial ATA II RAID 1430SA + 0244 eSATA II RAID 1225SA + 0250 ServeRAID Controller + 1014 0279 ServeRAID-xx + 1014 028c ServeRAID-xx + 0279 ServeRAID 6M + 0283 AAC-RAID + 9005 0283 Catapult + 0284 AAC-RAID + 9005 0284 Tomcat + 0285 AAC-RAID + 0e11 0295 SATA 6Ch (Bearcat) + 1014 02f2 ServeRAID 8i + 1028 0287 PowerEdge Expandable RAID Controller 320/DC + 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) + 103c 3227 AAR-2610SA + 108e 0286 STK RAID INT + 108e 0287 STK RAID EXT + 108e 7aac STK RAID REM + 108e 7aae STK RAID EX + 15d9 02b5 SMC AOC-USAS-S4i + 15d9 02b6 SMC AOC-USAS-S8i + 15d9 02c9 SMC AOC-USAS-S4iR + 15d9 02ca SMC AOC-USAS-S8iR + 15d9 02d2 SMC AOC-USAS-S8i-LP + 15d9 02d3 SMC AOC-USAS-S8iR-LP + 17aa 0286 Legend S220 (Legend Crusader) + 17aa 0287 Legend S230 (Legend Vulcan) + 9005 0285 2200S (Vulcan) + 9005 0286 2120S (Crusader) + 9005 0287 2200S (Vulcan-2m) + 9005 0288 3230S (Harrier) + 9005 0289 3240S (Tornado) +# Some early versions reported 2020S + 9005 028a ASR-2020ZCR +# Some early versions reported 2025S + 9005 028b ASR-2025ZCR (Terminator) + 9005 028e ASR-2020SA (Skyhawk) + 9005 028f ASR-2025SA + 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II) + 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8) + 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16) + 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler) + 9005 0296 ASR-2240S + 9005 0297 ASR-4005SAS + 9005 0298 ASR-4000 + 9005 0299 ASR-4800SAS + 9005 029a 4805SAS + 9005 02a4 ICP ICP9085LI + 9005 02a5 ICP ICP5085BR + 9005 02b5 ASR5800 + 9005 02b6 ASR5805 + 9005 02b7 ASR5808 + 9005 02b8 ICP5445SL + 9005 02b9 ICP5085SL + 9005 02ba ICP5805SL + 9005 02bb 3405 + 9005 02bc 3805 + 9005 02bd 31205 + 9005 02be 31605 + 9005 02bf ICP ICP5045BL + 9005 02c0 ICP ICP5085BL + 9005 02c1 ICP ICP5125BR + 9005 02c2 ICP ICP5165BR + 9005 02c3 51205 + 9005 02c4 51605 + 9005 02c5 ICP ICP5125SL + 9005 02c6 ICP ICP5165SL + 9005 02c7 3085 + 9005 02c8 ICP5805BL + 9005 02ce 51245 + 9005 02cf 51645 + 9005 02d0 52445 + 9005 02d1 5405 + 9005 02d4 ASR-2045 + 9005 02d5 ASR-2405 + 9005 02d6 ASR-2445 + 9005 02d7 ASR-2805 + 9005 02d8 5405G + 9005 02d9 5445G + 9005 02da 5805G + 9005 02db 5085G + 9005 02dc 51245G + 9005 02dd 51645G + 9005 02de 52445G + 9005 02df ASR-2045G + 9005 02e0 ASR-2405G + 9005 02e1 ASR-2445G + 9005 02e2 ASR-2805G + 0286 AAC-RAID (Rocket) + 1014 034d 8s + 1014 9540 ServeRAID 8k/8k-l4 + 1014 9580 ServeRAID 8k/8k-l8 + 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer) + 9005 028d ASR-2130S + 9005 029b ASR-2820SA + 9005 029c ASR-2620SA + 9005 029d ASR-2420SA + 9005 029e ICP ICP9024R0 + 9005 029f ICP ICP9014R0 + 9005 02a0 ICP ICP9047MA + 9005 02a1 ICP ICP9087MA + 9005 02a2 3800 + 9005 02a3 ICP ICP5445AU + 9005 02a4 ICP ICP9085LI + 9005 02a5 ICP ICP5085BR + 9005 02a6 ICP9067MA + 9005 02a7 3805 + 9005 02a8 3400 + 9005 02a9 ICP ICP5085AU + 9005 02aa ICP ICP5045AU + 9005 02ac 1800 + 9005 02b3 2400 + 9005 02b4 ICP ICP5045AL + 9005 0800 Callisto + 0410 AIC-9410W SAS (Razor HBA RAID) + 9005 0410 ASC-48300(Spirit RAID) + 9005 0411 ASC-58300 (Oakmont RAID) + 0412 AIC-9410W SAS (Razor HBA non-RAID) + 9005 0412 ASC-48300 (Spirit non-RAID) + 9005 0413 ASC-58300 (Oakmont non-RAID) + 0415 ASC-58300 SAS (Razor-External HBA RAID) + 0416 ASC-58300 SAS (Razor-External HBA non-RAID) + 041e AIC-9410W SAS (Razor ASIC non-RAID) + 041f AIC-9410W SAS (Razor ASIC RAID) + 9005 041f AIC-9410W SAS (Razor ASIC RAID) + 042f VSC7250/7251 SAS (Aurora ASIC non-RAID) + 0430 AIC-9405W SAS (Razor-Lite HBA RAID) + 9005 0430 ASC-44300 (Spirit-Lite RAID) + 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID) + 9005 0432 ASC-44300 (Spirit-Lite non-RAID) + 043e AIC-9405W SAS (Razor-Lite ASIC non-RAID) + 043f AIC-9405W SAS (Razor-Lite ASIC RAID) + 0450 ASC-1405 Unified Serial HBA + 0500 Obsidian chipset SCSI controller + 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C) + 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D) + 0503 Scamp chipset SCSI controller + 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E) + 1014 02c3 PCI-X DDR 3Gb SAS RAID Adapter (572F) + 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F) + 0910 AUA-3100B + 091e AUA-3100B + 8000 ASC-29320A U320 + 800f AIC-7901 U320 + 8010 ASC-39320 U320 + 8011 ASC-39320D + 0e11 00ac ASC-39320D U320 + 9005 0041 ASC-39320D U320 + 8012 ASC-29320 U320 + 8013 ASC-29320B U320 + 8014 ASC-29320LP U320 + 8015 ASC-39320B U320 + 8016 ASC-39320A U320 + 8017 ASC-29320ALP U320 + 9005 0044 ASC-29320ALP PCIx U320 + 9005 0045 ASC-29320LPE PCIe U320 + 801c ASC-39320D U320 + 801d AIC-7902B U320 + 1014 02cc ServeRAID 7e + 801e AIC-7901A U320 + 801f AIC-7902 U320 + 1734 1011 PRIMERGY RX300 onboard SCSI + 8080 ASC-29320A U320 w/HostRAID + 808f AIC-7901 U320 w/HostRAID + 8090 ASC-39320 U320 w/HostRAID + 8091 ASC-39320D U320 w/HostRAID + 8092 ASC-29320 U320 w/HostRAID + 8093 ASC-29320B U320 w/HostRAID + 8094 ASC-29320LP U320 w/HostRAID + 8095 ASC-39320(B) U320 w/HostRAID + 8096 ASC-39320A U320 w/HostRAID + 8097 ASC-29320ALP U320 w/HostRAID + 809c ASC-39320D(B) U320 w/HostRAID + 809d AIC-7902(B) U320 w/HostRAID + 1014 02cc ServeRAID 7e + 809e AIC-7901A U320 w/HostRAID + 809f AIC-7902 U320 w/HostRAID +907f Atronics + 2015 IDE-2015PL +919a Gigapixel Corp +9412 Holtek + 6565 6565 +9699 Omni Media Technology Inc + 6565 6565 +9710 NetMos Technology + 9250 PCI-to-PCI bridge [MCS9250] + 9805 PCI 1 port parallel adapter + 9815 PCI 9815 Multi-I/O Controller + 1000 0020 2P0S (2 port parallel adaptor) + 9820 PCI 9820 Multi-I/O Controller + 9835 PCI 9835 Multi-I/O Controller + 1000 0002 2S (16C550 UART) + 1000 0012 1P2S + 9845 PCI 9845 Multi-I/O Controller +# Serial ports at BAR0-3 + 1000 0004 0P4S (4 port 16550A serial card) + 1000 0006 0P6S (6 port 16550a serial card) +# Serial ports at BAR0-3, Parallel port at BAR4 + 1000 0014 1P4S (1 Parallel / 4 16550A Serial Port Adapter) + 9855 PCI 9855 Multi-I/O Controller +# Parallel port at BAR0. Serial ports at BAR2-5 + 1000 0014 1P4S +# Parallel ports at BAR0,BAR2. Serial ports at BAR4-5 + 1000 0022 2P2S (2 Parallel / 2 16550A Serial Port Adapter) + 9865 PCI 9865 Multi-I/O Controller + 9901 PCIe 9901 Multi-I/O Controller +9902 Stargen Inc. + 0001 SG2010 PCI over Starfabric Bridge + 0002 SG2010 PCI to Starfabric Gateway + 0003 SG1010 Starfabric Switch and PCI Bridge +a0a0 AOPEN Inc. +a0f1 UNISYS Corporation +a200 NEC Corporation +a259 Hewlett Packard +a25b Hewlett Packard GmbH PL24-MKT +a304 Sony +a727 3Com Corporation + 0013 3CRPAG175 Wireless PC Card + 6803 3CRDAG675B Wireless 11a/b/g Adapter +aa42 Scitex Digital Video +aa55 Ncomputing X300 PCI-Engine +aaaa Adnaco Technology Inc. + 0001 H1 PCIe over fiber optic host controller + 0002 R1BP1 PCIe over fiber optic expansion chassis +abcd Vadatech Inc. +ac1e Digital Receiver Technology Inc +ac3d Actuality Systems +ad00 Alta Data Technologies LLC +aecb Adrienne Electronics Corporation + 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR] +affe Sirrix AG security technologies + 02e1 PCI2E1 2-port ISDN E1 interface + dead Sirrix.PCI4S0 4-port ISDN S0 interface +# Not registered officially +b10b Uakron PCI Project +b1b3 Shiva Europe Limited +# Pinnacle should be 11bd, but they got it wrong several times --mj +bd11 Pinnacle Systems, Inc. (Wrong ID) +bdbd Blackmagic Design +c001 TSI Telsys +c0a9 Micron/Crucial Technology +c0de Motorola +c0fe Motion Engineering, Inc. +ca50 Varian Australia Pty Ltd +cace CACE Technologies, Inc. + 0001 TurboCap Port A + 0002 TurboCap Port B + 0023 AirPcap N +cafe Chrysalis-ITS + 0003 Luna K3 Hardware Security Module +cccc Catapult Communications +ccec Curtiss-Wright Controls Embedded Computing +cddd Tyzx, Inc. + 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber + 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber +ceba KEBA AG +d161 Digium, Inc. + 0120 Wildcard TE120P single-span T1/E1/J1 card + 0205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V + 0210 Wildcard TE210P/TE212P dual-span T1/E1/J1 card 3.3V + 0220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) + 0405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V + 0410 Wildcard TE410P/TE412P quad-span T1/E1/J1 card 3.3V + 0420 Wildcard TE420P quad-span T1/E1/J1 card 3.3V (PCI-Express) + 0800 Wildcard TDM800P 8-port analog card + 2400 Wildcard TDM2400P 24-port analog card + 3400 Wildcard TC400P transcoder base card + 8000 Wildcard TE121 single-span T1/E1/J1 card (PCI-Express) + 8001 Wildcard TE122 single-span T1/E1/J1 card + 8002 Wildcard AEX800 8-port analog card (PCI-Express) + 8003 Wildcard AEX2400 24-port analog card (PCI-Express) + 8005 Wildcard TDM410 4-port analog card + 8006 Wildcard AEX410 4-port analog card (PCI-Express) + b410 Wildcard B410 quad-BRI card +d4d4 Dy4 Systems Inc + 0601 PCI Mezzanine Card +d531 I+ME ACTIA GmbH +d84d Exsys +db10 Diablo Technologies +dead Indigita Corporation +deaf Middle Digital Inc. + 9050 PC Weasel Virtual VGA + 9051 PC Weasel Serial Port + 9052 PC Weasel Watchdog Timer +deda SoftHard Technology Ltd. +e000 Winbond + e000 W89C940 +e159 Tiger Jet Network Inc. + 0001 Tiger3XX Modem/ISDN interface + 0059 0001 128k ISDN-S/T Adapter + 0059 0003 128k ISDN-U Adapter + 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter + 8086 0003 Digium X100P/X101P analogue PSTN FXO interface + 0002 Tiger100APC ISDN chipset +e4bf EKF Elektronik GmbH +e55e Essence Technology, Inc. +ea01 Eagle Technology + 000a PCI-773 Temperature Card + 0032 PCI-730 & PC104P-30 Card + 003e PCI-762 Opto-Isolator Card + 0041 PCI-763 Reed Relay Card + 0043 PCI-769 Opto-Isolator Reed Relay Combo Card + 0046 PCI-766 Analog Output Card + 0052 PCI-703 Analog I/O Card + 0800 PCI-800 Digital I/O Card +# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID. +ea60 RME + 9896 Digi32 + 9897 Digi32 Pro + 9898 Digi32/8 +eabb Aashima Technology B.V. +eace Endace Measurement Systems, Ltd + 3100 DAG 3.10 OC-3/OC-12 + 3200 DAG 3.2x OC-3/OC-12 + 320e DAG 3.2E Fast Ethernet + 340e DAG 3.4E Fast Ethernet + 341e DAG 3.41E Fast Ethernet + 3500 DAG 3.5 OC-3/OC-12 + 351c DAG 3.5ECM Fast Ethernet + 360d DAG 3.6D DS3 + 360e DAG 3.6E Fast Ethernet + 368e DAG 3.6E Gig Ethernet + 3707 DAG 3.7T T1/E1/J1 + 370d DAG 3.7D DS3/E3 + 378e DAG 3.7G Gig Ethernet + 3800 DAG 3.8S OC-3/OC-12 + 4100 DAG 4.10 OC-48 + 4110 DAG 4.11 OC-48 + 4220 DAG 4.2 OC-48 + 422e DAG 4.2GE Gig Ethernet + 4230 DAG 4.2S OC-48 + 423e DAG 4.2GE Gig Ethernet + 4300 DAG 4.3S OC-48 + 430e DAG 4.3GE Gig Ethernet + 452e DAG 4.5G2 Gig Ethernet + 454e DAG 4.5G4 Gig Ethernet + 45b8 DAG 4.5Z8 Gig Ethernet + 45be DAG 4.5Z2 Gig Ethernet + 520e DAG 5.2X 10G Ethernet + 521a DAG 5.2SXA 10G Ethernet/OC-192 + 5400 DAG 5.4S-12 OC-3/OC-12 + 5401 DAG 5.4SG-48 Gig Ethernet/OC-3/OC-12/OC-48 + 540a DAG 5.4GA Gig Ethernet + 541a DAG 5.4SA-12 OC-3/OC-12 + 542a DAG 5.4SGA-48 Gig Ethernet/OC-3/OC-12/OC-48 + 6000 DAG 6.0SE 10G Ethernet/OC-192 + 6100 DAG 6.1SE 10G Ethernet/OC-192 + 6200 DAG 6.2SE 10G Ethernet/OC-192 + 7100 DAG 7.1S OC-3/OC-12 + 8100 DAG 8.1X 10G Ethernet + 8101 DAG 8.1SX 10G Ethernet/OC-192 + 8102 DAG 8.1X 10G Ethernet + 820e DAG 8.2X 10G Ethernet + 820f DAG 8.2X 10G Ethernet (2nd bus) + 8400 DAG 8.4I Infiniband x4 SDR +ec80 Belkin Corporation + ec00 F5D6000 +ecc0 Echo Digital Audio Corporation +edd8 ARK Logic Inc + a091 1000PV [Stingray] + a099 2000PV [Stingray] + a0a1 2000MT + a0a9 2000MI +# Found on M2N68-AM Motherboard +f043 ASUSTeK Computer Inc. (Wrong ID) +f05b Foxconn International, Inc. (Wrong ID) +f1d0 AJA Video + c0fe Xena HS/HD-R + c0ff Kona/Xena 2 + cafe Kona SD + cfee Xena LS/SD-22-DA/SD-DA + dcaf Kona HD + dfee Xena HD-DA + efac Xena SD-MM/SD-22-MM + facd Xena HD-MM +f5f5 F5 Networks, Inc. +# Subsystem ID for PATA controller on nForce motherboard +f849 ASRock Incorporation (Wrong ID) +fa57 Interagon AS + 0001 PMC [Pattern Matching Chip] +fab7 Fabric7 Systems, Inc. +febd Ultraview Corp. +# Nee Epigram +feda Broadcom Inc + a0fa BCM4210 iLine10 HomePNA 2.0 + a10e BCM4230 iLine10 HomePNA 2.0 +fede Fedetec Inc. + 0003 TABIC PCI v3 +fffd XenSource, Inc. + 0101 PCI Event Channel Controller +# Used in some old VMWare products before they got a real ID assigned +fffe VMWare Inc (temporary ID) + 0710 Virtual SVGA +ffff Illegal Vendor ID + + +# List of known device classes, subclasses and programming interfaces + +# Syntax: +# C class class_name +# subclass subclass_name <-- single tab +# prog-if prog-if_name <-- two tabs + +C 00 Unclassified device + 00 Non-VGA unclassified device + 01 VGA compatible unclassified device +C 01 Mass storage controller + 00 SCSI storage controller + 01 IDE interface + 02 Floppy disk controller + 03 IPI bus controller + 04 RAID bus controller + 05 ATA controller + 20 ADMA single stepping + 30 ADMA continuous operation + 06 SATA controller + 00 Vendor specific + 01 AHCI 1.0 + 07 Serial Attached SCSI controller + 80 Mass storage controller +C 02 Network controller + 00 Ethernet controller + 01 Token ring network controller + 02 FDDI network controller + 03 ATM network controller + 04 ISDN controller + 05 WorldFip controller + 06 PICMG controller + 80 Network controller +C 03 Display controller + 00 VGA compatible controller + 00 VGA controller + 01 8514 controller + 01 XGA compatible controller + 02 3D controller + 80 Display controller +C 04 Multimedia controller + 00 Multimedia video controller + 01 Multimedia audio controller + 02 Computer telephony device + 03 Audio device + 80 Multimedia controller +C 05 Memory controller + 00 RAM memory + 01 FLASH memory + 80 Memory controller +C 06 Bridge + 00 Host bridge + 01 ISA bridge + 02 EISA bridge + 03 MicroChannel bridge + 04 PCI bridge + 00 Normal decode + 01 Subtractive decode + 05 PCMCIA bridge + 06 NuBus bridge + 07 CardBus bridge + 08 RACEway bridge + 00 Transparent mode + 01 Endpoint mode + 09 Semi-transparent PCI-to-PCI bridge + 40 Primary bus towards host CPU + 80 Secondary bus towards host CPU + 0a InfiniBand to PCI host bridge + 80 Bridge +C 07 Communication controller + 00 Serial controller + 00 8250 + 01 16450 + 02 16550 + 03 16650 + 04 16750 + 05 16850 + 06 16950 + 01 Parallel controller + 00 SPP + 01 BiDir + 02 ECP + 03 IEEE1284 + fe IEEE1284 Target + 02 Multiport serial controller + 03 Modem + 00 Generic + 01 Hayes/16450 + 02 Hayes/16550 + 03 Hayes/16650 + 04 Hayes/16750 + 04 GPIB controller + 05 Smard Card controller + 80 Communication controller +C 08 Generic system peripheral + 00 PIC + 00 8259 + 01 ISA PIC + 02 EISA PIC + 10 IO-APIC + 20 IO(X)-APIC + 01 DMA controller + 00 8237 + 01 ISA DMA + 02 EISA DMA + 02 Timer + 00 8254 + 01 ISA Timer + 02 EISA Timers + 03 RTC + 00 Generic + 01 ISA RTC + 04 PCI Hot-plug controller + 05 SD Host controller + 80 System peripheral +C 09 Input device controller + 00 Keyboard controller + 01 Digitizer Pen + 02 Mouse controller + 03 Scanner controller + 04 Gameport controller + 00 Generic + 10 Extended + 80 Input device controller +C 0a Docking station + 00 Generic Docking Station + 80 Docking Station +C 0b Processor + 00 386 + 01 486 + 02 Pentium + 10 Alpha + 20 Power PC + 30 MIPS + 40 Co-processor +C 0c Serial bus controller + 00 FireWire (IEEE 1394) + 00 Generic + 10 OHCI + 01 ACCESS Bus + 02 SSA + 03 USB Controller + 00 UHCI + 10 OHCI + 20 EHCI + 80 Unspecified + fe USB Device + 04 Fibre Channel + 05 SMBus + 06 InfiniBand + 07 IPMI SMIC interface + 08 SERCOS interface + 09 CANBUS +C 0d Wireless controller + 00 IRDA controller + 01 Consumer IR controller + 10 RF controller + 11 Bluetooth + 12 Broadband + 20 802.1a controller + 21 802.1b controller + 80 Wireless controller +C 0e Intelligent controller + 00 I2O +C 0f Satellite communications controller + 01 Satellite TV controller + 02 Satellite audio communication controller + 03 Satellite voice communication controller + 04 Satellite data communication controller +C 10 Encryption controller + 00 Network and computing encryption device + 10 Entertainment encryption device + 80 Encryption controller +C 11 Signal processing controller + 00 DPIO module + 01 Performance counters + 10 Communication synchronizer + 20 Signal processing management + 80 Signal processing controller diff --git a/ogclient/lib/pictures/oglogo.png b/ogclient/lib/pictures/oglogo.png new file mode 100644 index 0000000..b55a4cf Binary files /dev/null and b/ogclient/lib/pictures/oglogo.png differ diff --git a/client/lib/engine/bin/BootLib.py b/ogclient/lib/python3/BootLib.py similarity index 100% rename from client/lib/engine/bin/BootLib.py rename to ogclient/lib/python3/BootLib.py diff --git a/client/lib/engine/bin/CacheLib.py b/ogclient/lib/python3/CacheLib.py old mode 100755 new mode 100644 similarity index 96% rename from client/lib/engine/bin/CacheLib.py rename to ogclient/lib/python3/CacheLib.py index 5e8d9d5..1c4357c --- a/client/lib/engine/bin/CacheLib.py +++ b/ogclient/lib/python3/CacheLib.py @@ -61,9 +61,11 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): prev_part = part - i if prev_part <= 0: break ENDPREVPART = DiskLib.ogGetLastSector (ndsk, prev_part) + print (f'nati got endprevpart ({ENDPREVPART})') if ENDPREVPART: break i += 1 if not ENDPREVPART: + print (f'nati no endprevpart, assuming 0') ENDPREVPART=0 #SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, ndsk) #return None @@ -71,6 +73,7 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): MINSIZE = 25000 MAXSIZE = END if SIZE < MINSIZE or SIZE > MAXSIZE or START < ENDPREVPART: + print (f'nati size ({SIZE}) < minsize ({MINSIZE}) or size > maxsize ({MAXSIZE}) or start ({START}) < endprevpart ({ENDPREVPART})') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, ndsk) return None @@ -80,11 +83,13 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): # En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear, # por lo que se pierden los datos. pttype = DiskLib.ogGetPartitionTableType (ndsk) + print (f'nati pttype ({pttype})') if not pttype: pttype = 'MSDOS' DiskLib.ogCreatePartitionTable (ndsk, pttype) get_ptt = DiskLib.ogGetPartitionTableType (ndsk) + print (f'nati get_ptt ({get_ptt})') if 'GPT' == get_ptt: # Si la tabla de particiones no es valida, volver a generarla. if subprocess.run (['sgdisk', '-p', DISK]).returncode: @@ -94,6 +99,7 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): # Capturamos el codigo de particion GPT para cache # PATCH - Cuando es GPT, la particion con codigo CACHE (CA00) no existe y no puede crearse, se cambia por LINUX (8300) ID = DiskLib.ogTypeToId ('LINUX', 'GPT') + print (f'nati ID ({ID})') subprocess.run (['sgdisk', DISK, f'-n{part}:{START}:{END}', f'-c{part}:CACHE', f'-t{part}:{ID}']) elif 'MSDOS' == get_ptt: # Si la tabla de particiones no es valida, volver a generarla. @@ -101,6 +107,7 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): subprocess.run (['fdisk', DISK], input='w\n', text=True) # Definir particiones y notificar al kernel. ID = DiskLib.ogTypeToId ('CACHE', 'MSDOS') + print (f'nati ID ({ID})') # Salvamos la configuración de las particiones e incluimos la cache. tmp = subprocess.run (['sfdisk', '--dump', DISK], capture_output=True, text=True).stdout.splitlines() tmp = [ x for x in tmp if f'{DISK}{part}' not in x ] @@ -111,6 +118,7 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0): tmp = [UNIT, ''] + tmp # Guardamos nueva configuración en el disco. i = '\n'.join(tmp) + print (f'nati i ({i})') subprocess.run (['sfdisk', '--no-reread', DISK], input=i, text=True) # Actualiza la tabla de particiones en el kernel. DiskLib.ogUpdatePartitionTable() diff --git a/client/lib/engine/bin/DiskLib.py b/ogclient/lib/python3/DiskLib.py old mode 100755 new mode 100644 similarity index 98% rename from client/lib/engine/bin/DiskLib.py rename to ogclient/lib/python3/DiskLib.py index ece1339..5b95b05 --- a/client/lib/engine/bin/DiskLib.py +++ b/ogclient/lib/python3/DiskLib.py @@ -100,6 +100,7 @@ def ogCreatePartitions (disk, parts): SECTORS -= CACHESIZE PART = 1 + print (f'START ({START}) SECTORS ({SECTORS}) PART ({PART})') sfdisk_input = 'unit: sectors\n\n' NVME_PREFIX = 'p' if 'nvme' in DISK else '' @@ -175,7 +176,9 @@ def ogCreatePartitions (disk, parts): ogCreatePartitionTable (ND) # Definir particiones y notificar al kernel. - subprocess.run (['sfdisk', DISK], input=sfdisk_input, capture_output=True, text=True) + #print (f'nati: about to run sfdisk: ({sfdisk_input})') + p = subprocess.run (['sfdisk', DISK], input=sfdisk_input, capture_output=True, text=True) + #print (f'nati: rc ({p.returncode}) stdout ({p.stdout}) stderr ({p.stderr})') subprocess.run (['partprobe', DISK]) if CACHESIZE: CacheLib.ogMountCache() return True @@ -219,6 +222,7 @@ def ogCreateGptPartitions (disk, parts): ALIGN = int (subprocess.run (['sgdisk', '-D', DISK], capture_output=True, text=True).stdout) START = ALIGN PART = 1 + print (f'START ({START}) SECTORS ({SECTORS}) PART ({PART})') # Leer parámetros con definición de particionado. DELOPTIONS = [] @@ -280,7 +284,9 @@ def ogCreateGptPartitions (disk, parts): ogCreatePartitionTable (ND, 'GPT') # Definir particiones y notificar al kernel. - subprocess.run (['sgdisk'] + DELOPTIONS + OPTIONS + [DISK]) + #print (f'nati: about to run sgdisk ({DELOPTIONS}) ({OPTIONS}) ({DISK})') + p = subprocess.run (['sgdisk'] + DELOPTIONS + OPTIONS + [DISK]) + #print (f'nati: rc ({p.returncode}) stdout ({p.stdout}) stderr ({p.stderr})') subprocess.run (['partprobe', DISK]) if CACHESIZE: CacheLib.ogMountCache() return True @@ -1169,6 +1175,7 @@ def ogSetPartitionActive (disk, par): #@exception OG_ERR_PARTITION Error al cambiar el id. de partición. #@attention Requisitos: fdisk, sgdisk #*/ ## +## for GPT partitions, id must be one of the valid types as reported by 'sgdisk --list-types', eg. 0700 or 8200 def ogSetPartitionId (disk, par, id): DISK = ogDiskToDev (disk) if not DISK: return None diff --git a/client/lib/engine/bin/FileLib.py b/ogclient/lib/python3/FileLib.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/FileLib.py rename to ogclient/lib/python3/FileLib.py diff --git a/client/lib/engine/bin/FileSystemLib.py b/ogclient/lib/python3/FileSystemLib.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/FileSystemLib.py rename to ogclient/lib/python3/FileSystemLib.py diff --git a/client/lib/engine/bin/ImageLib.py b/ogclient/lib/python3/ImageLib.py similarity index 99% rename from client/lib/engine/bin/ImageLib.py rename to ogclient/lib/python3/ImageLib.py index 0d3b5d1..2b5fc8c 100644 --- a/client/lib/engine/bin/ImageLib.py +++ b/ogclient/lib/python3/ImageLib.py @@ -248,6 +248,7 @@ def ogCreateImage (disk, par, container, imgfile, tool='partclone', level='gzip' # Crear Imagen. #trap + print (f'nati program ({program})') p = subprocess.run (program, shell=True, check=True) errcode = p.returncode if 0 == errcode: @@ -511,8 +512,10 @@ def ogRestoreImage (repo, imgpath, disk, par): rc = None try: + #print (f'nati: ogRestoreImage: running ({program})') p = subprocess.run (program, shell=True, capture_output=True, text=True) rc = p.returncode + #print (f'nati: ogRestoreImage: rc ({rc}) stdout ({p.stdout}) stderr ({p.stderr})') if not rc: SystemLib.ogRaiseError ([], ogGlobalsOG_ERR_IMAGE, f'{imgfile}, {disk}, {par}') except: diff --git a/client/lib/engine/bin/InventoryLib.py b/ogclient/lib/python3/InventoryLib.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/InventoryLib.py rename to ogclient/lib/python3/InventoryLib.py diff --git a/client/lib/engine/bin/NetLib.py b/ogclient/lib/python3/NetLib.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/NetLib.py rename to ogclient/lib/python3/NetLib.py diff --git a/client/lib/engine/bin/PostConfLib.py b/ogclient/lib/python3/PostConfLib.py similarity index 100% rename from client/lib/engine/bin/PostConfLib.py rename to ogclient/lib/python3/PostConfLib.py diff --git a/client/lib/engine/bin/ProtocolLib.py b/ogclient/lib/python3/ProtocolLib.py similarity index 91% rename from client/lib/engine/bin/ProtocolLib.py rename to ogclient/lib/python3/ProtocolLib.py index 35b8a1e..18c8bb8 100644 --- a/client/lib/engine/bin/ProtocolLib.py +++ b/ogclient/lib/python3/ProtocolLib.py @@ -82,6 +82,7 @@ def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None): address += f' -O {session[i]}:{portbase}' else: address = f'{session[1]}:{portbase}' + #print (f'nati mode ({mode}) address ({address})') if 'SENDPARTITION' == op: syn = ImageLib.ogCreateImageSyntax (device, ' ', tool, level) @@ -89,6 +90,7 @@ def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None): ## otherwise, param2 in ImageLib.ogCreateImageSyntax() is not '| mbuffer' but empty ## and then parts[2] is out of range parts = syn.split ('|') + #print (f'nati syn ({syn}) parts ({parts})') prog1 = f'{parts[0]}|{parts[2]}'.strip() prog1 = prog1.replace ('>', '').strip() return f'{prog1} | mbuffer {address}' @@ -120,7 +122,7 @@ def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None): #@note #@todo: ogIsLocked siempre devuelve 1 #*/ ## - +#ogUcastSendPartition 1 2 8001:192.168.1.113 partclone lzop def ogUcastSendPartition (disk, par, sess, tool, level): PART = DiskLib.ogDiskToDev (disk, par) if not PART: return None @@ -129,6 +131,7 @@ def ogUcastSendPartition (disk, par, sess, tool, level): cmd = ogUcastSyntax ('SENDPARTITION', sess, device=PART, tool=tool, level=level) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -151,6 +154,7 @@ def ogUcastSendPartition (disk, par, sess, tool, level): #@note #@todo: #*/ ## +#ogUcastReceiverPartition 1 1 8001:192.168.1.111 partclone lzop def ogUcastReceiverPartition (disk, par, sess, tool, level): PART = DiskLib.ogDiskToDev (disk, par) if not PART: return None @@ -159,6 +163,7 @@ def ogUcastReceiverPartition (disk, par, sess, tool, level): cmd = ogUcastSyntax ('RECEIVERPARTITION', sess, device=PART, tool=tool, level=level) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -188,6 +193,10 @@ def ogUcastReceiverPartition (disk, par, sess, tool, level): #ogUcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionUcast') #ogUcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionUcast') #ogUcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionUcast') + +#ogUcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 8000:192.168.1.113 +#ogUcastSendFile 1 4 /swapfile.sys 8000:192.168.1.111 +#ogUcastSendFile REPO /ubu24.img 8000:192.168.1.111 def ogUcastSendFile (disk=None, par=None, container=None, file=None, sess=None): if file is None: raise TypeError ('missing required argument: "file"') @@ -199,6 +208,7 @@ def ogUcastSendFile (disk=None, par=None, container=None, file=None, sess=None): ## we were given container= source = FileLib.ogGetPath (src=container, file=file) dev_err = f'{container} {file}' + print (f'nati ogGetPath (src=({container}), file=({file})) = source ({source})') else: raise TypeError ('argument "container" can be specified along neither "disk" nor "par"') @@ -207,10 +217,12 @@ def ogUcastSendFile (disk=None, par=None, container=None, file=None, sess=None): ## we were given disk= par= source = FileLib.ogGetPath (src=f'{disk} {par}', file=file) dev_err = f'{disk} {par} {file}' + print (f'nati ogGetPath (src=({disk} {par}), file=({file})) = source ({source})') elif disk is None and par is None: ## we were given nothing source = FileLib.ogGetPath (file=file) dev_err = file + print (f'nati ogGetPath (file=({file})) = source ({source})') else: raise TypeError ('if one of "disk" and "par" are specified, then both must be') @@ -219,12 +231,14 @@ def ogUcastSendFile (disk=None, par=None, container=None, file=None, sess=None): return path2 = FileLib.ogGetPath (file=source) + print (f'nati path2 ({path2})') if not path2: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or file {dev_err} not found') return cmd = ogUcastSyntax ('SENDFILE', sess, file=source) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -295,6 +309,7 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): if 'SEND' in op: mode = 'server' else: mode = 'client' + print (f'nati mode ({mode})') try: isudpcast = subprocess.run (['udp-receiver', '--help'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True).stdout @@ -303,6 +318,7 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): return session = sess.split (':') + print (f'nati sess ({sess}) session ({session})') PERROR = 0 if 'server' == mode: @@ -316,6 +332,7 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): mbuffer = " --pipe 'mbuffer -q -m 20M' " portbase = int (session[0]) + print (f'nati portbase ({portbase})') if portbase not in range (9000, 9100, 2): SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'McastSession portbase {portbase}') PERROR = 3 @@ -355,6 +372,7 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): if 'client' == mode: other = session[1:] + print (f'nati session ({session}) other ({other})') serveraddress = other[0] if len (other) > 0 else '' starttimeout = other[1] if len (other) > 1 else '' receivertimeout = other[2] if len (other) > 2 else '' @@ -365,16 +383,23 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): else: repoip = NetLib.ogGetRepoIp() clientip = _clientip() + #print (f'nati repoip ({repoip}) clientip ({clientip})') if 1 != len (clientip): raise Exception ('more than one local IP address found') c = clientip[0] + #print (f'nati c ({c})') clientip = c['local'] mascara = c['prefixlen'] + #print (f'nati clientip ({clientip}) mascara ({mascara})') ripbt = _binary_ip (repoip) ipbt = _binary_ip (clientip) reposubred = ripbt[0:mascara] clientsubred = ipbt[0:mascara] + #print (f'nati ripbt ({ripbt})') + #print (f'nati ipbt ({ipbt})') + #print (f'nati reposubred ({reposubred})') + #print (f'nati clientsubred ({clientsubred})') if reposubred == clientsubred: serveraddress = ' ' else: serveraddress = f' --mcast-rdv-address {repoip}' @@ -402,6 +427,7 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): ## otherwise, param2 in ImageLib.ogCreateImageSyntax() is not '| mbuffer' but empty ## and then parts[2] is out of range parts = syn.split ('|') + #print (f'nati syn ({syn}) parts ({parts})') prog1 = f'{parts[0]}|{parts[2]}'.strip() prog1 = prog1.replace ('>', '').strip() return f'{prog1} | {syntaxserver}' @@ -442,6 +468,10 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None): #ogMcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionMcast') #ogMcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionMcast') #ogMcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionMcast') + +#ogMcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 9000:full-duplex:239.194.37.31:50M:20:10 +#ogMcastSendFile REPO /ubu24.img 9000:full-duplex:239.194.37.31:50M:20:10 +#ogMcastSendFile /usr/lib64/ld-linux-x86-64.so.2 9000:full-duplex:239.194.37.31:50M:20:10 def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None): if file is None: raise TypeError ('missing required argument: "file"') @@ -453,6 +483,7 @@ def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None): ## we were given container= source = FileLib.ogGetPath (src=container, file=file) dev_err = f'{container} {file}' + print (f'nati ogGetPath (src=({container}), file=({file})) = source ({source})') else: raise TypeError ('argument "container" can be specified along neither "disk" nor "par"') @@ -461,10 +492,12 @@ def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None): ## we were given disk= par= source = FileLib.ogGetPath (src=f'{disk} {par}', file=file) dev_err = f'{disk} {par} {file}' + print (f'nati ogGetPath (src=({disk} {par}), file=({file})) = source ({source})') elif disk is None and par is None: ## we were given nothing source = FileLib.ogGetPath (file=file) dev_err = file + print (f'nati ogGetPath (file=({file})) = source ({source})') else: raise TypeError ('if one of "disk" and "par" are specified, then both must be') @@ -473,12 +506,14 @@ def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None): return path2 = FileLib.ogGetPath (file=source) + print (f'nati path2 ({path2})') if not path2: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or file {dev_err} not found') return cmd = ogMcastSyntax ('SENDFILE', sess, file=source) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -504,6 +539,8 @@ def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None): #ogMcastReceiverFile ( file='/PS1_PH1.img', sess='9000') #ogMcastReceiverFile (container='CACHE', file='/aula1/PS2_PH4.img', sess='9000') #ogMcastReceiverFile (disk=1, par=1, file='/isos/linux.iso', sess='9000') + +#ogMcastReceiverFile 9000:full-duplex:239.194.37.31 1 4 /hola def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=None): if file is None: raise TypeError ('missing required argument: "file"') @@ -515,6 +552,7 @@ def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=No ## we were given container= targetdir = FileLib.ogGetParentPath (src=container, file=file) dev_err = f'{container} {file}' + print (f'nati ogGetParentPath (src=({container}), file=({file})) = targetdir ({targetdir})') else: raise TypeError ('argument "container" can be specified along neither "disk" nor "par"') @@ -523,10 +561,12 @@ def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=No ## we were given disk= par= targetdir = FileLib.ogGetParentPath (src=f'{disk} {par}', file=file) dev_err = f'{disk} {par} {file}' + print (f'nati ogGetParentPath (src=({disk} {par}), file=({file})) = targetdir ({targetdir})') elif disk is None and par is None: ## we were given nothing targetdir = FileLib.ogGetParentPath (file=file) dev_err = file + print (f'nati ogGetParentPath (file=({file})) = targetdir ({targetdir})') else: raise TypeError ('if one of "disk" and "par" are specified, then both must be') @@ -535,9 +575,12 @@ def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=No return targetfile = os.path.basename (file) + print (f'nati targetfile ({targetfile})') + print (f'nati calling ogMcastSyntax with sess ({sess})') cmd = ogMcastSyntax ('RECEIVERFILE', sess, file=os.path.join (targetdir, targetfile)) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -562,6 +605,7 @@ def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=No #ogMcastSendPartition (disk, par, SessionMulticastSERVER, tools, compresor) #ogMcastSendPartition (1, 1, '9000:full-duplex:239.194.37.31:50M:20:2', 'partclone', 'lzop') +#ogMcastSendPartition 1 2 9000:full-duplex:239.194.37.31:50M:20:10 partclone lzop def ogMcastSendPartition (disk, par, sess, tool, compressor): PART = DiskLib.ogDiskToDev (disk, par) if not PART: return @@ -569,6 +613,7 @@ def ogMcastSendPartition (disk, par, sess, tool, compressor): FileSystemLib.ogUnmount (disk, par) cmd = ogMcastSyntax ('SENDPARTITION', sess, device=PART, tool=tool, level=compressor) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -586,6 +631,7 @@ def ogMcastSendPartition (disk, par, sess, tool, compressor): #@return #@exception $OG_ERR_FORMAT #*/ ## +#ogMcastReceiverPartition 1 1 9000:full-duplex:239.194.37.31 partclone lzop def ogMcastReceiverPartition (disk, par, sess, tool, compressor): PART = DiskLib.ogDiskToDev (disk, par) if not PART: return @@ -593,6 +639,7 @@ def ogMcastReceiverPartition (disk, par, sess, tool, compressor): FileSystemLib.ogUnmount (disk, par) cmd = ogMcastSyntax ('RECEIVERPARTITION', sess, device=PART, tool=tool, level=compressor) if not cmd: return None + print (f'nati cmd ({cmd})') try: subprocess.run (cmd, shell=True, check=True) except subprocess.CalledProcessError: @@ -629,6 +676,9 @@ def ogMcastRequest (img, proto): #ogTorrentStart ( torrentfile='/opt/opengnsys/cache/linux.iso', torrentsess='peer:60') #ogTorrentStart (container='CACHE', torrentfile='/PS1_PH1.img.torrent', torrentsess='seeder:10000') #ogTorrentStart (disk=1, par=1, torrentfile='/linux.iso.torrent', torrentsess='leecher:60') +#ogTorrentStart /opt/opengnsys/cache/opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000 +#ogTorrentStart 1 4 /opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000 +#ogTorrentStart CACHE /ubu24.EXTFS.torrent seeder:10000 def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torrentsess=None): if torrentfile is None: raise TypeError ('missing required argument: "torrentfile"') @@ -643,6 +693,7 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre return None source = FileLib.ogGetPath (src=container, file=torrentfile) dev_err = f'{container} {torrentfile}' + print (f'nati ogGetPath (src=({container}), file=({torrentfile})) = source ({source})') else: raise TypeError ('argument "container" can be specified along neither "disk" nor "par"') @@ -651,6 +702,7 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre ## we were given disk= par= source = FileLib.ogGetPath (src=f'{disk} {par}', file=torrentfile) dev_err = f'{disk} {par} {torrentfile}' + print (f'nati ogGetPath (src=({disk} {par}), file=({torrentfile})) = source ({source})') elif disk is None and par is None: ## we were given nothing if torrentfile.startswith ('/opt/opengnsys/images'): @@ -658,6 +710,7 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre return None source = FileLib.ogGetPath (file=torrentfile) dev_err = torrentfile + print (f'nati ogGetPath (file=({torrentfile})) = source ({source})') else: raise TypeError ('if one of "disk" and "par" are specified, then both must be') @@ -772,6 +825,7 @@ def ogCreateTorrent (disk=None, par=None, container=None, file=None, ip_bttrack= return f = f'{file}.{ext}' source = FileLib.ogGetPath (src=container, file=f) + print (f'nati ogGetPath (src=({container}), file=({f})) = source ({source})') else: raise TypeError ('argument "container" can be specified along neither "disk" nor "par"') @@ -780,10 +834,12 @@ def ogCreateTorrent (disk=None, par=None, container=None, file=None, ip_bttrack= ## we were given disk= par= f = f'{file}.img' source = FileLib.ogGetPath (src=f'{disk} {par}', file=f) + print (f'nati ogGetPath (src=({disk} {par}), file=({f})) = source ({source})') elif disk is None and par is None: ## we were given nothing f = f'{file}.img' source = FileLib.ogGetPath (file=f) + print (f'nati ogGetPath (file=({f})) = source ({source})') else: raise TypeError ('if one of "disk" and "par" are specified, then both must be') @@ -834,12 +890,14 @@ def ogUpdateCacheIsNecesary (repo, file, proto): return None filesource = FileLib.ogGetPath (src=repo, file=file) + #print (f'nati filesource ({filesource})') if not filesource: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f' {repo} {file}') return None # paso 1. si no existe la imagen, confirmar que es necesario actualizar la cache. filetarget = FileLib.ogGetPath (src='CACHE', file=file) + #print (f'nati filetarget ({filetarget})') if not filetarget: # borramos el fichero bf del torrent, en el caso de que se hubiese quedado de algun proceso fallido if FileLib.ogGetPath (src='CACHE', file=f'/{file}.torrent.bf'): ogDeleteFile (container='CACHE', file=f'{file}.torrent.bf') diff --git a/client/lib/engine/bin/RegistryLib.py b/ogclient/lib/python3/RegistryLib.py old mode 100755 new mode 100644 similarity index 98% rename from client/lib/engine/bin/RegistryLib.py rename to ogclient/lib/python3/RegistryLib.py index 11a2c08..2657bd8 --- a/client/lib/engine/bin/RegistryLib.py +++ b/ogclient/lib/python3/RegistryLib.py @@ -19,8 +19,10 @@ import FileLib # Función ficticia para lanzar chntpw con timeout de 5 s., evitando cuelgues del programa. chntpw_exe = shutil.which ('drbl-chntpw') or shutil.which ('chntpw') def chntpw (hivefile, input_file): + #print (f'nati: hivefile ({hivefile}) input_file ({input_file}) type ({type(input_file)})') with open (input_file, 'r') as fd: input_contents = fd.read() + #print (f'nati: input_contents ({input_contents})') return subprocess.run ([chntpw_exe, '-e', hivefile], timeout=5, input=input_contents, capture_output=True, text=True).stdout ## en el codigo bash aparecen "${3%\\*}" y "${3##*\\}" varias veces diff --git a/client/lib/engine/bin/StringLib.py b/ogclient/lib/python3/StringLib.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/StringLib.py rename to ogclient/lib/python3/StringLib.py diff --git a/client/lib/engine/bin/SystemLib.py b/ogclient/lib/python3/SystemLib.py old mode 100755 new mode 100644 similarity index 92% rename from client/lib/engine/bin/SystemLib.py rename to ogclient/lib/python3/SystemLib.py index 338a5e3..fffd2cb --- a/client/lib/engine/bin/SystemLib.py +++ b/ogclient/lib/python3/SystemLib.py @@ -104,27 +104,45 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs): # ## redirect stdout only # eval $COMMAND | tee -a $FILES + import time sout = serr = '' if 'command' in logtypes: os.unlink (ogGlobals.OGLOGCOMMAND) open (ogGlobals.OGLOGCOMMAND, 'w').close() + #print ('nati: ogExecAndLog: about to redirect stdout and stderr') + #time.sleep (1) ## nati with redirect_stdout (StringIO()) as r_stdout, redirect_stderr (StringIO()) as r_stderr: rc = fun (*args, **kwargs) sout = r_stdout.getvalue() serr = r_stderr.getvalue() + #print (f'nati: ogExecAndLog: end of redirections, rc ({rc}) sout ({sout}) serr ({serr})') + #time.sleep (1) ## nati else: + #print ('nati: ogExecAndLog: about to redirect stdout only') + #time.sleep (1) ## nati with redirect_stdout (StringIO()) as r_stdout: rc = fun (*args, **kwargs) sout = r_stdout.getvalue() + #print (f'nati: ogExecAndLog: end of redirections, rc ({rc}) sout ({sout})') + #time.sleep (1) ## nati rc_str = str (rc) if sout or serr or ('True' != rc_str and 'False' != rc_str and 'None' != rc_str): + #print ('nati: ogExecAndLog: sout or serr are true') + #time.sleep (1) ## nati for f in logfiles: + #print (f'nati: ogExecAndLog: logging to logfile ({f})') with open (f, 'a') as fd: if sout: fd.write (f'{sout}\n') if serr: fd.write (f'{serr}\n') if rc_str: fd.write (f'{rc_str}\n') + #fd.write (f"ogExecAndLog: {fun.__name__} rc:\n{rc_str}\n") + #if sout: fd.write (f"ogExecAndLog: {fun.__name__} stdout:\n{sout}\n") + #else: fd.write (f"ogExecAndLog: {fun.__name__} stdout: (none)\n") + #if serr: fd.write (f"ogExecAndLog: {fun.__name__} stderr:\n{serr}\n") + #else: fd.write (f"ogExecAndLog: {fun.__name__} stderr: (none)\n") + #print (f'nati: ogExecAndLog: returning rc ({rc})') return rc #/** @@ -248,6 +266,7 @@ def ogRaiseError (logtypes, code, msg): if code == ogGlobals.OG_ERR_FORMAT or \ (str_call_stack in ogGlobals.NODEBUGFUNCTIONS) or \ not (len(call_stack)>0 and (call_stack[0] in ogGlobals.NODEBUGFUNCTIONS)): + #print ('nati: ogRaiseError: actually calling ogEcho') ogEcho (logtypes, "error", f"{str_call_stack.replace(' ', '<-')}: {MSG}") return code diff --git a/client/lib/engine/bin/UEFILib.py b/ogclient/lib/python3/UEFILib.py similarity index 100% rename from client/lib/engine/bin/UEFILib.py rename to ogclient/lib/python3/UEFILib.py diff --git a/client/lib/engine/bin/lang_ca_ES.py b/ogclient/lib/python3/lang_ca_ES.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/lang_ca_ES.py rename to ogclient/lib/python3/lang_ca_ES.py diff --git a/client/lib/engine/bin/lang_en_GB.py b/ogclient/lib/python3/lang_en_GB.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/lang_en_GB.py rename to ogclient/lib/python3/lang_en_GB.py diff --git a/client/lib/engine/bin/lang_es_ES.py b/ogclient/lib/python3/lang_es_ES.py old mode 100755 new mode 100644 similarity index 100% rename from client/lib/engine/bin/lang_es_ES.py rename to ogclient/lib/python3/lang_es_ES.py diff --git a/client/lib/engine/bin/ogGlobals.py b/ogclient/lib/python3/ogGlobals.py old mode 100755 new mode 100644 similarity index 83% rename from client/lib/engine/bin/ogGlobals.py rename to ogclient/lib/python3/ogGlobals.py index cbce1ff..29eea03 --- a/client/lib/engine/bin/ogGlobals.py +++ b/ogclient/lib/python3/ogGlobals.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import sys +import os import os.path import locale import importlib.util @@ -62,6 +63,38 @@ OGCAC = os.path.join (OPENGNSYS, 'cache') OGLOG = os.path.join (OPENGNSYS, 'log') OGLOGFILE = f'{OGLOG}/192.168.42.42' ## TODO import NetLib; OGLOGFILE = f'$OGLOG/{NetLib.ogGetIpAddress()}.log' DEBUG = 'yes' +_path = os.environ['PATH'] + ':/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/opt/oglive/rootfs/opt/drbl/sbin' +os.environ['PATH'] = ':'.join ([OGSCRIPTS, _path, OGAPI, OGBIN]) + +if os.path.exists ('/tmp/initrd.cfg'): + with open ('/tmp/initrd.cfg', 'r') as fd: + initrd_cfg = fd.read() + for l in initrd_cfg.splitlines(): + if not l.startswith ('DEVICECFG='): continue ## eg. "DEVICECFG=/run/net-enp0s3.conf" + device_cfg = l.split ('=')[1] + if os.path.exists (device_cfg): + with open (device_cfg, 'r') as fd: + contents = fd.read() + exec (contents) ## !!! + ## example contents: + #DEVICE='enp0s3' + #PROTO='none' + #IPV4ADDR='192.168.2.11' + #IPV4BROADCAST='192.168.2.255' + #IPV4NETMASK='255.255.255.0' + #IPV4GATEWAY='192.168.2.1' + #IPV4DNS0='0.0.0.0' + #IPV4DNS1='0.0.0.0' + #HOSTNAME='pc1' + #DNSDOMAIN='' + #NISDOMAIN='' + #ROOTSERVER='10.0.2.15' + #ROOTPATH='' + #filename='' + #UPTIME='161' + #DHCPLEASETIME='0' + #DOMAINSEARCH='' + break ## /loadenviron.sh # Declaración de códigos de error. diff --git a/ogclient/lib/qtlib/libQtCore.so.4 b/ogclient/lib/qtlib/libQtCore.so.4 new file mode 100755 index 0000000..9a06a43 Binary files /dev/null and b/ogclient/lib/qtlib/libQtCore.so.4 differ diff --git a/ogclient/lib/qtlib/libQtGui.so.4 b/ogclient/lib/qtlib/libQtGui.so.4 new file mode 100755 index 0000000..3e244a1 Binary files /dev/null and b/ogclient/lib/qtlib/libQtGui.so.4 differ diff --git a/ogclient/lib/qtlib/libQtNetwork.so.4 b/ogclient/lib/qtlib/libQtNetwork.so.4 new file mode 100755 index 0000000..3b98fbb Binary files /dev/null and b/ogclient/lib/qtlib/libQtNetwork.so.4 differ diff --git a/ogclient/lib/qtlib/libQtWebKit.so.4 b/ogclient/lib/qtlib/libQtWebKit.so.4 new file mode 100755 index 0000000..7ca33d7 Binary files /dev/null and b/ogclient/lib/qtlib/libQtWebKit.so.4 differ diff --git a/ogclient/lib/qtlib/libcrypto.so.1.0.0 b/ogclient/lib/qtlib/libcrypto.so.1.0.0 new file mode 100755 index 0000000..73d12e9 Binary files /dev/null and b/ogclient/lib/qtlib/libcrypto.so.1.0.0 differ diff --git a/ogclient/lib/qtlib/libssl.so.1.0.0 b/ogclient/lib/qtlib/libssl.so.1.0.0 new file mode 100755 index 0000000..cd2c4ff Binary files /dev/null and b/ogclient/lib/qtlib/libssl.so.1.0.0 differ diff --git a/ogclient/lib/qtplugins/imageformats/libqjpeg.so b/ogclient/lib/qtplugins/imageformats/libqjpeg.so new file mode 100755 index 0000000..dc4a9da Binary files /dev/null and b/ogclient/lib/qtplugins/imageformats/libqjpeg.so differ diff --git a/ogclient/scripts/README.es.txt b/ogclient/scripts/README.es.txt new file mode 100644 index 0000000..933bdca --- /dev/null +++ b/ogclient/scripts/README.es.txt @@ -0,0 +1,53 @@ +OpenGnsys Client (Scripts) README +==================================== + + +Este directorio contiene algunos scripts de ejemplo que se utilizan +por el cliente de la consola web de administración, para realizar +las operaciones más comunes de gestión de clientes. + +Dichos scripts están desarrollados en BASH y utilizan las funciones +básicas del motor de clonación. + +OpenGnsys Client Cloning Engine incluye un completo conjunto de +funiones para que el administrador pueda personalizar sus scripts +de gestión. Sin embargo, estos ejemplos son completamente +operativos y pueden ser utilizados directamente. + + +Scripts distribuidos: + +- bootLinux arranca un sistema Linux con partición de inicio. +- bootOs arranca un sistema operativo instalado. +- bootWindows arranca un sistema Windows con partición de inicio. +- configureOs ejecuta tereas de postconfiguración de un sistema operativo. +- createImage genera una imagen de un sistema operativo. +- createLogicalPartitions define las particiones primarias del disco. +- createPrimaryPartitions define las particiones lógicas del disco. +- deployImage restaura una imagen y postconfigura su sistema operativo. +- formatFs formatea un sistema de archivos. +- getFsType muestra el tipo (mnemónico) de una partición. +- getIpAddress muestra la IP local del cliente. +- getOsVersion muestra la versión de sistema operativo instalado. +- initCache inicia o define la caché local. +- listHardwareInfo lista los dispoisitivos del cliente. +- listPrimaryPartitions lista las particiones primarias de un disco. +- listSoftwareInfo lista el software de un sistema operativo. +- menuBrowser arranque el Browser con un menú preconfigurado. +- poweroff desmonta los sistemas de archivos y apaga el equipo. +- reboot desmonta los sistemas de archivos y reinicia el equipo. +- restoreImage restaura una imagen de sistema operativo. + + +Plantillas para personalización de operaciones: + +Se han generado varios scripts de ejemplo para personalizar ciertas operaciones +importantes. Para activar una plantilla debe renombrase el ficheros quitando la +extensión ".template" y añadir permisos de ejecución. Las plantillas activadas +no seránn modificadas por el actualizador de OpenGnsys. + +- bootOsCustom.template arranque personalizado de sistema operativo. +- configureOsCustom.template postconfiguración personalizada de sistema operativo. +- createImageCustom.template creación personalizada de imagen. +- restoreImageCustom.template restauración personalizada de imagen. + diff --git a/ogclient/scripts/bootLinux b/ogclient/scripts/bootLinux new file mode 120000 index 0000000..d19be90 --- /dev/null +++ b/ogclient/scripts/bootLinux @@ -0,0 +1 @@ +bootOs \ No newline at end of file diff --git a/client/shared/scripts/bootOS.py b/ogclient/scripts/bootOS.py similarity index 100% rename from client/shared/scripts/bootOS.py rename to ogclient/scripts/bootOS.py diff --git a/client/shared/scripts/bootOSCustomTemplate.py b/ogclient/scripts/bootOSCustomTemplate.py similarity index 100% rename from client/shared/scripts/bootOSCustomTemplate.py rename to ogclient/scripts/bootOSCustomTemplate.py diff --git a/ogclient/scripts/bootOs b/ogclient/scripts/bootOs new file mode 100755 index 0000000..3b569b3 --- /dev/null +++ b/ogclient/scripts/bootOs @@ -0,0 +1,47 @@ +#!/bin/bash +# Script de ejemplo para arancar un sistema operativo instalado. +# Nota: se usa como base para el programa de arranque de OpenGnsys Admin. + +PROG="$(basename $0)" +if [ $# -lt 2 -o $# -gt 3 ]; then + ogRaiseError $OG_ERR_FORMAT "Formato: $PROG ndisco nfilesys [str_kernel str_initrd str_kernelparams]" + exit $? +fi + +# Comprobar errores. +PART=$(ogDiskToDev "$1" "$2") || exit $? +MNTDIR=$(ogMount $1 $2) || exit $? + +echo "[0] Inicio del proceso de arranque." + +# Si el equipo está hibernado chequeamos el f.s. y borramos el hiberfile (error cod.6) +mount |grep -q "$MNTDIR.*(rw" +if [ $? -ne 0 ]; then + ogEcho log session "${MSG_WARNING}: $MSG_MOUNTREADONLY" + ogUnmount $1 $2 + ogCheckFs $1 $2 + + PART=$(ogDiskToDev "$1" "$2") + mkdir -p $MNTDIR + ntfs-3g -o remove_hiberfile $PART $MNTDIR + ogEcho log session "Particion desbloqueada" + + ogUnmount $1 $2 + ogMount $1 $2 +fi + + +if which bootOsCustom &>/dev/null; then + echo "[10] Configuración personalizada del inicio." + bootOsCustom $@ +fi + +echo "[70] Desmontar todos los sistemas de archivos." +sync +for (( i=1; i <= $(ogDiskToDev | wc -w); i++ )); do + ogUnmountAll $i &>/dev/null +done +echo "[80] Desmontar cache local." +ogUnmountCache +echo "[90] Arrancar sistema operativo." +ogBoot "$@" diff --git a/ogclient/scripts/bootOsCustom.template b/ogclient/scripts/bootOsCustom.template new file mode 100755 index 0000000..efd4c1f --- /dev/null +++ b/ogclient/scripts/bootOsCustom.template @@ -0,0 +1,92 @@ +#!/bin/bash +#/** +# bootOsCustom +#@brief Plantilla para script de configuración personalizada de sistema operativo restaurado. +#@param $1 nº de disco +#@param $2 nº de partición +#@warning Renombrar este fichero como "bootOsCustom" para personalizar el script estándar "bootOs". +#@note La partición a inicializar debe estar montada +#@version 1.1.1 Soporta varios discos +#@date 2019/08/26 +#**/ +# CONFIGURAR: Partición de datos de Windows que no queremos ocultar (valor por defecto '0' no oculta nada) +DISKDATA=0 +PARTDATA=0 + +PROG="$(basename $0)" +# Control de errores +if [ $# -lt 2 ]; then + ogRaiseError $OG_ERR_FORMAT "Formato: $PROG ndisco nparticion" + exit $? +fi + +# Parámetros obligatorios. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). +DEVICE=$(ogDiskToDev "$DISK" "$PART") || exit $? + +# Paso 1: Adaptar el código de ejemplo para arranque personalizado. +# Nota: el script "bootOs" llama al script "bootOsCustom" después de realizar la operaciones de inicio estándar y antes de desmontar las particiones e iniciar el sistema operativo. + + +MNTDIR=$(ogMount $DISK $PART) || exit $? +NAME="$(ogGetHostname)" +NAME=${NAME:-"pc"} +OSTYPE=$(ogGetOsType $DISK $PART) + +case "$OSTYPE" in + Windows) + ## Mostrar las particiones NTFS de sistema (dos opciones) + ## Opción 1: SIN ocultar las demás. + #ogEcho log session "[40] Mostrar y activar particion de Windows $PART." + #[ $(ogGetPartitionType $DISK $PART) == "HNTFS" -o $(ogGetPartitionType $DISK $PART) == "WIN-RESERV" ] && ogUnhidePartition $DISK $PART + + ## Recorremos los distintos discos + #for DEVICE in $(ogDiskToDev); do + # d=$(ogDevToDisk $DEVICE) + + # ## Mostrar las particiones NTFS de sistema (dos opciones) + # ## Opción 2: Ocultamos las demás. + # ogEcho log session "[40] Activar particion de Windows $PART y ocultar las demás." + # for (( i=1; i<=$(ogGetPartitionsNumber $d); i++ )); do + # if [ $d == $DISK -a $i == $PART ] || [ $d == $DISKDATA -a $i == $PARTDATA ]; then + # [ $(ogGetPartitionType $d $i) == "HNTFS" -o $(ogGetPartitionType $d $i) == "WIN-RESERV" ] && ogUnhidePartition $d $i + # else + # [ "$(ogGetPartitionType $d $i)" == NTFS -o "$(ogGetPartitionType $d $i)" == "WINDOWS" ] && ogHidePartition $d $i + # fi + # done + + # ## Borrar marcas de arrranque de todos los Windows instalados en el disco. + # ogEcho log session "[30] Borrar marcas de arrranque de todos los Windows instalados en el disco." + # for (( i=1; i<=$(ogGetPartitionsNumber $d); i++ )); do + # [ "$(ogGetOsType $d $i)" == "Windows" ] && ogMount $d $i &>/dev/null + # done + # rm -f /mnt/*/ogboot.* + + #done + ;; + Linux) + ## Modificar el nombre del equipo + #ogEcho log session "[30] Asignar nombre Linux \"$NAME\"." + #ETC=$(ogGetPath $DISK $PART /etc) + #[ -d "$ETC" ] && echo "$NAME" >$ETC/hostname 2>/dev/null + + ## Sustituir UUID o LABEL por su dispositivo en definición de sistema de archivo raíz. + #if [ -f "$ETC/fstab" ]; then + # ogEcho log session "[40] Actualizar fstab con particion raíz \"$PART\"." + # awk -v P="$PART " '{ if ($2=="/" && $1!~/^#/) {sub(/^.*$/, P, $1)} + # print }' $ETC/fstab >/tmp/fstab + # mv /tmp/fstab $ETC/fstab + #fi + + ## Cambiar claves usuarios, copiando fichero /etc/passwd + ## En el servidor el nuevo fichero debe situarse en el directorio del grupo: + ## /opt/opengnsys/images/groups/nombre_aula + #if [ -r $(ogGetGroupDir)/passwd ]; then + # ogEcho log session "[65] Cambiar claves de usuarios." + # cp $(ogGetGroupDir)/passwd $MNTDIR/etc + #fi + ;; +esac diff --git a/ogclient/scripts/bootWindows b/ogclient/scripts/bootWindows new file mode 120000 index 0000000..d19be90 --- /dev/null +++ b/ogclient/scripts/bootWindows @@ -0,0 +1 @@ +bootOs \ No newline at end of file diff --git a/ogclient/scripts/buildToOrder b/ogclient/scripts/buildToOrder new file mode 100755 index 0000000..5bbc938 --- /dev/null +++ b/ogclient/scripts/buildToOrder @@ -0,0 +1,79 @@ +#!/bin/bash + +#/** +# BuildToOrder +#@brief Script de ejemplo para realizar una configuracion del sistema operativo antes de generar imagen o de restaurado. +#@brief Activa el uso de los contralodres de disco más usados en windows 7. +#@brief (puede usarse como complemento para el programa de creación de imágenes o de restauración). +#@param 1 disco +#@param 2 particion +#@return +#@TODO +#@exception +#@version 1.0.4 - Discos ide + SATA. +#@author +#@date 2012-10-05 +#@version 1.1.1b - Funciona para Windows8 y Windows 10. Si la clave no existe (tiene valor vacío) se crea. +#@date 2020-05-04 + + +#Control de parametros. +PROG="$(basename $0)" +if [ $# -ne 2 ]; then + ogRaiseError $OG_ERR_FORMAT "Formato: $PROG ndisco nparticion" + exit $? +fi + + +MNTDIR=$(ogMount $1 $2) + +# filtro Tipo de sistema operativo. +OSTYPE="$(ogGetOsType $1 $2)" + + +case "$OSTYPE" in + Windows) + echo "Filtro versión de sistema operativo windows." + TYPE=$(ogGetOsVersion $1 $2) + case "$TYPE" in + *Windows\ XP) + echo "Versión de sistema operativo Windows XP no soportado" + exit + ;; + *Windows\ 7*) + # Claves a modificar + KEYS="intelide pciide msahci iaStorV iaStor LSI_SAS" + + ;; + *Windows\ *8*|*10*) + # Claves a modificar + KEYS="intelide pciide storahci iaStorV iaStorAC iaStorAVC LSI_SAS" + ;; + esac + + echo "$TYPE" + CONTROLSET="ControlSet001 ControlSet002" + for C in $CONTROLSET; + # Si no existe la rama de registro continuo a la siguiente. + [ "$(ogListRegistryKeys $MNTDIR SYSTEM '\'${C})" == "" ] && continue + + for K in $KEYS; do + FULLK='\'$C'\Services\'$K'\Start' + VALUE=$(ogGetRegistryValue $MNTDIR SYSTEM "$FULLK") + # Si el valor está vacío la creo. + if [ "$VALUE" == "" ]; then + ogDeleteRegistryValue $MNTDIR SYSTEM "$FULLK" + ogAddRegistryValue $MNTDIR SYSTEM "$FULLK" DWORD + fi + ogSetRegistryValue $MNTDIR SYSTEM "$FULLK" '0' + echo " * $C $K enabled" + done + done + ;; + Linux) + echo "Versión de Sistema Operativo GNU/Linux no soportado" + ;; + *) + echo "Sistema Operativo no soportado" + ;; +esac diff --git a/client/shared/scripts/buildToOrder.py b/ogclient/scripts/buildToOrder.py similarity index 100% rename from client/shared/scripts/buildToOrder.py rename to ogclient/scripts/buildToOrder.py diff --git a/ogclient/scripts/cloneRemoteFromMaster b/ogclient/scripts/cloneRemoteFromMaster new file mode 100755 index 0000000..6d8001d --- /dev/null +++ b/ogclient/scripts/cloneRemoteFromMaster @@ -0,0 +1,324 @@ +#!/bin/bash + +#/** +# cloneremoteFromMaster +#@brief Restaura una particion o imagen sobre las particiones de equipos cliente remotos +#@param 1 str_origen admite dirección IP del equipo Master. +#@param 2 str_origen admite int_disk str_REPO|str_CACHE +#@param 3 str_origen admite int partorigen stre_imagen +#@param 4 str_sesion multicast|unicast +#@param $5 int_disco_destino +#@param $6 init_particion_destino +#@param $7 str_tool_clone +#@param $8 str_tool_compresor +#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 1 1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop +#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 REPO /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop +#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 CACHE /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop +#@return +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception $OG_ERR_IMGSIZEPARTITION=30 #Imagen demasiado pequeña para ser clonada +#@exception OG_ERR_REDUCEFS=17 #error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS=18 #errror al expandir el sistema de archivos. +#@exception OG_ERR_UCASTSYNTAXT=50 # Error en la generación de sintaxis de transferenica unicast +#@exception OG_ERR_UCASTSENDPARTITION=51 # Error en envio UNICAST de una particion +#@exception OG_ERR_UCASTSENDFILE=52 # Error en envio UNICAST de un fichero +#@exception OG_ERR_UCASTRECEIVERPARTITION=53 #Error en la recepcion UNICAST de una particion +#@exception OG_ERR_UCASTRECEIVERFILE=54 #Error en la recepcion UNICAST de un fichero +#@exception OG_ERR_MCASTSYNTAXT=55 # Error en la generacion de sintaxis de transferenica Multicast. +#@exception OG_ERR_MCASTSENDFILE=56 # Error en envio MULTICAST de un fichero +#@exception OG_ERR_MCASTRECEIVERFILE=57 #Error en la recepcion MULTICAST de un fichero +#@exception OG_ERR_MCASTSENDPARTITION=58 # Error en envio MULTICAST de una particion +#@exception OG_ERR_MCASTRECEIVERPARTITION=59 # Error en la recepcion MULTICAST de una particion +#@exception OG_ERR_PROTOCOLJOINMASTER=60 # Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER +#@note +#@todo: +#@version 0.9.1 - integración con OpenGnsys +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2009/03/17 +#@version 0.9.2 - adaptacion a OpenGnsys +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2010/07/27 +#@version 0.1.0 - gestion unicast +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/01/26 +#@version 1.0 - control de errores para el ogAdmServer +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/04/24 +#@version 1.0 - Uso de parted para controlar tamaño particion destino. Requiere Formateo FS previo -parted usa FS para el tamanyo". +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/04/24 +#@version 1.0.1 - Se elimina la operación de reducir la particion. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/05/16 +#@version 1.0.3 - se integra con httpd-log. +#@version 1.0.3 - Habilita el uso de la variable OGWINREDUCE=TRUE|TRUE para reducir el sistema de archivos a enviar +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/12/22 +#@version 1.0.6 - Uso de la funcion ogExecuteAndLog +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2012/02/12 +#@version 1.1.0.a - sesion multicast cliente puerto:master:0:0 (ticket #872) +#@author Antonio J. Doblas Viso +#@date 2018/09/11 +#*/ ## +#*/ ## + +#test 1. cliente sin particiones. Detectado TODO: crear estrucutras de particiones +#test 2. cliente con particion mas pequeña. Detectado. +#test 3. cleinte con particion destinio no formateado. Detectado. +#test 4. cliente con particion destino ocupado por el usuario pwd . FALLO. +#test 5. master sin origen particion. +#test 6. master sin origen fichero. + +TIME1=$SECONDS +PROG="$(basename $0)" + +trap "pkill faucet; exit 1" 0 1 2 3 6 9 14 15 + +#AYUDA +if [ $# -lt 1 -o "$1" == "help" ]; then + echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp" + exit 1 +fi + +#ERROR +if [ $# -lt 6 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAST|UNICAST] SESSION TARGET_disk TARGET_partition" + exit $? +fi + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +# Valores por defecto: #IMGPROG="partclone" ; #IMGCOMP="lzop" ; #IMGEXT="img" #IMGREDUCE="TRUE" +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Procesar parámetros de entrada +HOSTIP=`ogGetIpAddress` +if [ -z "$HOSTIP" ] +then + source /tmp/net-eth* + HOSTIP=`ogGetIpAddress` +fi +MASTERIP="$1" +PROTOCOL="$4" +case "${PROTOCOL^^}" in + MULTICAST) + SESSIONMCASTSERVER=$5 + SESSIONMCASTCLIENT=`echo $5 | awk -F: '{print $1}'`:$MASTERIP:0:0 + ;; + UNICAST) + SESSIONUCASTSERVER=$5 + SESSIONUCASTCLIENT=`echo $5 | awk -F: '{print $1}'`:$MASTERIP + ;; + *) + exit $(ogRaiseError $OG_ERR_FORMAT "Protocolo $PROTOCOL no soportado en esta operacion"; echo $?) +;; +esac +# contenedor destino (disco particion) +DISKTARGET="$6" +PARTTARGET="$7" +#herramienta de compresión. +TOOLCLONE="$8" +COMPRESOR="$9" + +pkill faucet + +# Preparando Instrucción según sea Master o Client +case $MASTERIP in + $HOSTIP) + ogEcho log session "[1] Equipo Master preparando el origen de los datos a enviar" + ogGetPath $2 $3.img &>/dev/null; RC=$?; + ogDiskToDev $2 $3 &>/dev/null; RETVAL=$?; + + if [ "$RC" == "0" ]; then + IMG=$(ogGetPath $2 $3.img); MODEMASTER=SENDFILE + elif [ "$RETVAL" == "0" ]; then + DISKSOURCE=$2; PARTSOURCE=$3; MODEMASTER=SENDPARTITION + else + ogRaiseError $OG_ERR_NOTFOUND "$2 $3"; exit $? + fi + echo $MODEMASTER + # Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE} + case "$MODEMASTER" in + SENDPARTITION) + ogEcho log session "[5] Master en modo $MODEMASTER: informacion inicial a los clientes-slaves" + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 118"; exit $? + else + faucet 4000 --out echo "WORKING" & + fi + ogEcho log session "[10]: Desmontando DISK:$DISKSOURCE PARTITION:$PARTSOURCE" + ogUnmount $2 $3 || exit $(ogRaiseError $OG_ERR_LOCKED "no se puede desmontar $2 $3 l124"; echo $?) + #Obtener tamaño de la partición. + SIZE=$(ogGetPartitionSize $2 $3) || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al detectar tamaño partcion $2 $3 l127"; echo $?) + + # Si es UEFI copio el cargador de arranque a la partición + OSTYPE="$(ogGetOsType $2 $3)" + if ogIsEfiActive && [ "$OSTYPE" == "Windows" ]; then + ogEcho log session "[12] $MSG_HELP_ogCopyEfiBootLoader" + ogCopyEfiBootLoader $2 $3 + fi + + if [ "$OGWINREDUCE" == "TRUE" ] + then + ogEcho log session "[15]: Calculando la reduccion del sistema de archivos DISK:$DISKSOURCE PARTITION:$PARTSOURCE SIZE:$SIZE" + ogReduceFs $2 $3 || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al reducir el FS $2 $3 l129"; echo $?) + fi + + REDSIZE=$(ogGetFsSize $2 $3) || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al detectar el nuevo FS $2 $3 l130"; echo $?) + TIMEAUX=$[SECONDS-TIME1] + ogEcho log session "[20]: Preparada para enviar el sistema de archivos: Tamaño datos: $REDSIZE origne: $DISKSOURCE $PARTSOURCE" + ogEcho log session " tiempo de reducción del sistema de archivos: $[TIMEAUX/60]m $[TIMEAUX%60]s" + + #if [ $REDSIZE -lt $SIZE ]; then + # echo "[24] Redimensionar partición a $REDSIZE KB." + # ogSetPartitionSize $2 $3 $REDSIZE + #fi + + ogEcho log session "[25] Master en Modo $MODEMASTER: informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE" + pkill faucet + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 140"; exit $? + else + faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & + fi + case "${PROTOCOL^^}" in + MULTICAST) + ogEcho log session "[29] Transferencia Multicast: ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR " + ogExecAndLog session "ogMcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONMCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$? + ;; + UNICAST) + sleep 60 + ogEcho log session "[29] Transferencia Unicast: ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR" + ogExecAndLog session "ogUcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONUCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$? + ;; + esac + + #if [ $REDSIZE -lt $SIZE ]; then + # echo "[85] Redimensionar partición a $SIZE KB." + # ogSetPartitionSize $2 $3 $SIZE + ogEcho log session "[90] Extender sistema de archivos." + ogExtendFs $2 $3 + #fi + pkill faucet + if [ $RETVAL == 0 ] + then + exit 0 + else + exit $(ogRaiseError $OG_ERR_MCASTSENDPARTITION "Error al enviar la particion $2 $3 con protocolo $PROTOCOL l167"; echo $?) + fi + + ;; + SENDFILE) + ogEcho log session "[5] Master en modo $MODEMASTER: informacion inicial a los clientes-slaves" + ogEcho log session "[10]: Preparando Imagen: $IMG" + TOOLCLONE=$(ogGetImageProgram $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "TOOLCLONE no detectado l174"; echo $?) + COMPRESOR=$(ogGetImageCompressor $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "COMPRESOR NO DETECTADO l175"; echo $?) + REDSIZE=$(ogGetImageSize $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "REDSIZE NO DETECTADO l176"; echo $?) + ogEcho log session "[25] Master en Modo $MODEMASTER" + ogEcho log "Informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE" + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 140"; exit $? + else + faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & + fi + case "${PROTOCOL^^}" in + MULTICAST) + echo "[29] ogMcastSendFile $2 $3.img $SESSIONMCASTSERVER " + ogMcastSendFile $2 $3.img $SESSIONMCASTSERVER || RETVAL=$? + ;; + UNICAST) + sleep 60 + echo "[29] ogUcastSendFile $2 $3.img $SESSIONUCASTSERVER" + ogUcastSendFile $2 $3.img $SESSIONUCASTSERVER || RETVAL=$? + ;; + esac + pkill faucet + if [ $RETVAL == 0 ] + then + exit 0 + else + exit $(ogRaiseError $OG_ERR_MCASTSENDFILE "Error al enviar la image $2 $3.img con protocolo $PROTOCOL l200"; echo $?) + fi + ;; + esac + # FIN Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE} + ;; + *) + ogEcho log session "[1] Equipo -Client- preparando para recibir datos $PROTOCOL" + ogDiskToDev $DISKTARGET $PARTTARGET &>/dev/null || exit $(ogRaiseError $OG_ERR_LOCKED "El cliente no tiene esas particiones $DISKTARGET $PARTTARGET l211"; echo $?) + # TODO: si el cliente no está en la lista de clientes UNICAST salir. + case "${PROTOCOL^^}" in + UNICAST) + echo "$SESSIONUCASTSERVER" | grep $HOSTIP || exit $(ogRaiseError $OG_ERR_PROTOCOLJOINMASTER "Este cliente no pertence a la sesion UNICAST l214"; echo $?) + ;; + esac + ogEcho log session "[2] Desmontando particion destino" + ogUnmount $DISKTARGET $PARTTARGET || exit $(ogRaiseError $OG_ERR_LOCKED "no se puede desmontar la particion destino $2 $3 l218"; echo $?) + ogEcho log session "[25] Buscando informacion extra sobre la clonacion con el master $MASTERIP: " + sleep 10 + TIMEWAITMASTER=120 + TIMEWAITING=0 + GETINFO="NONE" + while [ "${GETINFO}" != "OK" ] + do + INFOEXTRA=`hose $MASTERIP 4000 --in cat 2>/dev/null` + sleep 10; echo -n "." + #echo comienza el timeout $TIMEWAITMASTER para abortar + [ -z "$INFOEXTRA" ] && let TIMEWAITMASTER=$TIMEWAITMASTER-10 + [ "$TIMEWAITMASTER" -gt "0" ] || exit $(ogRaiseError $OG_ERR_PROTOCOLJOINMASTER " l230 "; echo $?) + #Si primer parametro desde el server es READY, salimos del bucle + GETINFO=$(echo $INFOEXTRA | awk '{print $1}') + [ "$GETINFO" == "READY" ] && GETINFO="OK" + done + echo $INFOEXTRA + TOOLCLONE=$(echo $INFOEXTRA | awk '{print $2}') + COMPRESOR=$(echo $INFOEXTRA | awk '{print $3}') + SIZEIMAGE=$(echo $INFOEXTRA | awk '{print $4}') + ogEcho log "$INFOEXTRA = herramienta= $TOOLCLONE compresor= $COMPRESOR size= $SIZEIMAGE" + ogMount $DISKTARGET $PARTTARGET || ogFormat $DISKTARGET $PARTTARGET + #SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | grep Disk | awk -F" " '{print $3}' | tr -d kB); + SIZEPARTTARGET=$(ogGetPartitionSize $DISKTARGET $PARTTARGET ) + ogEcho log session "[28] comprobando que el tamaño de la imagen $SIZEIMAGE es menor que el de la particion destino $SIZEPARTTARGET" + # comprobamos que el tamaño de a imagen es menor que la del cliente. + if [ "$SIZEIMAGE" -lt "$SIZEPARTTARGET" ] + then + ogEcho log session "[30] Iniciando Cliente $PROTOCOL " + case "${PROTOCOL^^}" in + MULTICAST) + ogEcho log session "ogMcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONMCASTCLIENT $TOOLCLONE $COMPRESOR" + ogExecAndLog command "ogMcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?) + ;; + UNICAST) + ogEcho log session "ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR" + ogExecAndLog command "ogUcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONUCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?) + ;; + esac + if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom $DISKTARGET $PARTTARGET" + # Si $2 = num_disk las varibles REPO IMGNAME estan vacias + ! [[ $2 =~ ^[0-9]+$ ]] && REPO="$2" && IMGNAME="$3" + configureOsCustom $DISKTARGET $PARTTARGET $REPO $IMGNAME + else + ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE $DISKTARGET $PARTTARGET" + configureOs $DISKTARGET $PARTTARGET + fi + + else + # Si el tamaño de los datos recibidos es más grande que la particion destino + ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET menor que la imagen= $SIZEIMAGE"; exit $? + fi + ;; +esac +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] Duración de la operación $[TIME/60]m $[TIME%60]s" + diff --git a/client/shared/scripts/configureOSCustomTemplate.py b/ogclient/scripts/configureOSCustomTemplate.py similarity index 100% rename from client/shared/scripts/configureOSCustomTemplate.py rename to ogclient/scripts/configureOSCustomTemplate.py diff --git a/ogclient/scripts/configureOs b/ogclient/scripts/configureOs new file mode 100755 index 0000000..3f39c23 --- /dev/null +++ b/ogclient/scripts/configureOs @@ -0,0 +1,175 @@ +#!/bin/bash + +#/** +# configureOs +#@brief Script para realizar la configuracion del sistema operativo restaurado. +#@param 1 disco +#@param 2 particion +#@return +#@TODO comprobar que el tipo de particion corresponde con el sistema de archivos. +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@version 1.0.1 - Integracion cambio de nombre, extender fs, chequear particion activa +#@author +#@date 2011-05-11 +#@version 1.0.1 - Configura el sector de la particion y el gestor de windows para iniciarse desde cualquier particion. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-05-20 +#@version 1.0.2 - Configura el sector de la particion y el gestor de linux para iniciarse desde cualquier particion. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-11-22 +#@version 1.0.3 - Configura el chkdisk en el arranque de windows, segun variable OGWINCHKDISK del engine.cfg. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-12-23 +#@version 1.0.4 - Inyecta el cliente para gestión del sistema operativo. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-11 +#@version 1.0.5 - Postconfiguración para Mac OS X. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-11 +#@version 1.1.0 - Postconfiguración para agente de sistema operativo basado en REST. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2016-08-16 +#@version 1.0.6b - llamadas opcionales para mejoras varias. Descomentar la instruccion para su activacion. ogConfigureFstab +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2016-11-03 +#@version 1.1.1 - Equipos UEFI: para Windows copia cargador de arranque a partición UEFI, para linux configura particion ESP en fstab. (ticket #802 #889 #890) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-08 +#*/ ## + +# Carga el configurador del engine y los parámetros de red. +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg +[ -f $DEVICECFG ] && source $DEVICECFG + +# Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición. +PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $? +FSSIZE=$(ogGetFsSize $1 $2) +if [ $FSSIZE -lt $PARTSIZE ]; then + echo "Extender sistema de archivos." + ogExtendFs $1 $2 +fi + +# Si no existe partición activa, activar este sistema. +FLAGACTIVE=$(ogGetPartitionActive $1) +[ -z $FLAGACTIVE ] && ogSetPartitionActive $1 $2 + +# Si el sistema de archivos es de solo lectura, no hacer la post-configuración. +MNTDIR=$(ogMount $1 $2) +if ! ogIsWritable $1 $2; then + echo "AVISO: sistema de archivos de solo lectura, no se ejecuta postconfiguración." + exit +fi + +# Nombre del cliente. +HOST="$(ogGetHostname)" + +# Post-configuración personalizada para cada tipo de sistema operativo. +OSTYPE="$(ogGetOsType $1 $2)" +case "$OSTYPE" in + Windows) # Postconfiguración de Windows. + # Cambiar nombre en sistemas Windows. + HOST=${HOST:-"pc"} + ogSetWindowsName $1 $2 "$HOST" + # Si es UEFI copio el cargador de arranque a la partición EFI e instalo Grub. + if ogIsEfiActive; then + ogRestoreEfiBootLoader $1 $2 + ogGrubInstallMbr $(ogGetEsp) TRUE + else + # Configurar el boot sector de la partición Windows. + ogFixBootSector $1 $2 + fi + # Configurar el gestor de arranque de Windows XP/Vista/7. + ogWindowsBootParameters $1 $2 + # Registrar en Windows que la partición indicada es su nueva unidad C:\ + ogWindowsRegisterPartition $1 $2 C $1 $2 + # Configurar nuevo agente OGAgent. + ogConfigureOgagent $1 $2 + # Eliminar el antiguo cliente de Windows. + if [ -n "$(ogGetPath $MNTDIR/windows/ogAdmWinClient.exe)$(ogGetPath $MNTDIR/winnt/ogAdmWinClient.exe)" ]; then + ogInstallMiniSetup $1 $2 postconf.cmd + ogUninstallWindowsClient $1 $2 postconf.cmd + fi + ;; + Linux) # Postconfiguración de GNU/Linux. + # Configuro fstab: particion de Swap y si es UEFI además la partición EFI. + ogConfigureFstab $1 $2 + # Si es UEFI instalo Grub en la partición EFI + ogIsEfiActive && ogGrubInstallMbr $(ogGetEsp) TRUE + ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen) + ogGrubInstallPartition $1 $2 + # Eliminar el antiguo cliente de Linux. + [ -n "$(find $MNTDIR/usr/sbin $MNTDIR/sbin $MNTDIR/usr/local/sbin -name ogAdmLnxClient -print)" ] && ogUninstallLinuxClient $1 $2 + # Configurar nuevo agente OGAgent. + ogConfigureOgagent $1 $2 + ## Modificar el nombre del equipo + echo "Asignar nombre Linux \"$HOST\"." + ETC=$(ogGetPath $1 $2 /etc) + [ -d "$ETC" ] && echo "$HOST" >$ETC/hostname 2>/dev/null + ;; + MacOS) # Postconfiguración de Mac OS X. + # Fichero indicador de activación de postconfiguración. + touch $MNTDIR/osxpostconf + + # Crear fichero de configuración del servicio de arranque. + cat << EOT >$MNTDIR/Library/LaunchDaemons/es.opengnsys.postconfd.plist + + + + Label + es.opengnsys.postconfd.sh + ProgramArguments + + /var/root/postconfd.sh + + RunAtLoad + + StandardOutPath + /var/log/postconfd.log + StandardErrorPath + /var/log/postconfd.err + Debug + + + +EOT + + # Programa de inicio que será ejecutado en el arranque de Mac OS X. + cat << EOT >$MNTDIR/var/root/postconfd.sh +#!/bin/bash +# postconfd - ejecución de scripts de inicio. + +# Ejecutar postconfiguración si existe el fichero indicador. +if [ -e /osxpostconf ]; then + # Tomar nombre del equipo. + HOST="$HOST" + if [ -z "\$HOST" ]; then + # Si no hay nombre asociado, activar la red para obtener datos del DHCP. + source /etc/rc.common + CheckForNetwork + while [ "\$NETWORKUP" != "-YES-" ]; do + sleep 5 + NETWORKUP= + CheckForNetwork + done + # Componer nombre del equipo a partir de datos del DHCP. + IP=\$(ifconfig en0 inet | awk '{if (\$1=="inet") print \$2}') + HOST="mac-\$(echo \${IP//./-} | cut -f3-4 -d-)" + fi + # Asignar nombre del equipo. + scutil --set ComputerName "\$HOST" + scutil --set LocalHostName "\$HOST" + scutil --set HostName "\$HOST" + hostname "\$HOST" + # Descromprimir ficheros de versión para obtener inventario de aplicaciones. + find /Applications -type d -name "*.app" -prune -exec \ + ditto --nopreserveHFSCompression "{}/Contents/version.plist" "{}/Contents/version.plist.uncompress" + rm -f /osxpostconf # Borrar fichero indicador de psotconfiguración +fi +EOT + # Dar permiso de ejecución. + chmod 700 $MNTDIR/var/root/postconfd.sh + # Configurar nuevo agente OGAgent de sistema operativo. + ogConfigureOgagent $1 $2 + ;; +esac +exit 0 diff --git a/client/shared/scripts/configureOs.py b/ogclient/scripts/configureOs.py similarity index 100% rename from client/shared/scripts/configureOs.py rename to ogclient/scripts/configureOs.py diff --git a/ogclient/scripts/configureOsCustom.template b/ogclient/scripts/configureOsCustom.template new file mode 100644 index 0000000..f1c8e2a --- /dev/null +++ b/ogclient/scripts/configureOsCustom.template @@ -0,0 +1,81 @@ +#!/bin/bash +#/** +# configureOsCustom +#@brief Plantilla para scirpt de configuracion personalizada de sistema operativo restaurado. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP (opcional) +#@param $4 Nombre canónico de la imagen sin extensión (opcional) +#@warning Renombrar este fichero como "configureOsCustom" para sustituir al script estándar "configureOs". +#@note Los parámetros disco y partición son obligatorios y opcionalmente puede recibir también el repositorio y la imagen usada para en el despliegue. +#**/ + + +# Control de parámetros. +[ $# -eq 2 -o $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: configureOsCustom int_ndisc int_npart [str_repo str_imgname]" || exit $? + +# Parámetros obligatorios. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. +# Parámetros opcionales. +REPO="${3^^}" # Repositorio (en mayúsculas). +IMGNAME="$4" # Nombre canónico de imagen (sin extensión). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + +# Paso 1: Adaptar el código de ejemplo para postconfiguración personalizada. +# Nota: incluye llamada al script "configureOs" para realizar previamente una configuración estándar. + +# Configurarción típica. +configureOs "$1" "$2" +# Postconfiguración personalizada para cada tipo de sistema operativo. +OSTYPE="$(ogGetOsType $1 $2)" +case "$OSTYPE" in + Windows) # Postconfiguración de Windows. + # Descomentar la siguiente línea para cambiar usuario de inicio. + #ogSetWinlogonUser $1 $2 " " + # OPCIONAL: desactivar el chkdisk de windows tras la restauracion. Requiere configuracion previa en el engine.cfg + #ogLoadHiveWindows $1 $2; ogSetWindowsChkdisk $OGWINCHKDISK; ogUpdateHiveWindows + ;; + Linux) # Postconfiguración de GNU/Linux. + ##OPCIONAL Para UEFI: cambia el UUID de la partición (para tener dos linux en un equipo) + #ogUuidChange $DISK $PART + ##OPCIONAL Limpiar dispositivos reconocidos previamente + #ogCleanLinuxDevices $1 $2 + ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen) + #ogGrubInstallPartition $1 $2 + ## OPCIONAL: instala y configura el codigo de arranque del Grub en el MBR (no lo configura, se mantiene el original de la imagen) + #ogGrubInstallMbr $1 $2 + ## OPCIONAL: Instala y configura el Grub en el MBR y lo autoconfigura, entradas para los sitemas operativos, ademas al linux restaurado le añade los parmetros indicados. + #ogGrubInstallMbr $1 $2 TRUE "irqpoll pci=noacpi noresume quiet splash" + ;; + MacOS) # Postconfiguración de Mac OS X. + # Programa de inicio que será ejecutado en el arranque de Mac OS X. + # NOTA: no modificar la línea siguiente. + cat << EOT | sed -n -e '/rm -f /r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' $MNTDIR/var/root/postconfd.sh + + ### NOTA: descomentar las opciones deseadas. + # Activar Journaling en HFS+ (no usar si el cliente continua en OpenGnsys). + #diskutil enableJournal disk$[$1-1]s$2 + # Pedir usuario y clave en pantalla de conexión. + #defaults write /Library/Preferences/com.apple.loginwindow SHOWFULLNAME -bool yes + # No mostrar botón de cambio rápido de usuario. + #defaults write /Library/Preferences/.GlobalPreferences MultipleSessionEnabled -bool NO + # Bloquear escritorio, fondo, dock, etc del usuario "usuario". + #chflags uchange /Users/usuario/Library/Preferences/com.apple.desktop.plist + #chflags uchange /Users/usuario/Library/Preferences/com.apple.dock.plist + #chflags uchange /Users/usuario/Desktop + # Añadir usuario "usuario" a la lista de desarrolladores de Xcode. + #DevToolsSecurity --enable + #dscl . -append /Groups/_developer GroupMembership usuario + # Bajar volumen (valor entre 0 y 7). + #osascript -e 'set volume 1' + +EOT + # NOTA: no modificar la línea anterior. + ;; +esac + +# Paso 2: Incluir código genérico de postconfiguración. + diff --git a/ogclient/scripts/createImage b/ogclient/scripts/createImage new file mode 100755 index 0000000..be1cb43 --- /dev/null +++ b/ogclient/scripts/createImage @@ -0,0 +1,182 @@ +#!/bin/bash + +#/** +#@file createImage +#@brief Scirpt de ejemplo para crear una imagen de un sistema de archivos. +#@brief Se usa como base para el programa de creación de imágenes de OpenGnsys Admin). +#@param 1 disco +#@param 2 particion +#@param 3 REPO|CACHE +#@param 4 imagen +#@return +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@exception OG_ERR_PARTITION # 3 Error en partición de disco o en su sistema de archivos +#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage. +#@exception OG_ERR_NOTWRITE # 14 error de escritura +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16 +#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos. +#@note +#@todo: que hacer, si el tamaño de la cache es sufciente, pero no tiene espacio libre +#@todo: que hacer, si hay una imagen con igual nombre en la cache +#@version 1.0 - control de errores para el ogAdmServer +#@author +#@date 2011-04-10 +#@version 1.0.1 - Control de espacio requerido +#@author Antonio J.Doblas Viso +#@date 2011-05-10 +#@version 1.0.2 - Separacion de log +#@author Antonio J.Doblas Viso +#@date 2011-08-4 +#@version 1.1.0 - La copia de seguridad de la imagen antigua se hace después de las comprobaciones. +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2016-10-14 +#@version 1.1.0 - Se muestra el espacio necesario para alojar la imagen y el disponible (ticket #771) +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2017-03-28 +#@version 1.1.1 - #802 Equipos EFI: se guarda el cargador de arranque y UUID de las particiones +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2019-01-08 +#*/ ## + +# Test 1. crear una imagen en un REPO sin espacio libre. +# test 2. crear una imagen en un REPO en modo solo lectura. +# test 3. intentar crear una imagen en la cache de un equipo que no la disponga. +# test 4. crear una imagen en la Cache sin espacio sufiente. +# test 5. intentar crear una imagen, en la que no se puede reducir el FS. + + +PROG="$(basename $0)" +if [ $# -ne 4 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE imagen" + exit $? +fi + +TIME1=$SECONDS + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Valores por defecto en etc/engine.cfg +#IMGPROG="partclone" +#IMGCOMP="lzop" +IMGEXT=${IMGEXT:-"img"} +#IMGREDUCE="TRUE" +REPO="${3^^}" + +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="$ogunit" + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +# salvo si es llamado desde createImageCustom +if [ "$(ogGetCaller)" != "createImageCustom" ]; then + echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp +fi + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Si es una ip y es igual a la del equipo restaura desde cache +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO $OGUNIT || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO'; echo $?) + REPO="REPO" +fi + +# Si el repositorio es CACHE comprobamos que exista +if [ "$REPO" == "CACHE" ]; then + ! ogFindCache >/dev/null && exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?) +fi + +# Obtener información de los parámetros de entrada. +PART=$(ogDiskToDev "$1" "$2" 2>/dev/null) || exit $(ogRaiseError $OG_ERR_PARTITION "$1 $2"; echo $?) + +#Comprobamos acceso de escritura. +DIRTEMP=$(date +%Y%m%d-%H%M%S) +ogMakeDir $REPO /$4$DIRTEMP 2>/dev/null || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO"; echo $?) && ogDeleteTree $REPO /$4$DIRTEMP + +IMGDIR=$(ogGetParentPath "$REPO" "/$4") +# Si no existe, crear subdirectorio de la imagen. +if [ $? != 0 ]; then + ogEcho log session "[5] $MSG_HELP_ogMakeDir \"$REPO $(dirname "$4")." + ogMakeDir "$REPO" $(dirname "/$4") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO /$4"; echo $?) + IMGDIR=$(ogGetParentPath "$REPO" "/$4") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO /$4"; echo $?) +fi +IMGFILE=$IMGDIR/$(basename "/$4").$IMGEXT + +echo " " > $OGLOGCOMMAND +# Borramos ficheros de paginacion y configuracion +ogCleanOs $1 $2 + +#Comprobar espacio que requerira la imagen para ser almacenada +read SIZEDATA SIZEREQUIRED SIZEFREE ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$REPO" "$4") + +ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE" +[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$REPO"; echo $?) + +# Comprobar consistencia del sistema de archivos. +echo " " > $OGLOGCOMMAND +SIZEFS=$(ogGetFsSize $1 $2) +ogEcho log session "[20] $MSG_HELP_ogCheckFs $PART $SIZEFS (KB)" +ogUnmount $1 $2 2>/dev/null +ogCheckFs $1 $2 || exit $(ogRaiseError $OG_ERR_PARTITION "ogCheckFs $1 $2" && echo $?) + +# Si es UEFI copio el cargador de arranque a la partición +OSTYPE="$(ogGetOsType $1 $2)" +if ogIsEfiActive && [ "$OSTYPE" == "Windows" ]; then + ogEcho log session "[25] $MSG_HELP_ogCopyEfiBootLoader" + ogCopyEfiBootLoader $1 $2 +fi + +# Evaluar variable de engine.cfg para reducir el sistema de archivos en la creacion +if [ "$IMGREDUCE" == "TRUE" ] +then + ogEcho log session "[30] $MSG_HELP_ogReduceFs" + ogReduceFs $1 $2 &>> $OGLOGCOMMAND || exit $(ogRaiseError $OG_ERR_REDUCEFS "$1 $2"; echo $?) + NEWSIZEFS=$(ogGetFsSize $1 $2) + TIMEAUX=$[SECONDS-TIME1] + ogEcho log session " $MSG_SCRIPTS_TIME_PARTIAL ( $NEWSIZEFS KB ) : $[TIMEAUX/60]m $[TIMEAUX%60]s" +fi + +# Renombrar el fichero de imagen si ya existe. +if [ -f "$IMGFILE" ]; then + ogEcho log session "[35] $MSG_SCRIPTS_FILE_RENAME \"$IMGFILE\" -> \"$IMGFILE.ant\"." + mv "$IMGFILE" "$IMGFILE.ant" + mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null + mv "$IMGFILE.sum" "$IMGFILE.sum.ant" 2>/dev/null + mv "$IMGFILE.full.sum" "$IMGFILE.full.sum.ant" 2>/dev/null +fi + +# Crear la imagen. +echo " " > $OGLOGCOMMAND +TIME2=$SECONDS +ogEcho log session "[40] $MSG_HELP_ogCreateImage : ogCreateImage $1 $2 $REPO $4 $IMGPROG $IMGCOMP" +ogCreateImage "$1" "$2" "$REPO" "/$4" "$IMGPROG" "$IMGCOMP" &>> $OGLOGCOMMAND || exit $(ogRaiseError $OG_ERR_IMAGE "ogCreteImage"; echo $?) +RESUMECREATEIMAGE=$(grep "Total Time:" $OGLOGCOMMAND) +TIMEAUX2=$[SECONDS-TIME2] +ogEcho log session " $RESUMECREATEIMAGE " +ogEcho log session " $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX2/60]m $[TIMEAUX2%60]s" + +# Extender sistema de archivos +TIME3=$SECONDS +ogEcho log session "[90] Extender sistema de archivos." +ogExtendFs $1 $2 || exit $(ogRaiseError $OG_ERR_EXTENDFS "$1 $2"; echo $?) +SIZEFS2=$(ogGetFsSize $1 $2) +TIMEAUX3=$[SECONDS-TIME3] +ogEcho log session " $MSG_HELP_ogExtendFs $NEWSIZEFS -> $SIZEFS = $SIZEFS2: $[TIMEAUX3/60]m $[TIMEAUX3%60]s" + +#TODO que hacer si error al extender sistemade archivos + +#resumen de la operacion +IMGSIZE=$(ls -s `ogGetPath $REPO /$4.$IMGEXT`| cut -f1 -d" ") +IMGOS=$(ogGetImageInfo `ogGetPath $REPO /$4.$IMGEXT`) + +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" +ogEcho log session " FileSystem $PART with $NEWSIZEFS KB data created onto file-image as $4 and used $IMGSIZE KB across DFS $ogprotocol" +ogEcho log session " Image-file $4 metada: $IMGOS" diff --git a/client/shared/scripts/createImage.py b/ogclient/scripts/createImage.py similarity index 100% rename from client/shared/scripts/createImage.py rename to ogclient/scripts/createImage.py diff --git a/ogclient/scripts/createImageCustom.template b/ogclient/scripts/createImageCustom.template new file mode 100644 index 0000000..73269d1 --- /dev/null +++ b/ogclient/scripts/createImageCustom.template @@ -0,0 +1,35 @@ +#!/bin/bash +#/** +# createImageCustom +#@brief Plantilla para scirpt de creación personalizada de imagen. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP +#@param $4 Nombre canónico de la imagen sin extensión +#@warning Renombrar este fichero como "createImageCustom" para sustituir al script estándar "createImage". +#**/ + + +# Control de parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: createImageCustom int_ndisc int_npart str_repo str_imgname" || exit $? + +# Toma de parámetros. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. +REPO="${3^^}" # Repositorio (en mayúsculas). +IMGNAME="$4" # Nombre canónico de imagen (sin extensión). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + + +# Paso 1: Añadir aquí el código para el proceso previo antes de la creación de la imagen en el equipo modelo (opcional). + + +# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de creación de imagen por código personalizado. +createImage "$@" + + +# Paso 3: Añadir aquí el código para el proceso posterior tras la creación de la imagen (opcional). + + diff --git a/client/shared/scripts/createImageCustomTemplate.py b/ogclient/scripts/createImageCustomTemplate.py similarity index 100% rename from client/shared/scripts/createImageCustomTemplate.py rename to ogclient/scripts/createImageCustomTemplate.py diff --git a/ogclient/scripts/createLogicalPartitions b/ogclient/scripts/createLogicalPartitions new file mode 100755 index 0000000..7a693aa --- /dev/null +++ b/ogclient/scripts/createLogicalPartitions @@ -0,0 +1,3 @@ +#!/bin/bash + + diff --git a/client/shared/scripts/createLogicalPartitions.py b/ogclient/scripts/createLogicalPartitions.py similarity index 100% rename from client/shared/scripts/createLogicalPartitions.py rename to ogclient/scripts/createLogicalPartitions.py diff --git a/ogclient/scripts/createPrimaryPartitions b/ogclient/scripts/createPrimaryPartitions new file mode 100755 index 0000000..f69f354 --- /dev/null +++ b/ogclient/scripts/createPrimaryPartitions @@ -0,0 +1,3 @@ +#!/bin/bash +ogCreatePartitions "$@" +exit 0 diff --git a/client/shared/scripts/createPrimaryPartitions.py b/ogclient/scripts/createPrimaryPartitions.py similarity index 100% rename from client/shared/scripts/createPrimaryPartitions.py rename to ogclient/scripts/createPrimaryPartitions.py diff --git a/ogclient/scripts/deployImage b/ogclient/scripts/deployImage new file mode 100755 index 0000000..d74d3ac --- /dev/null +++ b/ogclient/scripts/deployImage @@ -0,0 +1,246 @@ +#!/bin/bash +#/** +#@file deployImage +#@brief Proceso completo de despliegue de imagen, incluyendo actualización de la caché, restauración y post-configuración (este script es llamado por la interfaz RestaurarImagen). +#@param $1 Repositorio (CACHE, REPO o dirección IP) +#@param $2 Nombre canónico de la imagen (sin extensión) +#@param $3 Número de disco +#@param $4 Número de particion +#@param $5 Protocolo (UNICAST, por defecto, MULTICAST o TORRENT) +#@param $6 Opciones del protocolo +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception OG_ERR_PARTITION 3 # Error en partición de disco. +#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. +#@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema. +#@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen. +#@exception OG_ERR_NOTCACHE No existe cache -15- +#@exception OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16- +#@version 1.0.1 - Separación en protocolos de transferencia y postconfiguracion +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2011-05-11 +#@version 1.0.1 - Separación de los ficheros-log para ser gestionado por el httpd-log +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2011-05-11 +#@version 1.0.2 - Logica basada en fichero de configuracion engine.cfg +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2012-01-11 +#@version 1.0.5 - Renominación del script como "deployImage". +#@author Antonio J. Doblas Viso y Ramón M. Gómez. +#@date 2013-12-04 +#@version 1.0.6 - Se añade la gestión de errores de la CACHE cuando en el engine.cfg se define RESTOREPROTOCOLNOCACHE=NONE. +#@author Antonio J. Doblas Viso. +#@date 2015-02-23 +#@version 1.1 - Cambio de repositorio para el recurso remoto images si es necesario +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2015-06-16 +#@version 1.1 - Control de errores en transferencia multicast (ticket #781) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/04/20 +#**/ + + +#Descripcion: +# Si Repositorio es el global (REPO) realiza un deploy. +# Si Repositorio es local (CACHE) realiza un restoreImage CACHE +# El deploy, si detecta que el cliente no tiene una CACHE o no tiene espacio suficiente consulta el engine.cfg RESTOREPROTOCOLNOCACHE + + + +PROG="$(basename $0)" +if [ $# -lt 4 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]" + exit $? +fi + +# Asignación de variables (repositorio y protocolo se convierten a mayúsculas). +TIME1=$SECONDS +REPO="${1^^}" +REPO=${REPO:-"REPO"} +IMGNAME="$2" +DISK="$3" +PART="$4" +PROTO="${5^^}" +PROTO="${PROTO:-"UNICAST"}" +PROTOOPT="$6" +# Unidad organizativa. +[ "$ogunit" != "" ] && OGUNIT="$ogunit" + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND +[ "$(ogGetCaller)" == "EjecutarScript" ] || echo -n "" > $OGLOGSESSION + +# Registro de inicio de ejecución +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Si el origen(pariticion) esta bloqueada salir. +ogIsLocked $DISK $PART && exit $(ogRaiseError session $OG_ERR_LOCKED "$MSG_PARTITION, $DISK $PART"; echo $?) + +ogEcho log session "$MSG_HELP_ogUnmount $DISK $PART" +ogUnmount $DISK $PART 2>/dev/null + +# Valor por defecto para el repositorio. +if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then + MODE="CACHE" +else + ogCheckIpAddress "$REPO" + if [ $? == 0 -o "$REPO" == "REPO" ]; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO ${OGUNIT} || exit $(ogRaiseError $OG_ERR_NOTFOUND "$REPO $OGUNIT"; echo $?) + MODE="REPO" + fi +fi + +#Informacioin previa de la imagen +IMGOS=$(ogGetImageInfo `ogGetPath $MODE $IMGNAME.img`) +case $? in + 0) ;; + 1) ogRaiseError session $OG_ERR_NOTFOUND "$REPO $2" || exit $? ;; + 5) ogRaiseError session $OG_ERR_IMAGEFILE "$REPO $2" || exit $? ;; + *) ogRaiseError session $OG_ERR_GENERIC || exit $? ;; +esac +IMGSIZE=$(ls -s `ogGetPath $MODE $IMGNAME.img`| cut -f1 -d" ") + +ogEcho log session "[1] REPO=$REPO IMG-FILE=$IMGNAME.img SIZE=$IMGSIZE (KB) METADATA=$IMGOS" + +# Procesar repositorio. +case "$MODE" in + CACHE) # Repositorio en caché local. + NEXTOPERATION=CACHE + ;; + REPO) # Repositorio remoto por defecto. + case "$PROTO" in + MULTICAST-DIRECT) + NEXTOPERATION=MULTICAST + ;; + UNICAST-DIRECT) + NEXTOPERATION=UNICAST + ;; + + # Si protocolo es torrent|torrent-cache o multicast|multicast-cache + TORRENT|TORRENT-CACHE|MULTICAST|MULTICAST-CACHE|UNICAST|UNICAST-CACHE) + # Eliminamos CACHE o DIRECT + PROTO=${PROTO%%-*} + ogEcho log session "[2] updateCache "$REPO" \"/$IMGNAME.img\" $PROTO $PROTOOPT" + TIME2=$SECONDS + updateCache "$REPO" "/$IMGNAME.img" "$PROTO" "$PROTOOPT" + RETVAL=$? + TIME2=$[SECONDS-TIME2] + ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL updateCache $[TIME2/60]m $[TIME2%60]s" + case $RETVAL in + 0) + ogEcho log session "[50] updateCache (OK)" + NEXTOPERATION=CACHE + ;; + 15|16) + # no se permite usar la cache (no existe(15) o no espacio sufiente (16). Se consulta engine.cfg para RESTOREPROTOCOLNOCACHE [ multicast unicast none ] + ogEcho log session "[50] $MSG_ERR_NOTCACHE ; $MSG_ERR_CACHESIZE " + ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE: RESTOREPROTOCOLNOTCACHE=$RESTOREPROTOCOLNOTCACHE " + case "$RESTOREPROTOCOLNOTCACHE" in + MULTICAST) + case "$PROTO" in + MULTICAST) NEXTOPERATION=MULTICAST ;; + TORRENT) NEXTOPERATION=UNICAST ;; + UNICAST) NEXTOPERATION=UNICAST ;; + esac + ;; + UNICAST) + NEXTOPERATION=UNICAST + ;; + NONE) + case $RETVAL in + 15) + ogEcho log session "[100] $MSG_ERR_NOTCACHE" + ogRaiseError session $OG_ERR_NOTCACHE "NOT CACHE" + exit $? + ;; + 16) + ogEcho log session "[100] $MSG_ERR_CACHESIZE " + ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL" + exit $? + ;; + esac # del segundo RETAVAL + ;; + esac # del RESTOREPROTOCOLNOTCACHE + ;; + 57|60) + # Time-out en la transferencia multicast (El mensaje de error está enviado) + exit $RETVAL + ;; + *) + # Error desconocido + exit $RETVAL + ;; + esac + ;; + *) # Error: protocolo desconocido. + ogRaiseError session $OG_ERR_FORMAT "$MSG_ERR_FORMAT, $PROTO" + exit $? + ;; + esac + ;; + *) # Error: repositorio desconocido. + ogRaiseError session $OG_ERR_FORMAT "$MSG_ERR_FORMAT, $REPO" + exit $? + ;; +esac + +TIME3=$SECONDS + +# Obtener parámetros de restauración. +case "$NEXTOPERATION" in + CACHE) + PARAMS="CACHE $IMGNAME $DISK $PART" ;; + UNICAST) + PARAMS="$REPO $IMGNAME $DISK $PART" ;; + MULTICAST) + PARAMS="$REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" ;; +esac + +# Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage". +if which restoreImageCustom &>/dev/null; then + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImageCustom $PARAMS" + restoreImageCustom $PARAMS +else + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImage $PARAMS" + restoreImage $PARAMS +fi +RETVAL=$? + +# Mostrar resultados. +RESUMERESTOREIMAGE=$(grep -m 1 "Total Time:" $OGLOGCOMMAND) +ogEcho log session " [ ] $RESUMERESTOREIMAGE " +# Si la transferencia ha dado error me salgo. +if [ $RETVAL -ne 0 ] ; then + ogRaiseError session $OG_ERR_IMAGE "$REPO $IMGNAME" 2>&1 + # Muestro registro de fin de ejecución si no viene de Ejecutar Script + [ "$(ogGetCaller)" == "EjecutarScript" ] || ogEcho log session "$MSG_INTERFACE_END $OG_ERR_IMAGE" + exit $OG_ERR_IMAGE +fi +TIME3=$[SECONDS-TIME3] +ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME3/60]m $[TIME3%60]s" + +# Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs". +if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom" + configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" +else + ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " + configureOs "$DISK" "$PART" +fi + +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" + +# Registro de fin de ejecución +# Si se ha llamado desde ejecutar script no lo muestro para no repetir. +if [ "$(ogGetCaller)" != "EjecutarScript" ] ; then + ogEcho log session "$MSG_INTERFACE_END $RETVAL" + exit $RETVAL +fi + diff --git a/client/shared/scripts/deployImage.py b/ogclient/scripts/deployImage.py similarity index 100% rename from client/shared/scripts/deployImage.py rename to ogclient/scripts/deployImage.py diff --git a/ogclient/scripts/formatFs b/ogclient/scripts/formatFs new file mode 100755 index 0000000..1147f25 --- /dev/null +++ b/ogclient/scripts/formatFs @@ -0,0 +1,19 @@ +#!/bin/bash +# Scirpt de ejemplo para formatear un sistema de archivos. +# Nota: se usa como base para el programa de formateo de OpenGnsys Admin). + +TIME1=$SECONDS +PROG="$(basename $0)" +if [ $# -ne 2 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion" + exit $? +fi + +# Desmontar y formatear el sistema de archivos. +echo "[5] Desmontando sistema de archivos" +ogUnmountFs "$@" || exit $? +echo "[20] Formateando sistema de archivos" +ogFormatFs "$@" + +TIME=$[SECONDS-TIME1] +echo "[100] Duración de la operación $[TIME/60]m $[TIME%60]s" diff --git a/client/shared/scripts/formatFs.py b/ogclient/scripts/formatFs.py similarity index 100% rename from client/shared/scripts/formatFs.py rename to ogclient/scripts/formatFs.py diff --git a/ogclient/scripts/generateMenuDefault b/ogclient/scripts/generateMenuDefault new file mode 100755 index 0000000..09e4300 --- /dev/null +++ b/ogclient/scripts/generateMenuDefault @@ -0,0 +1,81 @@ +#!/bin/bash +# generateMenuDefault - Crea fichero con la página web de inicio del cliente +# con información de red y de los sistemas operativos instalados, +# crea fichero con información del contenido de la caché local. + + +DEVICE=${DEVICE:-"eth0"} +source /tmp/net-$DEVICE.conf +FILEINFOHTML=$OGLOG/`ogGetIpAddress`.info.html +FILEINFOCACHE=$OGLOG/`ogGetIpAddress`.cache.txt +ogMountCache 2>/dev/null +CACHECONTENIDO="ls -m $OGCAC/$OGIMG 2>/dev/null" + +SPEED=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Speed/ {print $2}') +case "${SPEED,,}" in + 1000mb/s) ;; + 100mb/s) SPEED="$SPEED" ;; + 10mb/s) SPEED="$SPEED" ;; + *) SPEED="$SPEED" ;; +esac +DUPLEX=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Duplex/ {print $2}') +case "${DUPLEX,,}" in + full) ;; + *) DUPLEX="$DUPLEX" +esac + +CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`) +if [ $CACHESIZEFREE == 0 ]; then + echo '0.MB,' > $FILEINFOCACHE +else + expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE +fi + +# Crear menú por defecto. +cat > $FILEINFOHTML << EOT +
+

+ + + + + + +

$MSG_HOSTNAME $MSG_IPADDR $MSG_MACADDR $MSG_SPEED $MSG_DUPLEX
$HOSTNAME $(ogGetIpAddress) $(ogGetMacAddress) $SPEED $DUPLEX
+

+ +

$MSG_MENUTITLE

+EOT + +# Si existe el fichero de configuración creado por el script getConfiguration, ... +cfgfile=/tmp/getconfig +if [ -f $cfgfile ]; then + # Tomar los datos del fichero. + awk -v boot="$MSG_BOOT" ' + { n=split($0,sep,";"); + for (i=1; i%s %s (%s, %s)

\n", + dua[1],dua[2],boot,dua[5],dua[1],dua[2]); + } + } + }' $cfgfile >>$FILEINFOHTML +else + # Si no, obtener los datos de los discos. + for ((d=1; d<=$(ogDiskToDev | wc -w); d++)); do + for ((p=1; p<=$(ogGetPartitionsNumber $d); p++)); do + VERSION=$(ogGetOsVersion $d $p 2>/dev/null | cut -f2 -d:) + [ -n "$VERSION" ] && echo "

$MSG_BOOT $VERSION ($d, $p)

" >>$FILEINFOHTML + done + done +fi +# Añadir opción de apagado. +cat >> $FILEINFOHTML << EOT +

$MSG_POWEROFF

+
+EOT + +# Crear contenido de la caché. +eval $CACHECONTENIDO >> $FILEINFOCACHE + diff --git a/client/shared/scripts/generateMenuDefault.py b/ogclient/scripts/generateMenuDefault.py similarity index 100% rename from client/shared/scripts/generateMenuDefault.py rename to ogclient/scripts/generateMenuDefault.py diff --git a/ogclient/scripts/getFsType b/ogclient/scripts/getFsType new file mode 100755 index 0000000..b3516a4 --- /dev/null +++ b/ogclient/scripts/getFsType @@ -0,0 +1,3 @@ +#!/bin/bash +ogGetFsType "$@" + diff --git a/client/shared/scripts/getFsType.py b/ogclient/scripts/getFsType.py similarity index 100% rename from client/shared/scripts/getFsType.py rename to ogclient/scripts/getFsType.py diff --git a/ogclient/scripts/getIpAddress b/ogclient/scripts/getIpAddress new file mode 100755 index 0000000..e428ebf --- /dev/null +++ b/ogclient/scripts/getIpAddress @@ -0,0 +1,3 @@ +#!/bin/bash +ogGetIpAddress "$@" + diff --git a/client/shared/scripts/getIpAddress.py b/ogclient/scripts/getIpAddress.py similarity index 100% rename from client/shared/scripts/getIpAddress.py rename to ogclient/scripts/getIpAddress.py diff --git a/ogclient/scripts/getOsVersion b/ogclient/scripts/getOsVersion new file mode 100755 index 0000000..6e6d91d --- /dev/null +++ b/ogclient/scripts/getOsVersion @@ -0,0 +1,3 @@ +#!/bin/bash +ogGetOsVersion "$@" + diff --git a/client/shared/scripts/getOsVersion.py b/ogclient/scripts/getOsVersion.py similarity index 100% rename from client/shared/scripts/getOsVersion.py rename to ogclient/scripts/getOsVersion.py diff --git a/client/shared/scripts/grubSyntax b/ogclient/scripts/grubSyntax similarity index 97% rename from client/shared/scripts/grubSyntax rename to ogclient/scripts/grubSyntax index 2ff21fb..8997c97 100755 --- a/client/shared/scripts/grubSyntax +++ b/ogclient/scripts/grubSyntax @@ -10,8 +10,6 @@ set -e #@version 1.1.1 - En los parámetros del kernel se sustituye el UUID por el dispositivo. #@version 1.1.1 - Detecta cargador de Windows en directorio Part-xx-yy dentro de ESP (#802 #888) -export PYTHONPATH=/opt/opengnsys/lib/engine/bin/ - DISK= PART= @@ -110,9 +108,8 @@ OG_prepare_grub_to_access_device () if [[ $DEVICE == *"nvme"* ]]; then #DEVICE=`echo $DEVICE | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` #TODO Detectar si es GPT o no... - read -r D P <<< $(python3 -c 'import DiskLib; d = DiskLib.ogDevToDisk ("'$DEVICE'"); print (d)') - PTT = $(python3 -c 'import DiskLib; t = DiskLib.ogGetPartitionTableType ("'$D'"); print (t)') - if [ "$PTT" == "GPT" ]; then + read -r D P <<< `ogDevToDisk $DEVICE` + if [ "`ogGetPartitionTableType $D`" == "GPT" ]; then # Si es gpt se sustituye por "hd(X-1),gptY" #device=`echo $device | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` nvmeDevice=`echo "hd"$(expr $D - 1)",gpt$P"` @@ -241,7 +238,7 @@ esac # ADV OSPROBED if [ -n "${DISK}" ]; then #Si $DISK esta definido buscar en el disco y la particion parametro 1 y 2 - OSSEARCH=$(python3 -c 'import DiskLib; d = DiskLib.ogDiskToDev ("'$DISK'", "'$PART'"); print (d)') + OSSEARCH=$(ogDiskToDev $DISK $PART) OSPROBED="`os-prober | grep $OSSEARCH | tr ' ' '^' | paste -s -d ' '`" else #si no esta definido diff --git a/ogclient/scripts/initCache b/ogclient/scripts/initCache new file mode 100755 index 0000000..9caf0be --- /dev/null +++ b/ogclient/scripts/initCache @@ -0,0 +1,111 @@ +#!/bin/bash +# Scirpt de iniciación de la caché local de disco. +# Nota: se usa como base para el programa de configuración de equipos de OpenGnsys Admin). +# Formato: initCache [int_ndisk [int_npart]] {-1 | 0 | int_size} [NOMOUNT] +# Versión: 0.9.1, 2009/03/17, - Ramón Gómez, Univ. Sevilla - Versión inicial. +# Versión: 0.9.2, 2010/07/27, - Ramón Gómez, Univ. Sevilla - redefinir parámetro. +# Version: 1.0.5, 2012/09/18, - Univ. Huelva - Nuevo parametro para indicar el disco donde se creara la CACHE, si no se indica, se usa 1 +# Version: 1.1.0, 2016/06/16, - Ramón Gómez, Univ. Sevilla - Nuevos parámetros: partición de caché (por defecto, 4) y cadena opcional "NOMOUNT" para dejar la caché sin montar. + +TIME1=$SECONDS +PROG="$(basename $0)" +EXECFORMAT="$PROG [int_ndisk [int_npart]] {-1 | 0 | int_size} [NOMOUNT]" + +# Si el último parámetro es la cadena "NOMOUNT", marcar para no montar y descartarlo. +if [[ "${*^^}" =~ \ NOMOUNT$ ]]; then + MOUNT=0 + PARAMS=$[$#-1] +else + MOUNT=1 + PARAMS=$# +fi +# Tomar valores según el número de parámetros restantes. +case $PARAMS in + 1) # Por defecto, disco 1 partición 4. + NDISK=1 + NPART=4 + SIZE=$1 + ;; + 2) # Elegir disco y partición 4 por defecto. + NDISK=$1 + NPART=4 + SIZE=$2 + ;; + 3) # Elegir disco y partición. + NDISK=$1 + NPART=$2 + SIZE=$3 + ;; + *) # Error de formato. + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $EXECFORMAT" + exit $? + ;; +esac + +# Si disco o partición no son mayores o iguales que 1, error. +if [ -n "${NDISK//[-0-9]/}${NPART//[-0-9]/}" ] || [ $NDISK -lt 1 ] || [ $NPART -lt 1 ] ; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $EXECFORMAT" + exit $? +fi +# Si tamaño no es numérico o tamaño<-1, error. +if [ -n "${SIZE//[-0-9]/}" ] || [ $SIZE -lt -1 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $EXECFORMAT" + exit $? +fi +# Si tamaño=0, no hacer nada. +if [ $SIZE -eq 0 ]; then + echo "No modificar la caché local." + exit +fi +# Si tamaño=-1, borrar caché. +if [ $SIZE -eq -1 ]; then + echo "[10] Trabajar sin caché local." + ogUnmountCache 2>/dev/null + ogDeleteCache +else + # Si la caché actual está definida en otro disco y partición, se elimina. + if [ -n "$(ogFindCache)" -a "$NDISK $NPART" != "$(ogFindCache)" ]; then + echo "[10] Detectada otra caché, eliminarla" + ogUnmountCache 2>/dev/null + ogDeleteCache + fi + # Tomamos el tamaño actual. Si no existe cache será 0. + OLDSIZE=$(ogGetCacheSize 2>/dev/null) || OLDSIZE=0 + + # Error si tamaño definido no es >0. + if [ ! $SIZE -gt 0 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_ERR_FORMAT: !($SIZE>0)" + exit $? + fi + # Si no existe caché o si cambia su tamaño, crearla. + CACHESIZE=$(ogGetCacheSize 2>/dev/null) + if [ "$SIZE" != "$CACHESIZE" ]; then + echo "[10] Crar partición de caché local." + ogUnmountCache 2>/dev/null + ogCreateCache $NDISK $NPART $SIZE + ogUpdatePartitionTable $NDISK + fi + # Si caché no montada y no formateada o cambia el tamaño: formatear. + CACHE=$(ogFindCache) || exit $? + if ! ogIsFormated $CACHE || [ $SIZE -ne $OLDSIZE ]; then + echo "[50] Formatear caché local." + ogFormatCache + fi + echo "[70] Comprobar montaje de caché local." + ogMountCache 2>/dev/null + # Si error al montar, chequear sistema de archivos y volver a montar. + if [ $? != 0 ]; then + echo "[80] Comprobar consistencia y volver a montar caché local." + ogCheckFs $CACHE + ogMountCache || exit $? + fi + # Dejar desmontada la caché si se ha solicitado. + if [ $MOUNT == 0 ]; then + echo "[90] Dejar desmontada la caché local." + ogUnmountCache 2>/dev/null + fi +fi +# Duración del proceso. +TIME=$[SECONDS-TIME1] +echo "[100] Duración de la operación $[TIME/60]m $[TIME%60]s" + diff --git a/client/shared/scripts/initCache.py b/ogclient/scripts/initCache.py similarity index 93% rename from client/shared/scripts/initCache.py rename to ogclient/scripts/initCache.py index 9fb4ed8..8a45ca8 100755 --- a/client/shared/scripts/initCache.py +++ b/ogclient/scripts/initCache.py @@ -47,6 +47,7 @@ def main (NDISK, NPART, SIZE, MOUNT): if SIZE != CACHESIZE: print("[10] Crear partición de caché local.") CacheLib.ogUnmountCache() + print (f'nati: calling ogCreateCache ({NDISK}, {NPART}, {SIZE})') CacheLib.ogCreateCache (NDISK, NPART, SIZE) DiskLib.ogUpdatePartitionTable() @@ -103,19 +104,23 @@ if __name__ == "__main__": NPART = int (args[1]) SIZE = int (args[2]) else: + print (f'nati: params no es ni 1 ni 2 ni 3 sino ({PARAMS})') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, EXECFORMAT) sys.exit (1) except ValueError: + print (f'nati: ValueError') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, EXECFORMAT) sys.exit (1) # Si disco o partición no son mayores o iguales que 1, error. if NDISK < 1 or NPART < 1: + print (f'nati: ndisk<1 or npart<1, ({NDISK}) ({NPART})') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, EXECFORMAT) sys.exit (1) # Si tamaño no es numérico o tamaño<-1, error. if SIZE < -1: + print (f'nati: SIZE<-1 ({SIZE})') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, EXECFORMAT) sys.exit (1) diff --git a/ogclient/scripts/installOfflineMode b/ogclient/scripts/installOfflineMode new file mode 100755 index 0000000..d9ff245 --- /dev/null +++ b/ogclient/scripts/installOfflineMode @@ -0,0 +1,60 @@ +#!/bin/bash + +#/** +# installOfflineMode +#@brief Prepara el equipo cliente para el modo offline. +#@param no +#@return +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_NOTCACHE No existe cache. +#@author Irina Gomez. ETSII. Universidad de Sevilla +#@date 2013/12/5 +#*/ ## + +PROG="$(basename $0)" +if [ "$*" == "help" ]; then + ogHelp "$PROG $MSG_HELP_installOfflineMode" \ + "$PROG [ no param ]" + exit 0 +fi + +ogEcho log session "$MSG_HELP_installOfflineMode" +# Cargamos las variables de entorno. +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg +DIRTFTP="/opt/oglive/tftpboot" +DIROGCLIENT="$DIRTFTP/ogclient" +# Comprobamos que el DIROGCLIENT esta montado desde repo +df |grep "$(ogGetRepoIp).*$DIRTFTP" &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "REPO OGclient" || exit $? + +# Copiamos el kernel y el initrd. +ogEcho log session " [10] updateBootCache" +updateBootCache || ogRaiseError $OG_ERR_NOTCACHE || exit $? + +# Creamos los dir necesarios. +ogEcho log session " [40] mkdir -p $OGCAC/{ogclient, menus, log}." +[ -d $OGCAC/menus/images/iconos ] || mkdir -p $OGCAC/menus/images/iconos +[ -d $OGCAC/ogclient ] || mkdir -p $OGCAC/ogclient +[ -d $OGCAC/log ] || mkdir -p $OGCAC/log +[ -d $OGCAC/opt/opengnsys/images ] || mkdir -p $OGCAC/opt/opengnsys/images + +# Comparamos el cliente en el server y en cache +ogEcho log session " [60] cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/" +SERVEROGCLIENT=$(cat $DIROGCLIENT/ogclient.sqfs.sum 2>/dev/null) +CACHEOGCLIENT=$(cat $OGCAC/ogclient/ogclient.sqfs.sum 2>/dev/null) + +if [ "$CACHEOGCLIENT" != "$SERVEROGCLIENT" ]; then + cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/ + cp $DIROGCLIENT/ogclient.sqfs.sum $OGCAC/ogclient/ +fi + +# Si se ha generado el menu de inicio lo copiamos a cache. +IPCLIENT=$(ogGetIpAddress) +MENU=$OGLOG/$IPCLIENT.info.html +ICONO="images/iconos/logoopengnsys.png" +[ -f $MENU ] || generateMenuDefault +ogEcho log session " [90] cp $MENU $OGCAC/menus/$IPCLIENT.html" +cp $MENU $OGCAC/menus/$IPCLIENT.html +sed -i s/"..\/images"/"images"/g $OGCAC/menus/$IPCLIENT.html +wget --no-check-certificate https://$(ogGetRepoIp)/opengnsys/$ICONO -O $OGCAC/menus/$ICONO + + diff --git a/client/shared/scripts/installOfflineMode.py b/ogclient/scripts/installOfflineMode.py similarity index 100% rename from client/shared/scripts/installOfflineMode.py rename to ogclient/scripts/installOfflineMode.py diff --git a/ogclient/scripts/launchOgagentInstaller b/ogclient/scripts/launchOgagentInstaller new file mode 100755 index 0000000..b999d3e --- /dev/null +++ b/ogclient/scripts/launchOgagentInstaller @@ -0,0 +1,145 @@ +#!/bin/bash +# #/** +# launchOgagentInstaller ndisk npart [windowsadmin] +#@brief Scheduling OpenGnsys Agent installation at next boot or administrator session. +#@param integer ndsik disk number +#@param integer npart partition number +#@param string windowsadmin administrator user (only for Windows) +#@author Ramón M. Gómez, ETSII Univ. Sevilla +#@version 1.1.0 - Initial version. +#@date 2018-02-16 +#*/ ## + +# Global variables. +PROG="$(basename "$0")" +if which curl &>/dev/null; then + DOWNLOAD="curl -k -f --connect-timeout 1 -o" +else + DOWNLOAD="wget --no-check-certificate -T 1 -O" +fi + +# Show help. +if [ "$*" == "help" ]; then + echo "$PROG: scheduling OpenGnsys Agent installation." + echo "Format: $PROG ndisk npart [windowsadmin]" + exit 0 +fi +# Error control. +if ! typeset -Fp ogRaiseError &>/dev/null; then + echo "$PROG: it can only be executed by an ogLive client." >&2 + exit 1 +fi +[ $# == 2 -o $# == 3 ] || ogRaiseError $OG_ERR_FORMAT "$PROG ndisk npart [adminuser]" || exit $OG_ERR_FORMAT +MNTDIR=$(ogMount "$1" "$2") || exit $? +OGVERSION=$($DOWNLOAD - https://$(ogGetServerIp)/opengnsys/rest/info 2>/dev/null | jq -r .version) +[ -n "$OGVERSION" ] || ogRaiseError $OG_ERR_NOTFOUND "GET /rest/info" || exit $OG_ERR_NOTFOUND + +case "$(ogGetOsType $1 $2)" in + Windows) # OGAgent for Windows. + HIVE="$(ogGetHivePath "$MNTDIR" "$3")" + [ -n "$HIVE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 $3/NTUSER.DAT" || exit $OG_ERR_NOTFOUND + # Downloading OGAgent installer for Windows. + OGAGENTFILE="OGAgentSetup-${OGVERSION/pre/}.exe" + TMPDIR="$(ogGetPath "$MNTDIR/Windows/Temp")" + if ogListSoftware $1 $2 | grep -qi "opengnsys agent"; then + echo "OGAgent for Windows is already installed, you need to uninstall it before re-install." + else + if eval $DOWNLOAD "$TMPDIR/$OGAGENTFILE" "https://$(ogGetServerIp)/opengnsys/descargas/$OGAGENTFILE" 2>/dev/null; then + # Run once OGAgent Installer. + if hivexsh -w << EOT 2>/dev/null; then +load $HIVE +cd \\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce +setval 1 +Install OGAgent +string:C:\\Windows\\Temp\\$OGAGENTFILE /S /server $(ogGetServerIp) +commit +close +exit +EOT + echo "Scheduled OGAgent installation after \"$3\" logon" + echo " (for connection problems, check configuration file)." + else + ogRaiseError $OG_ERR_NOTWRITE "$1 $2 .../$3/NTUSER.DAT" + exit $OG_ERR_NOTWRITE + fi + else + ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /Windows/Temp/$OGAGENTFILE" + exit $OG_ERR_NOTFOUND + fi + fi + ;; + Linux) # OGAgent for Linux (only deb and redhat-based backages; TODO suse-based package). + if ogListSoftware $1 $2 | grep -qi "ogagent"; then + echo "OGAgent for Linux is already installed, you need to uninstall it before re-install." + else + SYSTEMDDIR="$MNTDIR/lib/systemd" + [ -d "$SYSTEMDDIR" -a -d "${SYSTEMDDIR/lib/etc}" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 systemd" || exit $OG_ERR_NOTFOUND + # Downloading OGAgent installer for Linux. + if [ -e $MNTDIR/etc/debian_version ]; then # Debian-based + OGAGENTFILE="ogagent_${OGVERSION/pre/}_all.deb" + CODE="if ! dpkg -l ogagent &>/dev/null && [ -f /var/tmp/$OGAGENTFILE ]; then apt-get update; apt-get install -y /var/tmp/$OGAGENTFILE; fi" + fi + if [ -e $MNTDIR/etc/redhat-release ]; then # RedHat-based + OGAGENTFILE="ogagent-${OGVERSION/pre/}-1.noarch.rpm" + CODE="if ! rpm -q ogagent &>/dev/null && [ -f /var/tmp/$OGAGENTFILE ]; then yum install -y /var/tmp/$OGAGENTFILE; fi" + fi + [ -n "$OGAGENTFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 ogagent" || exit $OG_ERR_NOTFOUND + TMPDIR="$MNTDIR/var/tmp" + if eval $DOWNLOAD "$TMPDIR/$OGAGENTFILE" "https://$(ogGetServerIp)/opengnsys/descargas/$OGAGENTFILE" 2>/dev/null; then + # Creating systemd script. + cat << EOT > $SYSTEMDDIR/systemd-launchogagent +#!/bin/bash +[ $EUID = 0 ] || exit 4 +start() { + $CODE + sed -i "0,/remote=/ s,remote=.*,remote=https://$(ogGetServerIp)/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg + service ogagent start +} +restart() { + service ogagent stop + if [ -f /var/tmp/$OGAGENTFILE ]; then + apt-get update + apt-get install -y --reinstall /var/tmp/$OGAGENTFILE + fi + sed -i "0,/remote=/ s,remote=.*,remote=https://$(ogGetServerIp)/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg + service ogagent start +} + +case "\$1" in + start|restart) "\$1" ;; +esac +EOT + chmod +x $SYSTEMDDIR/systemd-launchogagent + # Creating systemd service. + cat << EOT > $SYSTEMDDIR/system/launchogagent.service +[Unit] +Description=Installing and configuring OGAgent + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/lib/systemd/systemd-launchogagent start +TimeoutStartSec=5min + +[Install] +WantedBy=multi-user.target +EOT + ln -fs /lib/systemd/system/launchogagent.service \ + ${SYSTEMDDIR/lib/etc}/system/multi-user.target.wants + echo "Scheduled OGAgent installation at next boot" + echo " (process will be executed in the background, do not shutdown until finish)." + else + ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /var/tmp/$OGAGENTFILE" + exit $OG_ERR_NOTFOUND + fi + fi + ;; + MacOS) # OGAgent for macOS (TODO). + echo "OGAgent installer for macOS is not implemented yet." + ;; + *) # OS not detected or OGAgent not implemented. + ogRaiseError $OG_ERR_NOTOS "$1 $2" + exit $OG_ERR_NOTOS + ;; +esac + diff --git a/client/shared/scripts/launchOgagentInstaller.py b/ogclient/scripts/launchOgagentInstaller.py similarity index 100% rename from client/shared/scripts/launchOgagentInstaller.py rename to ogclient/scripts/launchOgagentInstaller.py diff --git a/ogclient/scripts/listHardwareInfo b/ogclient/scripts/listHardwareInfo new file mode 100755 index 0000000..34679a0 --- /dev/null +++ b/ogclient/scripts/listHardwareInfo @@ -0,0 +1,24 @@ +#!/bin/bash +# Scirpt de ejemplo para almacenear en fichero temporal el listado de hardware. +# Nota: se usa como base para el programa de recogida de listado de hardware de OpenGnsys Admin. +# Formato: listHardwareInfo + +PROG=$(basename "$0") +if [ $# -ne 0 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG " + exit $? +fi + +# Directorio del servidor donde se exportan los ficheros de registro. +SERVERLOGDIR=$(mount | awk -v d=$OGLOG ' + BEGIN {FS="[: ]"} + {if ($4==d) dir=$2} + END {print dir}') + +# Fichero de listado: hard-IP +HARDFILE="hard-$(ogGetIpAddress)" +# Redirigir salida al fichero de listado. +ogListHardwareInfo>$OGLOG/$HARDFILE || exit $? +# Salida: camino del fichero de listado en el servidor de repositorio. +#echo $SERVERLOGDIR/$HARDFILE +echo $OGLOG/$HARDFILE diff --git a/client/shared/scripts/listHardwareInfo.py b/ogclient/scripts/listHardwareInfo.py similarity index 100% rename from client/shared/scripts/listHardwareInfo.py rename to ogclient/scripts/listHardwareInfo.py diff --git a/ogclient/scripts/listPartitions b/ogclient/scripts/listPartitions new file mode 100755 index 0000000..6f9c318 --- /dev/null +++ b/ogclient/scripts/listPartitions @@ -0,0 +1,3 @@ +#!/bin/bash +ogListPartitions "$@" | sed 's/\(EMPTY:0 \)*$//' + diff --git a/client/shared/scripts/listPartitions.py b/ogclient/scripts/listPartitions.py similarity index 100% rename from client/shared/scripts/listPartitions.py rename to ogclient/scripts/listPartitions.py diff --git a/ogclient/scripts/listPrimaryPartitions b/ogclient/scripts/listPrimaryPartitions new file mode 100755 index 0000000..d20dd76 --- /dev/null +++ b/ogclient/scripts/listPrimaryPartitions @@ -0,0 +1,3 @@ +#!/bin/bash +ogListPrimaryPartitions "$@" + diff --git a/client/shared/scripts/listPrimaryPartitions.py b/ogclient/scripts/listPrimaryPartitions.py similarity index 100% rename from client/shared/scripts/listPrimaryPartitions.py rename to ogclient/scripts/listPrimaryPartitions.py diff --git a/ogclient/scripts/listSoftwareInfo b/ogclient/scripts/listSoftwareInfo new file mode 100755 index 0000000..1b97294 --- /dev/null +++ b/ogclient/scripts/listSoftwareInfo @@ -0,0 +1,35 @@ +#!/bin/bash +# Scirpt de ejemplo para almacenear en fichero temporal el listado de software. +# Nota: se usa como base para el programa de recogida de listado de software de OpenGnsys Admin. +# Formato: listSoftwareInfo [-r] ndisk npart +# -r listado reducido (sin parches de Windows) + +PROG=$(basename "$0") +REDUCED="no" +if [ "$1" = "-r" ]; then + REDUCED="yes" + shift +fi +if [ $# -ne 2 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion" + exit $? +fi + +# Directorio del servidor donde se exportan los ficheros de registro. +SERVERLOGDIR=$(mount | awk -v d=$OGLOG ' + BEGIN {FS="[: ]"} + {if ($4==d) dir=$2} + END {print dir}') + +# Fichero de listado: soft-IP-ndisco-npart +SOFTFILE="soft-$(ogGetIpAddress)-$1-$2" +# Redirigir salida al fichero de listado. +if [ "$REDUCED" = "no" ]; then + ogListSoftware "$1" "$2" >$OGLOG/$SOFTFILE || exit $? +else + ogListSoftware "$1" "$2" | egrep -v "\(KB[0-9]{6}\)" >$OGLOG/$SOFTFILE || exit $? +fi +# Salid: camino del fichero de listado en el servidor de repositorio. +#echo $SERVERLOGDIR/$SOFTFILE +echo $OGLOG/$SOFTFILE + diff --git a/client/shared/scripts/listSoftwareInfo.py b/ogclient/scripts/listSoftwareInfo.py similarity index 100% rename from client/shared/scripts/listSoftwareInfo.py rename to ogclient/scripts/listSoftwareInfo.py diff --git a/ogclient/scripts/menuBrowser b/ogclient/scripts/menuBrowser new file mode 100755 index 0000000..f544215 --- /dev/null +++ b/ogclient/scripts/menuBrowser @@ -0,0 +1,11 @@ +#!/bin/bash +# Scirpt de ejemplo para iniciar el browser del cliente con un menú predefinido + +PROG=$(basename "$0") +if [ $# -ne 1 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG urlmenu" + exit $? +fi + +url="$1" +browser -qws $url diff --git a/client/shared/scripts/menuBrowser.py b/ogclient/scripts/menuBrowser.py similarity index 100% rename from client/shared/scripts/menuBrowser.py rename to ogclient/scripts/menuBrowser.py diff --git a/ogclient/scripts/poweroff b/ogclient/scripts/poweroff new file mode 100755 index 0000000..4233058 --- /dev/null +++ b/ogclient/scripts/poweroff @@ -0,0 +1,39 @@ +#!/bin/bash +# Scirpt de ejemplo para apagar un ordenador +# Nota: se usa como base para el programa de apagado de OpenGnsys Admin. + + +# Registrar ejecución manual de script. +case "$(ogGetCaller)" in + browser|bash) ogEcho log info "Script: $0" ;; +esac + +# No registrar errores. +export DEBUG="no" + +# Desmontar los sistemas de archivos y la caché local. +echo "[10] Desmontar todos los sistemas de archivos." +sync +for (( i=1; i <= $(ogDiskToDev | wc -w); i++ )); do + ogUnmountAll $i &>/dev/null +done +echo "[50] Desmontar cache local." +ogUnmountCache &>/dev/null + +# Volver a registrar errores. +unset DEBUG + +echo "[70] Apagando el equipo." +# Estado correcto de Wake-On-Lan antes de apagar. +ethtool -s $DEVICE wol g 2>/dev/null +# Detectar Busybox. +BUSYBOX=$(which busyboxOLD) +BUSYBOX=${BUSYBOX:-"busybox"} + +# Retardo para dar lugar al registro en cola de acciones. +sleep 5 +# Parar Browser para evitar "cuelgues". +[ "$ogstatus" == "offline" ] || pkill browser +# Apagar. +$BUSYBOX poweroff + diff --git a/ogclient/scripts/reboot b/ogclient/scripts/reboot new file mode 100755 index 0000000..689da67 --- /dev/null +++ b/ogclient/scripts/reboot @@ -0,0 +1,54 @@ +#!/bin/bash +# Script de ejemplo para reiniciar un ordenador +# Nota: se usa como base para el programa de reinicio de OpenGnsys Admin. + + +# Registrar ejecución manual de script. +case "$(ogGetCaller)" in + browser|bash) ogEcho log info "Script: $0" ;; +esac + +# Cargamos el valor por defecto del tiempo de sleep +[ -z $OGSLEEP ] && source /opt/opengnsys/etc/engine.cfg + +# Si se recibe un parametro sera el tiempo de sleep antes de realizar el reboot +if [ $# == 1 ] && [ "${1//[^0-9]/}" == "$1" ] +then + TIME=$1 + echo "[5] Se ha introducido un retardo de $TIME segundos para reiniciar" +else + # Sin parámetros, o el parámetro introducido no es un número + TIME=${OGSLEEP:-5} + echo "[5] No se ha introducido un retardo, $TIME segundos para reiniciar" +fi + +# No registrar errores. +export DEBUG="no" + +# Desmontar los sistemas de archivos y la caché local. +echo "[10] Desmontar todos los sistemas de archivos." +sync +for (( i=1; i <= $(ogDiskToDev | wc -w); i++ )); do + ogUnmountAll $i &>/dev/null +done +echo "[50] Desmontar cache local." +ogUnmountCache &>/dev/null + +# Volver a registrar errores. +unset DEBUG + +echo "[90] Reiniciar el equipo." +# Estado correcto de Wake-On-Lan antes de reiniciar. +ethtool -s $DEVICE wol g 2>/dev/null +# Detectar Busybox. +BUSYBOX=$(which busyboxOLD) +BUSYBOX=${BUSYBOX:-"busybox"} + +# Retardo para dar lugar al registro en cola de acciones. +sleep $TIME +# Parar Browser para evitar "cuelgues". +[ "$ogstatus" == "offline" ] || pkill browser +# Reiniciar. +$BUSYBOX reboot + + diff --git a/ogclient/scripts/remoteConsole b/ogclient/scripts/remoteConsole new file mode 100755 index 0000000..dc0fc4b --- /dev/null +++ b/ogclient/scripts/remoteConsole @@ -0,0 +1,22 @@ +#!/bin/bash +# Script de ejemplo para enviar eco a la consola remota al ejecutar un comando de la shell +# Formato: remoteConsole + +PROG="$(basename $0)" +if [ $# -ne 0 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG " + exit $? +fi + +# Directorio del servidor donde se exportan los ficheros de registro. +SERVERLOGDIR=$(mount | awk -v d=$OGLOG ' + BEGIN {FS="[: ]"} + {if ($4==d) dir=$2} + END {print dir}') + +# Fichero de listado: hard-IP +ECOFILE="eco-$(ogGetIpAddress)" +# Redirigir salida al fichero de listado. +/tmp/_hidrascript_ >$OGLOG/$ECOFILE || exit $? +# Salida: camino del fichero de listado en el servidor de repositorio. +echo $SERVERLOGDIR/$ECOFILE diff --git a/ogclient/scripts/restoreImage b/ogclient/scripts/restoreImage new file mode 100755 index 0000000..d9e7f58 --- /dev/null +++ b/ogclient/scripts/restoreImage @@ -0,0 +1,106 @@ +#!/bin/bash +#/** +#@file restoreImage +#@brief Script de ejemplo para restaurar una imagen. +#@param $1 Repositorio (CACHE, REPO o dirección IP) +#@param $2 Nombre canónico de la imagen (sin extensión) +#@param $3 Número de disco +#@param $4 Número de particion +#@param $5 Protocolo (UNICAST, UNICAST-DIRECT, MULTICAST o MULTICAST-DIRECT) +#@param $6 Opciones del protocolo +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 cambio de repositorio: repositorio no encontrado +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception $OG_ERR_MCASTRECEIVERFILE 57 Error en la recepción Multicast de un fichero +#@exception $OG_ERR_PROTOCOLJOINMASTER 60 Error en la conexión de una sesión Unicast|Multicast con el Master +#@version 1.1 - Cambio de repositorio para el recurso remoto images si es necesario +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2015-06-16 +#@version 1.1 - Control de errores en transferencia multicast (ticket #781) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/04/20 +#**/ + +TIME1=$SECONDS +PROG="$(basename $0)" +if [ $# -lt 4 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST opciones protocolo]" + exit $? +fi + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +# Valores por defecto: #IMGPROG="partclone" ; #IMGCOMP="lzop" ; #IMGEXT="img" #IMGREDUCE="TRUE" +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND +ogCheckStringInGroup "$(ogGetCaller)" "deployImage restoreImageCustom" || echo -n "" > $OGLOGSESSION; + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Procesar parámetros de entrada +REPO="${1^^}" +IMGNAME="$2" +DISK="$3" +PART="$4" +PROTO="${5^^}" +PROTO=${PROTO:-"UNICAST"} +PROTOOPT="$6" +# Si MCASTWAIT menos que tiempo de espera del servidor lo aumento +if [ "${PROTO%-*}" == "MULTICAST" ] && [[ ${PROTOOPT##*:} =~ ^-?[0-9]+$ ]]; then + [ ${MCASTWAIT:-0} -lt ${PROTOOPT##*:} ] && let MCASTWAIT=${PROTOOPT##*:}+5 +fi +IMGTYPE="${IMGTYPE:-"img"}" + +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="$ogunit/" + +# Si es una ip y es igual a la del equipo restaura desde cache +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO ${OGUNIT%/} || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO $OGUNIT'; echo $?) + REPO="REPO" +fi + +# Comprobar que existe la imagen del origen. +IMGFILE=$(ogGetPath "$REPO" "$IMGNAME.$IMGTYPE") +IMGDIR=$(ogGetParentPath "$REPO" "$IMGNAME") +if [ "$IMGFILE" == "" -o "$IMGDIR" == "" ]; then + ogRaiseError session $OG_ERR_NOTFOUND "$REPO, ${IMGNAME%/*}" + exit $? +fi + +# Procesar protocolos de transferencia. +case "$PROTO" in + UNICAST|UNICAST-DIRECT) + # Restaurar la imagen. + ogEcho log session "[40] ogRestoreImage $REPO $IMGNAME $DISK $PART UNICAST" + ogExecAndLog command ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART" + RETVAL=$? + ;; + MULTICAST|MULTICAST-DIRECT) + PORT=$(echo $PROTOOPT | cut -f1 -d":") + TOOL=$(ogGetImageProgram REPO $IMGNAME) + COMPRESS=$(ogGetImageCompressor REPO $IMGNAME) + #TODO comprobar parametros anteriores + ogEcho log session "[40] ogMcastReceiverPartition $DISK $PART $PORT $TOOL $COMPRESS" + ogMcastRequest "$IMGNAME.img" "$PROTOOPT" || exit $? + ogExecAndLog command ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS" + RETVAL=$? + ;; + *) # Protocolo desconocido. + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST opciones ]" + exit $? +esac + +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" + +# Código de salida del comando prinicpal de restauración. +exit $RETVAL + diff --git a/client/shared/scripts/restoreImage.py b/ogclient/scripts/restoreImage.py similarity index 100% rename from client/shared/scripts/restoreImage.py rename to ogclient/scripts/restoreImage.py diff --git a/ogclient/scripts/restoreImageCustom.template b/ogclient/scripts/restoreImageCustom.template new file mode 100644 index 0000000..bb94ad1 --- /dev/null +++ b/ogclient/scripts/restoreImageCustom.template @@ -0,0 +1,37 @@ +#!/bin/bash +#/** +# restoreImageCustom +#@brief Plantilla para scirpt de rastauración personalizada de imagen. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP +#@param $4 Nombre canónico de la imagen sin extensión +#@warning Renombrar este fichero como "restoreImageCustom" para sustituir al script estándar "restoreImage". +#**/ + + +# Control de parámetros. +[ $# -ge 4 -a $# -le 6 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: restoreImageCustom str_repo str_imagen int_ndisco int_npart [ str_proto [\"str_opciones\"] ]" || exit $? + +# Toma de parámetros. +REPO="${1^^}" # Repositorio (en mayúsculas). +IMGNAME="$2" # Nombre canónico de imagen (sin extensión). +DISK="$3" # Nº de disco. +PART="$4" # Nº de partición. +PROTO="${5^^}" # Protocolo de comunicaciones (por defecto, UNICAST). +PROTO=${PROTO:-"UNICAST"} +PROTOOPT="$6" # Opciones del protocolo separadas por ":" (opcional). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + + +# Paso 1: Añadir aquí el código para el proceso previo antes de la restauración de la imagen en los equipos (opcional). + + +# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de restauración de imagen por código personalizado. +restoreImage "$@" + + +# Aviso: editar la plantilla "configureOsCustom" para añadir el código personalizado para el proceso de postconfiguración de los clientes (no incluir aquí dicho código). + diff --git a/client/shared/scripts/restoreImageCustomTemplate.py b/ogclient/scripts/restoreImageCustomTemplate.py similarity index 100% rename from client/shared/scripts/restoreImageCustomTemplate.py rename to ogclient/scripts/restoreImageCustomTemplate.py diff --git a/ogclient/scripts/runAplicationX.sh b/ogclient/scripts/runAplicationX.sh new file mode 100755 index 0000000..85f9681 --- /dev/null +++ b/ogclient/scripts/runAplicationX.sh @@ -0,0 +1,8 @@ +#/bin/bash +/usr/X11R6/bin/Xvesa :0 -ac -shadow -screen 1024x768x24 -br -mouse /dev/input/mice & +/bin/sleep 0.1 +export DISPLAY=:0 +#/usr/bin/lxde-logout +#/usr/bin/openbox +/usr/bin/roxterm +#/usr/sbin/gparted diff --git a/client/shared/scripts/runApplicationX.py b/ogclient/scripts/runApplicationX.py similarity index 100% rename from client/shared/scripts/runApplicationX.py rename to ogclient/scripts/runApplicationX.py diff --git a/client/shared/scripts/runhttplog.py b/ogclient/scripts/runhttplog.py similarity index 100% rename from client/shared/scripts/runhttplog.py rename to ogclient/scripts/runhttplog.py diff --git a/ogclient/scripts/runhttplog.sh b/ogclient/scripts/runhttplog.sh new file mode 100755 index 0000000..f0f854b --- /dev/null +++ b/ogclient/scripts/runhttplog.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +#httd-log-status +cp /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.back +cp /opt/opengnsys/lib/httpd/lighttpd.conf /etc/lighttpd/ +cp /etc/lighttpd/conf-enabled/10-cgi.conf /etc/lighttpd/conf-enabled/10-cgi.conf.back +cp /opt/opengnsys/lib/httpd/10-cgi.conf /etc/lighttpd/conf-enabled/ +/etc/init.d/lighttpd start +chmod 755 /opt +mkdir -p /usr/lib/cgi-bin +cp /opt/opengnsys/lib/httpd/* /usr/lib/cgi-bin +#TODO: +dstat -dn 10 > /tmp/bandwidth & +echo "WAITING" >> $OGLOGSESSION +# http-log-status diff --git a/ogclient/scripts/samples/configureGroup b/ogclient/scripts/samples/configureGroup new file mode 100755 index 0000000..6563843 --- /dev/null +++ b/ogclient/scripts/samples/configureGroup @@ -0,0 +1,65 @@ +#!/bin/bash +#/** +#@file configureGroup +#@brief Script de ejemplo de post-configuracion del sistema operativo especifica de cada grupo de ordenadores. +#@brief El directorio del grupo en el repositorio se situa en /opt/opengnsys/groups/Nombre_Grupo +#@brief Se ponen archivos o marcas dentro del directorio del grupo (si queremos que afecte a todas las imagenes) +#@brief o del subdirectorio de la imagen dentro del grupo. Los archivos se copian en el sitio correcto del sistema +#@brief y las marcas se comprueba que existen para inicar una accion (ej: cambiar registro) +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@warning License: GNU GPLv3+ +#*/ + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$0" "$0 path_dir str_image int_ndisk int_npart" \ + "$0 REPO /aula1/winxp 1 1" + exit +fi + +# Error si no se reciben 4 parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT || exit $? + +# Procesar parámetros. +PART=$(ogMount $3 $4) || ogRaiseError $OG_ERR_PARTITION "$3 $4" || exit $? +IMGNAME=$(basename $2) +GROUPDIR=$(ogGetGroupDir) +IMGDIR=$GROUPDIR/$IMGNAME + +# Comprobamos que exista GROUPDIR. Si no existe no es error, nada que configurar +[ ! -x "$GROUPDIR" ] && exit 0 + + +TYPE=$(ogGetOsVersion $3 $4) + +case "$TYPE" in + Linux*) echo "PostConfiguracion de Linux para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/menu.lst ] && echo "cp -f $IMGDIR/menu.lst $PART/boot/grub/menu.lst" && cp -f $IMGDIR/menu.lst $PART/boot/grub/menu.lst + [ -e $IMGDIR/grub.cfg ] && echo "cp $IMGDIR/grub.cfg $PART/boot/grub/grub.cfg" && cp -f $IMGDIR/grub.cfg $PART/boot/grub/grub.cfg + [ -e $IMGDIR/hosts ] && echo "cp -f $IMGDIR/hosts $PART/etc/hosts" && cp -f $IMGDIR/hosts $PART/etc/hosts + [ -e $IMGDIR/fstab ] && echo "cp -f $IMGDIR/fstab $PART/etc/fstab" && cp -f $IMGDIR/fstab $PART/etc/fstab + [ -e $IMGDIR/xorg.conf ] && echo "cp -f $IMGDIR/xorg.conf $PART/etc/X11/xorg.conf" && cp -f $IMGDIR/xorg.conf $PART/etc/X11/xorg.conf + [ -e $IMGDIR/rc.local ] && echo "cp -f $IMGDIR/rc.local $PART/etc/rc.local" && cp -f $IMGDIR/rc.local $PART/etc/rc.local + [ -e $IMGDIR/interfaces ] && echo "cp -f $IMGDIR/interfaces $PART/etc/network/interfaces" && cp -f $IMGDIR/interfaces $PART/etc/network/interfaces + [ -e $IMGDIR/passwd ] && echo "cp -f $IMGDIR/passwd $PART/etc/passwd" && cp -f $IMGDIR/passwd $PART/etc/passwd + ;; + + *Windows\ XP) echo "PostConfiguracion de XP para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/SAM ] && echo "cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM" && cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM + ;; + *Windows\ 7*) echo "Postconfiguracion de W7 para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/SAM ] && echo "cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM" && cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM + ;; + *) exit 0 + ;; + esac + diff --git a/ogclient/scripts/samples/firstRunOnceWindows b/ogclient/scripts/samples/firstRunOnceWindows new file mode 100644 index 0000000..00a6e07 --- /dev/null +++ b/ogclient/scripts/samples/firstRunOnceWindows @@ -0,0 +1,68 @@ +#!/bin/bash +#/** +#@file FirstRunOnceWindows +#@brief Guión de rutinas que se ejecutarán en los windows con teclado y raton desactivados. +#@param $1 número de disco +#@param $2 número de particion +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception OG_ERR_PARTITION 3 # Error en partición de disco. +#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. +#@version 1.0.1 - primera version: desactivar/activar ratón y teclado +#@author Antonio J. Doblas Viso. +#@date 2017-02-23 +#**/ + + + +PROG="$(basename $0)" +if [ $# -lt 2 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion" + exit $? +fi + + +# Asignación de variables +## Bloque de variables de parámetros +DISK=$1 +PART=$2 +POSTCONF=postconf.cmd +### Bloque de variables basada en un archivo de claves: ADMIN PASSADMIN USER PASSUSER +source $OGETC/os.cfg $DISK $PART + + + +OSVERSION=$(ogGetOsVersion $1 $2) +case "$OSVERSION" in + *Windows*) + # Desactivamos el telcado y el ratón + ogSetRegistryValue $(ogMount $DISK $PART) SYSTEM '\ControlSet001\Services\kbdclass\Start' 4 + ogSetRegistryValue $(ogMount $DISK $PART) SYSTEM '\ControlSet001\Services\mouclass\Start' 4 + + ## Indicación del proceso (variable $POSTCONF), usuario que lo ejecutará ($ADMIN) y configuración del windows para que arranque con autologin tras la postconfiguración (1 "$USER" "$PASSUSER") + echo "ogInstallMiniSetup $DISK $PART $POSTCONF $ADMIN $PASSADMIN 1 \"$USER\" \"$PASSUSER\" " + ogInstallMiniSetup $DISK $PART $POSTCONF $ADMIN $PASSADMIN 1 "$USER" "$PASSUSER" + ogAddCmd $DISK $PART $POSTCONF '@echo off' + ogAddCmd $DISK $PART $POSTCONF 'start "C:\Program Files\Internet Explorer\iexplore.exe" wwww.opengnsys.es' + ogAddCmd $DISK $PART $POSTCONF "timeout /t 200 /NOBREAK" + ogAddCmd $DISK $PART $POSTCONF "shutdown -r -t 300" + ogAddCmd $DISK $PART $POSTCONF 'start winword.exe' + ogAddCmd $DISK $PART $POSTCONF 'taskkill /F /IM winword.exe' + ogAddCmd $DISK $PART $POSTCONF 'REG ADD HKLM\SYSTEM\CurrentControlSet\Services\kbdclass\ /v Start /t REG_DWORD /d 3 /f' + ogAddCmd $DISK $PART $POSTCONF 'REG ADD HKLM\SYSTEM\CurrentControlSet\Services\mouclass\ /v Start /t REG_DWORD /d 3 /f' + ogAddCmd $DISK $PART $POSTCONF 'REG ADD HKLM\SYSTEM\ControlSet001\Services\kbdclass\ /v Start /t REG_DWORD /d 3 /f' + ogAddCmd $DISK $PART $POSTCONF 'REG ADD HKLM\SYSTEM\ControlSet001\Services\mouclass\ /v Start /t REG_DWORD /d 3 /f' + #ogAddCmd $DISK $PART $POSTCONF '"c:\Program Files\Toolwiz Time Freeze 2017\ToolwizTimeFreeze.exe" /freezealways /usepass=' + #ogAddCmd $DISK $PART $POSTCONF 'reg query "HKCU\SOFTWARE\Toolwiz\TimefreezeNew"' + + #ogAddCmd $DISK $PART $POSTCONF "cscript \"c:\Archivo de Programas (x86)\agua\aguac\scripts\MSOfficeActivate.vbs\" " + #ogAddCmd $DISK $PART $POSTCONF "del \"c:\Program Files (x86)\agua\aguac\scripts\MSWinActivate.vbs\" " + #unix2dos /mnt/sda1/Windows/System32/postconf.cmd + + ### reiniciamos el equipo + ogAddCmd $DISK $PART $POSTCONF "shutdown -r" + ### consultamos + cat $(ogMount $DISK $PART)/Windows/System32/$POSTCONF + + ;; +esac diff --git a/ogclient/scripts/samples/smartPartition b/ogclient/scripts/samples/smartPartition new file mode 100644 index 0000000..568ed32 --- /dev/null +++ b/ogclient/scripts/samples/smartPartition @@ -0,0 +1,62 @@ +#!/bin/bash +#/** +# smartPartition.template +#@brief particiona los clientes del laboratorio virtual. +#@param 1 +#@ejemplo: +#@return: Scripts de ejemplo para establecer particionado según tamaño. +#@exception OG_ERR_ NOTFOUND Disco duro no encontrador. +#@note +#@todo: +#@version 0.1 primera version +#@author adv +#@date 2018/07/08 + +#Calculamos el numero de discos +NDISK=$(ogDiskToDev | wc -w) + +#Si no hay discos, error +[ -z $NDISK ] && exit $(ogRaiseError $OG_ERR_NOTFOUND "ogDiskToDev | wc -w") + +#asignamos contador al primer disco de OpenGnsys +COUNTER=1 +until [ $COUNTER -gt $NDISK ]; do + ogUnmountAll $COUNTER + ogDeletePartitionTable $COUNTER + ogCreatePartitionTable $COUNTER MSDOS + ogUpdatePartitionTable $COUNTER + let COUNTER=COUNTER+1 +done + +#Establecemos las Particiones CACHE con tamaños diferentes según la capacidad del disco. +#Si el PC tiene dos discos duros, el segundo será completo para la CACHE. +#establecemos rangos de las capacidades con expresiones regulares: https://goo.gl/gJnK7g +case $NDISK in + 1) + #Calcular el tamaño máximo del disco duro redondeando a la baja en 500 MB para evitar problemas de calculo" + SIZE_DISK1=$(expr $(ogGetDiskSize 1) - 500000) + #entre 70 y 73'9GB + ogCheckStringInReg $SIZE_DISK1 "^7[0-3][0-9]{6}$" && initCache 1 4 32000000 NOMOUNT + #entre 50 y 52'9 + ogCheckStringInReg $SIZE_DISK1 "^5[0-2][0-9]{6}$" && initCache 1 4 12000000 NOMOUNT + ;; + 2) + #Calcular el tamaño máximo del disco duro redondeando a la baja en 500 MB para evitar problemas de calculo" + SIZE_DISK2=$(expr $(ogGetDiskSize 1) - 500000) + initCache 2 4 $SIZE_DISK2 NOMOUNT + ;; +esac + +#El particionado para los sistemas operativos identicos para todos. +#Requiere tener una tabla de particiones previa. +ogCreatePartitions 1 NTFS:19000000 LINUX:19000000 EMPTY:0; + +#asignamos contador al primer disco de OpenGnsys +COUNTER=1 +until [ $COUNTER -gt $NDISK ]; do + ogBootMbrGeneric $COUNTER + ogSetPartitionActive 1 $COUNTER + ogListPartitions $COUNTER + ogGetPartitionActive $COUNTER + let COUNTER=COUNTER+1 +done diff --git a/ogclient/scripts/sendFileMcast b/ogclient/scripts/sendFileMcast new file mode 100755 index 0000000..54e82ac --- /dev/null +++ b/ogclient/scripts/sendFileMcast @@ -0,0 +1,56 @@ +#!/bin/bash + + + +#Este scripts llama directamente a la función ogMcastSendFile $1 $2 +#1 path absoluto del fichero. +#2 la session multicast. +# ogMcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast +#@brief Envía un fichero por multicast ORIGEN(fichero) DESTINO(sessionmulticast) +#@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast + + + +export OPENGNSYS="${OPENGNSYS:-/opt/opengnsys/client}" + export OGBIN=$OPENGNSYS/bin + export OGETC=$OPENGNSYS/etc + export OGLIB=$OPENGNSYS/lib + export OGAPI=$OGLIB/engine/bin + export OGSCRIPTS=$OPENGNSYS/scripts + export OGIMG=$OPENGNSYS/images + export OGCAC=$OPENGNSYS/cache + export OGLOG=$OPENGNSYS/log + + for i in $OGAPI/*.lib; do + . $i + done + + if [ "$engine" = "testing" ] + then + for i in $OGAPI/*.testing; do + . $i + done + fi + +export PATH=$PATH:/opt/opengnsys/bin + +export OG_ERR_FORMAT=1 # Formato de ejecución incorrecto. +export OG_ERR_NOTFOUND=2 # Fichero o dispositivo no encontrado. +export OG_ERR_PARTITION=3 # Error en partición de disco. +export OG_ERR_LOCKED=4 # Partición o fichero bloqueado. +export OG_ERR_IMAGE=5 # Error al crear o restaurar una imagen. +export OG_ERR_NOTOS=6 # Sin sistema operativo. +export OG_ERR_NOTEXEC=7 # Programa o función no ejecutable. + + + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "sendFileMcast /absolute_path_file sesionMcast" \ + "sendFileMcast /opt/opengnsys/images/aula1/hd500.vmx 9000:full-duplex:239.194.17.2:70M:20:300" + exit 0 +fi + +# los demas errores controlados por la funcion ogMcastSendFile + +ogMcastSendFile $1 $2 diff --git a/ogclient/scripts/setBootMode b/ogclient/scripts/setBootMode new file mode 100755 index 0000000..81eec28 --- /dev/null +++ b/ogclient/scripts/setBootMode @@ -0,0 +1,47 @@ +#!/bin/bash +# #/** +# setBootMode +#@brief Script to configure the PXE mode to client +#@param 1 template +#@date 2012-02-2-9 +#@version 1.0.1 - Recoge como parametro el nombre interno de la plantilla en vez del nombre de fichero para que funcione correctamente al llamar a setclientmode y anade un nuevo parametro de modo de trabajo (0 o 1) que indica que el cambio del fichero PXE del servidor sera temporal o permanente +#@author Juan Carlos Garcia - Univ. Zaragoza +#@date 2015-11-17 +#*/ ## + +#REPOIP="$(ogGetRepoIp)" + +# Asignamos la IP del servidor de administracion que es el destino del script +SERVERIP="$(ogGetServerIp)" +PORT=2011 +TEMPLATE=$(grep -l "^#.* $1 *$" /opt/oglive/tftpboot/menu.lst/templates/*) +PCNAME="$(hostname)" + +PROG="$(basename $0)" +if [ "$*" == "help" ]; then + ogHelp "$PROG" "$PROG template [ 0 | 1 ] (0 - Temporary 1, - Permanent) " \ + "$PROG ogLive 1" \ + "$PROG 1hd-1partition 0" + exit +fi + + +# Control básico de errores. +if [ $# -ne 2 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_ERR_FORMAT: $PROG TEMPLATE_NAME [ 0 | 1 ] (0 - Temporary, 1 - Permanent)" + exit $? +fi + +if [ -z "$TEMPLATE" ]; then + ogRaiseError $OG_ERR_NOTFOUND "$MSG_ERR_NOTFOUND: $1" + exit $? +fi + +if [ $2 != "0" ] && [ $2 != "1" ]; then + ogRaiseError $OG_ERR_NOTFOUND "$MSG_ERR_FORMAT: modo $2 no existe" + exit $? +fi +# Crea un pipe con el servidor de administracion que llama a setclientmode pasandole los parametros de nombre de plantilla, nombre PC y modo de trabajo (0 o 1) +hose $SERVERIP $PORT --out sh -c "echo -ne SET_CLIENTMODE $1 $PCNAME $2" + + diff --git a/ogclient/scripts/updateBootCache b/ogclient/scripts/updateBootCache new file mode 100755 index 0000000..f2e4e72 --- /dev/null +++ b/ogclient/scripts/updateBootCache @@ -0,0 +1,65 @@ +#!/bin/bash + +#/** +# updateBootCache +#@brief acelerador arranque pxe. incorpora a la cache el initrd y el kernel. +#@param 1 +#@param ejemplo: +#@return +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_NOTFOUND=2 # Fichero o dispositivo no encontrado. +#@note +#@todo: +#@version 1.0.1 - requiere el gestor de arranque grub2dos +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2010/07/27 +#@version 1.1.0 - Permite varios ogLive dentro de subdirectorios +#@author Irina Gómez. ETSII Universidad de Sevilla +#@date 2017/04/27 +#@version 1.1.0 - Se permite varios ogLives en la CACHE +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2017/05/31 +#@version 1.1.0 - Limpieza de codigo, control errores +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2018-01-21 +#*/ ## + +OGLIVEDIR=${oglivedir:-"ogLive"} +OGBTFTP="/opt/oglive/tftpboot/$OGLIVEDIR" +OGBCACHE="$OGCAC/boot/$OGLIVEDIR" + +#control de errores +[ -d "$OGBTFTP" ] || exit $(ogRaiseError $OG_ERR_NOTFOUND "$OGBTFTP"; echo $?) +ogMountCache || exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?) + +[ -d $OGBCACHE ] || mkdir -p $OGBCACHE + + # comparamos los del server + SERVERVMLINUZ=`cat ${OGBTFTP}/ogvmlinuz.sum 2>/dev/null` + SERVERINITRD=`cat ${OGBTFTP}/oginitrd.img.sum 2>/dev/null` + + #comparamos los de la cache + CACHEVMLINUZ=`cat ${OGBCACHE}/ogvmlinuz.sum 2>/dev/null` + CACHEINITRD=`cat ${OGBCACHE}/oginitrd.img.sum 2>/dev/null` + + echo "MD5 on SERVER: $SERVERVMLINUZ $SERVERINITRD" + echo "MD5 on CACHE: $CACHEVMLINUZ $CACHEINITRD" + + + if [ "$CACHEVMLINUZ" != "$SERVERVMLINUZ" ] + then + echo "ogvmlinuz updating" + cp "${OGBTFTP}/ogvmlinuz" "${OGBCACHE}/ogvmlinuz" + cp "${OGBTFTP}/ogvmlinuz.sum" "${OGBCACHE}/ogvmlinuz.sum" + DOREBOOT=true + fi + if [ "$CACHEINITRD" != "$SERVERINITRD" ] + then + echo "oginitrd updating" + cp "${OGBTFTP}/oginitrd.img" "${OGBCACHE}/oginitrd.img" + cp "${OGBTFTP}/oginitrd.img.sum" "${OGBCACHE}/oginitrd.img.sum" + DOREBOOT=true + fi + +echo $DOREBOOT +# [ "$DOREBOOT" == "true" ] && busybox reboot -f diff --git a/client/shared/scripts/updateBootCache.py b/ogclient/scripts/updateBootCache.py similarity index 100% rename from client/shared/scripts/updateBootCache.py rename to ogclient/scripts/updateBootCache.py diff --git a/ogclient/scripts/updateCache b/ogclient/scripts/updateCache new file mode 100755 index 0000000..f1d64ad --- /dev/null +++ b/ogclient/scripts/updateCache @@ -0,0 +1,315 @@ +#!/bin/bash +#/** +# updateCache +#@brief Actualiza la cache del cliente con imagen o fichero iso. +#@param 1 REPO Origen del fichero. -accesible por nfs-samba- +#@param 2 str_fichero nombre del fichero a actualizar. +#@param 3 str_protoco. TORRENT | MULTICAST | UNICAST. +#@param 4 str_opcionesprotocolo +#@param 4 str_opcionesupdatecache +#@ejemplo: oneRemoteFromMaster 172.17.36.11 CACHE /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop +#@return +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTCACHE No existe cache -15- +#@exception $OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16- +#@exception $OG_ERR_MCASTRECEIVERFILE Error en la recepción Multicast de un fichero -57- +#@exception $OG_ERR_PROTOCOLJOINMASTER Error en la conexión de una sesión Unicast|Multicast con el Master -60- +#@note +#@todo: +#@version 0.9.1 - integracion EAC +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2008/03/17 +#@version 0.9.2 - integracion OpenGnsys +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2010/07/27 +#@version 1.0.1 - Control de espacio requerido +#@author Antonio J.Doblas Viso +#@date 2011-05-10 +#@version 2.0.1 - Imagenes sincronizadas +#@date 2013-02-20 +#@version 1.0.5 - uso de md5 full para las transferencias torrent, en la llamada => ogUpdateCacheIsNecesary +#@date 2014-07-09 +#@version 1.1 - Cambio de repositorio para el recurso remoto images si es necesario +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2015-06-16 +#@version 1.1 - Control de errores en transferencia multicast (ticket #781) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2017/04/20 +#*/ ## + +PROG="$(basename $0)" +if [ $# -lt 3 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_REPO _str_Relative_Path_OGIMG_with_/ PROTOCOLO OPCIONES_PROTOCOLO OPCIONES_UPDATECACHE" + exit $? +fi + +#Carga del configurador del engine +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND + +if ! [ "$(ogGetCaller)" == "deployImage" -o "$(ogGetCaller)" == "restoreBaseImage" -o "$(ogGetCaller)" == "restoreDiffImage" ]; then + echo -n "" > $OGLOGSESSION; + + # Registro de inicio de ejecución + ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" +fi + +REPOSITORIO="${1^^}" +PROTOCOLO="${3^^}" +OPTPROTOCOLO="$4" +# Si MCASTWAIT menos que tiempo de espera del servidor lo aumento +if [ "${PROTOCOLO%-*}" == "MULTICAST" ] && [[ ${OPTPROTOCOLO##*:} =~ ^-?[0-9]+$ ]]; then + [ ${MCASTWAIT:0} -lt ${OPTPROTOCOLO##*:} ] && let MCASTWAIT=${OPTPROTOCOLO##*:}+5 +fi + +# Unidad organizativa. +[ "$ogunit" != "" ] && OGUNIT="$ogunit/" + +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPOSITORIO +if [ $? == 0 -o $REPOSITORIO == "REPO" ] ; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPOSITORIO $OGUNIT || exit $(ogRaiseError $OG_ERR_NOTFOUND $REPOSITORIO; echo $?) + REPOSITORIO="REPO" +fi +REPOIP=$(ogGetRepoIp) +ogEcho log session $REPOSITORIO $REPOIP $PROTOCOLO $OPTPROTOCOLO + +# Si el repositorio local CACHE no existe error 15. +if ! $(ogFindCache >/dev/null); then + ogRaiseError session $OG_ERR_NOTCACHE "CACHE" + exit $? +fi + +# comprobar si la imagen existe (.img, .img.diff o directorio) +REPOFILE=$(ogGetPath "REPO" "/$2") +[ -n "$REPOFILE" ] || exit $(ogRaiseError session $OG_ERR_NOTFOUND "REPO /$2"; echo $?) + +ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_DOUPDATE" +# Distingo si es monolitica o sincronizable +file "$REPOFILE" | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " -e " directory" 2>&1 > /dev/null +if [ $? == 0 ]; then + IMGSYNC=TRUE + # Para imagen sincronizada, si hay imagen en cache siempre protocolo = rsync. + CACHEFILE="$(ogGetPath "CACHE" "/$2")" + [ -n "$CACHEFILE" ] && PROTOCOLO="RSYNC" + # Si es sincronizada tipo directorio siempre protocolo = rsync. + [ -d $REPOFILE ] && PROTOCOLO="RSYNC" && IMGTYPE="dir" + + # Si es imagen sincronizada siempre da distinto md5. No podemos comprobar -> actualizamos. + RETVAL=0 +else + # Si la imagen es monolitica y ha elegido protocolo = RSYNC salimos con error. + [ $PROTOCOLO == "RSYNC" ] && exit $(ogRaiseError session $OG_ERR_DONTSYNC_IMAGE "REPO $2"; echo $?) + IMGSYNC=FALSE + ogUpdateCacheIsNecesary "$REPOSITORIO" "$2" "$PROTOCOLO" + RETVAL=$? +fi +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit $OG_ERR_UPDATECACHE + +ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE" +CACHESIZE=$(ogGetCacheSize) +CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`) +FILESIZE=$(ls -sk $(ogGetPath $REPOSITORIO "$2") | cut -f1 -d" ") +if [ "$IMGTYPE" == "dir" ]; then + ogEcho log session " * $MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR" + ogEcho log session " du -sk $REPOFILE" + REALFILESIZE=$(du -sk "$REPOFILE"|awk '{print $1}') +else + REALFILESIZE=$(ls -l --block-size=1024 $REPOFILE | cut -f5 -d" ") +fi + +# La sincronizada, si existe la imagen en cache el espacio necesario +# es la nueva menos lo que ocupa la que ya hay. +if [ "$PROTOCOLO" == "RSYNC" ]; then + if [ "$CACHEFILE" == "" ]; then + CACHEFILESIZE=0 + else + if [ "$IMGTYPE" == "dir" ]; then + ogEcho log session " * $MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR $CACHEFILESIZE" + ogEcho log session " du -sk $CACHEFILE" + CACHEFILESIZE=$(du -sk $CACHEFILE |awk '{print $1}') + else + CACHEFILESIZE=$(ls -l --block-size=1024 "$CACHEFILE" | cut -f5 -d" ") + fi + fi + let SIZEREQUIRED=$REALFILESIZE-$CACHEFILESIZE + [ $SIZEREQUIRED -lt 0 ] && SIZEREQUIRED=0 +else + SIZEREQUIRED=$FILESIZE +fi + +#ERROR CACHESIZE 16 (tamanyo de la CACHE insuficiente) +if [ "$SIZEREQUIRED" -ge "$CACHESIZE" ] +then + ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > CACHE = $CACHESIZE" + ogRaiseError session $OG_ERR_CACHESIZE "CACHE" + exit $? +fi + + +#ERROR CACHESIZE 16 (Espacio libre en CACHE insuficiente) +if [ "$SIZEREQUIRED" -ge "$CACHESIZEFREE" ] +then + ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO: ACTIONCACHEFULL=$ACTIONCACHEFULL" + case "$ACTIONCACHEFULL" in + NONE) + ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > FREE SPACE CACHE = $CACHESIZEFREE" + ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL, NO SPACE FREE" + exit $? + ;; + FORMAT) + ogEcho log session "[51] $MSG_HELP_ogFormatCache " + ogUnmountCache + ogFormatCache + ogMountCache + NEXTOPERATION=REPEAT + ;; + DELETE) + ogEcho log session "[51] #MSG_HELP_ogDeleteTree $OGCAC$OGIMG/* " + rm -fr $OGCAC$OGIMG/* + NEXOPERATION=REPEAT + ;; + *) + ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $FILESIZE > CACHE = $CACHESIZEFREE" + ogRaiseError session $OG_ERR_CACHESIZE "CACHE" + exit $? + ;; + esac +fi + +# Comprobamos que imagen cache igual a la del repo. Si sincronizada no podemos comprobar. +[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO" +RETVAL=$? +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit $OG_ERR_UPDATECACHE + +ogMountCache >/dev/null + +## Si no existe, crear subdirectorio para el fichero en la cache. +IMGDIR=$(ogGetParentPath CACHE "/$2") +if [ $? != 0 ]; then + ogEcho log session "[5] $MSG_HELP_ogMakeDir \"$2 $(dirname "$2")." + ogMakeDir CACHE $(dirname "/$2") + IMGDIR=$(ogGetParentPath CACHE "/$2") || exit $? +fi + +TIME1=$SECONDS + +case "$PROTOCOLO" in + TORRENT) + ogEcho log session "ogCopyFile $REPOSITORIO $2.torrent absolute $OGCAC/$OGIMG" + # tiempos + timewait=$(expr $(printf '%d\n' 0x$(ogGetMacAddress | awk -F: '{print $5$6}')) \* 120 / 65535) + ogExecAndLog command ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR" || exit $? + #TODO: comprobar que el tracker definido en el fichero es correcto. + #TODO comprobar que el fichero torrent está en cache + # retardamos el inicio -aleatorio de 0 a 120 segundos- al tracker para gestionar mas de +-40 equipos + P2PWAIT=$[ ( $RANDOM % 120 ) + 1 ] + ogEcho log session " [ ] $MSG_SCRIPTS_TASK_SLEEP : $P2PWAIT seconds" + sleep $P2PWAIT + ogEcho log session " [ ] $MSG_SCRIPTS_TASK_START: ogTorrentStart CACHE $2.torrent $4" + ogExecAndLog command ogTorrentStart CACHE "$2.torrent" $4 + RESUMEUPDATECACHE=$(grep -m 1 -B1 "Download" $OGLOGCOMMAND) + RESUMEUPDATECACHEbf=$(grep -m 1 "Download" $OGLOGCOMMAND) + if [ "$RESUMEUPDATECACHEbf" == "Download complete." ]; then + rm -f $IMGDIR$2".torrent.bf" + fi + ;; + MULTICAST) + ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION: $REPOIP:${OPTPROTOCOLO%%:*}" + #TODO: ticket 379 + NUMBER=$[ ( $RANDOM % 30 ) + 1 ] + sleep $NUMBER + #FIN TODO + ogEcho log session ogMcastRequest "$2" $OPTPROTOCOLO + ogExecAndLog command ogMcastRequest "$2" $OPTPROTOCOLO || exit $? + ogEcho log session ogMcastReceiverFile ${OPTPROTOCOLO%%:*} CACHE "$2" + ogExecAndLog command ogMcastReceiverFile ${OPTPROTOCOLO%%:*} CACHE "$2" || exit $? + RESUMEUPDATECACHE=$(grep -m 1 -B1 "Transfer complete" $OGLOGCOMMAND.tmp) + ;; + UNICAST) + #ogEcho log session "unicast" + ogExecAndLog command ogCopyFile $REPOSITORIO "$2" "$IMGDIR" + sleep 5 + RESUMEUPDATECACHE=$(grep -m 1 "100%" $OGLOGCOMMAND.tmp) + ;; + RSYNC) + # Si parametro de protocolo no era rsync, mensaje de cambio protocolo + [ "${3^^}" == "RSYNC" ] || ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_RSYNCPROTOCOLCHANGE" + # Opciones de rsync + USERRSYNC="opengnsys" + PASSWORD=" --password-file=/scripts/passrsync " + OPTRSYNC=" --delete --progress " + [ "$ogrsyncz" == "true" ] && OPTRSYNC="z $OPTRSYNC" + [ "$ogrsyncw" == "true" ] && OPTRSYNC="w$OPTRSYNC" + + if [ -d $REPOFILE ]; then + # Si es sincronizada tipo directorio. + [ -d "$OGCAC$OGIMG/$2" ] || mkdir "$OGCAC$OGIMG/$2" + ogEcho log session "rsync -aHAX$OPTRSYNC $USERRSYNC@$REPOIP::ogimages/$OGUNIT$2/ $OGCAC$OGIMG/$2" + rsync -aHAX$OPTRSYNC $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$OGUNIT$2/" "$OGCAC$OGIMG/$2" 2>> $OGLOGCOMMAND | egrep "^sent|^sending|^total%" >> $OGLOGCOMMAND + else + # Si es sincronizada tipo archivo. + [ "${2##*.}" == "img" ] && IMGTYPE="img" || IMGTYPE="diff" + IMGNAME="${2%.img*}" + + DIRMOUNT=$(ogGetMountImageDir "$IMGNAME" $IMGTYPE) + DIRLOCAL="/tmp/$DIRMOUNT" + mkdir "$DIRLOCAL" 2>/dev/null + ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_CHECKSIZEIMG" + + # Si la imagen no existe la creo + # Si la imagen del repositorio es mayor, redimensiono la imagen de cache + if [ "$CACHEFILE" == "" -o $CACHEFILESIZE -lt $REALFILESIZE ]; then + ogEcho log session "$MSG_HELP_ogCreateFileImage" + ogCreateFileImage CACHE "$IMGNAME" $IMGTYPE $REALFILESIZE + TIMEAUX3=$[SECONDS-TIMEAUX3] + ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX3/60]m $[TIMEAUX3%60]s" + fi + # Montamos las imagenes para sincronizarlas. Quitamos / inicial. + ogMountImage CACHE "${IMGNAME#\/}" $IMGTYPE || exit $? + ogMountImage REPO "${IMGNAME#\/}" $IMGTYPE + # Esperamos que se monte la imagen en el servidor + ogWaitSyncImage REPO "$IMGNAME" $IMGTYPE "mounted" || exit $? + ogEcho log session " rsync -aHAX$OPTRSYNC $USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/ $DIRLOCAL" + rsync -aHAX$OPTRSYNC $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/" "$DIRLOCAL" 2>>$OGLOGCOMMAND | egrep "^sent|^sending|^total|%" >> $OGLOGCOMMAND + # RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary + [ ${PIPESTATUS[0]} -eq 0 ] && RETVAL="1"|| RETVAL="2" + # Desmonto las imagenes + ogUnmountImage CACHE "$IMGNAME" $IMGTYPE + ogUnmountImage REPO "$IMGNAME" $IMGTYPE + ogUnlockImage CACHE "$2" + fi + ;; +esac + +TIME1=$[SECONDS-TIME1] + +ogEcho log session " [ ] $RESUMEUPDATECACHE " +ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL updateCache $[TIME1/60]m $[TIME1%60]s" +ogEcho log session " [ ] $MSG_SCRIPTS_TASK_START $MSG_HELP_ogCalculateChecksum " +TIME2=$SECONDS +# Si es imagen sincronizada siempre da distinto md5. No podemos comprobar +if [ "$IMGSYNC" == "TRUE" ]; then + # RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary + [ $PROTOCOLO == "RSYNC" ] || RETVAL=1 +else + ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO" + RETVAL=$? +fi +if [ "$(ogGetCaller)" != "deployImage" ]; then + TIME2=$[SECONDS-TIME2] + ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL $MSG_HELP_ogCalculateChecksum $[TIME2/60]m $[TIME2%60]s" +fi +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizamos-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "0" ] && exit $OG_ERR_UPDATECACHE +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit $OG_ERR_UPDATECACHE + diff --git a/client/shared/scripts/updateCache.py b/ogclient/scripts/updateCache.py similarity index 100% rename from client/shared/scripts/updateCache.py rename to ogclient/scripts/updateCache.py