pax_global_header00006660000000000000000000000064143232006670014515gustar00rootroot0000000000000052 comment=61f036e4ce5609efe901ec9e048339d3ee8d5b0e UnixAgent-2.10.0/000077500000000000000000000000001432320066700134775ustar00rootroot00000000000000UnixAgent-2.10.0/.github/000077500000000000000000000000001432320066700150375ustar00rootroot00000000000000UnixAgent-2.10.0/.github/Contributing.md000066400000000000000000000123101432320066700200250ustar00rootroot00000000000000

Banner

OCS Inventory

Some Links:
Ask question | Installation | Website

# OCS Inventory Contributing Guidelines ## Pull Request Process 1. Fork it! 2. Create your feature branch: `git checkout -b my-new-feature` 3. Add your changes: `git add folder/file1.php` 4. Commit your changes: `git commit -m 'Add some feature'` 5. Push to the branch: `git push origin my-new-feature` 6. Submit a pull request ! ## Pull Request Informations When contributing, please open an issue before or contact the team using mail. This will prevent all the duplicate of work. Also, check if your contribution is not already in the roadmap or affiliated to an issue. If you are contributing on a small scale (translation, a few line modification), you don't need open an issue or contact the team but you will need to explain what you've done in the Pull Request comment and provide as accurate commit messages as possible. Cf. Commits Messages Name Informations If you need to discuss about a big change or need some help of our team during the development of your contribution, we can use other communication method like Telegram, IRC, Skype. ## Commits Messages Name Informations Try to create as accurate as possible commit messages. This will help us to speed up the review process and to reduce the misunderstanding (which can lead to a Pull Request to be rejected) There is no commit messages convention but here are some examples : 1. Create as short as possible commit name 2. One commit for one modification 3. Always leave the second commit line blank If it seems difficult to summarize what your commit does, it may be because it includes several logical changes or bug fixes, and are better split up into several commits using `git add -p`. ## Code of Conduct ### Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ### Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ### Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ### Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ### Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at `contact@ocsinventory-ng.org` . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ### Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ UnixAgent-2.10.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000005661432320066700175530ustar00rootroot00000000000000*It's hard to solve a problem when important details are missing, that why we added this template, to help you and us.* ### General informations Operating system : Perl version : ### OCS Inventory informations Unix agent version : ### Problem's description *Describe your problem here* ### Inventory log file ( optional ) *Use github cloud or trusted upload website* UnixAgent-2.10.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000020301432320066700206330ustar00rootroot00000000000000## Must read before submitting Please, take a look to our contributing guidelines before submitting your pull request. There's some simple rules that will help us to speed up the review process and avoid any misunderstanding [Contributors GuideLines](https://github.com/OCSInventory-NG/OCSInventory-ocsreports/blob/master/.github/Contributing.md) ## Status **READY/IN DEVELOPMENT/HOLD** ## Description A few sentences describing the overall goals of the pull request's commits. ## Related Issues Put here all the related issues link ## Todos - [ ] Tests - [ ] Documentation ## Test environment If some tests has been already made, please give us your test environment' specs #### General informations Operating system : Perl version : #### OCS Inventory informations Unix agent version : ## Deploy Notes Notes regarding deployment the contained body of work. These should note any dependencies changes, logical changes, etc. 1. ## Impacted Areas in Application List general components of the application that this PR will affect: * UnixAgent-2.10.0/.gitignore000066400000000000000000000007571432320066700155000ustar00rootroot00000000000000# Mac OS Specific dir .DS_Store build/ *.old # Iceberg specific dir tools/macosx/installer_gui/iceberg/OCSNG.app/ tools/macosx/installer_gui/iceberg/ocscontact tools/macosx/installer_gui/iceberg/plugins/ # Ignore darwin perl lib if un tar from script repository tools/macosx/scripts/darwin-perl-lib/ # Xcworkspace and user data project.xcworkspace/ xcuserdata/ # perl Makefile.PL /MYMETA.json /MYMETA.yml /Makefile /ipdiscover /run-postinst # make /blib/ /pm_to_blib # make dist /*.tar.gz UnixAgent-2.10.0/.travis.yml000066400000000000000000000005221432320066700156070ustar00rootroot00000000000000language: perl perl: - "5.30" - "5.28" - "5.26" - "5.20" before_install: - sudo apt -y install dmidecode make gcc - cpanm --quiet --installdeps --notest . script: env PERL_AUTOINSTALL=1 perl Makefile.PL && sudo make && sudo make install addons: apt: update: true branches: only: - masterUnixAgent-2.10.0/AUTHORS000066400000000000000000000006601432320066700145510ustar00rootroot00000000000000Maintainer: Frank Bourdeau Former maintainers: Guillaume PROTET Gonéri LE BOUDER Based on the legacy OCS Linux agent (Copyright (C) 2005-2008 Pascal DANEK ) Copyright 2006-2020 OCS Inventory contributors Website: http://www.ocsinventory-ng.org Please read THANKS to get the list of the contributors UnixAgent-2.10.0/Changes000066400000000000000000001522301432320066700147750ustar00rootroot00000000000000Revision history for Ocsinventory::Agent 2.9.1 * Copy cronjob script from Fedora * Permit storing CA list in config dir * Don't check XML if in forced mode * Prevent misunderstanding of version option from config file * Remove forbidden char in XML * Fix Agent 2.9.0 not reporting OS minor release on Debian * Fix addInput missing keys * Fix SNMP macadress format 2.9.0 * Adding new Screen Manufacturer * Update OSRelease.pm * Change product name for Lenovo systems * Small improvements in the parse of config file options * Checking if XML is valid before submitting * Fix Unix user inventory * Fix raspberry has no serial * Fix timeout from last command * Fix memory issue on MacOS * Fix empty value for ip address when contains 127 * Fix IpDiscover compilation * Fix lshw storage discovery fails on servers with one device * Fix bug group members displaying as HASH * Fix the bad management of the inventor in RHEL * Fix gateway misbehaviour with multiple network interfaces * Fix XML has not well formed * Fix issue Ubuntu 21.10 being reported as Ubuntu 11.0 * Remove devtmpfs partition inventory 2.8.1 * Add octectstring management on SNMP Scan * Add retry and timeout config for SNMP * Fix perl warnings on HASH * Fix warning on SNMP Scanner * Fix digit retrival using bigger digit and avoid truncate * Remove old SNMP scanning feature 2.8 * Rework SNMP Interface and configuration * Rework IPDiscover manager * Rework LDAP Authenticaiton * Rework Auth backend * Rework software inventory data structure * Add MySQL 8 compatibility * Add ASCII code management on deployment messages * Add "is not empty" criteria on multi search * Add computer archive feature * Add IPDiscover scan split by TAG * Add CVE Matching regex * Add chinese translation * Add perl injector related inventory on main dashboard * Update German translation * Improve CVE Inventory * Improve translation on deployment form * Move networks submenu to inventory menu for better visibility * Fix date interval search on multi criteria * Fix IPDiscover subnet blacklist * Fix CVE-2020-14947 * Fix stats to match user TAG restrictions * Fix CSV export to match table show / hide configuration * Fix minor bugs on CVE Inventory * Fix deployment estimation time when editing a packaged * Fix deployment fragment bug * Fix small package deployment (< 1024 bytes) * Fix a bug on MySQL SSL connection * Remove SNMP_INVENTORY_DIFF * Typos fix * Minor bug fix 2.6.1 * Allow encode http password in base64 * Fix repository inventory #254 * MacOS installer / packaging rework * Suppress error message for LSPCI * Fix oracle package setup * Remove uninitialized value message * Now use os-release file * Improve drives management (Linux / MacOS) * Imprive IPv6 inventory 2.6.0 * Fix issue Service-Pack wrong info on Linux Clients (reports on https://github.com/OCSInventory-NG/OCSInventory-ocsreports/issues/741) * Fix issues #181, #187, #194, #197 * Merge PR #175, #178, #190, #191, #193, #196, #199, #201 2.4.2 * Fix warning argument freebsd isn't numeric * Fix Debian repository * Update manifest * Fix name and url in Repository * Fix for Ubuntu and older Debian version * Merge PR #141,#135,#143 * Fix spelling errors * Add arcconf for Adaptec * Fix issue #124 * Replace hpacucli with ssacli * Merge PR #144,#145,#146,#147,#148,#150 * Make use of EDID utilities optional on modern kernels * Fallback to mainboard serial if bios serial is not available * Merge PR #152, #156, #158, #159 * Fix issue for ipdiscover * Indicate god value for memory * Use now Parse::EDID module to retrieve monitor infomrations * Merge PR #161, #163, #164, #165, #169, #170, #172, #173, #174 2.4.1 * Add the date of installation for debian/ubuntu packages * Add support for zfs * Rewrite cpu bsd * Fix some bugs on Repository/Deb.pm file * Ipmi.pm : fix fatal typo * Bios.pm : fix "invalid" message * UUID.pm : fix "invalid" message * Virtualization : fix for Proxmox * Fix for vlans * Fix virsh out 2.4 * Add test to switch 'waitpid command' according to OS * change bazar revision number to git revision number * ipdiscover: fix default latency * Ignore files which are created during installation * Fix and improve comments in module.conf * Fix some typos * Update MANIFEST * Fix code which disables SSL certificate verification * Fix storage parameters from smartctl * Fix markdown syntax and typo in README.md * Use pkg command on Solaris 11 to create the Software Inventory * Upgraded memconf to v3.14 (support for SPARC T7-4 and S7-2) * New feature: repositories inventory * Fix problem line 280 * Issues corrections * Retrieve info for apfs formatted drive * correct df check for AIX * Fix regexp for listing network interfaces on macOS * Update Mem.pm * Update Agent.pm 2.3 * Suppress functions can_run, can_load, can_read from Backend. Those from Common.pm are now used * Update libraries snapshot for release 2.2 * Suppress reference message to support "No support detected. Registration key: N/A" * Linux storages now supports Megacli raid * Merge Mysteq PR "centos-release is the correct file to check" * Merge XANI PR "read edid from sysfs, fallback to old method if no monitor is found" * Fix bugs in Network.pm and IP.pm files (OS Linux) * Correction for usb inventory * Retrieve Docker container informations * Update memconf command to last revision * Add enhancement support for Xen xl command (xm command already present) 2.2rc1 * Update memconf command to last revision * Fix Bug #1466748 Interface Detection Infiniband MAC wrong * Fix Bug #1423905 Failed HTTP auth if password contains # character * Fix syntax error in BSDpkg.pm file * HPUX/Solaris: use --nosoftware instead of --nosoft * Correction of graphics resolution * Retrieve speed and duplex from a different way * Enhancement: unix agent can now report battery inventory * Enhancement: unified agent can retrieve lxc container * Suppress --nosoft option * Fix Bug #1440626 Typo error in Alpha/CPU.pm * Fix Bug #1438719 pkg_list has been deprecated on FreeBSD so no software inventory is gathered on those systems * Fix Bug #1438021 Support s390x processors * Fix Bug #1436702 Wrong disk size * Fix Bug #1435675 AIX typo error in Hardware.pm * Fix Bug #1431844 données de HDD SAS/SAN manquantes AIX 5.3, 6.1 et 7.1 * Fix Bug #1420073 Linux/Archs/i386/CPU.pm reports incorrect CPU information * Fix Bug #1409671 PROCESSORS bad value on PowerPC arch * Fix Bug #1405167 Presentation of OS Name and OS Version * Fix Bug #1389255 Nombre d'interfaces recherchees * Fix Bug #1376787 [UNIX Agent] Feature request: report Fusion-io cards * Fix Bug #1364123 created script perl for xenserver * Fix Bug #1350240 --nosoftware does'nt work on aix * Fix Bug #1342038 Wrong data for cores on Unix Agent 2.1.1 * Fix Bug #1322088 CPU show 0 on VM libvirt * Fix Bug #1319683 libvirt VM partial detection * Fix Bug #1293588 CPU on Ubuntu may not be detected because of `arch` command and Dumper reference * Fix Bug #1246427 CentOS Linux 6 not identified * Fix Bug #1201734 Hyper-V virtual machines not recognized as "Virtual Machine" by agent * Fix Bug #1159742 Ipmi.pm does not load Net::IP at the right place * Fix Bug #1064296 ipv4 handling fix 2.1.1 * Add number of socket in Linux/Archs/i386/CPU.pm * Add hyperthreading support in Linux/Archs/i386/CPU.pm * Fix Bug #1312830 about missing CPU information * Update memconf command to last revision * Add new file to detect Oracle distro * Fix CPU.pm which couldn't retrieve multi socket processors * Fix Bug #1045356 about regression in ifconfig parsing * Fix a mistake in tag in 6876.xml * Move lib/Ocsinventory/Oracle and lib/Ocsinventory/Apache directories in lib/Ocsinventory/agent/Modules directory * Fix a mistake in Hooks.pm which makes Download.pm and Snmp.pm not loaded by agent * Fix problem on path of arch command * Fix debug trace in CPU.pm * Fix a translation mistake in MacOSX agent French installer 2.1 * Fix #Bug 1272425 about status of libvirt virtual machines not reported * Fix blueprint about installation date in the report of the installed software * Fix blueprint about UUID value in the hardware Table * Fix Bug #1247190 about default gateway as gateway for all interfaces under Linux * Add new screen code for edid (PTS) * Add new module to retrieve Nvidia cards * Add new module to retrieve virtual machines on vmware workstation * Return corrected values for storage under Fedora 19 * Fix Bug #1247190 about default gateway as gateway for all interfaces under Linux * Add new screen code for edid (PTS) * Add new module to retrieve Nvidia cards * Add new file to detect CentOS distro * Add new module to retrieve virtual machines on vmware workstation * Return corrected values for storage under Fedora 19 * Fix Bug #1206514 about enhancing modules loading to allow directories * Fix a bug in Common.pm about processes data marked as virtualmachines data * Fix Bug #1216935 about Mac user agent not generating UUID * Fix Bug #1237682 about RPM.pm INSTALLDATE format not always accepted by MySQL * Retrieve the speed of network card * Add a new log message when unable to scan a SNMP devices in Snmp.pm * Fix problem about IP address tests in Snmp.pm * Remove "-pP" option passed to nmap in Snmp.pm * New module to retrieve NetApp devices using SNMP * New module to retrieve Sun devices using SNMP * Add new value to BIOS.pm * Fix bugs in CUPS.pm and Usb.pm files * Retrieve new values for CPU * Update memconf command to latest version * Fix bugs about usb in Lsusb.pm and Common.pm * Add retrieve of usb connected devices * Fix Bug #1198088 about wrong data for processors under 2.1 RC1 * Fix bug about SNMP v3 in 9.pm * Fix bug about custom network scanning in Snmp.pm * Add retrieve of video memory size * Fix Bug #1169675 about error message about SSL_verify_mode of SSL_VERIFY_NONE under Fedora 18 2.1rc1 * Fix Bug #1095989 about a bad regex in Libvirt.pm * Fix Bug #1032393 about softwares bot inventoried vi dpkg-query * Add custom SNMP MIBs XML copy from sources in postinst.pl * Getting monitor serial number in MacOS/Video.pm * Add a new configuration option for SSL certificate check in MacOSX agent installer * Add new screen codes for edid * Fix Bug ##1117110 about missing number of CPU socket * Add availibility to reforce a package deployment * Code rewrite in Common.pm to prevent sending empty XML tags to OCS server * Fix Bug #1086086 about uses of initialized value in Snmp.pm * Fix Bug #1087270 about zombie processes when running in daemon mode * Fix Bug #1086078 about use of initialized value * Fix Bug #1070788 about zip packages support * Fix Bug #1045356 about ifconfig parsing issue (Fedora >=17) * New availability to scan custom network with SNMP using a network address received from server * Fix Bug #1049626 about Qemu virtualization not detected on proxmox * Fix Bug #1040197 about VLAN interface AIX support * Add detect CPU architecture * AIX memory module change * Add many informations about CPU (l2cachesize, status, socket designation, cores number) * Fix Bug #882574 about parsing of dmidecode fails on SMBIOS warning * Fix Bug #984699 about the Output of 'ps' in VirtualBox module is displayed in stdout * Fix Bug #571655 about the Wrong Sys:Syslog usage * Retrieve family, serial number, number of processors, clockrate for BSDsystems * New module for inventoring Oracle databases * Multiples monitors patch added * Fix Bug #1023670 about memconf not working with HP-UX 11.31 * New version of Gentoo.pm * New Backend/Virtualization/Parallels.pm module for Parallels virtual machines inventory * Plugin Processes moved as module * Fix Bug #911492 about Freebsd Storage drives not being reported * Fix Bug #911491 about Freebsd CPU info not reporting properly * Fix Bug #873377 about Installed packages on Gentoo * Add OS/Linux/LVM.pm module for Logical Volume Manager support * New Snmp/231.pm module for Fujistu devices * postinst.pl can now be launched in non-interactive mode using new "--nowizard" launch option * Adding all the configuration options as launching arguments in postinst.pl * Adding new interactive questions about "debug", "logfile", "ssl" and "ca" configuration options in postinst.pl * Download.pm uses LWP useragent initiated by Network.pm for SSL checks * Download.pm uses LWP useragent initiated by Network.pm for info and frags files downloads * Network.pm can use LWP version 6 SSL useragent options * New --ca configuration option to specify a CA certificates file path for SSL certificate checks * New --ssl configuration option to enable/disable SSL certificate checks * Customize SNMP scans using a special XML format received from server * Getting network devices MAC address during SNMP scans * Availibity to scan any networks SNMP devices using nmap or ping scans * SNMP v3 available for SNMP scans * Add new --ssl configuration option to enable or disable certificate check during SSL communications * Change 'SERIAL' field name and add checksum for inventory XML CPUS section * Now getting MANUFACTURER and SERIALNUMBER in Snmp/3375.pm * Add new fields in setSnmpLoadBalancer() method in Common.pm * Fix Bug #1085020 about ERR_ALREADY_IN_HISTORY message that should be success * Fix bug with SNMP cartridges and trays in Common.pm * Add new MacOS/Controller.pm module to get controllers inventory under MacOSX * Add new MacOS/Slots.pm module to get slots inventory under MacOSX * Add missing DESCRIPTION field in addController() in Common.pm * Set debug and lazy options to 0, in generated ocsinventory-agent.cfg file by macOSX graphic installer, if check boxes are not selected * Add a new configuration option to set lazy mode in MacOSX graphic installer * Improve MacOSX postinstall script to able to deploy MacOSX agent using NetInstall 2.0.5 * Fix Bug #953968 about MacOSX OCSNG.app crash under MacOSX 10.4 64 bits * Fix bug about illegal hexadecimal digit in Snmp/Host_Resources_Mib.pm * Fix segfault and buffer overflow bugs in ipdiscover.c * Improve OCS MacOSX agent internationalization support * Back to previous pane after wrong OCS server address warning in MacOSX installer 2.0.4 * Improve memory slots detection under MacOSX 10.7 in MacOS/Mem.pm * Force OCSNG.app to become the topmost window in tools/macosx/ocsng_app-xcode/main.m * Fix Bug #901570 about wrong printer name if no printer found in MacOS/Printers.pm * Solving CPU and memories inventory detection under MacOSX Snow Leopard and MacOSX Lion * Modifying MacOSX backend files to use the new Mac::Sysprole Perl module version * Fix Bug #887534 about invalid CREATEDATE in lib/Ocsinventory/Agent/Backend/OS/Linux/Drives.pm 2.0.3 * Fix Bug #881406 about security issue due to snmp_com.txt file which is no longer used * Fix Bug #874269 about wrong conversion if hard drive >= TB in MacOS/Storages.pm * Fix Bug #879487 about a misplaced object release in ocs_agent_configPane.m 2.0.2 * Fix bug on "Debug Mode" checkbox in MacoSX installer * Fix bug while sending ERR_DOWNLOAD_INFO message in Donwload.pm * Fix Bug #856161 about installer problems on MacOSX Tiger 2.0.1 * New SNMP data using If_Mib.pm: IP address, netmask, gateway and routing informations * Use the "public" SNMP community if no community defined in OCS server configuration * Various bug fixes in Snmp.pm * New 2.0 MacOSX integration * Bug #798428 about standalone agent building * Change variable names to lowercase in Snmp/3375.pm * Fix a closedir omission in Solaris/Packages.pm * Modify releases tarball name when building it using make dist command * Various patches for CPU, Bios and Drives detection for HPUX systems * Fix Bug #781732 about a missing chomp() in Processes.pm 2.0 * Fix Bug #778692 about using authentication when sending messages in Download.pm * Patch from Yoann Le Bihan for Solaris zones support * Fix Bug #586321 about wrong version comparison in Vmsystem.pm * Bug #772436 about download end message report in Download.pm * Display support log received from PROLOG * Various patches for Snmp/9.pm module (Cisco) * Add --nolocal option to desactivate local mode even if it is set in config file or command line * Fix Bug #767290 about /etc/sysconfig/ocsinventory-agent server settings ignore (only for Redhat like distributions) * Only inventory vitualmachines which have an UUID in VirtualBox.pm to prevent inventoring USB devices or shared folders as virtualmachines 2.0rc4 * Complety clean the disastrous treatments of accountinfos while receiving it from server,storing it in file and adding it in inventory * Fix UTF8 problems due to XML::Simple::XMLIn() 2.0rc3 * Fix Bug #720635 about lspci usage on old Linux distributions * Fix Bug #720626 about Gentoo packages with hyphen in their names * Fix a bug with the use of pacman tool on ArchLinux. We now launch the real packages manager instead of the famous game ;) ;) * Avoid perl errors when no answer from OCS server * Enhance logging in Snmp.pm and Download.pm when disabling this modules (local mode or prerequisites not OK) * Patches from Bernhard Denner to enhance CPU and memry detection on old SUN solaris workstations * Patch from Bernhard Denner to enhance dhcp-leases files detection on Linux systems 2.0rc2 * Add a new cleanXml() subroutine in Common.pm to clean non printable characters in both standard inventory and SNMP inventory * Various patches for Snmp/9.pm module (Cisco) * Add a new addSnmpCPU() subroutine in Common.pm * Disabling Download.pm if agent running in local mode 2.0rc1 * Add download_start_handler to check if Net::SSLeay can be load and disable Download.pm if not * Add Net::SNMP optional dependency in README file. * Delete Win32 from backend * Various patches for 9.pm and If_Mib.pm to enhance ethernet ports speed display (Françs Mermet) * New SNMP modules for Juniper, Futjitsu and F5 vendors (Françs Mermet) * Fix Bug #682689 about missing data for disk when can't run lshal command (Bernhard Denner) * Add a warning message about user privacy in man page for --scan-homedirs option * Various patches for 8072.pm an If_Mib.pm (Françs Mermet) * Change timeout for Backend modules from 180 to 600 seconds * Change timeout for Backend modules from 180 to 600 seconds * Back on the ipdiscover binary from the old OCS Linux Agent to make network scans lighter than Nmap. Ipdiscover binary is only available under Linux systems * Use LaunchDaemons instead of LaunchAgents in MacOSX package * Fix SSL errors if no URL is given by the server in Snmp.pm * Do SNMP scans and treatments only if asked by the server * Delete some useless logs in debug for SNMP constructors and standard MIBs modules * Change oid_value in snmp_info subroutine in Printer_Mib.pm * New SNMP 2620.pm module for Checkpoint Software Technologies constructor (Françs Mermet) * Add new "DEVICEPORT" and "DEVICETYPE" fields in addSnmpnetwork() in Common.pm * 311.pm and 8072.pm use setSnmpComputer() to set the type of SNMP device * Add a new addSnmpInput() subroutine in Common.pm * Fix a bug in addSnmpSwitch subroutine in Common.pm * Replace SetSnmpSwitch() subroutine by SetSnmpSwitchInfos() in Common.pm * Set right fields for AddSnmpSwitch() subroutine in Common.pm * Fix various bug on snmp_oid_run subroutine for constructors and standard MIB modules * Fix various mistakes and missing fields in snmp subroutines in Common.pm * Fix a warning due to deprecated syntax in 3ware.pm * Fix a warning due to deprecated syntax in 3ware.pm * Fix a catastrophic performance issue by preventing to run sysctl at every line of demidecode output to get CPU informations on BSD systems * Snmp.pm now download snmp_com.txt file to get informations about SNMP communities for scans using HTTPS * New subroutines called "getHttpFile" and "getHttpsFile" in Network.pm to download files easily using HTTP or HTTPS. * Fix bugs and minor mistakes in Common.pm and If_Mib.pm * Add Lenovo EDID for monitors (Adam Buchbinder) * Disabling Snmp.pm if agent running in local mode * Fix a warning if network interface is down in Ipdiscover.pm * Enhance inventory initialization for a better modularity * Local mode can now use the "inventory_handler" hook * Various patches for SNMP constructors or standard MIB module (Françs Mermet) * Prevent a bug in using Default.pm (Françs Mermet) * Add "ACR" and "EPI" EDID ID for monitors (Adam Buchbinder) * Fix Bug #597752 about TYPE and VOLUMN fiels reversal for BSD systems. * Fix Bug #612515 to report network interface that don't have an IP address (Mick K) * Don't take care of host with no MAC address in Nmap.pm * Add the SOFTWARE field in addSnmpCard subroutine * Enhance Printer_Mib.pm to add information about printer status and printer error state * Snmp.pm now use Default.pm to launch standard MIB modules by default (Françs Mermet) * Upgrade several SNMP contructors/standard MIB modules * Add a new SNMP constructor module for Lexmark * Add a new SNMP module for the standard Entity MIB. * Add a new SNMP module to load standard MIB modules by default * Add new subroutines for SNMP XML feeding for informations about switches, network cards, blades, firewalls etc.... * Correct a log mistacke in Printer_Mib.pm * New 11.pm module to enable SNMP scans on HP devices * Get the SNMP device MACADDR from PROLOG resp to generate the SNMPDEVICEID in Snmp.pm * Add new subroutines in Common.pm for special SNMP XML feed or SNMP special treatments * New Printer_Mib.pm module to get SNMP printers informations 2.0 alpha Tue, 27 Jul 2010 22:27:27 +0100 * Snmp.pm use flushXMLTags() from Common.pm to flush the content of $common->{xmltags} * Modifying the inventory backend to use functions from Common.pm instead of Inventory.pm * New Snmp.pm for SNMP scans integration. It comes with its constructors modules to enhance scans results (a lot of beers to Françs Mermet to thank himfor his help) * Modifying postinst.pl to include Ocsinventory::Agent::Modules::Snmp * Agent.pm : add $logger object in Ocsinventory::Agent::Common instantiation * Common.pm : adding the can_run(), can_load(), can_read() and runcmdi() generic methods. Adding the use of the $logger object * Common.pm : add a new field 'TYPE' in setSnmpCommons() * Agent.pm now uses the new Networks.pm methods and add the $network object in the $context hash * Networks.pm now gives generic methods to send a XML to OCS server and receive a XML from OCS server * New addInput() method in Common.pm to add mouses and keyboards in inventory * Donwload.pm now use 'get_path' and 'already_in_array' functions from the new Common.pm * Common.pm : Replace the former Common.pm by a new one. Common.pm now give a lot of methods for other agent modules * Agent.pm : instanciate Ocsinventory::Agent::Common object and add a reference to it in $context * Use of the Nmap::Parser perl module to correct the very buggy Nmap implementation for Ipdiscover * Various patches for Solaris support (Lucas MASSE) * Fix the network speed data oblivion in Inventory.pm. The network speed can now be added in Network.pm of the several OS backends * Put the prolog_reader hook run at the right place to avoid an error if the agent failed to reach the server * Enhance dom0 support for Xen support (Guillaume ROUSSE) * Add bios informations for Xen PV hosts (Guillaume ROUSSE) * Fix Bug #552727 about getting processes that are running in Solaris (Emengao) * Add the availiability to disable a module using start_handler hook * Debug and code cleaning in Download.pm * Fix Bug #552097 * Add XML::SAX::Expat module include * Replace {REQUEST} and {ADM} by {xmlroot} in xml handling for a better and better readability * Remove text about Win32 port in the README file * Correct a bug in Hooks.pm to pass inventory or prolog to modules * Add headers for the modules logs * Correct a bug in postinst.pl when removing the old Linux agent * Ocsinventory::Agent::Option:: namespace is now Ocsinventory::Agent::Modules:: * Modules now use Perl's object system * Hooks are now methods and not simple subroutines * Hook.pm is now Hooks.pm * Use of a new context hash in Agent.pm * CompatibilityLayer.pm is now Hook.pm * Calling hooks only in Agent.pm * Update HPUX support (Francois Mermet) * Verify ID value received by server in Download.pm * Verify the network syntax in Nmap.pm * Replace an hard coded pattern in Linux/devices.pm * Removing non posix cp option in Download.pm * Upgrade to memconf V2.13 * Add an in contrib example of script to identify specific software (Simon CLARA) * An example of script to use tarball to identify installed software * HP-UX: initial support, tested on RP3440 * Solaris/Network: support Zone * Solaris: use regex to identify CPU class * Improve the README about non-interactive installation * MacOSX: Correctly identify the CPU frequency on MacOSX 1.6 French 1.1.2.1 Tue, 12 Oct 2010 19:42:41 +0100 * Fix a secutiry bug due to the use of ExtUtils::Installed in Backend.pm. See http://bugs.debian.org/590879 and http://www.debian.org/security/2009/dsa-1828 for more informations. Thanks to Remi Collet for his report. 1.1.2 Sun, 27 Dec 2009 17:24:43 +0100 * Avoid problem with dmidecode -V output on RHEL3.9 (Remi COLLET) * Fix internal --delaytime handling. That's seconds, not hours! * Download.pm: improve a error message 1.1.1 Mon, 21 Dec 2009 22:38:12 +0100 * NETWORKS/VIRTUALDEV should be 1 or 0 * FreeBSD: Fix CPU detection (David DURIEUX) * Virtualization::Qemu, fix kvm detection * Don't run brctl if it's not installed * Various wording fixes (Vincent KNECHT) * Improve README (Barius DRUBECK) * Get serial number from ext4 partition if ext4dev driver is used * LP: #494908 Agent fails to retrieve info file when a package is activated only with the server name (Pascal DANEK) * LP: #495398 Fix RedHat version detection (Stéane URBANOVSKI) * LP: #490774 Fix PowerPC CPU detection on Linux, thanks darkpep for the bug report 1.1 Fri, 06 Nov 2009 16:07:08 +0100 * addMemorie() renamed to addMemories(), this had been broken during the addMemories() . addMemory() transition * Debug mode: msg "check function failed" changed to "ignored" since the fails may be wanted by the check() function * CompatibilityLayer: $self->{params} changed to $self->{config}, this restore the debug mode in Download.pm * Continue XML::Inventory functions name clean up. Rename: - addSlots() calls to addSlot() - addMemories() calls to addMemory() * Move ocsinventory-agent POD documentation frol Ocsinventory::Agent to the ocsinventory-agent shell script. So now the manpage has the correct name * Fix RPM output parsing (Remi COLLET) * VMWareESX: avoid breakage is VM has spaces in its name (Christian Michallek) * Try to detect kvm --uuid value * Makefile.PL, check for Net::SSLeay * Move Ocsinventory::Agent in a .pm and add a wrapper script to load in order to by able to process --devlib * Parallels.pm: doesn't use sudo anymore and check for --scan-homedirs * Prune 'Mac OS X' from the version on Mac + typo fixes (Scott HANNAHS) * POD doc, add a paragraph about the config file * LP: #462529, Fix EDID screen detection, thanks Sergio MERINO * Use boolean for networks/virtualdev * Generic/Screen: chomp uuencode output * Generic/Screen: HSD code for "Hanns.G" (Remi COLLET) * postinst.pl, put user $PATH in /etc/cron.d/ocsinventory-agent 1.1_beta1 Fri, 18 Sep 2009 11:54:12 +0200 * Can use Net::CUPS to find the default printer * AIX: Hide procfs in Filesystem * OS::Linux::Storages, correctly retrieve the serial (Vladimir ELISSEEV) * load $http_proxy env settings and --proxy option is available * Add OS::Linux::Distro::NonLSB::ArchLinux (Julien SAFAR) * New Backend OS::Generic::Processes * Linux/BSD: detect DNS servers config * Solaris: Better output for $OSVErsion (Vladimir ELISSEEV) * Solaris: Sun Fire T1000 patches for memory (Vladimir ELISSEEV) * Solaris: memory SPARC Enterprise T5220 (Vladimir ELISSEEV) * Solaris: CPU SPARC Enterprise T5220 (Vladimir ELISSEEV) * Solaris: CPU SPARC Enterprise T5220 (Vladimir ELISSEEV) * Linux: split the /proc/cpuinfo parsing depending on the arch * Linux: drop Linux::Controllers which is duplicated with Generic::Lspci::Controllers (Vladimir ELISSEEV) * AIX: Various fixes in Memory.pm (Sebastien DAGNICOURT) * AIX: Storages.pm, Virtual disks support and fixes (Sebastien DAGNICOURT) * Backend.pm: Bump the default timeout from 30 to 180 secondes * Agent/XML/Inventory: Fix when version == 0, bug found by neisen * AIX: device type adjustment (Sebastien DAGNICOURT) * Solaris: Sun-Fire-V440 support (Sebastien DAGNICOURT) * Add a missing space if the name banner in --debug mode * Agent/XML/Inventory.pm: Add FROM and INSTALLDATE fields in software list and LASTLOGGEDUSER DATELASTLOGGEDUSER in HARDWARE (Nicolas EISEN) * Initialize etcdir key even if there is no config file * CompatibilityLayer: correctly set $debug * CompatibilityLayer: better log messages * getOptionInfoByName return an array ref now * rename getOptionInfoByName to getOptionsInfoByName * --debug print the XML on STDERR * Rename the params key to config to avoid ambiguity with $params * set HARDWARE/DEFAULTGATEWAY (Nicolas EISEN) * RPM: collect the install date and the size (Nicolas EISEN) * Linux: Collect LASTLOGGEDUSER and DATELASTLOGGEDUSER (Nicolas EISEN) * DPKG: collect the Installed-Size (Nicolas EISEN) * Linux: Collect the ext{2,3,4} and xfs serial number * Linux: Collect the ext{2,3,4} creation date * Add a warning when no certificat is found * Turns off alarm once it's backend run is finish * Fix the IPMI module detection * Linux: Store the PCISLOT and the driver name * NETWORKDS, only store Networks with an address * Linux: detect virtual network device * Linux: Store CONTROLLERS/DRIVER and CONTROLLERS/PCISLOT * Linux: Collects xfs, ext{2,3,4} and vfat label * runs the backend module from main() it's possible to reuse the Backend object. * Linux: filter non standard MAC address returned by ifconfig like 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 mac * Linux: Fix the Uptime check() * Preliminary libvirt support * Partial rewrite of the Download.pm backend * Add a warning if the user is no root, thanks Nicolas EISEN and Sylvain LUCE * SPARC-Enterprise M4000 and M5000 support (Sylvain LUCE) * Libvirt: collect VCPU info (Philippe LIBAT) * Add Virtualization::Xen module (Philippe LIBAT) * Solaris: add a warning if memconf is not in $PATH * Switch the XML content from ISO-8859-1 to UTF-8, BTW we force LC_ALL=C... * Fix the history flood in Download.pm (Pascal DANEK) https://sourceforge.net/tracker/index.php?func=detail&aid=2806585&group_id=58373&atid=487492 * Stores PCIID in CONTROLLERS/PCIID * Storage the monitor EDID string in BASE64 and UUENCODE * Linux: Storages: reorganize the code base and use lshal * Linux: Drives, complete inforamtions with lshal (Nicolas EISEN) * Linux: fix the PowerPC CPU detection https://sourceforge.net/tracker/?func=detail&atid=487492&aid=2043221&group_id=58373 * Warns the user during the install process if one of the recommended module is not installed * Update out copy of memconf, thanks WeatherDave who notified the new revision and of course Tom Schmidt who do a great job * MacOSX: Avoid a scalar used has hash ref error, thanks Adadov * Save VIDEOS/MEMORY and VIDEOS/RESOLUTION * MacOSX: Correctilly detect Up/Down network interfaces (David OLIVIER) * AddNetwork() doesn't ignore network with no IP address (David OLIVIER) * add --backend-collect-timeout parameter (Nicolas EISEN) * MacOSX: convert the IP mask from hex (David OLIVIER) * MacOSX: add a workaround to avoid Mac::SysProfile failure on MacOSX 10.5.7 (David OLIVIER) * Add Virtualization::VirtualBox module (Nicolas EISEN) * Add Virtualization::Qemu module (Nicolas EISEN) * Add Virtualization::Vmsystem module (Nicolas EISEN) * Better smartctl detection (Nicolas EISEN) * optimization and vm users detection Virtualization::VirtualBox (Nicolas EISEN) * Add Virtualization::VmwareFusion module (Walid NOUH) * Don't use hdparm prior 9.2.2 anymore to avoid crap in kernel log, see http://forums.ocsinventory-ng.org/viewtopic.php?pid=20768 * Correctly detect ipmitool * Solaris: i86pc Memory support (Jean-Françs BOUCHER) * Solaris Zone support (Maurizio BERTABONI) * Always send tag, even if server already has one * Add the byHand software collect method (Séstien DAGNICOURT) * add logging to can_read(), can_load() and can_run() * use addUser() instead of setHardware() * Add the runcmd() in the Backend modules 1.0.1 Sun, 22 Mar 2009 20:48:49 +0100 * Fix a typo in Ocsinventory::Agent::Backend::OS::AIX::Memory 1.0 Sun, 22 Mar 2009 20:14:26 +0100 * Hide warning messages when tw_cli or hpacucli are not present on CentOS * Avoid unnecessary about missing 'http://' in local mode * Ipmi.pm: use can_run do detect ipmitool * LSB.pm: properly use can_run * Avoid a warning in CompatibilityLayer.pm in local mode * Improve the README file * Avoid a warning at runtime if rpm is not correctly installed * BSD: Detect AMD64 arch (David DURIEUX) * HP.pm: force detection even if slot 1 is 0 (Remi COLLET) * HP.pm minor clean up + indentation * HP.pm send the $model as NAME to avoid NAME == 'unknown' (Remi COLLET) * New backend module ServeRaid for IBM ServeRAID card (Remi COLLET) * Linux::Storages, fix the hdparm call (Remi COLLET) * OS::Generic::Dmidecode::Bios, fix for RHEL2 dmidecode (Remi COLLET) * launch backend modules with a 30sec timeout * post-inst.pl: use prompt() from ExtUtils::MakeMaker to avoid unexpected error with cpan * avoid the "No LSB modules are available." warning message * Backend: --debug print a warning when arun() function is not found * Fix the Debian/Ubuntu detection for non lsb system * postinst.pl also drops /etc/cron.d/ocsinventory-client if the user wants to drop the old linux_agent * Backend::OS::Solaris::Memory: use the Logger instead of "print" * Solaris: Drop unwanted spaces around OSVERSION and STORAGES/DESCRIPTION * Solaris: Avoid warning if the user can't use fstyp * MANIFEST.SKIP: ignore .git/ and .gitignore * add a workaround for http://rt.cpan.org/Ticket/Display.html?id=38067 * build-perl-tree.sh use cpanp and perl 5.10 now * Backend.pm: do a eval around require File::Find * Add a workaround to find the backend modules for PAR::Packer * Backend.pm: internal change, now do eval 'use $pmodule' instead of require * fix serialnum detection in Lsilogic.pm and Adaptec.pm (Edouard GAMIN) * Makefile.PL: drop wait(), not used * Makefile.PL: fix a syntax error * add tools/makedist.sh to document the workaround used to avoid http://rt.cpan.org/Public/Bug/Display.html?id=43060 * Fix --logfile=/somewhere.log, see http://forums.ocsinventory-ng.org/viewtopic.php?id=3092 * tools/build-perl-tree.sh, add a new script * Don't print ugly error if next_timefile can't be saved * OS::Linux::Domains, improve the way it deals with multiple domaine entries (Remi COLLET) * AIX: Record the last memory Slot (Wilfried BRUNKEN) http://sourceforge.net/tracker/?func=detail&atid=487492&aid=2350694&group_id=58373 * Bump 0.0.10 to 1.0 because it's the first release to be officially part of the OCSInventory distribution 0.0.10beta2 Wed, 24 Sep 2008 23:41:21 +0200 * README: add a not about the $PATH varible on Solaris. * Added extra section support for backends (Pascal DANEK) * Fix the way submodules are disabled with $runMeIfTheseChecksFailed * Linux: Use lsb_release if presents to detect the OS, this will fix the Ubuntu detection * Hide a Perl warning if the agent is run by the user want the last_state file is missing * Add Ipmi backend module (Jean PARPAILLON) * Drop the control characters from the inventory XML https://sourceforge.net/tracker/index.php?func=detail&aid=2100606&group_id=58373&atid=487492 * Apply a little change in standalone.sh that may fix the ParserDetails.ini problem, thanks tharoun 0.0.10beta1 Thu, 04 Sep 2008 18:16:49 +0200 * Fix a "ocs server name" => URI side effect (Pascal DANEK) * Download::Store: used absolute path to "cp" on STORE action (Pascal DANEK) * Download::Store: set -dpR flags to "cp" (Pascal DANEK) * Solaris: Replaced hostid in serialnumber by real serialnumber (Nicolas DORFSMAN) (SUNWsneep becomes mandatory on sparc) * Solaris: Return only one IP address (trying to guess which one corresponds to hostname) (Nicolas DORFSMAN) * Solaris: return disks SERIALNUMBER and FIRMWARE as XML fields (Nicolas DORFSMAN) * Redirection and stderr issue on Solaris (Nicolas DORFSMAN) - Removed close of stderr fd - Modified lspci and screen check() to avoid pollution of stdout/stderr * fix the previous changelog entry, the 0.0.9.1 fix had been done by Nicolas DORFSMAN * postinst.pl checks for MANIFEST present * improve the backend module detection by also scanning the symlinked directory * add the --devlib flag to load ./lib only if wanted and remove '.' from the directory to scan with File::Find. * import the can_run, can_load and can_read functions in the Backend modules * the backend module can have no check function, in this case OCS assume it's ok * apply a patch by Etienne GUILLAUMONT to fix CPU detection on AIX 4 * standalone.sh checks PAR::Packer presence now * only inventory installed .deb * postinst.pl: accept another vardir if the first one was invalide https://sourceforge.net/tracker/?func=detail&atid=487492&aid=1961771&group_id=58373 * postinst.pl Download.pm correctly activated in modules.conf if the user needs it * add MacOSX support thanks to Wes YOUNG (Wes YOUNG) - Added tools/darwin/ support scripts/code for OS X enterprise deployment * add the follow_skip==2 flag to File::Find in Backend.pm so it doesn't detect the same file two time * import of backend module for RAID controller on Linux (3ware, Adaptec, HP and Lsilogic) (Edouard GAMIN) * remove a warning in Debug mod, if a backend module has no run() function * don't crash in Daemon mode if the server is unreachable (Wes YOUNG) * Net::IP is just (strongly) suggested now * fix --basevardir so it really accepts a parameter, thanks Gubluts from the forum who pointed out the bug * postinst.pl use which to find ocsinventory-agent location * Makefile.PL, Perl 5.6 doesn't have Config::config_re, I call it from an eval now * Added --delaytime option as commandline / .cfg file adjustable (Wes YOUNG) * standalone.sh, don't use grep -v since it's not POSIX * doesn't die if Storable.pm is missing like with perl 5.6 * avoid a warning with gzip -h on AIX if Compress::Zlib is missing * README: depends on Perl 5.8 * README: On solaris the Makefile needs gmake * README: Add a note about crontab and PATH * Linux: redirect hdparm error to /dev/null * postinst.pl yes/no questions have a default value now * postinst.pl fix a bug in the import of the old ocsinv.adm https://sourceforge.net/tracker/index.php?func=detail&aid=1991668&group_id=58373&atid=487492 * postinst.pl doesn't create two vardir directories anymore * do not print a wrning is --nosoftware is used. Thanks Knarfling and Remi who pointed the issue out. http://forums.ocsinventory-ng.org/viewtopic.php?pid=12569 * fix the POD documentation, some mistakes were detected by Perl 5.10's perldoc. * the agent doesn't crash anymore if ocsinv.adm or ocsinv.conf is corrupted * Makefile.pl: install memconf on Solaris * Solaris: apply patches to use memconf for CPU, Drives and Memory (Christoph HALMES) 0.0.9.2 04/18/2008 Bug fix * Add /ocsinventory in the server path if the user enter just the hostname https://sourceforge.net/tracker/?func=detail&atid=487492&aid=1945865&group_id=58373 0.0.9.1 04/03/2008 Bug fix * fix a error in the previous release that was forcing the local mode (Nicolas DORFSMAN) https://sourceforge.net/tracker/?func=detail&atid=487492&aid=1945863&group_id=58373 0.0.9 04/01/2008 April Fool release! * Added fallback for --lazy if no prolog freq was found and server error (Pascal DANEK) * Fixed accountinfos handling bugs (Pascal DANEK) * Changed --wait behaviour (--wait=number_of_seconds || "server") (Pascal DANEK) * PROLOG_FREQ is handled in prolog phase (Pascal DANEK) * the random value for file_nexttime is computed only if prolog_freq has changed since last prolog (Pascal DANEK) * import the documentation documentation by adding a description of the agent and pointer to the official website * --nosoft option renamed to --nosoftware, --nosoft still works but with a warning * add --basevardir to be able to use a specific place to store the var file * add the --lazy parameter: send an inventory only if the a random delay between 0 and PROLOG_FREQ had been run over. Useful for package maintainer (Remi COLLET) * return 1 to the shell if the agent failed to contact the server * postinst.pl asks for the basevardir * postinst.pl write the modules.conf * OS::Linux::Network::Networks, correctly reset the ipaddress before every loop so now a network can't have the address of the previous one * rename the key $params->{conffile} to $params->{accountconfig} * fix the way accountinfo information are stored * improve (a bit) tools/standalone.sh to avoid error if people launch it from the tools directory * --server is ignore if --local is in use * adjust Backend::OS::Generic::Screen to be able to use monitor-edid with DVI link (Remi COLLET) * OS::Linux::Storages, add NEC as a know manufacturer add assume the manifacturer is Seagate if the model doesn't match the others and begin with ST (rjhill) * fix the CPU detection on Linux Sparc64 and ARM (Linksys NSLU2) * improve the Solaris version detection by reading the /etc/release file (Nicolas DORFSMAN) * Solaris: fix the MAC addresses when the leading zeros is missing (Jean-Jacques MICHEL) * Solaris: Add publisher is possible in the software list (Nicolas DORFSMAN) * Solaris: improve the hard drive detection (Nicolas DORFSMAN) * postinst.pl can remove the previous linux_agent * postinst.pl reuse linux_agent old config file to set the default server and tag * return the SERIALNUMBER and the FIRMWARE on Linux with hdparm, the feature is not supported yet by the server (egamin) 0.0.8.1 02/20/2008 * postinst.pl, correctly save the realm, do not override the password * Added "CAPTION" field to memory (Pascal DANEK) * Fix a bug with "NUMSLOTS" memory field (Pascal DANEK) * improve the parsing of the config file to accept quote and spaces in the value * postinst.pl save the configfile with 0600 right since the server password maybe be stored in it * standalone.sh doesn't scan the inc/ directory anymore * remove the BUNDLE packages which seem to break the install process * change Solaris::CPU to use psrinfo -v to get the CPUs which works fine on x86 * fix a path error in Ocsinventory::LoggerBackend::File (Remi COLLET) * fix: don't send the inventory if the server doesn't need it (Remi COLLET) 0.0.8 02/05/2008 * fix the deviceid and old_deviceid handling (Pascal DANEK) * fix a debug message in Network.pm (Pascal DANEK) * different fixes on Compress.pm (Pascal DANEK) * fix an event message name in Option/Download.pm (Pascal DANEK) * fix the Compatibility Layer with prolog_read hook (Pascal DANEK) * merge PowerPC and PC code to detect the CPU and improve/fix the regex * looks for config file in /etc/ocsinventory /usr/local/etc/ocsinventory and /etc/ocsinventory-agent * add a pod documentation about the different config files and directories * Compress::Zlib is required but recommended now. In fact, you need it with ocs server prior 1.02 0.0.7.2 01/16/2008 * fix the post installation script to avoid invalid cron time 0.0.7.1 01/14/2008 * add setup.sh in the MANIFEST.SKIP to keep it out of the tarball 0.0.7 01/13/2008 * Ocsinventory::Agent::AccountInfo does not warn accountinfofile if runned in debug mode without root privilege * fix params->{etcdir} to /etc/ocsinventory, /etc/ocsinventory-agent/modules.conf must be moved to /etc/ocsinventory/modules.conf * Solaris: Improve the CPU detection (Olivier ROUSSY) * AIX: Return the directory with the AIX package name (Olivier ROUSSY) * Ocsinventory::Agent::XML::Inventory can now write software inventory value of FILESIZE, FOLDER and PUBLISHER * processChecksum() and feedInventory() are called by Ocsinventory::Agent::XML::Inventory directly now * the server responses are not parsed in the main script anymore * do not create an inventory if the server doesnn't need it * new parameters for the backend modules (run and check functions): - prologresp, the Ocsinventory::Agent::XML::Response::Prolog object returned by the prolog - storage: an hashref stored on the harddrive at the end of the execution of the module * a backend module without a run function is accepted now * Inventory.pm: add addIpDiscoverEntry() to add host from the same network * @runMeIfTheseChecksFailed: new optional setting for Backend module * Ipdiscover is now a backend module and nmap can be used instead of ipdiscover * --nosoft disable the Ocsinventory::Agent::Backend::OS::Generic::Packaging modules * Remove the deprecated modules Ocsinventory::Agent::Option::Ipdiscover and Ocsinventory::Agent::Option::Update * the check function of the backend accepts the same parameter than the run function * Linux::Archs::I386 regex are more robust * perldoc documentation for the ocsinventory-agent command * minor improvment on the Makefile.PL * change the way --server parameter is read. Now we can have a full URL, --remotedir is now useless * fix: correctly load the last_state * improve the Makefile.PL by using inc::Module::Install and adding new check * add a --version parameter and improve the --help * come with bundled dependency to simply the build process * fix the login/passwd/realm authentification * remove Agent/Pid.pm, I've to prepare a better system to keep the pid first * try to read the config in /usr/local/etc/ocsinventory/ocsinventory-agent.cfg if the standard one is missing 0.0.6.2 07/16/2007 Bug fix release * remove a debug "die" in the code 0.0.6.1 06/12/2007 Bug fix release * Fix an undef value in Ocsinventory::Agent::Backend::OS::BSD::Mem * AIX: retrieve correctly the MAC address of some FibberChannel card * now standalone.sh will try to find every module before the build to avoid unexplicated error 0.0.6 06/07/2007 * Enable "verbose" is debug is turned on * AIX: Ocsinventory::Agent::Backend::OS::AIX::Networks rewrote * AIX: Memory.pm, remove the spaces from the end of the DESCRIPTION * add standalone.sh, a script designed to prepare a stand-alone binary of the agent * AIX: Retrieve all the gateway of every subnet instead of just the default one * Config.pm renamed to AccountConfig.pm * New flag: --stdout to print the inventory directly on STDOUT * If the use want write on the system var directory, the agent create one in ~/.ocsinventory/var * The agent setting can be preinitialised with /etc/ocsinventory/ocsinventory-agent.cfg or ~/ocsinventory/ocsinventory-agent.cfg. * remove two debug messages printed during accountinfo rewrite and the daemon starting process * remove a stupid check in Ocsinventory::Agent::AccountConfig, the accountconfig file was not written unless the file was already present * add a recMkdir function in ocsinventory-agent to create directory recursivly * do not process checksum in local mode 0.0.5 04/17/2007 * AIX: use lslpp -c -l to find installed packages * AIX: fixes on CPU.pm, Networks.pm and Memory.pm * AIX: fetch the serial number with lscfg unless it was found with lsvpd * add the .ocs extension to local written files * with --local flag: don't not warn if last_state doesn't exit * Solaris: retrieve installed package * downgrade some message important from info to debug * read screen serial number in the EDID (DDC screen) * Xorg.pm replaced by Screen.pm * Screen.pm all the data are read from EDID now * Initial Linux PPC support (tested in Debian Etch). thanks Walid Nouh for the hardware * Apply patch by Remi Collet to fix an issue with Linux distro detection and Perl 5.6.1 * Turn of STDERR during the module execution to avoid useless message (e.g: foo: not found) use --debug to turn them back * If the system side vardir can't be created. The agent try to create one in ~/.ocs-inventory-agent * Add a THANKS file 0.0.4 03/20/2007 * use of gzip when Compress:Zlib is not avalaible. OCS server 1.01 and prior are not supported. * dmidecode parsing improved * lspci stuffs moved to generic * Linux: find Wifi connection * fix: pass correctly the logger to the modules * don't write the last_state if the connexion failed * Deals correctly with the accountinfo if it's internaly stored in a array ref * BSD support by Thierry Lacoste UnixAgent-2.10.0/LICENSE000066400000000000000000000431031432320066700145050ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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) 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. 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) year 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 Lesser General Public License instead of this License. UnixAgent-2.10.0/MANIFEST.SKIP000077500000000000000000000004121432320066700153750ustar00rootroot00000000000000CVS/ .git .bzr ^00 ^.gitignore$ ^.cvsignore$ .svn .merge ^blib ^_build ^Build$ ^cover_db ^nytprof ^Makefile(\.old)?$ ^MANIFEST\. ^MYMETA\. ^pm_to_blib$ ^run-postinst ~$ \.bak$ \.old$ \.sw[a-z]$ \.# \.swp ^Ocsinventory-agent.* /tarballs/ ^setup.sh .*\.tmp var/ UnixAgent-2.10.0/META.yml000077500000000000000000000016431432320066700147570ustar00rootroot00000000000000--- abstract: 'Ocs-Inventory unified Agent for UNIX, Linux and MacOSX' author: - 'OCS Inventory Team' build_requires: ExtUtils::MakeMaker: 6.59 configure_requires: ExtUtils::MakeMaker: 6.59 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.19' license: gpl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Ocsinventory-Unix-Agent no_index: directory: - inc recommends: Compress::Zlib: 0 Net::IP: 0 Nvidia::ml: 0 Proc::Daemon: 0 Proc::PID::File: 0 requires: Digest::MD5: 0 File::Temp: 0 LWP: 0 XML::Simple: 0 perl: 5.6.0 resources: homepage: http://www.ocsinventory-ng.org bugtracker: https://github.com/OCSInventory-NG/UnixAgent/issues repository: https://github.com/OCSInventory-NG/UnixAgent irc: irc://irc.freenode.net/#ocsinventory-ng license: http://opensource.org/licenses/gpl-license.php version: 2.4.2 UnixAgent-2.10.0/Makefile.PL000077500000000000000000000114051432320066700154550ustar00rootroot00000000000000BEGIN { # Avoid installation issue introduced by perl 5.24.1 removing '.' path from # @INC to avoid possible module injection in normal running perl scripts push @INC, '.' if ( $^V && $^V gt 'v5.24' ); } use inc::Module::Install; use English qw(-no_match_vars); use Config; require 'lib/Ocsinventory/Agent/Config.pm'; # Hack to be able to run a post install script sub MY::postamble { my $re; $re = ' install :: all pure_install doc_install $(NOECHO) $(NOOP)'; $re .= "\n\t[ ! -f run-postinst ] || $^X postinst.pl\n"; return $re; } my $version = $Ocsinventory::Agent::Config::VERSION; name 'Ocsinventory-Unix-Agent'; include 'Module::AutoInstall'; abstract 'OCS Inventory unified Agent for UNIX, Linux and MacOSX'; license 'gpl'; repository 'https://github.com/OCSInventory-NG/UnixAgent/'; version $version; perl_version '5.006'; authors 'OCS Inventory Team'; # mandatory dependencies requires 'Digest::MD5' => undef; requires 'XML::Simple' => undef; requires 'LWP' => '5.8'; requires 'File::Temp' => undef; requires 'Net::IP' => undef; recommends 'IO::Socket::SSL' => undef; recommends 'Compress::Zlib' => undef; recommends 'Proc::Daemon' => undef; recommends 'Proc::PID::File' => undef; # test dependencies test_requires 'IO::Socket::SSL' => '0'; test_requires 'Net::SNMP' => '0'; test_requires 'LWP::Protocol::https' => '0'; # deployement or https communication recommends 'Crypt::SSLeay' => undef; recommends 'LWP::Protocol::https' => undef; # inventory recommends 'Net::CUPS' => undef; recommends 'Parse::EDID' => undef; # network recommends 'Net::SNMP' => undef; recommends 'Net::Netmask' => undef; recommends 'Net::Ping' => undef; recommends 'Nmap::Parser' => undef; resources bugtracker => 'https://github.com/OCSinventory-NG/Unixagent/issues', homepage => 'http://www.ocsinventory-ng.org', IRC => 'irc://irc.freenode.net/#ocsinventory-ng', repository => 'https://github.com/OCSinventory-NG/Unixagent'; install_script 'ocsinventory-agent'; # We want a release bundled with the needed dependency to be able to # prepare a standalone binary with PAR::Packer if ($ENV{OCS_BUNDLE_RELEASE}) { foreach my $module (qw/Archive::Zip HTML::Parser LWP URI XML::NamespaceSupport Net::IP Net::Netmask HTML::Tagset Proc::Daemon Module::ScanDeps PAR::Packer AutoLoader PAR PAR::Dist File::Remove YAML::Tiny Getopt::ArgvFile ExtUtils::Install ExtUtils::ParseXS XML::SAX XML::Simple/) { bundle $module; requires $module; } } #Ugly hack to include ipdiscover binary compilation and install for Linux systems if ($^O =~ /^linux$/i && can_cc()) { my $cc=$Config::Config{cc}; my $ld=$Config::Config{ldflags}; my $cf=$Config::Config{ccflags}; my $op=$Config::Config{optimize}; system("$cc $cf $ld $op resources/ipdiscover/ipdiscover.c -o ipdiscover"); if (-f 'ipdiscover') { install_script 'ipdiscover'; } } if (defined ($ENV{PERL_AUTOINSTALL}) || defined ($ENV{PERL_AUTOINSTALL})) { unlink 'run-postinst'; } else { open POSTINST, '>run-postinst' or die $!; close POSTINST; } if (!can_use('Compress::Zlib')) { print "Please install Compress::Zlib if you use an OCS server prior 1.02.\n"; } if (!can_use('Net::SSLeay')) { print "Please install Net::SSLeay if you want to use the software deployment.\n"; } if (!can_run('ipdiscover') && !can_run('nmap')) { print "Please install nmap "; print "or ipdiscover " if $^O =~ /^linux$/i; print "if you want to use the network ". "discover feature.\n"; } if (!can_use('Net::IP')) { print "Net::IP is strongly recommended since it's required to retrieve " ."network information\n"; } if (!can_use('Net::Netmask')) { print "Net::Netmask is strongly recommended since it's required to retrieve " ."snmp information\n"; } if (!can_use('Proc::Daemon') || !can_use('Proc::PID::File')) { print "Please install Proc::Daemon and Proc::PID::File if you ". "want to use the daemon mode.\n"; } my $archname; eval { # config_re is not available on Perl 5.6 my @t = Config::config_re('archname'); $archname = $t[0]; }; if ($^O =~ /(linux|bsd)/i && (!$archname ||$archname =~ /(i[3456x]86|x86_64|amd64)/i)) { foreach (qw/dmidecode lspci/) { if (!can_run($_)) { print "\n"; print "[WARNING] $_ is needed if you want a complete inventory on x86 and AMD64/x86_64.\n"; print "\n"; } } } if ($^O =~ /^darwin$/ && !can_use('Mac::SysProfile')) { print "\n"; print "[WARNING] Mac::SysProfile are needed on MacOS to detect most of the device information.\n"; print "\n"; requires 'Mac::SysProfile' => undef; } # memconf is needed by Solaris backend module if ($^O =~ /^solaris$/i) { install_script 'memconf'; } #for i in inc/BUNDLES/* ; do rm -rf `basename $i` ;done` #auto_install; WriteAll; UnixAgent-2.10.0/README.md000066400000000000000000000130601432320066700147560ustar00rootroot00000000000000

Banner

OCS Inventory UnixAgent

Some Links:
Ask question | Installation | Website | OCS Professional

Ocsinventory-Agent is an agent for ocsinventory NG. It supports Linux, Solaris and AIX. *BSD support is in progress.

Prerequisites

- Perl 5.8 minimum #### The following modules are needed: - Digest::MD5 - XML::Simple - Net::IP optional, it is only needed to compute the network information - LWP - Mac::SysProfile 0.0.5 : this module is need on MacOSX to collect the device informations. - To get SSL communications working (for packages deployment or HTTPS communications to OCS server), you need these modules: - Crypt::SSLeay if you use LWP prior to version 6 - LWP::Protocol::https if you use LWP version 6 or more - Net::CUPS is used to detect the printer - Net::SNMP to scan network devices using SNMP - To enhance SNMP feature with custom networks scans, you need these modules: - Net::Netmask - Net::Ping or Nmap::Parser - Data::UUID is used to create a unique id for every machine - Parse::EDID is used to inventory monitor and will replace monitor-edid from Mandriva. #### The following commands are needed: - dmidecode on Linux and *BSD (i386, amd64, ia64) => dmidecode is required to read the BIOS stats. - lspci on Linux and *BSD (pciutils package) => lspci is required to list PCI devices. - sneep on Solaris/sparc, you must install sneep and record the Serial Number with it (download it from http://www.sun.com/download/products.xml?id=4304155a) - To get the serial number of the screen you will need one of these tools: - monitor-edid from Mandriva is needed to fetch the monitor. A package is available in Fedora repository. information http://wiki.mandriva.com/en/Tools/monitor-edid - get-edid from the read-edid package - ipmitool if you want to collect information about IPMI - Nmap (v3.90 or superior) to scan network devices for Ipdiscover #### The following PERL modules are optional: - Proc::Daemon Daemon mode - Proc::PID::File brings the pid file support if Proc::Daemon is installed - Compress::Zlib #### The following module is needed if you plan to prepare a tarball or install directly from the Bazaar devel branch. (See SOURCES below.): - Module::Install

Build / Install

Once the archive is unpacked, use these commands: ``` perl Makefile.PL make make install ``` If you want to turn off the interactive post install script, just do (instead of perl Makefile.PL) ``` PERL_AUTOINSTALL=1 perl Makefile.PL ``` You can also run the agent from the tarball directory. In this case, use the `--devlib` flag to load the library from the local directory. You need to launch the agent with root privilege. For debugging you can try to launch it with the `-l` flag: Ex: `ocsinventory-agent -l /tmp --debug` It's also possible to run directly from the tarball directory: `sudo ./ocsinventory-agent --devlib --server http://foo/ocsinventory`

Note

Solaris: - Sun Studio seems to be needed to build the dependency. - The generated Makefile needs gmake to be exectuted - The default installation will install the binary in /usr/perl5/5.XXXXX/bin, set your $PATH variable according to that. Crontab: - If you use crontab to launch the agent you'll probably have to redefine the PATH. For example, just add something like: `PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin` At the beginning of the cron file.
## Contributing 1. Fork it! 2. Create your feature branch: `git checkout -b my-new-feature` 3. Add your changes: `git add folder/file1.php` 4. Commit your changes: `git commit -m 'Add some feature'` 5. Push to the branch: `git push origin my-new-feature` 6. Submit a pull request ! ## License OCS Inventory is GPLv2 licensed The memconf script is maintained by Tom Schmidt http://www.4schmidts.com/memconf.html Copyright © 1996-2017 Tom Schmidt memconf 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. Ocsinventory::Agent::Backend::Virtualization::Vmsystem uses code from imvirt: Authors: Thomas Liske Copyright Holder: 2008 (C) IBH IT-Service GmbH [http://www.ibh.de/] License: 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. Ocsinventory::Agent::Backend::OS::Linux::Storages::Adaptec uses code from Parse-Arcconf: https://github.com/kumy/Parse-Arcconf License and Copyright: Copyright (C) 2012 Mathieu Alorent This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See http://dev.perl.org/licenses/ for more information. UnixAgent-2.10.0/THANKS000066400000000000000000000044331432320066700144160ustar00rootroot00000000000000Olivier ANDREOTTI: AIX, Solaris patches Thierry LACOSTE: BSD portage Didier LIROULET: Installation script Remi COLLET: bug fixes and Fedora/RedHat maintainer Walid NOUH: gave access to PowerPC hardware to help the portage Olivier ROUSSY: minor patches Dennis CABOOTER: FreeBSD maintainer Pierre CHIFFLIER: Debian maintainer Nicolas DORFSMAN: Solaris patches Jean-Jacques MICHEL: Solaris patches Etienne GUILLAUMONT: AIX4 CPU detection Wes YOUNG: MacOSX support and patches Edouard GAMIN: RAID devices support for Linux Christoph HALMES: Solaris patches Jean PARPAILLON: IPMI backends and patches David DURIEUX: AMD64 detection on BSD systems Wilfried BRUNKEN: patch for memory detection on AIX Vladimir ELISSEEV: various patches Julien SAFAR: ArchLinux support Damien MAURAN: MacOSX packaging, doc and support Sebastien DAGNICOURT: AIX and Solaris patches Nicolas EISEN: patches Sylvain LUCE: Sun M5000 and M4000 support Philippe LIBAT: patchs and Xen support David OLIVIER: MacOSX patches Jean-François BOUCHER: Solaris patch Scott HANNAHS: MacOSX patches Maurizio Bertaboni: Solaris Zone support Scott HANNAHS: patch Sergio MERINO: patch Vincent KNECHT: wording patch Barius DRUBECK: documentation patch Stéphane URBANOVSKI: patch Jerome LEBASE: Solaris patches François MERMET: HP-UX support and SNMP integration Dmitry ILYIN: Patches Guillaume ROUSSE: various patches for Xen support Lucas MASSE: various patches for Solaris support Adam BUCHBINDER: various patches Bernhard Denner: various patches Yoann Le Bihan: Solaris patches Andreas Xenos: MacOSX patches and Parallels support Francois Laupetre: LVM modules Christophe Borivant Viper233: patch monitor edid Alexandre Bossot: oracle module Javier Barroso: VLAN interface on AIX Yves GUIMARD: download.pm patch for zip files Marco Tizzoni: Host_Resources_Mib.pm and Agent.pm patches Matthias Vedrines: patch + various modules Trois Six: patch DerJoern: patch Serge Roux: patch Guillaume Lecerf: Xen support Mikkel Paulson: patch XANI: patch Philippe Beaumont: patch lhchin: patch pilch-cit: patch lj6: patch nerijus: patch GSponda: patch JHeidinga: patch Unrankar: patch jfcoz: patch xalasys-luc: patch stweil: patch ivmaks: patches MikaelUranker: patches nnn-dev: patches jmechnich: patches matt335672: patches temperatur: patch RudyLaurent: patches guimard: patches UnixAgent-2.10.0/contrib/000077500000000000000000000000001432320066700151375ustar00rootroot00000000000000UnixAgent-2.10.0/contrib/Tarballs.pm000066400000000000000000000027461432320066700172520ustar00rootroot00000000000000# Write by Simon CLARA 2010-01-25 # # The complete name of the package # the path MUST be valid or the package won't be loaded package Ocsinventory::Agent::Backend::OS::Generic::Tarballs; use strict; # I need to declare $runAfter because of the strict mode use vars qw($runAfter); # The package must be run after OS::Generic $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; # This is the check function. The agent runs it just once the module is loaded. # If the function return false, the module and its children are not executed # eg: OS::Linux and OS::Linux::* won't executed if this run() function return # false # Check if we are on a linux server sub check { $^O =~ /^linux$/ } # uncomment this if you want check for FreeBSD server # sub check {can_run("pkg_info")} # its the main function of the script, it's called during the hardware inventory sub run { my $params = shift; # I need to get the inventory object to update it my $inventory = $params->{inventory}; # our software are in /usr/local/src/ foreach (`ls /usr/local/src/*.{bz2,tar.gz}`){ /^(\/.*\/)(\S+)-(\d+\S*)(\.tar.gz|\.bz2)$/i; my $name = $2; my $version = $3; my $comments = "Software in /usr/local/src/ \n".`$2 --version`; # and I updated the information collected $inventory->addSoftwares({ COMMENTS => $comments, NAME => $name, VERSION => $version }); } } 1; UnixAgent-2.10.0/contrib/cron/000077500000000000000000000000001432320066700161005ustar00rootroot00000000000000UnixAgent-2.10.0/contrib/cron/ocsinventory-agent.cron000066400000000000000000000016371432320066700226300ustar00rootroot00000000000000#!/bin/bash NAME=ocsinventory-agent exec >>/var/log/$NAME/$NAME.log 2>&1 [ -f /etc/sysconfig/$NAME ] || exit 0 source /etc/sysconfig/$NAME export PATH i=0 while [ $i -lt ${#OCSMODE[*]} ] do if [ ${OCSMODE[$i]:-none} == cron ]; then OPTS= if [ ! -z "${OCSPAUSE[$i]}" ]; then OPTS="--wait ${OCSPAUSE[$i]}" fi if [ ! -z "${OCSTAG[$i]}" ]; then OPTS="$OPTS --tag=${OCSTAG[$i]}" fi if [ "z${OCSSERVER[$i]}" = 'zlocal' ]; then # Local inventory OPTS="$OPTS --local=/var/lib/$NAME" elif [ ! -z "${OCSSERVER[$i]}" ]; then # Remote inventory OPTS="$OPTS --lazy --nolocal --server=${OCSSERVER[$i]}" if [ ! -z "${OCSPROXYSERVER[$i]}" ]; then OPTS="$OPTS --proxy=${OCSPROXYSERVER[$i]}" fi fi echo "[$(date '+%c')] Running $NAME $OPTS" /usr/sbin/$NAME $OPTS fi ((i++)) done echo "[$(date '+%c')] End of cron job ($PATH)" UnixAgent-2.10.0/contrib/cron/ocsinventory-agent.logrotate000066400000000000000000000003031432320066700236540ustar00rootroot00000000000000# Rotate OCS Inventory NG agent logs daily, only if not empty # Save 7 days old logs under compressed mode /var/log/ocsinventory-agent/*.log { daily rotate 7 compress notifempty missingok } UnixAgent-2.10.0/contrib/cron/ocsinventory-agent.sysconf000066400000000000000000000012231432320066700233420ustar00rootroot00000000000000## ## OCS Inventory "Unix Unified Agent" Configuration File ## used by the supplied cron job ## ## Add tools directory if needed (tw_cli, hpacucli, ipssend, ...) PATH=/sbin:/bin:/usr/sbin:/usr/bin ## Mode, change to "cron" to activate OCSMODE[0]=none ## can be used to override the ocsinventory-agent.cfg setup. # OCSSERVER[0]=your.ocsserver.name # ## If you need an HTTP/HTTPS proxy, fill this out # OCSPROXYSERVER[0]='http://user:pass@proxy:port' ## ## corresponds with --local=/var/lib/ocsinventory-agent OCSSERVER[0]=local ## Wait before inventory OCSPAUSE[0]=100 ## Administrative TAG (optional, must be filed before first inventory) OCSTAG[0]= UnixAgent-2.10.0/contrib/cron/systemd/000077500000000000000000000000001432320066700175705ustar00rootroot00000000000000UnixAgent-2.10.0/contrib/cron/systemd/ocsinventory-agent-daily.timer000066400000000000000000000003361432320066700255720ustar00rootroot00000000000000[Unit] Description=Run OCS Inventory once per day [Timer] OnCalendar=daily OnUnitInactiveSec=86000 Unit=ocsinventory-agent.service RandomizedDelaySec=900 AccuracySec=900 Persistent=true [Install] WantedBy=timers.target UnixAgent-2.10.0/contrib/cron/systemd/ocsinventory-agent-hourly.timer000066400000000000000000000003031432320066700260040ustar00rootroot00000000000000[Unit] Description=Run OCS Inventory Hourly (if server permits) [Timer] OnCalendar=hourly Unit=ocsinventory-agent.service RandomizedDelaySec=10 Persistent=true [Install] WantedBy=timers.target UnixAgent-2.10.0/contrib/cron/systemd/ocsinventory-agent-onboot.timer000066400000000000000000000002671432320066700257730ustar00rootroot00000000000000[Unit] Description=Run OCS Inventory shortly after boot [Timer] OnBootSec=900 Unit=ocsinventory-agent.service RandomizedDelaySec=10 Persistent=true [Install] WantedBy=timers.target UnixAgent-2.10.0/contrib/cron/systemd/ocsinventory-agent.service000066400000000000000000000002741432320066700250130ustar00rootroot00000000000000[Unit] Description=OCS Inventory Agent After=network.target [Service] Type=oneshot ExecStart=/usr/libexec/ocsinventory-agent/ocsinventory-agent.cron [Install] WantedBy=multi-user.target UnixAgent-2.10.0/cpanfile000066400000000000000000000007511432320066700152060ustar00rootroot00000000000000requires 'XML::Simple', '>= 2.12'; requires 'Compress::Zlib', '>= 1.33'; requires 'Net::IP', '>= 1.20'; requires 'Switch', '>= 2.0'; requires 'Proc::Daemon', '>= 0.20'; requires 'Proc::PID::File', '>= 1.20'; requires 'Net::SNMP', '>= 6.0'; requires 'Net::Netmask', '>= 1.9'; requires 'LWP::Protocol::https', '>= 6.0'; requires 'Parse::EDID', '>= 1.0'; requires 'Data::UUID', '>= 1.2'; requires 'LWP::UserAgent', '>= 6.4';UnixAgent-2.10.0/etc/000077500000000000000000000000001432320066700142525ustar00rootroot00000000000000UnixAgent-2.10.0/etc/cron.d/000077500000000000000000000000001432320066700154355ustar00rootroot00000000000000UnixAgent-2.10.0/etc/cron.d/ocsinventory-agent000066400000000000000000000012521432320066700212160ustar00rootroot00000000000000# # File generated by OCS Inventory NG Unified Unix Agent setup # ################################################################################ # # OCS Inventory NG Unified Unix Agent # # Copyleft 2007 Didier LIROULET # Web: http://www.ocsinventory-ng.org # # This code is open source and may be copied and modified as long as the source # code is always made freely available. # Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ # # Launch OCS Inventory NG Agent once a day under root account, at HH:MM # MM HH * * * root /usr/bin/ocsinventory-agent > /dev/null 2>&1 UnixAgent-2.10.0/etc/default/000077500000000000000000000000001432320066700156765ustar00rootroot00000000000000UnixAgent-2.10.0/etc/default/ocsinventory-agent000066400000000000000000000000231432320066700214520ustar00rootroot00000000000000SERVER="localhost" UnixAgent-2.10.0/etc/init.d/000077500000000000000000000000001432320066700154375ustar00rootroot00000000000000UnixAgent-2.10.0/etc/init.d/ocsinventory-agent000077500000000000000000000104011432320066700212170ustar00rootroot00000000000000#! /bin/sh ### BEGIN INIT INFO # Provides: ocs-inventory-agent # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: OCS-Inventory Agent # Description: This script launches OCS Agent as daemon ### END INIT INFO # Author: Gonéri Le Bouder # # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="OCS Inventory Agent" NAME=ocsinventory-agent DAEMON=/usr/sbin/$NAME PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME DAEMON_ARGS="-d -s $SERVER" # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac : UnixAgent-2.10.0/etc/logrotate.d/000077500000000000000000000000001432320066700164745ustar00rootroot00000000000000UnixAgent-2.10.0/etc/logrotate.d/ocsinventory-agent000066400000000000000000000013541432320066700222600ustar00rootroot00000000000000# # File generated by OCS Inventory NG Unified Unix Agent setup # ################################################################################ # # OCS Inventory NG Unified Unix Agent # # Copyleft 2007 Didier LIROULET # Web: http://www.ocsinventory-ng.org # # This code is open source and may be copied and modified as long as the source # code is always made freely available. # Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ # # Rotate OCS Inventory NG agent logs daily, only if not empty # Save 7 days old logs under compressed mode PATH_TO_LOG_DIRECTORY/*.log { daily rotate 7 compress notifempty missingok } UnixAgent-2.10.0/etc/ocsinventory-agent/000077500000000000000000000000001432320066700201105ustar00rootroot00000000000000UnixAgent-2.10.0/etc/ocsinventory-agent/modules.conf000066400000000000000000000004371432320066700224330ustar00rootroot00000000000000# This list of modules will be loaded by the agent at run time. # To check its syntax do: # $perl modules.conf # You must have NO error, else the content will be ignored. use Ocsinventory::Agent::Modules::Download; use Ocsinventory::Agent::Modules::SnmpScan; # DO NOT REMOVE the 1; 1; UnixAgent-2.10.0/etc/ocsinventory-agent/softwares/000077500000000000000000000000001432320066700221255ustar00rootroot00000000000000UnixAgent-2.10.0/etc/ocsinventory-agent/softwares/example.sh000077500000000000000000000007101432320066700241150ustar00rootroot00000000000000#! /bin/bash # This is an example script for the byHand software collect method # # You can create your own script to detect the installed software # and install them in /etc/ocsinventory/softwares # #ligne=$(ls --version| head -n 1) # #soft=$(echo $ligne | cut -f1 -d'('| sed 's/ //') #vendor=$(echo $ligne | cut -f2 -d'('| cut -f1 -d')') #version=$(echo $ligne | cut -f2 -d'('| cut -f2 -d')'|sed 's/ //') # #echo "$vendor#$soft#$version#simple test" # # UnixAgent-2.10.0/inc/000077500000000000000000000000001432320066700142505ustar00rootroot00000000000000UnixAgent-2.10.0/inc/Module/000077500000000000000000000000001432320066700154755ustar00rootroot00000000000000UnixAgent-2.10.0/inc/Module/AutoInstall.pm000066400000000000000000000630161432320066700203000ustar00rootroot00000000000000#line 1 package Module::AutoInstall; use strict; use Cwd (); use File::Spec (); use ExtUtils::MakeMaker (); use vars qw{$VERSION}; BEGIN { $VERSION = '1.14'; } # special map on pre-defined feature sets my %FeatureMap = ( '' => 'Core Features', # XXX: deprecated '-core' => 'Core Features', ); # various lexical flags my ( @Missing, @Existing, %DisabledTests, $UnderCPAN, $InstallDepsTarget, $HasCPANPLUS ); my ( $Config, $CheckOnly, $SkipInstall, $AcceptDefault, $TestOnly, $AllDeps, $UpgradeDeps ); my ( $PostambleActions, $PostambleActionsNoTest, $PostambleActionsUpgradeDeps, $PostambleActionsUpgradeDepsNoTest, $PostambleActionsListDeps, $PostambleActionsListAllDeps, $PostambleUsed, $NoTest); # See if it's a testing or non-interactive session _accept_default( $ENV{AUTOMATED_TESTING} or ! -t STDIN ); _init(); sub _accept_default { $AcceptDefault = shift; } sub _installdeps_target { $InstallDepsTarget = shift; } sub missing_modules { return @Missing; } sub do_install { __PACKAGE__->install( [ $Config ? ( UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) : () ], @Missing, ); } # initialize various flags, and/or perform install sub _init { foreach my $arg ( @ARGV, split( /[\s\t]+/, $ENV{PERL_AUTOINSTALL} || $ENV{PERL_EXTUTILS_AUTOINSTALL} || '' ) ) { if ( $arg =~ /^--config=(.*)$/ ) { $Config = [ split( ',', $1 ) ]; } elsif ( $arg =~ /^--installdeps=(.*)$/ ) { __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) ); exit 0; } elsif ( $arg =~ /^--upgradedeps=(.*)$/ ) { $UpgradeDeps = 1; __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) ); exit 0; } elsif ( $arg =~ /^--default(?:deps)?$/ ) { $AcceptDefault = 1; } elsif ( $arg =~ /^--check(?:deps)?$/ ) { $CheckOnly = 1; } elsif ( $arg =~ /^--skip(?:deps)?$/ ) { $SkipInstall = 1; } elsif ( $arg =~ /^--test(?:only)?$/ ) { $TestOnly = 1; } elsif ( $arg =~ /^--all(?:deps)?$/ ) { $AllDeps = 1; } } } # overrides MakeMaker's prompt() to automatically accept the default choice sub _prompt { goto &ExtUtils::MakeMaker::prompt unless $AcceptDefault; my ( $prompt, $default ) = @_; my $y = ( $default =~ /^[Yy]/ ); print $prompt, ' [', ( $y ? 'Y' : 'y' ), '/', ( $y ? 'n' : 'N' ), '] '; print "$default\n"; return $default; } # the workhorse sub import { my $class = shift; my @args = @_ or return; my $core_all; print "*** $class version " . $class->VERSION . "\n"; print "*** Checking for Perl dependencies...\n"; my $cwd = Cwd::getcwd(); $Config = []; my $maxlen = length( ( sort { length($b) <=> length($a) } grep { /^[^\-]/ } map { ref($_) ? ( ( ref($_) eq 'HASH' ) ? keys(%$_) : @{$_} ) : '' } map { +{@args}->{$_} } grep { /^[^\-]/ or /^-core$/i } keys %{ +{@args} } )[0] ); # We want to know if we're under CPAN early to avoid prompting, but # if we aren't going to try and install anything anyway then skip the # check entirely since we don't want to have to load (and configure) # an old CPAN just for a cosmetic message $UnderCPAN = _check_lock(1) unless $SkipInstall || $InstallDepsTarget; while ( my ( $feature, $modules ) = splice( @args, 0, 2 ) ) { my ( @required, @tests, @skiptests ); my $default = 1; my $conflict = 0; if ( $feature =~ m/^-(\w+)$/ ) { my $option = lc($1); # check for a newer version of myself _update_to( $modules, @_ ) and return if $option eq 'version'; # sets CPAN configuration options $Config = $modules if $option eq 'config'; # promote every features to core status $core_all = ( $modules =~ /^all$/i ) and next if $option eq 'core'; next unless $option eq 'core'; } print "[" . ( $FeatureMap{ lc($feature) } || $feature ) . "]\n"; $modules = [ %{$modules} ] if UNIVERSAL::isa( $modules, 'HASH' ); unshift @$modules, -default => &{ shift(@$modules) } if ( ref( $modules->[0] ) eq 'CODE' ); # XXX: bugward compatibility while ( my ( $mod, $arg ) = splice( @$modules, 0, 2 ) ) { if ( $mod =~ m/^-(\w+)$/ ) { my $option = lc($1); $default = $arg if ( $option eq 'default' ); $conflict = $arg if ( $option eq 'conflict' ); @tests = @{$arg} if ( $option eq 'tests' ); @skiptests = @{$arg} if ( $option eq 'skiptests' ); next; } printf( "- %-${maxlen}s ...", $mod ); if ( $arg and $arg =~ /^\D/ ) { unshift @$modules, $arg; $arg = 0; } # XXX: check for conflicts and uninstalls(!) them. my $cur = _version_of($mod); if (_version_cmp ($cur, $arg) >= 0) { print "loaded. ($cur" . ( $arg ? " >= $arg" : '' ) . ")\n"; push @Existing, $mod => $arg; $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { if (not defined $cur) # indeed missing { print "missing." . ( $arg ? " (would need $arg)" : '' ) . "\n"; } else { # no need to check $arg as _version_cmp ($cur, undef) would satisfy >= above print "too old. ($cur < $arg)\n"; } push @required, $mod => $arg; } } next unless @required; my $mandatory = ( $feature eq '-core' or $core_all ); if ( !$SkipInstall and ( $CheckOnly or ($mandatory and $UnderCPAN) or $AllDeps or $InstallDepsTarget or _prompt( qq{==> Auto-install the } . ( @required / 2 ) . ( $mandatory ? ' mandatory' : ' optional' ) . qq{ module(s) from CPAN?}, $default ? 'y' : 'n', ) =~ /^[Yy]/ ) ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } elsif ( !$SkipInstall and $default and $mandatory and _prompt( qq{==> The module(s) are mandatory! Really skip?}, 'n', ) =~ /^[Nn]/ ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { $DisabledTests{$_} = 1 for map { glob($_) } @tests; } } if ( @Missing and not( $CheckOnly or $UnderCPAN) ) { require Config; my $make = $Config::Config{make}; if ($InstallDepsTarget) { print "*** To install dependencies type '$make installdeps' or '$make installdeps_notest'.\n"; } else { print "*** Dependencies will be installed the next time you type '$make'.\n"; } # make an educated guess of whether we'll need root permission. print " (You may need to do that as the 'root' user.)\n" if eval '$>'; } print "*** $class configuration finished.\n"; chdir $cwd; # import to main:: no strict 'refs'; *{'main::WriteMakefile'} = \&Write if caller(0) eq 'main'; return (@Existing, @Missing); } sub _running_under { my $thing = shift; print <<"END_MESSAGE"; *** Since we're running under ${thing}, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } # Check to see if we are currently running under CPAN.pm and/or CPANPLUS; # if we are, then we simply let it taking care of our dependencies sub _check_lock { return unless @Missing or @_; if ($ENV{PERL5_CPANM_IS_RUNNING}) { return _running_under('cpanminus'); } my $cpan_env = $ENV{PERL5_CPAN_IS_RUNNING}; if ($ENV{PERL5_CPANPLUS_IS_RUNNING}) { return _running_under($cpan_env ? 'CPAN' : 'CPANPLUS'); } require CPAN; if ($CPAN::VERSION > '1.89') { if ($cpan_env) { return _running_under('CPAN'); } return; # CPAN.pm new enough, don't need to check further } # last ditch attempt, this -will- configure CPAN, very sorry _load_cpan(1); # force initialize even though it's already loaded # Find the CPAN lock-file my $lock = MM->catfile( $CPAN::Config->{cpan_home}, ".lock" ); return unless -f $lock; # Check the lock local *LOCK; return unless open(LOCK, $lock); if ( ( $^O eq 'MSWin32' ? _under_cpan() : == getppid() ) and ( $CPAN::Config->{prerequisites_policy} || '' ) ne 'ignore' ) { print <<'END_MESSAGE'; *** Since we're running under CPAN, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } close LOCK; return; } sub install { my $class = shift; my $i; # used below to strip leading '-' from config keys my @config = ( map { s/^-// if ++$i; $_ } @{ +shift } ); my ( @modules, @installed, @modules_to_upgrade ); while (my ($pkg, $ver) = splice(@_, 0, 2)) { # grep out those already installed if (_version_cmp(_version_of($pkg), $ver) >= 0) { push @installed, $pkg; if ($UpgradeDeps) { push @modules_to_upgrade, $pkg, $ver; } } else { push @modules, $pkg, $ver; } } if ($UpgradeDeps) { push @modules, @modules_to_upgrade; @installed = (); @modules_to_upgrade = (); } return @installed unless @modules; # nothing to do return @installed if _check_lock(); # defer to the CPAN shell print "*** Installing dependencies...\n"; return unless _connected_to('cpan.org'); my %args = @config; my %failed; local *FAILED; if ( $args{do_once} and open( FAILED, '.#autoinstall.failed' ) ) { while () { chomp; $failed{$_}++ } close FAILED; my @newmod; while ( my ( $k, $v ) = splice( @modules, 0, 2 ) ) { push @newmod, ( $k => $v ) unless $failed{$k}; } @modules = @newmod; } if ( _has_cpanplus() and not $ENV{PERL_AUTOINSTALL_PREFER_CPAN} ) { _install_cpanplus( \@modules, \@config ); } else { _install_cpan( \@modules, \@config ); } print "*** $class installation finished.\n"; # see if we have successfully installed them while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { if ( _version_cmp( _version_of($pkg), $ver ) >= 0 ) { push @installed, $pkg; } elsif ( $args{do_once} and open( FAILED, '>> .#autoinstall.failed' ) ) { print FAILED "$pkg\n"; } } close FAILED if $args{do_once}; return @installed; } sub _install_cpanplus { my @modules = @{ +shift }; my @config = _cpanplus_config( @{ +shift } ); my $installed = 0; require CPANPLUS::Backend; my $cp = CPANPLUS::Backend->new; my $conf = $cp->configure_object; return unless $conf->can('conf') # 0.05x+ with "sudo" support or _can_write($conf->_get_build('base')); # 0.04x # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $conf->get_conf('makeflags') || ''; if ( UNIVERSAL::isa( $makeflags, 'HASH' ) ) { # 0.03+ uses a hashref here $makeflags->{UNINST} = 1 unless exists $makeflags->{UNINST}; } else { # 0.02 and below uses a scalar $makeflags = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); } $conf->set_conf( makeflags => $makeflags ); $conf->set_conf( prereqs => 1 ); while ( my ( $key, $val ) = splice( @config, 0, 2 ) ) { $conf->set_conf( $key, $val ); } my $modtree = $cp->module_tree; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { print "*** Installing $pkg...\n"; MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; my $success; my $obj = $modtree->{$pkg}; if ( $obj and _version_cmp( $obj->{version}, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = $cp->install( modules => [ $obj->{module} ] ); if ( $rv and ( $rv->{ $obj->{module} } or $rv->{ok} ) ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation cancelled.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _cpanplus_config { my @config = (); while ( @_ ) { my ($key, $value) = (shift(), shift()); if ( $key eq 'prerequisites_policy' ) { if ( $value eq 'follow' ) { $value = CPANPLUS::Internals::Constants::PREREQ_INSTALL(); } elsif ( $value eq 'ask' ) { $value = CPANPLUS::Internals::Constants::PREREQ_ASK(); } elsif ( $value eq 'ignore' ) { $value = CPANPLUS::Internals::Constants::PREREQ_IGNORE(); } else { die "*** Cannot convert option $key = '$value' to CPANPLUS version.\n"; } push @config, 'prereqs', $value; } elsif ( $key eq 'force' ) { push @config, $key, $value; } elsif ( $key eq 'notest' ) { push @config, 'skiptest', $value; } else { die "*** Cannot convert option $key to CPANPLUS version.\n"; } } return @config; } sub _install_cpan { my @modules = @{ +shift }; my @config = @{ +shift }; my $installed = 0; my %args; _load_cpan(); require Config; if (CPAN->VERSION < 1.80) { # no "sudo" support, probe for writableness return unless _can_write( MM->catfile( $CPAN::Config->{cpan_home}, 'sources' ) ) and _can_write( $Config::Config{sitelib} ); } # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $CPAN::Config->{make_install_arg} || ''; $CPAN::Config->{make_install_arg} = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); # don't show start-up info $CPAN::Config->{inhibit_startup_message} = 1; # set additional options while ( my ( $opt, $arg ) = splice( @config, 0, 2 ) ) { ( $args{$opt} = $arg, next ) if $opt =~ /^(?:force|notest)$/; # pseudo-option $CPAN::Config->{$opt} = $arg; } if ($args{notest} && (not CPAN::Shell->can('notest'))) { die "Your version of CPAN is too old to support the 'notest' pragma"; } local $CPAN::Config->{prerequisites_policy} = 'follow'; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; print "*** Installing $pkg...\n"; my $obj = CPAN::Shell->expand( Module => $pkg ); my $success = 0; if ( $obj and _version_cmp( $obj->cpan_version, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = do { if ($args{force}) { CPAN::Shell->force( install => $pkg ) } elsif ($args{notest}) { CPAN::Shell->notest( install => $pkg ) } else { CPAN::Shell->install($pkg) } }; $rv ||= eval { $CPAN::META->instance( 'CPAN::Distribution', $obj->cpan_file, ) ->{install} if $CPAN::META; }; if ( $rv eq 'YES' ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation failed.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _has_cpanplus { return ( $HasCPANPLUS = ( $INC{'CPANPLUS/Config.pm'} or _load('CPANPLUS::Shell::Default') ) ); } # make guesses on whether we're under the CPAN installation directory sub _under_cpan { require Cwd; require File::Spec; my $cwd = File::Spec->canonpath( Cwd::getcwd() ); my $cpan = File::Spec->canonpath( $CPAN::Config->{cpan_home} ); return ( index( $cwd, $cpan ) > -1 ); } sub _update_to { my $class = __PACKAGE__; my $ver = shift; return if _version_cmp( _version_of($class), $ver ) >= 0; # no need to upgrade if ( _prompt( "==> A newer version of $class ($ver) is required. Install?", 'y' ) =~ /^[Nn]/ ) { die "*** Please install $class $ver manually.\n"; } print << "."; *** Trying to fetch it from CPAN... . # install ourselves _load($class) and return $class->import(@_) if $class->install( [], $class, $ver ); print << '.'; exit 1; *** Cannot bootstrap myself. :-( Installation terminated. . } # check if we're connected to some host, using inet_aton sub _connected_to { my $site = shift; return ( ( _load('Socket') and Socket::inet_aton($site) ) or _prompt( qq( *** Your host cannot resolve the domain name '$site', which probably means the Internet connections are unavailable. ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/ ); } # check if a directory is writable; may create it on demand sub _can_write { my $path = shift; mkdir( $path, 0755 ) unless -e $path; return 1 if -w $path; print << "."; *** You are not allowed to write to the directory '$path'; the installation may fail due to insufficient permissions. . if ( eval '$>' and lc(`sudo -V`) =~ /version/ and _prompt( qq( ==> Should we try to re-execute the autoinstall process with 'sudo'?), ((-t STDIN) ? 'y' : 'n') ) =~ /^[Yy]/ ) { # try to bootstrap ourselves from sudo print << "."; *** Trying to re-execute the autoinstall process with 'sudo'... . my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; return unless system( 'sudo', $^X, $0, "--config=$config", "--installdeps=$missing" ); print << "."; *** The 'sudo' command exited with error! Resuming... . } return _prompt( qq( ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/; } # load a module and return the version it reports sub _load { my $mod = pop; # method/function doesn't matter my $file = $mod; $file =~ s|::|/|g; $file .= '.pm'; local $@; return eval { require $file; $mod->VERSION } || ( $@ ? undef: 0 ); } # report version without loading a module sub _version_of { my $mod = pop; # method/function doesn't matter my $file = $mod; $file =~ s|::|/|g; $file .= '.pm'; foreach my $dir ( @INC ) { next if ref $dir; my $path = File::Spec->catfile($dir, $file); next unless -e $path; require ExtUtils::MM_Unix; return ExtUtils::MM_Unix->parse_version($path); } return undef; } # Load CPAN.pm and it's configuration sub _load_cpan { return if $CPAN::VERSION and $CPAN::Config and not @_; require CPAN; # CPAN-1.82+ adds CPAN::Config::AUTOLOAD to redirect to # CPAN::HandleConfig->load. CPAN reports that the redirection # is deprecated in a warning printed at the user. # CPAN-1.81 expects CPAN::HandleConfig->load, does not have # $CPAN::HandleConfig::VERSION but cannot handle # CPAN::Config->load # Which "versions expect CPAN::Config->load? if ( $CPAN::HandleConfig::VERSION || CPAN::HandleConfig->can('load') ) { # Newer versions of CPAN have a HandleConfig module CPAN::HandleConfig->load; } else { # Older versions had the load method in Config directly CPAN::Config->load; } } # compare two versions, either use Sort::Versions or plain comparison # return values same as <=> sub _version_cmp { my ( $cur, $min ) = @_; return -1 unless defined $cur; # if 0 keep comparing return 1 unless $min; $cur =~ s/\s+$//; # check for version numbers that are not in decimal format if ( ref($cur) or ref($min) or $cur =~ /v|\..*\./ or $min =~ /v|\..*\./ ) { if ( ( $version::VERSION or defined( _load('version') )) and version->can('new') ) { # use version.pm if it is installed. return version->new($cur) <=> version->new($min); } elsif ( $Sort::Versions::VERSION or defined( _load('Sort::Versions') ) ) { # use Sort::Versions as the sorting algorithm for a.b.c versions return Sort::Versions::versioncmp( $cur, $min ); } warn "Cannot reliably compare non-decimal formatted versions.\n" . "Please install version.pm or Sort::Versions.\n"; } # plain comparison local $^W = 0; # shuts off 'not numeric' bugs return $cur <=> $min; } # nothing; this usage is deprecated. sub main::PREREQ_PM { return {}; } sub _make_args { my %args = @_; $args{PREREQ_PM} = { %{ $args{PREREQ_PM} || {} }, @Existing, @Missing } if $UnderCPAN or $TestOnly; if ( $args{EXE_FILES} and -e 'MANIFEST' ) { require ExtUtils::Manifest; my $manifest = ExtUtils::Manifest::maniread('MANIFEST'); $args{EXE_FILES} = [ grep { exists $manifest->{$_} } @{ $args{EXE_FILES} } ]; } $args{test}{TESTS} ||= 't/*.t'; $args{test}{TESTS} = join( ' ', grep { !exists( $DisabledTests{$_} ) } map { glob($_) } split( /\s+/, $args{test}{TESTS} ) ); my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; $PostambleActions = ( ($missing and not $UnderCPAN) ? "\$(PERL) $0 --config=$config --installdeps=$missing" : "\$(NOECHO) \$(NOOP)" ); my $deps_list = join( ',', @Missing, @Existing ); $PostambleActionsUpgradeDeps = "\$(PERL) $0 --config=$config --upgradedeps=$deps_list"; my $config_notest = join( ',', (UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config}), 'notest', 1 ) if $Config; $PostambleActionsNoTest = ( ($missing and not $UnderCPAN) ? "\$(PERL) $0 --config=$config_notest --installdeps=$missing" : "\$(NOECHO) \$(NOOP)" ); $PostambleActionsUpgradeDepsNoTest = "\$(PERL) $0 --config=$config_notest --upgradedeps=$deps_list"; $PostambleActionsListDeps = '@$(PERL) -le "print for @ARGV" ' . join(' ', map $Missing[$_], grep $_ % 2 == 0, 0..$#Missing); my @all = (@Missing, @Existing); $PostambleActionsListAllDeps = '@$(PERL) -le "print for @ARGV" ' . join(' ', map $all[$_], grep $_ % 2 == 0, 0..$#all); return %args; } # a wrapper to ExtUtils::MakeMaker::WriteMakefile sub Write { require Carp; Carp::croak "WriteMakefile: Need even number of args" if @_ % 2; if ($CheckOnly) { print << "."; *** Makefile not written in check-only mode. . return; } my %args = _make_args(@_); no strict 'refs'; $PostambleUsed = 0; local *MY::postamble = \&postamble unless defined &MY::postamble; ExtUtils::MakeMaker::WriteMakefile(%args); print << "." unless $PostambleUsed; *** WARNING: Makefile written with customized MY::postamble() without including contents from Module::AutoInstall::postamble() -- auto installation features disabled. Please contact the author. . return 1; } sub postamble { $PostambleUsed = 1; my $fragment; $fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget; config :: installdeps \t\$(NOECHO) \$(NOOP) AUTO_INSTALL $fragment .= <<"END_MAKE"; checkdeps :: \t\$(PERL) $0 --checkdeps installdeps :: \t$PostambleActions installdeps_notest :: \t$PostambleActionsNoTest upgradedeps :: \t$PostambleActionsUpgradeDeps upgradedeps_notest :: \t$PostambleActionsUpgradeDepsNoTest listdeps :: \t$PostambleActionsListDeps listalldeps :: \t$PostambleActionsListAllDeps END_MAKE return $fragment; } 1; __END__ #line 1197 UnixAgent-2.10.0/inc/Module/Install.pm000066400000000000000000000327441432320066700174530ustar00rootroot00000000000000#line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.14'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. UnixAgent-2.10.0/inc/Module/Install/000077500000000000000000000000001432320066700171035ustar00rootroot00000000000000UnixAgent-2.10.0/inc/Module/Install/Base.pm000066400000000000000000000022571432320066700203210ustar00rootroot00000000000000#line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.14'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 UnixAgent-2.10.0/inc/Module/Install/Can.pm000066400000000000000000000067731432320066700201570ustar00rootroot00000000000000#line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 UnixAgent-2.10.0/inc/Module/Install/Fetch.pm000066400000000000000000000046401432320066700204760ustar00rootroot00000000000000#line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; UnixAgent-2.10.0/inc/Module/Install/Include.pm000066400000000000000000000010451432320066700210240ustar00rootroot00000000000000#line 1 package Module::Install::Include; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub include { shift()->admin->include(@_); } sub include_deps { shift()->admin->include_deps(@_); } sub auto_include { shift()->admin->auto_include(@_); } sub auto_include_deps { shift()->admin->auto_include_deps(@_); } sub auto_include_dependent_dists { shift()->admin->auto_include_dependent_dists(@_); } 1; UnixAgent-2.10.0/inc/Module/Install/Makefile.pm000066400000000000000000000321001432320066700211520ustar00rootroot00000000000000#line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overridden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overridden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 UnixAgent-2.10.0/inc/Module/Install/Metadata.pm000066400000000000000000000501071432320066700211640ustar00rootroot00000000000000#line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accommodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; UnixAgent-2.10.0/inc/Module/Install/Scripts.pm000066400000000000000000000011211432320066700210630ustar00rootroot00000000000000#line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; UnixAgent-2.10.0/inc/Module/Install/Win32.pm000066400000000000000000000035571432320066700203550ustar00rootroot00000000000000#line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; UnixAgent-2.10.0/inc/Module/Install/WriteAll.pm000066400000000000000000000026701432320066700211710ustar00rootroot00000000000000#line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; UnixAgent-2.10.0/lib/000077500000000000000000000000001432320066700142455ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/000077500000000000000000000000001432320066700167475ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent.pm000066400000000000000000000364431432320066700203550ustar00rootroot00000000000000#!/usr/bin/perl package Ocsinventory::Agent; use strict; use warnings; use POSIX ":sys_wait_h"; # THIS IS AN UGLY WORKAROUND FOR # http://rt.cpan.org/Ticket/Display.html?id=38067 use XML::Simple; eval {XMLout("b");}; if ($@){ no strict 'refs'; ${*{"XML::SAX::"}{HASH}{'parsers'}} = sub { return [ { 'Features' => { 'http://xml.org/sax/features/namespaces' => '1' }, 'Name' => 'XML::SAX::PurePerl' }] }; } # END OF THE UGLY FIX! require Exporter; use Ocsinventory::Logger; use Ocsinventory::Agent::XML::Inventory; use Ocsinventory::Agent::XML::Prolog; use Ocsinventory::Agent::Network; use Ocsinventory::Agent::Backend; use Ocsinventory::Agent::AccountConfig; use Ocsinventory::Agent::AccountInfo; use Ocsinventory::Agent::Config; use Ocsinventory::Agent::Hooks; #use Ocsinventory::Agent::Pid; use Ocsinventory::Agent::Common; sub run { # Load setting from the config file my $config = new Ocsinventory::Agent::Config; #$params->{$_} = $config->{$_} foreach (keys %$config); $ENV{LC_ALL} = 'C'; # Turn off localised output for commands $ENV{LANG} = 'C'; # Turn off localised output for commands ##################################### ################ MAIN ############### ##################################### ############################ #### CLI parameters ######## ############################ $config->loadUserParams(); # I close STDERR to avoid error message during the module execution # at the beginning I was doing shell redirection: # my @ret = `cmd 2> /dev/null`; # but this syntax is not supported on (at least) FreeBSD and Solaris # c.f: http://www.perlmonks.org/?node_id=571072 #my $tmp; #open ($tmp, ">&STDERR"); #$params->{"savedstderr"} = $tmp; #if($params->{debug}) { # $params->{verbose} = 1; #} else { # close(STDERR); #} if ($config->{config}{logfile}) { $config->{config}{logger} = 'File'; } my $logger = new Ocsinventory::Logger ({ config => $config->{config} }); my $common = new Ocsinventory::Agent::Common({ logger => $logger, config => $config->{config}, }); # $< == $REAL_USER_ID if ( $< ne '0' ) { $logger->info("You should run this program as super-user."); } if (not $config->{config}{scanhomedirs}) { $logger->debug("--scan-homedirs missing. Don't scan user directories"); } if ($config->{config}{nosoftware}) { $config->{config}{nosoftware} = 1 } # desactivate local mode even if it is set in config file or command line if (defined($config->{config}{nolocal})) { undef $config->{config}{'local'}; } # TODO put that in Ocsinventory::Agent::Config if (!$config->{config}{'stdout'} && !$config->{config}{'local'} && $config->{config}{server} !~ /^http(|s):\/\//) { $logger->debug("the --server passed doesn't have a protocol, assume http as default"); $config->{config}{server} = "http://".$config->{config}{server}.'/ocsinventory'; } ######################## Objects initilisation ############################################################### # The agent can contact different servers. Each server accountconfig is # stored in a specific file: if (!recMkdir ($config->{config}{basevardir})) { if (! -d $ENV{HOME}."/.ocsinventory/var") { $logger->info("Failed to create ".$config->{config}{basevardir}." directory: $!. ". "I'm going to use the home directory instead (~/.ocsinventory/var)."); } $config->{config}{basevardir} = $ENV{HOME}."/.ocsinventory/var"; if (!recMkdir ($config->{config}{basevardir})) { $logger->error("Failed to create ".$config->{config}{basedir}." directory: $!". "The HOSTID will not be written on the harddrive. You may have duplicated ". "entry of this computer in your OCS database"); } $logger->debug("var files are stored in ".$config->{config}{basevardir}); } if (defined($config->{config}{server}) && $config->{config}{server}) { my $dir = $config->{config}{server}; $dir =~ s/\//_/g; $config->{config}{vardir} = $config->{config}{basevardir}."/".$dir; if (defined ($config->{config}{local}) && $config->{config}{local}) { $logger->debug ("--server ignored since you also use --local"); $config->{config}{server} = undef; } } elsif (defined($config->{config}{local}) && $config->{config}{local}) { $config->{config}{vardir} = $config->{config}{basevardir}."/__LOCAL__"; } else { $logger->error("You must set either --server or --local"); } if (!recMkdir ($config->{config}{vardir})) { $logger->error("Failed to create ".$config->{config}{vardir}." directory: $!"); } if (-d $config->{config}{vardir}) { $config->{config}{accountconfig} = $config->{config}{vardir}."/ocsinv.conf"; $config->{config}{accountinfofile} = $config->{config}{vardir}."/ocsinv.adm"; $config->{config}{last_statefile} = $config->{config}{vardir}."/last_state"; $config->{config}{next_timefile} = $config->{config}{vardir}."/next_timefile"; } # Setting SSL CA file path if not set in configuration unless ($config->{config}{ca}) { # use server specific cacert.pem if it exists $config->{config}{ca} = $config->{config}{vardir}.'/cacert.pem'; # if no server specific cacert.pem, look for a bundle in our config dir unless (-e $config->{config}{vardir}.'/cacert.pem') { foreach (@{$config->{config}{etcdir}}) { if (-e $_.'/ocsinventory-agent-cacert.pem') { $config->{config}{ca} = $_.'/ocsinventory-agent-cacert.pem'; last; } } } } ################################################################################################################ ########################## load CFG files ###################################################################### my $accountconfig = new Ocsinventory::Agent::AccountConfig({ logger => $logger, config => $config->{config}, }); my $srv = $accountconfig->get('OCSFSERVER'); $config->{config}{server} = $srv if $srv; $config->{config}{deviceid} = $accountconfig->get('DEVICEID'); # Should I create a new deviceID? chomp(my $hostname = `uname -n| cut -d . -f 1`); if ((!$config->{config}{deviceid}) || $config->{config}{deviceid} !~ /\Q$hostname\E-(?:\d{4})(?:-\d{2}){5}/) { my ($YEAR, $MONTH , $DAY, $HOUR, $MIN, $SEC) = (localtime(time))[5,4,3,2,1,0]; $config->{config}{old_deviceid} = $config->{config}{deviceid}; $config->{config}{deviceid} =sprintf "%s-%02d-%02d-%02d-%02d-%02d-%02d", $hostname, ($YEAR+1900), ($MONTH+1), $DAY, $HOUR, $MIN, $SEC; $accountconfig->set('DEVICEID',$config->{config}{deviceid}); } my $accountinfo = new Ocsinventory::Agent::AccountInfo({ logger => $logger, # TODOparams => $params, config => $config->{config}, common => $common, }); # --lazy if ($config->{config}{lazy}) { my $nexttime = (stat($config->{config}{next_timefile}))[9]; if ($nexttime && $nexttime > time) { $logger->info("[Lazy] Must wait until ".localtime($nexttime)." exiting..."); exit 0; } } if ($config->{config}{daemon}) { $logger->debug("Time to call Proc::Daemon"); eval { require Proc::Daemon; }; if ($@) { print "Can't load Proc::Daemon. Is the module installed?"; exit 1; } Proc::Daemon::Init(); $logger->debug("Daemon started"); if (isAgentAlreadyRunning({ logger => $logger, })) { $logger->debug("An agent is already runnnig, exiting..."); exit 1; } } $logger->debug("OCS Agent initialised"); ################# Now we can create a context hash ######################################################### my $context = { installpath => $config->{config}->{vardir}, servername => $config->{config}->{server}, authuser => $config->{config}->{user}, authpwd => $config->{config}->{password}, authrealm => $config->{config}->{realm}, deviceid => $config->{config}->{deviceid}, version => $config->{VERSION}, config => $config->{config}, accountconfig => $accountconfig, accountinfo => $accountinfo, logger => $logger, common => $common, # OCS_AGENT_CMDL => "TOTO", # TODO cmd line parameter changed with the unified agent }; ################################# HERE WE GO !!! ################################################### while (1) { my $exitcode = 0; my $wait; my $child; if ($config->{config}{daemon} || $config->{config}{wait}) { my $serverdelay; if(($config->{config}{wait} eq 'server') || ($config->{config}{wait}!~/^\d+$/)){ $serverdelay = $accountconfig->get('PROLOG_FREQ')*3600; } else { $serverdelay = $config->{config}{wait}; } $wait = int rand($serverdelay?$serverdelay:$config->{config}{delaytime}); $logger->info("Going to sleep for $wait second(s)"); sleep ($wait); } # Create an hook object to use handlers of modules. my $hooks = new Ocsinventory::Agent::Hooks($context); # Using start_handler hook $hooks->run({name => 'start_handler'}); #################### Local Mode ####################### if ($config->{config}{stdout} || $config->{config}{local}) { # TODO, avoid to create Backend at two different places my $backend = new Ocsinventory::Agent::Backend ({ context => $context, }); my $inventory = new Ocsinventory::Agent::XML::Inventory ({ # TODO, check if the accoun{info,config} are needed in localmode backend => $backend, context => $context, }); # Launching inventory $inventory->initialise(); # Using inventory_writer hook $hooks->run({name => 'inventory_handler'}, $inventory); if ($config->{config}{stdout}) { $inventory->printXML(); } elsif ($config->{config}{local}) { $inventory->writeXML(); } } else { ############ I've to contact the server ########################" my $network = new Ocsinventory::Agent::Network ({ accountconfig => $accountconfig, accountinfo => $accountinfo, logger => $logger, config => $config->{config}, common => $common, }); # Adding the network object in $context $context->{network}= $network; my $sendInventory = 1; my $httpresp; my $prologresp; if (!$config->{config}{force}) { my $prolog = new Ocsinventory::Agent::XML::Prolog({ context => $context, }); # Using prolog_writer hook $hooks->run({name => 'prolog_writer'}, $prolog); # Formatting the XML my $prologXML = $prolog->getContent(); $httpresp = $network->sendXML({message => $prologXML}); $prologresp = $network->getXMLResp($httpresp,'Prolog'); if ($prologresp) { # Using prolog_reader hook $hooks->run({name => 'prolog_reader'}, $prologresp->getRawXML()); if (!$prologresp->isInventoryAsked()) { $sendInventory = 0; } } else { # Failed to reach the server if ($config->{config}{lazy}) { # To avoid flooding a heavy loaded server my $previousPrologFreq; if (!($previousPrologFreq = $accountconfig->get('PROLOG_FREQ'))){ $previousPrologFreq = $config->{config}{delaytime}; $logger->info("No previous PROLOG_FREQ found - using fallback delay(".$config->{config}{delaytime}." seconds)"); } else { $logger->info("Previous PROLOG_FREQ found ($previousPrologFreq)"); $previousPrologFreq = $previousPrologFreq*3600; } my $time = time + $previousPrologFreq; utime $time,$time,$config->{config}{next_timefile}; } exit 1 unless $config->{config}{daemon}; $sendInventory = 0; } } if (!$sendInventory) { $logger->info("Don't send the inventory"); } else { # Send the inventory! my $backend = new Ocsinventory::Agent::Backend ({ prologresp => $prologresp, context => $context, }); my $inventory = new Ocsinventory::Agent::XML::Inventory ({ # TODO, check if the accoun{info,config} are needed in localmode backend => $backend, context => $context, }); # Launching inventory $inventory->initialise(); # Using inventory_writer hook $hooks->run({name => 'inventory_handler'}, $inventory); # Formatting the XML my $inventoryXML = $inventory->getContent(); # Sending Inventory $httpresp = $network->sendXML({message => $inventoryXML}); if (my $invresp = $network->getXMLResp($httpresp,'Inventory')) { $inventory->saveLastState(); } else { exit (1) unless $config->{config}{daemon}; } } } # Using end_handler_hook $hooks->run({name => 'end_handler'}); # Avoid zombie process if ($^O ne 'darwin'){ do { $child = waitpid(-1, WNOHANG); } while $child > 0; } else { waitpid(-1, 0); } exit (0) unless $config->{config}{daemon}; } } ########################################## ############Functions##################### ########################################## sub recMkdir { my $dir = shift; my @t = split /\//, $dir; shift @t; return unless @t; my $t; foreach (@t) { $t .= '/'.$_; if ((!-d $t) && (!mkdir $t)) { return; } } 1; } sub isAgentAlreadyRunning { my $params = shift; my $logger = $params->{logger}; # TODO add a workaround if Proc::PID::File is not installed eval { require Proc::PID::File; }; if(!$@) { $logger->debug('Proc::PID::File available, checking for pid file'); if (Proc::PID::File->running()) { $logger->debug('parent process already exists'); return 1; } } return 0; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/000077500000000000000000000000001432320066700200055ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/AccountConfig.pm000066400000000000000000000036141432320066700230710ustar00rootroot00000000000000package Ocsinventory::Agent::AccountConfig; use strict; use warnings; # AccountConfig read and write the setting for the client given by the server # This file will be overwrite and is not designed to be changed by the user # DESPITE ITS NAME, ACCOUNTCONFIG IS NOT A CONFIG FILE! sub new { my (undef,$params) = @_; my $self = {}; bless $self; $self->{config} = $params->{config}; my $logger = $self->{logger} = $params->{logger}; # Configuration reading $self->{xml} = {}; if ($self->{config}->{accountconfig}) { if (! -f $self->{config}->{accountconfig}) { $logger->debug ('accountconfig file: `'. $self->{config}->{accountconfig}. " doesn't exist. I create an empty one"); $self->write(); } else { eval { $self->{xml} = XML::Simple::XMLin( $self->{config}->{accountconfig}, SuppressEmpty => undef ); }; } } $self; } sub get { my ($self, $name) = @_; my $logger = $self->{logger}; return $self->{xml}->{$name} if $name; return $self->{xml}; } sub set { my ($self, $name, $value) = @_; my $logger = $self->{logger}; $self->{xml}->{$name} = $value; $self->write(); # save the change } sub write { my ($self, $args) = @_; my $logger = $self->{logger}; return unless $self->{config}->{accountconfig}; my $xml = XML::Simple::XMLout( $self->{xml} , RootName => 'CONF', NoAttr => 1 ); my $fault; if (!open CONF, ">".$self->{config}->{accountconfig}) { $fault = 1; } else { print CONF $xml; $fault = 1 if (!close CONF); } if (!$fault) { $logger->debug ("ocsinv.conf updated successfully"); } else { $logger->error ("Can't save setting change in `".$self->{config}->{accountconfig}."'"); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/AccountInfo.pm000066400000000000000000000072541432320066700225630ustar00rootroot00000000000000package Ocsinventory::Agent::AccountInfo; use strict; use warnings; use Encode qw(decode); sub new { my (undef,$params) = @_; my $self = {}; bless $self; $self->{config} = $params->{config}; $self->{logger} = $params->{logger}; $self->{common} = $params->{common}; my $logger = $self->{logger} = $params->{logger}; if ($self->{config}->{accountinfofile}) { $logger->debug ('Accountinfo file: '. $self->{config}->{accountinfofile}); if (! -f $self->{config}->{accountinfofile}) { $logger->info ("Accountinfo file doesn't exist. I create an empty one."); $self->writeAccountInfoFile(); } else { my $xmladm; eval { $xmladm = $self->{common}->readXml($self->{config}->{accountinfofile}, [ 'ACCOUNTINFO' ]); }; if ($xmladm && exists($xmladm->{ACCOUNTINFO})) { # Store the XML content in a local HASH for(@{$xmladm->{ACCOUNTINFO}}){ if (!$_->{KEYNAME}) { $logger->debug ("Incorrect KEYNAME in ACCOUNTINFO"); } $self->{accountinfo}{ $_->{KEYNAME} } = $_->{KEYVALUE}; } } } } else { $logger->debug("No accountinfo file defined"); } if ($self->{config}->{tag}) { if ($self->{accountinfo}->{TAG}) { $logger->debug("A TAG seems to already exist in the ocsinv.adm file. ". "The -t parameter will be ignored. Don't forget that the TAG value ". "will be ignored by the server unless it has OCS_OPT_ACCEPT_TAG_UPDATE_FROM_CLIENT=1."); } else { $self->{accountinfo}->{TAG} = decode('UTF-8', $self->{config}->{tag}); } } $self; #Because we have already blessed the object } # Add accountinfo stuff to an inventory sub setAccountInfo { my $self = shift; my $inventory = shift; #my $ai = $self->getAll(); $self->{xmlroot}{'CONTENT'}{ACCOUNTINFO} = []; my $ai = $self->{accountinfo}; return unless $ai; foreach (keys %$ai) { push @{$inventory->{xmlroot}{'CONTENT'}{ACCOUNTINFO}}, { KEYNAME => [$_], KEYVALUE => [$ai->{$_}], }; } } sub writeAccountInfoFile { my ($self, $ref) = @_; my $logger = $self->{logger}; my $content; $content->{ACCOUNTINFO} = []; #We clear accountinfo to store the new one undef $self->{accountinfo}; #We get values sent by server if (ref ($ref) =~ /^ARRAY$/) { foreach (@$ref) { $self->{accountinfo}->{$_->{KEYNAME}} = $_->{KEYVALUE} if defined ($_->{KEYNAME}) && defined ($_->{KEYVALUE}); } } elsif (ref ($ref) =~ /^HASH$/) { $self->{accountinfo}->{$ref->{KEYNAME}} = $ref->{KEYVALUE} if defined ($ref->{KEYNAME}) && defined ($ref->{KEYVALUE}); } else { $logger->debug ("Invalid parameter while writing accountinfo file"); } #We feed our XML for accountinfo file foreach (keys %{$self->{accountinfo}}) { push @{$content->{ACCOUNTINFO}}, {KEYNAME => [$_], KEYVALUE => [$self->{accountinfo}{$_}]}; } my $xml=XML::Simple::XMLout($content, RootName => 'ADM', XMLDecl=> ''); #We write accountinfo file my $fault; if (!open ADM, ">".$self->{config}->{accountinfofile}) { $fault = 1; } else { print ADM $xml; $fault = 1 unless close ADM; } if (!$fault) { $logger->debug ("Account info updated successfully"); } else { $logger->error ("Can't save account info in `". $self->{config}->{accountinfofile}); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend.pm000066400000000000000000000274231432320066700217020ustar00rootroot00000000000000package Ocsinventory::Agent::Backend; use strict; no strict 'refs'; use warnings; #use ExtUtils::Installed; sub new { my (undef, $params) = @_; my $self = {}; $self->{accountconfig} = $params->{context}->{accountconfig}; $self->{accountinfo} = $params->{context}->{accountinfo}; $self->{config} = $params->{context}->{config}; $self->{inventory} = $params->{inventory}; $self->{common} = $params->{context}->{common}; my $logger = $self->{logger} = $params->{context}->{logger}; $self->{prologresp} = $params->{prologresp}; $self->{modules} = {}; $self->{backendSharedFuncs} = { can_run => sub { my $binary = shift; my $calling_namespace = caller(0); chomp(my $binpath=`which $binary 2>/dev/null`); return unless -x $binpath; $self->{logger}->debug(" - $binary found"); 1 }, can_load => sub { my $module = shift; my $calling_namespace = caller(0); eval "package $calling_namespace; use $module;"; # print STDERR "$module not loaded in $calling_namespace! $!: $@\n" if $@; return if $@; $self->{logger}->debug(" - $module loaded"); # print STDERR "$module loaded in $calling_namespace!\n"; 1; }, can_read => sub { my $file = shift; return unless -r $file; $self->{logger}->debug(" - $file can be read"); 1; }, runcmd => sub { my $cmd = shift; return unless $cmd; # $self->{logger}->debug(" - run $cmd"); return `$cmd`; } }; bless $self; } sub initModList { my $self = shift; my $logger = $self->{logger}; my $config = $self->{config}; my @dirToScan; my @installed_mods; my @installed_files; # This is a workaround for PAR::Packer. Since it resets @INC # I can't find the backend modules to load dynamically. So # I prepare a list and include it. eval "use Ocsinventory::Agent::Backend::ModuleToLoad;"; if (!$@) { $logger->debug("use Ocsinventory::Agent::Backend::ModuleToLoad to get the modules ". "to load. This should not append unless you use the standalone agent built with ". "PAR::Packer (pp)"); push @installed_mods, @Ocsinventory::Agent::Backend::ModuleToLoad::list; } if ($config->{devlib}) { # devlib enable, I only search for backend module in ./lib push (@dirToScan, './lib'); } else { # my ($inst) = ExtUtils::Installed->new(); # eval {@installed_files = # $inst->files('Ocsinventory')}; # ExtUtils::Installed is nice but it needs properly installed package with # .packlist # This is a workaround for 'invalide' installations... foreach (@INC) { next if ! -d || (-l && -d readlink) || /^(\.|lib)$/; push @dirToScan, $_; } } if (@dirToScan) { eval {require File::Find}; if ($@) { $logger->debug("Failed to load File::Find"); } else { # here I need to use $d to avoid a bug with AIX 5.2's perl 5.8.0. It # changes the @INC content if i use $_ directly # thanks to @rgs on irc.perl.org File::Find::find( { wanted => sub { push @installed_files, $File::Find::name if $File::Find::name =~ /Ocsinventory\/Agent\/Backend\/.*\.pm$/; }, follow => 1, follow_skip => 2 } , @dirToScan); } } foreach my $file (@installed_files) { my $t = $file; next unless $t =~ s!.*?(Ocsinventory/Agent/Backend/)(.*?)\.pm$!$1$2!; my $m = join ('::', split /\//, $t); push @installed_mods, $m; } if (!@installed_mods) { $logger->info("ZERO backend module found! Is Ocsinventory-Agent ". "correctly installed? Use the --devlib flag if you want to run the agent ". "directly from the source directory.") } foreach my $m (@installed_mods) { my @runAfter; my @runMeIfTheseChecksFailed; my $enable = 1; if (exists ($self->{modules}->{$m}->{name})) { $logger->debug($m." already loaded."); next; } eval "use $m;"; if ($@) { $logger->debug ("Failed to load $m: $@"); $enable = 0; } my $package = $m."::"; # Load in the module the backendSharedFuncs # foreach my $func (keys %{$self->{backendSharedFuncs}}) { # $package->{$func} = $self->{backendSharedFuncs}->{$func}; # } $self->{modules}->{$m}->{name} = $m; $self->{modules}->{$m}->{done} = 0; $self->{modules}->{$m}->{inUse} = 0; $self->{modules}->{$m}->{enable} = $enable; $self->{modules}->{$m}->{checkFunc} = $package->{"check"}; $self->{modules}->{$m}->{runAfter} = $package->{'runAfter'}; $self->{modules}->{$m}->{runMeIfTheseChecksFailed} = $package->{'runMeIfTheseChecksFailed'}; # $self->{modules}->{$m}->{replace} = \@replace; $self->{modules}->{$m}->{runFunc} = $package->{'run'}; $self->{modules}->{$m}->{mem} = {}; # Load the Storable object is existing or return undef $self->{modules}->{$m}->{storage} = $self->retrieveStorage($m); } # the sort is just for the presentation foreach my $m (sort keys %{$self->{modules}}) { next unless $self->{modules}->{$m}->{checkFunc}; # find modules to disable and their submodules if($self->{modules}->{$m}->{enable} && !$self->runWithTimeout( $m, $self->{modules}->{$m}->{checkFunc}, { accountconfig => $self->{accountconfig}, accountinfo => $self->{accountinfo}, config => $self->{config}, inventory => $self->{inventory}, logger => $self->{logger}, params => $self->{params}, # Compatibiliy with agent 0.0.10 <= prologresp => $self->{prologresp}, mem => $self->{modules}->{$m}->{mem}, storage => $self->{modules}->{$m}->{storage}, common => $self->{common}, })) { $logger->debug ($m." ignored"); foreach (keys %{$self->{modules}}) { $self->{modules}->{$_}->{enable} = 0 if /^$m($|::)/; } } # add submodule in the runAfter array my $t; foreach (split /::/,$m) { $t .= "::" if $t; $t .= $_; if (exists $self->{modules}->{$t} && $m ne $t) { push @{$self->{modules}->{$m}->{runAfter}}, \%{$self->{modules}->{$t}} } } } # Remove the runMeIfTheseChecksFailed if needed foreach my $m (sort keys %{$self->{modules}}) { next unless $self->{modules}->{$m}->{enable}; next unless $self->{modules}->{$m}->{runMeIfTheseChecksFailed}; foreach my $condmod (@{${$self->{modules}->{$m}->{runMeIfTheseChecksFailed}}}) { if ($self->{modules}->{$condmod}->{enable}) { foreach (keys %{$self->{modules}}) { next unless /^$m($|::)/ && $self->{modules}->{$_}->{enable}; $self->{modules}->{$_}->{enable} = 0; $logger->debug ("$_ disabled because of a 'runMeIfTheseChecksFailed' in '$m'\n"); } } } } } sub runMod { my ($self, $params) = @_; my $logger = $self->{logger}; my $m = $params->{modname}; my $common = $params->{common}; return if (!$self->{modules}->{$m}->{enable}); return if ($self->{modules}->{$m}->{done}); $self->{modules}->{$m}->{inUse} = 1; # lock the module # first I run its "runAfter" foreach (@{$self->{modules}->{$m}->{runAfter}}) { if (!$_->{name}) { # The name is defined during module initialisation so if I # can't read it, I can suppose it had not been initialised. $logger->fault ("Module `$m' need to be runAfter a module not found.". "Please fix its runAfter entry or add the module."); } if ($_->{inUse}) { # In use 'lock' is taken during the mod execution. If a module # need a module also in use, we have provable an issue :). $logger->fault ("Circular dependency hell with $m and $_->{name}"); } $self->runMod({ common => $common, modname => $_->{name}, }); } $logger->debug ("Running $m"); if ($self->{modules}->{$m}->{runFunc}) { $self->runWithTimeout( $m, $self->{modules}->{$m}->{runFunc}, { accountconfig => $self->{accountconfig}, accountinfo => $self->{accountinfo}, config => $self->{config}, common => $common, logger => $logger, params => $self->{params}, # For compat with agent 0.0.10 <= prologresp => $self->{prologresp}, mem => $self->{modules}->{$m}->{mem}, storage => $self->{modules}->{$m}->{storage}, common => $self->{common}, } ); } else { $logger->debug("$m has no run() function -> ignored"); } $self->{modules}->{$m}->{done} = 1; $self->{modules}->{$m}->{inUse} = 0; # unlock the module $self->saveStorage($m, $self->{modules}->{$m}->{storage}); } sub feedInventory { my ($self, $params) = @_; my $common = $self->{common}; my $inventory; if ($params->{inventory}) { $inventory = $params->{inventory}; } if (!keys %{$self->{modules}}) { $self->initModList(); } my $begin = time(); foreach my $m (sort keys %{$self->{modules}}) { die ">$m Houston!!!" unless $m; $self->runMod ({ common => $common, modname => $m, }); } # Execution time # $common->setHardware({ETIME => time() - $begin}); $inventory->{xmlroot}->{CONTENT} = $common->{xmltags}; } sub retrieveStorage { my ($self, $m) = @_; my $logger = $self->{logger}; my $storagefile = $self->{config}->{vardir}."/$m.storage"; if (!exists &retrieve) { eval "use Storable;"; if ($@) { $logger->debug("Storable.pm is not available, can't load Backend module data"); return; } } return (-f $storagefile)?retrieve($storagefile):{}; } sub saveStorage { my ($self, $m, $data) = @_; my $logger = $self->{logger}; # Perl 5.6 doesn't provide Storable.pm if (!exists &store) { eval "use Storable;"; if ($@) { $logger->debug("Storable.pm is not available, can't save Backend module data"); return; } } my $storagefile = $self->{config}->{vardir}."/$m.storage"; if ($data && keys (%$data)>0) { store ($data, $storagefile) or die; } elsif (-f $storagefile) { unlink $storagefile; } } sub runWithTimeout { my ($self, $m, $func, $params) = @_; my $logger = $self->{logger}; my $ret; eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n require my $timeout = $params->{config}{backendCollectTimeout}; alarm $timeout; $ret = &{$func}($params); }; alarm 0; if ($@) { if ($@ ne "alarm\n") { $logger->debug("runWithTimeout(): unexpected error: $@"); } else { $logger->debug("$m killed by a timeout."); return; } } else { return $ret; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/000077500000000000000000000000001432320066700213345ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/AccessLog.pm000066400000000000000000000006301432320066700235340ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::AccessLog; sub run { my $params = shift; my $common = $params->{common}; my ($YEAR, $MONTH , $DAY, $HOUR, $MIN, $SEC) = (localtime (time))[5,4,3,2,1,0]; my $date=sprintf "%02d-%02d-%02d %02d:%02d:%02d", ($YEAR+1900), ($MONTH+1), $DAY, $HOUR, $MIN, $SEC; $common->setAccessLog ({ USERID => 'N/A', LOGDATE => $date }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/DeviceID.pm000066400000000000000000000007551432320066700233150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::DeviceID; # Initialise the DeviceID. In fact this value is a bit specific since # it generates in the main script. sub run { my $params = shift; my $common = $params->{common}; my $config = $params->{config}; my $UsersLoggedIn = join "/", keys %user; if ($config->{old_deviceid}) { $common->setHardware({ OLD_DEVICEID => $config->{old_deviceid} }); } $common->setHardware({ DEVICEID => $config->{deviceid} }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/IpDiscover.pm000066400000000000000000000004231432320066700237400ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::IpDiscover; use strict; sub check { my $params = shift; my $prologresp = $params->{prologresp}; my $mem = $params->{mem}; return unless ($prologresp && $prologresp->getOptionsInfoByName("IPDISCOVER")); 1; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/IpDiscover/000077500000000000000000000000001432320066700234035ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/IpDiscover/IpDiscover.pm000066400000000000000000000041631432320066700260140ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::IpDiscover::IpDiscover; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("ipdiscover"); } sub run { my $params = shift; my $common = $params->{common}; my $prologresp = $params->{prologresp}; my $logger = $params->{logger}; # Let's find network interfaces and call ipdiscover on it my $options = $prologresp->getOptionsInfoByName("IPDISCOVER"); my $ipdisc_lat; my $network; if ($options->[0] && exists($options->[0]->{IPDISC_LAT}) && $options->[0]->{IPDISC_LAT}) { $ipdisc_lat = $options->[0]->{IPDISC_LAT}; } if ($options->[0] && exists($options->[0]->{content})) { $network = $options->[0]->{content}; } else { return; } $logger->debug("Scanning the $network network"); my $legacymode; if ( `ipdiscover` =~ /binary ver. (\d+)/ ){ if (!($1>3)) { $legacymode = 1; $logger->debug("ipdiscover ver.$1: legacymode"); } } my $ifname; if ($common->can_run("ip")) { foreach (`ip route`) { if (/^default via (\d+\d.\d+\.\d+\.\d+) dev (\S+).*/) { if ($network = $1 ){ $ifname = $2; last; } } } } elsif ($common->can_run("route")){ foreach (`route -n`) { if (/^(\d+\.\d+\.\d+\.\d+).*?\s(\S+)$/) { if ($network eq $1) { $ifname = $2; last; } elsif (!$ifname && $1 eq "0.0.0.0") { $ifname = $2; } } } } if ($ifname) { my $cmd = "ipdiscover $ifname "; $cmd .= $ipdisc_lat if ($ipdisc_lat && !$legacymode); foreach (`$cmd`) { if (/([\d\.]*)<\/I>([\w\:]*)<\/M>(\S*)<\/N><\/H>/) { $common->addIpDiscoverEntry({ IPADDRESS => $1, MACADDR => $2, NAME => $3 }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/IpDiscover/Nmap.pm000066400000000000000000000037751432320066700246500ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::IpDiscover::Nmap; use vars qw($runMeIfTheseChecksFailed); $runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::IpDiscover::IpDiscover"]; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("nmap"); return unless $common->can_load("Nmap::Parser"); # Do we have nmap 3.90 (or >) foreach (`nmap -v 2>&1`) { if (/^Starting Nmap (\d+)\.(\d+)/) { my $release = $1; my $minor = $2; if ($release > 3 || ($release > 3 && $minor >= 90)) { return 1; } } } 0; } sub run { my $params = shift; my $common = $params->{common}; my $prologresp = $params->{prologresp}; my $logger = $params->{logger}; # Let's find network interfaces and call ipdiscover on it my $options = $prologresp->getOptionsInfoByName("IPDISCOVER"); my $network; if ($options->[0] && exists($options->[0]->{content})) { $network = $options->[0]->{content}; } else { return; } unless ($network =~ /^\d+\.\d+\.\d+\.\d+$/) { return; } #Let's go scanning the network and parsing the results $logger->debug("Scanning the $network network"); my $nmaparser = new Nmap::Parser; $nmaparser->parsescan("nmap","-sn","-PR","$network/24"); for my $host ($nmaparser->all_hosts("up")){ my $ip = $host->addr; my $mac = $host->mac_addr; my $hostname = $host->hostname; if ($hostname eq 0) { $hostname = undef; #it's better to send nothing instead of a '0' } if ($mac) { $logger->debug("Host $ip found using Nmap. Adding informations in XML"); # Feeding the Inventory XML $common->addIpDiscoverEntry({ IPADDRESS => $ip, MACADDR => lc($mac), NAME => $hostname, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/000077500000000000000000000000001432320066700216555ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX.pm000066400000000000000000000015071432320066700226370ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; sub check { my $r; $r = 1 if $^O =~ /^aix$/; $r; } sub run { my $params = shift; my $common = $params->{common}; my @tabOS; my $OSName; my $OSComment; my $OSVersion; my $OSLevel; # Operating system informations chomp($OSName=`uname -s`); # AIX OSVersion = oslevel, OSComment=oslevel -r affiche niveau de maintenance chomp($OSVersion=`oslevel`); chomp($OSLevel=`oslevel -r`); @tabOS=split(/-/,$OSLevel); $OSComment="Maintenance Level :".@tabOS[1]; $OSVersion =~ s/(.0)*$//; $common->setHardware({ OSNAME => "$OSName $OSVersion", OSCOMMENTS => $OSComment, OSVERSION => $OSLevel, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/000077500000000000000000000000001432320066700222765ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/CPU.pm000066400000000000000000000043031432320066700232630ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::CPU; use strict; use warnings; sub check { 1 } # try to simulate a modern lsattr output on AIX4 sub lsattrForAIX4 { my $device = shift; my @lsattr; my @lsattrtemp=`lsattr -EOl $device -a 'state:type'`; for (@lsattrtemp) { chomp; my $frequency; my (undef,$type)=split /:/; # # On older models, frequency is based on cpu model and uname # if ( $type eq "PowerPC" or $type eq "PowerPC_601" or $type eq "PowerPC_604") { my $uname=`uname -m`; $frequency=112000000 if ($uname=~/E1D|EAD|C1D|R04|C4D|R4D/); $frequency=133000000 if ($uname=~/34M/); $frequency=150000000 if ($uname=~/N4D/); $frequency=200000000 if ($uname=~/X4M|X4D/); $frequency=225000000 if ($uname=~/N4E|K04|K44/); $frequency=320000000 if ($uname=~/N4F/); $frequency=360000000 if ($uname=~/K45/); } elsif ( $type eq "PowerPC_RS64_III" ) { $frequency=400000000; } elsif ( $type eq "PowerPC_620" ) { $frequency=172000000; } else { $frequency=225000000; } push @lsattr,"$device:$frequency\n"; } } sub run { my $params = shift; my $common = $params->{common}; # TODO Need to be able to register different CPU speed! my $processort; my $processorn; my $processors; my $frequency; my @lsdev; my @lsattr; #lsdev -Cc processor -F name #lsattr -EOl proc16 my $aixversion=`uname -v`; for (`lsdev -Cc processor -F name`){ chomp(my $device = $_); if ( $aixversion < 5 ) { @lsattr=lsattrForAIX4($device); } else { @lsattr=`lsattr -EOl $device -a 'state:type:frequency'`; } for (@lsattr) { if ( ! /^#/ && /(.+):(.+):(.+)/ ) { $processorn++; $processort=$2; if ( ($3 % 1000000) >= 50000){ $processors=int (($3/1000000) +1); } else { $processors=int (($3/1000000)); } } } } $processort =~ s/_/ /; $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors }); } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Controller.pm000066400000000000000000000014141432320066700247570ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Controller; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run('lsdev'); my @lsdev = `lsdev -Cc adapter -F 'name:type:description'`; return 1 if @lsdev; 0 } sub run { my $params = shift; my $common = $params->{common}; my $name; my $type; my $manufacturer; for (`lsdev -Cc adapter -F 'name:type:description'`){ chomp($_); /^(.+):(.+):(.+)/; my $name = $1; my $type = $2; my $manufacturer = $3; $common->addController({ 'NAME' => $name, 'MANUFACTURER' => $manufacturer, 'TYPE' => $type, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Domains.pm000066400000000000000000000012231432320066700242240ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Domains; use strict; sub run { my $params = shift; my $common = $params->{common}; my $domain; # Domain name open RESOLV, "/etc/resolv.conf"; while(){ if (/^(domain|search)\s+(.+)/){ $domain=$2; chomp($domain); } } # If no domain name and no workgroup name (samba), we send "WORKGROUP" # TODO:Check if samba is present and get the windows workgroup or NT domain name unless (defined($domain)){chomp($domain="WORKGROUP");} $domain=~s/^.\.(.)/$1/; $common->setHardware({ WORKGROUP => $domain }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Drives.pm000066400000000000000000000021061432320066700240670ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Drives; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("df"); 1; } sub run { my $params = shift; my $common = $params->{common}; my $free; my $filesystem; my $total; my $type; my $volumn; my @fs; my @fstype; #Looking for mount points and disk space # Aix option -kP for (`df -kP`) { next if /^Filesystem\s*1024-blocks.*/; if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\n/) { $volumn = $1; @fs=`lsfs -c $6`; @fstype = split /:/,$fs[1]; $filesystem = $fstype[2]; $total = sprintf("%i",($2/1024)); $free = sprintf("%i",($4/1024)); $type = $6; } next if $filesystem =~ /procfs/; $common->addDrive({ FREE => $free, FILESYSTEM => $filesystem, TOTAL => $total, TYPE => $type, VOLUMN => $volumn }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Hardware.pm000066400000000000000000000037231432320066700243760ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Hardware; use strict; sub check { 1 } # NOTE: # Q: SSN can also use `uname -n`? What is the best? # A: uname -n since it doesn't need root priv sub run { my $params = shift; my $common = $params->{common}; # Using "type 0" section my( $SystemSerial , $SystemModel, $SystemManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate); # lsvpd my @lsvpd = `lsvpd`; # Remove * (star) at the beginning of lines s/^\*// for (@lsvpd); # Search Firmware Hard my $flag=0; my $fw; for (@lsvpd){ if (/^DS Platform Firmware/) { $flag=1 }; if ( ($flag) && /^RM (.+)/) {$fw=$1;chomp($fw);$fw =~ s/(\s+)$//g;last}; } $flag=0; for (@lsvpd){ if (/^DS System Firmware/) { $flag=1 }; if ( ($flag) && /^RM (.+)/) {$BiosVersion=$1;chomp($BiosVersion);$BiosVersion =~ s/(\s+)$//g;last}; } $flag=0; for (@lsvpd){ if (/^DS System VPD/) { $flag=1 }; if ( ($flag) && /^TM (.+)/) {$SystemModel=$1;chomp($SystemModel);$SystemModel =~ s/(\s+)$//g;}; if ( ($flag) && /^SE (.+)/) {$SystemSerial=$1;chomp($SystemSerial);$SystemSerial =~ s/(\s+)$//g;}; if ( ($flag) && /^FC .+/) {$flag=0;last} } # Fetch the serial number like prtconf do if (! $SystemSerial) { $flag=0; foreach (`lscfg -vpl sysplanar0`) { if ($flag) { if (/\.+(\S*?)$/) { $SystemSerial = $1; } last; } else { $flag = 1 if /\s+System\ VPD/; } } } $BiosManufacturer='IBM'; $SystemManufacturer='IBM'; $BiosVersion .= "(Firmware :".$fw.")"; # Writing data $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/IPv4.pm000066400000000000000000000011031432320066700234110ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::IPv4; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("ifconfig") } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my @ip; # Looking for ip addresses with ifconfig, except loopback # AIX need -a option for (`ifconfig -a`){#ifconfig in the path # AIX ligne inet if(/^\s*inet\s+(\S+).*/){($1=~/^127.+/)?next:push @ip, $1}; } $ip=join "/", @ip; $common->setHardware({IPADDR => $ip}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/LVM.pm000066400000000000000000000073061432320066700233000ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::LVM; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::AIX::Drives"]; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("lspv") || $common->can_run('lsvg') || $common->can_run('lslv'); 1 } my $line; sub run { my $params = shift; my $common = $params->{common}; my @physvol; my @volgrp; my $format; my $total; my $total_pps; my $free; my $free_pps; my $lps; my $volume_name; my $volume_size; my $volume_uuid; my $status; my $vg_name; my $type; use constant MB => (1024*1024); # We retrieve the disk list foreach my $line (`lspv`) { chomp; my ($name) = split(/\s+/, $line); push @physvol, $name; } foreach my $nom (@physvol) { foreach my $line (`lspv $nom`){ if ($line =~ /PHYSICAL VOLUME:\s+(\S+)/) { $format = "AIX PV"; } if ($line =~ /PV STATE:\ss+(\S+)/) { $status = $1; } if ($line =~ /FREE PPs:\s+(\d+)/) { $free_pps = $1; } if ($line =~ /TOTAL PPs:\s+(\d+)/) { $total_pps = $1; } if ($line =~ /VOLUME GROUP:\s+(\S+)/) { $vg_name = "VG $1"; } if ($line =~ /PP SIZE:\s+(\d+)/) { $volume_size = $1; } if ($line =~ /PV IDENTIFIER:\s+(\S+)/) { $volume_uuid = $1; } if ($volume_size){ $total = $total_pps * $volume_size; $free = $free_pps * $volume_size; } $common->addDrive({ FREE => $free, FILESYSTEM => $format, TOTAL => $total, TYPE => "DISK", VOLUMN => $status, SERIAL => $volume_uuid }); } } foreach my $nom (@physvol) { foreach my $line (`lslv $nom`){ if ($line =~ /LV IDENTIFIER:\s+(\S+)/) { $volume_uuid = $1; } if ($line =~ /LV STATE:\s+(\S+)/) { $status = $1; } if ($line =~ /PP SIZE:\s+(\d+)/) { $volume_size = $1; } if ($line =~ /LPs:\s+(\d+)/) { $lps = $1; } if ($line =~ /TYPE:\s+(\S+)/) { $type = $1; } $total = $lps * $volume_size; $common->addDrive({ FREE => "", FILESYSTEM => "", TOTAL => $total, TYPE => $type, VOLUMN => $status, SERIAL => $volume_uuid }); } } # We retrieve the disk list foreach my $line (`lsvg`) { chomp; my ($name) = split(/\s+/, $line); push @volgrp, $name; } foreach my $nom (@volgrp) { foreach my $line (`lsvg $nom`){ if ($line =~ /VG IDENTIFIER:\s+(\S+)/) { $volume_uuid = $1; } if ($line =~ /VG STATE:\s+(\S+)/) { $status = $1; } if ($line =~ /TOTAL PPs:\s+(\d+)/) { $volume_size = $1; } if ($line =~ /FREE PPs:\s+(\d+)/) { $free = $1; } $common->addDrive({ FREE => $free, FILESYSTEM => "", TOTAL => $volume_size, TYPE => "AIX VG", VOLUMN => $status, SERIAL => $volume_uuid }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Mem.pm000066400000000000000000000016071432320066700233560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Mem; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("lsdev"); return unless $common->can_run("which"); return unless $common->can_run("lsattr"); } sub run { my $params = shift; my $common = $params->{common}; my $memory; my $swap; # Memory informations # lsdev -Cc memory -F 'name' -t totmem # lsattr -EOlmem0 my (@lsdev, @lsattr, @grep); $memory=0; @lsdev=`lsdev -Cc memory -F 'name' -t totmem`; for (@lsdev){ $memory += `lsattr -a size -F value -El$_`; } # Paging Space @grep=`lsps -s`; for (@grep){ if ( ! /^Total/){ /^\s*(\d+)\w*\s+\d+.+/; $swap=$1; } } $common->setHardware({ MEMORY => $memory, SWAP => $swap }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Memory.pm000066400000000000000000000035561432320066700241150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Memory; use strict; sub check { 1 } # TODO create a better check here sub run { my $params = shift; my $common = $params->{common}; my $capacity; my $description; my $numslots; my $speed; my $type; my $n; my $serial; my $mversion; my $caption; my $flag=0; #lsvpd my @lsvpd = `lsvpd`; # Remove * (star) at the beginning of lines s/^\*// for (@lsvpd); $numslots = -1; for (@lsvpd){ if (/^DS Memory DIMM/){ $description = $_; $flag=1; (defined($n))?($n++):($n=0); $description =~ s/DS //; $description =~ s/\n//; } if((/^SZ (.+)/) && ($flag)) {$capacity = $1;} if((/^PN (.+)/) && ($flag)) {$type = $1;} # localisation slot dans type if((/^YL\s(.+)/) && ($flag)) {$caption = "Slot ".$1;} if((/^SN (.+)/) && ($flag)) {$serial = $1;} if((/^VK (.+)/) && ($flag)) {$mversion = $1}; #print $numslots."\n"; # On rencontre un champ FC alors c'est la fin pour ce device if ((/^FC .+/) && ($flag)) { $flag=0; $numslots = $numslots +1; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, NUMSLOTS => $numslots, VERSION => $mversion, TYPE => $type, SERIALNUMBER=> $serial, }); } } #$numslots = $numslots +1; # End of Loop # The last *FC ???????? missing # $common->addMemory({ # CAPACITY => $capacity, # DESCRIPTION => $description, # CAPTION => $caption, # NUMSLOTS => $numslots, # VERSION => $mversion, # TYPE => $type, # SERIALNUMBER=> $serial, #}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Modems.pm000066400000000000000000000010671432320066700240640ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Modems; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsdev") } sub run { my $params = shift; my $common = $params->{common}; for (`lsdev -Cc adapter -F 'name:type:description'`){ if (/modem/i && /\d+\s(.+):(.+)$/){ my $name = $1; my $description = $2; $common->addModems({ 'DESCRIPTION' => $description, 'NAME' => $name, }); } } } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Networks.pm000066400000000000000000000100211432320066700244420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Networks; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_load("Net::IP qw(:PROC)"); } sub run { my $params = shift; my $common = $params->{common}; my %info; my $ifname; foreach (`lscfg -v -l en*`) { $ifname = "en".$1 if /^\s+ent(\d+)\s+\S+\s+(.+)/; if ($ifname) { $info{$ifname}{type} = $2; $info{$ifname}{status} = "Down"; # default is down if (/Network Address\.+(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})/) { $info{$ifname}{macaddr} = "$1:$2:$3:$4:$5:$6" } } } # Retrieve VLAN information on AIX # Only tested on AIX 6.1 my $pifname; foreach (`lsdev`) { if (/^ent(\d+).*VLAN$/) { $ifname = "en".$1; $pifname = "ent".$1; $info{$ifname}{type} = "VLAN"; $info{$ifname}{status} = "Down"; foreach (`entstat -d $ifname`) { if (/Hardware Address:\s+(.+)$/) { $info{$ifname}{macaddr}="$1"; last; } } foreach (`lsattr -El $pifname`) { if (/^vlan_tag_id\s+(\d+)/) { $info{$ifname}{type}.="$1"; } } } } # uncomment if you prefere verbose information about the link # e.g: 0xe8120000:0xe80c0000:741:3:512:1024:8192:Auto_Negotiation:2048:no:0x000000000000:10000:10:1000:yes:yes:no:no:yes:2048 # etherchannel interfaces # my @lsdev=`lsdev -Cc adapter -s pseudo -t ibm_ech`; # foreach (`lsdev -Cc adapter`) { # next unless /^ent(\d*)\s*(\w*)\s*.*/; # my $ifname = "en".$1; # my $tmpifname = "ent".$1; # #@lsattr=`lsattr -EOl $1 -a 'adapter_names mode netaddr'`; # foreach (`lsattr -EOl $tmpifname`) { # if (/(.+):(.+):(.*)/) { # $info{$ifname}{type}="EtherChannel with : ".$1." (mode :".$2.", ping :".$3.")"; # } # } # $info{$ifname}{status} = 'Down'; # The same # } foreach (split / /,`ifconfig -l`) { # AIX: network interface naming is enX if (/^(en\d+)/) { my $ifname = $1; foreach (`lsattr -E -l $ifname`) { $info{$ifname}{ip} = $1 if /^netaddr \s*([\d*\.?]*).*/i; $info{$ifname}{netmask} = $1 if /^netmask\s*([\d*\.?]*).*/i; $info{$ifname}{status} = $1 if /^state\s*(\w*).*/i; } } } # Looking for the gateways # AIX: the route command doesn't exist. We use netstat -rn instead foreach (`netstat -rn`) { if (/\S+\s+(\S+)\s+\S+\s+\S+\s+\S+\s+(\S+)/) { my $ifname = $2; my $gateway = $1; if (exists ($info{$ifname})) { $info{$ifname}{gateway} = $gateway; } } } foreach my $ifname (sort keys %info) { my $description = $ifname; my $type = $info{$ifname}{type}; my $macaddr = $info{$ifname}{macaddr}; my $status = $info{$ifname}{status}; my $ipaddress = $info{$ifname}{ip}; my $ipmask = $info{$ifname}{netmask}; my $gateway = $info{$ifname}{gateway}; my $ipdhcp = "No"; my $ipsubnet; $status = "Down" unless $ipaddress; # Retrieving ip of the subnet for each interface if ($ipmask and $ipaddress) { # To retrieve the subnet for this iface my $binip = &ip_iptobin ($ipaddress ,4); my $binmask = &ip_iptobin ($ipmask ,4); my $subnet = $binip & $binmask; $ipsubnet = ip_bintoip($subnet,4); } $common->addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPDHCP => $ipdhcp, IPGATEWAY => $gateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, STATUS => $status, TYPE => $type, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Slots.pm000066400000000000000000000020271432320066700237410ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Slots; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsdev") } sub run { my $params = shift; my $common = $params->{common}; my $description; my $designation; my $name; my $status; my @slot; my $flag=0; @slot=`lsdev -Cc bus -F 'name:description'`; for (@slot){ /^(.+):(.+)/; $name = $1; $status = 'available'; $designation = $2; $flag=0; my @lsvpd = `lsvpd`; s/^\*// for (@lsvpd); for (@lsvpd){ if ((/^AX $name/) ) {$flag=1} if ((/^YL (.+)/) && ($flag)){ $description = $2; } if ((/^FC .+/) && $flag) {$flag=0;last} } $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Software.pm000066400000000000000000000014521432320066700244300ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Software; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; # Do not run an package inventory if there is the --nosoftware parameter return if ($params->{config}->{nosoftware}); return unless $common->can_run("lslpp"); 1; } sub run { my $params = shift; my $common = $params->{common}; my @list; my $buff; foreach (`lslpp -c -l`) { my @entry = split /:/,$_; next unless (@entry); next unless ($entry[1]); next if $entry[1] =~ /^device/; $common->addSoftware({ 'COMMENTS' => $entry[6], 'FOLDER' => $entry[0], 'NAME' => $entry[1], 'VERSION' => $entry[2], }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Sounds.pm000066400000000000000000000011211432320066700241020ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Sounds; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsdev") } sub run { my $params = shift; my $common = $params->{common}; for (`lsdev -Cc adapter -F 'name:type:description'`){ if (/audio/i){ if (/^\S+\s([^:]+):\s*(.+?)(?:\(([^()]+)\))?$/i){ $common->addSound({ 'DESCRIPTION' => $3, 'MANUFACTURER' => $2, 'NAME' => $1, }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Storages.pm000066400000000000000000000177761432320066700244450ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Storages; use strict; #use warning; sub check { `which lsdev 2>&1`; return if($? >> 8)!=0; `which lsattr 2>&1`; ($? >> 8)?0:1} sub run { my $params = shift; my $common = $params->{common}; my(@disques, $device, $model, $capacity, $description, $manufacturer, $n, $i, $flag, @rep, @scsi, @values, @lsattr, $FRU, $status); #lsvpd my @lsvpd = `lsvpd`; s/^\*// for (@lsvpd); #FCP MPIO FC 2145 disks. IBM SDDPCM MPIO Storwize @scsi= (); @lsattr= (); $n=0; @scsi=`lsdev -Cc disk -s fcp -F 'name:description'`; for (@scsi){ chomp $scsi[$n]; /^(.+):(.+)/; $device=$1; $description=$2; @lsattr=`lspv $device 2>&1`; for (@lsattr){ if ( ! ( /^0516-320.*/ ) ){ if (/TOTAL PPs:/ ) { ($capacity,$model) = split(/\(/, $_); ($capacity,$model) = split(/ /,$model); } } else{ $capacity=0; } } $common->addStorages({ MANUFACTURER => "FCP", MODEL => "MPIO Disk", DESCRIPTION => $description, TYPE => 'disk', NAME => $device, DISKSIZE => $capacity }); $n++; } # SAS disks $n=0; @scsi=`lsdev -Cc disk -s sas -F 'name:description'`; for (@scsi){ chomp $scsi[$n]; /^(.+):(.+)/; $device=$1; $description=$2; @lsattr=`lsattr -EOl $device -a 'size_in_mb'`; for (@lsattr){ if (! /^#/ ){ $capacity=$_; chomp($capacity);$capacity =~ s/(\s+)$//; } } for (@lsvpd){ if (/^AX $device/){$flag=1} if ((/^MF (.+)/) && $flag){$manufacturer=$1;chomp($manufacturer);$manufacturer =~ s/(\s+)$//;} if ((/^TM (.+)/) && $flag){$model=$1;chomp($model);$model =~ s/(\s+)$//;} if ((/^FN (.+)/) && $flag){$FRU=$1;chomp($FRU);$FRU =~ s/(\s+)$//;$manufacturer .= ",FRU number :".$FRU} if ((/^FC .+/) && $flag) {$flag=0;last} } $common->addStorages({ MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => 'disk', NAME => $device, DISKSIZE => $capacity }); $n++; } #SCSI disks $n=0; @scsi=`lsdev -Cc disk -s scsi -F 'name:description'`; for (@scsi){ chomp $scsi[$n]; /^(.+):(.+)/; $device=$1; $description=$2; @lsattr=`lsattr -EOl $device -a 'size_in_mb'`; for (@lsattr){ if (! /^#/ ){ $capacity= $_; chomp($capacity);$capacity =~ s/(\s+)$//; } } for (@lsvpd){ if(/^AX $device/){$flag=1} if ((/^MF (.+)/) && $flag){$manufacturer=$1;chomp($manufacturer);$manufacturer =~ s/(\s+)$//;} if ((/^TM (.+)/) && $flag){$model=$1;chomp($model);$model =~ s/(\s+)$//;} if ((/^FN (.+)/) && $flag){$FRU=$1;chomp($FRU);$FRU =~ s/(\s+)$//;$manufacturer .= ",FRU number :".$FRU} if ((/^FC .+/) && $flag) {$flag=0;last} } $common->addStorages({ NAME => $device, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => 'disk', DISKSIZE => $capacity }); $n++; } #Virtual disks @scsi= (); @lsattr= (); $n=0; @scsi=`lsdev -Cc disk -s vscsi -F 'name:description'`; for (@scsi){ chomp $scsi[$n]; /^(.+):(.+)/; $device=$1; $description=$2; @lsattr=`lspv $device 2>&1`; for (@lsattr){ if ( ! ( /^0516-320.*/ ) ) { if (/TOTAL PPs:/ ) { ($capacity,$model) = split(/\(/, $_); ($capacity,$model) = split(/ /,$model); } } else { $capacity=0; } } $common->addStorages({ MANUFACTURER => "VIO Disk", MODEL => "Virtual Disk", DESCRIPTION => $description, TYPE => 'disk', NAME => $device, DISKSIZE => $capacity }); $n++; } #CDROM @scsi= (); @lsattr= (); @scsi=`lsdev -Cc cdrom -s scsi -F 'name:description:status'`; $i=0; for (@scsi){ chomp $scsi[$i]; /^(.+):(.+):(.+)/; $device=$1; $status=$3; $description=$2; $capacity=""; if (($status =~ /Available/)){ @lsattr=`lsattr -EOl $device -a 'size_in_mb'`; for (@lsattr){ if (! /^#/ ){ $capacity= $_; chomp($capacity);$capacity =~ s/(\s+)$//; } } $description = $scsi[$n]; for (@lsvpd){ if(/^AX $device/){$flag=1} if ((/^MF (.+)/) && $flag){$manufacturer=$1;chomp($manufacturer);$manufacturer =~ s/(\s+)$//;} if ((/^TM (.+)/) && $flag){$model=$1;chomp($model);$model =~ s/(\s+)$//;} if ((/^FN (.+)/) && $flag){$FRU=$1;chomp($FRU);$FRU =~ s/(\s+)$//;$manufacturer .= ",FRU number :".$FRU} if ((/^FC .+/) && $flag) {$flag=0;last} } $common->addStorages({ NAME => $device, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => 'cd', DISKSIZE => $capacity }); $n++; } $i++; } #TAPE @scsi= (); @lsattr= (); @scsi=`lsdev -Cc tape -s scsi -F 'name:description:status'`; $i=0; for (@scsi){ chomp $scsi[$i]; /^(.+):(.+):(.+)/; $device=$1; $status=$3; $description=$2; $capacity=""; if (($status =~ /Available/)){ @lsattr=`lsattr -EOl $device -a 'size_in_mb'`; for (@lsattr){ if (! /^#/ ){ $capacity= $_; chomp($capacity);$capacity =~ s/(\s+)$//; } } for (@lsvpd){ if(/^AX $device/){$flag=1} if ((/^MF (.+)/) && $flag){$manufacturer=$1;chomp($manufacturer);$manufacturer =~ s/(\s+)$//;} if ((/^TM (.+)/) && $flag){$model=$1;chomp($model);$model =~ s/(\s+)$//;} if ((/^FN (.+)/) && $flag){$FRU=$1;chomp($FRU);$FRU =~ s/(\s+)$//;$manufacturer .= ",FRU number :".$FRU} if ((/^FC .+/) && $flag) {$flag=0;last} } $common->addStorages({ NAME => $device, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => 'tape', DISKSIZE => $capacity }); $n++; } $i++; } #Disquette @scsi= (); @lsattr= (); @scsi=`lsdev -Cc diskette -F 'name:description:status'`; $i=0; for (@scsi){ chomp $scsi[$i]; /^(.+):(.+):(.+)/; $device=$1; $status=$3; $description=$2; $capacity=""; if (($status =~ /Available/)){ @lsattr=`lsattr -EOl $device -a 'fdtype'`; for (@lsattr){ if (! /^#/ ){ $capacity= $_; chomp($capacity);$capacity =~ s/(\s+)$//; } } # On le force en retour taille disquette non affichable $capacity =""; $common->addStorages({ NAME => $device, MANUFACTURER => 'N/A', MODEL => 'N/A', DESCRIPTION => $description, TYPE => 'floppy', DISKSIZE => '' }); $n++; } $i++; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Users.pm000066400000000000000000000007621432320066700237420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Users; sub check { # Useless check for a posix system i guess my @who = `who 2>/dev/null`; return 1 if @who; return; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my %user; # Logged on users for (`who`){ $user{$1} = 1 if /^(\S+)./; } my $UsersLoggedIn = join "/", keys %user; $common->setHardware ({ USERID => $UsersLoggedIn }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/AIX/Videos.pm000066400000000000000000000010731432320066700240660ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::AIX::Videos; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsdev"); } sub run { my $params = shift; my $common = $params->{common}; for (`lsdev -Cc adapter -F 'name:type:description'`){ if (/graphics|vga|video/i){ if (/^\S+\s([^:]+):\s*(.+?)(?:\(([^()]+)\))?$/i){ $common->addVideo({ 'CHIPSET' => $1, 'NAME' => $2, }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD.pm000066400000000000000000000021201432320066700226160ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; sub check { $^O =~ /freebsd|openbsd|netbsd|gnukfreebsd|gnuknetbsd/ } sub run { my $params = shift; my $common = $params->{common}; my $OSName; my $OSComment; my $OSVersion; my $OSLevel; my $OSArchi; # Operating system informations chomp($OSName=`uname -s`); chomp($OSVersion=`uname -r`); chomp($OSArchi=`uname -p`); # Retrieve the origin of the kernel configuration file my ($date, $origin, $kernconf); for (`sysctl -n kern.version`) { $date = $1 if /^\S.*\#\d+:\s*(.*)/; ($origin,$kernconf) = ($1,$2) if /^\s+(.+):(.+)$/; } $kernconf =~ s/\/.*\///; # remove the path $OSComment = $kernconf." (".$date.")\n".$origin; # if there is a problem use uname -v chomp($OSComment=`uname -v`) unless $OSComment; $common->setHardware({ OSNAME => $OSName." ".$OSArchi, OSCOMMENTS => $OSComment, OSVERSION => $OSVersion, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/000077500000000000000000000000001432320066700222655ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Archs/000077500000000000000000000000001432320066700233255ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Archs/Alpha.pm000066400000000000000000000031541432320066700247130ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Archs::Alpha; use strict; sub check{ my $arch; chomp($arch=`sysctl -n hw.machine`); $arch eq "alpha"; } sub run { my $params = shift; my $common = $params->{common}; my ($SystemSerial, $SystemModel, $SystemManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate); my ($processort, $processorn, $processors); ### Get system model with "sysctl hw.model" # # example on *BSD # hw.model = AlphaStation 255 4/232 chomp($SystemModel=`sysctl -n hw.model`); $SystemManufacturer = "DEC"; ### Get processor type and speed in dmesg # # NetBSD: AlphaStation 255 4/232, 232MHz, s/n # cpu0 at mainbus0: ID 0 (primary), 21064A-2 # OpenBSD: AlphaStation 255 4/232, 232MHz # cpu0 at mainbus0: ID 0 (primary), 21064A-2 (pass 1.1) # FreeBSD: AlphaStation 255 4/232, 232MHz # CPU: EV45 (21064A) major=6 minor=2 for (`dmesg`) { if (/^cpu[^:]*:\s*(.*)$/i) { $processort = $1; } if (/$SystemModel,\s*(\S+)\s*MHz.*$/) { $processors = $1; } } # number of procs with sysctl (hw.ncpu) chomp($processorn=`sysctl -n hw.ncpu`); # Writing data $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Archs/I386.pm000066400000000000000000000030421432320066700243130ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Archs::I386; # for i386 in case dmidecode is not available use strict; sub check{ my $arch; chomp($arch=`sysctl -n hw.machine`); return if (($arch ne "i386") && ($arch ne "amd64")); # dmidecode must not be present `dmidecode 2>&1`; return if ($? >> 8)==0; 1; } sub run { my $params = shift; my $common = $params->{common}; my ($SystemSerial , $SystemModel, $SystemManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate); my ($processort , $processorn , $processors); # use hw.machine for the system model # TODO see if we can do better chomp($SystemModel=`sysctl -n hw.machine`); # number of procs with sysctl (hw.ncpu) chomp($processorn=`sysctl -n hw.ncpu`); # proc type with sysctl (hw.model) chomp($processort=`sysctl -n hw.model`); # XXX quick and dirty _attempt_ to get proc speed through dmesg for (`dmesg`){ my $tmp; if (/^cpu\S*\s.*\D[\s|\(]([\d|\.]+)[\s|-]mhz/i) { # XXX unsure $tmp = $1; $tmp =~ s/\..*//; $processors=$tmp; last } } # Writing data $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Archs/Sgimips.pm000066400000000000000000000040101432320066700252710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Archs::Sgimips; use strict; sub check{ my $arch; chomp($arch=`sysctl -n hw.machine`); $arch =~ m/^sgi/; } sub run { my $params = shift; my $common = $params->{common}; my ($SystemSerial , $SystemModel, $SystemManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate); my ($processort , $processorn , $processors ); ### Get system model with "sysctl hw.model" # # example on NetBSD # hw.model = SGI-IP22 # example on OpenBSD # hw.model=SGI-O2 (IP32) chomp($SystemModel=`sysctl -n hw.model`); $SystemManufacturer = "SGI"; ### Get processor type and speed in dmesg # # Examples of dmesg output : # # I) Indy # a) NetBSD # mainbus0 (root): SGI-IP22 [SGI, 6906e152], 1 processor # cpu0 at mainbus0: MIPS R4400 CPU (0x450) Rev. 5.0 with MIPS R4010 FPC Rev. 0.0 # int0 at mainbus0 addr 0x1fbd9880: bus 75MHz, CPU 150MHz # # II) O2 # a) NetBSD # mainbus0 (root): SGI-IP32 [SGI, 8], 1 processor # cpu0 at mainbus0: MIPS R5000 CPU (0x2321) Rev. 2.1 with built-in FPU Rev. 1.0 # b) OpenBSD # mainbus0 (root) # cpu0 at mainbus0: MIPS R5000 CPU rev 2.1 180 MHz with R5000 based FPC rev 1.0 # cpu0: cache L1-I 32KB D 32KB 2 way, L2 512KB direct for (`dmesg`) { if (/$SystemModel\s*\[\S*\s*(\S*)\]/) { $SystemSerial = $1; } if (/cpu0 at mainbus0:\s*(.*)$/) { $processort = $1; } if (/CPU\s*.*\D(\d+)\s*MHz/) { $processors = $1; } } # number of procs with sysctl (hw.ncpu) chomp($processorn=`sysctl -n hw.ncpu`); # Writing data $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Archs/Sparc.pm000066400000000000000000000056311432320066700247400ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Archs::Sparc; use strict; sub check{ my $arch; chomp($arch=`sysctl -n hw.machine`); $arch =~ /^sparc/; } sub run { my $params = shift; my $common = $params->{common}; my( $SystemSerial , $SystemModel, $SystemManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate); my ( $processort , $processorn , $processors ); ### Get system serial with "sysctl kern.hostid" # # sysctl -n kern.hostid gives e.g. 0x807b65c on NetBSD # and 2155570635 on OpenBSD; we keep the hex form chomp ($SystemSerial = `sysctl -n kern.hostid`); if ( $SystemSerial =~ /^\d*$/ ) { # convert to NetBSD format $SystemSerial = sprintf ("0x%x",$SystemSerial); } $SystemSerial =~ s/^0x//; # remove 0x to make it appear as in the firmware ### Get system model and processor type in dmesg # # cannot use "sysctl hw.model" to get SystemModel # because it gives only the CPU on OpenBSD/sparc64 # # Examples of dmesg output : # # I) SPARC # a) NetBSD # mainbus0 (root): SUNW,SPARCstation-20: hostid 72362bb1 # cpu0 at mainbus0: TMS390Z50 v0 or TMS390Z55 @ 50 MHz, on-chip FPU # b) OpenBSD # mainbus0 (root): SUNW,SPARCstation-20 # cpu0 at mainbus0: TMS390Z50 v0 or TMS390Z55 @ 50 MHz, on-chip FPU # # II) SPARC64 # a) NetBSD # mainbus0 (root): SUNW,Ultra-1: hostid 807b65cb # cpu0 at mainbus0: SUNW,UltraSPARC @ 166.999 MHz, version 0 FPU # b) OpenBSD # mainbus0 (root): Sun Ultra 1 SBus (UltraSPARC 167MHz) # cpu0 at mainbus0: SUNW,UltraSPARC @ 166.999 MHz, version 0 FPU # c) FreeBSD # cpu0: Sun Microsystems UltraSparc-I Processor (167.00 MHz CPU) for (`dmesg`) { if (/^mainbus0 \(root\):\s*(.*)$/) { $SystemModel = $1; } if (/^cpu[^:]*:\s*(.*)$/i) { $processort = $1 unless $processort; } } $SystemModel || chomp ($SystemModel = `sysctl -n hw.model`); # for FreeBSD $SystemManufacturer = "SUN"; # some cleanup $SystemModel =~ s/SUNW,//; $SystemModel =~ s/[:\(].*$//; $SystemModel =~ s/^\s*//; $SystemModel =~ s/\s*$//; $processort =~ s/SUNW,//; $processort =~ s/^\s*//; $processort =~ s/\s*$//; # number of procs with "sysctl hw.ncpu" chomp($processorn=`sysctl -n hw.ncpu`); # XXX quick and dirty _attempt_ to get proc speed if ( $processort =~ /(\d+)(\.\d+|)\s*mhz/i ) { # possible decimal point $processors = sprintf("%.0f", "$1$2"); # round number } # Writing data $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/CPU.pm000066400000000000000000000020301432320066700232450ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::CPU; use strict; sub check { return unless -r "/dev/mem"; 1; } sub run { my $params = shift; my $common = $params->{common}; my $os; my $processort; my $processorn; my $processors; my $family; my $manufacturer; my $serial; chomp($os = `uname -s`); if ($os eq "FreeBSD") { $processors = `sysctl -n hw.clockrate`; } else { $processors = `sysctl -n hw.cpuspeed`; } $processorn = `sysctl -n hw.ncpu`; $processort = `sysctl -n hw.model`; $family = `sysctl -n hw.machine`; $serial = `sysctl -n hw.serialno`; chomp($processort); if ($processort =~ /Intel/) { $manufacturer = "Intel"; } if ($processort =~ /Advanced Micro|AMD/) { $manufacturer = "AMD"; } $common->addCPU({ CPUARCH => $family, MANUFACTURER => $manufacturer, CORES => $processorn, TYPE => $processort, SPEED => $processors, SERIAL => $serial }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Domains.pm000066400000000000000000000021061432320066700242140ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Domains; use strict; sub check { my $hostname; chomp ($hostname = `hostname`); my @domain = split (/\./, $hostname); shift (@domain); return 1 if @domain; -f "/etc/resolv.conf" } sub run { my $params = shift; my $common = $params->{common}; my $domain; my %domain; my @dns_list; my $dns; my $hostname; chomp ($hostname = `hostname`); my @domain = split (/\./, $hostname); shift (@domain); $domain = join ('.',@domain); open RESOLV, "/etc/resolv.conf" or warn; while(){ if (/^nameserver\s+(\S+)/i) { push(@dns_list,$1); } elsif (!$domain) { $domain{$2} = 1 if (/^(domain|search)\s+(.+)/); } } close RESOLV; if (!$domain) { $domain = join "/", keys %domain; } $dns=join("/",@dns_list); # If no domain name, we send "WORKGROUP" $domain = 'WORKGROUP' unless $domain; $common->setHardware({ WORKGROUP => $domain, DNS => $dns }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Drives.pm000066400000000000000000000016171432320066700240640ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Drives; use strict; sub run { my $params = shift; my $common = $params->{common}; my $free; my $filesystem; my $total; my $type; my $volumn; for my $t ("ffs","ufs","zfs") { # OpenBSD has no -m option so use -k to obtain results in kilobytes for (`df -P -t $t -k`){ if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\n/){ $volumn = $1; $filesystem = $t; $total = sprintf("%i",$2/1024); $free = sprintf("%i",$4/1024); $type = $6; $common->addDrive({ FREE => $free, FILESYSTEM => $filesystem, TOTAL => $total, TYPE => $type, VOLUMN => $volumn }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/IPv4.pm000066400000000000000000000010621432320066700234040ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::IPv4; sub check { my @ifconfig = `ifconfig -a 2>/dev/null`; return 1 if @ifconfig; return; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my @ip; # Looking for ip addresses with ifconfig, except loopback # *BSD need -a option foreach (`ifconfig -a`){ if (/^\s*inet\s+(\S+)/){ ($1=~/^127.+/)?next:push @ip, $1 }; } my $ip=join "/", @ip; $common->setHardware({IPADDR => $ip}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Mem.pm000066400000000000000000000013321432320066700233400ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Mem; use strict; sub check { `which sysctl 2>&1`; return 0 if($? >> 8); `which swapctl 2>&1`; return 0 if($? >> 8); 1; }; sub run { my $params = shift; my $common = $params->{common}; my $PhysicalMemory; my $SwapFileSize; # Swap my @bsd_swapctl= `swapctl -sk`; for (@bsd_swapctl){ $SwapFileSize=$1 if /total:\s*(\d+)/i; } # RAM chomp($PhysicalMemory=`sysctl -n hw.physmem`); $PhysicalMemory=$PhysicalMemory/1024; # Send it to inventory object $common->setHardware({ MEMORY => sprintf("%i",$PhysicalMemory/1024), SWAP => sprintf("%i", $SwapFileSize/1024), }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Networks.pm000066400000000000000000000155251432320066700244470ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Networks; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("ifconfig") && $common->can_load("Net::IP qw(:PROC)") } sub _ipdhcp { my $if = shift; my $path; my $ipdhcp; my $leasepath; foreach ( # XXX BSD paths "/var/db/dhclient.leases.%s", "/var/db/dhclient.leases", # Linux path for some kFreeBSD based GNU system "/var/lib/dhcp3/dhclient.%s.leases", "/var/lib/dhcp3/dhclient.%s.leases", "/var/lib/dhcp/dhclient.leases") { $leasepath = sprintf($_,$if); last if (-e $leasepath); } return undef unless -e $leasepath; if (open DHCP, $leasepath) { my $lease; my $dhcp; my $expire; # find the last lease for the interface with its expire date while(){ $lease = 1 if(/lease\s*{/i); $lease = 0 if(/^\s*}\s*$/); if ($lease) { #inside a lease section if (/interface\s+"(.+?)"\s*/){ $dhcp = ($1 =~ /^$if$/); } #Server IP if (/option\s+dhcp-server-identifier\s+(\d{1,3}(?:\.\d{1,3}){3})\s*;/x) { $ipdhcp = $1; } if (/^\s*expire\s*\d\s*(\d*)\/(\d*)\/(\d*)\s*(\d*):(\d*):(\d*)/x) { $expire=sprintf "%04d%02d%02d%02d%02d%02d",$1,$2,$3,$4,$5,$6; } } } close DHCP or warn; chomp (my $currenttime = `date +"%Y%m%d%H%M%S"`); undef $ipdhcp unless $currenttime <= $expire; } else { warn "Can't open $leasepath\n"; } return $ipdhcp; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $description; my $duplex; my $ipaddress; my $ipmask; my $ipsubnet; my $ipaddress6; my $ipmask6; my $ipsubnet6; my $macaddr; my $mtu; my $speed; my $status; my $type; my @ifconfig = `ifconfig -a`; # -a option required on *BSD # first make the list available interfaces # too bad there's no -l option on OpenBSD my @list; foreach (@ifconfig){ # skip loopback, pseudo-devices and point-to-point interfaces next if /^(lo|fwe|vmnet|sit|pflog|pfsync|enc|strip|plip|sl|ppp)\d+/; if (/^(\S+):/) { push @list , $1; } # new interface name } # for each interface get it's parameters foreach $description (@list) { $ipaddress = $ipmask = $macaddr = $status = $type = $mtu = $speed = $ipaddress6 = $ipmask6 = $ipsubnet6 = undef; # search interface infos @ifconfig = `ifconfig $description`; foreach (@ifconfig){ $ipaddress = $1 if /inet (\S+)/i; if (/inet6 ([\w:]+)\S* prefixlen (\d+)/) { $ipaddress6=$1; $ipmask6=getIPNetmaskV6($2); $ipsubnet6=getSubnetAddressIPv6($ipaddress6,$ipmask6); } $ipmask = $1 if /netmask\s+(\S+)/i; $macaddr = $2 if /(address:|ether|lladdr)\s+(\S+)/i; $status = 1 if /) $mtu = $1 if /mtu (\d+)/i; } # In BSD, netmask is given in hex form my $binmask = sprintf("%b", oct($ipmask)); $ipmask = ip_bintoip($binmask,4); if ($description & $ipaddress ) { $common->addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPDHCP => _ipdhcp($description), IPGATEWAY => getRoute($ipaddress), IPMASK => $ipmask, IPSUBNET => getSubnetAddressIPv4($ipaddress,$ipmask), MACADDR => $macaddr, MTU => $mtu, SPEED => getSpeed($speed), STATUS => $status?"Up":"Down", TYPE => $type, }); # Set default gateway in hardware info $common->setHardware({ DEFAULTGATEWAY => getRoute($ipaddress6) }); } else { $common->addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress6, IPDHCP => _ipdhcp($description), IPGATEWAY => getRoute($ipaddress6), IPMASK => getIPNetmaskV6($ipaddress6), IPSUBNET => getSubnetAddressIPv6($ipaddress6,$ipmask6), MACADDR => $macaddr, MTU => $mtu, SPEED => getSpeed($speed), STATUS => $status?"Up":"Down", TYPE => $type, }); # Set default gateway in hardware info $common->setHardware({ DEFAULTGATEWAY => getRoute($ipaddress6) }); } } } sub getSpeed{ my ($speed)=@_; return unless $speed; if ($speed gt 100 ){ $speed = ($speed/1000)." Gbps"; } else { $speed = $speed." Mbps"; } return $speed; } sub getSubnetAddressIPv4 { my ($address,$mask)=@_; return undef unless $address && $mask; my $binaddress=ip_iptobin($address, 4); my $binmask=ip_iptobin($mask, 4); my $binsubnet=$binaddress & $binmask; return ip_bintoip($binsubnet, 4); } sub getSubnetAddressIPv6 { my ($address,$mask)=@_; return undef unless $address && $mask; my $binaddress = ip_iptobin(ip_expand_address($address, 6),6); my $binmask = ip_iptobin(ip_expand_address($mask, 6),6); my $binsubnet = $binaddress & $binmask; return ip_compress_address(ip_bintoip($binsubnet, 6),6); } sub getIPNetmaskV6 { my ($prefix) = @_; return undef unless $prefix; return ip_compress_address(ip_bintoip(ip_get_mask($prefix, 6), 6),6); } sub getRoute { # Looking for the gateway # 'route show' doesn't work on FreeBSD so we use netstat # XXX IPV4 only my ($prefix) = @_; my $route; return undef unless $prefix; if (ip_is_ipv4($prefix)) { for (`netstat -rn -f inet`){ $route = $1 if /^default\s+(\S+)/i; } } elsif (ip_is_ipv6($prefix)) { for (`netstat -rn -f inet6`){ $route = $1 if /^default\s+(\S+)/i; } } return $route; } 1; __END__ =head1 NAME OCSInventory::Agent::Backend::OS::BSD::Networks - Network-related information =head1 DESCRIPTION This module retrieves network information. =head1 FUNCTIONS =head2 getSpeed Returns the speed of the card. =head2 getRoute Returns the gateway =head2 getIPNetmaskV4 Returns the IP v4 network mask =head2 getIPNetmaskV6 Returns the IP v6 network mask =head2 getSubnetAddressIPv4 Returns the subnet of ip v4 network =head2 getSubnetAddressIPv6 Returns the subnet of ip v6 network UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Storages.pm000066400000000000000000000040401432320066700244100ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Storages; use strict; sub check { -x '/usr/local/bin/smartctl'; } sub run { my $params = shift; my $common = $params->{common}; my @values; my $devlist; my $osname = `uname -s`; if (chomp($osname) eq "FreeBSD") { $devlist = `/sbin/sysctl -n kern.disks`; } else { $devlist = `/sbin/sysctl -n hw.disknames`; } chomp($devlist); my @devices = split( /\s+/, $devlist ); for my $dev (@devices) { open( CMD, "smartctl -i /dev/$dev |" ); my ( $manufacturer, $serialnumber, $model, $size, $firmware, $type, $desc, $luwwnid ); while () { chomp(); if (/^Vendor:\s+|^Model Family:\s+/i) { $manufacturer = ( split( /:\s+/, $_ ) )[1]; } if (/^Product:\s+|^Device Model:\s+/i) { $model = ( split( /:\s+/, $_ ) )[1]; } if (/^Serial number:\s+/i) { $serialnumber = ( split( /:\s+/, $_ ) )[1]; } if (/^User Capacity:\s+/i) { s/,//g; my $out = ( split( /:\s+/, $_ ) )[1]; $size = ( split( ' ', $out ) )[0] / ( 1024 * 1024 ); } if (/^Revision:\s+|^Firmware Version:\s+/) { $firmware = ( split( /:\s+/, $_ ) )[1]; } if (/^Device type:\s+/) { $type = ( split( /:\s+/, $_ ) )[1]; } if (/^Transport protocol:\s+/) { $desc = ( split( /:\s+/, $_ ) )[1]; } if (/^LU WWN Device Id:\s+/) { $luwwnid = ( split( /:\s+/, $_ ) )[1]; } } $common->addStorages({ NAME => $dev, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $desc, TYPE => $type, DISKSIZE => $size, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware, SCSI_UNID => $luwwnid, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Sys.pm000066400000000000000000000004051432320066700234000ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Sys; #$LunchAfter = "Ocsinventory::Agent::Backend::OS::Linux::VirtualFs::Sys"; sub check { foreach (`mount`) { return 1 if (/type\ sysfs/); } return; } sub run { # Hum? return ""; } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/BSD/Uptime.pm000066400000000000000000000016051432320066700240700ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::BSD::Uptime; use strict; sub check { my $boottime = `sysctl -n kern.boottime 2>/dev/null`; return 1 if $boottime; return; } sub run { my $params = shift; my $common = $params->{common}; chomp (my $boottime = `sysctl -n kern.boottime`); $boottime = $1 if $boottime =~ /sec\s*=\s*(\d+)/; chomp (my $currenttime = `date +%s`); my $uptime = $currenttime - $boottime; # Uptime conversion my ($UYEAR, $UMONTH , $UDAY, $UHOUR, $UMIN, $USEC) = (gmtime ($uptime))[5,4,3,2,1,0]; # Write in ISO format $uptime=sprintf "%02d-%02d-%02d %02d:%02d:%02d", ($UYEAR-70), $UMONTH, ($UDAY-1), $UHOUR, $UMIN, $USEC; chomp(my $DeviceType =`uname -m`); # TODO$h->{'CONTENT'}{'HARDWARE'}{'DESCRIPTION'} = [ "$DeviceType/$uptime" ]; $common->setHardware({ DESCRIPTION => "$DeviceType/$uptime" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic.pm000066400000000000000000000001201432320066700235600ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic; use strict; sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/000077500000000000000000000000001432320066700232315ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode.pm000066400000000000000000000003761432320066700254520ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless -r "/dev/mem"; return unless $common->can_run("dmidecode"); 1; } sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/000077500000000000000000000000001432320066700251065ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Batteries.pm000066400000000000000000000046011432320066700273670ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Batteries; use strict; sub run { my $params = shift; my $common = $params->{common}; my $dmidecode = `dmidecode`; # TODO retrieve error # some versions of dmidecode do not separate items with new lines # so add a new line before each handle $dmidecode =~ s/\nHandle/\n\nHandle/g; my @dmidecode = split (/\n/, $dmidecode); # add a new line at the end push @dmidecode, "\n"; s/^\s+// for (@dmidecode); my $flag; my $location; my $manufacturer; my $manufacturedate; my $serialnumber; my $name; my $chemistry; my $designcapacity; my $designvoltage; my $sbdsversion; my $maxerror; my $oemspecific; my $numslot; foreach (@dmidecode) { if (/dmi type 22,/i) { # beginning of Memory Device section $flag = 1; $numslot++; } elsif ($flag && /^$/) { # end of section $flag = 0; $common->addBatteries({ LOCATION => $location, MANUFACTURER => $manufacturer, MANUFACTUREDATE => $manufacturedate, SERIALNUMBER => $serialnumber, NAME => $name, CHEMISTRY => $chemistry, DESIGNCAPACITY => $designcapacity, DESIGNVOLTAGE => $designvoltage, SBDSVERSION => $sbdsversion, MAXERROR => $maxerror, OEMSPECIFIC => $oemspecific, }); $location = $manufacturer = $manufacturedate = $serialnumber = $name = $chemistry = $designcapacity = $designvoltage = $sbdsversion = $maxerror = $oemspecific = undef; } elsif ($flag) { # in the section $location = $1 if /^Location:\s*(\S+)/i; $manufacturer = $1 if /^Manufacturer:\s*(.+)/i; $manufacturedate = $1 if /^Manufacture Date:\s*(.+)/i; $serialnumber = $1 if /^Serial Number:\s*(.+)/i; $name = $1 if /^Name:\s*(.+)/i; $chemistry = $1 if /^Chemistry:\s*(.+)/i; $designcapacity = $1 if /^Design Capacity:\s*(.+)/i; $designvoltage = $1 if /^Design Voltage:\s*(.+)/i; $sbdsversion = $1 if /^SBDS Version:\s*(.+)/i; $maxerror = $1 if /^Maximum Error:\s*(.+)/i; $oemspecific = $1 if /^OEM-specific Information:\s*(.+)/i; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Bios.pm000066400000000000000000000056231432320066700263460ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Bios; use strict; sub run { my $params = shift; my $common = $params->{common}; # Parsing dmidecode output # Using "type 0" section my( $SystemSerial , $SystemModel, $SystemManufacturer, $SystemVersion, $BiosManufacturer, $BiosVersion, $BiosDate, $AssetTag, $MotherboardManufacturer, $MotherboardModel, $MotherboardSerial, $Type ); #System DMI $SystemManufacturer = `dmidecode -s system-manufacturer`; $SystemModel = `dmidecode -s system-product-name`; $SystemSerial = `dmidecode -s system-serial-number`; $SystemVersion = `dmidecode -s system-version`; $AssetTag = `dmidecode -s chassis-asset-tag`; $Type = `dmidecode -s chassis-type`; #Motherboard DMI $MotherboardManufacturer = `dmidecode -s baseboard-manufacturer`; $MotherboardModel = `dmidecode -s baseboard-product-name`; $MotherboardSerial = `dmidecode -s baseboard-serial-number`; #BIOS DMI $BiosManufacturer = `dmidecode -s bios-vendor`; $BiosVersion = `dmidecode -s bios-version`; $BiosDate = `dmidecode -s bios-release-date`; foreach my $info ( $SystemSerial , $SystemModel, $SystemManufacturer, $SystemVersion, $BiosManufacturer, $BiosVersion, $BiosDate, $AssetTag, $MotherboardManufacturer, $MotherboardModel, $MotherboardSerial, $Type ) { # Remove lines starting with # $info =~ s/(\s*#.*\n)+//g; # Remove error msg 'Invalid entry length (0). DMI table is broken! Stop.' $info =~ s/Invalid.*//g; # Remove break lines $info =~ s/\n//g; # Remove whitespaces at start/end $info =~ s/^\s+|\s+$//g; } #System DMI if ($SystemModel && $SystemManufacturer && $SystemManufacturer =~ /^LENOVO$/i && $SystemVersion =~ /^(Think|Idea|Yoga|Netfinity|Netvista|Intelli)/i) { my $product_name = $SystemVersion; $SystemVersion = $SystemModel; $SystemModel = $product_name; } # If serial number is empty, assign mainboard serial (e.g Intel NUC) if (!$SystemSerial) { $SystemSerial = $MotherboardSerial; } # Some bioses don't provide a serial number so I check for CPU ID (e.g: server from dedibox.fr) my @cpu; if (!$SystemSerial || $SystemSerial =~ /^0+$/) { @cpu = `dmidecode -t processor`; for (@cpu){ if (/ID:\s*(.*)/i){ $SystemSerial = $1; } } } # Writing data $common->setBios ({ ASSETTAG => $AssetTag, SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, MMANUFACTURER => $MotherboardManufacturer, MMODEL => $MotherboardModel, MSN => $MotherboardSerial, TYPE => $Type, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Memory.pm000066400000000000000000000074231432320066700267220ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Memory; use strict; sub run { my $params = shift; my $common = $params->{common}; my $dmidecode; my @dmidecode; my %dmidecode; my $capacity; my $speed; my $type; my $numslot; my $serialnumber; my $manufacturer; my $caption; my $description; # DMI type 17 $dmidecode = `dmidecode -t 17`; @dmidecode = split (/Handle\s/i, $dmidecode); shift @dmidecode; $numslot = 0; foreach (@dmidecode) { $capacity = $speed = $type = $serialnumber = $manufacturer = $caption = $description = 0; $caption = $1 if /\s\sLocator:\s([\w\d_\-\s#]+)\n/i; $speed = $1 if /Speed:\s([\w\d]+)/i; $type = $1 if /Type:\s([\s\w]+)\n/i; $description = $1 if /Type\sDetail:\s([\s\w]+)\n/i; $manufacturer = $1 if /Manufacturer:\s([\w\d\-\_\s]+)\n/i; $serialnumber = $1 if /Serial\sNumber:\s([\w\d\-\_\s]+)\n/i; if (/Size:\s(\d+)\s(MB|GB|TB|MByte|GByte|TByte)/i) { if($2 eq "MB" or $2 eq "MByte") { $capacity = $1; } elsif($2 eq "GB" or $2 eq "GByte") { $capacity = $1*1024; } elsif($2 eq "TB" or $2 eq "TByte") { $capacity = $1*1024*1024; } } if (/DMI type 17/i) { $dmidecode{$numslot}{caption} = $caption ? $caption : ""; $dmidecode{$numslot}{description} = $description ? $description : ""; $dmidecode{$numslot}{speed} = $speed ? $speed : ""; $dmidecode{$numslot}{type} = $type ? $type : ""; $dmidecode{$numslot}{manufacturer} = $manufacturer ? $manufacturer : ""; $dmidecode{$numslot}{serialnumber} = $serialnumber ? $serialnumber : ""; $dmidecode{$numslot}{capacity} = $capacity ? $capacity : ""; $numslot++; } } # DMI type 6 if type 17 is not available if (!$numslot) { $dmidecode = `dmidecode -t 6`; # TODO retrieve error @dmidecode = split (/Handle\s/i, $dmidecode); shift @dmidecode; $numslot = 0; foreach (@dmidecode) { $capacity = $speed = $type = $caption = 0; $caption = $1 if /Socket Designation:\s([\w\d_\-\s#]+)\n/i; $capacity = $1 if /Installed\sSize:\s(\d+)/i; $speed = $1 if /Speed:\s([\w\d]+)/i; $type = $1 if /Type:\s([\s\w]+)\n/i; if (/Size:\s(\d+)\s(MB|GB|TB|MByte|GByte|TByte)/i) { if($2 eq "MB" or $2 eq "MByte") { $capacity = $1; } elsif($2 eq "GB" or $2 eq "GByte") { $capacity = $1*1024; } elsif($2 eq "TB" or $2 eq "TByte") { $capacity = $1*1024*1024; } } if (/DMI type 6/i) { $dmidecode{$numslot}{caption} = $caption ? $caption : ""; $dmidecode{$numslot}{description} = $description ? $description : ""; $dmidecode{$numslot}{speed} = $speed ? $speed : ""; $dmidecode{$numslot}{type} = $type ? $type : ""; $dmidecode{$numslot}{capacity} = $capacity ? $capacity : ""; $numslot++; } } } foreach (sort {$a <=> $b} keys %dmidecode) { $common->addMemory({ CAPACITY => $dmidecode{$_}{capacity}, SPEED => $dmidecode{$_}{speed}, TYPE => $dmidecode{$_}{type}, MANUFACTURER => $dmidecode{$_}{manufacturer}, SERIALNUMBER => $dmidecode{$_}{serialnumber}, NUMSLOTS => $_, CAPTION => $dmidecode{$_}{caption}, DESCRIPTION => $dmidecode{$_}{description}, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Ports.pm000066400000000000000000000024431432320066700265560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Ports; use strict; sub run { my $params = shift; my $common = $params->{common}; my $dmidecode = `dmidecode`; # TODO retrieve error # some versions of dmidecode do not separate items with new lines # so add a new line before each handle $dmidecode =~ s/\nHandle/\n\nHandle/g; my @dmidecode = split (/\n/, $dmidecode); # add a new line at the end push @dmidecode, "\n"; s/^\s+// for (@dmidecode); my $flag; my $caption; my $description; my $name; my $type; foreach (@dmidecode) { if (/dmi type 8,/i) { $flag = 1; } elsif ($flag && /^$/){ # end of section $flag = 0; $common->addPorts({ CAPTION => $caption, DESCRIPTION => $description, NAME => $name, TYPE => $type, }); $caption = $description = $name = $type = undef; } elsif ($flag) { $caption = $1 if /^external connector type\s*:\s*(.+)/i; $description = $1 if /^internal connector type\s*:\s*(.+)/i; $name = $1 if /^internal reference designator\s*:\s*(.+)/i; $type = $1 if /^port type\s*:\s*(.+)/i; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Psu.pm000066400000000000000000000021211432320066700262070ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Psu; use strict; use warnings; sub run { my $params = shift; my $common = $params->{common}; my $infos=$common->getDmidecodeInfos(); my $psu; foreach my $info (@{$infos->{39}}) { next if $info->{'Type'} && $info->{'Type'} eq 'Battery'; $psu->{NAME}=$1 if ($info =~ /Name:\s*(.*)/i); $psu->{LOCATION}=$1 if ($info =~ /Location:\s*(.*)/i); $psu->{STATUS}=$1 if ($info =~ /Status:\s*(.*)/i); $psu->{SERIALNUMBER}=$1 if ($info =~ /Serial Number:\s*(.*)/i); $psu->{PLUGGED}=$1 if ($info =~ /Plugged:\s*(.*)/i); $psu->{HOTREPLACEABLE}=$1 if ($info =~ /Hot Replaceable:\s*(.*)/i); $psu->{POWERMAX}=$1 if ($info =~ /Max Power Capacity:\s*(.*)/i); $psu->{MANUFACTURER}=$1 if ($info =~ /Manufacturer:\s*(.*)/i); $psu->{PARTNUMBER}=$1 if ($info =~ /Model Part Number:\s*(.*)/i); next unless ($psu); next unless ($psu->{'NAME'} || $psu->{'SERIALNUMBER'} || $psu->{'PARTNUMBER'}); $common->addPSU($psu); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Slots.pm000066400000000000000000000023511432320066700265510ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Slots; use strict; sub run { my $params = shift; my $common = $params->{common}; my $dmidecode = `dmidecode`; # some versions of dmidecode do not separate items with new lines # so add a new line before each handle $dmidecode =~ s/\nHandle/\n\nHandle/g; my @dmidecode = split (/\n/, $dmidecode); # add a new line at the end push @dmidecode, "\n"; s/^\s+// for (@dmidecode); my $flag; my $description; my $designation; my $name; my $status; foreach (@dmidecode) { if (/dmi type 9,/i) { $flag=1; } elsif ($flag && /^$/) { $flag=0; $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); $description = $designation = $name = $status = undef; } elsif ($flag) { $description = $1 if /^type\s*:\s*(.+)/i; $designation = $1 if /^id\s*:\s*(.+)/i; $name = $1 if /^designation\s*:\s*(.+)/i; $status = $1 if /^current usage\s*:\s*(.+)/i; }; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/UUID.pm000066400000000000000000000007221432320066700262130ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::UUID; use strict; sub check { my $params = shift; my $common = $params->{common}; return $common->can_run('dmidecode') } sub run { my $params = shift; my $common = $params->{common}; my $uuid; $uuid = `dmidecode -s system-uuid`; chomp($uuid); $uuid =~ s/^#+\s+$//g; $uuid =~ s/Invalid.*$//g; $common->setHardware({ UUID => $uuid, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Hostname.pm000066400000000000000000000012241432320066700253440ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Hostname; sub check { my $params = shift; my $common = $params->{common}; return 1 if $common->can_load ("Sys::Hostname"); return 1 if $common->can_run ("hostname"); 0; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $hostname; if ($common->can_load("Sys::Hostname")) { $hostname = Sys::Hostname::hostname(); } else { chomp ( $hostname = `hostname` ); # TODO: This is not generic. } $hostname =~ s/\..*//; # keep just the hostname $common->setHardware ({NAME => $hostname}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Ipmi.pm000066400000000000000000000044021432320066700244650ustar00rootroot00000000000000# # OcsInventory agent - IPMI lan channel report # # Copyright (c) 2008 Jean Parpaillon # # The Intelligent Platform Management Interface (IPMI) specification # defines a set of common interfaces to a computer system which system # administrators can use to monitor system health and manage the # system. The IPMI consists of a main controller called the Baseboard # Management Controller (BMC) and other satellite controllers. # # The BMC can be fetched through client like OpenIPMI drivers or # through the network. Though, the BMC hold a proper MAC address. # # This module reports the MAC address and, if any, the IP # configuration of the BMC. This is reported as a standard NIC. # package Ocsinventory::Agent::Backend::OS::Generic::Ipmi; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("ipmitool") && $common->can_load("Net::IP qw(:PROC)"); my @ipmitool = `ipmitool lan print 2> /dev/null`; return unless @ipmitool; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $description; my $ipaddress; my $ipgateway; my $ipmask; my $ipsubnet; my $macaddr; my $status; my $type; foreach (`LANG=C ipmitool lan print 2> /dev/null`) { if (/^IP Address\s+:\s+(\d+\.\d+\.\d+\.\d+)/) { $ipaddress = $1; } if (/^Default Gateway IP\s+:\s+(\d+\.\d+\.\d+\.\d+)/) { $ipgateway = $1; } if (/^Subnet Mask\s+:\s+(\d+\.\d+\.\d+\.\d+)/) { $ipmask = $1; } if (/^MAC Address\s+:\s+([0-9a-f]{2}(:[0-9a-f]{2}){5})/) { $macaddr = $1; } } $description = 'bmc'; my $binip = &ip_iptobin ($ipaddress, 4); my $binmask = &ip_iptobin ($ipmask, 4); my $binsubnet = $binip & $binmask; $ipsubnet = ip_bintoip($binsubnet, 4); $status = 1 if $ipaddress != '0.0.0.0'; $type = 'Ethernet'; $common->addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPDHCP => "", IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, STATUS => $status?"Up":"Down", TYPE => $type, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci.pm000066400000000000000000000002761432320066700246460ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lspci; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lspci") } sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci/000077500000000000000000000000001432320066700243035ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci/Controllers.pm000066400000000000000000000034571432320066700271600ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lspci::Controllers; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lspci") } sub run { my $params = shift; my $common = $params->{common}; my $driver; my $name; my $manufacturer; my $pciid; my $pcislot; my $type; my $lspci_version; my $command = "lspci -vvv 2>/dev/null"; #We get the current lspci version `lspci --version` =~ m/lspci\sversion\s(\d+.*)/ ; $lspci_version=$1; $lspci_version = $common->convertVersion($lspci_version,3); if ($lspci_version >= 224) { #More informations since version 2.2.4 $command = "lspci -vvv -nn 2>/dev/null"; } foreach(`$command`){ if (/^(\S+)\s+(\w+.*?):\s(.*)/) { $pcislot = $1; $name = $2; $manufacturer = $3; if ($manufacturer =~ s/ \((rev \S+)\)//) { $type = $1; } $manufacturer =~ s/\ *$//; # clean up the end of the string $manufacturer =~ s/\s+\(prog-if \d+ \[.*?\]\)$//; # clean up the end of the string if ($manufacturer =~ s/ \[([A-z\d]+:[A-z\d]+)\]$//) { $pciid = $1; } } if ($pcislot && /^\s+Kernel driver in use: (\w+)/) { $driver = $1; } if ($pcislot && /^$/) { $common->addController({ 'DRIVER' => $driver, 'NAME' => $name, 'MANUFACTURER' => $manufacturer, 'PCIID' => $pciid, 'PCISLOT' => $pcislot, 'TYPE' => $type, }); $driver = $name = $pciid = $pcislot = $manufacturer = $type = undef; } } } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci/Modems.pm000066400000000000000000000006701432320066700260700ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lspci::Modems; use strict; sub run { my $params = shift; my $common = $params->{common}; foreach(`lspci`){ if (/modem/i && /\d+\s(.+):\s*(.+)$/){ my $name = $1; my $description = $2; $common->addModems({ 'DESCRIPTION' => $description, 'NAME' => $name, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci/Sounds.pm000066400000000000000000000006411432320066700261150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lspci::Sounds; use strict; sub run { my $params = shift; my $common = $params->{common}; foreach(`lspci`){ if (/audio/i && /^\S+\s([^:]+):\s*(.+?)(?:\(([^()]+)\))?$/i){ $common->addSound({ 'DESCRIPTION' => $3, 'MANUFACTURER' => $2, 'NAME' => $1, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lspci/Videos.pm000066400000000000000000000020041432320066700260660ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lspci::Videos; use strict; my $memory; my $chipset; my $name; sub run { my $params = shift; my $common = $params->{common}; foreach(`lspci`){ if(/graphics|vga|video|display/i && /^([0-9a-f][0-9a-f]:[0-9a-f][0-9a-f].[0-9a-f])\s([^:]+):\s*(.+?)(?:\(([^()]+)\))?$/i){ my $slot = $1; $chipset = $2; $name = $3; if (defined $slot) { my @detail = `lspci -v -s $slot 2>/dev/null`; $memory = 0; foreach my $m (@detail) { if ($m =~ /.*Memory.*\s+\(.*-bit,\sprefetchable\)\s\[size=(\d*)M\]/) { $memory += $1; } } # Don't record zero memory $memory = undef if $memory == 0; } $common->addVideo({ 'CHIPSET' => $chipset, 'NAME' => $name, 'MEMORY' => $memory, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lsusb.pm000066400000000000000000000002761432320066700246640ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lsusb; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsusb") } sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lsusb/000077500000000000000000000000001432320066700243215ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Lsusb/Usb.pm000066400000000000000000000032451432320066700254140ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Lsusb::Usb; use strict; use Config; use Data::Dumper; my $vendor; my $product; my $interface; my $bus; my $device; my $serial; my $protocol; my $id; sub run { my $params = shift; my $common = $params->{common}; foreach (`lsusb`) { if (/^Bus\s+(\d+)\sDevice\s(\d*):\sID\s(\d+):(\d+)*/i) { next if (grep (/$4/,qw(0001 0002 0024))); $bus=$1; $device=$2; #if (defined $bus && defined $device) { my @detail = `lsusb -v -s $bus:$device 2>/dev/null`; foreach my $d (@detail) { if ($d =~ /^\s*iManufacturer\s*\d+\s*(.*)/i) { $vendor = $1; } elsif ($d =~ /^\s*iProduct\s*\d+\s*(.*)/i) { $product = $1; } elsif ($d =~ /^\s*iSerial\s*\d+\s(.*)/i) { $serial = $1; #} elsif ($d =~ /^\s*bInterfaceProtocol\s*\d\s(.*)/i) { } elsif ($d =~ /^\s*bInterfaceClass\s*\d+\s*(.*)/i) { #$protocol = $1 unless defined $protocol || $1 eq 'None'; $protocol = $1; #} elsif ($d =~ /^\s*iInterface\s*\d\s(\w+)\s(.*)/i){ } elsif ($d =~ /^\s*bInterfaceSubClass\s*\d+\s(.*)/i){ $interface = $1; } } # Add information to $current $common->addUsb({ DESCRIPTION => $product, INTERFACE => $interface, MANUFACTURER => $vendor, SERIAL => $serial, TYPE => $protocol, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/OS.pm000066400000000000000000000013401432320066700241060ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::OS; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; if ($common->can_run("stat")) { return 1; } else { return 0; } } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $installdate; my $idate; if ($^O =~ /linux/) { $idate=`stat -c %W /`; } elsif (($^O =~ /bsd/) or ($^O =~ /Darwin/)) { $idate=`stat -f %m /`; } my ($day,$month,$year)=(localtime($idate))[3,4,5]; $installdate=sprintf "%02d-%02d-%02d",($year+1900),$month,$day; $common->setHardware({ INSTALLDATE => $installdate }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging.pm000066400000000000000000000004111432320066700254470ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging; use strict; sub check { my $params = shift; # Do not run an package inventory if there is the --nosoftware parameter return if ($params->{config}->{nosoftware}); 1; } sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/000077500000000000000000000000001432320066700251155ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/AppImage.pm000066400000000000000000000010011432320066700271260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::AppImage; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("updatedb") } sub run { my $params = shift; my $common = $params->{common}; foreach(`locate -i "*.appimage"`){ /^(\/)(\S+)(\/)(\S+)/; my $name = $4; my $publisher = "AppImage"; $common->addSoftware({ 'NAME' => $name, 'PUBLISHER' => $publisher }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/BSDpkg.pm000066400000000000000000000020761432320066700265720ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::BSDpkg; sub check { my $params = shift; my $common = $params->{common}; return if ( `uname -rs` =~ /SunOS 5.11/ ); $common->can_run("pkg") || $common->can_run("pkg_info") } sub run { my $params = shift; my $common = $params->{common}; if ($common->can_run("pkg")) { foreach(`pkg info`){ /^(\S+)-(\d+\S*)\s+(.*)/; my $name = $1; my $version = $2; my $comments = $3; $common->addSoftware({ 'COMMENTS' => $comments, 'NAME' => $name, 'VERSION' => $version }); } } elsif ($common->can_run("pkg_info")) { foreach(`pkg_info`){ /^(\S+)-(\d+\S*)\s+(.*)/; my $name = $1; my $version = $2; my $comments = $3; $common->addSoftware({ 'COMMENTS' => $comments, 'NAME' => $name, 'VERSION' => $version }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/ByHand.pm000066400000000000000000000032111432320066700266150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::ByHand; #How does it work ? # #Create a directory called software in place where you have your #"modules.conf" file. #Put your scripts in this directory. #The scripts have to write on the STDIO with the following format : #publisher#software#version#comment # use strict; use warnings; sub check { return(1); 1; } sub run() { my $params = shift; my $common = $params->{common}; my $ligne; my $soft; my $comm; my $version; my $file; my $vendor; my $commentaire; my @dots; #if (!$file || !-d $file) { foreach (@{$common->{config}{etcdir}}) { $file = $_.'/softwares'; last if -d $file; } #} my $logger = $params->{logger}; if ( opendir(my $dh, $file) ){ @dots = readdir($dh); foreach (@dots) { if ( -f $file."/".$_ ){ $comm = $file."/".$_; $logger->debug("Running appli detection scripts from ".$comm); foreach (`$comm`){ $ligne = $_; chomp($ligne); ($vendor,$soft,$version,$commentaire) = split(/\#/,$ligne); $common->addSoftware ({ 'PUBLISHER' => $vendor, 'NAME' => $soft, 'VERSION' => $version, 'FILESIZE' => "", 'COMMENTS' => $commentaire, 'FROM' => 'ByHand' }); } } } closedir $dh; } 1; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/Deb.pm000066400000000000000000000043721432320066700261530ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::Deb; use strict; use warnings; use File::Basename; use File::stat; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("dpkg") } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $size; my $key; my $value; my %statinfo; my @infos; # List of files from which installation date will be extracted my @listfile=glob('"/var/lib/dpkg/info/*.list"'); foreach my $file_list (@listfile){ my $stat=stat($file_list); my ($year,$month,$day,$hour,$min,$sec)=(localtime($stat->mtime))[5,4,3,2,1,0]; $value=sprintf "%02d/%02d/%02d %02d:%02d:%02d",($year+1900),$month,$day,$hour,$min,$sec; $key=fileparse($file_list, ".list"); $key =~ s/(\s+):.+/$1/; $statinfo{$key}=$value; } # Use binary:Package to see all packages (amd64,deb) with dpkg > 1162 my $ver=`dpkg --list dpkg | tail -n 1 | cut -d" " -f14`; $ver=~chomp($ver); my $vers=$common->convertVersion($ver,4); if ($vers > 1162 ){ @infos=`dpkg-query --show --showformat='\${binary:Package}---\${Architecture}---\${Version}---\${Installed-Size}---\${Status}---\${Homepage}---\${Description}\n'`; } else { @infos=`dpkg-query --show --showformat='\${Package}---\${Architecture}---\${Version}---\${Installed-Size}---\${Status}---\${Homepage}---\${Description}\n'`; } foreach my $line (@infos) { next if $line =~ /^ /; chomp $line; my @deb=split("---",$line); if ($deb[4] && $deb[4] !~ / installed/) { $logger->debug("Skipping $deb[0] package as not installed, status='$deb[4]'"); next; } $key=$deb[0]; if (exists $statinfo{$key}) { $common->addSoftware ({ 'NAME' => $deb[0], 'ARCHITECTURE' => $deb[1], 'VERSION' => $deb[2], 'FILESIZE' => ( $deb[3] || 0 ) * 1024, 'PUBLISHER' => $deb[5], 'INSTALLDATE' => $statinfo{$key}, 'COMMENTS' => $deb[6], 'FROM' => 'deb' }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/Flatpak.pm000066400000000000000000000014371432320066700270420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::Flatpak; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("flatpak"); } sub run { my $params = shift; my $common = $params->{common}; if ($common->can_run("flatpak list")) { foreach(`flatpak list`){ /(\S+)(\/)(\S+)(\/)(\S+)\s+(\S+)/; my $name = $1; my $version = $5; my $publisher = "Flatpak package"; my $comments = $6; $common->addSoftware({ 'COMMENTS' => $comments, 'NAME' => $name, 'PUBLISHER' => $publisher, 'VERSION' => $version }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/Gentoo.pm000066400000000000000000000022761432320066700267150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::Gentoo; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("equery") } sub run { my $params = shift; my $common = $params->{common}; # TODO: This had been rewrite from the Linux agent _WITHOUT_ being checked! # New format for listing softwares with equery command (equery 0.3.0.5) # Older version don't run with these options my $equery_vers = `equery --version ` =~ /.*\((.*)\).*/; $equery_vers = $1; my ($major,$minor)=$equery_vers=~/(\d+)\.(\d+)\.\d+/; if ($minor ge 3) { foreach (`equery list --format='\$cp \$fullversion' '*'`){ if (/^(.*) (.*)/) { $common->addSoftware({ 'NAME' => $1, 'VERSION' => $2, }); } } } else { # Old version of Gentoo foreach (`equery list -i`){ if (/^([a-z]\w+-\w+\/\.*)-([0-9]+.*)/) { $common->addSoftware({ 'NAME' => $1, 'VERSION' => $2, }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/Pacman.pm000066400000000000000000000007521432320066700266560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::Pacman; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("/usr/bin/pacman") } sub run { my $params = shift; my $common = $params->{common}; foreach(`/usr/bin/pacman -Q`){ /^(\S+)\s+(\S+)/; my $name = $1; my $version = $2; $common->addSoftware({ 'NAME' => $name, 'VERSION' => $version }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/RPM.pm000066400000000000000000000031241432320066700261110ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::RPM; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("rpm"); # Some time rpm is a wrapper or an alias for another `rpm --version 2>&1`; return if ($? >> 8)!=0; 1; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my @date; my @list; my $buff; foreach (`rpm -qa --queryformat "%{NAME} --%{ARCH}-- %{VERSION}-%{RELEASE} --%{INSTALLTIME}-- --%{SIZE}-- --%{VENDOR}-- %{SUMMARY}\n--\n" 2>/dev/null`) { if (! /^--/) { chomp; $buff .= $_; } elsif ($buff =~ s/^(.*)\s+--(.*)--\s+(\S+)\s+--(.*)--\s+--(.*)--\s+--(.*)--\s+(.*)//) { my ($name,$arch,$version,$installdate,$filesize,$vendor,$comments) = ( $1,$2,$3,$4,$5,$6,$7 ); @date = localtime($installdate); $installdate = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $date[5] + 1900, $date[4] + 1, $date[3], $date[2], $date[1], $date[0]); $common->addSoftware({ 'NAME' => $name, 'ARCHITECTURE' => $arch, 'VERSION' => $version, 'INSTALLDATE' => $installdate, 'FILESIZE' => $filesize, 'COMMENTS' => $comments, 'PUBLISHER' => $vendor, 'FROM' => 'rpm' }); } else { $logger->debug("Should never go here!"); $buff = ''; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Packaging/Snap.pm000066400000000000000000000016071432320066700263600ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Packaging::Snap; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("snap"); } sub run { my $params = shift; my $common = $params->{common}; if ($common->can_run("snap list")) { my $i = 0; foreach(`snap list`){ /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/; if($i >= 1) { my $name = $1; my $version = $2; my $publisher = $5; my $comments = "Snap package"; $common->addSoftware({ 'COMMENTS' => $comments, 'NAME' => $name, 'PUBLISHER' => $publisher, 'VERSION' => $version }); } $i++; } } } 1;UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Printers/000077500000000000000000000000001432320066700250375ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Printers/Cups.pm000066400000000000000000000024041432320066700263070ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Printers::Cups; use strict; sub check { my $params = shift; my $common = $params->{common}; # If we are on a MAC, Mac::SysProfile will do the job return if -r '/usr/sbin/system_profiler'; return unless $common->can_load("Net::CUPS") && $Net::CUPS::VERSION >= 0.60; return 1; } sub run { my $params = shift; my $common = $params->{common}; my $cups = Net::CUPS->new(); my @destinations = $cups->getDestinations(); my $printer; my $description; my $port; my $driver; foreach (@destinations) { $printer = $_->getName() unless $printer; $description = $_->getDescription() unless $description; $port = $_->getUri() unless $port; $driver = $_->getOptionValue("printer-make-and-model") unless $driver; # Just grab the default printer, if I use getDestinations, CUPS # returns all the printer of the local subnet (if it can) # TODO There is room for improvement here $common->addPrinter({ NAME => $printer, DESCRIPTION => $description, PORT => $port, DRIVER => $driver }); $printer = $description = $port = $driver = undef; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository.pm000066400000000000000000000001331432320066700257430ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository; use strict; sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/000077500000000000000000000000001432320066700254105ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/BSD.pm000066400000000000000000000034771432320066700263710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository::BSD; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("pkg"); } my $repo_name; my $repo_baseurl; my $repo_priority; my $repo_mirror_type; my $repo_signature_type; my $repo_fingerprints; my $repo_enable; sub run { my $params = shift; my $common = $params->{common}; if ($^O eq 'freebsd') { foreach my $line (`LANG=C pkg -vv 2>/dev/null`){ next if ($line =~ /^Repositories:/i); if ($line =~ /^\s+(.*):\s\{/i){ $repo_name = $1; } elsif ($line =~ /url\s+:\s\"(.*)\"/i) { $repo_baseurl = $1; } elsif ($line =~ /enabled\s+:\s(.*)\,/i){ $repo_enable = $1; } elsif ($line =~ /priority\s+:\s(.*)\,/i) { $repo_priority = $1; } elsif ($line =~ /Mirror_type\s+:\s\"(.*)\"\,/i){ $repo_mirror_type = $1; } elsif ($line =~ /signature_type\s+:\s\"(.*)\"\,/i){ $repo_signature_type = $1; } elsif ($line =~ /fingerprints\s+:\s\"(.*)\"/i){ $repo_fingerprints = $1; } if ($line =~ /^ \}$/) { $common->addRepo({ BASEURL => $repo_baseurl, NAME => $repo_name, ENABLED => $repo_enable, PRIORITY => $repo_priority, MIRROR => $repo_mirror_type, SIGNATURE => $repo_signature_type, FINGERPRINTS => $repo_fingerprints, }); $repo_name = $repo_baseurl = $repo_enable = $repo_priority = $repo_mirror_type = $repo_signature_type = $repo_fingerprints = undef; } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/CentOS.pm000066400000000000000000000044601432320066700271050ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository::CentOS; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("yum"); } my $repo_name; my $repo_baseurl; my $repo_filename; my $repo_pkgs; my $repo_rev; my $repo_size; my $repo_tag; my $repo_updated; my $repo_mirrors; my $repo_expire; my $repo_exclude; my $repo_excluded; my $repo_metalink; sub run { my $params = shift; my $common = $params->{common}; my @repository=`LANG=C yum -v repolist 2>/dev/null`; push @repository, "\n"; for (my $i=0;$i<$#repository;$i++){ my $line=$repository[$i]; if ($line =~ /^$/ && $repo_name && $repo_filename) { $common->addRepo({ BASEURL => $repo_baseurl, EXCLUDE => $repo_exclude, EXCLUDED => $repo_excluded, EXPIRE => $repo_expire, FILENAME => $repo_filename, MIRRORS => $repo_mirrors, NAME => $repo_name, PKGS => $repo_pkgs, REVISION => $repo_rev, SIZE => $repo_size, TAG => $repo_tag, UPDATED => $repo_updated, }); $repo_name = $repo_baseurl = $repo_filename = $repo_pkgs = $repo_size = $repo_tag = $repo_updated = $repo_mirrors = $repo_expire = $repo_exclude = $repo_excluded = $repo_rev = $repo_metalink = undef; } $repo_name = $1 if ($line =~ /^Repo-name\s+:\s(.*)/i); $repo_baseurl = $1 if ($line =~ /^Repo-baseurl\s+:\s(.*)/i); $repo_mirrors = $1 if ($line =~ /^Repo-mirrors\s+:\s(.*)/i); $repo_filename = $1 if ($line =~ /^Repo-filename:\s(.*)/i); $repo_pkgs = $1 if ($line =~ /^Repo-pkgs\s+:\s(.*)/i); $repo_rev = $1 if ($line =~ /^Repo-revision:\s(.*)/i); $repo_size = $1 if ($line =~ /^Repo-size\s+:\s(.*)/i); $repo_tag = $1 if ($line =~ /^Repo-tags\s+:\s(.*)/i); $repo_updated = $1 if ($line =~ /^Repo-updated\s+:\s(.*)/i); $repo_exclude = $1 if ($line =~ /^Repo-exclude\s+:\s(.*)/i); $repo_excluded = $1 if ($line =~ /^Repo-excluded\s+:\s(.*)/i); $repo_expire = $1 if ($line =~ /^Repo-expire\s+:\s(.*)/i); $repo_metalink =$1 if ($line =~ /^Repo-metalink\s+:\s(.*)/i); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/Debian.pm000066400000000000000000000016131432320066700271310ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository::Debian; use strict; use warnings; sub check{ my $params = shift; my $common = $params->{common}; return unless $common->can_run("apt-cache"); } sub run{ my $params = shift; my $common = $params->{common}; my ($repo_name, $repo_baseurl); my @repository=`apt-cache policy | grep -i http | awk {'print \$2 " " \$3'} | sort -u`; push @repository, "\n"; for (my $i=0;$i<$#repository;$i++){ my $line=$repository[$i]; $repo_name=$1 if ($line =~ /\/([^\/]*)\n$/); $repo_baseurl=$1 if ($line =~ /^(\S*)\h/); if ($line =~ /(^.*$)/ && $repo_name && $repo_baseurl){ $common->addRepo({ NAME => $repo_name, BASEURL => $repo_baseurl, }); $repo_name = $repo_baseurl = undef; } #$repo_name=$1 if ($line =~ /.*\s(\w-?\/\w)/); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/Rhel.pm000066400000000000000000000036301432320066700266420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository::Rhel; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("dnf"); } my $repo_name; my $repo_baseurl; my $repo_filename; my $repo_pkgs; my $repo_rev; my $repo_size; my $repo_expire; my $repo_updated; my $repo_lastupdated; my $repo_mirrors; sub run { my $params = shift; my $common = $params->{common}; my @repository=`LANG=C dnf -v repolist 2>/dev/null`; for (my $i=0;$i<$#repository;$i++){ my $line=$repository[$i]; if ($line =~ /^$/ && $repo_name && $repo_filename) { $common->addRepo({ BASEURL => $repo_baseurl, FILENAME => $repo_filename, NAME => $repo_name, PKGS => $repo_pkgs, REVISION => $repo_rev, SIZE => $repo_size, UPDATED => $repo_updated, LASTUPDATED => $repo_lastupdated, EXPIRE => $repo_expire, MIRRORS => $repo_mirrors, }); $repo_name = $repo_expire = $repo_baseurl = $repo_filename = $repo_pkgs = $repo_rev = $repo_size = $repo_mirrors = $repo_updated = $repo_lastupdated = undef; } $repo_name=$1 if ($line =~ /^Repo-name\s+:\s(.*)/i); $repo_baseurl=$1 if ($line =~ /^Repo-baseurl\s+:\s(.*)/i); $repo_filename=$1 if ($line =~ /^Repo-filename:\s(.*)/i); $repo_pkgs=$1 if ($line =~ /^Repo-pkgs\s+:\s(.*)/i); $repo_rev=$1 if ($line =~ /^Repo-revision\s+:\s(.*)/i); $repo_size=$1 if ($line =~ /^Repo-size\s+:\s(.*)/i); $repo_expire=$1 if ($line =~ /^Repo-expire\s+:\s(.*)/i); $repo_updated=$1 if ($line =~ /^Repo-updated\s+:\s(.*)/i); $repo_lastupdated=$1 if ($line =~ /Updated\s+:\s(.*)/i); $repo_mirrors=$1 if ($line =~ /^Repo-metalink\s+:\s(.*)/i); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Repository/SuSE.pm000066400000000000000000000014341432320066700265670ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Repository::SuSE; use strict; use warnings; use Data::Dumper; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("zypper"); } sub run { my $params = shift; my $common = $params->{common}; my @repository=`LANG=C zypper lr -Ed 2>/dev/null`; for (my $i=0;$i<=$#repository;$i++){ my $line=$repository[$i]; next if ($line =~ /^#/); next if ($line =~ /^-/); my ($num,$alias,$name,$enabled,$gpg,$refresh,$priority,$type,$url)=split('\|',$line); $url =~ s/\s+//g; $name =~ s/^\s+//; $name =~ s/\s+$//; $common->addRepo({ BASEURL => $url, NAME => $name, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Screen.pm000066400000000000000000000144321432320066700250120ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Screen; use strict; use utf8; use Parse::EDID; sub haveExternalUtils { my $common = shift; return $common->can_run("monitor-get-edid-using-vbe") || $common->can_run("monitor-get-edid") || $common->can_run("get-edid"); } sub check { my $params = shift; my $common = $params->{common}; return unless -d "/sys/devices" || haveExternalUtils($common); 1; } sub _getManufacturerFromCode { my $code = shift; my $h = { "ACR" => "Acer America Corp.", "ACT" => "Targa", "ADI" => "ADI Corporation http://www.adi.com.tw", "AOC" => "AOC International (USA) Ltd.", "API" => "Acer America Corp.", "APP" => "Apple Computer, Inc.", "ART" => "ArtMedia", "AST" => "AST Research", "AMW" => "AMW", "AUO" => "AU Optronics Corporation", "BMM" => "BMM", "BNQ" => "BenQ Corporation", "BOE" => "BOE Display Technology", "CPL" => "Compal Electronics, Inc. / ALFA", "CPQ" => "COMPAQ Computer Corp.", "CPT" => "Chunghwa Picture Tubes, Ltd.", "CTX" => "CTX - Chuntex Electronic Co.", "DEC" => "Digital Equipment Corporation", "DEL" => "Dell Computer Corp.", "DPC" => "Delta Electronics, Inc.", "DWE" => "Daewoo Telecom Ltd", "ECS" => "ELITEGROUP Computer Systems", "ENC" => "EIZO", "EIZ" => "EIZO", "EPI" => "Envision Peripherals, Inc.", "FCM" => "Funai Electric Company of Taiwan", "FUJ" => "Fujitsu", "FUS" => "Fujitsu Siemens", "GSM" => "LG Electronics Inc. (GoldStar Technology, Inc.)", "GWY" => "Gateway 2000", "HEI" => "Hyundai Electronics Industries Co., Ltd.", "HIQ" => "Hyundai ImageQuest", "HIT" => "Hitachi", "HSD" => "Hannspree Inc", "HSL" => "Hansol Electronics", "HTC" => "Hitachi Ltd. / Nissei Sangyo America Ltd.", "HWP" => "Hewlett Packard", "IBM" => "IBM PC Company", "ICL" => "Fujitsu ICL", "IFS" => "InFocus", "IQT" => "Hyundai", "IVM" => "Idek Iiyama North America, Inc.", "KFC" => "KFC Computek", "LEN" => "Lenovo", "LGD" => "LG Display", "LKM" => "ADLAS / AZALEA", "LNK" => "LINK Technologies, Inc.", "LPL" => "LG Philips", "LTN" => "Lite-On", "MAG" => "MAG InnoVision", "MAX" => "Maxdata Computer GmbH", "MEI" => "Panasonic Comm. & Systems Co.", "MEL" => "Mitsubishi Electronics", "MIR" => "Miro Computer Products AG", "MTC" => "MITAC", "MS_" => "Panasonic", "NAN" => "NANAO", "NEC" => "NEC Technologies, Inc.", "NVD" => "Fujitsu", "NOK" => "Nokia", "OQI" => "OPTIQUEST", "PBN" => "Packard Bell", "PCK" => "Daewoo", "PDC" => "Polaroid", "PGS" => "Princeton Graphic Systems", "PHL" => "Philips Consumer Electronics Co.", "POS" => "Positivo Tecnologia S.A.", "PRT" => "Princeton", "PTS" => "ProView/EMC/PTS YakumoTFT17SL", "REL" => "Relisys", "SAM" => "Samsung", "SMI" => "Smile", "SMC" => "Samtron", "SNI" => "Siemens Nixdorf", "SNY" => "Sony Corporation", "SPT" => "Sceptre", "SRC" => "Shamrock Technology", "STN" => "Samtron", "STP" => "Sceptre", "TAT" => "Tatung Co. of America, Inc.", "TOS" => "Toshiba", "TRL" => "Royal Information Company", "TSB" => "Toshiba, Inc.", "UNM" => "Unisys Corporation", "VSC" => "ViewSonic Corporation", "WTC" => "Wen Technology", "ZCM" => "Zenith Data Systems", "___" => "Targa" }; return $h->{$code} if (exists ($h->{$code}) && $h->{$code}); return "Unknown manufacturer code ".$code; } sub getEdid { my $raw_edid; my $port = $_[0]; # Mandriva $raw_edid = `monitor-get-edid-using-vbe --port $port 2>/dev/null`; # Since monitor-edid 1.15, it's possible to retrieve EDID information # through DVI link but we need to use monitor-get-edid if (!$raw_edid) { $raw_edid = `monitor-get-edid --vbe-port $port 2>/dev/null`; } if (!$raw_edid) { foreach (1..5) { # Sometime get-edid return an empty string... $raw_edid = `get-edid 2>/dev/null`; last if (length($raw_edid) == 128 || length($raw_edid) == 256); } } return unless (length($raw_edid) == 128 || length($raw_edid) == 256); return $raw_edid; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $raw_perl = 1; my $verbose; my $MonitorsDB; my $base64; my $uuencode; my %found; my @edid_list; # first check sysfs if there are edid entries for my $file(split(/\0/,`find /sys/devices -wholename '*/card*/edid' -print0`)) { open(my $sys_edid_fd,'<',$file); my $raw_edid = do { local $/; <$sys_edid_fd> }; if (length($raw_edid) == 128 || length($raw_edid) == 256 ) { push @edid_list, $raw_edid; } } # if not fall back to the old method if (!@edid_list && haveExternalUtils($common)) { for my $port(0..20){ my $raw_edid = getEdid($port); if ($raw_edid){ if (length($raw_edid) == 128 || length($raw_edid) == 256) { push @edid_list, $raw_edid; } } } } for my $raw_edid(@edid_list) { my $edid = parse_edid($raw_edid); if (my $err = check_parsed_edid($edid)) { $logger->debug("check failed: bad edid: $err"); } my $caption = $edid->{monitor_name}; $caption =~ s/[^ -~].*$//; my $description = $edid->{week}."/".$edid->{year}; my $manufacturer = _getManufacturerFromCode($edid->{manufacturer_name}); my $serial = $edid->{serial_number}; if (!exists $found{$serial}) { $found{$serial} = 1; eval "use MIME::Base64;"; $base64 = encode_base64($raw_edid) if !$@; if ($common->can_run("uuencode")) { chomp($uuencode = `echo $raw_edid|uuencode -`); if (!$base64) { chomp($base64 = `echo $raw_edid|uuencode -m -`); } } $common->addMonitor ({ BASE64 => $base64, CAPTION => $caption, DESCRIPTION => $description, MANUFACTURER => $manufacturer, SERIAL => $serial, UUENCODE => $uuencode, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Generic/Users.pm000066400000000000000000000065641432320066700247030ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Generic::Users; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; # Useless check for a posix system i guess my @who = `who 2>/dev/null`; my @last = `last -n 1 2>/dev/null`; if (($common->can_read("/etc/passwd") && $common->can_read("/etc/group")) || @who || @last ) { return 1; } else { return 0; } } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my %users; # Logged on users for (`who`){ my $user = $1 if /^(\S+)./; $common->addUser ({ LOGIN => $user }); } # Local users foreach my $user (_getLocalUsers()) { push @{$users{$user->{GID}}}, $user->{LOGIN}; #delete $user->{GID}; $common->addLocalUser({ LOGIN => $user->{LOGIN}, ID_USER => $user->{ID_USER}, GID => $user->{GID}, NAME => $user->{NAME}, HOME => $user->{HOME}, SHELL => $user->{SHELL} }); } # Local groups with members foreach my $group (_getLocalGroups()) { push @{$group->{MEMBER}}, @{$users{$group->{ID_GROUP}}} if $users{$group->{ID_GROUP}}; my $group_member = join ',', @{$group->{MEMBER}}; $common->addLocalGroup({ ID_GROUP => $group->{ID_GROUP}, NAME => $group->{NAME}, MEMBER => $group_member }); } # last logged user $common->setHardware(_getLast()); } sub _getLocalUsers{ open(my $fh, '<:encoding(UTF-8)', "/etc/passwd") or warn; my @userinfo=<$fh>; close($fh); my @users; foreach my $line (@userinfo){ next if $line =~ /^#/; next if $line =~ /^[+-]/; # old format for external inclusion chomp $line; my ($login, undef, $uid, $gid, $gecos, $home, $shell) = split(/:/, $line); push @users, { LOGIN => $login, ID_USER => $uid, GID => $gid, NAME => $gecos, HOME => $home, SHELL => $shell, }; } return @users; } sub _getLocalGroups { open(my $fh, '<:encoding(UTF-8)', "/etc/group") or warn; my @groupinfo=<$fh>; close($fh); my @groups; foreach my $line (@groupinfo){ next if $line =~ /^#/; chomp $line; my ($name, undef, $gid, $members) = split(/:/, $line); my @members = split(/,/, $members); push @groups, { ID_GROUP => $gid, NAME => $name, MEMBER => \@members, }; } return @groups; } sub _getLast { my ($lastuser,$lastlogged); my @info=`last -n 50`; foreach my $last (@info) { chomp $last; next if $last =~ /^(reboot|shutdown)/; my @last = split(/\s+/, $last); next unless (@last); $lastuser = shift @last or next; # Found time on column starting as week day shift @last while ( @last > 3 && $last[0] !~ /^mon|tue|wed|thu|fri|sat|sun/i ); $lastlogged = @last > 3 ? "@last[0..3]" : undef; last; } return unless $lastuser; return { LASTLOGGEDUSER => $lastuser, DATELASTLOGGEDUSER => $lastlogged }; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX.pm000066400000000000000000000011771432320066700230050ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $OSName; my $OSVersion; my $OSComment; #my $uname_path = &_get_path('uname'); # Operating systeminformations chomp($OSName = `uname -s`); chomp($OSVersion = `uname -r`); chomp($OSComment = `uname -l`); $common->setHardware({ OSNAME => $OSName, OSCOMMENTS => $OSComment, OSVERSION => $OSVersion, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/000077500000000000000000000000001432320066700224415ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Bios.pm000066400000000000000000000024031432320066700236720ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Bios; use strict; ### # Version 1.1 # Correction of Bug n 522774 # # thanks to Marty Riedling for this correction # ### sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $BiosVersion; my $BiosDate; my $SystemModel; my $SystemSerial; $SystemModel=`model`; if ($common->can_run ("machinfo")) { foreach (`machinfo`) { if (/Firmware\s+revision\s?[:=]\s+(\S+)/) { $BiosVersion=$1; } if (/achine\s+serial\s+number\s?[:=]\s+(\S+)/) { $SystemSerial=$1; } } } else { for (`echo 'sc product cpu;il' | /usr/sbin/cstm | grep "PDC Firmware"`) { if (/Revision:\s+(\S+)/){ $BiosVersion="PDC $1"; } } for (`echo 'sc product system;il' | /usr/sbin/cstm | grep "System Serial Number"`) { if (/:\s+(\w+)/) { $SystemSerial=$1; } } } $common->setBios ({ BVERSION => $BiosVersion, BDATE => $BiosDate, BMANUFACTURER => "HP", SMANUFACTURER => "HP", SMODEL => $SystemModel, SSN => $SystemSerial, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/CPU.pm000066400000000000000000000060311432320066700234260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::CPU; ### # Version 1.1 # Correction of Bug n 522774 # # thanks to Marty Riedling for this correction # ### use strict; use LWP::UserAgent; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $processort; my $processorn; my $processors=""; my $DeviceType; my $cpuInfo; my $serie; # Using old system HpUX without machinfo # the Hpux with machinfo will be done after my %cpuInfos = ( "D200"=>"7100LC 75", "D210"=>"7100LC 100", "D220"=>"7300LC 132", "D230"=>"7300LC 160", "D250"=>"7200 100", "D260"=>"7200 120", "D270"=>"8000 160", "D280"=>"8000 180", "D310"=>"7100LC 100", "D320"=>"7300LC 132", "D330"=>"7300LC 160", "D350"=>"7200 100", "D360"=>"7200 120", "D370"=>"8000 160", "D380"=>"8000 180", "D390"=>"8200 240", "K360"=>"8000 180", "K370"=>"8200 200", "K380"=>"8200 240", "K400"=>"7200 100", "K410"=>"7200 120", "K420"=>"7200 120", "K460"=>"8000 180", "K570"=>"8200 200", "K580"=>"8200 240", "L1000-36"=>"8500 360", "L1500-7x"=>"8700 750", "L3000-7x"=>"8700 750", "N4000-44"=>"8500 440", "ia64 hp server rx1620"=>"itanium 1600"); if ( $common->can_run ("machinfo") ) { foreach ( `machinfo`) { if ( /Number of CPUs\s+=\s+(\d+)/ ) { $processorn=$1; } if ( /Clock speed\s+=\s+(\d+)\s+MHz/ ) { $processors=$1; } # Added for HPUX 11.31 if ( /Intel\(R\) Itanium 2 9[01]00 series processor \((\d+\.\d+)/ ) { $processors=$1*1000; } if ( /(\d+)\s+logical processors/ ) { $processorn=$1; } # end HPUX 11.31 } } else { chomp($DeviceType =`model |cut -f 3- -d/`); my $cpuInfo = $cpuInfos{"$DeviceType"}; if ( "$cpuInfo" =~ /^(\S+)\s(\S+)/ ) { $processort=$1; $processors=$2; } else { for ( `echo 'sc product cpu;il' | /usr/sbin/cstm | grep "CPU Module"` ) { if ( /(\S+)\s+CPU\s+Module/ ) { $processort=$1; } }; for ( `echo 'itick_per_usec/D' | adb -k /stand/vmunix /dev/kmem` ) { if ( /tick_per_usec:\s+(\d+)/ ) { $processors=$1; } } }; # NBR CPU chomp($processorn=`ioscan -Fk -C processor | wc -l`); #print "HP $processort A $processorn A $processors "; } chomp($serie = `uname -m`); if ( $serie =~ /ia64/) { $processort="Itanium" } if ( $serie =~ /9000/) { $processort="PA$processort"; } $common->setHardware({ PROCESSORT => $processort, PROCESSORN => $processorn, PROCESSORS => $processors, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Controller.pm000066400000000000000000000014461432320066700251270ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Controller; use strict; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $name; my $interface; my $info; my $type; my @typeScaned=('ext_bus','fc','psi'); my $scaned; for (@typeScaned) { $scaned=$_; for ( `ioscan -kFC $scaned| cut -d ':' -f 9,11,17,18` ) { if ( /(\S+):(\S+):(\S+):(.+)/ ) { $name=$2; $interface=$3; $info=$4; $type=$1; $common->addController({ 'NAME' => $name, 'MANUFACTURER' => "$interface $info", 'TYPE' => $type, }); }; }; }; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Domains.pm000066400000000000000000000013461432320066700243750ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Domains; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("domainname") } sub run { my $params = shift; my $common = $params->{common}; my $domain; chomp($domain = `domainname`); if (!$domain) { my %domain; if (open RESOLV, "/etc/resolv.conf") { while() { $domain{$2} = 1 if (/^(domain|search)\s+(.+)/); } close RESOLV; } $domain = join "/", keys %domain; } # If no domain name, we send "WORKGROUP" $domain = 'WORKGROUP' unless $domain; $common->setHardware({ WORKGROUP => $domain }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Drives.pm000066400000000000000000000026151432320066700242370ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Drives; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $type; my $fs; my $lv; my $total; my $free; for ( `fstyp -l | grep -v nfs` ) { if ( /^\s*$/ ) { #Blank line next; } $type=$_; for ( `bdf -t $type `) { if ( /Filesystem/ ) { ; } ; if ( /^(\S+)\s(\d+)\s+(\d+)\s+(\d+)\s+(\d+%)\s+(\S+)/ ) { $lv=$1; $total=$2; $free=$3; $fs=$6; $common->addDrives({ FREE => $free, FILESYSTEM => $fs, TOTAL => $total, TYPE => $type, VOLUMN => $lv, }); }; if ( /^(\S+)\s/) { $lv=$1; }; if ( /(\d+)\s+(\d+)\s+(\d+)\s+(\d+%)\s+(\S+)/) { $total=$1; $free=$3; $fs=$5; # print "fs $fs lv $lv total $total free $free type $type\n"; $common->addDrives({ FREE => $free, FILESYSTEM => $fs, TOTAL => $total, TYPE => $type, VOLUMN => $lv, }); }; }; }; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/IPv4.pm000066400000000000000000000007441432320066700235660ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::IPv4; sub check { `which ifconfig 2>&1`; ($? >> 8)?0:1 } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $ip; my $hostname; if ( `hostname` =~ /(\S+)/ ) { $hostname=$1; } for ( `grep $hostname /etc/hosts ` ) { if ( /(^\d+\.\d+\.\d+\.\d+)\s+/ ){ $ip=$1; $common->setHardware({IPADDR => $ip}); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Mem.pm000066400000000000000000000010601432320066700235120ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Mem; use strict; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $mem; my $swap; $mem = `grep Physical /var/adm/syslog/syslog.log|tr -s " "|cut -f 7 -d " "` ; if ( $mem eq "" ) { $mem = `grep Physical /var/adm/syslog/OLDsyslog.log|tr -s " "|cut -f 7 -d " "` ; }; $mem = int ($mem/1024); $swap = `swapinfo -mdfq`; $common->setHardware({ MEMORY => $mem, SWAP => $swap, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Memory.pm000066400000000000000000000063521432320066700242550ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Memory; use strict; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $capacity=0; my $caption; my $description; my $numslot; my $subnumslot; my $serialnumber; my $type; my @list_mem=`echo 'sc product mem;il'| /usr/sbin/cstm`; my $ok=0; if ( `uname -m` =~ /ia64/ ) { for ( `echo 'sc product IPF_MEMORY;il' | /usr/sbin/cstm` ) { if ( /\w+IMM\s+Location/ ) { ; } elsif ( /(\w+IMM)\s+(\w+)\s+(\S+)\s+(\w+IMM)\s+(\w+)\s+(\S+)/ ) { $common->addMemories({ CAPACITY => $3, CAPTION => $2 , NUMSLOTS => "1" , TYPE => $1, }); $common->addMemories({ CAPACITY => $6, CAPTION => $5 , NUMSLOTS => "1" , TYPE => $4, }); } } } else { for ( `echo 'sc product system;il' | /usr/sbin/cstm ` ) { if ( /FRU\sSource\s+=\s+\S+\s+\(memory/ ) { $ok=0; #print "FRU Source memory\n"; } if ( /Source\s+Detail\s+=\s4/ ) { $ok=1; #print "Source Detail IMM\n"; } if ( /Extender\s+Location\s+=\s+(\S+)/ ) { $subnumslot=$1; #print "Extended sub $subnumslot\n"; }; if ( /DIMMS\s+Rank\s+=\s+(\S+)/ ) { $numslot=sprintf("%02x",$1); #print "Num slot $numslot\n"; } if ( /FRU\s+Name\.*:\s+(\S+)/ ) { if ( /(\S+)_(\S+)/ ) { $type=$1; $capacity=$2; #print "Type $type capa $capacity\n"; } elsif ( /(\wIMM)(\S+)/ ) { $ok=1; $type=$1; $numslot=$2; #print "Type $type numslot $numslot\n"; } } if ( /Part\s+Number\.*:\s*(\S+)\s+/ ) { $description=$1; #print "ref $description\n"; }; if ( /Serial\s+Number\.*:\s*(\S+)\s+/ ) { $serialnumber=$1; if ( $ok eq 1 ) { if ( $capacity eq 0 ){ foreach ( @list_mem ){ if ( /\s+$numslot\s+(\d+)/ ){ $capacity=$1; #print "Capacity $capacity\n"; } } } $common->addMemories({ CAPACITY => $capacity, CAPTION => "Ext $subnumslot Slot $numslot" , DESCRIPTION => "Part Number $description", NUMSLOTS => "1" , SERIALNUMBER => $serialnumber, TYPE => $type, }); $ok=0; $capacity=0; }; #print "Serial $serialnumber\n\n"; }; }; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Networks.pm000066400000000000000000000051061432320066700246150ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Networks; sub check { my $params = shift; my $common = $params->{common}; $common->can_load("Net::IP qw(:PROC)"); } sub run { my $params = shift; my $common = $params->{common}; my $name; my $lanid; my $ipmask; my $ipgateway; my $status; my $macaddr; my $speed; my $type; my $ipsubnet; my $description; my $ipaddress; my $binip; my $binmask; my $binsubnet; for ( `lanscan -iap`) { # Reinit variable $name=""; $lanid=""; $ipmask=""; $ipgateway=""; $status=""; $macaddr=""; $speed=""; $type=""; $ipsubnet=""; $description=""; $ipaddress=""; if ( /^(\S+)\s(\S+)\s(\S+)\s+(\S+)/) { $name=$2; $macaddr=$1; $lanid=$4; #print "name $name macaddr $macaddr lanid $lanid\n"; for ( `lanadmin -g $lanid` ) { if (/Type.+=\s(.+)/) { $type = $1; }; if (/Description\s+=\s(.+)/) { $description = $1; }; if (/Speed.+=\s(\d+)/) { $speed = $1; unless ( $speed <= 1000000 ) { # in old version speed was given in Mbps # we want speed in Mbps $speed = $1/1000000; } }; if (/Operation Status.+=\s(.+)/) { $status = $1; }; }; # for lanadmin #print "name $name macaddr $macaddr lanid $lanid speed $speed status $status \n"; for ( `ifconfig $name 2> /dev/null` ) { if ( /inet\s(\S+)\snetmask\s(\S+)\s/ ) { $ipaddress=$1; $ipmask=$2; if ($ipmask =~ /(..)(..)(..)(..)/) { $ipmask=sprintf ("%i.%i.%i.%i",hex($1),hex($2),hex($3),hex($4)); } }; }; # For ifconfig $binip = ip_iptobin ($ipaddress ,4); $binmask = ip_iptobin ($ipmask ,4); $binsubnet = $binip & $binmask; $ipsubnet = ip_bintoip($binsubnet,4); $common->addNetworks({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, STATUS => $status, SPEED => $speed, TYPE => $type, }); }; # If }; # For lanscan } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/README000066400000000000000000000030671432320066700233270ustar00rootroot00000000000000##################################################### # 17/12/2009 # Auteur: dwizz.donowin@yahoo.fr # # This code is open source and may be copied and modified as long as the source # code is always made freely available. # Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt # ################################################################################ Version Francaise ----------------- (for english version see below) Ces fichiers sont generes pour etre utilisis avec l'agent Unix OCS-NG 1.02 Installation: Installer le client OCS-NG 1.02 avec ces prerequis extraire les fichiers dans le repertoire Ocsinventory/Agent/Backend/OS Ils seront automatiquement pris en compte par le client OCS Je n'ai pu tester ces fichiers que sur N4000 actuellement en version HP-UX 11.0 J'ai commence sur un rp3440 mais je n'ai pas encore toutes les informations car le format des certaines donnees change. N'hesitez pas a m'aider a le faire evoluer. English version --------------- This files are producted for using with the OCS-NG 1.02 Unix Agent Install: Install the OCS-NG 1.02 Agent with the prerequesit Extract the files in the Ocsinventory/Agent/Backend/OS It will be used automatically I have test the script on only n4000 system for th moment on HP-Ux 11.0 I try it on rp3440 but some informations are not in the same format If you wish to help me, you are welwome. the files are HPUX.pm HPUX sub directory Bios.pm CPU.pm Controller.pm Domains.pm Drives.pm IPv4.pm Mem.pm Memory.pm Networks.pm Slots.pm Software.pm Storages.pm UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Slots.pm000066400000000000000000000015251432320066700241060ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Slots; use strict; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my $name; my $interface; my $info; my $type; my @typeScaned=('ioa','ba'); my $scaned; for (@typeScaned ) { $scaned=$_; for ( `ioscan -kFC $scaned| cut -d ':' -f 9,11,17,18` ) { if ( /(\S+):(\S+):(\S+):(.+)/ ) { $name=$2; $interface=$3; $info=$4; $type=$1; $common->addSlots({ DESCRIPTION => "$name", DESIGNATION => "$interface $info", NAME => "$type", STATUS => "OK", }); }; }; }; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Software.pm000066400000000000000000000014361432320066700245750ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Software; sub check { my $params = shift; # Do not run an package inventory if there is the --nosoftware parameter return if ($params->{params}->{nosoftware}); $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my @softList; my $software; @softList = `swlist | grep -v '^ PH' | grep -v '^#' |tr -s "\t" " "|tr -s " "` ; foreach $software (@softList) { chomp( $software ); if ( $software =~ /^ (\S+)\s(\S+)\s(.+)/ ) { $common->addSoftwares({ 'NAME' => $1 , 'VERSION' => $2 , 'COMMENTS' => $3 , 'PUBLISHER' => "HP" , }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/HPUX/Storages.pm000066400000000000000000000054511432320066700245730ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::HPUX::Storages; sub check { $^O =~ /hpux/ } sub run { my $params = shift; my $common = $params->{common}; my @all_type = ("tape","disk") ; my $type; my $description; my $path; my $vendor; my $ref; my $size; my $devdsk; my $devrdsk; my $revlvl; my $alternate; for ( @all_type ) { $type = "$_"; for ( `ioscan -kFnC $type | cut -d ':' -f 1,11,18` ) { if ( /(\S+)\:(\S+)\:(\S+)\s+(\S+)/ ) { $description = $1; $path = $2; $vendor = $3; $ref = $4; }; $alternate = 0 ; if ( $type eq "disk" ) { if ( /\s+(\/dev\/dsk\/\S+)\s+(\/dev\/rdsk\/\S+)/ ) { #print "1 $1 2 $2 \n"; $devdsk=$1; $devrdsk=$2; # We look if we are on an alternate link for ( `pvdisplay $devdsk 2> /dev/null` ) { if ( /$devdsk\.+lternate/ ) { $alternate=1; }; }; # We are not on an alternate link if ( $alternate eq 0 ) { #$size = `diskinfo -b $devrdsk`; for ( `diskinfo -v $devrdsk`) { if ( /^\s+size:\s+(\S+)/ ) { $size=$1; $size = int ( $size/1024 ) if $size; }; if ( /^\s+rev level:\s+(\S+)/ ) { $revlvl=$1; }; }; #print "vendor $vendor ref $ref type $type description $description path $path size $size\n"; $common->addStorages({ MANUFACTURER => $vendor, MODEL => $ref, NAME => $devdsk, DESCRIPTION => $description, TYPE => $type, DISKSIZE => $size, FIRMWARE => $revlvl, }); }; }; } else { # We look for tapes if ( /^\s+(\/dev\/rmt\/\Sm)\s+/ ) { $devdsk=$1; $common->addStorages({ MANUFACTURER => $vendor, MODEL => $ref, NAME => $devdsk, DESCRIPTION => $description, TYPE => $type, DISKSIZE => '' }); }; }; }; }; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux.pm000066400000000000000000000015441432320066700233160ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; sub check { $^O =~ /^linux$/ } sub run { my $params = shift; my $common = $params->{common}; chomp (my $osversion = `uname -r`); my $lastloggeduser; my $datelastlog; my @query = $common->runcmd("last -R -n 1"); foreach ($query[0]) { if ( s/^(\S+)\s+\S+\s+(\S+\s+\S+\s+\S+\s+\S+)\s+.*// ) { $lastloggeduser = $1; $datelastlog = $2; } } # This will probably be overwritten by a Linux::Distro module. $common->setHardware({ OSNAME => "Linux", OSCOMMENTS => "Unknown Linux distribution", OSVERSION => $osversion, LASTLOGGEDUSER => $lastloggeduser, DATELASTLOGGEDUSER => $datelastlog }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/000077500000000000000000000000001432320066700227545ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/000077500000000000000000000000001432320066700240145ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/ARM.pm000066400000000000000000000002561432320066700247740ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::ARM; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^arm/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/ARM/000077500000000000000000000000001432320066700244335ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/ARM/Bios.pm000066400000000000000000000030651432320066700256710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::ARM::Bios; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/cpuinfo"); $common->can_run("vcgencmd"); } sub run { my $params = shift; my $common = $params->{common}; my $current; my @infos; # processor : 0 # model name : ARMv6-compatible processor rev 7 (v6l) # BogoMIPS : 697.95 # Features : half thumb fastmult vfp edsp java tls # CPU implementer : 0x41 # CPU architecture : 7 # CPU variant : 0x0 # CPU part : 0xb76 # CPU revision : 7 # # Hardware : BCM2835 # Revision : 0002 # Serial : 0000000081355bf5 # Model : Raspberry Pi Model B Rev 1 open INFO, ") { $current->{SSN} = $1 if /Serial\s+:\s+(\S.*)/; $current->{BVERSION} = $1 if /Revision\s+:\s+(.*)/; $current->{TYPE} = $1 if /Model\s+:\s+(.*)/; push @infos, $current; } close(INFO); # vcgencmd version my $bd=`vcgencmd version | head -1`; $bd =~ s/^(#.*\n)//g; $bd =~ s/Invalid.*$//g; chomp($bd); # Writing data foreach my $info (@infos) { $info->{ASSETTAG}='N/A'; $info->{SMANUFACTURER}='Raspberry'; $info->{SMODEL}='Raspberry'; $info->{BMANUFACTURER}='N/A'; $info->{BDATE}=$bd; $info->{MMANUFACTURER}='N/A'; $common->setBios($info); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/ARM/CPU.pm000066400000000000000000000030201432320066700254130ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::ARM::CPU; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lscpu"); $common->can_run("vcgencmd"); } sub run { my $params = shift; my $common = $params->{common}; my @cpuinfos=`LANG=C lscpu 2>/dev/null`; my $cpu; my $nbcpus; my $freq; foreach my $info (@cpuinfos){ chomp $info; $cpu->{CPUARCH}=$1 if ($info =~ /Architecture:\s*(.*)/i); $cpu->{NBCPUS}=$1 if ($info =~ /^CPU\(s\):\s*(\d+)/i); $cpu->{THREADS}=$1 if ($info =~ /Thread\(s\)\sper\score:\s*(\d+)/i); $cpu->{CORES}=$1 if ($info =~ /Core\(s\)\sper\ssocket:\s*(\d+)/i); $cpu->{NBSOCKET}=$1 if ($info =~ /Socket\(s\):\s*(\d+)/i); $cpu->{TYPE}=$1 if ($info =~ /Model\sname:\s*(.*)/i); $cpu->{MANUFACTURER}=$1 if ($info =~ /Vendor ID:\s*(.+)/i); $cpu->{SPEED}=$1 if ($info =~ /CPU max MHZ:\s*(.*)/i); if ($cpu->{CPUARCH} && $cpu->{CPUARCH} =~ /(armv[1-7])/){ $cpu->{DATA_WIDTH}='32'; } else { $cpu->{DATA_WIDTH}='64'; } } # Frequency $cpu->{CURRENT_SPEED}=`vcgencmd get_config arm_freq | cut -d"=" -f 2`; # Total Threads = number of cores x number of threads per core $cpu->{THREADS}=$cpu->{CORES}*$cpu->{THREADS}; # Set LOGICAL_CPUS with THREADS value $cpu->{LOGICAL_CPUS}=$cpu->{THREADS}; for (my $i=0;$i<$cpu->{NBSOCKET};$i++) { $common->addCPU($cpu); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/Alpha.pm000066400000000000000000000002621432320066700253770ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::Alpha; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^alpha/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/Alpha/000077500000000000000000000000001432320066700250415ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/Alpha/CPU.pm000066400000000000000000000015641432320066700260340ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::Alpha::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my @cpu; my $current; open CPUINFO, ") { print; if (/^cpu\s*:/) { if ($current) { $common->addCPU($current); } $current = { CPUARCH => 'Alpha', }; } else { $current->{SERIAL} = $1 if /^cpu serial number\s+:\s+(\S.*)/; $current->{SPEED} = $1 if /cycle frequency \[Hz\]\s+:\s+(\d+)000000/; $current->{TYPE} = $1 if /platform string\s+:\s+(\S.*)/; } } # The last one $common->addCPU($current); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/MIPS.pm000066400000000000000000000002601432320066700251200ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::MIPS; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^mips/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/MIPS/000077500000000000000000000000001432320066700245645ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/MIPS/CPU.pm000066400000000000000000000013071432320066700255520ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::MIPS::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my @cpu; my $current; open CPUINFO, ") { print; if (/^system type\s+:\s*:/) { if ($current) { $common->addCPU($current); } $current = { CPUARCH => 'MIPS', }; } $current->{TYPE} = $1 if /cpu model\s+:\s+(\S.*)/; } # The last one $common->addCPU($current); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/PowerPC.pm000066400000000000000000000002741432320066700256740ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::PowerPC; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^(ppc|powerpc)/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/PowerPC/000077500000000000000000000000001432320066700253335ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/PowerPC/CPU.pm000066400000000000000000000024471432320066700263270ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::PowerPC::CPU; use strict; #processor : 0 #cpu : POWER4+ (gq) #clock : 1452.000000MHz #revision : 2.1 # #processor : 1 #cpu : POWER4+ (gq) #clock : 1452.000000MHz #revision : 2.1 # #timebase : 181495202 #machine : CHRP IBM,7029-6C3 # # sub check { my $params = shift; my $common = $params->{common}; $common->can_read ("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my @cpus; my $current; my $isIBM; open CPUINFO, ") { $isIBM = 1 if /^machine\s*:.*IBM/; $current->{TYPE} = $1 if /cpu\s+:\s+(\S.*)/; $current->{SPEED} = $1 if /clock\s+:\s+(\S.*)/; $current->{SPEED} =~ s/\.[0-9]+MHz//; if (/^\s*$/) { if ($current->{TYPE}) { push @cpus, $current; } $current = {}; } } if (/^\s*$/) { if ($current->{TYPE}) { push @cpus, $current; } $current = {}; } foreach my $cpu (@cpus) { $cpu->{MANUFACTURER} = 'IBM' if $isIBM; $cpu->{CPUARCH} = 'PowerPC'; $common->addCPU($cpu); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/PowerPC/Various.pm000066400000000000000000000031741432320066700273260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::PowerPC::Various; use strict; sub check { 1 }; sub run { my $params = shift; my $common = $params->{common}; ############ Motherboard my $SystemManufacturer; my $SystemModel; my $SystemSerial; my $BiosManufacturer; my $BiosVersion; my $BiosDate; if (open SERIAL,"; $SystemSerial =~ s/[^\,^\.^\w^\ ]//g; # I remove some unprintable char close SERIAL; } if (open MODEL,"; $SystemModel =~ s/[^\,^\.^\w^\ ]//g; close MODEL; } if (open COLOR,"; close COLOR; my ($color) = unpack "h7" , $tmp; $SystemModel = $SystemModel." color: $color" if $color; } if (open OPENBOOT,"; $BiosVersion =~ s/[^\,^\.^\w^\ ]//g; close OPENBOOT; } if (open COPYRIGHT,"; close COPYRIGHT; if ($tmp =~ /Apple/) { # What about the Apple clone? $BiosManufacturer = "Apple Computer, Inc."; $SystemManufacturer = "Apple Computer, Inc." } } $common->setBios ({ SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, BMANUFACTURER => $BiosManufacturer, BVERSION => $BiosVersion, BDATE => $BiosDate, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/SPARC.pm000066400000000000000000000002621432320066700252220ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::SPARC; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^sparc/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/SPARC/000077500000000000000000000000001432320066700246645ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/SPARC/CPU.pm000066400000000000000000000011211432320066700256440ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::SPARC::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read ("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my @cpu; my $current = { CPUARCH => 'ARM' }; my $ncpus = 1; open CPUINFO, ") { $current->{TYPE} = $1 if /cpu\s+:\s+(\S.*)/; $ncpus = $1 if /ncpus probed\s+:\s+(\d+)/ } foreach (1..$ncpus) { $common->addCPU($current); } } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/i386.pm000066400000000000000000000002701432320066700250420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::i386; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^(i\d86|x86_64)/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/i386/000077500000000000000000000000001432320066700245055ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/i386/CPU.pm000066400000000000000000000045471432320066700255040ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::i386::CPU; use strict; use warnings; use Data::Dumper; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lscpu"); } sub run { my $params = shift; my $common = $params->{common}; my @cpuinfos=`LANG=C lscpu`; my $cpu; my $nbcpus; foreach my $info (@cpuinfos){ chomp $info; $cpu->{CPUARCH}=$1 if ($info =~ /Architecture:\s*(.*)/i); $cpu->{NBCPUS}=$1 if ($info =~ /^CPU\(s\):\s*(\d+)/i); $cpu->{THREADS}=$1 if ($info =~ /Thread\(s\)\sper\score:\s*(\d+)/i); $cpu->{CORES}=$1 if ($info =~ /Core\(s\)\sper\ssocket:\s*(\d+)/i); $cpu->{NBSOCKET}=$1 if ($info =~ /Socket\(s\):\s*(\d+)/i); $cpu->{TYPE}=$1 if ($info =~ /Model\sname:\s*(.*)/i); if ($info =~ /Vendor ID:\s*(Authentic|Genuine|)(.+)/i){ $cpu->{MANUFACTURER} = $2; $cpu->{MANUFACTURER} =~ s/(TMx86|TransmetaCPU)/Transmeta/; $cpu->{MANUFACTURER} =~ s/CyrixInstead/Cyrix/; $cpu->{MANUFACTURER} =~ s/CentaurHauls/VIA/; } $cpu->{CURRENT_SPEED} = $1 if ($info =~ /CPU\sMHz:\s*(\d+)(|\.\d+)$/i); $cpu->{L2CACHESIZE} = $1 if ($info =~ /L2\scache:\s*(.*)/i); if ($cpu->{CPUARCH} && $cpu->{CPUARCH} eq 'x86_64'){ $cpu->{DATA_WIDTH}='64'; } else { $cpu->{DATA_WIDTH}='32'; } if ($cpu->{TYPE}) { if ($cpu->{TYPE} =~ /([\d\.]+)MHz$/){ $cpu->{SPEED}=$1; } elsif ($cpu->{TYPE} =~ /([\d\.]+)GHz$/){ $cpu->{SPEED}=$1*1000; } } } # Total Threads = number of cores x number of threads per core $cpu->{THREADS}=$cpu->{CORES}*$cpu->{THREADS}; # Set LOGICAL_CPUS with THREADS value $cpu->{LOGICAL_CPUS}=$cpu->{THREADS}; # set CURRENT_ADDRESS_WIDTH with DATA_WIDTH value $cpu->{CURRENT_ADDRESS_WIDTH}=$cpu->{DATA_WIDTH}; my $infos=$common->getDmidecodeInfos(); foreach my $info (@{$infos->{4}}) { next if $info->{Status} && $info->{Status} =~ /Unpopulated|Disabled/i; $cpu->{SERIALNUMBER}=$info->{'Serial Number'}; $cpu->{VOLTAGE}=$info->{'Voltage'}; $cpu->{SOCKET}=$info->{'Socket Designation'}; } for (my $i=0;$i<$cpu->{NBSOCKET};$i++) { $common->addCPU($cpu); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/m68k.pm000066400000000000000000000002561432320066700251420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::m68k; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^m68k/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/m68k/000077500000000000000000000000001432320066700246015ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/m68k/CPU.pm000066400000000000000000000014121432320066700255640ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::m68k::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my @cpu; my $current; open CPUINFO, ") { print; if (/^CPU\s+:\s*:/) { if ($current) { $common->addCPU($current); } $current = { CPUARCH => 'm68k', }; } else { $current->{TYPE} = $1 if /CPU:\s+(\S.*)/; $current->{SPEED} = $1 if /Clocking:\s+:\s+(\S.*)/; } } # The last one $common->addCPU($current); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/s390x.pm000066400000000000000000000002611432320066700252370ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::s390x; use strict; use Config; sub check { return 1 if $Config{'archname'} =~ /^s390/; 0; }; sub run{} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/s390x/000077500000000000000000000000001432320066700247025ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Archs/s390x/CPU.pm000066400000000000000000000014351432320066700256720ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Archs::s390x::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/cpuinfo") } sub run { my $params = shift; my $common = $params->{common}; my $current; my $cpucores; open CPUINFO, ") { print; if (/^vendor\s*:/) { if ($current) { $common->addCPU($current); } } elsif (/^processor [0-9]:\s+(\S.*)/) { $cpucores++; } $current->{MANUFACTURER} = $1 if /vendor_id\s*:\s+(\S.*)/; $current->{SPEED} = $1 if /bogomips per cpu:\s+(\S.*)/; } $current->{CORES} = $cpucores; $common->addCPU($current); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Bios.pm000066400000000000000000000051011432320066700242030ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Bios; use vars qw($runMeIfTheseChecksFailed); $runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Bios"]; use strict; use warnings; sub check { return -d "/sys/class/dmi/id"; } sub run { my $params = shift; my $common = $params->{common}; my $chassis_types = [ "", "Other", "Unknown", "Desktop", "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Hand Held", "Docking Station", "All in One", "Sub Notebook", "Space-Saving", "Lunch Box", "Main Server Chassis", "Expansion Chassis", "Sub Chassis", "Bus Expansion Chassis", "Peripheral CHassis", "RAID Chassis", "Rack Mount Chassis", "Sealed-case PC", "Multi-System", "CompactPCI", "AdvancedTCA", "Blade", "Blade Enclosing", "Tablet", "Convertible", "Detachable", "IoT Gateway", "Embedded PC", "Mini PC", "Stick PC", ]; my $bios = {}; my $hardware = {}; my %bios_map = qw( BMANUFACTURER bios_vendor BDATE bios_date BVERSION bios_version ASSETTAG chassis_asset_tag SMODEL product_name SMANUFATCURER sys_vendor SSN product_serial MMODEL board_name MMANUFACTURER board_vendor MSN board_serial ); foreach my $key (keys(%bios_map)){ my $value = _dmi_info($bios_map{$key}); next unless defined($value); $bios->{$key}=$value; } # Set VirtualBox VM S/N to UUID if found serial is '0' my $uuid = _dmi_info('product_uuid'); if ($uuid && $bios->{MMODEL} && $bios->{MMODEL} eq 'VirtualBox' && $bios->{SSN} eq "0" && $bios->{MSN} eq "0" ){ $bios->{SSN}=$uuid; } $hardware->{UUID}=$uuid if $uuid; my $chassis_type = _dmi_info('chassis_type'); if ($chassis_type && $chassis_types->[$chassis_type]) { $bios->{TYPE} = $chassis_types->[$chassis_type]; } $common->setBios($bios); $common->setHardware($hardware); } 1; sub _dmi_info { my ($info) = @_; my $class = '/sys/class/dmi/id/'.$info; return if -d $class; return unless -e $class; open (my $fh, $class) or warn; my $classinfo=<$fh>; close ($fh); chomp($classinfo); return $classinfo; } UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/000077500000000000000000000000001432320066700242205ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/LSB.pm000066400000000000000000000013301432320066700251730ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::LSB; use vars qw($runMeIfTheseChecksFailed); $runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB"]; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("lsb_release") } sub run { my $params = shift; my $common = $params->{common}; my $OSname; chomp($OSname =`lsb_release -is`); my $OSversion; chomp($OSversion =`lsb_release -rs`); my $OSComment; chomp($OSComment =`uname -v`); my $release = "$OSname $OSVersion"; $common->setHardware({ OSNAME => $release, OSVERSION => $OSversion, OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB.pm000066400000000000000000000002421432320066700256470ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB; $runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::OS::Linux::Distro::OSRelease"]; 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/000077500000000000000000000000001432320066700253135ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/ArchLinux.pm000066400000000000000000000007651432320066700275560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::ArchLinux; use strict; sub check {-f "/etc/arch-release"} ##### sub findRelease { my $v; open V, "); close V; return "ArchLinux $v"; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/CentOS.pm000066400000000000000000000011021432320066700267760ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::CentOS; use strict; sub check { -f "/etc/centos-release" && !readlink ("/etc/centos-release") && !-f "/etc/vmware-release" } #### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Debian.pm000066400000000000000000000010411432320066700270270ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Debian; use strict; sub check {-f "/etc/debian_version" && !-f "/etc/ubuntu_version"} ##### sub findRelease { my $v; open V, "); close V; return "Debian GNU/Linux $v"; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Fedora.pm000066400000000000000000000007521432320066700270550ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Fedora; use strict; sub check {-f "/etc/fedora-release"} ##### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Gentoo.pm000066400000000000000000000010001432320066700270730ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Gentoo; use strict; sub check {-f "/etc/gentoo-release"} ##### sub findRelease { my $v; open V, "); close V; return "Gentoo Linux $v"; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Knoppix.pm000066400000000000000000000010331432320066700272760ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Knoppix; use strict; sub check {-f "/etc/knoppix_version"} ##### sub findRelease { my $v; open V, "); close V; print $v."\n"; return "Knoppix GNU/Linux $v"; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Mandrake.pm000066400000000000000000000010131432320066700273660ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Mandrake; use strict; sub check {-f "/etc/mandrake-release" && !-f "/etc/mandriva-release"} ##### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Mandriva.pm000066400000000000000000000010431432320066700274100ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Mandriva; use strict; sub check {-f "/etc/mandrake-release" && -f "/etc/mandriva-release"} ##### sub findRelease { my $v; open V, "); close V; return $v if $v; 0; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Oracle.pm000066400000000000000000000007731432320066700270650ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Oracle; use strict; sub check {-f "/etc/oracle-release"} ##### sub findRelease { my $v; open V, "); close V; return $v if $v; 0; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Redhat.pm000066400000000000000000000011041432320066700270540ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Redhat; use strict; sub check { -f "/etc/redhat-release" && !readlink ("/etc/redhat-release") && !-f "/etc/vmware-release" } #### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Slackware.pm000066400000000000000000000011411432320066700275620ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Slackware; use strict; sub check {-f "/etc/slackware-version"} ##### sub findRelease { my $v; open V, "); foreach (){ $v=$1 if (/Slackware ([\d.]+)/); close V; return $v; } } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => "Slackware", OSVERSION => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/SuSE.pm000066400000000000000000000013151432320066700264700ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::SuSE; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read ("/etc/SuSE-release") } sub run { my $v; my $version; my $patchlevel; my $params = shift; my $common = $params->{common}; open V, ") { next if (/^#/); $version=$1 if (/^VERSION = ([0-9]+)/); $patchlevel=$1 if (/^PATCHLEVEL = ([0-9]+)/); } close V; $common->setHardware({ OSNAME => "SUSE Linux Enterprise Server $version SP$patchlevel", OSVERSION => $version, OSCOMMENTS => $patchlevel }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Trustix.pm000066400000000000000000000007551432320066700273420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Trustix; use strict; sub check {-f "/etc/trustix-release"} ##### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/Ubuntu.pm000066400000000000000000000011441432320066700271330ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Ubuntu; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::Debian"]; sub check {-f "/etc/ubuntu_version"} ##### sub findRelease { my $v; open V, "); close V; return "Ubuntu $v"; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/NonLSB/VmWare.pm000066400000000000000000000007521432320066700270560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::NonLSB::VmWare; use strict; sub check { -f "/etc/vmware-release" } #### sub findRelease { my $v; open V, "); close V; $v; } sub run { my $params = shift; my $common = $params->{common}; my $OSComment; chomp($OSComment =`uname -v`); $common->setHardware({ OSNAME => findRelease(), OSCOMMENTS => "$OSComment" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Distro/OSRelease.pm000066400000000000000000000026241432320066700264040ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Distro::OSRelease; use warnings; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read ("/etc/os-release") } sub run { my $name; my $version; my $description; my $params = shift; my $common = $params->{common}; open V, "/etc/os-release" or warn; foreach () { next if /^#/; $name = $1 if (/^NAME="?([^"]+)"?/); $version = $1 if (/^VERSION_ID="?([^"]+)"?/); $description=$1 if (/^PRETTY_NAME="?([^"]+)"?/); } close V; chomp($name); # Debian version number is set in/etc/debian_version file if (-r "/etc/debian_version") { if (`uname -v` =~ /debian/i) { open V, "/etc/debian_version" or warn; foreach () { $version = $1 if ($_ =~ /^(\d+.*)/); } close V; chomp($version); } } # CentOS exact version number is set in /etc/centos-release file if (-r "/etc/centos-release") { open V, "/etc/centos-release" or warn; foreach ($description=) { $version = $1 if ($_ =~ /(\d+\.\d+)./g); } close V; chomp($version); chomp($description); } $common->setHardware({ OSNAME => "$name $version", OSVERSION => $version, OSCOMMENTS => $description, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Domains.pm000066400000000000000000000017771432320066700247200ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Domains; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("hostname"); my @domain = `hostname -d`; return 1 if @domain || $common->can_read ("/etc/resolv.conf"); 0; } sub run { my $params = shift; my $common = $params->{common}; my $domain; my %domain; my @dns_list; my $dns; chomp($domain = `hostname -d`); open RESOLV, "/etc/resolv.conf" or warn; while (){ if (/^nameserver\s+(\S+)/i) { push(@dns_list,$1); } elsif (!$domain) { $domain{$2} = 1 if (/^(domain|search)\s+(.+)/); } } close RESOLV; if (!$domain) { $domain = join "/", keys %domain; } $dns=join("/",@dns_list); # If no domain name, we send "WORKGROUP" $domain = 'WORKGROUP' unless $domain; $common->setHardware({ WORKGROUP => $domain, DNS => $dns }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Drives.pm000066400000000000000000000116611432320066700245530ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Drives; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("df"); my $df = `df -TP`; return 1 if $df =~ /\w+/; 0 } sub run { my $params = shift; my $common = $params->{common}; my %months = ( Jan => 1, Fev => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12, ); my %listVolume = (); # Get complementary information in hash tab if ($common->can_run ("lshal")) { my %temp; my $in = 0; my $value; foreach my $line (`lshal`) { chomp $line; if ( $line =~ s{^udi = '/org/freedesktop/Hal/devices/volume.*}{}) { $in = 1; %temp = (); } elsif ($in == 1 and $line =~ s{^\s+(\S+) = (.*) \s*\((int|string|bool|string list|uint64)\)}{} ) { if ($3 ne 'int' and $3 ne 'uint64') { chomp($value = $2); if ($3 eq 'string') { chop($value); #$value =~ s/^'?(.*)'?$/$1/g; $value=substr($value,1,length($value)); $value=substr($value,0,length($value)-1); } $temp{$1} = $value; } else { $temp{$1} = (split(/\W/,$2))[0]; } } elsif ($in== 1 and $line eq '') { $in = 0 ; $listVolume{$temp{'block.device'}} = {%temp}; } } } foreach(`df -TP`) { # TODO retrieve error my $createdate; my $free; my $filesystem; my $label; my $total; my $type; my $volumn; my $serial; if (/^(\S+)\s+(\S+)\s+(\S+)\s+(?:\S+)\s+(\S+)\s+(?:\S+)\s+(\S+)\n/){ $free = sprintf("%i",($4/1024)); $filesystem = $2; $total = sprintf("%i",($3/1024)); $type = $5; $volumn = $1; # no virtual FS next if ($filesystem =~ /^(tmpfs|devtmpfs|usbfs|proc|devpts|devshm|udev)$/); next if ($type =~ /^(tmpfs|devtmpfs)$/); if ($filesystem =~ /^ext(2|3|4|4dev)/ && $common->can_run('dumpe2fs')) { foreach (`dumpe2fs -h $volumn 2> /dev/null`) { if (/Filesystem UUID:\s+(\S+)/) { $serial = $1; } elsif (/Filesystem created:\s+\w+ (\w+) (\d+) ([\d:]+) (\d{4})$/) { $createdate = $4.'/'.$months{$1}.'/'.$2.' '.$3; } elsif (/Filesystem volume name:\s*(\S.*)/) { $label = $1 unless $1 eq ''; } } } elsif ($filesystem =~ /^xfs$/ && $common->can_run('xfs_db')) { foreach (`xfs_db -r -c uuid $volumn`) { $serial = $1 if /^UUID =\s+(\S+)/; ; } foreach (`xfs_db -r -c label $volumn`) { $label = $1 if /^label =\s+"(\S+)"/; } } elsif ($filesystem =~ /^vfat$/ && $common->can_run('dosfslabel')) { chomp ($label = `dosfslabel $volumn`); } $label =~ s/\s+$//; $serial =~ s/\s+$//; # Check information and improve it if (keys %listVolume) { if ( defined $listVolume{$volumn} ) { if ($filesystem eq '') { $filesystem = $listVolume{$volumn}->{'volume.fstype'};} if ($label eq '') { $label = $listVolume{$volumn}->{'volume.label'};} if ($total eq '') { $total = int($listVolume{$volumn}->{'volume.size'}/(1024*1024) + 0.5);} if ($type eq '') { $type = $listVolume{$volumn}->{'storage.model'};} if ($serial eq '') { $serial = $listVolume{$volumn}->{'volume.uuid'};} delete ($listVolume{$volumn}); } } $common->addDrive({ CREATEDATE => $createdate, FREE => $free, FILESYSTEM => $filesystem, LABEL => $label, TOTAL => $total, TYPE => $type, VOLUMN => $volumn, SERIAL => $serial }); } } if ($common->can_run ("lshal")) { while (my ($k,$v) = each %listVolume ) { $common->addDrive({ FILESYSTEM => $v->{'volume.fstype'}, LABEL => $v->{'volume.label'}, TOTAL => int ($v->{'volume.size'}/(1024*1024) + 0.5), TYPE => $v->{'storage.model'}, VOLUMN => $k, SERIAL => $v->{'volume.uuid'} }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Inputs.pm000066400000000000000000000026451432320066700246030ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Inputs; use strict; use warnings; sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $in; my $vendor; my $phys; my $name; my $type; if (open INPUTS, ") { if (/^I: Bus=.*Vendor=(.*) Prod/){ $in=1; $vendor=$1; } elsif ($_ =~ /^$/) { $in=0; if ($phys && $phys =~ "input"){ $common->addInput({ DESCRIPTION=>$name, CAPTION=>$name, TYPE=>$type }); } } elsif ($in) { if (/^P: Phys=.*(button).*/i) { $phys="nodev"; } elsif (/^P: Phys=.*(input).*/i) { $phys="input"; } if (/^N: Name=\"(.*)\"/i){ $name=$1; } if (/^H: Handlers=(\w+)/i) { if ($1 =~ ".*kbd.*") { $type="Keyboard"; } elsif ($1 =~ ".*mouse.*") { $type="Pointing"; } else { $type=$1; } } } } close INPUTS; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/LVM.pm000066400000000000000000000042621432320066700237540ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::LVM; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Linux::Drives"]; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("pvs"); 1 } sub run { my $params = shift; my $common = $params->{common}; use constant MB => (1024*1024); if ($common->can_run('pvs')) { foreach (`pvs --noheading --nosuffix --units b -o +pv_uuid`) { chomp; $_ =~s/^\s+//; my @vs_elem=split('\s+'); my $status='VG: '.$vs_elem[1].', Fmt: '.$vs_elem[2].', Attr: '.$vs_elem[3]; $common->addDrive({ FREE => $vs_elem[5]/MB, FILESYSTEM => 'LVM PV', TOTAL => $vs_elem[4]/MB, TYPE => $vs_elem[0], VOLUMN => $status, SERIAL => $vs_elem[6] }); } } if ($common->can_run('vgs')) { foreach (`vgs --noheading --nosuffix --units b -o +vg_uuid,vg_extent_size`) { chomp; $_ =~s/^\s+//; my @vs_elem=split('\s+'); my $status = 'PV/LV: '.$vs_elem[1].'/'.$vs_elem[2] .', Attr: '.$vs_elem[4].', PE: '.($vs_elem[8]/MB).' MB'; $common->addDrive({ FREE => $vs_elem[6]/MB, FILESYSTEM => 'LVM VG', TOTAL => $vs_elem[5]/MB, TYPE => $vs_elem[0], VOLUMN => $status, SERIAL => $vs_elem[7] }); } } if ($common->can_run('lvs')) { foreach (`lvs -a --noheading --nosuffix --units b -o lv_name,vg_name,lv_attr,lv_size,lv_uuid,seg_count`) { chomp; $_ =~s/^\s+//; my @vs_elem=split('\s+'); my $status='Attr: '.$vs_elem[2].', Seg: '.$vs_elem[5]; $common->addDrive({ FREE => 0, FILESYSTEM => 'LVM LV', TOTAL => $vs_elem[3]/MB, TYPE => $vs_elem[1].'/'.$vs_elem[0], VOLUMN => $status, SERIAL => $vs_elem[4] }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Mem.pm000066400000000000000000000012561432320066700240340ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Mem; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read ("/proc/meminfo") } sub run { my $params = shift; my $common = $params->{common}; my $unit = 1024; my $PhysicalMemory; my $SwapFileSize; # Memory informations open MEMINFO, "/proc/meminfo"; while(){ $PhysicalMemory=$1 if /^memtotal\s*:\s*(\S+)/i; $SwapFileSize=$1 if /^swaptotal\s*:\s*(\S+)/i; } # TODO $common->setHardware({ MEMORY => sprintf("%i",$PhysicalMemory/$unit), SWAP => sprintf("%i", $SwapFileSize/$unit), }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Network/000077500000000000000000000000001432320066700244055ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Network/IP.pm000066400000000000000000000022431432320066700252540ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Network::IP; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("ip") || $common->can_run("ifconfig"); 1; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my @ip; my @ip6; if ($common->can_run("ip")){ foreach (`ip a`){ if (/inet (\S+)\/\d{1,2}/){ ($1=~/^127.+/)?next:push @ip,$1; } elsif (/inet6 (\S+)\d{2}/){ ($1=~/::1\/128/)?next:push @ip6, $1; } } } elsif ($common->can_run("ifconfig")){ foreach (`ifconfig`){ #if(/^\s*inet\s*(\S+)\s*netmask/){ if (/^\s*inet add?r\s*:\s*(\S+)/ || /^\s*inet\s+(\S+)/){ ($1=~/^127.+/)?next:push @ip, $1; } elsif (/^\s*inet6\s+(\S+)/){ ($1=~/::1/)?next:push @ip6, $1; } } } my $ip=join "/", @ip; my $ip6=join "/", @ip6; if (defined $ip) { $common->setHardware({IPADDR => $ip}); } else { $common->setHardware({IPADDR => $ip6}); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Network/Networks.pm000066400000000000000000001042211432320066700265570ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Network::Networks; use strict; use warnings; use Data::Dumper; use File::stat; use Time::Local; sub check { my $params = shift; my $common = $params->{common}; if ($common->can_run("ip") && $common->can_load("Net::IP qw(:PROC)") || ($common->can_run("ifconfig") && $common->can_run("route")) && $common->can_load("Net::IP qw(:PROC)")){ return 1; } else { return 0; } } sub getLeaseFile { my $if = @_; my @directories = qw( /var/db /var/lib/dhclient /var/lib/dhcp3 /var/lib/dhcp /var/lib/NetworkManager ); my @patterns = ("*$if*.lease", "*.lease*", "dhclient.leases.$if"); my @files; foreach my $directory (@directories) { next unless -d $directory; foreach my $pattern (@patterns) { push @files, grep { -s $_ } glob("$directory/$pattern"); } } return unless @files; @files = map {$_->[0]} sort {$a->[1]->ctime()<=>$b->[1]->ctime()} map {[$_,stat($_)]} @files; return $files[-1]; } sub _ipdhcp { my $if = shift; my $path; my $dhcp; my $ipdhcp; my $leasepath; $leasepath = getLeaseFile($if); if ( $leasepath and $leasepath =~ /internal/ ) { if (open DHCP, $leasepath) { while() { if (/SERVER_ADDRESS=(\d{1,3}(?:\.\d{1,3}){3})/) { $ipdhcp=$1; } } close DHCP or warn; } else { warn ("Can't open $leasepath\n"); } } elsif( $leasepath ) { if (open DHCP, $leasepath) { my $lease; while(){ $lease = 1 if(/lease\s*{/i); $lease = 0 if(/^\s*}\s*$/); #Interface name if ($lease) { #inside a lease section if (/interface\s+"(.+?)"\s*/){ $dhcp = ($1 =~ /^$if$/); } #Server IP if (/option\s+dhcp-server-identifier\s+(\d{1,3}(?:\.\d{1,3}){3})\s*;/ and $dhcp){ $ipdhcp = $1; } } } close DHCP or warn; } else { warn "Can't open $leasepath\n"; } } return $ipdhcp; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $description; my $driver; my @ipaddress; my $ipaddress; my $ipgateway; my $ipmask; my $ipsubnet; my $ipaddress6; my $ipgateway6; my $ipmask6; my $ipsubnet6; my $macaddr; my $pcislot; my $status; my $type; my $virtualdev; my $settings; my $speed; my $current_speed; my $duplex; my $ssid; my $bssid; my $mode; my $version; my $bitrate; my $mtu; my @netsum; my $basedev; my $slave; my %gateway; my @secondary; my $ipsecond; if ($common->can_run("ip")){ my @netsum = `ip addr show`; push @netsum, "\n"; chomp @netsum; for (my $i=0;$i<=$#netsum;$i+=1) { my $line=$netsum[$i]; if ($line =~ /^(\d+(?) { $driver = $1 if /^DRIVER=(\S+)/; $pcislot = $1 if /^PCI_SLOT_NAME=(\S+)/; } close UEVENT; } if (-d "/sys/class/net/$description/wireless"){ my @wifistatus = `iwconfig $description 2>/dev/null`; foreach my $line (@wifistatus){ $ssid = $1 if ($line =~ /ESSID:(\S+)/); $version = $1 if ($line =~ /IEEE (\S+)/); $mode = $1 if ($line =~ /Mode:(\S+)/); $bssid = $1 if ($line =~ /Access Point: (\S+)/); $bitrate = $1 if ($line =~ /Bit\sRate=\s*(\S+\sMb\/s)/i); } $type = "Wifi"; $status=1; } elsif (-f "/sys/class/net/$description/mode") { $type="infiniband"; } else { $type="ethernet"; } if (defined ($ipgateway)) { $common->setHardware({ DEFAULTGATEWAY => $ipgateway }); } elsif (defined ($ipgateway6)){ $common->setHardware({ DEFAULTGATEWAY => $ipgateway6 }); } # Retrieve speed from /sys/class/net/$description/speed $speed=getSpeed($description); # Retrieve duplex from /sys/class/net/$description/duplex $duplex=getDuplex($description); # Retrieve mtu from /sys/class/net/$description/mtu $mtu=getMTU($description); # Retrieve status from /sys/class/net/$description/status $status=getStatus($description); if ($description && $ip) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ip, IPDHCP => _ipdhcp($description), IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, MTU => $mtu, }); } else { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ip, IPDHCP => _ipdhcp($description), IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, VIRTUALDEV => $virtualdev, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, }); } } if ($description && $ipaddress6) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress6, IPDHCP => undef, IPGATEWAY => $ipgateway6, IPMASK => $ipmask6, IPSUBNET => $ipsubnet6, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, MTU => $mtu, }); } else { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress6, IPGATEWAY => $ipgateway6, IPDHCP => undef, IPMASK => $ipmask6, IPSUBNET => $ipsubnet6, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, VIRTUALDEV => $virtualdev, }); } } if ($description && !$ip && !$ipaddress6) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, MTU => $mtu, }); } else { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, VIRTUALDEV => $virtualdev, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, }); } } # Virtual devices # Reliable way to get the info if (-d "/sys/devices/virtual/net/") { $virtualdev = (-d "/sys/devices/virtual/net/$description")?"1":"0"; } elsif ($common->can_run("brctl")) { # Let's guess my %bridge; foreach (`brctl show`) { next if /^bridge name/; $bridge{$1} = 1 if /^(\w+)\s/; } if ($pcislot) { $virtualdev = "1"; } elsif ($bridge{$description}) { $virtualdev = "0"; } $type = "bridge"; $common->addNetwork({ DESCRIPTION => $description, TYPE => $type, VIRTUALDEV => $virtualdev, }); } # Check if this is dialup interface if ($description =~ m/^ppp$/) { $type="dialup"; $virtualdev=1; $common->addNetwork({ DESCRIPTION => $description, TYPE => $type, VIRTUALDEV => $virtualdev, }); } # Check if this is a bonding slave if (-d "/sys/class/net/$description/bonding"){ $slave=getslaves($description); $type="aggregate"; $virtualdev=1; $common->addNetwork({ SLAVE => $slave, TYPE => $type, VIRTUALDEV => $virtualdev, }); } # Check if this is an alias or tagged interface if ($description =~ m/^([\w\d]+)[:.]\d+$/) { $basedev=$1; $type="alias"; $virtualdev=1; $common->addNetwork({ BASE => $basedev, DESCRIPTION => $description, TYPE => $type, VIRTUALDEV => $virtualdev, }); } # Check if this is a vlan if (-f "/proc/net/vlan/$description"){ $type="vlan"; $virtualdev=1; $common->addNetwork({ BASE => $basedev, DESCRIPTION => $description, TYPE => $type, VIRTUALDEV => $virtualdev, }); } $ipaddress6 = $ipgateway6 = $ipmask6 = $ipsubnet6 = undef; } # Retrieve speed from /sys/class/net/$description/speed $speed=getSpeed($description); # Retrieve duplex from /sys/class/net/$description/duplex $duplex=getDuplex($description); # Retrieve mtu from /sys/class/net/$description/mtu $mtu=getMTU($description); if ($description && $ipaddress6) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress6, IPDHCP => undef, IPGATEWAY => $ipgateway6, IPMASK => $ipmask6, IPSUBNET => $ipsubnet6, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, MTU => $mtu, }); } else { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress6, IPGATEWAY => $ipgateway6, IPDHCP => undef, IPMASK => $ipmask6, IPSUBNET => $ipsubnet6, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, VIRTUALDEV => $virtualdev, }); } } if ($description && !$ipaddress && !$ipaddress6) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, MTU => $mtu, }); } else { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, VIRTUALDEV => $virtualdev, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, }); } } # Check if this is a secondary ip address if (@secondary) { foreach my $info (@secondary) { $ipsecond=$1 if ($info =~ /inet ((?:\d{1,3}+\.){3}\d{1,3})\/(\d+)/); $basedev=$description; $type="secondary"; $virtualdev=1; $common->addNetwork({ BASE => $basedev?$basedev : undef, DESCRIPTION => $description, IPADDRESS => $ipsecond, IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, TYPE => $type, VIRTUALDEV => $virtualdev?"Virtual":"Physical", }); } } $description = $driver = $ipaddress = $ipgateway = $ipmask = $ipsubnet = $ipaddress6 = $ipgateway6 = $ipmask6 = $ipsubnet6 = $macaddr = $pcislot = $status = $type = $virtualdev = $speed = $duplex = $mtu = undef; @secondary=(); @ipaddress=(); } $description = $1 if ($line =~ /^\d+:\s+([^:@]+)/); # Interface name if ($description && $description eq "lo" ) { next; } # loopback interface is not inventoried if ($line =~ /inet ((?:\d{1,3}+\.){3}\d{1,3})\/(\d+)/i && $line !~ /secondary/i){ push @ipaddress, $1; $ipaddress=$1; $ipmask=getIPNetmask($2); $ipsubnet=getSubnetAddressIPv4($ipaddress,$ipmask); $ipgateway=getIPRoute($ipaddress,$ipmask); } elsif ($line =~ /\s+link\/(\S+)/){ $type=$1; $macaddr=getMAC($description); } elsif ($line =~ /inet6 (\S+)\/(\d{1,2})/i){ $ipaddress6=$1; $ipmask6=getIPNetmaskV6($2); $ipsubnet6=getSubnetAddressIPv6($ipaddress6,$ipmask6); $ipgateway6=getIPRoute($ipaddress6,$ipmask6); } # Retrieve secondary ip addresses if defined if ($line =~ /secondary/i){ push @secondary, $line; } } } elsif ($common->can_run("ifconfig")){ foreach my $line (`ifconfig -a`) { if ($line =~ /^$/ && $description && $macaddr) { # end of interface section # I write the entry if (defined($ipgateway)){ $common->setHardware({ DEFAULTGATEWAY => $ipgateway }); } elsif (defined($ipgateway6)) { $common->setHardware({ DEFAULTGATEWAY => $ipgateway6 }); } if (-d "/sys/class/net/$description/wireless"){ my @wifistatus = `iwconfig $description`; foreach my $line (@wifistatus){ $ssid = $1 if ($line =~ /ESSID:(\S+)/); $version = $1 if ($line =~ /IEEE (\S+)/); $mode = $1 if ($line =~ /Mode:(\S+)/); $bssid = $1 if ($line =~ /Access Point: (\S+)/); $bitrate = $1 if ($line =~ /Bit\sRate=\s*(\S+\sMb\/s)/i); } $type = "Wifi"; } elsif (-f "/sys/class/net/$description/mode") { $type="infiniband"; } if (open UEVENT, ") { $driver = $1 if /^DRIVER=(\S+)/; $pcislot = $1 if /^PCI_SLOT_NAME=(\S+)/; } close UEVENT; } # Retrieve speed from /sys/class/net/$description/speed $speed=getSpeed($description); # Retrieve duplex from /sys/class/net/$description/duplex $duplex=getDuplex($description); # Virtual devices # Reliable way to get the info if (-d "/sys/devices/virtual/net/") { $virtualdev = (-d "/sys/devices/virtual/net/$description")?"1":"0"; } elsif ($common->can_run("brctl")) { # Let's guess my %bridge; foreach (`brctl show`) { next if /^bridge name/; $bridge{$1} = 1 if /^(\w+)\s/; } if ($pcislot) { $virtualdev = "1"; } elsif ($bridge{$description}) { $virtualdev = "0"; } $type = "bridge"; } # Check if this is dialup interface if ($description =~ m/^ppp$/) { $type="dialup"; $virtualdev=1; } # Check if this is an alias or tagged interface if ($description =~ m/^([\w\d]+)[:.]\d+$/) { $basedev=$1; $type="alias"; $virtualdev=1; } # Check if this is a bonding slave if (-d "/sys/class/net/$description/bonding"){ $slave=getslaves($description); $type="aggregate"; $virtualdev=1; } # Check if this is a vlan if (-f "/proc/net/vlan/$description"){ $type="vlan"; $virtualdev=1; } if ($description && $ipaddress) { if ($type eq "Wifi") { $common->addNetwork({ DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress, IPDHCP => _ipdhcp($description), IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, SPEED => $bitrate, SSID => $ssid, BSSID => $bssid, IEEE => $version, MODE => $mode, }); } else { $common->addNetwork({ BASE => $basedev?$basedev : undef, DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress, IPDHCP => _ipdhcp($description), IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, VIRTUALDEV => $virtualdev, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, SLAVE => $slave?$slave : undef, }); } } elsif ($description && $ipaddress6) { $common->addNetwork({ BASE => $basedev?$basedev : undef, DESCRIPTION => $description, DRIVER => $driver, IPADDRESS => $ipaddress6, IPDHCP => _ipdhcp($description), IPGATEWAY => $ipgateway6, IPMASK => $ipmask6, IPSUBNET => $ipsubnet6, MACADDR => $macaddr, PCISLOT => $pcislot, STATUS => $status?"Up":"Down", TYPE => $type, VIRTUALDEV => $virtualdev, DUPLEX => $duplex?"Full":"Half", SPEED => $speed, MTU => $mtu, SLAVE => $slave?$slave : undef, }); } } if ($line =~ /^$/) { # End of section $description = $driver = $ipaddress = $ipgateway = $ipmask = $ipsubnet = $macaddr = $pcislot = $status = $type = $virtualdev = $speed = $duplex = $mtu = undef; } else { # In a section if ($line =~ /^(\S+):/) { $description = $1; # Interface name if ($description && $description eq "lo" ) { next; } # loopback interface is not inventoried } if ($line =~ /inet add?r:(\S+)/i || $line =~ /^\s*inet\s+(\S+)/i || $line =~ /inet (\S+)\s+netmask/i){ $ipaddress=$1; $ipmask=getIPNetmask($ipaddress); $ipsubnet=getSubnetAddressIPv4($ipaddress,$ipmask); $ipgateway=getRouteIfconfig($ipaddress,$ipmask); } elsif ($line =~ /inet6 (\S+)\s+prefixlen\s+(\d{2})/i){ $ipaddress6=$1; $ipmask6=getIPNetmaskV6($ipaddress6); $ipsubnet6=getSubnetAddressIPv6($ipaddress6,$ipmask6); $ipgateway6=getRouteIfconfig($ipaddress6,$ipmask6); } $macaddr = $1 if ($line =~ /hwadd?r\s+(\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})/i || $line =~ /ether\s+(\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})/i); $status = 1 if ($line =~ /^\s+UP\s/ || $line =~ /flags=.*[<,]UP[,>]/); $type = $1 if ($line =~ /link encap:(\S+)/i); $type = $2 if ($line =~ /^\s+(loop|ether).*\((\S+)\)/i); if ($type eq "ether" || $type eq "Ethernet") { $type="ethernet"; } # Retrieve mtu from /sys/class/net/$description/mtu $mtu=getMTU($description); } } } } sub getslaves{ my ($name)=@_; my @slaves= map{$_ =~/\/lowr_(\w+)$/} glob("/sys/class/net/$name/lower_*"); return join(",", @slaves); } sub getSpeed{ my ($prefix)=@_; my $speed; my $current_speed=0; return undef unless $prefix; if ( ! -z "/sys/class/net/$prefix/speed") { open SPEED, "){ $current_speed=$_; } close SPEED; chomp($current_speed); if ($current_speed eq "65535" || $current_speed eq ""){ $current_speed = "Unknown"; } if ($current_speed gt 100 ){ $speed = ($current_speed/1000)." Gbps"; } else { $speed = $current_speed." Mbps"; } } return $speed; } sub getDuplex{ my ($prefix)=@_; my $duplex; return undef unless $prefix; if (open DUPLEX, "){ $duplex=chomp($_); } close DUPLEX; } return $duplex; } sub getMTU { my ($prefix)=@_; my $mtu; return undef unless $prefix; if (open MTU, "){ chomp; $mtu=$_; } close MTU; } return $mtu; } sub getStatus { my ($prefix)=@_; my $status; return undef unless $prefix; if (open STATUS, "){ chomp; $status=$_; } close STATUS; } return $status; } sub getMAC { my ($prefix)=@_; my $mac; return undef unless $prefix; if (open MAC, "){ chomp; $mac=$_; } close MAC; } return $mac; } sub getSubnetAddressIPv4 { my ($address,$mask)=@_; return undef unless $address && $mask; my $binaddress=ip_iptobin($address, 4); my $binmask=ip_iptobin($mask, 4); my $binsubnet=$binaddress & $binmask; return ip_bintoip($binsubnet, 4); } sub getIPNetmask { my ($prefix) = @_; return undef unless $prefix; return ip_bintoip(ip_get_mask($prefix, 4), 4); } sub getSubnetAddressIPv6 { my ($address,$mask)=@_; return undef unless $address && $mask; my $binaddress = ip_iptobin(ip_expand_address($address, 6),6); my $binmask = ip_iptobin(ip_expand_address($mask, 6),6); my $binsubnet = $binaddress & $binmask; return ip_compress_address(ip_bintoip($binsubnet, 6),6); } sub getIPNetmaskV6 { my ($prefix) = @_; return undef unless $prefix; return ip_compress_address(ip_bintoip(ip_get_mask($prefix, 6), 6),6); } sub getIPRoute { my ($prefix,$net) = @_; my $gateway; my $route; return undef unless $prefix; if (ip_is_ipv4($prefix)) { foreach my $line (`ip route`){ if ($line =~ /^default via ((?:\d{1,3}+\.){3}\d{1,3}) /){ $gateway=$1; }; $route = $gateway if isSameNetwork($prefix,$gateway,$net); } } elsif (ip_is_ipv6($prefix)) { foreach my $line (`ip -6 route`){ next if $line =~ /^Unreachable/; $route = $1 if $line =~ /^(.*)\/.*/; } } return $route; } sub getRouteIfconfig { my ($prefix) = @_; my $route; return undef unless $prefix; if (ip_is_ipv4($prefix)) { foreach my $line (`route -n`){ next if $line =~ /^Default/; $route = $1 if $line =~ /^0.0.0.0\s+(\S+)/; } } elsif (ip_is_ipv6($prefix)) { foreach my $line (`route -6n`){ next if $line =~ /^2002/; $route = $1 if $line =~ /^(.*)\/.*/; } } return $route; } sub isSameNetwork { my ($address1, $address2, $mask) = @_; ## no critic (ExplicitReturnUndef) return undef unless $address1 && $address2 && $mask; my $binaddress1 = ip_iptobin($address1, 4); my $binaddress2 = ip_iptobin($address2, 4); my $binmask = ip_iptobin($mask, 4); ## no critic (ProhibitBitwise) return ($binaddress1 & $binmask) eq ($binaddress2 & $binmask); } sub isSameNetworkIPv6 { my ($address1, $address2, $mask) = @_; ## no critic (ExplicitReturnUndef) return undef unless $address1 && $address2 && $mask; my $binaddress1 = ip_iptobin(ip_expand_address($address1, 6), 6); my $binaddress2 = ip_iptobin(ip_expand_address($address2, 6), 6); my $binmask = ip_iptobin(ip_expand_address($mask, 6), 6); ## no critic (ProhibitBitwise) return ($binaddress1 & $binmask) eq ($binaddress2 & $binmask); } 1; __END__ __END__ =head1 NAME OCSInventory::Agent::Backend::OS::Linux::Network::Networks - Network-related functions =head1 DESCRIPTION This module retrieves network information. =head1 FUNCTIONS =head2 getSpeed Returns the speed of the card. =head2 getDuplex Returns duplex state of the card. =head2 getMTU Returns the mtu of the card. =head2 getStatus Returns the status of the card. =head2 getMAC Returns the mac address. =head2 getSubnetAddress($address, $mask) Returns the subnet address for IPv4. =head2 getSubnetAddressIPv6($address, $mask) Returns the subnet address for IPv6. =head2 getIPNetmask($prefix) Returns the network mask for IPv4. =head2 getIPNetmaskV6($prefix) Returns the network mask for IPv6. =head2 getslaves Returns if card has a bonding. =head2 getIPRoute Returns the gateway defined int he ip config. =head2 getRouteIfconfig Returns the gateway defined in the ip config. =head2 isSameNetwork Returns true if both addresses belong to the same network, for IPv4. =head2 isSameNetworkIPv6 Returns true if both addresses belong to the same network, for IPv6. =back UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages.pm000066400000000000000000000532171432320066700251110ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages; use strict; use XML::Simple; sub check { my $params = shift; my $common = $params->{common}; return unless ($common->can_run("lshw") || $common->can_run("lsscsi") || $common->can_run("lsblk") || $common->can_run("smartctl") || $common->can_run("multipath") || $common->can_run("udevinfo") || $common->can_run("udevadm") || $common->can_run("hdparm")); } ######## TODO # Do not remove, used by other modules sub getFromUdev { my @devs; foreach (glob ("/dev/.udev/db/*")) { my ($scsi_coid, $scsi_chid, $scsi_unid, $scsi_lun, $path, $device, $vendor, $model, $revision, $serial, $serial_short, $type, $bus, $capacity); if (/^(\/dev\/.udev\/db\/.*)([sh]d[a-z]+)$/) { $path = $1; $device = $2; open (PATH, $1 . $2); while () { if (/^S:.*-scsi-(\d+):(\d+):(\d+):(\d+)/) { $scsi_coid = $1; $scsi_chid = $2; $scsi_unid = $3; $scsi_lun = $4; } $vendor = $1 if /^E:ID_VENDOR=(.*)/; $model = $1 if /^E:ID_MODEL=(.*)/; $revision = $1 if /^E:ID_REVISION=(.*)/; $serial = $1 if /^E:ID_SERIAL=(.*)/; $serial_short = $1 if /^E:ID_SERIAL_SHORT=(.*)/; $type = $1 if /^E:ID_TYPE=(.*)/; $bus = $1 if /^E:ID_BUS=(.*)/; } $serial_short = $serial unless $serial_short =~ /\S/; $capacity = getCapacity($device); push (@devs, {NAME => $device, MANUFACTURER => $vendor, MODEL => $model, DESCRIPTION => $bus, TYPE => $type, DISKSIZE => $capacity, SERIALNUMBER => $serial_short, FIRMWARE => $revision, SCSI_COID => $scsi_coid, SCSI_CHID => $scsi_chid, SCSI_UNID => $scsi_unid, SCSI_LUN => $scsi_lun}); close (PATH); } } return @devs; } sub getFromSysProc { my($dev, $file) = @_; my $value; foreach ("/sys/block/$dev/device/$file", "/proc/ide/$dev/$file") { next unless open PATH, $_; chomp(my $value = ); $value =~ s/^(\w+)\W*/$1/; return $value; } } sub getCapacity { my ($dev) = @_; my $cap; chomp ($cap = `fdisk -s /dev/$dev 2>/dev/null`); #requires permissions on /dev/$dev $cap = int ($cap*1024) if $cap; return $cap; } sub getDescription { my ($name, $manufacturer, $description, $serialnumber) = @_; # detected as USB by udev # TODO maybe we should trust udev detection by default? return "USB" if (defined ($description) && $description =~ /usb/i); if ($name =~ /^sd/) { # /dev/sd* are SCSI _OR_ SATA if ($manufacturer =~ /ATA/ || $serialnumber =~ /ATA/ || $description =~ /ATA/i) { return "SATA"; } else { return "SCSI"; } } elsif ($name =~ /^sg/) { # "g" stands for Generic SCSI return "SCSI"; } elsif ($name =~ /^vd/ || ($description && $description =~ /VIRTIO/)) { return "Virtual"; } else { return $description || "IDE"; } } sub getManufacturer { my ($model) = @_; #if($model =~ /(maxtor|western|sony|compaq|hewlett packard|ibm|seagate|toshiba|fujitsu|lg|samsung|nec|transcend)/i) { # return ucfirst(lc($1)); if ($model =~ /^(IBM|LG|NEC$)/){ return $1; } elsif ($model =~ /(maxtor|western|sony|compaq|hewlett packard|ibm|seagate|toshiba|fujitsu|lg|samsung|nec$|transcend)/i) { $model = lc($1); $model = s/\b(\w)/\u$1/g; return $model; } elsif ($model =~ /^HP/) { return "Hewlett-Packard"; } elsif ($model =~ /^WD/) { return "Western Digital"; } elsif ($model =~ /^ST/) { return "Seagate"; } elsif ($model =~ /^(HD|IC|HU)/) { return "Hitachi"; } elsif ($model =~ /^NECVMWar/) { return "VMware"; } elsif ($model =~ /^VBOX/){ return "Virtual Box"; } else { return $model; } } sub getMultipathDisks { my @mpList = `multipath -l`; my @devs; my $volume; my $serial; my $dm; my $manufacturer; my $model; foreach my $line (@mpList) { if ($line =~ /^([\w\d]+)\s\((.*)\)\s(dm-\d+)\s(\w+)\s+,([\w\d\s]+)$/i) { $volume = $1; $serial = $2; $dm = $3; $manufacturer = $4; $model = $5; } if ($line =~ /size=(\d+)(\w+)\s/) { my $size = $1; my $unit = $2; # conversion to mebibyte my %conversion = ( "T" => 1000**4, "G" => 1000**3, "M" => 1000**2, "K" => 1000, ); if ($conversion{$unit}) { $size = $size / $conversion{$unit} * 2**20; } else { $size = $size." ".$unit; } push (@devs, {NAME=>$dm, DESCRIPTION=>$volume, TYPE=>"Multipath volume", MODEL=>$model, SERIALNUMBER=>$serial, MANUFACTURER=>$manufacturer}); } if ($line =~ /(sd[a-z]+)/i) { push (@devs, {NAME=>$1, DESCRIPTION=>"Child of $dm", TYPE=>"Multipath child"}); } } return @devs; } # some hdparm release generated kernel error if they are # run on CDROM device # http://forums.ocsinventory-ng.org/viewtopic.php?pid=20810 sub correctHdparmAvailable { my $hdparmVersion = `hdparm -V`; if ($hdparmVersion =~ /^hdparm v(\d+)\.(\d+)(\.|$)/) { return 1 if $1>9; return 1 if $1==9 && $2>=15; } return; } # get available md softraid devices sub getMdDevices { return unless ( open(my $fh, '<:encoding(UTF-8)', '/proc/mdstat') ); my @lines = <$fh>; close($fh); my $devName; my $raidLevel; my @devs; foreach (@lines) { chomp($_); if (/^(md\d*)\s*:\s*\w*\s*(raid\d)/) { $devName = $1; $raidLevel = $2; push (@devs, {NAME => $devName, MODEL => $raidLevel}); } } return @devs; } # get available block devices from /dev sub getFromDev { my @devs; my @disks; my $dir = "/dev"; opendir (my $dh, $dir) or die $!; @disks = grep{/^sd[a-z][a-z]?$|^sg[a-z][a-z]?$|^vd[a-z][a-z]?$|^sr\d+$/} readdir($dh); foreach (@disks) { push (@devs, {NAME => $_}); } return @devs; } # get data from lshw sub getFromLshw { my @devs; my @inputlines = `lshw -class disk -xml -quiet`; return unless $inputlines[0] =~ /xml/i; my $foundcdroms = 0; my $input; foreach (@inputlines) { if ( /\/g) { # adding "" root element because $input =~ s/\?>/\?>\n/; # prior to version B.02.16, "lshw -class disk -xml" produces xml output $input .= "\n"; # without the "" root element, which does not parse correctly. } my $xml = new XML::Simple; my $data = $xml->XMLin($input); my $list = $data->{list}->{node}; my $nodes; # if there is only device, its hash is returned if ( exists $list->{id} ) { $nodes->{$list->{id}} = $list; } else { $nodes = $list; } foreach my $device (sort keys %$nodes) { my $description = ""; my $size = 0; my $sizeUnits = ""; my $name = "not set"; my $type = ""; my $vendor = ""; my $model = ""; my $serial = ""; my $revision = ""; if ($nodes->{$device}->{description}) { $description = $nodes->{$device}->{description}; } if ($nodes->{$device}->{size}) { my %units = ('bytes', 1, 'kilobytes', 10**3, 'megabytes', 10**6, 'gigabytes', 10**9, 'terabytes', 10**12); $sizeUnits = $nodes->{$device}->{size}->{units}; $size = $nodes->{$device}->{size}->{content}; $size = $size * $units{$sizeUnits}; $size = sprintf "%i", $size; } if ($nodes->{$device}->{logicalname}) { $name = $nodes->{$device}->{logicalname}; if (ref($name) eq 'ARRAY') { foreach (@{$name}) { if (!readlink $_) { $name = $_; last; } } } $name =~ s/\/dev\///; } if ($nodes->{$device}->{type}) { $type = $nodes->{$device}->{type}; } if ($nodes->{$device}->{vendor}) { $vendor = $nodes->{$device}->{vendor}; } if ($nodes->{$device}->{model}) { $model = $nodes->{$device}->{model}; } if ($nodes->{$device}->{serial}) { $serial = $nodes->{$device}->{serial}; } push (@devs, { NAME => $name, MANUFACTURER => getManufacturer($vendor), MODEL => $model, DESCRIPTION => $description, TYPE => $type, DISKSIZE => $size, SERIALNUMBER => $serial, FIRMWARE => $revision }); } return @devs; } # get data from lsscsi sub getFromLsscsi { my @devs; my ($id, $type, $vendor, $model, $rev, $device); foreach my $line (`lsscsi`) { ($id, $type, $vendor, $model, $rev, $device) = unpack ('a13a8a9a17a6a15', $line); $vendor =~ s/\s*$//; $type =~ s/\s*$//; $model =~ s/\s*$//; my @columns = split /\s+/, $line; my $deviceName = $columns[-1]; $deviceName =~ s/\/dev\///; #debug print Dumper {NAME => $deviceName, MANUFACTURER => $vendor, TYPE => $type, MODEL => $model}; if ($type =~ /cd\/dvd|disk/) { push (@devs, {NAME => $deviceName, MANUFACTURER => getManufacturer($vendor), TYPE => $type, MODEL => $model}); } } return @devs; } # get data from lsblk sub getFromLsblk { my @devs; foreach my $line (`lsblk -ldbn`) { my @columns = split /\s+/, $line; my $deviceName = $columns[0]; my $size = $columns[3]; my $type = $columns[5]; $size = "" if ($type =~ /rom/); push (@devs, {NAME => $deviceName, TYPE => $type, DISKSIZE => $size}); } return @devs; } # get data from smartctl sub getFromSmartctl { my ($params, $devices) = @_; my @devs; foreach my $device (keys %$devices) { my $vendor = ""; my $product = ""; my $revision = ""; my $size = ""; my $type = ""; my $serialnum = ""; my $description = ""; my $devName = $devices->{$device}->{NAME}; foreach my $line (`smartctl -i /dev/$devName`) { chomp($line); if ($line =~ m/Model Family:\s+(\S+.*)\s*$/i){ $vendor = $1; } elsif ($line =~ m/Vendor:\s+(\S+.*)\s*$/i) { $vendor = $1; } elsif ($line =~ m/Device Model:\s+(\S+.*)\s*$/i){ $product = $1; } elsif ($line =~ m/Product:\s+(\S+.*)\s*$/i) { $product = $1; } elsif ($line =~ m/Revision:\s+(\S+.*)\s*$/i) { $revision = $1; } elsif ($line =~ m/Firmware Version:\s+(\S+.*)\s*$/i) { $revision = $1; } elsif ($line =~ m/Serial Number:\s+(\S+.*)\s*$/i) { $serialnum = $1; } elsif ($line =~ m/User Capacity:\s+([\d\.,]+)\s+bytes/i) { $size = $1; $size =~ s/[\.,]//g; } elsif ($line =~ m/Device type:\s+(\S+.*)\s*$/i) { $type = $1; } elsif ($line =~ m/Model Family\s+(\S.*)\s*/i) { $description = $1; } } push (@devs, { NAME => $devName, MANUFACTURER => getManufacturer($vendor), MODEL => $product, FIRMWARE => $revision, TYPE => $type, DISKSIZE => $size, SERIALNUMBER => $serialnum, DESCRIPTION => $description }); } return @devs; } # get data from UDEV sub getFromuDev2 { my $params = shift; my $common = $params->{common}; my ($devices) = @_; my @input; my @devs; foreach my $device (keys %$devices) { my $type = ""; my $model = ""; my $vendor = ""; my $firmware = ""; my $serial = ""; my $serial_short = ""; my $serial_scsi = ""; my $serial_md = ""; my $devName = $devices->{$device}->{NAME}; if ($common->can_run("udevadm")) { @input = `udevadm info -q all -n /dev/$devName`; } else { @input = `udevinfo -q all -n /dev/$devName`; } foreach my $line (@input) { if ($line =~ m/ID_TYPE=(\S+.*)\s*$/){ $type = $1; } elsif ($line =~ m/ID_MODEL=(\S+.*)\s*$/) { $model = $1; $model =~ s/_/ /g; } elsif ($line =~ m/ID_VENDOR=(\S+.*)\s*$/) { $vendor = $1; } elsif ($line =~ m/ID_REVISION=(\S+.*)\s*$/) { $firmware = $1; } elsif ($line =~ m/ID_SERIAL_SHORT=(\S+.*)\s*$/) { $serial_short = $1; } elsif ($line =~ m/ID_SCSI_SERIAL=(\S+.*)\s*$/) { $serial_scsi = $1; } elsif ($line =~ m/ID_SERIAL=(\S+.*)\s*$/) { $serial = $1; } if ($line =~ m/MD_LEVEL=(\S+.*)\s*$/) { $model = $1; } elsif ($line =~ m/MD_METADATA=(\d\.?\d?)/) { $firmware = $1; $firmware = "MD METADATA ".$firmware; } elsif ($line =~ m/MD_UUID=(\S+.*)\s*$/) { $serial_md = $1; } } $serial = $serial_short unless $serial_short eq ""; # prefer serial_short over serial $serial = $serial_scsi unless $serial_scsi eq ""; $serial = $serial_md unless $serial_md eq ""; if ($devName =~ /md\d+/) { # if device is a multiple disk softraid $type = "MD"; $vendor = "Linux"; } push (@devs, { NAME => $devName, TYPE => $type, MODEL => $model, MANUFACTURER => getManufacturer($vendor), FIRMWARE => $firmware, SERIALNUMBER => $serial }); } return @devs; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $devices = {}; my ($serial,$cap,$unit,$model,$manufacturer,$type,$desc,$firmware,$name); my @partitions; # Get complementary information in hash tab if ($common->can_run ("lshal")) { my %temp; my $in = 0; my $value; foreach my $line (`lshal`) { chomp $line; if ($line =~ s{^udi = '/org/freedesktop/Hal/devices/storage.*}{}) { $in = 1; %temp = (); } elsif ($in == 1 and $line =~ s{^\s+(\S+) = (.*) \s*\((int|string|bool|string list|uint64)\)}{} ) { my $key = $1; my $value = $2; $value =~ s/^'(.*)'\s*$/$1/; # Drop the quote $value =~ s/\s+$//; # Drop the trailing white space if ($key eq 'storage.serial') { $temp{SERIALNUMBER} = $value; } elsif ($key eq 'storage.firmware_version') { $temp{FIRMWARE} = $value; } elsif ($key eq 'block.device') { $value =~ s/\/dev\/(\S+)/$1/; $temp{NAME} = $value; } elsif ($key eq 'info.vendor') { $temp{MANUFACTURER} = getManufacturer($value); } elsif ($key eq 'storage.model') { $temp{MODEL} = $value; } elsif ($key eq 'storage.drive_type') { $temp{TYPE} = $value; } elsif ($key eq 'storage.size') { $temp{DISKSIZE} = int($value/(1024*1024) + 0.5); } } elsif ($in== 1 and $line eq '' and $temp{NAME}) { $in = 0 ; $devices->{$temp{NAME}} = {%temp}; } } } foreach my $device (getMultipathDisks($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "MODEL", "SERIALNUMBER", "DESCRIPTION", "TYPE") { $devices->{$name}->{$f} = $device->{$f}; } } foreach my $device (getFromDev($params)) { my $name = $device->{NAME}; foreach my $f ("NAME") { if($devices->{$name}->{$f} eq "") { #debug print "getFromDev $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getMdDevices($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MODEL") { if ($devices->{$name}->{$f} eq "") { $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromSmartctl($params,$devices)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "TYPE", "MODEL", "DISKSIZE", "FIRMWARE", "SERIALNUMBER", "DESCRIPTION") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromSmartctl $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromuDev2($params,$devices)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "TYPE", "MODEL", "FIRMWARE", "SERIALNUMBER") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromuDev2 $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromLshw($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "MODEL", "DESCRIPTION", "TYPE", "DISKSIZE", "SERIALNUMBER", "FIRMWARE") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromLshw $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromLsblk($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "DISKSIZE", "TYPE") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromLsblk $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromUdev($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "MODEL", "DESCRIPTION", "TYPE", "DISKSIZE", "SERIALNUMBER", "FIRMWARE", "SCSI_COID", "SCSI_CHID", "SCSI_UNID", "SCSI_LUN") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromuDev $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } foreach my $device (getFromLsscsi($params)) { my $name = $device->{NAME}; foreach my $f ("NAME", "MANUFACTURER", "TYPE", "MODEL") { if ($devices->{$name}->{$f} eq "") { #debug print "getFromLsscsi $name $f device->{\$f} $device->{$f}\n"; $devices->{$name}->{$f} = $device->{$f}; } } } my $logical_drive = undef; if ($common->can_run ('arcconf') ) { my ($cur_cont,$info,$key,$dev,$controller); $controller = Ocsinventory::Agent::Backend::OS::Linux::Storages::Adaptec::parse_config(); foreach $cur_cont (keys %{$controller}){ #travers Controller $info = $controller->{$cur_cont}; foreach $key (keys %{$info}){ #travers Infos of Controller if ($key=~m/logical drive/) { $logical_drive= $info->{$key}; } } } } foreach my $device (sort (keys %$devices)) { if ($devices->{$device}->{TYPE} =~ /(CD)|(CD\/DVD)|(DVD)|(BD)/i) { $devices->{$device}->{DISKSIZE} = "0000"; } elsif ($devices->{$device}->{DISKSIZE}) { $devices->{$device}->{DISKSIZE} = $devices->{$device}->{DISKSIZE} * 10**-6; # we need MB for the view } if (!$devices->{$device}->{DESCRIPTION}) { $devices->{$device}->{DESCRIPTION} = getFromSysProc($device,"description"); } if (!$devices->{$device}->{MANUFACTURER} or $devices->{$device}->{MANUFACTURER} eq 'ATA'or $devices->{$device}->{MANUFACTURER} eq '') { $devices->{$device}->{MANUFACTURER} = getManufacturer($devices->{$device}->{MODEL}); } if (!$devices->{$device}->{DISKSIZE} && $devices->{$device}->{TYPE} =~ /disk/) { $devices->{$device}->{DISKSIZE} = getCapacity($devices->{$device}->{NAME})*10**-6; } #if ($devices->{$device}->{CAPACITY} =~ /^cdrom$/) { # $devices->{$device}->{CAPACITY} = getCapacity($devices->{$device}->{NAME})*10**-6; #} if ($devices->{$device}->{MANUFACTURER}=~m/Adaptec/) {#check if found devices are Logical Devices foreach my $devkey (keys %{$logical_drive}) { if($devices->{$device}->{MODEL} =~m/$logical_drive->{$devkey}->{'Logical device name'}/) { #Correct infos $devices->{$device}->{TYPE}="Logical Drive"; $devices->{$device}->{DISKSIZE} = $logical_drive->{$devkey}->{'Size'}; } } } $common->addStorages($devices->{$device}); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/000077500000000000000000000000001432320066700245435ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/3ware.pm000066400000000000000000000144051432320066700261260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::3ware; use Ocsinventory::Agent::Backend::OS::Linux::Storages; # Tested on 2.6.* kernels # # Cards tested : # # 8006-2LP # 9500S-4LP # 9550SXU-4LP # 9550SXU-8LP # 9650SE-2LP # 9650SE-4LPML # 9650SE-8LPML # # AMCC/3ware CLI (version 2.00.0X.XXX) use strict; sub check { my $params = shift; my $common = $params->{common}; my ($card, $res); # Do we have tw_cli ? if ($common->can_run("tw_cli")) { foreach (`tw_cli info`) { $card = $1 if /^(c\d+).*/; if ($card) { $res = `tw_cli info $card numdrives`; $card = undef; $res =~ s/^.*=\s(\d+)/$1/; # Do we have drives on the card ? ($res == 0)?return 0:return 1; } } } } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my ($tw_cli, $hd); my ($card, $card_model, $unit, $unit_id, $port, $serialnumber, $serial, $model, $capacity, $firmware, $description, $media, $device, $manufacturer, $sn); my @devices = Ocsinventory::Agent::Backend::OS::Linux::Storages::getFromUdev(); # First, getting the cards : c0, c1... etc. foreach (`tw_cli info`) { # Should output something like this : # # Ctl Model Ports Drives Units NotOpt RRate VRate BBU # ------------------------------------------------------------------------ # c0 9650SE-2LP 2 2 1 0 1 1 - if (/^(c\d)+\s+([\w|-]+)/) { $card = $1; $card_model = $2; $logger->debug("Card : $card - Model : $card_model"); } if ($card) { # Second, getting the units : u0, u1... etc. foreach (`tw_cli info $card`) { # Example output : # # Unit UnitType Status %RCmpl %V/I/M Stripe Size(GB) Cache AVrfy # ------------------------------------------------------------------------------ # u0 RAID-1 OK - - - 65.1826 ON OFF # # Port Status Unit Size Blocks Serial # --------------------------------------------------------------- # p0 OK u0 69.25 GB 145226112 WD-WMANS1648590 # p1 OK u0 69.25 GB 145226112 WD-WMANS1344790 if (/^(u)(\d+).*/) { $unit = $1 . $2; $unit_id = $2; } if ($unit) { # Try do get unit's serial in order to compare it to what was found in udev db. # Works only on newer cards. # Allow us to associate a node to a drive : sda -> WD-WMANS1648590 $sn = `tw_cli info $card $unit serial 2> /dev/null`; $sn =~ s/^.*serial number\s=\s(\w*)\s*/$1/; # Third, getting the ports : p0, p1... etc. foreach(`tw_cli info $card $unit`) { $port = $1 if /^.*(p\d+).*/; if ($port) { # Finally, getting drives' values. foreach (`tw_cli info $card $port model serial capacity firmware`) { # Example output : # # /c0/p0 Model = WDC WD740ADFD-00NLR4 # /c0/p0 Serial = WD-WMANS1648590 # /c0/p0 Capacity = 69.25 GB (145226112 Blocks) # /c0/p0 Firmware Version = 21.07QR4 $model = $1 if /^.*Model\s=\s(.*)/; $serialnumber = $1 if /^.*Serial\s=\s(.*)/; $capacity = 1024*$1 if /^.*Capacity\s=\s(\S+)\sGB.*/; $firmware = $1 if /^.*Firmware Version\s=\s(.*)/; } foreach $hd (@devices) { # How does this work with multiple older cards where serial for units is not implemented ? # Need to be tested on a system with multiple 3ware cards. if (($hd->{SERIALNUMBER} eq 'AMCC_' . $sn) or ($hd->{MODEL} eq 'Logical_Disk_' . $unit_id)) { $device = $hd->{NAME}; } } # Getting description from card model, very basic and unreliable # Assuming only IDE drives can be plugged in 5xxx/6xxx cards and # SATA drives only to 7xxx/8xxx/9xxxx cards $description = undef; foreach ($card_model) { $description = "IDE" if /^[5-6].*/; $description = "SATA" if /^[7-9].*/; } $media = 'disk'; $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($model); $port = undef; $logger->debug("3ware: $device, $manufacturer, $model, $description, $media, $capacity, $serialnumber, $firmware"); $common->addStorages({ NAME => $device, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => $media, DISKSIZE => $capacity, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware, }); } $port = undef; } $unit = undef; } } $card = undef; $card_model = undef; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/Adaptec.pm000066400000000000000000000261101432320066700264420ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::Adaptec; use Ocsinventory::Agent::Backend::OS::Linux::Storages; #Function parse_config and parse_config_fh are taken from https://github.com/kumy/Parse-Arcconf # #LICENSE AND COPYRIGHT # #Copyright (C) 2012 Mathieu Alorent # #This program is free software; you can redistribute it and/or modify it #under the terms of either: the GNU General Public License as published #by the Free Software Foundation; or the Artistic License. # #See http://dev.perl.org/licenses/ for more information. # Tested on 2.6.* kernels # # Cards tested : # # Adaptec AAC-RAID use strict; my @devices = Ocsinventory::Agent::Backend::OS::Linux::Storages::getFromUdev(); sub check { my $params = shift; my $common = $params->{common}; #Do we have arcconf if ($common->can_run ('arcconf') ) { my $conf = `arcconf GETCONFIG 1`; if($conf =~ /Controllers found: (\d+)/) { if($1>0) { return 1; } } } #Do we have smartctl if ($common->can_run ('smartctl') ) { foreach my $hd (@devices) { $hd->{MANUFACTURER} eq 'Adaptec'?return 1:1; } } return 0; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my ($name,$vendor,$model,$serialnumber,$firmware, $size, $description, $media, $manufacturer); my ($conf, $cur_cont,$info,$key, $dev, $devkey,$controller); #get infos from arcconf if possible if ($common->can_run ('arcconf') ) { $conf = `arcconf GETCONFIG 1`; if($conf =~ /Controllers found: (\d+)/) { if($1>0) { $controller = parse_config(); foreach $cur_cont (keys %{$controller}){ #travers Controller $info = $controller->{$cur_cont}; foreach $key (keys %{$info}){ #travers Infos of Controller #physical drives if ($key=~m/physical drive/) { $dev = $info->{$key}; foreach $devkey (keys %{$dev}) { #get infos $vendor = $dev->{$devkey}->{'Vendor'}; $model = $dev->{$devkey}->{'Model'}; $serialnumber = $dev->{$devkey}->{'Serial number'}; $firmware = $dev->{$devkey}->{'Firmware'}; $size = $dev->{$devkey}->{'Size'}; $description = $dev->{$devkey}->{'Transfer Speed'}; $media = $dev->{$devkey}->{'Device is'}; unless ( $media=~m/an Enclosure services device/) { #Dont need services device just drives if ( $media=~m/a Hard drive/ ){ $media = "HDD"; #try to determine if Drive is a Solid State Disk if (exists $dev->{$devkey}->{'SSD'}) { #SSD Info is explicit in config my $ssd = $dev->{$devkey}->{'SSD'}; if ($ssd=~m/Yes/) { $media = "SSD"; } } else { #No explicit info try to get it through model name if($model =~m/SSD|Solid State|WDS/) { $media = "SSD"; } } } $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($vendor); $logger->debug("Adaptec: $manufacturer $media $size, $manufacturer, $model, $description, $media, $size , $serialnumber, $firmware"); $common->addStorages({ NAME => "$manufacturer $media $size", MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => $media, DISKSIZE => $size, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware, }); } } } } } } } } elsif (-r '/proc/scsi/scsi') { foreach my $hd (@devices) { open (PATH, '/proc/scsi/scsi'); # Example output: # # Attached devices: # Host: scsi0 Channel: 00 Id: 00 Lun: 00 # Vendor: Adaptec Model: raid10 Rev: V1.0 # Type: Direct-Access ANSI SCSI revision: 02 # Host: scsi0 Channel: 01 Id: 00 Lun: 00 # Vendor: HITACHI Model: HUS151436VL3800 Rev: S3C0 # Type: Direct-Access ANSI SCSI revision: 03 # Host: scsi0 Channel: 01 Id: 01 Lun: 00 # Vendor: HITACHI Model: HUS151436VL3800 Rev: S3C0 # Type: Direct-Access ANSI SCSI revision: 03 my ($host, $model, $firmware, $manufacturer, $size, $serialnumber); my $count = -1; while () { ($host, $count) = (1, $count+1) if /^Host:\sscsi$hd->{SCSI_COID}.*/; if ($host) { if ((/.*Model:\s(\S+).*Rev:\s(\S+).*/) and ($1 !~ 'raid.*')) { $model = $1; $firmware = $2; $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($model); foreach (`smartctl -i /dev/sg$count`) { $serialnumber = $1 if /^Serial Number:\s+(\S*).*/; } $logger->debug("Adaptec: $hd->{NAME}, $manufacturer, $model, SATA, disk, $hd->{DISKSIZE}, $serialnumber, $firmware"); $host = undef; $common->addStorages({ NAME => $hd->{NAME}, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => 'SATA', TYPE => 'disk', DISKSIZE => $size, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware, }); } } } close (PATH); } } } sub parse_config { my $arcconf = "arcconf"; my $argument = "GETCONFIG 1"; my $command = sprintf("%s %s|", $arcconf, $argument); my $fh; if(open $fh, $command) { my $c = parse_config_fh($fh); close $fh; return $c; } return undef; } sub parse_config_fh { my $fh = $_[0]; my $controller = {}; my $total_controller = 0; my $current_controller = 0; my $current_logical_drive = undef; my $current_physical_drive = undef; my $ctrl = undef; my $line = undef; LEVEL1: while($line = <$fh>) { chomp $line; next if($line =~ /^$/); next if($line =~ /^-+$/); if($line =~ /^Controllers found: (\d+)$/) { $total_controller = $1; } if($line =~ /^Controller information/) { $current_controller = $current_controller + 1; $current_logical_drive = undef; $current_physical_drive = undef; $controller->{$current_controller} = {}; $ctrl = $controller->{$current_controller}; while($line = <$fh>) { chomp $line; if ($line =~ /^\s+(.*\w)\s+:\s+(.*)$/) { $ctrl->{$1} = $2; } elsif ($line =~ /^\s+-+$/) { last; } } LEVEL2: while($line = <$fh>) { if ($line =~ /^\s+-+$/) { $line = <$fh>; chomp $line; } if($line =~ /^\s+(.*\w)\s*/) { my $cat = $1; $line = <$fh>; LEVEL3: while($line = <$fh>) { chomp $line; if ($line =~ /^\s+(.*\w)\s+:\s+(.*)$/) { $ctrl->{$cat}{$1} = $2; } elsif ($line =~ /^\s+-+$/) { last LEVEL3; } elsif ($line =~ /^$/) { last LEVEL2; } } } } } next if(!defined($current_controller)); if($line =~ /^Logical drive information/ or $line =~ /^Logical device information/) { LEVEL4: while($line = <$fh>) { chomp $line; if ($line =~ /^\S+.*\w\s+(\d+)$/) { $current_logical_drive = $1; } elsif ($line =~ /^\s+(\S.*\S+)\s+:\s+(.*)$/) { $ctrl->{'logical drive'}{$current_logical_drive}{$1} = $2; } elsif ($line =~ /^\s+-+$/) { my $cat = <$fh>; $cat =~ s/^\s+(\S.*\S+)\s+/$1/; chomp $cat; LEVEL5: while($line = <$fh>) { chomp $line; if ($line =~ /^\s+(\S.*\S+)\s+:\s+(.*)$/) { $ctrl->{'logical drive'}{$current_logical_drive}{$cat}{$1} = $2; } elsif ($line =~ /^\S+.*\w\s+(\d+)$/) { $current_logical_drive = $1; last LEVEL5; } elsif ($line =~ /^-+$/) { last LEVEL4; } elsif ($line =~ /^\s+-+$/) { next; } } } } } if($line =~ /^Physical Device information/) { LEVEL2: while($line = <$fh>) { if ($line =~ /^\s+-+$/) { $line = <$fh>; chomp $line; } if ($line =~ /^\s+Device\s+#(\d+)$/) { $current_physical_drive = $1; } elsif ($line =~ /^\s+Device is (.*\w)/) { $ctrl->{'physical drive'}{$current_physical_drive}{'Device is'} = $1; } elsif ($line =~ /^\s+(.*\w)\s+:\s+(.*)$/) { $ctrl->{'physical drive'}{$current_physical_drive}{$1} = $2; } elsif ($line =~ /^\s+-+$/) { last LEVEL3; } elsif ($line =~ /^$/) { last LEVEL2; } } } } return $controller; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/FusionIO.pm000066400000000000000000000034051432320066700265760ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::FusionIO; use Ocsinventory::Agent::Backend::OS::Linux::Storages; use strict; sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; sub check { my $params = shift; my $common = $params->{common}; my $ret; # Do we have fio-status? if ($common->can_run("fio-status")) { foreach (`fio-status 2> /dev/null`) { if (/^fct(\d*).*/) { $ret=1; last; } } } return $ret; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my ($pd, $serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer); foreach (`fio-status 2> /dev/null`) { if (/^fct(\d*).*/) { my $slot = $1; my $cmd = "fio-status /dev/fct$slot --field"; $model = trim(`$cmd iom.board_name`); $description = trim(`$cmd adapter.product_name`); $media = trim('disk'); $capacity = trim(`$cmd iom.size_bytes`); $serialnumber = 'OEM:'.trim(`$cmd adapter.oem_serial_number`).' FIO:'.trim(`$cmd adapter.fio_serial_number`).' IOM:'.trim(`$cmd iom.serial_number`); $firmware = trim(`$cmd iom.fw_current_version`.' rev '.`$cmd iom.fw_current_revision`); $logger->debug("Fusion-io: N/A, $manufacturer, $model, $description, $media, $capacity, $serialnumber, $firmware"); $common->addStorages({ NAME => $model, MANUFACTURER => 'Fusion-io', MODEL => $model, DESCRIPTION => $description, TYPE => $media, DISKSIZE => $capacity, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/HP.pm000066400000000000000000000105311432320066700254100ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::HP; use Ocsinventory::Agent::Backend::OS::Linux::Storages; # Tested on 2.6.* kernels # # Cards tested : # # Smart Array E200 # # HP Array Configuration Utility CLI 7.85-18.0 use strict; sub check { my $params = shift; my $common = $params->{common}; my $ret; # Do we have ssacli ? if ($common->can_run("ssacli")) { foreach (`ssacli ctrl all show 2> /dev/null`) { if (/.*Slot\s(\d*).*/) { $ret = 1; last; } } } return $ret; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my ($pd, $serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer); foreach (`ssacli ctrl all show 2> /dev/null`) { # Example output : # # Smart Array E200 in Slot 2 (sn: PA6C90K9SUH1ZA) if (/.*Slot\s(\d*).*/) { my $slot = $1; foreach (`ssacli ctrl slot=$slot pd all show 2> /dev/null`) { # Example output : # Smart Array E200 in Slot 2 # # array A # # physicaldrive 2I:1:1 (port 2I:box 1:bay 1, SATA, 74.3 GB, OK) # physicaldrive 2I:1:2 (port 2I:box 1:bay 2, SATA, 74.3 GB, OK) if (/.*physicaldrive\s(\S*)/) { my $pd = $1; foreach (`ssacli ctrl slot=$slot pd $pd show 2> /dev/null`) { # Example output : # # Smart Array E200 in Slot 2 # # array A # # physicaldrive 1:1 # Port: 2I # Box: 1 # Bay: 1 # Status: OK # Drive Type: Data Drive # Interface Type: SATA # Size: 74.3 GB # Firmware Revision: 21.07QR4 # Serial Number: WD-WMANS1732855 # Model: ATA WDC WD740ADFD-00 # SATA NCQ Capable: False # PHY Count: 1 $model = $1 if /.*Model:\s(.*)/; $description = $1 if /.*Interface Type:\s(.*)/; $media = $1 if /.*Drive Type:\s(.*)/; $capacity = $1 if /^\s*Size:\s(.*)/; $serialnumber = $1 if /.*Serial Number:\s(.*)/; $firmware = $1 if /.*Firmware Revision:\s(.*)/; } $serialnumber =~ s/^\s+//; $model =~ s/^ATA\s+//; # ex: ATA WDC WD740ADFD-00 $model =~ s/\s+/ /; $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($model); if ($media eq 'Data Drive') { $media = 'HDD'; if ($description =~m/SSD|Solid State/) { $media = 'SSD'; } elsif ($model =~m/SSD|Solid State|WDS/) { $media = 'SSD'; } } if ($capacity =~m/TB/) { $capacity *= 1000000; } elsif ($capacity =~m/GB/) { $capacity *= 1000; } else { $capacity *= 1; } $logger->debug("HP: N/A, $manufacturer, $model, $description, $media, $capacity, $serialnumber, $firmware"); $common->addStorages({ NAME => $model, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => $media, DISKSIZE => $capacity, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware }); } } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/Lsilogic.pm000066400000000000000000000051351432320066700266520ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::Lsilogic; use Ocsinventory::Agent::Backend::OS::Linux::Storages; # Tested on 2.6.* kernels # # Cards tested : # # LSI Logic / Symbios Logic SAS1064E PCI-Express Fusion-MPT SAS # # mpt-status version : 1.2.0 use strict; sub check { my $params = shift; my $common = $params->{common}; my $device; # Do we have smartctl ? if ($common->can_run('smartctl')) { foreach my $node (glob("/dev/sd?")) { foreach (`smartctl -i $node`) { $device = $1 if /.*Device:\s(\w*).*/; } } ($device eq 'LSILOGIC')?return 1:return 0; } return 0; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $serialnumber; my @devices = Ocsinventory::Agent::Backend::OS::Linux::Storages::getFromUdev(); foreach my $hd (@devices) { foreach (`mpt-status -n -i $hd->{SCSI_UNID}`) { # Example output : # # ioc:0 vol_id:0 type:IM raidlevel:RAID-1 num_disks:2 size(GB):148 state: OPTIMAL flags: ENABLED # ioc:0 phys_id:1 scsi_id:2 vendor:ATA product_id:ST3160815AS revision:D size(GB):149 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff #ioc:0 phys_id:0 scsi_id:1 vendor:ATA product_id:ST3160815AS revision:D size(GB):149 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff #scsi_id:1 100% #scsi_id:0 100% if (/.*phys_id:(\d+).*product_id:\s*(\S*)\s+revision:(\S+).*size\(GB\):(\d+).*/) { $serialnumber = undef; foreach (`smartctl -i /dev/sg$1`) { $serialnumber = $1 if /^Serial Number:\s+(\S*)/; } my $model = $2; my $size = 1024*$4; # GB => MB my $firmware = $3; my $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($model); $logger->debug("Lsilogic: $hd->{NAME}, $manufacturer, $model, SATA, disk, $size, $serialnumber, $firmware"); $common->addStorages({ NAME => $hd->{NAME}, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => 'SATA', TYPE => 'disk', DISKSIZE => $size, SERIALNUMBER => $serialnumber, FIRMWARE => $firmware, }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/Megacli.pm000066400000000000000000000052101432320066700264400ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::Megacli; use Ocsinventory::Agent::Backend::OS::Linux::Storages; use strict; sub check { my $params = shift; my $common = $params->{common}; my $ret; my $cont; if ($common->can_run("megacli")) { foreach (`megacli -adpCount 2>/dev/null`) { if (/^Controller\sCount:\s(\d+)/) { $cont=$1; if (defined $cont && $cont == 1) { $ret=1; last; } } } } return $ret; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $adpc; my $model; my $description; my $capacity; my $firmware; my $serial; my $manufacturer; my $index; my @partitions; my @sl; # Retrieve the partition open PARTINFO, '){ if (/^\s*(\d*)\s*(\d*)\s*(\d*)\s*([sh]d[a-z]+)$/i){ push(@partitions,$4); } } # How adapters are present? foreach (`megacli -adpCount 2> /dev/null`){ $adpc=$1 if (/^Controller Count:\s(\d+)./i); } # How slot are used on the controller? for (my $count=0;$count<$adpc;$count++){ foreach (`megacli -ShowSummary -a$count`){ # Slot number : Connector : 0: Slot 1 if (/Connector\s*:\s*\d+(?:): Slot (\d+)/){ push (@sl, $1); } } # use smartctcl command to retrieve information foreach my $dev (@partitions){ foreach my $slo (@sl){ # smartctl -i -d megaraid,0 /dev/sda my $result=`smartctl -i -d megaraid,$slo /dev/$dev`; $model=$1 if ($result =~ /Model Family:\s*(.*)/); $description=$1 if ($result =~ /Device Model:\s*(.*)/); $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($description); $serial=$1 if ($result =~ /Serial Number:\s*(.*)/); $firmware=$1 if ($result =~ /Firmware Version:\s*(.*)/); $capacity=$1 if ($result =~ /User Capacity:\s*.*\[(.*)\]/); $common->addStorages({ NAME => $description, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => "Disk", DISKSIZE => $capacity, SERIALNUMBER => $serial, FIRMWARE => $firmware }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/ServeRaid.pm000066400000000000000000000073141432320066700267720ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Storages::ServeRaid; use Ocsinventory::Agent::Backend::OS::Linux::Storages; # Tested on 2.6.* kernels # # Cards tested : # # IBM ServeRAID-6M # IBM ServeRAID-6i use strict; sub check { my $params = shift; my $common = $params->{common}; my $ret = 0; # Do we have ipssend installed ? if ($common->can_run("ipssend")) { foreach (`ipssend GETVERSION 2>/dev/null`) { if (/.*ServeRAID Controller Number\s(\d*).*/) { $ret = $1; last; } } } return $ret; } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $slot; $logger->debug("ServeRaid: ipssend GETVERSION"); foreach (`ipssend GETVERSION 2>/dev/null`) { # Example Output : # Found 1 IBM ServeRAID controller(s). #---------------------------------------------------------------------- #ServeRAID Controller(s) Version Information #---------------------------------------------------------------------- # Controlling BIOS version : 7.00.14 # #ServeRAID Controller Number 1 # Controller type : ServeRAID-6M # Controller slot information : 2 # Actual BIOS version : 7.00.14 # Firmware version : 7.00.14 # Device driver version : 7.10.18 $slot = $1 if /.*ServeRAID Controller Number\s(\d*).*/; if (/.*Controller type.*:\s(.*)/) { my $name = $1; my ($serial, $capacity, $scsi, $channel, $state); $logger->debug("ServeRaid: ipssend GETCONFIG $slot PD"); foreach (`ipssend GETCONFIG $slot PD 2>/dev/null`) { # Example Output : # Channel #1: # Target on SCSI ID 0 # Device is a Hard disk # SCSI IDg: 0 # PFA (Yes/No) : No # Stateg : Online (ONL) # Size (in MB)/(in sectors): 34715/71096368 # Device ID : IBM-ESXSCBR036C3DFQDB2Q6CDKM # FRU part number : 32P0729 $channel = $1 if /.*Channel #(.*):/; $scsi = $1 if /.*SCSI ID.*:\s(.*)/; $state = $1 if /.*State.*\((.*)\)/; $capacity = $1 if /.*Size.*:\s(\d*)\/(\d*)/; $serial = $1 if /.*Device ID.*:\s(.*)/; if (/.*FRU part number.*:\s(.*)/) { my $model = $1; my $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($serial); ## my $fullname = "$name $slot/$channel/$scsi $state"; $logger->debug("ServeRaid: found $model, $manufacturer, $model, SCSI, disk, $capacity, $serial, "); $common->addStorages({ NAME => "$manufacturer $model", MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => "SCSI", TYPE => "disk", DISKSIZE => $capacity, SERIALNUMBER => $serial, FIRMWARE => "" }); # don't undef $channel, appear only once for several drive. $scsi = $state = $capacity = $serial = undef; } } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Sys.pm000066400000000000000000000005251432320066700240720ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Sys; #$LunchAfter = "Ocsinventory::Agent::Backend::OS::Linux::VirtualFs::Sys"; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("mount"); foreach (`mount`) { return 1 if (/type\ sysfs/); } 0; } sub run {} 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Uptime.pm000066400000000000000000000015041432320066700245550ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Uptime; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_read("/proc/uptime") } sub run { my $params = shift; my $common = $params->{common}; # Uptime open UPTIME, "/proc/uptime"; my $uptime = ; $uptime =~ s/^(.+)\s+.+/$1/; close UPTIME; # Uptime conversion my ($UYEAR, $UMONTH , $UDAY, $UHOUR, $UMIN, $USEC) = (gmtime ($uptime))[5,4,3,2,1,0]; # Write in ISO format $uptime=sprintf "%02d-%02d-%02d %02d:%02d:%02d", ($UYEAR-70), $UMONTH, ($UDAY-1), $UHOUR, $UMIN, $USEC; chomp(my $DeviceType =`uname -m`); # TODO$h->{'CONTENT'}{'HARDWARE'}{'DESCRIPTION'} = [ "$DeviceType/$uptime" ]; $common->setHardware({ DESCRIPTION => "$DeviceType/$uptime" }); } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Linux/Videos.pm000066400000000000000000000035751432320066700245550ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Linux::Videos; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run ("nvidia-smi"); return unless $common->can_run ("nvidia-settings"); } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $nvidia; my @nvidia_infos=`nvidia-smi -q`; my @nvidia_settings=`nvidia-settings -q all`; my @prime=`nvidia-settings --query=PrimeOutputsData`; foreach my $info (@nvidia_infos) { $nvidia->{SERIALNUMBER}=$1 if ($info =~ /Serial Number\s+: (.*)/i); $nvidia->{DRVVERSION}=$1 if ($info =~ /Driver Version\s+: ([0-9]+\.[0-9]+)/i); $nvidia->{NBGPU}=$1 if ($info =~ /Attached GPUs\s+: ([0-9])/i); $nvidia->{VBIOS}=$1 if ($info =~ /VBIOS Version\s+: (.*)/i); $nvidia->{NAME}=$1 if ($info =~ /Product Name\s+:(.*)/i); $nvidia->{UUID}=$1 if ($info =~ /GPU UUID\s+:(.*)/i); $nvidia->{PCISLOT}=$1 if ($info =~ /Bus Id\s+:(.*)/i); } # Resolution foreach my $inf (@prime) { next if ($inf =~ /^\s*$/); my $width=$1 if ($inf =~ /width=(\d{1,4})/); my $height=$1 if ($inf =~ /height=(\d{1,4})/); $nvidia->{RESOLUTION}=$width."x".$height; } $nvidia->{MEMORY}=`nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits`; $nvidia->{MEMORY} =~ s/\s+$//g; $nvidia->{NAME} =~ s/^\s//g; $nvidia->{UUID} =~ s/^\s//g; $nvidia->{PCISLOT} =~ s/^\s0{8}://g; foreach my $settings (@nvidia_settings) { $nvidia->{DATA_WIDTH}=$1 if ($settings =~ /Attribute \'GPUMemoryInterface\'\s\(.*\):\s(\d{2})./i); $nvidia->{CUDACORES}=$1 if ($settings =~ /Attribute \'CUDACores\'\s\(.*\):\s(\d{2})./i); } for (my $i=0; $i<$nvidia->{NBGPU};$i++) { $common->addVideo($nvidia); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS.pm000066400000000000000000000032731432320066700231620ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS; use strict; require Exporter; our @ISA = qw /Exporter/; our @EXPORT = qw /get_sysprofile_devices_names/; sub check { my $r; # we check far darwin because that's the _real_ underlying OS $r = 1 if (uc($^O) =~ /^DARWIN$/); return($r); } sub run { my $params = shift; my $common = $params->{common}; my $OSName; my $OSComment; my $OSVersion; my $uuid; # if we can load the system profiler, gather the information from that if ($common->can_load("Mac::SysProfile")){ my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPSoftwareDataType'); return(undef) unless(ref($data) eq 'ARRAY'); my $h = $data->[0]; my $SystemVersion = $h->{'os_version'}; if ($SystemVersion =~ /^(.*?)\s+(\d+.*)/) { $OSName=$1; $OSVersion=$2; } else { # Default values $OSName="macOS"; $OSVersion="Unknown"; } } else { # we can't load the system profiler, use the basic BSD stype information # Operating system informations chomp($OSName=`uname -s`); chomp($OSVersion=`uname -r`); } # add the uname -v as the comment, not really needed, but extra info never hurt chomp($OSComment=`uname -v`); # We get UUID if ($common->can_run("ioreg")) { my @ioreg = split ("=", `ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)'`); chomp($uuid = $ioreg[1]); $uuid =~ s/\"|\s//g; } $common->setHardware({ OSNAME => $OSName, OSCOMMENTS => $OSComment, OSVERSION => $OSVersion, UUID => $uuid, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/000077500000000000000000000000001432320066700226175ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Bios.pm000066400000000000000000000023731432320066700240560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Bios; use strict; sub check { my $params = shift; my $common = $params->{common}; return $common->can_load("Mac::SysProfile") } sub run { my $params = shift; my $common = $params->{common}; # use Mac::SysProfile to get the respected datatype my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPHardwareDataType'); # unless we get a real hash value, return with nothing return(undef) unless($data && ref($data) eq 'ARRAY'); my $h = $data->[0]; # set the bios information from the apple system profiler $common->setBios({ SMANUFACTURER => 'Apple Inc', # duh SMODEL => $h->{'model_identifier'} || $h->{'machine_model'}, TYPE => $h->{'machine_name'}, BMANUFACTURER => 'Apple Inc', MMANUFACTURER => 'Apple Inc', # SSN => $h->{'Serial Number'} # New method to get the SSN, because of MacOS 10.5.7 update # system_profiler gives 'Serial Number (system): XXXXX' where 10.5.6 # and lower give 'Serial Number: XXXXX' SSN => $h->{'serial_number'}, BVERSION => $h->{'boot_rom_version'}, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/CPU.pm000066400000000000000000000040661432320066700236120ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::CPU; use strict; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; return(undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; my $processors; my $arch; my $datawidth; # 32 or 64 bits arch? my $sysctl_arch = `sysctl -n hw.cpu64bit_capable`; if ($sysctl_arch == 1){ $arch = "x86_64"; $datawidth = 64; } else { $arch = "x86"; $datawidth = 32; } # How much processor socket ? my $ncpu=`sysctl -n hw.packages`; # For each processor socket foreach my $cpu (1..$ncpu) { $processors->{$cpu}->{MANUFACTURER} = `sysctl -n machdep.cpu.vendor`; if ($processors->{$cpu}->{MANUFACTURER} =~ /(Authentic|Genuine|)(.+)/i) { $processors->{$cpu}->{MANUFACTURER} = $2; } chomp($processors->{$cpu}->{MANUFACTURER} ); $processors->{$cpu}->{TYPE} = `sysctl -n machdep.cpu.brand_string`; chomp($processors->{$cpu}->{TYPE} ); $processors->{$cpu}->{SPEED} = `sysctl -n hw.cpufrequency` / 1000 / 1000; $processors->{$cpu}->{L2CACHESIZE} = `sysctl -n hw.l2cachesize` / 1024; $processors->{$cpu}->{CORES} = `sysctl -n machdep.cpu.core_count`; chomp($processors->{$cpu}->{CORES}); $processors->{$cpu}->{THREADS} = `sysctl -n machdep.cpu.thread_count`; chomp($processors->{$cpu}->{THREADS}); $processors->{$cpu}->{LOGICAL_CPUS} = `sysctl -n machdep.cpu.logical_per_package`; chomp($processors->{$cpu}->{LOGICAL_CPUS}); $processors->{$cpu}->{CPUARCH} = $arch; $processors->{$cpu}->{DATA_WIDTH} = $datawidth; $processors->{$cpu}->{NBSOCKET} = $cpu; chomp($processors->{$cpu}->{NBSOCKET}); $processors->{$cpu}->{SERIALNUMBER} = "N/A"; } # Add new cpu infos to inventory foreach (keys %{$processors}){ $common->addCPU($processors->{$_}); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Camera.pm000066400000000000000000000011041432320066700243410ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Camera; use strict; sub check { return(undef) unless -r '/usr/sbin/system_profiler'; # check perms return 1; } sub run { my $params = shift; my $common = $params->{common}; # create profiler obj, bail if datatype fails my $data = $common->get_sysprofile_devices_names('SPCameraDataType'); return(undef) unless(ref($data) eq 'ARRAY'); # add sound cards foreach my $cam (@$data){ $common->addCamera({ 'MODEL' => $cam, 'UUID' => $cam, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Controllers.pm000066400000000000000000000045601432320066700254700ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Controllers; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; # check perms return (undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; my ($caption, $description, $name, $type); my $datatypes = { #usb => 'SPUSBDataType', TODO: fix problems with SPUSBDataType in Mac::Sysprofile firewire => 'SPFireWireDataType', thunderbolt => 'SPThunderboltDataType', ethernet => 'SPEthernetDataType', }; for my $datatype (keys %$datatypes) { # create the profile object and return undef unless we get something back my $pro = Mac::SysProfile->new(); my $data = $pro->gettype($datatypes->{$datatype}); return(undef) unless(ref($data) eq 'ARRAY'); foreach my $port (@$data) { if ($datatype =~ /usb/) { $name = $port->{'usb_bus_number'}; $type = 'USB Bus'; $description = $port->{'controller_location'} . ", PCI Device ID: " . $port->{'pci_device'}; } elsif ($datatype =~ /firewire/) { $name = 'FireWire'; $type = 'FireWire Bus'; $description = 'Max Speed: ' . $port->{'max_device_speed'}; } elsif ($datatype =~ /thunderbolt/) { $name = $port->{'device_name_key'}; next unless $name; $type = 'Thunderbolt'; $description = 'UID: ' . $port->{'switch_uid_key'}; } elsif ($datatype =~ /ethernet/) { $name = $port->{'_name'}; if ($name ne '') { $name = $port->{'spethernet_device-id'} if ($name eq 'ethernet'); $type = 'Ethernet Controller'; $description = 'BSD: ' . $port->{'spethernet_BSD_Name'}; } } $common->addController({ CAPTION => $caption, DESCRIPTION => $description, NAME => $name, TYPE => $type, }); $caption = $description = $name = $type = undef; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Domains.pm000066400000000000000000000013731432320066700245530ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Domains; use strict; # straight up theft from the other modules... sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run('dsconfigad'); my @domain = `dsconfigad -show`; return 1 if @domain; 0 } sub run { my $params = shift; my $common = $params->{common}; my $domain; my $domainInfo; chomp ($domainInfo = `dsconfigad -show`); my @domainInfo = split (/\n/, $domainInfo); shift(@domainInfo); if($domainInfo[0]) { @domainInfo = split(/\=/, $domainInfo[0]); $domain = $domainInfo[1]; $domain =~ s/^\s+//; } $common->setHardware({ WORKGROUP => $domain }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Drives.pm000066400000000000000000000021151432320066700244100ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Drives; use strict; # yea BSD theft!!!! # would have used Mac::SysProfile, but the xml isn't quite fully supported # the drives come back in apple xml tree's, and the module can't handle it yet (soon as I find the time to fix the patch) sub check {1} sub run { my $params = shift; my $common = $params->{common}; my $free; my $filesystem; my $total; my $type; my $volumn; for my $t ("apfs", "ffs","ufs", "hfs") { # OpenBSD has no -m option so use -k to obtain results in kilobytes for(`df -P -k -t $t`){ # darwin needs the -t to be last if(/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\n/){ $type = $1; $filesystem = $t; $total = sprintf("%i",$2/1024); $free = sprintf("%i",$4/1024); $volumn = $6; $common->addDrive({ FREE => $free, FILESYSTEM => $filesystem, TOTAL => $total, TYPE => $type, VOLUMN => $volumn }) } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Hostname.pm000066400000000000000000000011031432320066700247260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Hostname; sub check { my $params = shift; my $common = $params->{common}; return 1 if $common->can_load ("Mac::SysProfile"); 0; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $hostname; my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPSoftwareDataType'); return undef unless(ref($data) eq 'ARRAY'); my $h = $data->[0]; $hostname = $h->{'local_host_name'}; $common->setHardware ({NAME => $hostname}) if $hostname; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/IPv4.pm000066400000000000000000000011211432320066700237320ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::IPv4; # straight up theft from the other modules sub check { my @ifconfig = `ifconfig -a 2>/dev/null`; return 1 if @ifconfig; return; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my @ip; # Looking for ip addresses with ifconfig, except loopback # *BSD need -a option foreach (`ifconfig -a`){ if(/^\s*inet\s+(\S+)/){ ($1=~/^127.+/)?next:push @ip, $1 }; } my $ip=join "/", @ip; $common->setHardware({IPADDR => $ip}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Mem.pm000066400000000000000000000047461432320066700237060ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Mem; use strict; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; # check perms return (undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; my $PhysicalMemory; # create the profile object and return undef unless we get something back my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPMemoryDataType'); return(undef) unless(ref($data) eq 'ARRAY'); # Workaround for MacOSX 10.5.7 #if ($h->{'Memory Slots'}) { # $h = $h->{'Memory Slots'}; #} foreach my $memory (@$data){ next unless $memory->{'_name'} =~ /^BANK|SODIMM|DIMM/; # tare out the slot number my $slot = $memory->{'_name'}; # memory in 10.5 if($slot =~ /^BANK (\d)\/DIMM\d/){ $slot = $1; } # 10.4 if($slot =~ /^SODIMM(\d)\/.*$/){ $slot = $1; } # 10.4 PPC if($slot =~ /^DIMM(\d)\/.*$/){ $slot = $1; } # 10.7 if ($slot =~ /^DIMM (\d)/) { $slot = $1; } my $size = $memory->{'dimm_size'}; my $desc = $memory->{'dimm_part_number'}; if ($desc !~ /empty/ && $desc =~ s/^0x//) { # dimm_part_number is an hex string, convert it to ascii $desc =~ s/^0x//; # Trim filling "00" from part number, which causes invalid XML down the line. $desc =~ s/00//g; $desc = pack "H*", $desc; $desc =~ s/\s+$//; # New macs might have some specific characters, perform a regex to fix it $desc =~ s/(?!-)[[:punct:]]//g; } # if system_profiler lables the size in gigs, we need to trim it down to megs so it's displayed properly if($size =~ /GB$/){ $size =~ s/GB$//; $size *= 1024; } $common->addMemory({ 'CAPACITY' => $size, 'SPEED' => $memory->{'dimm_speed'}, 'TYPE' => $memory->{'dimm_type'}, 'SERIALNUMBER' => $memory->{'dimm_serial_number'}, 'DESCRIPTION' => $desc, 'NUMSLOTS' => $slot, 'CAPTION' => 'Status: '.$memory->{'dimm_status'}, }); } # Send total memory size to inventory object my $sysctl_memsize=`sysctl -n hw.memsize`; $common->setHardware({ MEMORY => $sysctl_memsize / 1024 / 1024, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Networks.pm000066400000000000000000000113271432320066700247750ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Networks; # I think I hijacked most of this from the BSD/Linux modules use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("ifconfig") && $common->can_load("Net::IP qw(:PROC)") } sub _ipdhcp { my $if = shift; my $path; my $ipdhcp; my $leasepath; foreach ( # XXX BSD paths "/var/db/dhclient.leases.%s", "/var/db/dhclient.leases", # Linux path for some kFreeBSD based GNU system "/var/lib/dhcp3/dhclient.%s.leases", "/var/lib/dhcp3/dhclient.%s.leases", "/var/lib/dhcp/dhclient.leases") { $leasepath = sprintf($_,$if); last if (-e $leasepath); } return undef unless -e $leasepath; if (open DHCP, $leasepath) { my $lease; my $dhcp; my $expire; # find the last lease for the interface with its expire date while(){ $lease = 1 if(/lease\s*{/i); $lease = 0 if(/^\s*}\s*$/); if ($lease) { #inside a lease section if(/interface\s+"(.+?)"\s*/){ $dhcp = ($1 =~ /^$if$/); } #Server IP if(/option\s+dhcp-server-identifier\s+(\d{1,3}(?:\.\d{1,3}){3})\s*;/ and $dhcp){ $ipdhcp = $1; } if (/^\s*expire\s*\d\s*(\d*)\/(\d*)\/(\d*)\s*(\d*):(\d*):(\d*)/ and $dhcp) { $expire=sprintf "%04d%02d%02d%02d%02d%02d",$1,$2,$3,$4,$5,$6; } } } close DHCP or warn; chomp (my $currenttime = `date +"%Y%m%d%H%M%S"`); undef $ipdhcp unless $currenttime <= $expire; } else { warn "Can't open $leasepath\n"; } return $ipdhcp; } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $description; my $ipaddress; my $ipgateway; my $ipmask; my $ipsubnet; my $macaddr; my $status; my $type; my $speed; # Looking for the gateway # 'route show' doesn't work on FreeBSD so we use netstat # XXX IPV4 only for(`netstat -nr -f inet`){ $ipgateway=$1 if /^default\s+(\S+)/i; } my @ifconfig = `ifconfig -a`; # -a option required on *BSD # first make the list available interfaces # too bad there's no -l option on OpenBSD my @list; foreach (@ifconfig){ # skip loopback, pseudo-devices and point-to-point interfaces #next if /^(lo|fwe|vmnet|sit|pflog|pfsync|enc|strip|plip|sl|ppp)\d+/; next unless(/^en([0-9])/); # darwin has a lot of interfaces, for this purpose we only want to deal with eth0 and eth1 if (/^(\S+):/) { push @list , $1; } # new interface name } # for each interface get it's parameters foreach $description (@list) { $ipaddress = $ipmask = $macaddr = $status = $type = undef; # search interface infos @ifconfig = `ifconfig $description`; foreach (@ifconfig){ $ipaddress = $1 if /inet (\S+)/i; $ipmask = $1 if /netmask\s+(\S+)/i; $macaddr = $2 if /(address:|ether|lladdr)\s+(\S+)/i; $status = 1 if /status:\s+active/i; $type = $1 if /media:\s+(\S+)/i; $speed = $1 if /media:\s+(\S+)\s+(\S+)/i && ! /supported media:/; if ($speed =~ /autoselect/i) { $speed = $2 if /media:\s+(\S+)\s+(\S+)/i && ! /supported media:/; $speed .= " $3" if /media:\s+(\S+)\s+(\S+)\s+(\S+)/i && ! /supported media:/; } else { $speed .= " $2" if /media:\s+(\S+)\s+(\S+)/i && ! /supported media:/; } } if ($status != 1) { $speed = ""; } else { $speed =~ s/\(|\)|\<|\>|baseTX|baseT|,flow-control//g; $speed =~ s/1000 /1 Gb\/s /g; $speed =~ s/100 /100 Mb\/s /g; $speed =~ s/10 /10 Mb\/s /g; $speed =~ s/full-duplex/FDX/g; $speed =~ s/half-duplex/HDX/g; } my $binip = &ip_iptobin ($ipaddress ,4); # In BSD, netmask is given in hex form my $binmask = sprintf("%b", oct($ipmask)); my $binsubnet = $binip & $binmask; $ipsubnet = ip_bintoip($binsubnet,4); my $mask = ip_bintoip($binmask,4); $common->addNetwork({ DESCRIPTION => $description, IPADDRESS => ($status?$ipaddress:undef), IPDHCP => _ipdhcp($description), IPGATEWAY => ($status?$ipgateway:undef), IPMASK => ($status?$mask:undef), IPSUBNET => ($status?$ipsubnet:undef), MACADDR => $macaddr, STATUS => ($status?"Up":"Down"), TYPE => ($status?$type:undef), SPEED => $speed, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Packages.pm000066400000000000000000000036641432320066700247040ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Packages; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_load("Mac::SysProfile"); # Do not run an package inventory if there is the --nosoftware parameter return if ($params->{config}->{nosoftware}); 1; } sub run { my $params = shift; my $common = $params->{common}; my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPApplicationsDataType'); # might need to check version of darwin return unless($data && ref($data) eq 'ARRAY'); # for each app, normalize the information, then add it to the inventory stack foreach my $app (@$data){ #my $a = $apps->{$app}; my $path = $app->{'path'} ? $app->{'path'} : 'unknown'; #Exlude from /System/Library/xxx : you can save 150 entries if ($path =~ /^\/System\/Library\//) {next;} if ($path =~ /\/System\/Library\// and $path =~ /^\/Volumes\//) {next;} #Exlude from xxx/Library/Printers/xxx : you can save 10 entries because a printer is an app if ($path =~ /\/Library\/Printers\//) {next;} my $kind = $app->{'runtime_environment'} ? $app->{'runtime_environment'} : 'UNKNOWN'; my $store = $app->{'app_store'} ? $app->{'app_store'} : 'no'; my $comments = 'AppStore: '.$store.' - Type: '.$kind.' '; my $bits = $app->{'has64BitIntelCode'} ? $app->{'has64BitIntelCode'} : 'unknown'; if ($bits eq 'yes') {$bits = '64';} else {$bits = '32';} $common->addSoftware({ 'NAME' => $app->{'_name'}, 'VERSION' => $app->{'version'} || 'unknown', 'COMMENTS' => $comments, 'PUBLISHER' => $app->{'info'} || 'unknown', 'INSTALLDATE' => $app->{'lastModified'}, 'FOLDER' => $path, 'BITSWIDTH' => $bits, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Printers.pm000066400000000000000000000034721432320066700247710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Printers; use strict; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; return(undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPPrintersDataType'); return(undef) unless(ref($data) eq 'ARRAY'); my $status = ""; my $description = ""; my $shared = ""; my @shared = ""; my $oslevel = `sw_vers -productVersion`; if ($oslevel =~ /10\.[3-6]\./) { $shared = `awk \'/Info / {gsub("Info ",""); printf \$0">"}; /Shared/ {print \$NF}\' /etc/cups/printers.conf 2>/dev/null | grep -i yes`; @shared = split(/\n/,$shared); } foreach my $printer (@$data){ next if ($printer->{'_name'} =~ /^The\sprinters\slist\sis\sempty\.(.*)$/); $description = "Status: $printer->{'status'}"; next if ($description =~ /^Status:\s$/); next if ($description =~ /^Status:\sno_info_found$/); if ($printer->{'default'} eq "Yes") { $description .= " - Default printer"; } if ($oslevel =~ /10\.[3-6]\./) { foreach my $printShared (@shared) { my ($thisPrinter,$isShared) = split(/>/,$printShared); if ($printer->{'_name'} eq $thisPrinter) { $description .= " - Shared: yes"; } } } else { if ($printer->{'shared'} eq "Yes") { $description .= " - Shared: yes"; } } $common->addPrinter({ NAME => $printer->{'_name'}, DRIVER => $printer->{'ppd'}, PORT => $printer->{'uri'}, DESCRIPTION => $description, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Slots.pm000066400000000000000000000020051432320066700242560ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Slots; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; # check perms return (undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; my ($name, $description, $status); # create the profile object and return undef unless we get something back my $pro = Mac::SysProfile->new(); my $data = $pro->gettype('SPPCIDataType'); return(undef) unless(ref($data) eq 'ARRAY'); foreach my $slot (@$data) { $name = $slot->{'_name'}; $description = $slot->{'sppci_link-width'}." ".$slot->{'sppci_bus'}." ".$slot->{'sppci_slot_name'}; $common->addSlot({ NAME => $name, DESCRIPTION => $description, }); $name = $description = $status = undef; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Sound.pm000066400000000000000000000011751432320066700242510ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Sound; use strict; sub check { return(undef) unless -r '/usr/sbin/system_profiler'; # check perms return 1; } sub run { my $params = shift; my $common = $params->{common}; # create profiler obj, bail if datatype fails my $data = $common->get_sysprofile_devices_names('SPAudioDataType'); return(undef) unless(ref($data) eq 'ARRAY'); # add sound cards foreach my $sound (@$data){ $common->addSound({ 'NAME' => $sound, 'MANUFACTURER' => $sound, 'DESCRIPTION' => $sound, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Storages.pm000066400000000000000000000146511432320066700247530ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Storages; use strict; sub check { my $params = shift; my $common = $params->{common}; return $common->can_load('Mac::SysProfile'); return $common->can_run('system_profiler'); } sub getManufacturer { my $model = shift; $model =~ s/APPLE HDD //; if ($model =~ /(maxtor|western|sony|compaq|hewlett packard|ibm|seagate|toshiba|fujitsu|lg|samsung|nec|transcend|matshita|pioneer|hitachi)/i) { return ucfirst(lc($1)); } elsif ($model =~ /^APPLE SSD/) { return "Apple"; } elsif ($model =~ /^HP/) { return "Hewlett Packard"; } elsif ($model =~ /^WDC/) { return "Western Digital"; } elsif ($model =~ /^ST/) { return "Seagate"; } elsif ($model =~ /^HDi|^HT/ or $model =~ /^IC/ or $model =~ /^HU/) { return "Hitachi"; } } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $devices = {}; my $profile = Mac::SysProfile->new(); # Get SATA Drives my $sata = $profile->gettype('SPSerialATADataType'); if ( ref($sata) eq 'ARRAY') { foreach my $storage ( @$sata ) { next unless ( ref($storage) eq 'HASH' ); my $type; if ( $storage->{'_name'} =~ /DVD/i || $storage->{'_name'} =~ /CD/i ) { $type = 'CD-ROM Drive'; } elsif ($storage->{'_name'} =~ /SSD/i || $storage->{'spsata_medium_type'} =~ /Solid State/i) { $type = 'Disk SSD drive'; }else { $type = 'Disk drive'; } my $size = $storage->{'size'}; if ($size =~ /GB/) { $size =~ s/ GB//; $size *= 1024; } if ($size =~ /TB/) { $size =~ s/ TB//; $size *= 1048576; } my $manufacturer = getManufacturer($storage->{'_name'}); my $model = $storage->{'device_model'}; $model =~ s/\s*$manufacturer\s*//i; my $description = "Status: $storage->{'smart_status'}"; if ($storage->{'spsata_trim_support'} =~ /Yes/ ) { $description .= " - Trim: $storage->{'spsata_trim_support'}";} $devices->{$storage->{'_name'}} = { NAME => $storage->{'bsd_name'}, SERIALNUMBER => $storage->{'device_serial'}, DISKSIZE => $size, FIRMWARE => $storage->{'device_revision'}, MANUFACTURER => $manufacturer, DESCRIPTION => $description, TYPE => $type, MODEL => $model }; } } # Get PATA Drives my $scsi = $profile->gettype('SPParallelSCSIDataType'); if ( ref($scsi) eq 'ARRAY') { foreach my $storage ( @$scsi ) { next unless ( ref($storage) eq 'HASH' ); my $type; if ( $storage->{'_name'} =~ /DVD/i || $storage->{'_name'} =~ /CD/i ) { $type = 'CD-ROM Drive'; } else { $type = 'Disk drive'; } my $size = $storage->{'size'}; if ($size =~ /GB/) { $size =~ s/ GB//; $size *= 1024; } if ($size =~ /TB/) { $size =~ s/ TB//; $size *= 1048576; } my $manufacturer = getManufacturer($storage->{'_name'}); my $model = $storage->{'device_model'}; $model =~ s/\s*$manufacturer\s*//i; my $description = "Status: $storage->{'smart_status'}"; if ($storage->{'spsata_trim_support'} =~ /Yes/ ) { $description .= " - Trim: $storage->{'spsata_trim_support'}";} $devices->{$storage->{'_name'}} = { NAME => $storage->{'_name'}, SERIAL => $storage->{'device_serial'}, DISKSIZE => $size, FIRMWARE => $storage->{'device_revision'}, MANUFACTURER => $manufacturer, DESCRIPTION => $description, MODEL => $model }; } } # Get PATA drives my $pata = $profile->gettype('SPParallelATADataType'); if ( ref($pata) eq 'ARRAY') { foreach my $storage ( @$pata ) { next unless ( ref($storage) eq 'HASH' ); my $type; if ( $storage->{'_name'} =~ /DVD/i || $storage->{'_name'} =~ /CD/i ) { $type = 'CD-ROM Drive'; } else { $type = 'Disk drive'; } my $manufacturer = getManufacturer($storage->{'_name'}); my $model = $storage->{'device_model'}; my $size = $storage->{'size'}; if ($size =~ /GB/) { $size =~ s/ GB//; $size *= 1024; } if ($size =~ /TB/) { $size =~ s/ TB//; $size *= 1048576; } my $description = ""; $devices->{$storage->{'_name'}} = { NAME => $storage->{'bsd_name'}, SERIALNUMBER=> $storage->{'device_serial'}, DISKSIZE => $size, FIRMWARE => $storage->{'device_revision'}, MANUFACTURER => $manufacturer, DESCRIPTION => $description, TYPE => $type, MODEL => $model }; } } # Get NVMe Drives my $nve = $profile->gettype('SPNVMeDataType'); if ( ref($nve) eq 'ARRAY') { foreach my $storage ( @$nve ) { next unless ( ref($storage) eq 'HASH' ); my $type = 'Disk NVMe Drive'; my $size = $storage->{'size'}; if ($size =~ /GB/) { $size =~ s/ GB//; $size *= 1024; } if ($size =~ /TB/) { $size =~ s/ TB//; $size *= 1048576; } my $manufacturer = getManufacturer($storage->{'_name'}); my $model = $storage->{'device_model'}; $model =~ s/\s*$manufacturer\s*//i; my $description = ""; $devices->{$storage->{'_name'}} = { NAME => $storage->{'bsd_name'}, SERIALNUMBER=> $storage->{'device_serial'}, DISKSIZE => $size, FIRMWARE => $storage->{'device_revision'}, MANUFACTURER => $manufacturer, DESCRIPTION => $description, TYPE => $type, MODEL => $model }; } } foreach my $device ( keys %$devices ) { $common->addStorages($devices->{$device}); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/UUID.pm000066400000000000000000000010571432320066700237260ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::UUID; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; return(undef) unless -r '/usr/sbin/system_profiler'; return 1; } sub run { my $params = shift; my $common = $params->{common}; my @sphardware=`system_profiler SPHardwareDataType`; my $uuid; foreach my $line (@sphardware){ chomp $line; $uuid = $1 if ($line =~ /Hardware UUID:\s(.*)/i); } $common->setHardware({ UUID => $uuid, }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Uptime.pm000066400000000000000000000015501432320066700244210ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Uptime; use strict; sub check { my $boottime = `sysctl -n kern.boottime 2>/dev/null`; # straight from the BSD module ;-) return 1 if $boottime; return; } sub run { my $params = shift; my $common = $params->{common}; # stolen code from bsd. chomp (my $boottime = `sysctl -n kern.boottime`); $boottime = $1 if $boottime =~ /sec\s*=\s*(\d+)/; chomp (my $currenttime = `date +%s`); my $uptime = $currenttime - $boottime; # Uptime conversion my ($UYEAR, $UMONTH , $UDAY, $UHOUR, $UMIN, $USEC) = (gmtime ($uptime))[5,4,3,2,1,0]; # Write in ISO format $uptime=sprintf "%02d-%02d-%02d %02d:%02d:%02d", ($UYEAR-70), $UMONTH, ($UDAY-1), $UHOUR, $UMIN, $USEC; chomp(my $DeviceType =`uname -m`); $common->setHardware({ DESCRIPTION => "$DeviceType/$uptime" }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/MacOS/Video.pm000066400000000000000000000050151432320066700242240ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::MacOS::Video; use strict; use Parse::EDID qw(parse_edid); sub check { my $params = shift; my $common = $params->{common}; # make sure the user has access, cause that's the command that's gonna be run return(undef) unless -r '/usr/sbin/ioreg'; return(undef) unless -r '/usr/sbin/system_profiler'; return(undef) unless $common->can_load("Mac::SysProfile"); return 1; } sub run { my $params = shift; my $common = $params->{common}; # run the profiler to get our datatype my $profile = Mac::SysProfile->new(); my $data = $profile->gettype('SPDisplaysDataType'); # unless we get a valid return, bail out return(undef) unless(ref($data) eq 'ARRAY'); # we get video card because system_profiler XML output does not provide a human readable value my $video_names = $common->get_sysprofile_devices_names('SPDisplaysDataType'); return(undef) unless(ref($video_names) eq 'ARRAY'); my $count = 0; #Getting monitor serial number #TODO: get serial for multiples monitors my $ioreg_binary = `ioreg -lw0 | grep "EDID" | sed "/[^<]*{'monitor_name'}; my $ioreg_name = $ioreg->{'serial_number2'}; # add the video information foreach my $video (@$data){ my $memory; # macOS 10.13 doesn't have spdisplays_vram but has _spdisplays_vram if (exists($video->{'spdisplays_vram'})) { $memory = $video->{'spdisplays_vram'}; } elsif (exists($video->{'_spdisplays_vram'})) { $memory = $video->{'_spdisplays_vram'}; } $memory =~ s/ MB$//; $common->addVideo({ 'NAME' => $$video_names[$count], 'CHIPSET' => $video->{'sppci_model'}, 'MEMORY' => $memory, 'RESOLUTION' => $video->{'spdisplays_ndrvs'}[0]->{'spdisplays_resolution'}, }); foreach my $display (@{$video->{'spdisplays_ndrvs'}}){ my $serial; next unless(ref($display) eq 'HASH'); next if($display->{'_name'} eq 'spdisplays_display_connector'); $serial = $ioreg_serial if ($ioreg_name eq $display->{'_name'}); $common->addMonitor({ 'CAPTION' => $display->{'_name'}, 'SERIAL' => $serial, }) } $count++; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris.pm000066400000000000000000000021641432320066700236320ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris; use strict; use vars qw($runAfter); $runAfter = ["Ocsinventory::Agent::Backend::OS::Generic"]; sub check {$^O =~ /^solaris$/} sub run { my $params = shift; my $common = $params->{common}; my $OSName; my $OSComment; my $OSVersion; my $OSLevel; my $HWDescription; my ( $karch, $hostid, $proct, $platform); #Operating system informations chomp($OSName=`uname -s`); chomp($OSLevel=`uname -r`); chomp($OSComment=`uname -v`); open(FH, "< /etc/release") and do { chomp($OSVersion = readline (FH)); $OSVersion =~ s/^\s+//; close FH; }; chomp($OSVersion=`uname -v`) unless $OSVersion; chomp($OSVersion); $OSVersion=~s/^\s*//; $OSVersion=~s/\s*$//; # Hardware informations chomp($karch=`arch -k`); chomp($hostid=`hostid`); chomp($proct=`uname -p`); chomp($platform=`uname -i`); $HWDescription = "$platform($karch)/$proct HostID=$hostid"; $common->setHardware({ OSNAME => "$OSName $OSLevel", OSCOMMENTS => $OSComment, OSVERSION => $OSVersion, DESCRIPTION => $HWDescription }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/000077500000000000000000000000001432320066700232715ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Bios.pm000066400000000000000000000141351432320066700245270ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Bios; # SPARC # $ showrev #Hostname: 157501s021plc #Hostid: 83249bbf #Release: 5.10 #Kernel architecture: sun4u #Application architecture: sparc #Hardware provider: Sun_Microsystems #Domain: be.cnamts.fr #Kernel version: SunOS 5.10 Generic_118833-17 # # $ prtconf -pv (-b would be great...but doesn't work before S10) #System Configuration: Sun Microsystems sun4u #Memory size: 16384 Megabytes #System Peripherals (PROM Nodes): # #Node 0xf0819f00 # scsi-initiator-id: 00000007 # node#: 00000000 # #size-cells: 00000002 # stick-frequency: 00bebc20 # clock-frequency: 08f0d180 # idprom: 01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555 # breakpoint-trap: 0000007f # device_type: 'gptwo' # banner-name: 'Sun Fire E6900' # compatible: 'SUNW,Serengeti' # newio-addr: 00000001 # name: 'SUNW,Sun-Fire' # X64 # $ showrev #Hostname: stlaurent #Hostid: 403100b #Release: 5.10 #Kernel architecture: i86pc #Application architecture: i386 #Hardware provider: #Domain: #Kernel version: SunOS 5.10 Generic_127112-07 # # $ smbios -t SMB_TYPE_SYSTEM #ID SIZE TYPE #1 76 SMB_TYPE_SYSTEM (system information) # # Manufacturer: Sun Microsystems, Inc. # Product: Sun Fire V40z # Version: 00 # Serial Number: R00T34E0009 # # UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac # Wake-Up Event: 0x6 (power switch) # SKU Number: # Family: use strict; sub run { my $params = shift; my $common = $params->{common}; my $zone; my( $SystemSerial , $SystemModel, $SystemManufacturer, $ChassisType, $MotherBoardSerial, $MotherBoardModel, $MotherBoardManufacturer, $BiosManufacturer, $BiosVersion, $BiosDate, $aarch); if ( !$common->can_run("zonename") || `zonename` =~ /global/ ) { # Ether pre Sol10 or in Sol10/Sol11 global zone $zone = "global"; } else { $zone = ""; } if ($zone){ chomp($SystemModel = `uname -m`); chomp($aarch = `uname -p`); if( $aarch eq "i386" ){ # # For a Intel/AMD arch, we're using smbios # foreach(`/usr/sbin/smbios -t SMB_TYPE_SYSTEM`) { if(/^\s*Manufacturer:\s*(.+)$/){$SystemManufacturer = $1}; if(/^\s*Serial Number:\s*(.+)$/){$SystemSerial = $1;} if(/^\s*Product:\s*(.+)$/){$SystemModel = $1;} } foreach(`/usr/sbin/smbios -t SMB_TYPE_BIOS`) { if(/^\s*Vendor:\s*(.+)$/){$BiosManufacturer = $1}; if(/^\s*Version String:\s*(.+)$/){$BiosVersion = $1}; if(/^\s*Release Date:\s*(.+)$/){$BiosDate = $1}; } foreach(`/usr/sbin/smbios -t SMB_TYPE_BASEBOARD`) { if(/^\s*Product\s*(.+)$/){$MotherBoardModel = $1}; if(/^\s*Serial Number:\s*(.+)$/){$MotherBoardSerial = $1}; if(/^\s*Manufacturer:\s*(.+)$/){$MotherBoardManufacturer = $1}; } foreach(`/usr/sbin/smbios -t SMB_TYPE_CHASSIS`) { if(/^\s*Chassis Type:.*\((.+)\)$/) {$ChassisType = $1}; } } elsif( $aarch eq "sparc" ) { # # For a Sparc arch, we're using prtconf # my $name; my $OBPstring; my $found=0; if ( $common->can_run("virtinfo") && `virtinfo -t` =~ /.*LDoms guest.*/ ) { foreach(`virtinfo -a`) { if(/^Domain role:\s*(.+)$/) {$ChassisType = $1}; if(/^Chassis serial.:\s*(.+)$/) {$SystemSerial = $1}; } } foreach(`/usr/sbin/prtconf -pv`) { # prtconf is an awful thing to parse if(/^System Configuration:\s*(.+)\s+\S+$/) {$SystemManufacturer = $1; $BiosManufacturer = $1; } if(/^\s*banner-name:\s*'(.+)'$/){$SystemModel = $1;} unless ($name) { if(/^\s*name:\s*'(.+)'$/){$name = $1;} } unless ($OBPstring) { if(/^\s*version:\s*'(.+)'$/){ $OBPstring = $1; # looks like : "OBP 4.33.6.f 2014/07/10 10:24" # with further informations sometimes if( $OBPstring =~ m@OBP\s+(\S+)\s+(\d+)/(\d+)/(\d+)@ ){ $BiosVersion = "OBP $1"; $BiosDate = "$2/$3/$4"; } else { $BiosVersion = $OBPstring } } } } $SystemModel .= " ($name)" if( $name ); if ( $common->can_run("ipmitool") ) { foreach(`/usr/sbin/ipmitool fru print`) { if (/^\s*Chassis Type\s+:\s+(.+)/) { $ChassisType = $1; $found = 1; } elsif ( $found && /^\s*Product Serial\s+:\s+(.+)/) { $SystemSerial = $1; last; } } } if ( !$SystemSerial ) { # No serial found via ipmitool, so use sneep if( -x "/opt/SUNWsneep/bin/sneep" ) { chomp($SystemSerial = `/opt/SUNWsneep/bin/sneep`); }else { foreach(`/bin/find /opt -name sneep`) { chomp($SystemSerial = `$1`) if /^(\S+)/; } if (!$SystemSerial){ $SystemSerial = "Please install package SUNWsneep"; } } } } }else{ foreach(`showrev`){ if(/^Hardware provider:\s+(\S+)/){$SystemManufacturer = $1}; } $SystemModel = "Solaris Containers"; $SystemSerial = "Solaris Containers"; } # Writing data $common->setBios ({ BVERSION => $BiosVersion, BDATE => $BiosDate, BMANUFACTURER => $BiosManufacturer, SMANUFACTURER => $SystemManufacturer, SMODEL => $SystemModel, SSN => $SystemSerial, MMANUFACTURER => $MotherBoardManufacturer, MSN => $MotherBoardSerial, TYPE => $ChassisType, MMODEL => $MotherBoardModel }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/CPU.pm000066400000000000000000000035331432320066700242620ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::CPU; use strict; use warnings; use English qw(-no_match_vars); sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my (%params) = @_; my $current; my $cpus=`/usr/bin/kstat -m cpu_info | egrep "chip_id|core_id|module: cpu_info" | grep chip_id | awk '{ print \$2 }' | sort -u | wc -l | tr -d ' '`; my $ncores=`/usr/bin/kstat -m cpu_info | egrep "chip_id|core_id|module: cpu_info" | grep core_id | awk '{ print \$2 }' | sort -u | wc -l | tr -d ' '`; my $vproc=`/usr/bin/kstat -m cpu_info | egrep "chip_id|core_id|module: cpu_info" | grep 'module: cpu_info' | awk '{ print \$4 }' | sort -u | wc -l | tr -d ' '`; my $cores=$ncores / $cpus; my $threads=$vproc / $cpus; my $speed=`/usr/bin/kstat -m cpu_info | grep clock_MHz | awk '{ print \$2 }' | sort -u`; my $type=`/usr/bin/kstat -m cpu_info | grep brand | awk '{\$1=""}; { print \$0 }' | sort -u`; my $manufacturer = $type =~ /SPARC/ ? 'SPARC' : $type =~ /Xeon/ ? 'Intel' : undef ; my $cpuarch=`isainfo | tr ' ' '_'`; $logger->debug("NB CPUs: $cpus"); $logger->debug("CORES: $cores"); $logger->debug("LOGICAL_CPUS: $threads"); $logger->debug("SPEED: $speed"); $logger->debug("TYPE: $type"); $logger->debug("MANUFACTURER: $manufacturer"); $logger->debug("CPUARCH: $cpuarch"); for my $i (1 .. $cpus) { $current->{MANUFACTURER} = $manufacturer if chomp($manufacturer); $current->{SPEED} = $speed if chomp($speed); $current->{TYPE} = $type if chomp($type); $current->{CORES} = $cores if $cores; $current->{LOGICAL_CPUS} = $threads if $threads; $current->{CPUARCH} = $cpuarch if chomp($cpuarch); $common->addCPU($current); } } #run(); 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Controllers.pm000066400000000000000000000015301432320066700261340ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Controllers; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("cfgadm") } sub run { my $params = shift; my $common = $params->{common}; my $name; my $type; my $description; foreach(`cfgadm -s cols=ap_id:type:info`){ $name = $type = $description = ""; next if (/^Ap_Id/); if (/^(\S+)\s+/){ $name = $1; } if(/^\S+\s+(\S+)/){ $type = $1; } #No manufacturer, but informations about controller if(/^\S+\s+\S+\s+(.*)/){ $description = $1; } $common->addController({ 'NAME' => $name, 'TYPE' => $type, 'DESCRIPTION' => $description, }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Domains.pm000066400000000000000000000013451432320066700252240ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Domains; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("domainname") } sub run { my $params = shift; my $common = $params->{common}; my $domain; chomp($domain = `domainname`); if (!$domain) { my %domain; if (open RESOLV, "/etc/resolv.conf") { while() { $domain{$2} = 1 if (/^(domain|search)\s+(.+)/); } close RESOLV; } $domain = join "/", keys %domain; } # If no domain name, we send "WORKGROUP" $domain = 'WORKGROUP' unless $domain; $common->setHardware({ WORKGROUP => $domain }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Drives.pm000066400000000000000000000037021432320066700250650ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Drives; #Filesystem kbytes used avail capacity Mounted on #/dev/vx/dsk/bootdg/rootvol 16525754 5423501 10936996 34% / #/devices 0 0 0 0% /devices #ctfs 0 0 0 0% /system/contract #proc 0 0 0 0% /proc #mnttab 0 0 0 0% /etc/mnttab use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("df") } sub run { my $params = shift; my $common = $params->{common}; my $free; my $filesystem; my $total; my $type; my $volumn; #Looking for mount points and disk space for (`df -k`){ if (/^Filesystem\s*/){next}; # on Solaris 10 and up, /devices is an extra mount which we like to exclude if (/^\/devices/){next}; # on Solaris 10 and up, /platform/.../libc_psr_hwcap1.so.1 is an extra mount which we like to exclude if (/^\/platform/){next}; # exclude cdrom mount point if (/^\/.*\/cdrom/){next}; if (/^swap.*/){next}; # exclude special entries such as ctfs, proc, mnttab, etc... if (/^.*\s+0\s+0\s+0.*/){next}; # skip nfs (dirty hack) if (/^\S+:\/.*/){next}; # everything else is a local filesystem if (/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\n/){ $filesystem = $6; $total = sprintf("%i",($2/1024)); $free = sprintf("%i",($4/1024)); $volumn = $1; chomp($type = `mount -v | grep " $filesystem "`); $type =~ s/\S+\s+on\s+\S+\s+type\s+(\S+)\s+.*/$1/; $common->addDrive({ FREE => $free, FILESYSTEM => $filesystem, TOTAL => $total, TYPE => $type, VOLUMN => $volumn }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/IPv4.pm000066400000000000000000000022021432320066700244050ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::IPv4; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("ifconfig") } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my %ip; my $ip; my $hostn; #Looking for ip addresses with ifconfig, except loopback # Solaris need -a option for (`ifconfig -a`){#ifconfig in the path #Solarisligne inet if (/^\s*inet\s+(\S+).*/){($1=~/^127.+/)?next:($ip{$1}=1)}; } # Ok. Now, we have the list of IP addresses configured # We could have too many addresses to list them in HW # (details will be sent in Networks instead) # # How could we choose ? # # Let's try to resolve the name of our server # chomp( $hostn = `uname -n` ); if ($hostn) { my $aip; foreach (`ping -s $hostn 10 1`) { unless ( $ip ) { if( /^.*\((\d+\.\d+\.\d+\.\d+)\):.*/ ) { $aip = $1; $ip = $aip if( exists($ip{$aip}) ); } } } } $common->setHardware({IPADDR => $ip}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Mem.pm000066400000000000000000000013241432320066700243450ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Mem; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("swap") && $common->can_run ("prtconf") } sub run { my $params = shift; my $common = $params->{common}; #my $unit = 1024; my $PhysicalMemory; my $SwapFileSize; # Memory informations foreach(`prtconf`){ if(/^Memory\ssize:\s+(\S+)/){ #print "total memoire: $1"; $PhysicalMemory = $1}; } #Swap Informations foreach(`swap -l`){ if(/\s+(\S+)$/){$SwapFileSize = $1}; } $common->setHardware({ MEMORY => $PhysicalMemory, SWAP => $SwapFileSize }); } 1 UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Memory.pm000066400000000000000000000545031432320066700251060ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Memory; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("memconf") } sub run { my $model; my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $capacity; my $description; my $numslots; my $speed = undef; my $type = undef; my $banksize; my $module_count=0; my $empty_slots; my $flag=0; my $flag_mt=0; my $caption; my $sun_class=0; my $OSLevel; my $zone; my $aarch; # for debug only my $j=0; # first, we need determinate on which model of sun server we run, # because prtdiags output (and with that memconfs output) is differend # from server model to server model # we try to classified our box in one of the known classes chomp($OSLevel = `uname -r`); chomp($aarch = `uname -p`); if ( !$common->can_run("zonename") || `zonename` =~ /global/ ) { # Either pre Sol10 or in Sol10/Sol11 global zone $zone = "global"; }else{ # Sol10/Sol11 local zone $zone = ""; } #print "Nom :".$zone."*************************\n"; if ($zone) { if ( $aarch =~ /sparc/ && $common->can_run("virtinfo") && `virtinfo -t` =~ /.*LDoms guest.*/ ) { $model = "Solaris Ldom"; }else{ chomp($model = `uname -i`); } }else{ $model="Solaris Containers"; } #print "Memory Model: $model\n"; #$model=`uname -i`; # debug print model #print "Model: '$model'"; # cut the CR from string model #$model = substr($model, 0, length($model)-1); # we map (hopfully) our server model to a known class #if ($model eq "SUNW,Sun-Fire-280R") { $sun_class = 1; } #if ($model eq "SUNW,Sun-Fire-480R") { $sun_class = 1; } #if ($model eq "SUNW,Sun-Fire-V490") { $sun_class = 1; } #if ($model eq "SUNW,Sun-Fire-880") { $sun_class = 1; } #if ($model eq "SUNW,Sun-Fire-V240") { $sun_class = 2; } #if ($model eq "SUNW,Sun-Fire-V440") { $sun_class = 2; } #if ($model eq "SUNW,Sun-Fire-V250") { $sun_class = 2; } #if ($model eq "SUNW,Sun-Fire-T200") { $sun_class = 3; } #if ($model eq "SUNW,Sun-Fire-T1000") { $sun_class = 3; } #if ($model eq "SUNW,SPARC-Enterprise-T5220") { $sun_class = 4; } #if ($model eq "SUNW,SPARC-Enterprise") { $sun_class = 5; } # for M5000 && M4000 if ($model =~ /SUNW,SPARC-Enterprise/) { $sun_class = 5; } # for M5000 && M4000 if ($model =~ /SUNW,SPARC-Enterprise-T\d/){ $sun_class = 4; } if ($model =~ /SUNW,Netra-T/){ $sun_class = 2; } if ($model =~ /SUNW,Sun-Fire-\d/){ $sun_class = 1; } if ($model =~ /SUNW,Sun-Fire-V/){ $sun_class = 2; } if ($model =~ /SUNW,Sun-Fire-V490/) { $sun_class = 1; } if ($model =~ /SUNW,Sun-Fire-T\d/) { $sun_class = 3; } if ($model =~ /SUNW,SPARCstation/) { $sun_class = 3; } if ($model =~ /SUNW,Ultra-/) { $sun_class = 3; } if ($model =~ /SUNW,Sun-Blade-100/) { $sun_class = 8; } if ($model =~ /SUNW,Sun-Blade-1500/) { $sun_class = 8; } if ($model =~ /SUNW,T\d/) { $sun_class = 3; } if ($model =~ /Solaris Containers/){ $sun_class = 7; } if ($model =~ /Solaris Ldom/) { $sun_class = 7; } if ($model =~ /i86pc/) { $sun_class = 6; } if ($model =~ /sun4v/) { $sun_class = 3; } # debug print model #print "Sunclass: $sun_class\n"; # now we can look at memory information, depending from our class if($sun_class == 0) { $logger->debug("sorry, unknown model, could not detect memory configuration"); } if($sun_class == 1) { foreach(`memconf 2>&1`) { # debug #print "count: " .$j++ . " " . $flag_mt . " : " . "$_"; # if we find "empty groups:", we have reached the end and indicate that by setting flag = 0 if(/^empty \w+:\s(\S+)/) { $flag = 0; if($1 eq "None"){$empty_slots = 0;} } # grep the type of memory modules from heading if($flag_mt && /^\s*\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) {$flag_mt=0; $description = $1;} # only grap for information if flag = 1 if ($flag && /^\s*(\S+)\s+(\S+)/) { $caption = "Board " . $1 . " MemCtl " . $2; } if ($flag && /^\s*\S+\s+\S+\s+(\S+)/) { $numslots = $1; } if ($flag && /^\s*\S+\s+\S+\s+\S+\s+(\d+)/) { $banksize = $1; } if ($flag && /^\s*\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\d+)/) { $capacity = $1; } if ($flag) { for (my $i = 1; $i <= ($banksize / $capacity); $i++) { #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # this is the caption line if(/^\s+Logical Logical Logical/) { $flag_mt = 1; } # if we find "---", we set flag = 1, and in next line, we start to look for information if(/^-+/){ $flag = 1; } } #print "# of RAM Modules: " . $module_count . "\n"; #print "# of empty slots: " . $empty_slots . "\n"; } if($sun_class == 2) { foreach(`memconf 2>&1`) { # debug #print "line: " .$j++ . " " . $flag_mt . "/" . $flag ." : " . "$_"; # if we find "empty sockets:", we have reached the end and indicate that by resetting flag = 0 # emtpy sockets is follow by a list of emtpy slots, where we extract the slot names if(/^empty sockets:\s*(\S+)/) { $flag = 0; # cut of first 15 char containing the string empty sockets: substr ($_,0,15) = ""; $capacity = "empty"; $numslots = 0; foreach $caption (split) { if ($caption eq "None") { $empty_slots = 0; # no empty slots -> exit loop last; } # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $empty_slots++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } if(/.*Memory Module Groups.*/) { $flag = 0; $flag_mt = 0; } # we only grap for information if flag = 1 if($flag && /^\s*\S+\s+\S+\s+(\S+)/){ $caption = $1; } if($flag && /^\s*(\S+)/){ $numslots = $1; } if($flag && /^\s*\S+\s+\S+\s+\S+\s+(\d+)/){ $capacity = $1; } if($flag) { # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => "DIMM", CAPTION => "Ram slot ".$numslots, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } # this is the caption line if(/^ID ControllerID/) { $flag_mt = 1; $description = $1;} # if we find "---", we set flag = 1, and in next line, we start to look for information if($flag_mt && /^-+/){ $flag = 1;} } # debug: show number of modules found and number of empty slots } if($sun_class == 3) { # socket MB/MEM3/CMP3/BR1/CH1/D2 has a Micron Technology 36HTF51272F80EE1D4 4GB FB-DIMM foreach(`memconf 2>&1`) { # debug if(/^empty sockets:\s*(\S+)/) { # cut of first 15 char containing the string empty sockets: substr ($_,0,15) = ""; $description = ""; $type = ""; $capacity = "empty"; $numslots = 0; foreach $caption (split) { if ($caption eq "None") { $empty_slots = 0; # no empty slots -> exit loop last; } # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $empty_slots++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # socket MB/MEM3/CMP3/BR1/CH1/D2 has a Micron Technology 36HTF51272F80EE1D4 4GB FB-DIMM if(/^socket\s+(\S+) has a (.+) (\d+)GB (\S+)/) { $caption = $1; $description = $2; $type = $4; $numslots = 0; $capacity = $3 * 1024; # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } # socket P1C1/B31/C1/D0 (LUN 0 ID 124): Samsung 32768MB DDR4 SDRAM DIMM, M393A4K40BB1-CRC if(/^socket\s+(\S+) \(LUN \d+ ID \d+\): (.+) (\d+)MB (\S+) (\S+) DIMM, (\S+)/) { $caption = $1; $description = "$2 $6"; $type = "$4 $5"; $numslots = 0; $capacity = $3; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # debug: show number of modules found and number of empty slots #print "# of RAM Modules: " . $module_count . "\n"; #print "# of empty slots: " . $empty_slots . "\n"; } if($sun_class == 4) { foreach(`memconf 2>&1`) { # debug #print "line: " .$j++ . " " . $flag_mt . "/" . $flag ." : " . "$_"; # if we find "empty sockets:", we have reached the end and indicate that by resetting flag = 0 # emtpy sockets is follow by a list of emtpy slots, where we extract the slot names if(/^empty sockets:\s*(\S+)/) { $flag = 0; # cut of first 15 char containing the string empty sockets: substr ($_,0,15) = ""; $capacity = "empty"; $numslots = 0; foreach $caption (split) { if ($caption eq "None") { $empty_slots = 0; # no empty slots -> exit loop last; } # debug print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $empty_slots++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # we only grap for information if flag = 1 # socket MB/CMP0/BR0/CH0/D0 has a Samsung 501-7953-01 Rev 05 2GB FB-DIMM if(/^socket\s+(\S+) has a (.+)\s+(\S+)GB\s+(\S+)$/i) { $caption = $1; $description = $2; $type = $4; $numslots = 0; $capacity = $3 * 1024; # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # debug: show number of modules found and number of empty slots #print "# of RAM Modules: " . $module_count . "\n"; #print "# of empty slots: " . $empty_slots . "\n"; } if ($sun_class == 5 ) { foreach(`memconf 2>&1`) { # debug #print "line: " .$j++ . " " . $flag_mt . "/" . $flag ." : " . "$_"; # if we find "empty sockets:", we have reached the end and indicate that by resetting flag = 0 # emtpy sockets is follow by a list of emtpy slots, where we extract the slot names if(/^total memory.*(\S+)/) { $flag = 0;} #print "flag : $flag\n"; if($flag_mt && /^\s+\S+\s+\S+\s+\S+\s+(\S+)/) {$flag_mt=0; $type = $1;} #print "description : $description\n"; if ($flag && /^\s(\S+)\s+(\S+)/) { $numslots = "LSB " . $1 . " Group " . $2; } if ($flag && /^\s(\S+)\s+(\S+)/) { $caption = "LSB " . $1 . " Group " . $2; } if ($flag && /^\s+\S+\s+\S\s+\S+\s+\S+\s+(\d+)/) { $capacity = $1; } if ($flag && /^\s+\S+\s+\S\s+(\d+)/) { $banksize = $1; } #print "Num slot ". $numslots . " Bank Number: " . $numslots . " Bank size " . $banksize . " DIMM Capacity: " . $capacity . "MB\n"; if ($flag && $capacity > 1 ) { for (my $i = 1; $i <= ($banksize / $capacity); $i++) { #print "caption ". $caption . " Bank Number: " . $numslots . " Bank size " . $banksize . " DIMM Capacity: " . $capacity . "MB\n"; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $module_count }) } $module_count++; } #Caption Line if (/^Sun Microsystems/) { $flag_mt=1; $flag=1; } } } if($sun_class == 6) { #CPU1_D2 BANK2: 4096MB DDR3 DIMM, Samsung M393B5170EH1-CH9 (SUN FIRE X4270) #DIMM 1A: 4096MB Synchronous DDR2 FBDIMM (ProLiant DL380 G5) #Board 1, DIMM 1A: 8192MB Synchronous DDR3 (ProLiant DL580 G7) #PROC 1 DIMM 12: 16384MB Synchronous DDR3 DIMM, HP (ProLiant DL380p Gen8) #PROC 1 DIMM 12: 32768MB Synchronous DIMM, HP 752372-081 (ProLiant DL380 Gen9) #XMM1: 2048MB Synchronous DDR2 DIMM, Elpida EBE21UE8AEFA-8G-E (HP Desktop PC) #DIMM_1: 1024MB Synchronous DDR2 DIMM, Kingston KCM633-ELC (Dell Desktop PC) foreach(`memconf 2>&1`) { # debug #print "line: " .$j++ . " " . $flag_mt . "/" . $flag ." : " . "$_"; if(/^empty memory sockets:\s*(\S+)/) { # cut of first 22 char containing the string empty sockets: substr ($_,0,22) = ""; chomp(); $capacity = "0"; $numslots = 0; foreach $caption (split(/, /,$_)) { if ($caption eq "None") { $empty_slots = 0; # no empty slots -> exit loop last; } # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $empty_slots++; if ($caption =~ /.* (\d+)$/) { $numslots = $1; } $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => "empty", CAPTION => $caption, SPEED => 'n/a', TYPE => 'n/a', NUMSLOTS => $numslots }) } } # These are the non-emtpy sockets in various formats #DIMM 1A: 4096MB Synchronous DDR2 FBDIMM (ProLiant DL380 G5) #Board 1, DIMM 1A: 8192MB Synchronous DDR3 (ProLiant DL580 G7) #PROC 1 DIMM 12: 16384MB Synchronous DDR3 DIMM, HP (ProLiant DL380p Gen8) if(/^(.*DIMM) (\S+):\s+(\d+)MB\s(\S+ DDR\d+)\s*(\w*)?(,?.*)/) { $caption = "$1 $2"; $description = "$4 $5$6"; $numslots = $2; $capacity = $3; $type = $5; unless ($type) { $type = "DIMM" }; # Default if nothing else found # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } #CPU1_D2 BANK2: 4096MB DDR3 DIMM, Samsung M393B5170EH1-CH9 (SUN FIRE X4270) if(/^(.*BANK)(\S+):\s+(\d+)MB\s(\S*DDR\d+)\s*(\w+)?(,?.*)/) { $caption = "$1 $2"; $description = "$4 $5$6"; $numslots = $2; $capacity = $3; $type = $5; # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } #PROC 1 DIMM 12: 32768MB Synchronous DIMM, HP 752372-081 (ProLiant DL380 Gen9) if(/^(.*DIMM) (\S+):\s+(\d+)MB\s(\S+)\s+(DIMM\w*)(,?.*)/) { $caption = "$1 $2"; $description = "$4 $5$6"; $numslots = $2; $capacity = $3; $type = $5; # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } #XMM1: 2048MB Synchronous DDR2 DIMM, Elpida EBE21UE8AEFA-8G-E (HP Desktop PC) #DIMM_1: 1024MB Synchronous DDR2 DIMM, Kingston KCM633-ELC (Dell Desktop PC) if(/^(\S+):\s+(\d+)MB\s(.+)\s+(DIMM\w*)(,?.*)/) { $caption = "$1"; $description = "$3 $4$5"; $numslots = $1; $capacity = $2; $type = $4; # debug #print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } # debug: show number of modules found and number of empty slots #print "# of RAM Modules: " . $module_count . "\n"; #print "# of empty slots: " . $empty_slots . "\n"; } if ($sun_class == 7) { foreach (`prctl -n project.max-shm-memory $$ 2>&1`) { $description = $1 if /^project.(\S+)$/; $capacity = $1 if /^\s*system+\s*(\d+).*$/; if(($description && $capacity)){ $capacity = $capacity * 1024; $numslots = 1 ; $description = "Memory Allocated"; $caption = "Memory Share"; #print $description."_".$capacity."***\n"; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } } if($sun_class == 8) { # example output of a Sun Blade 100 Workstation #Sun Microsystems, Inc. Sun Blade 100 (UltraSPARC-IIe 502MHz) #Memory Segment Table: #----------------------------------------------------------------------- #Base Address Size Interleave Factor Contains #----------------------------------------------------------------------- #0x0 256MB 1 chassis/system-board/DIMM0 #empty sockets: DIMM1 DIMM2 DIMM3 #total memory = 256MB #Sun Microsystems, Inc. Sun Blade 100 (UltraSPARC-IIe 502MHz) #Memory Segment Table: #----------------------------------------------------------------------- #Base Address Size Interleave Factor Contains #----------------------------------------------------------------------- #0x0 256MB 1 Label DIMM0 #0x20000000 256MB 1 Label DIMM1 #empty sockets: DIMM2 DIMM3 #total memory = 512MB foreach(`memconf 2>&1`) { if (/^empty sockets:\s*(.+)/) { foreach $caption (split(/ /, $1)) { if ($caption eq "None") { $empty_slots = 0; last; } $empty_slots++; # print "empty slot\n"; $common->addMemory({ CAPACITY => "empty", DESCRIPTION => '', CAPTION => $caption, SPEED => '', TYPE => '', NUMSLOTS => $numslots }) } } if (/^0x(\d+)\s+(\d+)(\S)B\s+(\S+)\s+(.+)/) { $caption = "$5"; $description = ""; $numslots = 0; $capacity = $2 if ( $3 eq "M" ); $capacity = $2 * 1024 if ( $3 eq "G" ); $type = ""; # debug # print "Caption: " . $caption . " Description: " . $description . " Bank Number: " . $numslots . " DIMM Capacity: " . $capacity . "MB\n"; $module_count++; $common->addMemory({ CAPACITY => $capacity, DESCRIPTION => $description, CAPTION => $caption, SPEED => $speed, TYPE => $type, NUMSLOTS => $numslots }) } } } } #run(); 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Networks.pm000066400000000000000000000113141432320066700254430ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Networks; #ce5: flags=1000843 mtu 1500 index 3 # inet 55.37.101.171 netmask fffffc00 broadcast 55.37.103.255 # ether 0:3:ba:24:9b:bf #aggr40001:2: flags=201000843 mtu 1500 index 3 # inet 55.37.101.172 netmask ffffff00 broadcast 223.0.146.255 use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run("ifconfig") && $common->can_run("netstat") && $common->can_load ("Net::IP qw(:PROC)") } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my $description; my $ipaddress; my $ipgateway; my $ipmask; my $ipsubnet; my $macaddr; my $status; my $type; my $zone; my @zoneadmcmd; my @zacsplitted; # get the first field of the first line of "zoneadm list -p" @zoneadmcmd = `zoneadm list -p`; @zacsplitted = split(/:/, $zoneadmcmd[0]); $zone = $zacsplitted[0]; foreach (`netstat -rn`){ $ipgateway=$1 if /^default\s+(\S+)/i; } #print "Nom :".$zone."*************************\n"; ### STEP 1: get aliases and zones' interfaces foreach (`ifconfig -a`){ # resets if new interface $ipaddress = $description = $macaddr = $status = $type = undef if /^(\S+):/; # interface name and other data $description = $1.":".$2 if /^(\S+):(\S+):/; $ipaddress = $1 if /inet\s+(\S+)/i; $ipmask = $1 if /\S*netmask\s+(\S+)/i; if (/ether\s+(\S+)/i) { # See # https://sourceforge.net/tracker/?func=detail&atid=487492&aid=1819948&group_id=58373 $macaddr = sprintf "%02x:%02x:%02x:%02x:%02x:%02x" , map hex, split /\:/, $1; } $status = 1 if /addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, STATUS => $status?"Up":"Down", TYPE => $type, }); } } ### STEP 2: get physical interfaces when not a zone if (!$zone){ foreach (`ifconfig -a`){ # resets if new interface $ipaddress = $description = $macaddr = $status = $type = undef if /^(\S+):/; # interface name and other data $description = $1 if /^(\S+): /; $ipaddress = $1 if /inet\s+(\S+)/i; $ipmask = $1 if /\S*netmask\s+(\S+)/i; if (/ether\s+(\S+)/i) { # See # https://sourceforge.net/tracker/?func=detail&atid=487492&aid=1819948&group_id=58373 $macaddr = sprintf "%02x:%02x:%02x:%02x:%02x:%02x" , map hex, split /\:/, $1; } $status = 1 if /addNetwork({ DESCRIPTION => $description, IPADDRESS => $ipaddress, IPGATEWAY => $ipgateway, IPMASK => $ipmask, IPSUBNET => $ipsubnet, MACADDR => $macaddr, STATUS => $status?"Up":"Down", TYPE => $type, }); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Packages.pm000066400000000000000000000051201432320066700253430ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Packages; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; # Do not run an package inventory if there is the --nosoftware parameter return if ($params->{config}->{nosoftware}); $common->can_run("pkginfo") || $common->can_run("pkg"); } sub run { my $params = shift; my $common = $params->{common}; my $chaine ; my @tab; my $name; my $version; my $comments; my $publisher; if ( `uname -r` =~ /5.11/ ) { # Solaris 11 foreach (`pkg info`) { if (/^\s*$/) { $common->addSoftware({ 'NAME' => $name, 'VERSION' => $version, 'COMMENTS' => $comments, 'PUBLISHER' => $publisher, }); $name = ''; $version = ''; $comments = ''; $publisher = ''; } elsif (/Name:\s+(.+)/) { $name = $1; } elsif (/Version:\s+(.+)/) { $version = $1; } elsif (/Publisher:\s+(.+)/) { $publisher = $1; } elsif (/Summary:\s+(.+)/) { $comments = $1; } } } else { # Solaris 10 and lower foreach (`pkginfo -l`) { if (/^\s*$/) { $common->addSoftware({ 'NAME' => $name, 'VERSION' => $version, 'COMMENTS' => $comments, 'PUBLISHER' => $publisher, }); $name = ''; $version = ''; $comments = ''; $publisher = ''; } elsif (/PKGINST:\s+(.+)/) { $name = $1; } elsif (/VERSION:\s+(.+)/) { $version = $1; } elsif (/VENDOR:\s+(.+)/) { $publisher = $1; } elsif (/DESC:\s+(.+)/) { $comments = $1; } } my $testrep; $testrep=0; #opendir(DIR,'/var/sis/') || exit ; opendir(DIR,'/var/sis/') || ($testrep=1) ; if ($testrep==0) { foreach (`ls /var/sis/*.SIS`) { $chaine= `cat $_` ; @tab = split(/;/, $chaine); if (/^\/var\/sis\/(\S+).SIS/){ $common->addSoftware({ 'VERSION' => $tab[2], 'NAME' => $tab[0]." ($1)", 'PUBLISHER' => $tab[1], 'COMMENTS' => $1, }); } } } closedir(DIR); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Ports.pm000066400000000000000000000026321432320066700247410ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Ports; use strict; sub run { my $params = shift; my $common = $params->{common}; my $zone; my $SystemModel; my $aarch; my $flag; my $caption; my $description; my $name; my $type; if ( !$common->can_run("zonename") || `zonename` =~ /global/ ) { # Ether pre Sol10 or in Sol10/Sol11 global zone $zone = "global"; } else { $zone = ""; } if ($zone) { chomp($SystemModel = `uname -m`); chomp($aarch = `uname -p`); if( $aarch eq "i386" ){ # # For a Intel/AMD arch, we're using smbios # foreach(`/usr/sbin/smbios -t SMB_TYPE_PORT`) { if(/\s+Internal Reference Designator:\s*(.+)/i ) { $flag = 1; $name = $1; } elsif ($flag && /^$/) { # end of section $flag = 0; $common->addPorts({ CAPTION => $caption, DESCRIPTION => $description, NAME => $name, TYPE => $type, }); $caption = $description = $name = $type = undef; } elsif ($flag) { $caption = $1 if /\s+External Connector Type:.*\((.+)\)/i; $description = $1 if /\s+External Reference Designator:\s*(.+)/i; $type = $1 if /\s+Port Type:.*\((.+)\)/i; } } } elsif( $aarch eq "sparc" ) { # # For a Sparc arch, we're done # } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Slots.pm000066400000000000000000000317021432320066700247360ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Slots; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("prtdiag") } sub run { my $params = shift; my $common = $params->{common}; my $description; my $designation; my $name; my $status; my @pci; my $flag; my $flag_pci; my $model; my $sun_class; chomp($model = `uname -i`); # debug print model #print "Model: '$model'"; $sun_class = 0; # we map (hopfully) our server model to a known class if ($model =~ /SUNW,SPARC-Enterprise/) { $sun_class = 1; } # M9000 if ($model =~ /SUNW,SPARC-Enterprise-T\d/) { $sun_class = 22; } # T5220 if ($model =~ /SUNW,Sun-Fire-\d/) { $sun_class = 3; } # 280R, 480R if ($model =~ /SUNW,Sun-Fire-V\d/) { $sun_class = 3; } # V490 if ($model =~ /SUNW,Sun-Fire-T\d/) { $sun_class = 4; } # T2000 if ($model =~ /SUNW,Sun-Blade-1500/) { $sun_class = 8; } # Blade 1500 workstation if ($model =~ /i86pc/) { $sun_class = 21; } # x86 hardware if ($model =~ /SUNW,T5/) { $sun_class = 22; } # T5240, T5440 if ($model =~ /sun4v/) { $sun_class = 22; } # T3-x, T4-x, T5-x #Debug #print "sun_class : $sun_class\n"; if ( $sun_class == 0 ) { # Default class, probably doesn't work foreach (`prtdiag `) { last if(/^\=+/ && $flag_pci); next if(/^\s+/ && $flag_pci); if($flag && $flag_pci && /^(\S+)\s+/) { $name = $1; } if($flag && $flag_pci && /(\S+)\s*$/) { $designation = $1; } if($flag && $flag_pci && /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) { $description = $1; } if($flag && $flag_pci && /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) { $status = $1; } if($flag && $flag_pci) { $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if(/^=+\s+IO Cards/){$flag_pci = 1;} if($flag_pci && /^-+/){$flag = 1;} } } if ( $sun_class == 1 ) { # M9000 #========================= IO Devices ========================= # # IO Lane/Frq #LSB Type LPID RvID,DvID,VnID BDF State Act, Max Name Model #--- ----- ---- ------------------ --------- ----- ----------- ------------------------------ -------------------- # Logical Path # ------------ #00 PCIx 0 8, 125, 1033 2, 0, 0 okay 133, 133 pci-pciexclass,060400 N/A # /pci@0,600000/pci@0 # foreach (`prtdiag -v`) { last if(/^\=+/ && $flag_pci && $flag); if ($flag && $flag_pci && /^(\d+)\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s+\S+\s+\S+\s+((\S+)-\S+)\s+(\S+).*/ ) { $designation = "LSB " . $1; $status = $3; $name = $4; $description = "[$2] $5"; $description .= " ($6)" unless ($6=~/N\/A/); $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if(/^=+\S+\s+IO Devices/){$flag_pci = 1; } if($flag_pci && /^-+/){$flag = 1;} } } if ( $sun_class == 2 ) { # to be checked foreach (`prtdiag `) { if (/pci/) { @pci = split(/ +/); $name=$pci[4]." ".$pci[5]; $description=$pci[0]." (".$pci[1].")"; $designation=$pci[3]; $status=""; $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } } } if ( $sun_class == 3 ) { # SUNW,Sun-Fire-480R # ========================= IO Cards ========================= # # Bus Max # IO Port Bus Freq Bus Dev, # Type ID Side Slot MHz Freq Func State Name Model # ---- ---- ---- ---- ---- ---- ---- ----- -------------------------------- ---------------------- # PCI 8 B 3 33 33 3,0 ok SUNW,qlc-pci1077,2312.1077.101.2+ # PCI 8 B 3 33 33 3,1 ok SUNW,qlc-pci1077,2312.1077.101.2+ # PCI 8 B 5 33 33 5,0 ok pci-pci1011,25.4/pci108e,1000 PCI-BRIDGE # PCI 8 B 5 33 33 0,0 ok pci108e,1000-pci108e,1000.1 device on pci-bridge # PCI 8 B 5 33 33 0,1 ok SUNW,qfe-pci108e,1001 SUNW,pci-qfe/pci-bridg+ foreach (`prtdiag `) { last if(/^\=+/ && $flag_pci && $flag); # End of IO Devices, next section starts here if($flag && $flag_pci && /PCI/) { @pci = split(/ +/); $name=join(" ",@pci[9..$#pci]); $description="[".$pci[0]."] ".$pci[8]; $designation=$pci[0]."/".$pci[1]."/".$pci[2]."/".$pci[3]; $status=$pci[7]; $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if(/^=+\S+\s+IO Cards/){ $flag_pci = 1; # Start of IO Devices section, still header to skip } if($flag_pci && /^-+/){ $flag = 1; # End of IO Devices header, real info starts here } } } if ( $sun_class == 21 ) { # x86 hardware $flag = 0; foreach (`/usr/sbin/smbios -t SMB_TYPE_SLOT`) { if ($flag && /^ID.*/) { # write current slot $common->addSlot({ DESCRIPTION => "$description ($status)", DESIGNATION => $designation, NAME => $name, STATUS => $status, }); $flag = 0; } elsif(/\s+Location Tag:\s+(.*)$/) { $description = $1; } elsif(/\s+Slot ID:\s+(.*)$/) { $designation= $1; } elsif(/\s+Type:\s+\S+\s+\((.*)\)$/) { $name= $1; } elsif(/\s+Usage:\s+\S+\s+\((.*)\).*$/) { $status = $1; } $flag = 1; } # Finally add the last card $common->addSlot({ DESCRIPTION => "$description ($status)", DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if ( $sun_class == 4 ) { # SUNW,Sun-Fire-T200 #========================= IO Configuration ========================= # # IO #Location Type Slot Path Name Model #----------- ----- ---- --------------------------------------------- ------------------------- --------- #IOBD/PCIE0 PCIE 0 /pci@780/pci@0/pci@8/network@0 network-pciex8086,105e SUNW,pcie+ foreach(`prtdiag `) { last if(/^\=+/ && $flag_pci && $flag); # End of IO Devices, next section starts here if($flag && $flag_pci && /PCI/) { @pci = split(/ +/); $name=$pci[5]; $description="[".$pci[1]."] ".$pci[4]; $designation=$pci[0]; $status=" "; if($flag && $flag_pci) { $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } } if(/^=+\S+\s+IO Configuration/){ $flag_pci = 1; # Start of IO Devices section, still header to skip } if($flag_pci && /^-+/){ $flag = 1; # End of IO Devices header, real info starts here } } } if ( $sun_class == 8 ) { # SUNW,Sun-Blade-1500 #================================= IO Devices ================================= #Bus Freq Slot + Name + #Type MHz Status Path Model #------ ---- ---------- ---------------------------- -------------------- #pci 33 MB isa/su (serial) # okay /pci@1e,600000/isa@7/serial@0,3f8 foreach (`prtdiag `) { last if(/^\=+/ && $flag_pci && $flag); # End of IO Devices, next section starts here # pci 33 MB isa/su(serial) SUNW,xxx if($flag && $flag_pci && /(\S+)\s+(\S+)\s+(\S+)\s+(\S+\s+\(\S+\))\s*(.*)/) { $name = $5; $designation = $3; $description = "[$1] $4"; $status = " "; $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if(/^=+\S+\s+IO Devices/){ $flag_pci = 1; # Start of IO Devices section, still header to skip } if($flag_pci && /^-+/){ $flag = 1; # End of IO Devices header, real info starts here } } } if ( $sun_class == 22 ) { # SUNW,T5440 #======================================== IO Devices ======================================= #Slot + Bus Name + Model Max Speed Cur Speed #Status Type Path /Width /Width #------------------------------------------------------------------------------------------- #MB/HBA PCIE scsi-pciex1000,58 LSI,1068E -- -- # /pci@400/pci@0/pci@1/scsi@0 # SPARC T3-1 #================================= IO Devices ================================= #Slot + Bus Name + Model Speed #Status Type Path #------------------------------------------------------------------------------ #/SYS/MB/SASHBA0 PCIE scsi-pciex1000,72 LSI,2008 -- # /pci@400/pci@1/pci@0/pci@4/scsi@0 #/SYS/MB/RISER2/PCIE2PCIE network-pciex108e,abcd SUNW,pcie-qgc -- # /pci@400/pci@1/pci@0/pci@6/network@0 # SPARC T4-4 #======================================== IO Devices ======================================= #Slot + Bus Name + Model Max Speed Cur Speed #Status Type Path /Width /Width #------------------------------------------------------------------------------------------- #/SYS/MB/REM0/SASHBA0 PCIE LSI,sas-pciex1000,72 LSI,2008 -- -- # /pci@400/pci@1/pci@0/pci@0/LSI,sas@0 #/SYS/RIO/NET0 PCIE network-pciex8086,10c9 -- -- # /pci@400/pci@1/pci@0/pci@2/network@0 #/SYS/RIO/NET1 PCIE network-pciex8086,10c9 -- -- # /pci@400/pci@1/pci@0/pci@2/network@0,1 #/SYS/PCI-EM2 PCIE SUNW,qlc-pciex1077,2532 QEM3572 -- -- # /pci@400/pci@1/pci@0/pci@4/pci@0/pci@2/SUNW,qlc@0 # SPARC T5-4 #======================================== IO Devices ======================================= #Slot + Bus Name + Model Max Speed Cur Speed #Status Type Path /Width /Width #------------------------------------------------------------------------------------------- #/SYS/MB/USB_CTLR PCIE usb-pciexclass,0c0330 -- -- # /pci@300/pci@1/pci@0/pci@4/pci@0/pci@6/usb@0 #/SYS/RIO/XGBE0 PCIE network-pciex8086,1528 -- -- # /pci@300/pci@1/pci@0/pci@4/pci@0/pci@8/network@0 #/SYS/MB/SASHBA0 PCIE scsi-pciex1000,87 LSI,2308_2 -- -- # /pci@300/pci@1/pci@0/pci@4/pci@0/pci@c/scsi@0 foreach (`prtdiag `) { last if(/^\=+/ && $flag_pci && $flag); # End of IO Devices, next section starts here # Lazy match for $name due to differences in prtdiag output: # * the "Model" column does not always have a value # * 5-column output on Sol10, 6-column output on Sol11 if($flag && $flag_pci && /(\S+)\s+(\S+)\s+((\S+)-\S+)\s+(\S+)\s+.*/) { $designation = $1; $status = " "; $name = $3; $description = "[$2] $4"; $description .= " ($5)" unless ($5=~/.*GT\/?x\d+|--/); $common->addSlot({ DESCRIPTION => $description, DESIGNATION => $designation, NAME => $name, STATUS => $status, }); } if(/^=+\S+\s+IO Devices/){ $flag_pci = 1; # Start of IO Devices section, still header to skip } if($flag_pci && /^-+/){ $flag = 1; # End of IO Devices header, real info starts here } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Storages.pm000066400000000000000000000057011432320066700254210ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Storages; use strict; #use warning; #sd0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 #Vendor: HITACHI Product: DK32EJ72NSUN72G Revision: PQ08 Serial No: 43W14Z080040A34E #Size: 73.40GB <73400057856 bytes> #Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0 #Illegal Request: 0 Predictive Failure Analysis: 0 # With -En : #c8t60060E80141A420000011A420000300Bd0 Soft Errors: 1 Hard Errors: 0 Transport Errors: 0 #Vendor: HITACHI Product: OPEN-V -SUN Revision: 5009 Serial No: #Size: 64.42GB <64424509440 bytes> #Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0 #Illegal Request: 1 Predictive Failure Analysis: 0 sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("iostat") } sub run { my $params = shift; my $common = $params->{common}; my $manufacturer; my $model; my $description; my $capacity; my $name; my $rev; my $sn; my $type; my $flag_first_line; my $rdisk_path; foreach(`iostat -En`){ #print; if ($flag_first_line){ ## To be removed when FIRMWARE will be supported if ($rev) { $description .= ' ' if $description; $description .= "FW:$rev"; } $rdisk_path=`ls -l /dev/rdsk/${name}s2`; if ( $rdisk_path =~ /.*->.*scsi_vhci.*/ ) { $type="MPxIO"; } elsif( $rdisk_path =~ /.*->.*fp@.*/ ) { $type="FC"; } elsif( $rdisk_path =~ /.*->.*scsi@.*/ ) { $type="SCSI"; } elsif( $rdisk_path =~ /.*->.*virtual-devices.*/ ) { $type="Virtual"; } $common->addStorages({ NAME => $name, MANUFACTURER => $manufacturer, MODEL => $model, DESCRIPTION => $description, TYPE => $type, FIRMWARE => $rev, SERIALNUMBER => $sn, DISKSIZE => $capacity }); $manufacturer=''; $model=''; $description=''; $name=''; $rev=''; $sn=''; $type=''; } $flag_first_line = 0; if (/^(\S+)\s+Soft/){ $name = $1; } if (/^.*Product:\s*(\S+)/){ $model = $1; } if (/^.*<(\S+)\s*bytes/){ $capacity = $1; $capacity = $capacity/(1024*1024); #print $capacity."\n"; } if (/^.*Serial No:\s*(\S+)/){ $sn = $1; ## To be removed when SERIALNUMBER will be supported $description = "S/N:$sn"; ## } if (/^.*Revision:\s*(\S+)/){ $rev = $1; } if (/^Vendor:\s*(\S+)/){ $manufacturer = $1; $flag_first_line = 1; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/OS/Solaris/Users.pm000066400000000000000000000007311432320066700247310ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::OS::Solaris::Users; sub check { my $params = shift; my $common = $params->{common}; $common->can_run ("who") } # Initialise the distro entry sub run { my $params = shift; my $common = $params->{common}; my %user; # Logged on users for (`who`){ $user{$1} = 1 if /^(\S+)./; } my $UsersLoggedIn = join "/", keys %user; $common->setHardware ({ USERID => $UsersLoggedIn }); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/000077500000000000000000000000001432320066700243605ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Docker.pm000066400000000000000000000025741432320066700261350ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Docker; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run("docker"); } my @image; sub run { my $params = shift; my $common = $params->{common}; foreach my $cont (`docker ps 2>/dev/null`) { next if ($cont =~ /^CONTAINER ID/); my $container_id=$1 if ($cont =~ /^(\w+)/i); push @image, $container_id; } foreach my $c (@image) { my $tab=`docker inspect $c`; my $memory=$1 if ($tab =~ /\s+"Memory":\s(\d+),/); my $name=$1 if ($tab =~ /\s+"Hostname":\s"(\w+)",/); my $status=$1 if ($tab =~ /\s+"Status":\s"(\w+)",/); my $vcpu=$1 if ($tab =~ /\s+"CpuShares":\s(\d+),/); my $vmid=$1 if ($tab =~ /\s+"Id":\s"(\w+)",/); my $ipaddr=$1 if ($tab =~ /\s+"IPAddress":\s"(.*)"/); my $macaddr=$1 if ($tab =~ /\s+"MacAddress":\s"(.*)"/); my $gateway=$1 if ($tab =~ /\s+"Gateway":\s"(.*)"/); $common->addVirtualMachine({ CPUSHARES => $vcpu, GATEWAY => $gateway, IPADDR => $ipaddr, MACADDR => $macaddr, MEMORY => $memory, NAME => $name, STATUS => $status, SUBSYSTEM => "Docker Container", VMID => $vmid, VTYPE => "Docker", }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Jails.pm000066400000000000000000000027371432320066700257710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Jails; use strict; sub check { return(undef) unless -r '/usr/sbin/jls'; return 1; } my @jail; sub run { my $params = shift; my $common = $params->{common}; foreach my $line (`jls -h 2>/dev/null | sed -e "1d"`) { push @jail, $line; } foreach my $j (@jail) { my @jparam=split('\s',$j); my $vmid=$jparam[6]; my $name=$jparam[7]; my $subsystem=$jparam[9]; my $status="running"; my @ip; my $ipv4=$jparam[39]; if ($ipv4 ne '-') { my @ipv4=split(",",$ipv4); foreach my $i (@ipv4) { push @ip, $i; } } my $ipv6=$jparam[41]; if ($ipv6 ne '-') { my @ipv6=split(",",$ipv6); foreach my $i (@ipv6) { push @ip, $i; } } my $ip=join "/", @ip; if (defined $ip) { $common->addVirtualMachine({ IPADDR => $ip, NAME => $name, STATUS => $status, SUBSYSTEM => "FreeBSD $subsystem", VMID => $vmid, VTYPE => "Jail", }); } else { $common->addVirtualMachine({ NAME => $name, STATUS => $status, SUBSYSTEM => "FreeBSD $subsystem", VMID => $vmid, VTYPE => "Jail", }); } } } 1;UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Libvirt.pm000066400000000000000000000026041432320066700263330ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Libvirt; use strict; use XML::Simple; sub check { my $params = shift; my $common = $params->{common}; $common->can_run('virsh') } sub run { my $params = shift; my $common = $params->{common}; foreach (`virsh --readonly list --all`) { if (/^\s*(\d+|\s+\-)\s+(\S+)\s+(\S.+)/){ my $memory; my $vcpu; my $name = $2; my $status = $3; $status =~ s/^shut off/off/; my $xml = `virsh --readonly dumpxml $name`; my $data = XMLin($xml); my $vcpu = $data->{vcpu}; my $uuid = $data->{uuid}; my $vmtype = $data->{type}; if ($data->{currentMemory}->{unit}) { $memory = $1 if $data->{currentMemory}->{content} =~ /(\d+)\d{3}$/; $vcpu = $data->{vcpu}->{content}; } else { $memory = $1 if $data->{currentMemory} =~ /(\d+)\d{3}$/; $vcpu = $data->{vcpu}; } my %machine = ( MEMORY => $memory, NAME => $name, UUID => $uuid, STATUS => $status, SUBSYSTEM => "Libvirt", VMTYPE => $vmtype, VCPU => $vcpu, ); $common->addVirtualMachine(\%machine); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Lxc.pm000066400000000000000000000047001432320066700254450ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Lxc; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run('lxc-ls') && $common->can_run('lxc-info') } my $memory; my $status; my $name; my $vmtype; my $vmid; my $vcpu=0; my $lstatus=""; my $cpu; my @lxc_vm; sub run { my $params = shift; my $common = $params->{common}; # Retrieve name and state of the vm foreach (`lxc-ls -1`) { my $vm = $1 if (/^(\S+)$/); #push (@lxc_vm, $vm); foreach (`lxc-info -n $vm`){ $name = $1 if (/^Name:\s*(\S+)$/); $vmid = $1 if (/^PID:\s*(\S+)$/); $lstatus = $1 if (/^State:\s*(\S+)$/); if ($lstatus eq "RUNNING") { $status = "Running"; $memory = $1 if (`lxc-cgroup -n $name memory.limit_in_bytes` =~ /(\S+)/); if (`lxc-cgroup -n $name cpuset.cpus` =~ /(\S+)/) { $cpu = $1; if ($cpu =~ /^(\d+)-(\d+)/){ my @tmp = ($1..$2); $vcpu += $#tmp + 1; } else { $vcpu += 1; } } } elsif ($lstatus eq "FROZEN") { $status = "Paused"; } elsif ($lstatus eq "STOPPED") { $status = "Off"; open LXC, ") { next if (/^#.*/); if (/^lxc.cgroup.memory.limit_in_bytes\s+=\s*(\S+)\s*$/){ $memory = $1; } if (/^lxc.cgroup.cpuset.cpus\s+=\s*(\S+)\s*$/){ foreach $cpu (split(/,/,$1)){ $cpu = $1; if ($cpu =~ /(\d+)-(\d+)/){ my @tmp = ($1..$2); $vcpu += $#tmp + 1; } else { $vcpu += 1; } } } } } } my $machine = { MEMORY => $memory, NAME => $name, STATUS => $status, SUBSYSTEM => "LXC Container", VCPU => $vcpu, VMID => $vmid, VMTYPE => "LXC", }; $common->addVirtualMachine($machine); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Parallels.pm000066400000000000000000000151271432320066700266430ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Parallels; use strict; use warnings; use XML::Simple; sub check { my $params = shift; my $common = $params->{common}; return $common->can_run('prlctl') } sub run { my $params = shift; my $common = $params->{common}; my $config = $params->{config}; my %status_list = ( 'running' => 'running', 'blocked' => 'blocked', 'paused' => 'paused', 'suspended' => 'suspended', 'crashed' => 'crashed', 'dying' => 'dying', ); my $xmlfile = undef; if (defined($config->{server}) && $config->{server}) { my $dir = $config->{server}; $dir =~ s/\//_/g; $config->{vardir} = $config->{basevardir}."/".$dir; } elsif (defined($config->{local}) && $config->{local}) { $config->{vardir} = $config->{basevardir}."/__LOCAL__"; } if (-d $config->{vardir}) { $xmlfile = $config->{vardir}."/uuid.xml"; } my ($uuid,$mem,$status,$name,$subsys)=undef; my $cpus = 1; my @users = (); # We don't want to scan user directories unless --scan-homedirs is used return unless $config->{scanhomedirs}; foreach my $lsuser ( glob("/Users/*") ) { $lsuser =~ s/.*\///; # Just keep the login next if $lsuser =~ /Shared/i; next if $lsuser =~ /^\./i; # Ignore hidden directory next if $lsuser =~ /\ /; # Ignore directory with space in the name next if $lsuser =~ /'/; # Ignore directory with space in the name push(@users,$lsuser); } foreach my $user (@users) { my @command = `su $user -c "prlctl list -a"`; shift (@command); foreach my $line ( @command ) { chomp $line; my @params = split(/ /, $line); $uuid = $params[0]; $status = $params[1]; # Avoid security risk. Should never appends next if $uuid =~ /(;\||&)/; foreach my $infos ( `sudo -u $user prlctl list -i $uuid`) { if ($infos =~ m/^\s\smemory\s(.*)Mb/) { $mem = $1; } elsif ($infos =~ m/^\s\scpu\s([0-9]{1,2})/) { $cpus= $1; } elsif ($infos =~ m/^Name:\s(.*)/) { $name = $1; } elsif ($infos =~ m/^OS:\s(.*)/) { $subsys = $1; } } $uuid =~ s/{// if ($uuid =~ m/{/); $uuid =~ s/}// if ($uuid =~ m/}/); my ($hwUUID,$currentUUID)=undef; # if vm is running, fetch the real uuid if ($status eq 'running') { my $command = "sudo -u $user prlctl exec $uuid /usr/sbin/ioreg -rd1 -c IOPlatformExpertDevice"; open(IOREG, "$command |") or die "Failed to run '$command': $!\n"; while() { if (/^[\s|]*"(\w+)"\s*=\s*(.*)$/) { next unless $1 eq "IOPlatformUUID"; $currentUUID = $2; $currentUUID =~ s/\"//g; } } } if (! -e $xmlfile) { my $uuid_xml = { 'PARALLELS' => { 'VIRTUALMACHINES' => { 'NAME' => [$name], 'PARALLELSUUID' => [$uuid], # Damned random uuid value 'GUESTUUID' => [$currentUUID], # The true and great uuid value }, }, }; my $xs = XML::Simple->new( ForceArray => 1, KeepRoot => 1, XMLDecl => ''); my $xml = $xs->XMLout($uuid_xml); open (MYFILE, "> $xmlfile"); print MYFILE "$xml"; # write xml output to the newly created file close (MYFILE); $hwUUID = $currentUUID; # fetch guest uuid value, even if it's empty (vm not currently running) } else { my $parallels = XML::Simple->new( ForceArray => 1, KeepRoot => 1, XMLDecl => '', ); my $vm = $parallels->XMLin($xmlfile); my $numberOfVMs = 0; my $boolean = 0; while (defined $vm->{PARALLELS}[0]{VIRTUALMACHINES}[$numberOfVMs]) { $numberOfVMs+=1; } for (my $counter=0; $counter<$numberOfVMs; $counter++) { if ( $vm->{PARALLELS}[0]{VIRTUALMACHINES}[$counter]{NAME}[0] eq $name ) { # if the vm with this name exists in the file, set its GUESTUUID value, if the currentUUID isn't empty if ( defined ($currentUUID)) { $vm->{PARALLELS}[0]{VIRTUALMACHINES}[$counter]{GUESTUUID}[0] = $currentUUID; } $vm->{PARALLELS}[0]{VIRTUALMACHINES}[$counter]{PARALLELSUUID}[0] = $uuid; # if vm re-registered, parallels uuid changes $boolean = 1; if ( defined ($vm->{PARALLELS}[0]{VIRTUALMACHINES}[$counter]{GUESTUUID}[0])) { $hwUUID = $vm->{PARALLELS}[0]{VIRTUALMACHINES}[$counter]{GUESTUUID}[0]; } } } unless ($boolean) { # if vm doesn't exist, push it to the file push @{$vm->{PARALLELS}[0]{VIRTUALMACHINES}}, { NAME => [$name], PARALLELSUUID => [$uuid], GUESTUUID => [$currentUUID], }; } open (MYFILE, "> $xmlfile"); print MYFILE $parallels->XMLout($vm); close (MYFILE); } $common->addVirtualMachine ({ NAME => $name, VCPU => $cpus, MEMORY => $mem, STATUS => $status, SUBSYSTEM => $subsys, VMTYPE => "Parallels", UUID => $hwUUID, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Qemu.pm000066400000000000000000000036121432320066700256270ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Qemu; # With Qemu 0.10.X, some option will be added to get more and easly information (UUID, memory, ...) use strict; sub check { my $params = shift; my $common = $params->{common}; return ($common->can_run('qemu') || $common->can_run('kvm') || $common->can_run('qemu-kvm')) } sub run { my $params = shift; my $common = $params->{common}; foreach ( `ps -ef` ) { if (m/^\S+\s+(\d+).*((qemu|kvm|(qemu-kvm)).*\-([fh]d[a-d]|drive|cdrom).*)$/) { # match only if an qemu instance my $name = "N/A"; my $mem = 0; my $uuid; my $vmtype = $3; my $vcpu = 1; my $pid = $1; if (open F, "/proc/$pid/cmdline") { my @a=split "\000-", ; close F; foreach my $option ( @a ) { if ($option =~ m/^name\000(\S+)/) { $name = $1; } elsif ($option =~ m/^m\000(\S+)/) { $mem = $1; } elsif ($option =~ m/^uuid\000(\S+)/) { $uuid = $1; } elsif ($option =~ m/.*uuid=(\S+)/) { $uuid = $1; } elsif ($option =~ m/^smp\000(\d+)/) { $vcpu = $1; } } } if ($mem == 0 ) { # Default value $mem = 128; } $common->addVirtualMachine ({ NAME => $name, UUID => $uuid, VCPU => $vcpu, MEMORY => $mem, STATUS => "running", SUBSYSTEM => $vmtype, VMTYPE => $vmtype, }); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/SolarisLdoms.pm000066400000000000000000000026201432320066700273310ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::SolarisLdoms; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run('ldm'); } sub run { my @ldoms; my $ldom; my @ldomdetails; my $ldomdetail; my $ldomname; my $ldomstatus; my $ldommem; my $ldomncpu; my $ldomuuid; my $ldomsoftstate; my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; @ldoms = `/usr/sbin/ldm list-domain -p`; foreach $ldom (@ldoms) { if($ldom =~ /^DOMAIN\|name=(\S+)\|state=(\S+)\|flags=\S+\|cons=\S+\|ncpu=(\d+)\|mem=(\d+)\|.*/) { $ldomname=$1; $ldomstatus=$2; $ldomncpu=$3; $ldommem=$4/1024/1024; $ldomsoftstate=""; @ldomdetails = `/usr/sbin/ldm list-domain -o domain -p $ldomname`; foreach $ldomdetail (@ldomdetails) { if($ldomdetail =~ /^DOMAIN\|.*\|softstate=(.*)$/) { $ldomsoftstate=$1; } elsif($ldomdetail =~ /^UUID\|uuid=(.*)$/) { $ldomuuid=$1; } } my $machine = { MEMORY => $ldommem, NAME => $ldomname, UUID => $ldomuuid, STATUS => $ldomstatus, SUBSYSTEM => $ldomsoftstate, VMTYPE => "Solaris Ldom", VCPU => $ldomncpu, }; $common->addVirtualMachine($machine); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/SolarisZones.pm000066400000000000000000000044741432320066700273620ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::SolarisZones; use strict; sub check { my $params = shift; my $common = $params->{common}; return unless $common->can_run('zoneadm'); return unless $common->can_run('zonecfg'); return unless check_solaris_valid_release(); } sub check_solaris_valid_release{ #check if Solaris 10 release is higher than 08/07 #no problem if Solaris 11 my $OSlevel; my @rlines; my $release_file; my $release; my $year; my $month; $OSlevel=`uname -r`; if ( $OSlevel =~ /5.10/ ) { $release_file = "/etc/release"; if (!open(SOLVERSION, $release_file)) { return; } @rlines = ; @rlines = grep(/Solaris/,@rlines); $release = @rlines[0]; $release =~ m/(\d)\/(\d+)/; $month = $1; $year = $2; $month =~ s/^0*//g; $year =~ s/^0*//g; if ($year <= 7 and $month < 8 ){ return 0; } } 1 } sub run { my @zones; my @lines; my $zone; my $zoneid; my $zonename; my $zonestatus; my $zonefile; my $pathroot; my $uuid; my $zonetype; my $memory; my $memcap; my $vcpu; my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; @zones = `/usr/sbin/zoneadm list -p`; @zones = grep (!/global/,@zones); foreach $zone (@zones) { ($zoneid,$zonename,$zonestatus,$pathroot,$uuid,$zonetype)=split(/:/,$zone); $memory=""; foreach (`/usr/sbin/zonecfg -z $zonename info capped-memory`) { if (/\s+physical:\s+(\S+)(\S)/) { # recalculate to GB $memory = $1 if ( $2 eq "G" ) ; $memory = $1 / 1024 if ( $2 eq "M" ) ; } } $vcpu=""; foreach (`/usr/sbin/zonecfg -z $zonename info dedicated-cpu`) { if (/\s+ncpus:\s+\S*(\d+)/) { $vcpu = $1; } } my $machine = { MEMORY => $memory, NAME => $zonename, UUID => $uuid, STATUS => $zonestatus, SUBSYSTEM => $zonetype, VMTYPE => "Solaris Zones", VMID => $zoneid, VCPU => $vcpu, }; $common->addVirtualMachine($machine); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/VirtualBox.pm000066400000000000000000000155221432320066700270220ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::VirtualBox; # This module detects only all VMs create by the user who launch this module (root VMs). use strict; use XML::Simple; use File::Glob ':glob'; sub check { my $params = shift; my $common = $params->{common}; return $common->can_run('VirtualBox') and $common->can_run('VBoxManage') } sub run { my $params = shift; my $common = $params->{common}; my $scanhomedirs = $params->{accountinfo}{config}{scanhomedirs}; my $cmd_list_vms = "VBoxManage -nologo list vms"; my ( $version ) = ( `VBoxManage --version` =~ m/^(\d\.\d).*$/ ) ; if ( $version > 2.1 ) { # detect VirtualBox version 2.2 or higher $cmd_list_vms = "VBoxManage -nologo list --long vms"; } my $in = 0; my $uuid; my $mem; my $status; my $name; foreach my $line (`$cmd_list_vms`){ # read only the information on the first paragraph of each vm chomp ($line); if ($in == 0 and $line =~ m/^Name:\s+(.*)$/) { # begin $name = $1; $in = 1; } elsif ($in == 1 ) { if ($line =~ m/^UUID:\s+(.*)/) { $uuid = $1; } elsif ($line =~ m/^Memory size:\s+(.*)/ ) { $mem = $1; } elsif ($line =~ m/^State:\s+(.*)\(.*/) { $status = ( $1 =~ m/off/ ? "off" : $1 ); } elsif ($line =~ m/^\s*$/) { # finish $in = 0 ; next if $uuid =~ /^N\\A$/ ; #If no UUID found, it is not a virtualmachine $common->addVirtualMachine ({ NAME => $name, VCPU => 1, UUID => $uuid, MEMORY => $mem, STATUS => $status, SUBSYSTEM => "Oracle xVM VirtualBox", VMTYPE => "VirtualBox", }); $name = $status = $mem = $uuid = 'N\A'; # useless but need it for security (new version, ...) } } } if ($in == 1) { # Anormal situation ! save the current vm information ... $common->addVirtualMachine ({ NAME => $name, VCPU => 1, UUID => $uuid, MEMORY => $mem, STATUS => $status, SUBSYSTEM => "Oracle xVM VirtualBox", VMTYPE => "VirtualBox", }); } # try to found another VMs, not exectute by root my @vmRunnings = (); my $index = 0 ; foreach my $line ( `ps -ef` ) { chomp($line); if ( $line !~ m/^root/) { if ($line =~ m/^.*VirtualBox (.*)$/) { my @process = split (/\s*\-\-/, $1); #separate options $name = $uuid = "N/A"; foreach my $option ( @process ) { #print $option."\n"; if ($option =~ m/^comment (.*)/) { $name = $1; } elsif ($option =~ m/^startvm (\S+)/) { $uuid = $1; } } if ($scanhomedirs == 1 ) { # If I will scan Home directories, $vmRunnings [$index] = $uuid; # save the no-root running machine $index += 1; } else { $common->addVirtualMachine ({ # add in inventory NAME => $name, VCPU => 1, UUID => $uuid, STATUS => "running", SUBSYSTEM => "Oracle xVM VirtualBox", VMTYPE => "VirtualBox", }); } } } } # If home directories scan is authorized if ($scanhomedirs == 1 ) { # Read every Machines Xml File of every user foreach my $xmlMachine (bsd_glob("/home/*/.VirtualBox/Machines/*/*.xml")) { chomp($xmlMachine); # Open config file ... my $configFile = new XML::Simple; my $data = $configFile->XMLin($xmlMachine); # ... and read it if ($data->{Machine}->{uuid}) { my $uuid = $data->{Machine}->{uuid}; $uuid =~ s/^{?(.{36})}?$/$1/; my $status = "off"; foreach my $vmRun (@vmRunnings) { if ($uuid eq $vmRun) { $status = "running"; } } $common->addVirtualMachine ({ NAME => $data->{Machine}->{name}, VCPU => $data->{Machine}->{Hardware}->{CPU}->{count}, UUID => $uuid, MEMORY => $data->{Machine}->{Hardware}->{Memory}->{RAMSize}, STATUS => $status, SUBSYSTEM => "Oracle xVM VirtualBox", VMTYPE => "VirtualBox", }); } } foreach my $xmlVirtualBox (bsd_glob("/home/*/.VirtualBox/VirtualBox.xml")) { chomp($xmlVirtualBox); # Open config file ... my $configFile = new XML::Simple; my $data = $configFile->XMLin($xmlVirtualBox); # ... and read it my $defaultMachineFolder = $data->{Global}->{SystemProperties}->{defaultMachineFolder}; if ( $defaultMachineFolder != 0 and $defaultMachineFolder != "Machines" and $defaultMachineFolder =~ /^\/home\/S+\/.VirtualBox\/Machines$/ ) { foreach my $xmlMachine (bsd_glob($defaultMachineFolder."/*/*.xml")) { my $configFile = new XML::Simple; my $data = $configFile->XMLin($xmlVirtualBox); if ( $data->{Machine} != 0 and $data->{Machine}->{uuid} != 0 ) { my $uuid = $data->{Machine}->{uuid}; $uuid =~ s/^{?(.{36})}?$/$1/; my $status = "off"; foreach my $vmRun (@vmRunnings) { if ($uuid eq $vmRun) { $status = "running"; } } $common->addVirtualMachine ({ NAME => $data->{Machine}->{name}, VCPU => $data->{Machine}->{Hardware}->{CPU}->{count}, UUID => $uuid, MEMORY => $data->{Machine}->{Hardware}->{Memory}->{RAMSize}, STATUS => $status, SUBSYSTEM => "Oracle xVM VirtualBox", VMTYPE => "VirtualBox", }); } } } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/VmWareDesktop.pm000066400000000000000000000026141432320066700274540ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::VmWareDesktop; # # initial version: Walid Nouh # use strict; sub check { my $params = shift; my $common = $params->{common}; return $common->can_run('/Library/Application\ Support/VMware\ Fusion/vmrun') } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $uuid; my $mem; my $status; my $name; my $i = 0; my $commande = "/Library/Application\\ Support/VMware\\ Fusion\/vmrun list"; foreach my $vmxpath ( `$commande` ) { next unless $i++ > 0; # Ignore the first line if (!open TMP, "<$vmxpath") { $logger->debug("Can't open $vmxpath\n"); next; } my @vminfos = ; close TMP; foreach my $line (@vminfos) { if ($line =~ m/^displayName =\s\"+(.*)\"/) { $name = $1; } elsif ($line =~ m/^memsize =\s\"+(.*)\"/) { $mem = $1; } elsif ($line =~ m/^uuid.bios =\s\"+(.*)\"/) { $uuid = $1; } } $common->addVirtualMachine ({ NAME => $name, VCPU => 1, UUID => $uuid, MEMORY => $mem, STATUS => "running", SUBSYSTEM => "VmWare Fusion", VMTYPE => "VmWare", }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/VmWareESX.pm000066400000000000000000000025761432320066700265110ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::VmWareESX; use strict; sub check { my $params = shift; my $common = $params->{common}; $common->can_run('vmware-cmd') } sub run { my $params = shift; my $common = $params->{common}; foreach my $vmx (`vmware-cmd -l`) { chomp $vmx; next unless -f $vmx; my %machineInfo; open VMX, "<$vmx" or warn; foreach () { if (/^(\S+)\s*=\s*(\S+.*)/) { my $key = $1; my $value = $2; $value =~ s/(^"|"$)//g; $machineInfo{$key} = $value; } } close VMX; my $status = 'unknow'; if ( `vmware-cmd "$vmx" getstate` =~ /=\ (\w+)/ ) { # off $status = $1; } my $memory = $machineInfo{'memsize'}; my $name = $machineInfo{'displayName'}; my $uuid = $machineInfo{'uuid.bios'}; # correct uuid format $uuid =~ s/\s+//g;# delete space $uuid =~ s!^(........)(....)(....)-(....)(.+)$!\1-\2-\3-\4-\5!; # add dashs my $machine = { MEMORY => $memory, NAME => $name, UUID => $uuid, STATUS => $status, SUBSYSTEM => "VmWareESX", VMTYPE => "VmWare", }; $common->addVirtualMachine($machine); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/VmWareWorkstation.pm000066400000000000000000000030751432320066700303710ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::VmWareWorkstation; # # initial version: Walid Nouh # use strict; sub check { my $params = shift; my $common = $params->{common}; return $common->can_run('/bin/vmrun') } sub run { my $params = shift; my $common = $params->{common}; my $logger = $params->{logger}; my $cpu; my $cores; my $uuid; my $mem; my $status; my $name; my $i = 0; my $commande = "/bin/vmrun list"; foreach my $vmxpath ( `$commande` ) { next unless $i++ > 0; # Ignore the first line if (!open TMP, "<$vmxpath") { $logger->debug("Can't open $vmxpath\n"); next; } my @vminfos = ; close TMP; foreach my $line (@vminfos) { if ($line =~ m/^displayName =\s\"+(.*)\"/) { $name = $1; } elsif ($line =~ m/^numvcpus =\s\"+(.*)\"/){ $cpu = $1; } elsif ($line =~ m/^cpuid.coresPerSocket =\s\"+(.*)\" /){ $cores = $1; } elsif ($line =~ m/^memsize =\s\"+(.*)\"/) { $mem = $1; } elsif ($line =~ m/^uuid.bios =\s\"+(.*)\"/) { $uuid = $1; } } $common->addVirtualMachine ({ NAME => $name, VCPU => $cpu, CORES => $cores, UUID => $uuid, MEMORY => $mem, STATUS => "running", SUBSYSTEM => "VmWare Workstation", VMTYPE => "VmWare", }); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Vmsystem.pm000066400000000000000000000150771432320066700265570ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Vmsystem; # Initial Ocsinventory::Agent::Backend::Virtualization::Vmsystem version: Nicolas EISEN # # Code include from imvirt - I'm virtualized? # http://micky.ibh.net/~liske/imvirt.html # # Authors: # Thomas Liske # # Copyright Holder: # 2008 (C) IBH IT-Service GmbH [http://www.ibh.de/] # # License: # 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 package; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ## # # Outputs: # Xen # VirtualBox # Virtual Machine # VMware # QEMU # SolarisZone # # If no virtualization has been detected: # Physical # ## use strict; sub check { my $params = shift; my $common = $params->{common}; if ( $common->can_run("zoneadm")){ # Is a solaris zone system capable ? return 1; } if ( $common->can_run ("dmidecode") ) { # 2.6 and under haven't -t parameter my $dmidecode_ver = `dmidecode -V 2>/dev/null`; my @SplitVersion = split(/\./, $dmidecode_ver); if (@SplitVersion[0] > 2) { return 1; } elsif (@SplitVersion[0] == 2 && @SplitVersion[1] >= 7) { return 1; } } return 0; } sub run { my $params = shift; my $common = $params->{common}; my $dmidecode = '/usr/sbin/dmidecode'; my $cmd = '$dmidecode -t system'; my $dmesg = '/bin/dmesg | head -n 750'; my $status = "Physical"; my $found = 0; # Solaris zones my @solaris_zones; @solaris_zones = `/usr/sbin/zoneadm list`; @solaris_zones = grep (!/global/,@solaris_zones); if(@solaris_zones){ $status = "SolarisZone"; $found = 1; } if ( -d '/proc/xen' || check_file_content('/sys/devices/system/clocksource/clocksource0/available_clocksource','xen')) { $found = 1 ; if (check_file_content('/proc/xen/capabilities', 'control_d')) { # dom0 host } else { # domU PV host $status = "Xen"; # those information can't be extracted from dmidecode $common->setBios ({ SMANUFACTURER => 'Xen', SMODEL => 'PVM domU' }); } } # dmidecode needs root to work :( if ($found == 0 and -r '/dev/mem' && -x $dmidecode) { my $sysprod = `$dmidecode -s system-product-name`; if ($sysprod =~ /^VMware/) { $status = "VMware"; $found = 1; } elsif ($sysprod =~ /^Virtual Machine/) { $status = "Virtual Machine"; $found = 1; } elsif ($sysprod =~ /^Microsoft Corporation/) { $status = "Hyper-V"; $found=1; } else { my $biosvend = `$dmidecode -s bios-vendor`; if ($biosvend =~ /^QEMU/) { $status = "QEMU"; $found = 1; } elsif ($biosvend =~ /^Xen/) { # virtualized Xen $status = "Xen"; $found = 1; } } } # Parse loaded modules my %modmap = ( '^vmxnet\s' => 'VMware', '^xen_\w+front\s' => 'Xen', ); if ($found == 0 and open(HMODS, '/proc/modules')) { while() { foreach my $str (keys %modmap) { if (/$str/) { $status = "$modmap{$str}"; $found = 1; last; } } } close(HMODS); } # Let's parse some logs & /proc files for well known strings my %msgmap = ( 'VMware vmxnet virtual NIC driver' => 'VMware', 'Vendor: VMware\s+Model: Virtual disk' => 'VMware', 'Vendor: VMware,\s+Model: VMware Virtual ' => 'VMware', ': VMware Virtual IDE CDROM Drive' => 'VMware', ' QEMUAPIC ' => 'QEMU', 'QEMU Virtual CPU' => 'QEMU', ': QEMU HARDDISK,' => 'QEMU', ': QEMU CD-ROM,' => 'QEMU', ': Virtual HD,' => 'Virtual Machine', ': Virtual CD,' => 'Virtual Machine', ' VBOXBIOS ' => 'VirtualBox', ': VBOX HARDDISK,' => 'VirtualBox', ': VBOX CD-ROM,' => 'VirtualBox', 'Hypervisor signature: xen' => 'Xen', 'Xen virtual console successfully installed' => 'Xen', 'Xen reported:' => 'Xen', 'Xen: \d+ - \d+' => 'Xen', 'xen-vbd: registered block device' => 'Xen', 'ACPI: RSDP \(v\d+\s+Xen ' => 'Xen', 'ACPI: XSDT \(v\d+\s+Xen ' => 'Xen', 'ACPI: FADT \(v\d+\s+Xen ' => 'Xen', 'ACPI: MADT \(v\d+\s+Xen ' => 'Xen', 'ACPI: HPET \(v\d+\s+Xen ' => 'Xen', 'ACPI: SSDT \(v\d+\s+Xen ' => 'Xen', 'ACPI: DSDT \(v\d+\s+Xen ' => 'Xen', ); if ($found == 0 and open(HDMSG, '/var/log/dmesg')) { while() { foreach my $str (keys %msgmap) { if (/$str/) { $status = "$msgmap{$str}"; $found = 1; last; } } } close(HDMSG); } # Read kernel ringbuffer directly if ($found == 0 and open(HDMSG, '$dmesg |')) { while() { foreach my $str (keys %msgmap) { if (/$str/) { $status = "$msgmap{$str}"; $found = 1; last; } } } close(HDMSG); } if ($found == 0 and open(HSCSI, '/proc/scsi/scsi')) { while() { foreach my $str (keys %msgmap) { if (/$str/) { $status = "$msgmap{$str}"; $found = 1; last; } } } close(HSCSI); } $common->setHardware ({ VMSYSTEM => $status, }); } sub check_file_content { my ($file, $pattern) = @_; return 0 unless -r $file; my $found = 0; open (my $fh, '<', $file) or die "Can't open file $file: $!"; while (my $line = <$fh>) { if ($line =~ /$pattern/) { $found = 1; last; } } close ($fh); return $found; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Xen.pm000066400000000000000000000002271432320066700254510ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Xen; $runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::Virtualization::Libvirt"]; 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Xen/000077500000000000000000000000001432320066700251125ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Xen/XL.pm000066400000000000000000000042331432320066700257750ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Xen::XL; use strict; sub check { my $params = shift; my $common = $params->{common}; my $can_run = $common->can_run('xl'); if ($can_run) { system('xl list'); my $exit_val = $? >> 8; return $exit_val eq 0; } return $can_run; } sub run { my $params = shift; my $common = $params->{common}; # output: xm list # # Name ID Mem(MiB) VCPUs State Time(s) # Domain-0 0 98 1 r----- 5068.6 # Fedora3 164 128 1 r----- 7.6 # Fedora4 165 128 1 ------ 0.6 # Mandrake2006 166 128 1 -b---- 3.6 # Mandrake10.2 167 128 1 ------ 2.5 # Suse9.2 168 100 1 ------ 1.8 # xl status my %status_list = ( 'r' => 'running', 'b' => 'blocked', 'p' => 'paused', 's' => 'shutdown', 'c' => 'crashed', 'd' => 'dying', ); my $vmtype = 'xen'; my $subsystem = 'xl'; my @xl_list = `xl list`; # remove first line shift @xl_list; foreach my $vm (@xl_list) { chomp $vm; my ($name, $vmid, $memory, $vcpu, $status, $time) = split(' ',$vm); $status =~ s/-//g; $status = ( $status ? $status_list{$status} : 'off'); my @vm_info = `xl list -l $name`; my $uuid; foreach my $value (@vm_info) { chomp $value; if ($value =~ /uuid/) { $value =~ s/"//g; $value =~ s/,//g; $value =~ s/\s+.*uuid:\s+(.*)/\1/; $uuid = $value; last; } } my $machine = { MEMORY => $memory, NAME => $name, UUID => $uuid, STATUS => $status, SUBSYSTEM => $subsystem, VMTYPE => $vmtype, VCPU => $vcpu, VMID => $vmid, }; $common->addVirtualMachine($machine); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/Xen/XM.pm000066400000000000000000000041661432320066700260030ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::Xen::XM; use strict; sub check { my $params = shift; my $common = $params->{common}; my $can_run = $common->can_run('xm'); if ($can_run) { system('xm list'); my $exit_val = $? >> 8; return $exit_val eq 0; } return $can_run; } sub run { my $params = shift; my $common = $params->{common}; # output: xm list # # Name ID Mem(MiB) VCPUs State Time(s) # Domain-0 0 98 1 r----- 5068.6 # Fedora3 164 128 1 r----- 7.6 # Fedora4 165 128 1 ------ 0.6 # Mandrake2006 166 128 1 -b---- 3.6 # Mandrake10.2 167 128 1 ------ 2.5 # Suse9.2 168 100 1 ------ 1.8 # xm status my %status_list = ( 'r' => 'running', 'b' => 'blocked', 'p' => 'paused', 's' => 'shutdown', 'c' => 'crashed', 'd' => 'dying', ); my $vmtype = 'xen'; my $subsystem = 'xm'; my @xm_list = `xm list`; # remove first line shift @xm_list; foreach my $vm (@xm_list) { chomp $vm; my ($name, $vmid, $memory, $vcpu, $status, $time) = split(' ',$vm); $status =~ s/-//g; $status = ( $status ? $status_list{$status} : 'off'); my @vm_info = `xm list -l $name`; my $uuid; foreach my $value (@vm_info) { chomp $value; if ($value =~ /uuid/) { $value =~ s/\(|\)//g; $value =~ s/\s+.*uuid\s+(.*)/\1/; $uuid = $value; last; } } my $machine = { MEMORY => $memory, NAME => $name, UUID => $uuid, STATUS => $status, SUBSYSTEM => $subsystem, VMTYPE => $vmtype, VCPU => $vcpu, VMID => $vmid, }; $common->addVirtualMachine($machine); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Backend/Virtualization/XenCitrixServer.pm000066400000000000000000000026671432320066700300350ustar00rootroot00000000000000package Ocsinventory::Agent::Backend::Virtualization::XenCitrixServer; use strict; use warnings; sub check { my $params = shift; my $common = $params->{common}; $common->can_run('xe') } sub run { my $params = shift; my $common = $params->{common}; my $hostname = `hostname`; my $residenton; foreach (`xe host-list params=uuid hostname=$hostname`) { $residenton = $1 if /:\s+(.+)/; } foreach (`xe vm-list params=uuid resident-on=$residenton`) { if (/:\s+(.+)/) { my $uuid = $1 if /:\s+(.+)/; my $fname = `xe vm-list params=name-label uuid=$uuid`; my $name = $1 if $fname =~ /:\s+(.+)/; my $fstatus = `xe vm-list params=power-state uuid=$uuid`; my $status = $1 if $fstatus =~ /:\s+(.+)/; my $fvcpu = `xe vm-list params=VCPUs-max uuid=$uuid`; my $vcpu = $1 if $fvcpu =~ /:\s+(.+)/; my $fmemory = `xe vm-list params=memory-actual uuid=$uuid`; my $tmemory = $1 if $fmemory =~ /:\s+(.+)/; my $memory = $1 if $tmemory =~ /(\d+)\d{6}$/; my $machine = { MEMORY => $memory, NAME => $name, UUID => $uuid, STATUS => $status, SUBSYSTEM => "xe", VMTYPE => "XEN", VCPU => $vcpu, }; $common->addVirtualMachine($machine); } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Common.pm000066400000000000000000000723321432320066700216020ustar00rootroot00000000000000############################################################################### ## OCSINVENTORY-NG ## Copyleft Guillaume PROTET 2010 ## Web : http://www.ocsinventory-ng.org ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ package Ocsinventory::Agent::Common; use strict; no strict 'refs'; use warnings; use Encode qw(encode); =head1 NAME Ocsinventory::Agent::Common - give common methods to other modules =over =item addController() Add a controller in the inventory. =item addUsb() Add external usb devices in the inventory. =item addInput() Add internal inputs as keyboard, mouse in the inventory. =item addModem() Add a modem in the inventory. =item addDrive() Add a partition in the inventory. =item addStorages() Add a storage system (hard drive, USB key, SAN volume, etc) in the inventory. =item addMemory() Add a memory module in the inventory. =item addPort() Add a port module in the inventory. =item addSlot() Add a slot in the inventory. =item addSoftware() Register a software in the inventory. =item addMonitor() Add a monitor (screen) in the inventory. =item addVideo() Add a video card in the inventory. =item addSound() Add a sound card in the inventory. =item addNetwork() Register a network in the inventory. =item addRepo() Register a repository in the inventory. =item setHardware() Save global information regarding the machine. The use of setHardware() to update USERID and PROCESSOR* information is deprecated, please, use addUser() and addCPU() instead. =item setBios() Set BIOS information. =item addCPU() Add a CPU in the inventory. =item addUser() Add an user in the list of logged user. =item addLocalUser() Add local users in the inventory. =item addLocalGroup() Add local groups in the inventory. =item addPrinter() Add a printer in the inventory. =item addVirtualMachine() Add a Virtual Machine in the inventory. =item addProcess() Record a running process in the inventory. =item addCamera() Add a camera device in the inventory. Only avalaible for MacOSX =item addIpDiscoverEntry() IpDiscover is used to identify network interface on the local network. This is done on the ARP level. This function adds a network interface in the inventory. =item setAccessLog() What is that for? :) =item flushXMLTags() Clear the content of $common->{xmltags} (to use after adding it in XML) =item addBatteries() Add a memory module in the inventory. =back =cut ################################################################################## # Ocsinventory::Agent::Common is use to give common methods to other modules # ################################################################################## sub new { my (undef, $params) = @_; my $self = {}; $self->{logger} = $params->{logger}; $self->{config} = $params->{config}; $self->{xmltags} = {}; bless $self; } sub addController { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION DRIVER NAME MANUFACTURER PCIID PCISLOT TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{CONTROLLERS}},$content; } sub addUsb { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION INTERFACE MANUFACTURER SERIAL TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{USBDEVICES}},$content; } sub addInput { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION INTERFACE MANUFACTURER CAPTION POINTTYPE TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{INPUTS}},$content; } sub addModem { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION NAME/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{MODEMS}}, $content; } # For compatibility sub addModems { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addModems to addModem()"); $self->addModem(@_); } sub addDrive { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CREATEDATE FREE FILESYSTEM LABEL SERIAL TOTAL TYPE VOLUMN/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{DRIVES}}, $content; } # For compatibility sub addDrives { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addDrives to addDrive()"); $self->addDrive(@_); } sub addStorages { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION DISKSIZE FIRMWARE MANUFACTURER MODEL NAME SERIALNUMBER SCSI_CHID SCSI_COID SCSI_LUN SCSI_UNID TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{STORAGES}}, $content; } # For compatibility sub addStorage { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addStorages to addStorage()"); $self->addStorage(@_); } sub addMemory { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CAPACITY CAPTION DESCRIPTION ERRORCORRECTIONTYPE MANUFACTURER NUMSLOTS SERIALNUMBER SPEED TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{MEMORIES}}, $content; } # For compatibility sub addMemories { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addMemories to addMemory()"); $self->addMemory(@_); } sub addPorts{ my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CAPTION DESCRIPTION NAME TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{PORTS}}, $content; } # For compatibility sub addPort { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addPorts to addPort()"); $self->addPort(@_); } sub addSlot { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION DESIGNATION NAME STATUS/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{SLOTS}}, $content; } # For compatibility sub addSlots { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addSlots to addSlot()"); $self->addSlot(@_); } sub addSoftware { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/STATUS ARCHITECTURE COMMENTS FILESIZE FOLDER FROM INSTALLDATE NAME PUBLISHER VERSION/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{SOFTWARES}}, $content; } # For compatibility sub addSoftwares { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addSoftwares to addSoftware()"); $self->addSoftware(@_); } sub addMonitor { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/BASE64 CAPTION DESCRIPTION MANUFACTURER SERIAL UUENCODE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{MONITORS}}, $content; } # For compatibility sub addMonitors { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addMonitors to addMonitor()"); $self->addMonitor(@_); } sub addVideo { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CHIPSET DRVVERSION MEMORY NAME PCISLOT PCIID RESOLUTION SPEED UUID VBIOS/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{VIDEOS}}, $content; } # For compatibility sub addVideos { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addVideos to addVideo()"); $self->addVideo(@_); } sub addSound { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION MANUFACTURER NAME/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{SOUNDS}}, $content; } # For compatibility sub addSounds { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addSounds to addSound()"); $self->addSound(@_); } sub addNetwork { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/BASE BSSID DESCRIPTION DRIVER DUPLEX IPADDRESS IPDHCP IPGATEWAY IPMASK IPSUBNET MACADDR MODE MTU PCISLOT SLAVE SPEED SSID STATUS TYPE VERSION VIRTUALDEV /) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{NETWORKS}}, $content; } # For compatibility sub addNetworks { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addNetworks to addNetwork()"); $self->addNetwork(@_); } sub addRepo { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/BASEURL ENABLED EXCLUDE EXPIRE EXPIRED FILENAME LASTUPDATED MIRRORS NAME PKGS REVISION SIZE UPDATED/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{REPOSITORY}}, $content; } # For compatibility sub addRepos { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addRepos to addRepo()"); $self->addRepo(@_); } sub setHardware { my ($self, $args, $nonDeprecated) = @_; my $xmltags = $self->{xmltags}; my $logger = $self->{logger}; foreach my $key (qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER INSTALLDATE DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM/) { if (exists $args->{$key}) { if ($key eq 'PROCESSORS' && !$nonDeprecated) { $logger->debug("PROCESSORN, PROCESSORS and PROCESSORT shouldn't be set directly anymore. Please use addCPU() method instead."); } if ($key eq 'USERID' && !$nonDeprecated) { $logger->debug("USERID shouldn't be set directly anymore. Please use addUser() method instead."); } $xmltags->{'HARDWARE'}{$key}[0] = $args->{$key}; } } } sub setBios { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/SMODEL SMANUFACTURER SSN BDATE BVERSION BMANUFACTURER MMANUFACTURER MSN MMODEL ASSETTAG TYPE/) { if (exists $args->{$key}) { $xmltags->{'BIOS'}{$key}[0] = $args->{$key}; } } } sub addCPU { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CORES CPUARCH CPUSTATUS CURRENT_SPEED DATA_WIDTH HPT L2CACHESIZE LOGICAL_CPUS MANUFACTURER NBSOCKET SERIALNUMBER SOCKET SPEED THREADS TYPE VOLTAGE LOGICAL_CPUS/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{CPUS}}, $content; # For the compatibility with HARDWARE/PROCESSOR* my $processorn = int @{$xmltags->{CPUS}}; my $processors = $xmltags->{CPUS}[0]{SPEED}[0]; my $processort = $xmltags->{CPUS}[0]{TYPE}[0]; $self->setHardware ({ PROCESSORN => $processorn, PROCESSORS => $processors, PROCESSORT => $processort, }, 1); } sub addUser { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $login = $args->{LOGIN}; return unless $login; # Is the login, already in the XML ? foreach my $user (@{$xmltags->{USERS}}) { return if $user->{LOGIN}[0] eq $login; } push @{$xmltags->{USERS}}, { LOGIN => [$login] }; my $userString = $xmltags->{HARDWARE}->{USERID}[0] || ""; $userString .= '/' if $userString; $userString .= $login; $self->setHardware ({ USERID => $userString, }, 1); } sub addLocalUser { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/GID HOME ID_USER LOGIN NAME SHELL/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{LOCAL_USERS}}, $content; } sub addLocalGroup { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/ID_GROUP MEMBER NAME/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{LOCAL_GROUPS}}, $content; } sub addPrinter { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION DRIVER NAME PORT/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{PRINTERS}}, $content; } # For compatibility sub addPrinters { my $self = shift; my $logger = $self->{logger}; $logger->debug("please rename addPrinters to addPrinter()"); $self->addPrinter(@_); } sub addBatteries { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CHEMISTRY DESIGNCAPACITY DESIGNVOLTAGE LOCATION MANUFACTURER MANUFACTUREDATE MAXERROR NAME OEMSPECIFIC SBDSVERSION SERIALNUMBER /) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{BATTERIES}}, $content; } sub addVirtualMachine { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/CORES IPADDR MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU VMID/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{VIRTUALMACHINES}}, $content; } sub addProcess { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/COMMANDLINE CPUUSAGE PROCESSMEMORY PROCESSID STARTED TTY USERNAME VIRTUALMEMORY/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{RUNNING_PROCESSES}}, $content; } sub addCamera { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/MODEL UUID/){ if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{RUNNING_PROCESSES}}, $content; } sub addPSU { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/HOTREPLACEABLE LOCATION MANUFACTURER NAME PARTNUMBER PLUGGED POWERMAX SERIALNUMBER STATUS/){ if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key} if $args->{$key}; } } push @{$xmltags->{POWERSUPPLIES}}, $content; } sub addIpDiscoverEntry { my ($self, $args) = @_; my $xmltags = $self->{xmltags}; my $ipaddress = $args->{IPADDRESS}; my $macaddr = $args->{MACADDR}; my $name = $args->{NAME}; if (!$xmltags->{IPDISCOVER}{H}) { $xmltags->{IPDISCOVER}{H} = []; } push @{$xmltags->{IPDISCOVER}{H}}, { # If I or M is undef, the server will ignore the host I => [$ipaddress?$ipaddress:""], M => [$macaddr?$macaddr:""], N => [$name?$name:"-"], # '-' is the default value returned by ipdiscover }; } sub setAccessLog { my ($self, $args) = @_; foreach my $key (qw/USERID LOGDATE/) { if (exists $args->{$key}) { $self->{xmlroot}{'CONTENT'}{'ACCESSLOG'}{$key}[0] = $args->{$key}; } } } sub flushXMLTags { my $self= shift; $self->{xmltags} = {}; } ### SNMP specifics subroutines #### sub getSnmpTable { my ($self,$snmp_table,$baseoid,$snmp_infos) = @_; # $snmp_infos is a hash passed for the SNMP information we want to get # It has to be created like this : # my $hash = { # INFORMATION => OID, #}; my $results={}; #The final hash which will contain one key per SNMP reference for my $oid ( keys %$snmp_table ) { if ( $oid =~ /$baseoid\.\d+\.\d+\.(\S+)/ ) { my $reference=$1; #Getting the last digits of the OID separated by a dot # Getting information if one the values from $snmp_infos hash is found for the current OID for my $value (keys %$snmp_infos) { if ($oid =~ /$snmp_infos->{$value}\.$reference/) { $results->{$reference}->{$value}= $snmp_table->{$oid} } } } } return $results; } sub setSnmpCommons { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/IPADDR MACADDR SNMPDEVICEID NAME DESCRIPTION CONTACT LOCATION UPTIME DOMAIN TYPE / ) { if (exists $args->{$key}) { $xmltags->{COMMON}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpPrinter { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/NAME SERIALNUMBER COUNTER STATUS ERRORSTATE/ ) { if (exists $args->{$key}) { $xmltags->{PRINTERS}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpSwitchInfos { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/TYPE/) { if (exists $args->{$key}) { $xmltags->{SWITCHINFOS}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpFirewalls { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/SERIALNUMBER SYSTEM/) { if (exists $args->{$key}) { $xmltags->{FIREWALLS}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpLoadBalancer { my ($self,$args) = @_; my $xmltags=$self->{xmltags}; foreach my $key (qw/SERIALNUMBER SYSTEM MANUFACTURER TYPE/ ) { if (exists $args->{$key}) { $xmltags->{LOADBALANCERS}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpBlade { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/SERIALNUMBER SYSTEM/) { if (exists $args->{$key}) { $xmltags->{BLADES}[0]{$key}[0] = $args->{$key}; } } } sub setSnmpComputer { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; foreach my $key (qw/SYSTEM/) { if (exists $args->{$key}) { $xmltags->{COMPUTERS}[0]{$key}[0] = $args->{$key}; } } } sub addSnmpPrinterCartridge { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION TYPE LEVEL MAXCAPACITY COLOR/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{CARTRIDGES}},$content; } sub addSnmpPrinterTray { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/NAME DESCRIPTION LEVEL MAXCAPACITY/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{TRAYS}},$content; } sub addSnmpNetwork { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION MACADDR DEVICEMACADDR SLOT STATUS SPEED TYPE DEVICEADDRESS DEVICENAME DEVICEPORT DEVICETYPE TYPEMIB IPADDR IPMASK IPGATEWAY IPSUBNET IPDHCP DRIVER VIRTUALDEV/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{NETWORKS}},$content; } sub addSnmpBackPlane { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION FIRMWARE MANUFACTURER REFERENCE SERIALNUMBER TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{BACKPLANE}},$content; } sub addSnmpCard { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION REFERENCE FIRMWARE SOFTWARE REVISION SERIALNUMBER MANUFACTURER TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{CARDS}},$content; } sub addSnmpFan { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION REFERENCE REVISION SERIALNUMBER MANUFACTURER TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{FANS}},$content; } sub addSnmpPowerSupply { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/MANUFACTURER REFERENCE TYPE SERIALNUMBER DESCRIPTION REVISION/ ) { if (exists $args->{$key}) { $content->{$key}[0]=$args->{$key}; } } push @{$xmltags->{POWERSUPPLIES}},$content; } sub addSnmpSwitch { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/MANUFACTURER REFERENCE TYPE SOFTVERSION FIRMVERSION SERIALNUMBER REVISION DESCRIPTION/) { if (exists $args->{$key}) { $content->{$key}[0]=$args->{$key}; } } push @{$xmltags->{SWITCHS}},$content; } sub addSnmpLocalPrinter { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/NAME/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{LOCALPRINTERS}},$content; } sub addSnmpInput { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/DESCRIPTION TYPE/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{INPUTS}},$content; } sub addSnmpCPU { my ($self,$args) = @_; my $xmltags = $self->{xmltags}; my $content = {}; foreach my $key (qw/MANUFACTURER TYPE SPEED/) { if (exists $args->{$key}) { $content->{$key}[0] = $args->{$key}; } } push @{$xmltags->{CPUS}},$content; } #Subroutine to add 0 in 'Sun like' MAC address if needed sub padSnmpMacAddress { my ($self,$mac) = @_; my @splitedAddr = split(':', $mac); for (@splitedAddr) { unless ($_ =~ /\w{2}/) { $_ = sprintf("%02s", $_); } } $mac=join (':', @splitedAddr); return $mac; } sub cleanXml { my ($self,$content) = @_; my $logger = $self->{logger}; my $clean_content = encode('UTF-8', $content, Encode::FB_DEFAULT | Encode::LEAVE_SRC | Encode::FB_XMLCREF); $clean_content =~ tr/\x00-\x08\x0B\x0C\x0E-\x1F//d; # remove forbidden char in XML $logger->debug("cleanXml changed content") if ($content ne $clean_content); return $clean_content."\n"; } #Subroutine to read XML structure (returned by XML::Simple::XMLin) and encode content in utf8. sub readXml { my ($self, $xml, $forcearray) = @_; my $logger = $self->{logger}; my $content = XML::Simple::XMLin($xml, ForceArray => [@{$forcearray}]); foreach my $key (keys %$content) { if (grep(/^$key$/, @{$forcearray})) { #Forced array in XML parsing $self->parseXmlArray($content->{$key},$forcearray); } else { #Not a forced array in XML parsing if (ref ($content->{$key}) =~ /^HASH$/ && !keys %{$content->{$key}}) { # If empty hash from XMLin() $content->{$key} = ''; } else { encode('UTF-8', $content->{$key}, Encode::FB_DEFAULT) }; } } return $content; } #Subroutine to parse array in XML structure (returned by XML::Simple::XMLin) and encode it in utf8 sub parseXmlArray { my ($self,$array,$forcearray) = @_; foreach my $hash (@{$array}) { foreach my $key (keys %$hash) { if ( grep (/^$key$/,@$forcearray)) { #Forced array in XML parsing $self->parseXmlArray($hash->{$key},$forcearray); } else { #Not a forced array in XML parsing if (ref ($hash->{$key}) =~ /^HASH$/ && !keys %{$hash->{$key}}) { # If empty hash from XMLin() $hash->{$key} = ''; } else { encode('UTF-8', $hash->{$key}, Encode::FB_DEFAULT) }; } } } } #Subroutine to convert versions to numbers (with icutting or right padding if needed) # We create it because Perl 5.8 does not include version comparison modules or functions sub convertVersion { my ($self,$version,$length) = @_; $version =~ s/\.//g; #We convert to number my $ver_length = length ($version); if ($ver_length > $length) { # We cut the number $version = substr $version, 0, $length; } elsif ($ver_length < $length) { #We add 0 to the right $version = substr($version . (0 x $length), 0, $length); } return $version; } #We create this subroutine because MacOSX system_profiler XML output does not give all ##the neeeded data (for videos and sounds for example) sub get_sysprofile_devices_names { my ($self,$type) = @_; return(undef) unless -r '/usr/sbin/system_profiler'; my $output=`system_profiler $type`; my $name; my $names=[]; # Code inspired from Mac::Sysprofile 0.03 from Daniel Muey for(split /\n/, $output) { next if m/^\s*$/ || m/^\w/; if(m/^\s{4}\w/) { $name = $_; $name =~ s/^\s+//; $name =~ s/:.*$//; push(@$names,$name); } } return $names; } # Function getDmidecodeInfos. # sub getDmidecodeInfos { my @dmidecode=`dmidecode`; my ($info, $block, $type); foreach my $line (@dmidecode){ chomp $line; if ($line =~ /DMI type (\d+)/) { if ($block) { push (@{$info->{$type}}, $block); undef $block; } $type=$1; next; } next unless defined $type; next unless $line =~ /^\s+ ([^:]+) : \s (.*\S)/x; next if $2 eq 'N/A' || $2 eq 'Not Specified' || $2 eq 'Not Present' || $2 eq 'Unknown' || $2 eq '' || $2 eq '' || $2 eq ''; $block->{$1} = $2; } if ($block) { push(@{$info->{$type}}, $block); } return if keys %{$info} < 2; return $info; } ### Generic shared subroutines ##### sub can_run { my $self = shift; my $binary = shift; my $logger = $self->{logger}; my $calling_namespace = caller(0); chomp(my $binpath=`which $binary 2>/dev/null`); return unless -x $binpath; $self->{logger}->debug(" - $binary found"); 1; } sub can_load { my $self = shift; my $module = shift; my $logger = $self->{logger}; my $calling_namespace = caller(0); eval "package $calling_namespace; use $module;"; return if $@; $self->{logger}->debug(" - $module loaded"); 1; } sub can_read { my $self = shift; my $file = shift; my $logger = $self->{logger}; return unless -r $file; $self->{logger}->debug(" - $file can be read"); 1; } sub runcmd { my $self = shift; my $cmd = shift; my $logger = $self->{logger}; return unless $cmd; # $self->{logger}->debug(" - run $cmd"); return `$cmd`; } #### Old subroutines from the former Common.pm used by Download.pm ####### sub get_path{ my $self = shift; my $binary = shift; my $path; my @bin_directories = qw { /usr/local/sbin/ /sbin/ /usr/sbin/ /bin/ /usr/bin/ /usr/local/bin/ /etc/ocsinventory-client/}; print "\n=> retrieving $binary...\n" if $::debug; for (@bin_directories){ $path = $_.$binary,last if -x $_.$binary; } # For debbuging purposes if ($path){ print "=> $binary is at $path\n\n" if $::debug; } else { print "$binary not found (Maybe it is not installed ?) - Some functionnalities may lack !!\n\n"; } return $path; } sub already_in_array { my $self = shift; my $lookfor = shift; my @array = @_; foreach (@array){ if ($lookfor eq $_){ return 1 ; } } return 0; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Config.pm000066400000000000000000000175251432320066700215620ustar00rootroot00000000000000package Ocsinventory::Agent::Config; use strict; use Getopt::Long; our $VERSION = '2.10.0'; my $basedir = ''; my $default = { 'daemon' => 0, 'debug' => 0, 'devlib' => 0, 'force' => 0, 'help' => 0, 'info' => 1, 'lazy' => 0, 'local' => '', # 'logger' => 'Syslog,File,Stderr', 'logger' => 'Stderr', 'logfacility' => 'LOG_USER', 'logfile' => '', 'password' => '', 'proxy' => '', 'realm' => '', 'remotedir' => '/ocsinventory', # deprecated, give a complete URL to # --server instead 'server' => 'http://ocsinventory-ng/ocsinventory', 'stdout' => 0, 'tag' => '', 'user' => '', 'version' => 0, 'wait' => '', # 'xml' => 0, 'nosoftware'=> 0, 'delaytime' => '3600', # max delay time (seconds) 'backendCollectTimeout' => '600', # timeOut of process : see Backend.pm 'scanhomedirs' => 0, 'ssl' => 1, 'ca' => '', 'snmp' => 0, 'snmptimeout' => 3, 'snmpretry' => 2, # Other values that can't be changed with the # CLI parameters 'version' => $VERSION, 'deviceid' => '', 'basevardir'=> $basedir.'/var/lib/ocsinventory-agent', 'logdir' => $basedir.'/var/log/ocsinventory-agent', # 'pidfile' => $basedir.'/var/run/ocsinventory-agent.pid', }; sub new { my (undef, $params) = @_; my $self = {}; bless $self; $self->{file} = $params->{file}; $self->{config} = $default; $self->loadFromCfgFile(); return $self; } sub loadFromCfgFile { my $self = shift; my $config; $self->{config}{etcdir} = []; push (@{$self->{config}{etcdir}}, '/etc/ocsinventory'); push (@{$self->{config}{etcdir}}, '/usr/local/etc/ocsinventory'); push (@{$self->{config}{etcdir}}, '/etc/ocsinventory-agent'); push (@{$self->{config}{etcdir}}, $ENV{HOME}.'/.ocsinventory'); # Should I? my $file; if (!$file || !-f $file) { foreach (@{$self->{config}{etcdir}}) { $file = $_.'/ocsinventory-agent.cfg'; last if -f $file; } return $config unless -f $file; } $self->{configfile} = $file; if (!open (CONFIG, '<'.$file)) { print(STDERR "Config: Failed to open $file\n"); return $config; } foreach () { s/^#.+//; if (/(\w+)\s*=\s*(.+)/) { my $key = $1; my $val = $2; # Remove the quotes $val =~ s/\s+$//; $val =~ s/^'(.*)'$/$1/; $val =~ s/^"(.*)"$/$1/; $self->{config}{lc($key)} = $val; } } close CONFIG; } sub loadUserParams { my $self = shift; my %options = ( "backend-collect-timeout=s" => \$self->{config}{backendCollectTimeout}, "basevardir=s" => \$self->{config}{basevardir}, "d|daemon" => \$self->{config}{daemon}, "debug" => \$self->{config}{debug}, "devlib" => \$self->{config}{devlib}, "f|force" => \$self->{config}{force}, "h|help" => \$self->{config}{help}, "i|info" => \$self->{config}{info}, "lazy" => \$self->{config}{lazy}, "l|local=s" => \$self->{config}{local}, "logfile=s" => \$self->{config}{logfile}, "nosoftware" => \$self->{config}{nosoftware}, "p|password=s" => \$self->{config}{password}, "P|proxy=s" => \$self->{config}{proxy}, "r|realm=s" => \$self->{config}{realm}, "R|remotedir=s" => \$self->{config}{remotedir}, "s|server=s" => \$self->{config}{server}, "stdout" => \$self->{config}{stdout}, "t|tag=s" => \$self->{config}{tag}, "u|user=s" => \$self->{config}{user}, "version" => \$self->{config}{version}, "w|wait=s" => \$self->{config}{wait}, # "x|xml" => \$self->{config}{xml}, "delaytime" => \$self->{config}{delaytime}, "scan-homedirs" => \$self->{config}{scanhomedirs}, "nolocal" => \$self->{config}{nolocal}, "ssl=s" => \$self->{config}{ssl}, "ca=s" => \$self->{config}{ca}, "snmp=s" => \$self->{config}{snmp}, "snmptimeout=s" => \$self->{config}{snmptimeout}, "snmpretry=s" => \$self->{config}{snmpretry}, ); $self->help() if (!GetOptions(%options) || $self->{config}{help}); $self->version() if $self->{config}{version} eq 1; } sub help { my ($self, $error) = @_; if ($error) { chomp $error; print "ERROR: $error\n\n"; } if ($self->{configfile}) { print STDERR "Setting initialised with values retrieved from ". "the config found at ".$self->{configfile}."\n"; } print STDERR "\n"; print STDERR "Usage:\n"; print STDERR "\t--backend-collect-timeout set a max delay time of one action (search package id, ...) is set (".$self->{config}{backendCollectTimeout}.")\n"; print STDERR "\t--basevardir=/path indicate the directory where should the agent store its files (".$self->{config}{basevardir}.")\n"; print STDERR "\t-d --daemon detach the agent in background (".$self->{config}{daemon}.")\n"; print STDERR "\t --debug debug mode (".$self->{config}{debug}.")\n"; print STDERR "\t --devlib search for Backend mod in ./lib only (".$self->{config}{devlib}.")\n"; print STDERR "\t-f --force always send data to server (Don't ask before) (".$self->{config}{force}.")\n"; print STDERR "\t-i --info verbose mode (".$self->{config}{info}.")\n"; print STDERR "\t--lazy do not contact the server more than one time during the PROLOG_FREQ (".$self->{config}{lazy}.")\n"; print STDERR "\t-l --local=DIR do not contact server but write inventory in DIR directory in XML (".$self->{config}{local}.")\n"; print STDERR "\t --logfile=FILE log message in FILE (".$self->{config}{logfile}.")\n"; print STDERR "\t-p --password=PWD password for server auth\n"; print STDERR "\t-P --proxy=PROXY proxy address. e.g: http://user:pass\@proxy:port (".$self->{config}{proxy}.")\n"; print STDERR "\t-r --realm=REALM realm for server auth. e.g: 'Restricted Area' (".$self->{config}{realm}.")\n"; print STDERR "\t-s --server=uri server uri (".$self->{config}{server}.")\n"; print STDERR "\t --stdout do not write or post the inventory but print it on STDOUT\n"; print STDERR "\t-t --tag=TAG use TAG as tag (".$self->{config}{tag}."). Will be ignored by server if a value already exists.\n"; print STDERR "\t-u --user=USER user for server auth (".$self->{config}{user}.")\n"; print STDERR "\t --version print the version\n"; print STDERR "\t-w --wait=seconds wait a random period before contacting server like --daemon does (".$self->{config}{wait}.")\n"; # print STDERR "\t-x --xml write output in a xml file ($self->{config}{xml})\n"; print STDERR "\t--nosoftware do not return installed software list (".$self->{config}{nosoftware}.")\n"; print STDERR "\t--delaytime set a max delay time (in second) if no PROLOG_FREQ is set (".$self->{config}{delaytime}.")\n"; print STDERR "\t--scan-homedirs permit to scan home user directories (".$self->{config}{scanhomedirs}.")\n" ; print STDERR "\t--ssl=0|1 disable or enable SSL communications check (".$self->{config}{ssl}.")\n" ; print STDERR "\t--ca=FILE path to CA certificates file in PEM format (".$self->{config}{ca}.")\n" ; print STDERR "\n"; print STDERR "Manpage:\n"; print STDERR "\tSee man ocsinventory-agent\n"; print STDERR "\n"; print STDERR "Ocsinventory-Agent is released under GNU GPL 2 license\n"; exit 1; } sub version { print "Ocsinventory unified agent for UNIX, Linux and MacOSX (".$VERSION.")\n"; exit 0; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Encrypt.pm000066400000000000000000000002271432320066700217700ustar00rootroot00000000000000package Ocsinventory::Agent::Encrypt; use MIME::Base64; sub getClearText { my ($encodedpass) = @_; return decode_base64($encodedpass); } 1;UnixAgent-2.10.0/lib/Ocsinventory/Agent/Hooks.pm000066400000000000000000000060251432320066700214310ustar00rootroot00000000000000package Ocsinventory::Agent::Hooks; # This package give possibility to use hooks in unified unix agent. use strict; use warnings; #use FindBin qw($Bin); sub new { my (undef, $context) = @_; my $self = {}; $self->{accountinfo} = $context->{accountinfo}; $self->{accountconfig} = $context->{accountconfig}; my $logger = $self->{logger}=$context->{logger}; $self->{config} = $context->{config}; $self->{dontuse} = 1; my $modulefile; foreach (@{$self->{config}->{etcdir}}) { $modulefile = $_.'/modules.conf'; if (-f $modulefile) { if (do $modulefile) { $logger->debug("Turns hooks on for $modulefile"); $self->{dontuse} = 0; last; } else { $logger->debug("Failed to load `$modulefile': $?"); } } } if ($self->{dontuse}) { $logger->debug("No modules will be used."); } else { my $ocsAgentServerUri; # to avoid a warning if $self->{config}->{server} is not defined if ($self->{config}->{server}) { $ocsAgentServerUri = "http://".$self->{config}->{server}.$self->{config}->{remotedir}; } if ($self->{config}->{debug}) { $::debug = 2; } } # Create objects for modules foreach my $package (searchModules(\%Ocsinventory::Agent::Modules::)){ my $module = new $package($context); my $name = $module->{structure}->{name}; # Store the reference in a key to access modules easily $self->{modules}->{$name}=$module; } bless $self; } # This function recursively searches for modules in a given namespace # Param: a hash reference to the namespace # Returns: an array with modules fully qualified names sub searchModules { my $symbols_href = shift; my @modules_list = (); my %symbols_h = %{$symbols_href}; my @symbols_a = sort(keys(%symbols_h)); foreach(@symbols_a){ if ($_ eq 'new'){ # Found a "new" method -> this is a usable module my $module_fqn = $symbols_h{$_}; # Keep the module fqn, without '*' at start $module_fqn =~ s/\*?(.+)::new$/$1/; push(@modules_list, $module_fqn); } elsif (substr($_, -2) eq '::') { # If we meet a package, continue walking push(@modules_list, searchModules($symbols_h{$_})); } } return @modules_list; } sub run { my ($self, $args, $moduleparam) = @_; return if $self->{dontuse}; my $name = $args->{name}; #type of hook asked my $logger = $self->{logger}; $logger->debug("Calling handlers : `$name'"); # Launching hook for modules if not 'undef' and if modules are not disabled by start_handler for (keys %{$self->{modules}}) { my $module = $self->{modules}->{$_}; unless ($module->{disabled}) { my $hook = $module->{structure}->{$name}; if ($hook) { $module->$hook($moduleparam); } } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/000077500000000000000000000000001432320066700214155ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Apache/000077500000000000000000000000001432320066700225765ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Apache/Vhosts/000077500000000000000000000000001432320066700240645ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Apache/Vhosts/Common.pm000066400000000000000000000246101432320066700256550ustar00rootroot00000000000000############################################################################### # Apache::Vhosts::Common - Common stuff for apache vhosts inventory # # Author: Linkbynet ############################################################################### package Ocsinventory::Agent::Modules::Apache::Vhosts::Common; =head1 NAME Apache::Vhosts::Common - Lib for common operations in vhosts inventory =head1 DESCRIPTION This package is meant to contain common functions used by OCS modules for Apache virtualhosts. For example, we could have two OCS modules: =over =item ApacheVhostsPackaged which would deal with packaged apache setups =item ApacheVhostsCompiled which would deal with compiled apache versions =back At different times, these modules still would need to do the same things, such as parsing apache configuration files, reading and extracting information from a vhost dump, reading a x509 certificate with openssl, ... To avoid code duplication, the specific modules can call the functions contained in this common package. =head2 Exports The module exports the following functions: =over =item C =item C =back =cut use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&readVhostsDump &readVhostConfFile); use strict; use warnings; #### BEGIN: Define regexes # Useful lines in vhosts dump (NameVirtualHosts and IP vhosts only) my $dumpline_name_re = qr/^port ([0-9]+) namevhost (\S+) \((\S+):([0-9]+)\)/; my $dumpline_ip_re = qr/^([0-9.]+):([0-9]+)\s+(\S+) \((\S+):([0-9]+)\)/; # "subject=" line of openssl x509 command output (used to extract CN) my $subject_cn_re = qr/^subject=.*\/CN=([^\s\/]+).*$/; # Simplistic email address pattern my $damn_simple_email_re = qr/.+\@.+\..+/; #### END: Define regexes =head2 readVhostsDump() Return an array of hashes with the virtualhosts found thanks to Apache's vhosts dump (C command). =head3 Return type The function returns a reference to an array of hashes. =head3 Process The function's workflow is as follows: =over =item 1 Open C command output, with the current configuration file =item 2 Read dump line by line to match IP-based or name-based virtualhost information (both types of lines should be recognized): port 80 namevhost mynamevhost.fr (/etc/httpd/.../10-mynamevhost.conf:50) 10.0.0.1:80 myvhost myipvhost.fr (/etc/httpd/.../20-myipvhost.conf:1) =item 3 Create a hash with the virtualhost's data We put the following attributes in it: (string) computedname, (int) port, (string) srvname, (string) vhostfile, (string) vhostline, (string) docroot, (bool) ssl At this stage we do not know docroot or ssl, so they are "/nonexistent" and false (0), respectively. =item 4 Push the vhost hash to the array. =back =head3 Return example [ { 'computedname' => "[httpd] myvhost.fr:80", 'port' => 80, 'srvname' => 'myvhost.fr', 'vhostfile' => '/etc/httpd/conf.d/10-myvhost.conf', 'vhostline' => 1, 'docroot' => '/nonexistent', 'ssl' => 0 }, { 'computedname' => "[httpd] myvhost.fr:443", 'port' => 443, 'srvname' => 'myvhost.fr', 'vhostfile' => '/etc/httpd/conf.d/10-myvhost.conf', 'vhostline' => 20, 'docroot' => '/nonexistent', 'ssl' => 0 } ] =head3 Calling my $vhosts = readVhostsDump($httpd_bin, $httpd_conf_file, $logger); =over =item Parameter: $httpd_bin (string) Path to the httpd binary to execute (for example: C). Specific options (such as C<-D> parameters) may be added to the string. =item Parameter: $httpd_conf_file (string) Path to the main httpd configuration file (for example: C). =item Parameter: $logger (reference to OCS logger instance) To make use of OCS logging capabilities within the function. =back =cut sub readVhostsDump { my ($httpd_bin, $httpd_conf_file, $logger) = @_; my @vhosts = (); # 2>&1 because some very old Apache versions write the vhosts dump # on stderr! open(my $DUMPFILE, "$httpd_bin -S -f $httpd_conf_file 2>&1 |") or die("Cannot open \$(httpd -S -f $httpd_conf_file) $!"); while (<$DUMPFILE>) { chomp; s/^\s+//; # lstrip my ($ip, $port, $srvname, $vhostfile, $vhostline); if ($_ =~ $dumpline_name_re) { ($port, $srvname, $vhostfile, $vhostline) = ($1, $2, $3, $4); } elsif ($_ =~ $dumpline_ip_re) { ($ip, $port, $srvname, $vhostfile, $vhostline) = ($1, $2, $3, $4, $5); } if (defined($port)) { # sufficient test to know if line was found my %vhost = ( 'computedname' => "$srvname:$port", 'port' => int($port), 'srvname' => $srvname, 'vhostfile' => $vhostfile, 'vhostline' => int($vhostline), 'docroot' => '/nonexistent', 'ssl' => 0 ); push(@vhosts, \%vhost); } } close($DUMPFILE); return \@vhosts; } =head2 readVhostConfFile() Enhance a virtualhost's information with elements found when parsing the vhost's configuration file. =head3 Return type The function returns nothing. It only operates on the (referenced) vhost hash it got in parameter. =head3 Process The function must read the apache configuration file in which the vhost gets defined ( block). The path to the particular configuration file and the line number of the vhost declaration are known in the C and C attributes, thanks to the vhost dump. The function's process, for the given vhost, is as follows: =over =item 1 Open the configuration file at C =item 2 Read line by line, waiting to be at correct line number (C) to start searching for information. =item 3 Search for the following information in the and enhance the given vhost hash with: =over =item * docroot (string) the value of the C directive =item * ssl (bool) we turn it to true if we find a C directive =item * sslcertpath (string) value of the C directive, if such a directive is present =back =item 4 File reading stops when we find the C<< >> closing block (in case multiple vhosts are declared in the same configuration file). =back =head3 Calling foreach my $vhost (@$vhosts) # Generally { readVhostConfFile($vhost, $httpd_basedir); } =over =item Parameter: $vhost (reference to hash) The virtualhost hash to enhance. =item Parameter: $httpd_basedir (string) The path to base directory of httpd, in case we encounter a relative path in C and need to complete it. B: the given path is expected to end with a slash '/', for example: "/etc/httpd/" =back =cut sub readVhostConfFile { my ($vhost, $relpath_prefix) = @_; my $nr = 0; open(my $VHOST_FILE, '<', $vhost->{'vhostfile'}) or die ("Cannot open $vhost->{'vhostfile'}"); while (my $vline = <$VHOST_FILE>) { # Waiting the correct line to start reading next if ++$nr < $vhost->{'vhostline'}; $vline =~ s/^\s+//; # lstrip # Get various vhost properties # -- DocumentRoot if ($vline =~ m/^DocumentRoot ["']?([^\s'"]+)["']?/i) { $vhost->{'docroot'} = $1; } # -- SSLEngine (bool) elsif ($vline =~ m/^SSLEngine on/i) { $vhost->{'ssl'} = 1; } # -- SSLCertificateFile path elsif ($vline =~ m/^SSLCertificateFile ["']?([^\s'"]+)["']?/i) { $vhost->{'sslcertpath'} = $1; readVhostSSLCert($vhost, $relpath_prefix); } # Stop reading on block closing tag last if $vline =~ m@^@i; } close($VHOST_FILE); } ############################################################################### # readVhostSSLCert() - read a vhost's SSL certificate to get its details # # Invoking: # readVhostSSLCert($vhost, $relpath_prefix) # # Params: # - $vhost - a reference to the vhost hash # - $relpath_prefix - the prefix to use in case the SSLCertificateFile path # is a relative one, in order to make it an absolute path # # Returns: # nothing. # # We read the certificate with an "openssl x509" command. # We try to retrieve the following fields: # # - "subject" (specifically to get the CN) # - "notBefore" and "notAfter" dates # - "email" (we catch the first email returned) # # The certificate details found here are gently stuffed in # $vhost->{'sslcertdetails'}, as follows: # # { # # (in a vhost here) # # [...] # 'srvname' => 'myvhost.fr', # 'ssl' => 1, # 'sslcertpath' => 'conf/ssl/myvhost.fr.crt', # 'sslcertdetails' => { # 'cn' => 'myvhost.fr', # 'startdate' => '31/12/2012', # 'enddate' => '31/12/2042', # 'email' => 'certadmin-email@example.com' # } # } sub readVhostSSLCert { my ($vhost, $relpath_prefix) = @_; $vhost->{'sslcertdetails'} = (); my $sslcertpath = $vhost->{'sslcertpath'}; my $absolute = (substr($sslcertpath, 0, 1) eq '/'); if (!$absolute) { $sslcertpath = "${relpath_prefix}${sslcertpath}"; } open(my $OPENSSL_CMD, "openssl x509 -in \"$sslcertpath\" -noout -subject -dates -email |"); while (my $oline = <$OPENSSL_CMD>) { if ($oline =~ $subject_cn_re) { $vhost->{'sslcertdetails'}->{'cn'} = $1; } elsif ($oline =~ m/^notBefore=(.+)$/) { $vhost->{'sslcertdetails'}->{'startdate'} = formatDate($1); } elsif ($oline =~ m/^notAfter=(.+)$/) { $vhost->{'sslcertdetails'}->{'enddate'} = formatDate($1); } elsif ($oline =~ $damn_simple_email_re) { chomp $oline; $vhost->{'sslcertdetails'}->{'email'} = $oline; # stop processing from the first email address # (it should be the last line of the command output) last; } } close($OPENSSL_CMD); } ############################################################################### # formatDate() - reformat date, with help of system command date(1) # # Invoking: # formatDate($date) # # Params: # - $date - the date string to reformat, in a format parsable by date(1) # # Returns: # the ISO 8601 (%Y-%m-%d) formatted date (string) # sub formatDate { my ($date) = @_; my $formattedDate = `date --date="$date" --iso-8601`; chomp $formattedDate; return $formattedDate; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Apache/VhostsEL.pm000066400000000000000000000125741432320066700246540ustar00rootroot00000000000000################################################################################ ## Author: Linkbynet ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ## ## ############################################################################# ## ## This module retrieves information about Apache virtualhosts. ## ## It handles setups where Apache was installed by package (Enterprise Linux ## distributionsi family: RHEL, CentOS, Fedora) with configuration in standard ## dir /etc/httpd. ## ## Information gets written to tags at XPaths: ## ## /REQUEST/CONTENT/APACHE_VHOST ## /REQUEST/CONTENT/APACHE_VHOST_CERTIFICATE ## ## Example: ## ## ## ## /var/www/example.com ## example.com:443 ## example.com ## 443 ## ## ## ## example.com ## 30/06/2023 ## 01/07/2013 ## example.com:443 ## certmaster@example.com ## ## ## ################################################################################ package Ocsinventory::Agent::Modules::Apache::VhostsEL; use strict; use warnings; use Ocsinventory::Agent::Modules::Apache::Vhosts::Common; sub new { my $name = "apachevhosts_el"; # Set the name of your module here my (undef,$context) = @_; my $self = {}; # Create a special logger for the module $self->{logger} = new Ocsinventory::Logger ({ config => $context->{config} }); $self->{logger}->{header} = "[$name]"; $self->{context} = $context; $self->{structure} = { name => $name, start_handler => $name."_start_handler", # or undef if don't use this hook prolog_writer => undef, # or undef if don't use this hook prolog_reader => undef, # or undef if don't use this hook inventory_handler => $name."_inventory_handler", # or undef if don't use this hook end_handler => undef # or undef if don't use this hook }; # Path to httpd bin $self->{modinfos}->{httpd_bin} = '/usr/sbin/httpd'; # Path to httpd dir in /etc # (basis for relative paths or SSLCertificateFile, for example) $self->{modinfos}->{httpd_basedir} = '/etc/httpd/'; # Path to httpd conf dir $self->{modinfos}->{httpd_confdir} = '/etc/httpd/conf'; # Path to httpd main conf file $self->{modinfos}->{httpd_conf_file} = '/etc/httpd/conf/httpd.conf'; bless $self; } ######### Hook methods ############ sub apachevhosts_el_start_handler { # Use this hook to test prerequisites needed by module and disble it if needed my $self = shift; my $logger = $self->{logger}; my $prerequisites = 1; # TESTS: # # 1 - Apache HTTPD server is installed the packet way (conf dir present) # 2 - We can execute the httpd binary # 3 - We can read the main conf file (httpd.conf or equivalent) if (! -d $self->{modinfos}->{httpd_confdir}) { # No apache found on this server (or not in the expected place) $logger->debug("- no $self->{modinfos}->{httpd_confdir} directory found"); $prerequisites = 0; } elsif (! -x $self->{modinfos}->{httpd_bin}) { $logger->debug("- no executable $self->{modinfos}->{httpd_bin} found"); $prerequisites = 0; } elsif (! -f $self->{modinfos}->{httpd_conf_file}) { $logger->debug("- did not find $self->{modinfos}->{httpd_conf_file} file"); $prerequisites = 0; } if ($prerequisites == 0) { $self->{disabled} = 1; # Use this to disable the module $logger->debug("Humm my prerequisites are not OK...disabling module :( :( "); } } sub apachevhosts_el_inventory_handler { # Use this hook to add or modify entries in the inventory XML my $self = shift; my $logger = $self->{logger}; my $common = $self->{context}->{common}; $logger->debug(__PACKAGE__); # Reading httpd -S output my $vhosts = readVhostsDump($self->{modinfos}->{httpd_bin}, $self->{modinfos}->{httpd_conf_file}, $logger); # Enhancing information by parsing each vhost's configuration foreach my $vhost (@$vhosts) { readVhostConfFile($vhost, $self->{modinfos}->{httpd_basedir}); } # Write OCS XML foreach my $vhost (@$vhosts) { push @{$common->{'xmltags'}->{'APACHE_VHOST'}}, { "NAME" => [$vhost->{'computedname'}], "URL" => [$vhost->{'srvname'}], "DIRECTORY" => [$vhost->{'docroot'}], "PORT_NUMBER" => [$vhost->{'port'}] }; if ($vhost->{'ssl'}) { push @{$common->{'xmltags'}->{'APACHE_VHOST_CERTIFICATE'}}, { "SITE" => [$vhost->{'computedname'}], "DOMAINNAME" => [$vhost->{'sslcertdetails'}->{'cn'}], "REGISTRATIONDATE" => [$vhost->{'sslcertdetails'}->{'startdate'}], "EXPIRATIONDATE" => [$vhost->{'sslcertdetails'}->{'enddate'}], "EMAIL" => [$vhost->{'sslcertdetails'}->{'email'}] }; } } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Databases/000077500000000000000000000000001432320066700233045ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Databases/Oracle.pm000066400000000000000000000065711432320066700250600ustar00rootroot00000000000000################################################################################ ## Author: Linkbynet ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ## ## ############################################################################# ## ## This module finds and retrieves information about Oracle instances. ## ## First elements are taken from the /etc/oratab file. For each instance listed ## in it, we get the precise version number (with tnsping utility) and bundle ## name by reading the file below: ## ## $ORACLE_HOME/inventory/Components21/oracle.server/*/context.xml ## ## Information gets written to tags at XPaths: ## ## /REQUEST/CONTENT/ORACLE_INSTANCE ## ## Example: ## ## ## ## 0 ## Standard ## EXDB01 ## 11.2.0.4.0 ## ## ## ################################################################################ package Ocsinventory::Agent::Modules::Databases::Oracle; use strict; use warnings; use Ocsinventory::Agent::Modules::Databases::Oracle::Instances; sub new { my $name = "oracleinstances"; # Set the name of your module here my (undef,$context) = @_; my $self = {}; # Create a special logger for the module $self->{logger} = new Ocsinventory::Logger ({ config => $context->{config} }); $self->{logger}->{header} = "[$name]"; $self->{context} = $context; $self->{structure} = { name => $name, start_handler => $name."_start_handler", # or undef if don't use this hook prolog_writer => undef, # or undef if don't use this hook prolog_reader => undef, # or undef if don't use this hook inventory_handler => $name."_inventory_handler", # or undef if don't use this hook end_handler => undef # or undef if don't use this hook }; bless $self; } ######### Hook methods ############ sub oracleinstances_start_handler { # Use this hook to test prerequisites needed by module and disble it if needed my $self = shift; my $logger = $self->{logger}; my $prerequisites = 1; if (!(-f '/etc/oratab' && -r '/etc/oratab')) { $logger->debug("- no readable /etc/oratab file"); $prerequisites = 0; } if ($prerequisites == 0) { $self->{disabled} = 1; # Use this to disable the module $logger->debug("Humm my prerequisites are not OK...disabling module :( :( "); } } sub oracleinstances_inventory_handler { # Use this hook to add or modify entries in the inventory XML my $self = shift; my $logger = $self->{logger}; my $common = $self->{context}->{common}; $logger->debug(__PACKAGE__); my $database = getInstances(); # Write to OCS XML foreach my $instance (keys(%$database)) { push @{$common->{xmltags}->{ORACLE_INSTANCE}}, { 'NAME' => [$instance], 'AUTOSTART' => [$database->{$instance}->{'AUTOSTART'}], 'VERSION' => [$database->{$instance}->{'VERSION'}], 'BUNDLE' => [$database->{$instance}->{'BUNDLE'}] }; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Databases/Oracle/000077500000000000000000000000001432320066700245115ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Databases/Oracle/Instances.pm000066400000000000000000000135341432320066700270040ustar00rootroot00000000000000################################################################################ # Oracle::Instances - Common stuff to get Oracle instances and versions # # Author: Linkbynet ################################################################################ package Ocsinventory::Agent::Modules::Databases::Oracle::Instances; =head1 NAME Oracle::Instances - Lib for Oracle instances and versions retrieval =head1 DESCRIPTION This module provides a function to retrieve information about Oracle instances on the current server. To do so, the function reads the /etc/oratab file to find instances and then: =over =item 1 Checks the existence of the ORACLE_HOME directory. =item 2 Add (ORACLE_SID, ORACLE_HOME, AUTOSTART) to the databases hash. =item 3 Go and find server version and bundle for each ORACLE_HOME. This information is found by executing the C command and by reading the following XML file: $ORACLE_HOME/inventory/Components21/oracle.server/*/context.xml The following bundles are known: SE1 (Standard Edition One), SE (Standard Edition), EE (Enterprise Edition), XE (Express Edition). =item 4 Returns the database hash as follows: { 'SID' => { 'BUNDLE' => 'Standard', 'AUTOSTART' => 0, 'ORA_HOME' => '/home/oracle/oracle/product/11.2.0', 'VERSION' => '11.2.0.4.0' } }; =back Optionally, you can call C to return only the hash of versions and bundles, instead of the complete instances hash: { '/home/oracle/oracle/product/11.2.0' => { 'BUNDLE' => 'Standard', 'VERSION' => '11.2.0.4.0' } }; In that case, you just have to pass parameter 1 (integer one) when calling the function. =head2 Exports The module exports the C function. =cut use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&getInstances); use strict; use warnings; ######### BEGIN: Constants ############ # Known Oracle editions. The two-letter codes are the ones which can be # encountered in the context.xml file. my %bundles = ( 'SE1' => 'Standard One', 'SE' => 'Standard', 'EE' => 'Enterprise', 'XE' => 'Express' ); ######### END: Constants ############ =head2 getInstances() =head3 Synopsis getInstances($version_only) where $versions_only is a integer (tested as a bool) my $database = getInstances() my $versions = getInstances(1) =head3 Return values The function returns a hash reference containing the instances or versions. =cut sub getInstances { my $versions_only = shift; my %database; my %versions; # First, read the /etc/oratab to find out Oracle instances # Here we already get the SID, path and autostart open(my $ORATAB, '<', '/etc/oratab') or die("Cannot open /etc/oratab $!"); while (my $oratab_line = <$ORATAB>) { chomp $oratab_line; next if $oratab_line =~ /^(#|$)/; # skip comments and empty lines my ($ora_sid, $ora_home, $dbstart_yn) = split(/:/, $oratab_line); # Keep existing instances only if (-d $ora_home) { $database{$ora_sid} = { 'ORA_HOME' => $ora_home, 'AUTOSTART' => $dbstart_yn eq 'Y' ? 1 : 0 }; } } close($ORATAB); # Retrieve version and bundle information in %versions # and put information in global %database hash too foreach my $ora_sid (keys(%database)) { my $ora_home = $database{$ora_sid}{'ORA_HOME'}; unless (exists($versions{$ora_home})) { $versions{$ora_home} = _getVersionAndBundle($ora_home); } my $version_bundle = $versions{$ora_home}; $database{$ora_sid}{'VERSION'} = $version_bundle->{'VERSION'}; $database{$ora_sid}{'BUNDLE'} = $version_bundle->{'BUNDLE'}; } # Return complete database hash or only version and bundle, according to # $versions_only argument if ($versions_only) { return \%versions; } else { return \%database; } } # _getVersionAndBundle($ora_home) # # Simple method building a hash with two keys 'VERSION' and 'BUNDLE' and their # values. # # Return: a hash reference sub _getVersionAndBundle { my $ora_home = shift; my %version_bundle = ( 'VERSION' => _getVersion($ora_home), 'BUNDLE' => _getBundle($ora_home) ); return \%version_bundle; } # _getVersion($ora_home) # # Find Oracle server version installed in ORACLE_HOME. # # We are using the tnsping command for that. # Return: the version string (for example "11.2.0.4.0" or "N/A" by default) sub _getVersion { my $ora_home = shift; my $version = 'N/A'; my $tnsping = "$ora_home/bin/tnsping"; if (-x $tnsping) { open(my $TNSPING_OUT, "$tnsping localhost |") or die("Cannot exec tnsping $!"); while (my $tp_line = <$TNSPING_OUT>) { if ($tp_line =~ m/^TNS Ping Utility for Linux: Version ([0-9.]+)/) { $version = $1; } } close($TNSPING_OUT); } return $version; } # _getBundle($ora_home) # # Find bundle version, reading a context.xml file down below ORACLE_HOME. # # Return: the full name of the install type (e.g. Standard or Enterprise) or, # by default, "N/A" sub _getBundle { my $ora_home = shift; my $bundle = 'N/A'; my $xml_re = qr/^\s*) { if ($xml_line =~ $xml_re) { $xml_line =~ $type_re; my $abbr = $1; $bundle = $bundles{$abbr} if exists($bundles{$abbr}); last; } } close($CONTEXT_XML); } return $bundle; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Download.pm000066400000000000000000000757731432320066700235450ustar00rootroot00000000000000############################################################################### ## OCSINVENTORY-NG ## Copyleft Pascal DANEK 2005 ## Web : http://ocsinventory.sourceforge.net ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ # Function by hook: # -download_prolog_reader, download_message, download # -download_inventory_handler # -download_end_handler, begin, done, clean, finish, period, download, execute, # check_signature and build_package package Ocsinventory::Agent::Modules::Download; use strict; use Fcntl qw/:flock/; use XML::Simple; use LWP::UserAgent; use Compress::Zlib; use Digest::MD5; use File::Path; use Socket; # Can be missing. By default, we use MD5 # You have to install it if you want to use SHA1 digest eval{ require Digest::SHA1 }; #Global vars my $ua; my $download_config; my @prior_pkgs; sub new { my $name="download"; #Set the name of your module here my (undef,$context) = @_; my $self = {}; # Create a special logger for the module $self->{logger} = new Ocsinventory::Logger ({ config => $context->{config}, }); # We use the common object for the module $self->{common} = $context->{common}; $self->{context} = $context; $self->{logger}->{header}="[$name]"; $self->{structure} = { name => $name, start_handler => $name."_start_handler", prolog_writer => undef, prolog_reader => $name."_prolog_reader", inventory_handler => $name."_inventory_handler", end_handler => $name."_end_handler" }; $self->{settings} = { https_port => '443', # Time to wait between scheduler periods, scheduling cycles and fragments downloads frag_latency_default => 10, period_latency_default => 0, cycle_latency_default => 10, max_error_count => 30, # Number of loops for one period period_lenght_default => 10, }; $self->{messages} = { # Errors code_success => 'SUCCESS', success_already_setup => 'SUCCESS_ALREADY_SETUP', err_bad_id => 'ERR_BAD_ID', err_download_info => 'ERR_DOWNLOAD_INFO', err_bad_digest => 'ERR_BAD_DIGEST', err_download_pack => 'ERR_DOWNLOAD_PACK', err_build => 'ERR_BUILD', err_execute => 'ERR_EXECUTE', err_clean => 'ERR_CLEAN', err_timeout => 'ERR_TIMEOUT', }; # Special hash for packages $self->{packages}= {}; bless $self; } sub download_start_handler { my $self = shift; my $logger = $self->{logger}; my $common = $self->{context}->{common}; my $config = $self->{context}->{config}; $logger->debug("Calling download_start_handler"); # Disabling module if local mode if ($config->{stdout} || $config->{local}) { $self->{disabled} = 1; $logger->info("Agent is running in local mode...disabling module"); } # If we cannot load prerequisite, we disable the module if ($common->can_load('LWP')) { my $lwp_version = $LWP::VERSION; $lwp_version=$self->{common}->convertVersion($lwp_version,3); if ($lwp_version > 583) { #Newer LWP version unless ($common->can_load('LWP::Protocol::https')) { $self->{disabled} = 1; $logger->error("LWP::Protocol::https perl module is missing !!"); $logger->error("Humm my prerequisites are not OK...disabling module :( :("); } } else { unless ($common->can_load('Crypt::SSLeay')) { $self->{disabled} = 1; $logger->error("Crypt::SSLeay perl module is missing !!"); $logger->error("Humm my prerequisites are not OK...disabling module :( :("); } } } else { $self->{disabled} = 1; $logger->error("LWP perl module is missing !!"); $logger->error("Humm my prerequisites are not OK...disabling module :( :("); } } sub download_prolog_reader{ #Read prolog response my ($self,$prolog) = @_; my $context = $self->{context}; my $logger = $self->{logger}; my $config = $self->{context}->{config}; my $network = $self->{context}->{network}; my $common = $self->{common}; my $settings = $self->{settings}; my $messages = $self->{messages}; my $packages = $self->{packages}; $logger->debug("Calling download_prolog_reader"); $logger->debug($prolog); $prolog = XML::Simple::XMLin( $prolog, ForceArray => ['OPTION', 'PARAM']); my $option; # Create working directory my $opt_dir = $context->{installpath}.'/download'; mkdir($opt_dir) unless -d $opt_dir; # We create a file to tell to download process that we are running open SUSPEND, ">$opt_dir/suspend"; close(SUSPEND); # Create history file if needed unless(-e "$opt_dir/history"){ open HISTORY, ">$opt_dir/history" or die("Cannot create history file: $!"); close(HISTORY); } # Create lock file if needed unless(-e "$opt_dir/lock"){ open LOCK, ">$opt_dir/lock" or die("Cannot create lock file: $!"); close(LOCK); } # Retrieve our options for $option (@{$prolog->{OPTION}}){ if ($option->{NAME} =~/download/i){ for (@{ $option->{PARAM} } ) { # Type of param if ($_->{'TYPE'} eq 'CONF'){ # Writing configuration open CONFIG, ">$opt_dir/config" or die("Cannot open/create config file ($opt_dir/config)"); if (flock(CONFIG, LOCK_EX)){ $logger->debug("Writing config file."); print CONFIG XMLout($_, RootName => 'CONF'); close(CONFIG); $download_config = $_; } else { $logger->error("Cannot lock config file !!"); close(CONFIG); return 0; } # Apply config # ON ? if ($_->{'ON'} == '0'){ $logger->info("Download is off."); open LOCK, "$opt_dir/lock" or die("Cannot open lock file: $!"); if (flock(LOCK, LOCK_EX|LOCK_NB)){ close(LOCK); unlink("$opt_dir/suspend"); return 0; } else { $logger->debug("Try to kill current download process..."); my $pid = ; close(LOCK); $logger->debug("Sending USR1 to $pid..."); if (kill("USR1", $pid)){ $logger->debug("Success."); } else { $logger->debug("Failed."); } return 0; } } # Maybe a new package to download } elsif ($_->{'TYPE'} eq 'PACK'){ $packages->{$_->{'ID'}} = { 'PACK_LOC' => $_->{'PACK_LOC'}, 'INFO_LOC' => $_->{'INFO_LOC'}, #'ID' => $_->{'ID'}, 'CERT_PATH' => $_->{'CERT_PATH'}, 'CERT_FILE' => $_->{'CERT_FILE'}, 'FORCE' => $_->{'FORCE'} }; } } } } # We are now in download child # Connect to server if ($context->{network}) { $ua = $context->{network}->{ua}; } else { $logger->info("Cannot find network settings to make this module works properly...disabling module"); $self->{disabled} = 1; } # Check history file unless(open HISTORY, "$opt_dir/history") { flock(HISTORY, LOCK_EX); unlink("$opt_dir/suspend"); $logger->error("Cannot read history file: $!"); return 1; } chomp(my @done = ); close(HISTORY); # Package is maybe already handled for (keys %$packages){ my $dir = $opt_dir."/".$_; my $fileid = $_; my $infofile = 'info'; my $location = $packages->{$_}->{'INFO_LOC'}; unless ($packages->{$_}->{'FORCE'} == 1) { if($common->already_in_array($fileid, @done)){ $logger->info("Will not download $fileid. (already in history file)"); &download_message($fileid, $messages->{success_already_setup},$logger,$context); next; } } # Looking for packages status unless(-d $dir){ $logger->debug("Making working directory for $fileid."); mkdir($dir) or die("Cannot create $fileid directory: $!"); open FH, ">$dir/since" or die("Cannot create $fileid since file: $!");; print FH time(); close(FH); } # Retrieve and writing info file if needed unless(-f "$dir/$infofile"){ # Special value INSTALL_PATH $packages->{$_}->{CERT_PATH} =~ s/INSTALL_PATH/$context->{installpath}/; $packages->{$_}->{CERT_FILE} =~ s/INSTALL_PATH/$context->{installpath}/; # Getting info file if ($network->getFile("https","$location/$fileid","info","$dir/info")){ download_message($fileid, $self->{messages}->{err_download_info},$logger,$context); $logger->error("Error download info file !!! Wrong URL or SSL certificate ?"); next; } } } unless(unlink("$opt_dir/suspend")){ $logger->error("Cannot delete suspend file: $!"); return 1; } return 0; } sub ssl_verify_callback { my ($ok, $x509_store_ctx) = @_; return $ok; } sub download_inventory_handler{ # Adding the ocs package ids to softwares my ($self,$inventory) = @_; my $context = $self->{context}; my $logger = $self->{logger}; $logger->debug("Calling download_inventory_handler"); my @history; # Read download history file if ( open PACKAGES, "$context->{installpath}/download/history" ){ flock(PACKAGES, LOCK_SH); while(){ chomp( $_ ); push @history, { ID => $_ }; } } close(PACKAGES); # Add it to inventory (will be handled by Download.pm server module push @{ $inventory->{xmlroot}->{'CONTENT'}->{'DOWNLOAD'}->{'HISTORY'} },{ 'PACKAGE'=> \@history }; } sub download_end_handler{ # Get global structure my $self = shift; my $context = $self->{context}; my $logger = $self->{logger}; my $common = $self->{common}; my $settings = $self->{settings}; my $messages = $self->{messages}; my $packages = $self->{packages}; $logger->debug("Calling download_end_handler"); my $dir = $context->{installpath}."/download"; my $pidfile = $dir."/lock"; return 0 unless -d $dir; # We have jobs, we do it alone my $fork = fork(); if ($fork>0){ return 0; } elsif ($fork<0){ return 1; } else { $SIG{'USR1'} = sub { print "Exiting on signal...\n"; &finish($logger, $context); }; # Go into working directory chdir($dir) or die("Cannot chdir to working directory...Abort\n"); } # Maybe an other process is running exit(0) if begin($pidfile,$logger); # Retrieve the packages to download opendir DIR, $dir or die("Cannot read working directory: $!"); my $end; while(1){ # If agent is running, we wait if (-e "suspend") { $logger->debug('Found a suspend file... Will wait 10 seconds before retry'); sleep(10); next; } $end = 1; #TODO Uncomment this line #undef $packages; # Reading configuration open FH, "$dir/config"; if (flock(FH, LOCK_SH)){ $download_config = XMLin("$dir/config"); close(FH); # If Frag latency is null, download is off if ($download_config->{'ON'} eq '0'){ $logger->info("Option turned off. Exiting."); finish($logger, $context); } } else { close(FH); if (-e "$dir/config") { $logger->error("Cannot read config file :-( . Exiting."); } else { $logger->debug("Download not configured"); } finish($logger, $context); } # Retrieving packages to download and their priority while (my $entry = readdir(DIR)){ next if $entry !~ /^\d+$/; next unless(-d $entry); # Clean package if info file does not still exist unless(-e "$entry/info"){ $logger->debug("No info file found for $entry!!"); clean( $entry, $logger, $context, $messages, $packages ); next; } my $info = XML::Simple::XMLin( "$entry/info" ) or next; # Check that fileid == directory name if ($info->{'ID'} ne $entry){ $logger->debug("ID in info file does not correspond!!"); clean( $entry, $logger, $context, $messages, $packages ); download_message($entry, $messages->{err_bad_id},$logger,$context); next; } # Manage package timeout # Clean package if since timestamp is not present unless(-e "$entry/since"){ $logger->debug("No since file found!!"); clean($entry, $logger, $context,$messages,$packages ); next; } else { my $time = time(); if (open SINCE, "$entry/since"){ my $since = ; if ($since=~/\d+/){ if ((($time-$since)/86400) > $download_config->{TIMEOUT}){ $logger->error("Timeout Reached for $entry."); clean($entry, $logger, $context,$messages,$packages ); &download_message($entry, $messages->{err_timeout},$logger,$context); close(SINCE); next; } else { $logger->debug("Checking timeout for $entry... OK"); } } else { $logger->error("Since data for $entry is incorrect."); clean($entry, $logger, $context, $messages, $packages ); &download_message($entry, $messages->{err_timeout},$logger,$context); close(SINCE); next; } close(SINCE); } else { $logger->error("Cannot find since data for $entry."); clean($entry, $logger, $context, $messages, $packages ); &download_message($entry, $messages->{err_timeout},$logger,$context); next; } } # Building task file if needed unless( -f "$entry/task" and -f "$entry/task_done" ){ open FH, ">$entry/task" or die("Cannot create task file for $entry: $!"); my $i; my $frags = $info->{'FRAGS'}; # There are no frags if there is only a command if ($frags){ for ($i=1;$i<=$frags;$i++){ print FH "$entry-$i\n"; } }; close FH; # To be sure that task file is fully created open FLAG, ">$entry/task_done" or die ("Cannot create task flag file for $entry: $!"); close(FLAG); } # Store info XML descriptions in package attributes for (keys %$info){ $packages->{$entry}->{$_} = $info->{$_} } $end = 0; } # Rewind directory rewinddir(DIR); # Call packages scheduler if ($end){ last; } else { period($packages,$logger,$context,$self->{messages},$settings); } } $logger->info("No more package to download."); finish($logger, $context); } # Schedule the packages sub period{ my ($packages,$logger,$context,$messages,$settings) = @_ ; my $period_lenght_default = $settings->{period_lenght_default} ; my $frag_latency_default= $settings->{frag_latency_default} ; my $cycle_latency_default= $settings->{cycle_latency_default} ; my $period_latency_default= $settings->{period_latency_default} ; my $i; #Serching packages with the priority 0 for (keys %$packages) { if ($packages->{$_}->{'PRI'} eq "0") { push (@prior_pkgs,$_); } } $logger->debug("New period. Nb of cycles: ". (defined($download_config->{'PERIOD_LENGTH'})?$download_config->{'PERIOD_LENGTH'}:$period_lenght_default)); for ($i=1;$i<=( defined($download_config->{'PERIOD_LENGTH'})?$download_config->{'PERIOD_LENGTH'}:$period_lenght_default);$i++){ # Highest priority if (@prior_pkgs){ $logger->debug("Managing ".scalar(@prior_pkgs)." package(s) with absolute priority."); for (@prior_pkgs){ # If done file found, clean package if (-e "$_/done"){ $logger->debug("done file found!!"); done($_,$logger,$context,$messages,$settings,$packages); next; } download($_,$logger,$context,$messages,$settings,$packages); $logger->debug("Now pausing for a fragment latency => ".( defined($download_config->{'FRAG_LATENCY'})?$download_config->{'FRAG_LATENCY'}:$frag_latency_default) ." seconds"); sleep( defined($download_config->{'FRAG_LATENCY'})?$download_config->{'FRAG_LATENCY'}:$frag_latency_default ); } next; } # Normal priority for (keys %$packages){ # If done file found, clean package if(-e "$_/done"){ $logger->debug("done file found!!"); done($_,$logger,$context,$messages,$settings,$packages); next; } next if $i % $packages->{$_}->{'PRI'} != 0; download($_,$logger,$context,$messages,$settings,$packages); $logger->debug("Now pausing for a fragment latency => ". (defined( $download_config->{'FRAG_LATENCY'} )?$download_config->{'FRAG_LATENCY'}:$frag_latency_default) ." seconds"); sleep(defined($download_config->{'FRAG_LATENCY'})?$download_config->{'FRAG_LATENCY'}:$frag_latency_default); } $logger->debug("Now pausing for a cycle latency => ".( defined($download_config->{'CYCLE_LATENCY'})?$download_config->{'CYCLE_LATENCY'}:$cycle_latency_default) ." seconds"); sleep(defined($download_config->{'CYCLE_LATENCY'})?$download_config->{'CYCLE_LATENCY'}:$cycle_latency_default); } sleep($download_config->{'PERIOD_LATENCY'}?$download_config->{'PERIOD_LATENCY'}:$period_latency_default); } # Download a fragment of the specified package sub download { my ($id,$logger,$context,$messages,$settings,$packages) = @_; my $error; my $proto = $packages->{$id}->{'PROTO'}; my $location = $packages->{$id}->{'PACK_LOC'}; my $network = $context->{network}; # If we find a temp file, we know that the update of the task file has failed for any reason. So we retrieve it from this file if (-e "$id/task.temp") { unlink("$id/task.temp"); rename("$id/task.temp","$id/task") or return 1; } # Retrieve fragments already downloaded unless(open TASK, "$id/task"){ $logger->error("Cannot open $id/task."); return 1; } my @task = ; # Done if (!@task){ $logger->debug("Download of $id... Finished."); close(TASK); execute($id,$logger,$context,$messages,$settings,$packages); return 0; } my $fragment = shift(@task); $logger->debug("Downloading $fragment..."); # Using proxy if possible my $res = $network->getFile(lc($proto),"$location/$id",$fragment,"$id/$fragment"); # Checking if connected unless($res) { #Success $error = 0; # Updating task file rename(">$id/task", ">$id/task.temp"); open TASK, ">$id/task" or return 1; print TASK @task; close(TASK); unlink(">$id/task.temp"); } else { $error++; if ($error > $settings->{max_error_count}){ $logger->error("Error : Max errors count reached"); finish($logger,$context); } return 1; } return 0; } # Assemble and handle downloaded package sub execute{ my ($id,$logger,$context,$messages,$settings,$packages) = @_; my $common = $context->{common}; my $tmp = $id."/tmp"; my $exit_code; $logger->debug("Execute orders for package $id."); if (build_package($id,$logger,$context,$messages,$packages)){ clean($id,$logger, $context,$messages,$packages); return 1; } else { # First, we get in temp directory unless( chdir($tmp) ){ $logger->error("Cannot chdir to working directory: $!"); download_message($id, $messages->{err_execute}, $logger,$context); clean($id,$logger, $context,$messages,$packages); return 1; } # Executing preorders (notify user, auto launch, etc.... # $id->{NOTIFY_USER} # $id->{NOTIFY_TEXT} # $id->{NOTIFY_COUNTDOWN} # $id->{NOTIFY_CAN_ABORT} # TODO: notification to send through DBUS to the user eval{ # Execute instructions if ($packages->{$id}->{'ACT'} eq 'LAUNCH'){ my $exe_line = $packages->{$id}->{'NAME'}; $packages->{$id}->{'NAME'} =~ s/^([^ -]+).*/$1/; # Exec specified file (LAUNCH => NAME) if (-e $packages->{$id}->{'NAME'}){ $logger->debug("Launching $packages->{$id}->{'NAME'}..."); chmod(0755, $packages->{$id}->{'NAME'}) or die("Cannot chmod: $!"); $exit_code = system( "./".$exe_line ) >> 8; } else { die(); } } elsif ($packages->{$id}->{'ACT'} eq 'EXECUTE'){ # Exec specified command EXECUTE => COMMAND $logger->debug("Execute $packages->{$id}->{'COMMAND'}..."); system( $packages->{$id}->{'COMMAND'} ) and die(); } elsif ($packages->{$id}->{'ACT'} eq 'STORE'){ # Store files in specified path STORE => PATH $packages->{$id}->{'PATH'} =~ s/INSTALL_PATH/$context->{installpath}/; # Build it if needed my @dir = split('/', $packages->{$id}->{'PATH'}); my $dir; for (@dir){ $dir .= "$_/"; unless(-e $dir){ mkdir($dir); $logger->debug("Create $dir..."); } } $logger->debug("Storing package to $packages->{$id}->{'PATH'}..."); # Stefano Brandimarte => Stevenson! system($common->get_path('cp')." -pr * ".$packages->{$id}->{'PATH'}) and die(); } }; if ($@){ # Notify success to ocs server download_message($id, $messages->{err_execute},$logger,$context); chdir("../..") or die("Cannot go back to download directory: $!"); clean($id,$logger,$context,$messages,$packages); return 1; } else { chdir("../..") or die("Cannot go back to download directory: $!"); done($id,$logger,$context,$messages,$settings,$packages,(defined($exit_code)?$exit_code:'_NONE_')); return 0; } } } # Check package integrity sub build_package{ my ($id,$logger,$context,$messages,$packages) = @_; my $common = $context->{common}; my $count = $packages->{$id}->{'FRAGS'}; my $i; my $tmp = "./$id/tmp"; unless(-d $tmp){ mkdir("$tmp"); } # No job if no files return 0 unless $count; # Assemble package $logger->info("Building package for $id."); for ($i=1;$i<=$count;$i++){ if (-f "./$id/$id-$i"){ # We make a tmp working directory if ($i==1){ open PACKAGE, ">$tmp/build.tar.gz" or return 1; } # We write each fragment in the final package open FRAGMENT, "./$id/$id-$i" or return 1; my $row; while ($row = ){ print PACKAGE $row; } close(FRAGMENT); } else { return 1; } } close(PACKAGE); # if (check_signature($packages->{$id}->{'DIGEST'}, "$tmp/build.tar.gz", $packages->{$id}->{'DIGEST_ALGO'}, $packages->{$id}->{'DIGEST_ENCODE'},$logger)){ download_message($id, $messages->{err_bad_digest},$logger,$context); return 1; } if ( system( $common->get_path("tar")." -xvzf $tmp/build.tar.gz -C $tmp") ){ $logger->error("Cannot extract $id with tar, trying with unzip."); if ( system( $common->get_path("unzip")." $tmp/build.tar.gz -d $tmp") ){ $logger->error("Cannot extract $id with unzip."); download_message($id,$messages->{err_build},$logger,$context); return 1; } } $logger->debug("Building of $id... Success."); unlink("$tmp/build.tar.gz") or die ("Cannot remove build file: $!\n"); return 0; } sub check_signature{ my ($checksum, $file, $digest, $encode,$logger) = @_; $logger->info("Checking signature for $file."); my $base64; # Open file unless(open FILE, $file){ $logger->error("cannot open $file: $!"); return 1; } binmode(FILE); # Retrieving encoding form if ($encode =~ /base64/i){ $base64 = 1; $logger->debug('Digest format: Base 64'); } elsif ($encode =~ /hexa/i){ $logger->debug('Digest format: Hexadecimal'); } else { $logger->debug('Digest format: Not supported'); return 1; } eval{ # Check it if ($digest eq 'MD5'){ $logger->debug('Digest algo: MD5'); if ($base64){ die unless Digest::MD5->new->addfile(*FILE)->b64digest eq $checksum; } else { die unless Digest::MD5->new->addfile(*FILE)->hexdigest eq $checksum; } } elsif ($digest eq 'SHA1'){ $logger->debug('Digest algo: SHA1'); if ($base64){ die unless Digest::SHA1->new->addfile(*FILE)->b64digest eq $checksum; } else { die unless Digest::SHA1->new->addfile(*FILE)->hexdigest eq $checksum; } } else { $logger->debug('Digest algo unknown: '.$digest); die; } }; if ($@){ $logger->debug("Digest checking error !!"); close(FILE); return 1; } else { close(FILE); $logger->debug("Digest OK..."); return 0; } } # Launch a download error to ocs server sub download_message{ my ($id, $code,$logger,$context) = @_; $logger->debug("Sending message for $id, code=$code."); my $xml = { 'DEVICEID' => $context->{deviceid}, 'QUERY' => 'DOWNLOAD', 'ID' => $id, 'ERR' => $code }; # Generate xml $xml = XMLout($xml, RootName => 'REQUEST'); # Compress data $xml = Compress::Zlib::compress( $xml ); my $URI = $context->{servername}; # Send request my $request = HTTP::Request->new(POST => $URI); $request->header('Pragma' => 'no-cache', 'Content-type', 'application/x-compress'); $request->content($xml); my $res = $ua->request($request); # Checking result if ($res->is_success) { return 0; }else{ return 1; } } # At the beginning of end handler sub begin{ my ($pidfile,$logger) = @_; open LOCK_R, "$pidfile" or die("Cannot open pid file: $!"); if (flock(LOCK_R,LOCK_EX|LOCK_NB)){ open LOCK_W, ">$pidfile" or die("Cannot open pid file: $!"); select(LOCK_W) and $|=1; select(STDOUT) and $|=1; print LOCK_W $$; $logger->info("Beginning work. I am $$."); return 0; } else { close(LOCK_R); $logger->error("$pidfile locked. Cannot begin work... :-("); return 1; } } sub done{ my ($id,$logger,$context,$messages,$settings,$packages,$suffix) = @_; my $common = $context->{common}; my $frag_latency_default = $settings->{frag_latency_default}; $logger->debug("Package $id... Done. Sending message..."); # Trace installed package open DONE, ">$id/done"; close(DONE); # Read history file open HISTORY,"$context->{installpath}/download/history" or warn("Cannot open history file: $!"); chomp(my @historyIds = ); close(HISTORY); # Put it in history file open HISTORY,">>$context->{installpath}/download/history" or warn("Cannot open history file: $!"); flock(HISTORY, LOCK_EX); if ( $common->already_in_array($id, @historyIds) ){ $logger->debug("Warning: ID $id has been found in the history file (package was already deployed)"); } else { $logger->debug("Writing $id reference in history file"); print HISTORY $id,"\n"; } close(HISTORY); # Notify success to ocs server my $code; if ($suffix ne '_NONE_'){ $code = $messages->{code_success}."_$suffix"; } else { $code = $messages->{code_success}; } unless(download_message($id, $code,$logger,$context)){ clean($id,$logger,$context,$messages,$packages); } else { sleep( defined($download_config->{'FRAG_LATENCY'})?$download_config->{'FRAG_LATENCY'}:$frag_latency_default ); } return 0; } sub clean{ my ($id,$logger,$context,$messages,$packages) = @_; $logger->info("Cleaning $id package."); delete $packages->{$id}; #If the package is priority 0 if ((my $index) = grep { $prior_pkgs[$_] eq $id } 0..$#prior_pkgs){ delete $prior_pkgs[$index]; } unless(File::Path::rmtree($id, 0)){ $logger->error("Cannot clean $id!! Abort..."); download_message($id, $messages->{err_clean},$logger,$context); die(); } return 0; } # At the end sub finish{ my ($logger,$context) = @_; open LOCK, '>'.$context->{installpath}.'/download/lock'; $logger->debug("End of work...\n"); exit(0); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/Example.pm000066400000000000000000000052601432320066700233510ustar00rootroot00000000000000############################################################################### ## OCSINVENTORY-NG ## Copyleft Guillaume PROTET 2010 ## Web : http://www.ocsinventory-ng.org ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ package Ocsinventory::Agent::Modules::Example; sub new { my $name="example"; #Set the name of your module here my (undef,$context) = @_; my $self = {}; #Create a special logger for the module $self->{logger} = new Ocsinventory::Logger ({ config => $context->{config} }); $self->{logger}->{header}="[$name]"; $self->{context}=$context; $self->{structure}= { name => $name, start_handler => $name."_start_handler", #or undef if don't use this hook prolog_writer => $name."_prolog_writer", #or undef if don't use this hook prolog_reader => $name."_prolog_reader", #or undef if don't use this hook inventory_handler => $name."_inventory_handler", #or undef if don't use this hook end_handler => $name."_end_handler" #or undef if don't use this hook }; bless $self; } ######### Hook methods ############ sub example_start_handler { #Use this hook to test prerequisites needed by module and disble it if needed my $self = shift; my $logger = $self->{logger}; $logger->debug("Yeah you are in example_start_handler :)"); my $prerequisites = 1 ; if ( $prerequisites == 0 ) { $self->{disabled} = 1; #Use this to disable the module $logger->debug("Humm my prerequisites are not OK...disabling module :( :( "); } } sub example_prolog_writer { #Use this hook to add information the prolog XML my $self = shift; my $logger = $self->{logger}; $logger->debug("Yeah you are in example_prolog_writer :)"); } sub example_prolog_reader { #Use this hook to read the answer from OCS server my $self = shift; my $logger = $self->{logger}; $logger->debug("Yeah you are in example_prolog_reader :)"); } sub example_inventory_handler { #Use this hook to add or modify entries in the inventory XML my $self = shift; my $logger = $self->{logger}; $logger->debug("Yeah you are in example_inventory_handler :)"); } sub example_end_handler { #Use this hook to add treatments before the end of agent launch my $self = shift; my $logger = $self->{logger}; $logger->debug("Yeah you are in example_end_handler :)"); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Modules/SnmpScan.pm000066400000000000000000000426271432320066700235100ustar00rootroot00000000000000############################################################################### ## OCSINVENTORY-NG ## Copyleft Guillaume PROTET 2010 ## Web : http://www.ocsinventory-ng.org ## ## This code is open source and may be copied and modified as long as the source ## code is always made freely available. ## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ package Ocsinventory::Agent::Modules::SnmpScan; use strict; no strict 'refs'; no strict 'subs'; use warnings; use XML::Simple; use Digest::MD5; sub new { my $name="snmpscan"; #Set the name of your module here my (undef,$context) = @_; my $self = {}; #Create a special logger for the module $self->{logger} = new Ocsinventory::Logger ({ config => $context->{config} }); $self->{logger}->{header}="[$name]"; $self->{common} = $context->{common}; $self->{context}=$context; $self->{structure}= { name => $name, start_handler => $name."_start_handler", prolog_writer => undef, prolog_reader => $name."_prolog_reader", inventory_handler => undef, end_handler => $name."_end_handler", }; # We create a xml for the snmp inventory that we will be sent to server $self->{inventory}={}; bless $self; } sub snmpscan_start_handler { my $self = shift; my $logger = $self->{logger}; my $common = $self->{context}->{common}; my $config = $self->{context}->{config}; $logger->debug("Calling snmp_start_handler"); # Disabling module if local mode if ($config->{stdout} || $config->{local}) { $self->{disabled} = 1; $logger->info("Agent is running in local mode...disabling module"); } # If we cannot load prerequisite, we disable the module unless ($common->can_load('Net::SNMP')) { $self->{disabled} = 1; $logger->error("Net::SNMP perl module is missing !!"); $logger->error("Humm my prerequisites are not OK...disabling module :( :("); } } sub snmpscan_prolog_reader { my ($self, $prolog) = @_; my $logger = $self->{logger}; my $network = $self->{context}->{network}; my $option; $logger->debug("Calling snmp_prolog_reader"); $prolog = XML::Simple::XMLin( $prolog, ForceArray => ['OPTION', 'PARAM']); for $option (@{$prolog->{OPTION}}){ if ($option->{NAME} =~/snmp/i){ $self->{doscans} = 1 ; for ( @{ $option->{PARAM} } ) { if ($_->{'TYPE'} eq 'DEVICE'){ # Adding the IP in the devices array push @{$self->{netdevices}},{ IPADDR => $_->{IPADDR}, MACADDR => $_->{MACADDR}, }; } if ($_->{'TYPE'} eq 'COMMUNITY'){ # Adding the community in the communities array push @{$self->{communities}},{ VERSION=>$_->{VERSION}, NAME=>$_->{NAME}, USERNAME=>$_->{USERNAME}, AUTHPROTO=>$_->{AUTHPROTO}, AUTHPASSWD=>$_->{AUTHPASSWD}, PRIVPROTO=>$_->{PRIVPROTO}, PRIVPASSWD=>$_->{PRIVPASSWD}, LEVEL=>$_->{LEVEL} }; } if ($_->{'TYPE'} eq 'NETWORK'){ push @{$self->{nets_to_scan}},$_->{SUBNET}; } if ($_->{'TYPE'} eq 'SNMP_TYPE'){ if($_->{TABLE_TYPE_NAME} ne 'snmp_default') { push @{$self->{snmp_type_condition}},{ TABLE_TYPE_NAME => $_->{TABLE_TYPE_NAME}, CONDITION_OID => $_->{CONDITION_OID}, CONDITION_VALUE => $_->{CONDITION_VALUE} }; } else { push @{$self->{snmp_type_condition_default}},{ TABLE_TYPE_NAME => $_->{TABLE_TYPE_NAME}, CONDITION_OID => $_->{CONDITION_OID} }; } push @{$self->{snmp_type_infos}},{ TABLE_TYPE_NAME => $_->{TABLE_TYPE_NAME}, LABEL_NAME => $_->{LABEL_NAME}, OID => $_->{OID} }; } } } } } sub snmpscan_end_handler { my $self = shift; my $logger = $self->{logger}; my $common = $self->{context}->{common}; my $network = $self->{context}->{network}; $logger->debug("Calling snmp_end_handler"); # If no order form server return unless $self->{doscans}; # Flushing xmltags if it has not been done $common->flushXMLTags(); # We get the config my $config = $self->{context}->{config}; # Load setting from the config file my $configagent = new Ocsinventory::Agent::Config; $configagent->loadUserParams(); my $communities=$self->{communities}; if ( ! defined ($communities ) ) { $logger->debug("We have no Community from server, we use default public community"); $communities=[{VERSION=>"2c",NAME=>"public"}]; } my ($name,$comm,$error,$system_oid); # Initalising the XML properties my $snmp_inventory = $self->{inventory}; $snmp_inventory->{xmlroot}->{QUERY} = ['SNMP']; $snmp_inventory->{xmlroot}->{DEVICEID} = [$self->{context}->{config}->{deviceid}]; # Scanning network $logger->debug("Snmp: Scanning network"); my $nets_to_scan=$self->{nets_to_scan}; foreach my $net_to_scan ( @$nets_to_scan ){ $self->snmp_ip_scan($net_to_scan); } $logger->debug("Snmp: Ending Scanning network"); # Begin scanning ip tables my $ip=$self->{netdevices}; foreach my $device ( @$ip ) { my $session = undef; my $oid_condition = undef; my $devicedata = $common->{xmltags}; #To fill the xml informations for this device my $snmp_table = undef; my $snmp_condition_oid = undef; my $snmp_condition_value = undef; my $regex = undef; $logger->debug("Scanning $device->{IPADDR} device"); # Search for the good snmp community in the table community LIST_SNMP: foreach $comm ( @$communities ) { # Test if we use SNMP v3 if ( $comm->{VERSION} eq "3" ) { if($comm->{LEVEL} eq '' || $comm->{LEVEL} eq 'noAuthNoPriv') { ($session, $error) = Net::SNMP->session( -retries => $configagent->{config}{snmpretry}, # SNMP retry in config file -timeout => $configagent->{config}{snmptimeout}, # SNMP Timeout in config file -version => 'snmpv'.$comm->{VERSION}, -hostname => $device->{IPADDR}, -translate => [-nosuchinstance => 0, -nosuchobject => 0, -octetstring => 0], -username => $comm->{USERNAME} ); } if($comm->{LEVEL} eq 'authNoPriv') { if($comm->{AUTHPROTO} eq '') { $comm->{AUTHPROTO} = "md5"; } ($session, $error) = Net::SNMP->session( -retries => $configagent->{config}{snmpretry}, # SNMP retry in config file -timeout => $configagent->{config}{snmptimeout}, # SNMP Timeout in config file -version => 'snmpv'.$comm->{VERSION}, -hostname => $device->{IPADDR}, -translate => [-nosuchinstance => 0, -nosuchobject => 0, -octetstring => 0], -username => $comm->{USERNAME}, -authprotocol => $comm->{AUTHPROTO}, -authpassword => $comm->{AUTHPASSWD} ); } if($comm->{LEVEL} eq 'authPriv') { if($comm->{AUTHPROTO} eq '') { $comm->{AUTHPROTO} = "md5"; } if($comm->{PRIVPROTO} eq '') { $comm->{PRIVPROTO} = "des"; } ($session, $error) = Net::SNMP->session( -retries => $configagent->{config}{snmpretry}, # SNMP retry in config file -timeout => $configagent->{config}{snmptimeout}, # SNMP Timeout in config file -version => 'snmpv'.$comm->{VERSION}, -hostname => $device->{IPADDR}, -translate => [-nosuchinstance => 0, -nosuchobject => 0, -octetstring => 0], -username => $comm->{USERNAME}, -authprotocol => $comm->{AUTHPROTO}, -authpassword => $comm->{AUTHPASSWD}, -privpassword => $comm->{PRIVPASSWD}, -privprotocol => $comm->{PRIVPROTO} ); } # For a use in constructor module (Cisco) $self->{username}=$comm->{USERNAME}; $self->{authpassword}=$comm->{AUTHPASSWD}; $self->{authprotocol}=$comm->{AUTHPROTO}; $self->{privpassword}=$comm->{PRIVPASSWD}; $self->{privprotocol}= $comm->{PRIVPROTO}; } else { # We have an older version v2c ou v1 ($session, $error) = Net::SNMP->session( -retries => $configagent->{config}{snmpretry}, # SNMP retry in config file -timeout => $configagent->{config}{snmptimeout}, # SNMP Timeout in config file -version => 'snmpv'.$comm->{VERSION}, -hostname => $device->{IPADDR}, -community => $comm->{NAME}, -translate => [-nosuchinstance => 0, -nosuchobject => 0, -octetstring => 0], ); }; unless (defined($session)) { $logger->error("Snmp INFO: $error"); } else { $self->{snmp_session}=$session; # For a use in constructor module (Cisco) $self->{snmp_community}=$comm->{NAME}; $self->{snmp_version}=$comm->{VERSION}; my $snmp_key = $self->{snmp_type_condition}; my $snmp_key_default = $self->{snmp_type_condition_default}; LIST_TYPE: foreach my $snmp_value (@$snmp_key) { $oid_condition = $session->get_request(-varbindlist => [$snmp_value->{CONDITION_OID}]); $snmp_table = $snmp_value->{TABLE_TYPE_NAME}; $snmp_condition_oid = $snmp_value->{CONDITION_OID}; $snmp_condition_value = $snmp_value->{CONDITION_VALUE}; $regex = $self->regex($snmp_condition_value); last LIST_TYPE if (defined $oid_condition && ($oid_condition->{$snmp_value->{CONDITION_OID}} eq $snmp_value->{CONDITION_VALUE} || $oid_condition->{$snmp_value->{CONDITION_OID}} =~ /$regex/)); } last LIST_SNMP if (defined $oid_condition && ($oid_condition->{$snmp_condition_oid} eq $snmp_condition_value || $oid_condition->{$snmp_condition_oid} =~ /$regex/)); LIST_TYPE: foreach my $snmp_value_default (@$snmp_key_default) { $oid_condition = $session->get_request(-varbindlist => [$snmp_value_default->{CONDITION_OID}]); $snmp_table = $snmp_value_default->{TABLE_TYPE_NAME}; $snmp_condition_oid = $snmp_value_default->{CONDITION_OID}; last LIST_TYPE if (defined $oid_condition); } last LIST_SNMP if (defined $oid_condition && $snmp_table eq 'snmp_default'); $session->close; $self->{snmp_session}=undef; } } if (defined $oid_condition) { my $xmltags = $common->{xmltags}; $session->max_msg_size(8192); # We have found the good Community, we can scan this equipment # We indicate that we scan a new equipment $self->{number_scan}++; my $data; my $snmp_infos = $self->{snmp_type_infos}; foreach my $datas (@$snmp_infos) { my $data_value = undef; if($datas->{TABLE_TYPE_NAME} eq $snmp_table) { $data = $session->get_request(-varbindlist => [$datas->{OID}]); $data_value = $data->{$datas->{OID}}; if(defined $data_value && $data_value =~ m/([\x{0}-\x{9}]|[\x{B}-\x{C}]|[\x{E}-\x{1F}]|[\x{7F}-\x{FF}])/) { $data_value = unpack "H*", $data_value; $data_value = substr $data_value, 2; my @split = unpack '(A2)*', $data_value; $data_value = uc(join ':', @split); } if(!defined $data_value || $data_value eq '') { my @table; $data = $session->get_table(-baseoid => $datas->{OID}); foreach my $key (keys %{$data}) { if(defined $data->{$key} && $data->{$key} =~ m/([\x{0}-\x{9}]|[\x{B}-\x{C}]|[\x{E}-\x{1F}]|[\x{7F}-\x{FF}])/) { $data->{$key} = unpack "H*", $data->{$key}; $data->{$key} = substr $data->{$key}, 2; my @split = unpack '(A2)*', $data->{$key}; $data->{$key} = uc(join ':', @split); } push @table, $data->{$key}; } $data_value = join ' - ', @table; } $xmltags->{$datas->{LABEL_NAME}}[0] = $data_value; } } push @{$snmp_inventory->{xmlroot}->{CONTENT}->{$snmp_table}},$xmltags; # We have finished with this equipment if (defined $session) { $session->close; } $self->{snmp_session}=undef; # We clear the xml data for this device $common->flushXMLTags(); } } $logger->info("No more SNMP device to scan"); # Formatting the XML and sendig it to the server my $content = XMLout( $snmp_inventory->{xmlroot}, RootName => 'REQUEST' , XMLDecl => '', SuppressEmpty => undef ); #Cleaning XML to delete unprintable characters my $clean_content = $common->cleanXml($content); $network->sendXML({message => $clean_content}); $logger->debug("End snmp_end_handler :)"); } sub snmp_ip_scan { my ($self,$net_to_scan) = @_; my $logger=$self->{logger}; my $common=$self->{common}; if ($common->can_load('Net::Netmask') ) { my $block=Net::Netmask->new($net_to_scan); my $size=$block->size()-2; my $index=1; if ( $common->can_run('nmap') && $common->can_load('Nmap::Parser') ) { $logger->debug("Scannig $net_to_scan with nmap"); my $nmaparser = Nmap::Parser->new; $nmaparser->parsescan("nmap","-sn",$net_to_scan); for my $host ($nmaparser->all_hosts("up")) { my $res=$host->addr; $logger->debug("Found $res"); push( @{$self->{netdevices}},{ IPADDR=>$res }) unless $self->search_netdevice($res); } } elsif ($common->can_load('Net::Ping')) { $logger->debug("Scanning $net_to_scan with ping"); my $ping=Net::Ping->new("icmp",1); while ($index <= $size) { my $res=$block->nth($index); if ($ping->ping($res)) { $logger->debug("Found $res"); push( @{$self->{netdevices}},{ IPADDR=>$res }) unless $self->search_netdevice($res); } $index++; } $ping->close(); } else { $logger->debug("No scan possible"); } } else { $logger->debug("Net::Netmask not present: no scan possible"); } } sub search_netdevice { my ($self,$ip)= @_ ; for (@{$self->{netdevices}}) { if ($ip =~ /^$_->{IPADDR}$/) { return 1; } } } sub regex { my ($self,$regex) = @_; if(($regex !~ m/\*/)){ $regex = "\^".$regex."\$"; } if((substr( $regex, -1) eq '*') && (substr( $regex, 0, 1) eq '*')){ $regex = $regex =~ s/\*//gr; } if((substr( $regex, 0, 1 ) eq '*') && (substr( $regex, -1) ne '*')){ $regex = $regex =~ s/\*//gr; $regex = $regex."\$"; } if((substr( $regex, -1) eq '*') && (substr( $regex, 0, 1) ne '*')){ $regex = $regex =~ s/\*//gr; $regex = "\^".$regex; } return $regex; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/Network.pm000066400000000000000000000124341432320066700220000ustar00rootroot00000000000000package Ocsinventory::Agent::Network; # TODO: # - set the correct deviceID and olddeviceID use strict; use warnings; use IO::Socket::SSL qw(SSL_VERIFY_NONE); use LWP::UserAgent; use Socket; use Ocsinventory::Compress; use Ocsinventory::Agent::Encrypt; #$XML::Simple::PREFERRED_PARSER = 'XML::Parser'; sub new { my (undef, $params) = @_; my $self = {}; $self->{accountconfig} = $params->{accountconfig}; $self->{accountinfo} = $params->{accountinfo}; $self->{common} = $params->{common}; my $logger = $self->{logger} = $params->{logger}; $self->{config} = $params->{config}; my $uaserver; if ($self->{config}->{server} =~ /^http(|s):\/\//) { $self->{URI} = $self->{config}->{server}; $uaserver = $self->{config}->{server}; $uaserver =~ s/^http(|s):\/\///; $uaserver =~ s/\/.*//; if ($uaserver !~ /:\d+$/) { $uaserver .= ':443' if $self->{config}->{server} =~ /^https:/; $uaserver .= ':80' if $self->{config}->{server} =~ /^http:/; } } else { $self->{URI} = "http://".$self->{config}->{server}.$self->{config}->{remotedir}; $uaserver = $self->{config}->{server}; } $self->{compress} = new Ocsinventory::Compress ({logger => $logger}); # Connect to server $self->{ua} = LWP::UserAgent->new(keep_alive => 1); if ($self->{config}->{proxy}) { $self->{ua}->proxy(['http', 'https'], 'connect://'.$self->{config}->{proxy}.''); } else { $self->{ua}->env_proxy; } my $version = 'OCS-NG_unified_unix_agent_v'; $version .= exists ($self->{config}->{version})?$self->{config}->{version}:''; my $userencrypt = Ocsinventory::Agent::Encrypt::getClearText($self->{config}->{user}); my $pwdencrypt = Ocsinventory::Agent::Encrypt::getClearText($self->{config}->{password}); $self->{ua}->agent($version); $self->{ua}->credentials( $uaserver, # server:port, port is needed $self->{config}->{realm}, $userencrypt, $pwdencrypt ); #Setting SSL configuration depending on LWP version $self->{ua}->_agent =~ /^libwww-perl\/(.*)$/; my $lwp_version= $1; $lwp_version=$self->{common}->convertVersion($lwp_version,3); if ($lwp_version > 583) { $self->{ua}->ssl_opts( verify_hostname => $self->{config}->{ssl}, SSL_ca_file => $self->{config}->{ca} ); if ($self->{config}->{ssl} == 0 ) { $self->{ua}->ssl_opts( SSL_verify_mode => SSL_VERIFY_NONE ); } } elsif ($self->{config}->{ssl} eq 1) { # SSL verification is disabled by default in LWP prior to version 6 # we activate it using Crypt::SSLeay environment variables $ENV{HTTPS_CA_FILE} = $self->{config}->{ca}; } bless $self; } sub sendXML { my ($self, $args) = @_; my $logger = $self->{logger}; my $compress = $self->{compress}; my $message = $args->{message}; my $common = $self->{common}; my $req = HTTP::Request->new(POST => $self->{URI}); $req->header('Pragma' => 'no-cache', 'Content-type', 'application/x-compress'); if (! $self->{config}{force}) { # Checking if XML is valid before submitting $logger->debug ("checking XML"); eval { XML::Simple::XMLin( $message ) }; if($@) { my $xml_error = $@; $xml_error =~ s/^\n//; $logger->error ('Invalid XML: '.$xml_error); $logger->error ('Cannot submit XML! Abort...'); return; } } $logger->debug ("sending XML"); $logger->debug ("sending: ".$message); my $compressed = $compress->compress($message); if (!$compressed) { $logger->error ('failed to compress data'); return; } $req->content($compressed); my $res = $self->{ua}->request($req); # Checking if connected if (!$res->is_success) { $logger->error ('Cannot establish communication : '.$res->status_line); return; } return $res ; } sub getXMLResp { my ($self, $res, $msgtype) = @_; my $logger = $self->{logger}; my $compress = $self->{compress}; # If no answer from OCS server return unless $res; # Reading the XML response from OCS server my $content = $compress->uncompress($res->content); if (!$content) { $logger->error ("Deflating problem"); return; } my $tmp = "Ocsinventory::Agent::XML::Response::".$msgtype; eval "require $tmp"; if ($@) { $logger->error ("Can't load response module $tmp: $@"); } $tmp->import(); my $response = $tmp->new ({ accountconfig => $self->{accountconfig}, accountinfo => $self->{accountinfo}, content => $content, logger => $logger, config => $self->{config}, common => $self->{common}, }); return $response; } sub getFile { my ($self,$proto,$uri,$filetoget,$filepath) = @_; my $logger= $self->{logger}; chomp($proto,$uri,$filetoget,$filepath); my $url = "$proto://$uri/$filetoget"; my $response = $self->{ua}->mirror($url,$filepath); if ($response->is_success){ $logger->debug("Success downloading $filetoget file..."); } else { $logger->error("Failed downloading $filetoget: ".$response->status_line." !!!"); return 1; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/000077500000000000000000000000001432320066700204455ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Inventory.pm000066400000000000000000000210101432320066700227720ustar00rootroot00000000000000package Ocsinventory::Agent::XML::Inventory; # TODO: resort the functions use strict; use warnings; =head1 NAME Ocsinventory::Agent::XML::Inventory - the XML abstraction layer =head1 DESCRIPTION OCS Inventory uses XML for the data transmission. The module is the abstraction layer. It's mostly used in the backend module where it called $inventory in general. =cut use XML::Simple; use Digest::MD5 qw(md5_base64); use Config; use Ocsinventory::Agent::Backend; =over 4 =item new() The usual constructor. =cut sub new { my (undef, $params) = @_; my $self = {}; $self->{accountinfo} = $params->{context}->{accountinfo}; $self->{accountconfig} = $params->{context}->{accountconfig}; $self->{backend} = $params->{backend}; $self->{common} = $params->{context}->{common}; my $logger = $self->{logger} = $params->{context}->{logger}; $self->{config} = $params->{context}->{config}; if (!($self->{config}{deviceid})) { $logger->fault ('deviceid unititalised!'); } $self->{xmlroot}{QUERY} = ['INVENTORY']; $self->{xmlroot}{DEVICEID} = [$self->{config}->{deviceid}]; #$self->{xmlroot}{CONTENT}{HARDWARE} = { # TODO move that in a backend module # ARCHNAME => [$Config{archname}] #}; # Is the XML centent initialised? $self->{isInitialised} = undef; bless $self; } =item initialise() Runs the backend modules to initialise the data. =cut sub initialise { my ($self) = @_; return if $self->{isInitialised}; $self->{backend}->feedInventory ({inventory => $self}); $self->{isInitialised} = 1; } =item getContent() Return the inventory as a XML string. =cut sub getContent { my ($self, $args) = @_; my $logger = $self->{logger}; my $common = $self->{common}; if ($self->{isInitialised}) { $self->processChecksum(); # checks for MAC, NAME and SSN presence my $macaddr = $self->{xmlroot}->{CONTENT}->{NETWORKS}->[0]->{MACADDR}->[0]; my $ssn = $self->{xmlroot}->{CONTENT}->{BIOS}->{SSN}->[0]; my $name = $self->{xmlroot}->{CONTENT}->{HARDWARE}->{NAME}->[0]; my $osname = $self->{xmlroot}->{CONTENT}->{HARDWARE}->{OSNAME}->[0]; my $missing; $missing .= "MAC-address " unless $macaddr; $missing .= "SSN " unless $ssn; $missing .= "HOSTNAME " unless $name; if ($missing) { $logger->debug('Missing value(s): '.$missing.'. I will send this inventory to the server BUT important value(s) to identify the computer are missing'); } $self->{accountinfo}->setAccountInfo($self); my $content = XMLout( $self->{xmlroot}, RootName => 'REQUEST', XMLDecl => '', SuppressEmpty => undef ); # Cleaning XML to delete unprintable characters my $clean_content = $common->cleanXml($content); # Cleaning xmltags content after adding it o inventory $common->flushXMLTags(); if(defined($osname) && lc($osname) eq 'macos') { return $content; } return $clean_content; } } =item printXML() Only for debugging purpose. Print the inventory on STDOUT. =cut sub printXML { my ($self, $args) = @_; if ($self->{isInitialised}) { print $self->getContent(); } } =item writeXML() Save the generated inventory as an XML file. The 'local' key of the config is used to know where the file as to be saved. =cut sub writeXML { my ($self, $args) = @_; my $logger = $self->{logger}; if ($self->{config}{local} =~ /^$/) { $logger->fault ('local path unititalised!'); } if ($self->{isInitialised}) { my $localfile = $self->{config}{local}."/".$self->{config}{deviceid}.'.ocs'; $localfile =~ s!(//){1,}!/!; # Convert perl data structure into xml strings if (open OUT, ">$localfile") { print OUT $self->getContent(); close OUT or warn; $logger->info("Inventory saved in $localfile"); } else { warn "Can't open `$localfile': $!" } } } =item processChecksum() Compute the field. This information is used by the server to know which parts of the XML have changed since the last inventory. The is done thank to the last_file file. It has MD5 prints of the previous inventory. =cut sub processChecksum { my $self = shift; my $logger = $self->{logger}; my $common = $self->{common}; # To apply to $checksum with an OR my %mask = ( 'HARDWARE' => 1, 'BIOS' => 2, 'MEMORIES' => 4, 'SLOTS' => 8, 'REGISTRY' => 16, 'CONTROLLERS' => 32, 'MONITORS' => 64, 'PORTS' => 128, 'STORAGES' => 256, 'DRIVES' => 512, 'INPUTS' => 1024, 'MODEMS' => 2048, 'NETWORKS' => 4096, 'PRINTERS' => 8192, 'SOUNDS' => 16384, 'VIDEOS' => 32768, 'SOFTWARES' => 65536, 'VIRTUALMACHINES' => 131072, 'CPUS' => 262144, 'BATTERIES' => 1048576, ); if (!$self->{config}->{vardir}) { $logger->fault ("vardir uninitialised!"); } my $checksum = 0; if (!$self->{config}{local} && $self->{config}->{last_statefile}) { if (-f $self->{config}->{last_statefile}) { # TODO: avoid a violant death in case of problem with XML $self->{last_state_content} = XML::Simple::XMLin( $self->{config}->{last_statefile}, SuppressEmpty => undef, ForceArray => 1 ); } else { $logger->debug ('last_state file: `'. $self->{config}->{last_statefile}. "' doesn't exist (yet)."); } } foreach my $section (keys %mask) { # If the checksum has changed... my $hash = md5_base64(XML::Simple::XMLout($self->{xmlroot}{'CONTENT'}{$section})); if (!$self->{last_state_content}->{$section}[0] || $self->{last_state_content}->{$section}[0] ne $hash ) { $logger->debug ("Section $section has changed since last inventory"); # We make OR on $checksum with the mask of the current section $checksum |= $mask{$section}; # Finally I store the new value. $self->{last_state_content}->{$section}[0] = $hash; } } $common->setHardware({CHECKSUM => $checksum}); } =item saveLastState() At the end of the process IF the inventory was saved correctly, the last_state is saved. =cut sub saveLastState { my ($self, $args) = @_; my $logger = $self->{logger}; if (!defined($self->{last_state_content})) { $self->processChecksum(); } if (!defined ($self->{config}->{last_statefile})) { $logger->debug ("Can't save the last_state file. File path is not initialised."); return; } if (open LAST_STATE, ">".$self->{config}->{last_statefile}) { print LAST_STATE my $string = XML::Simple::XMLout( $self->{last_state_content}, RootName => 'LAST_STATE' );; close LAST_STATE or warn; } else { $logger->debug ("Cannot save the checksum values in ".$self->{config}->{last_statefile}.":$!"); } } =item addSection() A generic way to save a section in the inventory. Please avoid this solution. =cut sub addSection { my ($self, $args) = @_; my $logger = $self->{logger}; my $multi = $args->{multi}; my $tagname = $args->{tagname}; for ( keys %{$self->{xmlroot}{CONTENT}} ){ if ( $tagname eq $_ ){ $logger->debug("Tag name `$tagname` already exists - Don't add it"); return 0; } } if ($multi){ $self->{xmlroot}{CONTENT}{$tagname} = []; } else { $self->{xmlroot}{CONTENT}{$tagname} = {}; } return 1; } =item feedSection() Add information in inventory. =back =cut # Q: is that really useful()? Can't we merge with addSection()? sub feedSection{ my ($self, $args) = @_; my $tagname = $args->{tagname}; my $values = $args->{data}; my $logger = $self->{logger}; my $found=0; for ( keys %{$self->{xmlroot}{CONTENT}} ){ $found = 1 if $tagname eq $_; } if (!$found){ $logger->debug("Tag name `$tagname` doesn't exist - Cannot feed it"); return 0; } if ( $self->{xmlroot}{CONTENT}{$tagname} =~ /ARRAY/ ){ push @{$self->{xmlroot}{CONTENT}{$tagname}}, $args->{data}; } else { $self->{xmlroot}{CONTENT}{$tagname} = $values; } return 1; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Prolog.pm000066400000000000000000000014221432320066700222440ustar00rootroot00000000000000package Ocsinventory::Agent::XML::Prolog; use strict; use warnings; use XML::Simple; use Digest::MD5 qw(md5_base64); sub new { my (undef, $params) = @_; my $self = {}; $self->{config} = $params->{context}->{config}; $self->{logger} = $params->{context}->{logger}; die unless ($self->{config}->{deviceid}); #XXX $self->{xmlroot}{QUERY} = ['PROLOG']; $self->{xmlroot}{DEVICEID} = [$self->{config}->{deviceid}]; bless $self; } sub dump { my $self = shift; eval "use Data::Dumper;"; print Dumper($self->{xmlroot}); } sub getContent { my ($self, $args) = @_; my $content=XMLout( $self->{xmlroot}, RootName => 'REQUEST', XMLDecl => '', SuppressEmpty => undef ); return $content; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Response.pm000066400000000000000000000020651432320066700226040ustar00rootroot00000000000000package Ocsinventory::Agent::XML::Response; use strict; use warnings; use XML::Simple; use Data::Dumper; sub new { my (undef, $params) = @_; my $self = {}; $self->{accountconfig} = $params->{accountconfig}; $self->{accountinfo} = $params->{accountinfo}; $self->{content} = $params->{content}; $self->{config} = $params->{config}; $self->{common} = $params->{common}; my $logger = $self->{logger} = $params->{logger}; $self->{origmsg} = $params->{origmsg}; $logger->debug("=BEGIN=SERVER RET======"); $logger->debug(Dumper($self->{content})); $logger->debug("=END=SERVER RET======"); $self->{parsedcontent} = undef; bless $self; } sub getRawXML { my $self = shift; return $self->{content}; } sub getParsedContent { my ($self,$forcearray) = @_; if (!$self->{parsedcontent}) { $self->{parsedcontent} = $self->{common}->readXml($self->{content},$forcearray); } return $self->{parsedcontent}; } sub origMsgType { my ($self, $package) = @_; return ref($package); } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Response/000077500000000000000000000000001432320066700222435ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Response/Inventory.pm000066400000000000000000000010721432320066700245760ustar00rootroot00000000000000package Ocsinventory::Agent::XML::Response::Inventory; use strict; use Ocsinventory::Agent::XML::Response; our @ISA = ('Ocsinventory::Agent::XML::Response'); sub new { my ($class, @params) = @_; my $this = $class->SUPER::new(@params); bless ($this, $class); my $parsedContent = $this->getParsedContent(['ACCOUNTINFO']); if ($parsedContent && exists ($parsedContent->{RESPONSE}) && $parsedContent->{RESPONSE} =~ /^ACCOUNT_UPDATE$/) { $this->{accountinfo}->writeAccountInfoFile($parsedContent->{ACCOUNTINFO}); } return $this; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/Response/Prolog.pm000066400000000000000000000052761432320066700240550ustar00rootroot00000000000000package Ocsinventory::Agent::XML::Response::Prolog; use strict; use Ocsinventory::Agent::XML::Response; our @ISA = ('Ocsinventory::Agent::XML::Response'); sub new { my ($class, @params) = @_; my $this = $class->SUPER::new(@params); bless ($this, $class); $this->updatePrologFreq(); $this->saveNextTime(); return $this; } sub isInventoryAsked { my $self = shift; my $parsedContent = $self->getParsedContent(['OPTION','PARAM']); if ($parsedContent && exists ($parsedContent->{RESPONSE}) && $parsedContent->{RESPONSE} =~ /^SEND$/) { return 1; } 0 } sub getOptionsInfoByName { my ($self, $name) = @_; my $parsedContent = $self->getParsedContent(['OPTION','PARAM']); my $ret = []; return unless ($parsedContent && $parsedContent->{OPTION}); foreach (@{$parsedContent->{OPTION}}) { if ($_->{NAME} && $_->{NAME} =~ /^$name$/i) { $ret = $_->{PARAM} } } return $ret; } sub updatePrologFreq { my $self = shift; my $parsedContent = $self->getParsedContent(['OPTION','PARAM']); my $logger = $self->{logger}; if ($parsedContent && exists ($parsedContent->{PROLOG_FREQ})) { if( $parsedContent->{PROLOG_FREQ} ne $self->{accountconfig}->get("PROLOG_FREQ")){ $logger->info("PROLOG_FREQ has changed since last process(old=".$self->{accountconfig}->get("PROLOG_FREQ").",new=".$parsedContent->{PROLOG_FREQ}.")"); $self->{prologFreqChanged} = 1; $self->{accountconfig}->set("PROLOG_FREQ", $parsedContent->{PROLOG_FREQ}); } else{ $logger->debug("PROLOG_FREQ has not changed since last process"); } } } sub saveNextTime { my ($self, $args) = @_; my $logger = $self->{logger}; if (!$self->{config}->{next_timefile}) { $logger->debug("no next_timefile to save!"); return; } my $parsedContent = $self->getParsedContent(['OPTION','PARAM']); if (!open NEXT_TIME, ">".$self->{config}->{next_timefile}) { $logger->error ("Cannot create the next_timefile `".$self->{config}->{next_timefile}."': $!"); return; } close NEXT_TIME or warn; my $serverdelay = $self->{accountconfig}->get('PROLOG_FREQ'); my $time; if( $self->{prologFreqChanged} ){ $logger->debug("Compute next_time file with random value"); $time = time + int rand(($serverdelay?$serverdelay*3600:$self->{config}->{delaytime})); } else{ $time = time + ($serverdelay?$serverdelay*3600:$self->{config}->{delaytime}); } utime $time,$time,$self->{config}->{next_timefile}; if ($self->{config}->{cron}) { $logger->info ("Next inventory after ".localtime($time)); } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Agent/XML/SimpleMessage.pm000066400000000000000000000017411432320066700235440ustar00rootroot00000000000000package Ocsinventory::Agent::XML::SimpleMessage; use strict; use warnings; use Data::Dumper; # XXX Debug use XML::Simple; use Digest::MD5 qw(md5_base64); use Ocsinventory::Agent::XML::Prolog; sub new { my (undef, $params) = @_; my $self = {}; $self->{config} = $params->{config}; $self->{accountinfo} = $params->{accountinfo}; die unless ($self->{config}->{deviceid}); #XXX $self->{xmlroot}{QUERY} = ['PROLOG']; $self->{xmlroot}{DEVICEID} = [$self->{config}->{deviceid}]; bless $self; } sub dump { my $self = shift; print Dumper($self->{xmlroot}); } sub set { my ($self, $args) = @_; foreach (keys %$args) { $self->{xmlroot}{$_} = [$args->{$_}]; } } sub getContent { my ($self, $args) = @_; $self->{accountinfo}->setAccountInfo($self); my $content=XMLout( $self->{xmlroot}, RootName => 'REQUEST', XMLDecl => '', SuppressEmpty => undef ); return $content; } 1; UnixAgent-2.10.0/lib/Ocsinventory/Compress.pm000066400000000000000000000054421432320066700211050ustar00rootroot00000000000000package Ocsinventory::Compress; use strict; use File::Temp qw/ tempdir tempfile /; sub new { my (undef, $params) = @_; my $self = {}; my $logger = $self->{logger} = $params->{logger}; eval{require Compress::Zlib;}; $self->{mode} = 'natif' unless $@; chomp(my $gzippath=`which gzip 2>/dev/null`); if ($self->{mode} eq 'natif') { $logger->debug ('Compress::Zlib is available.'); } elsif (-x $gzippath) { $logger->debug ( 'Compress::Zlib is not available! The data will be compressed with gzip instead but won\'t be accepted by server prior 1.02'); $self->{mode} = 'gzip'; $self->{tmpdir} = tempdir( CLEANUP => 1 ); mkdir $self->{tmpdir}; if ( ! -d $self->{tmpdir} ) { $logger->fault("Failed to create the temp dir `$self->{tmpdir}'"); } } else { $self->{mode} = 'deflated'; $logger->debug ('I need the Compress::Zlib library or the gzip'. ' command to compress the data - The data will be sent uncompressed but won\'t be accepted by server prior 1.02'); } bless $self; } sub compress { my ($self, $content) = @_; my $logger = $self->{logger}; # native mode (zlib) if ($self->{mode} eq 'natif') { return Compress::Zlib::compress($content); } elsif ($self->{mode} eq 'gzip'){ # gzip mode my ($fh, $filename) = tempfile( DIR => $self->{tmpdir} ); print $fh $content; close $fh; system ("gzip --best $filename > /dev/null"); # print "filename ".$filename."\n"; my $ret; open FILE, "<$filename.gz"; $ret .= $_ foreach (); close FILE; if ( ! unlink "$filename.gz" ) { $logger->debug("Failed to remove `$filename.gz'"); } return $ret; } elsif($self->{mode} eq 'deflated'){ # No compression available return $content; } } sub uncompress { my ($self,$data) = @_; my $logger = $self->{logger}; # Native mode if ($self->{mode} eq 'natif') { return Compress::Zlib::uncompress($data); } elsif($self->{mode} eq 'gzip'){ # Gzip mode my ($fh, $filename) = tempfile( DIR => $self->{tmpdir}, SUFFIX => '.gz' ); print $fh $data; close $fh; system ("gzip -d $filename"); my ($uncompressed_filename) = $filename =~ /(.*)\.gz$/; my $ret; open FILE, "<$uncompressed_filename"; $ret .= $_ foreach (); close FILE; if ( ! unlink "$uncompressed_filename" ) { $logger->debug("Failed to remove `$uncompressed_filename'"); } return $ret; } elsif($self->{mode} eq 'deflated'){ # No compression available return $data; } } 1; UnixAgent-2.10.0/lib/Ocsinventory/Logger.pm000066400000000000000000000044361432320066700205330ustar00rootroot00000000000000package Ocsinventory::Logger; # TODO use Log::Log4perl instead. use Carp; sub new { my (undef, $params) = @_; my $self = {}; bless $self; $self->{backend} = []; $self->{config} = $params->{config}; $self->{debug} = $self->{config}->{debug}?1:0; my @logger; if (exists ($self->{config}->{logger})) { @logger = split /,/, $self->{config}->{logger}; } else { # if no 'logger' parameter exist I use Stderr as default backend push @logger, 'Stderr'; } my @loadedMbackends; foreach (@logger) { my $backend = "Ocsinventory::LoggerBackend::".$_; eval ("require $backend"); # TODO deal with error if ($@) { print STDERR "Failed to load Logger backend: $backend ($@)\n"; next; } else { push @loadedMbackends, $_; } my $obj = new $backend ({ config => $self->{config}, }); push @{$self->{backend}}, $obj if $obj; } my $version = "Ocsinventory unified agent for UNIX, Linux and MacOSX "; $version .= exists ($self->{config}->{version})?$self->{config}->{version}:''; $self->debug($version."\n"); $self->debug("Log system initialised (@loadedMbackends)"); $self; } sub log { my ($self, $args) = @_; # levels: info, debug, warn, fault my $level = $args->{level}; my $message = $args->{message}; my $header = $self->{header}; return if ($level =~ /^debug$/ && !($self->{debug})); chomp($message); #Add a header to message if needed $message="$header $message" if $header; $level = 'info' unless $level; foreach (@{$self->{backend}}) { $_->addMsg ({ level => $level, message => $message }); } confess if $level =~ /^fault$/; # Die with a backtace } sub debug { my ($self, $msg) = @_; $self->log({ level => 'debug', message => $msg}); } sub info { my ($self, $msg) = @_; $self->log({ level => 'info', message => $msg}); } sub error { my ($self, $msg) = @_; $self->log({ level => 'error', message => $msg}); } sub fault { my ($self, $msg) = @_; $self->log({ level => 'fault', message => $msg}); } sub user { my ($self, $msg) = @_; $self->log({ level => 'user', message => $msg}); } 1; UnixAgent-2.10.0/lib/Ocsinventory/LoggerBackend/000077500000000000000000000000001432320066700214365ustar00rootroot00000000000000UnixAgent-2.10.0/lib/Ocsinventory/LoggerBackend/File.pm000066400000000000000000000011221432320066700226470ustar00rootroot00000000000000package Ocsinventory::LoggerBackend::File; use strict; sub new { my (undef, $params) = @_; my $self = {}; $self->{config} = $params->{config}; $self->{logfile} = $self->{config}->{logdir}."/".$self->{config}->{logfile}; bless $self; } sub addMsg { my ($self, $args) = @_; my $level = $args->{level}; my $message = $args->{message}; return if $message =~ /^$/; open FILE, ">>".$self->{config}->{logfile} or warn "Can't open ". "`".$self->{config}->{logfile}."'\n"; print FILE "[".localtime()."][$level] $message\n"; close FILE; } 1; UnixAgent-2.10.0/lib/Ocsinventory/LoggerBackend/Stderr.pm000066400000000000000000000011211432320066700232320ustar00rootroot00000000000000package Ocsinventory::LoggerBackend::Stderr; sub new { my (undef, $params) = @_; my $self = {}; $self->{config} = $params->{config}; bless $self; } sub addMsg { my ($self, $args) = @_; my $level = $args->{level}; my $message = $args->{message}; return if $message =~ /^$/; # if STDERR has been hijacked, I take its saved ref my $stderr; if (exists ($self->{config}->{savedstderr})) { $stderr = $self->{config}->{savedstderr}; } else { open ($stderr, ">&STDERR"); } print $stderr "[$level] $message\n"; } 1; UnixAgent-2.10.0/lib/Ocsinventory/LoggerBackend/Syslog.pm000066400000000000000000000010111432320066700232450ustar00rootroot00000000000000package Ocsinventory::LoggerBackend::Syslog; # Not tested yet! use Sys::Syslog qw( :DEFAULT setlogsock); sub new { my (undef, $params) = @_; my $self = {}; openlog("ocs-agent",'cons.pid', $params->{config}->{logfacility}); syslog('debug', 'syslog backend enabled'); bless $self; } sub addMsg { my (undef, $args) = @_; my $level = $args->{level}; my $message = $args->{message}; return if $message =~ /^$/; syslog('info', $message); } sub destroy { closelog(); } 1; UnixAgent-2.10.0/macosx/000077500000000000000000000000001432320066700147715ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/README000066400000000000000000000033171432320066700156550ustar00rootroot00000000000000DESCRIPTION OS X [darwin] Readme This README will help you roll your own native OSX, OCSNG.app client for enterprise deployment. PREREQUISITES - Latest XCode - Cpanm - Packages (Iceberg's successor) BUILDING/INSTALLING - Run `cpanm --install-deps .` in UnixAgent base directory - You might need to configure cpanm if that the first configuration - We recommend to install perl and cpanm using brew - Move generated dependencies inside the lib directory of the OCS Inventory agent root directory - Apply patches from macosx/patches directory - Open the macosx/ocsng_app-xcode/OCSNG.xcodeproj and build OCSNG.app and ocscontact - Before building check that all the external resources are available otherwise the agent won't work COPYRIGHT See AUTHORS file. Ocsinventory-Agent is released under GNU GPL 2 licence. Portions of the Xcode project may fall under other, open licences (individual files will elaborate). Some of the Xcode project files are not core pieces of OCSNG and are to be treated as a supplement tool for building the agent for OSX deployment. NOTES - macosx tools was created by claimid.com/wesyoung and modified by OCS NG team for the 2.8 version. - Once installed, the agent should contact the server and upload an initial inventory, then go back to sleep. - OCS MacOSX agent is launched using LaunchD but you can click on /Applications/OCSNG.app to launch OCS agent manually. - You can take a look to OCS MacOSX logs in /var/logs/ocsng.log file (by default) - To uninstall the .app, use the uninstaller.sh script in /Application/OCSNG/Contents/Resources directory. This will kill the service, remove all the files (no restart required). - This package works on MacOSX 10.11+ on x86_64 architectures only. UnixAgent-2.10.0/macosx/deps/000077500000000000000000000000001432320066700157245ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/deps/darwin-perl-deps.zip000066400000000000000000103344431432320066700216410ustar00rootroot00000000000000PKu:U darwin-perl-deps/UT 1cޞ1c1cux PKu:U8 __MACOSX/._darwin-perl-depsUT 1cޞ1cӦ1cux c`cg`b`MLVVP'100i т(aul4%LPq\ĂT a`E&%d20ȝWyym֩ݞĹ X[ZX'%eZ:Y:;ꚸXZ際:Z:0PKMѡ8PKq:U darwin-perl-deps/Proc/UT җ1ck1cL1cux PKq:U __MACOSX/darwin-perl-deps/._ProcUT җ1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Compress/UT 1cj1cL1cux PKq:U$ __MACOSX/darwin-perl-deps/._CompressUT 1cj1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKrVT! darwin-perl-deps/AppendToPathUT וbM1cL1cux ,.IL*J,H-w()J,736PKB8#!PKrVT( __MACOSX/darwin-perl-deps/._AppendToPathUT וbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Mozilla/UT 21ck1cL1cux PKq:U# __MACOSX/darwin-perl-deps/._MozillaUT 21ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKcq:U darwin-perl-deps/LWP/UT ږ1ck1cL1cux PKcq:U __MACOSX/darwin-perl-deps/._LWPUT ږ1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq7U! darwin-perl-deps/Needs.pmUT 5-cM1cL1cux YSH]EqVbd]88 k%E!x랇$?殮*y{zƉݺ7 &,m{kAn Dq8򘾯ŋFpVkzSM5]}?Nw448qNs~$Zj#Cji~ʪV6淐- [~l-7 ?ɧ3t'[o%^B> 2p0 e7+ a 7sSYA(` +^.^c{& PE2Xӿ I4ԖQrob'b~X-@G'ma!|c294hh}C*fd^3٣m?F 4W~$dw@H])8{QXlD B,G#{?`\ܷBeҀ?y=v#=˿s- aH#xV,e 4voR1FW p˸@@dH1@B`gTGk^[Oŕ`1.27G"ĺj \UCCqR,A+Lɗj_!w;ž}hòT-tUaԝUAnCEkpiz?ͧe;fe[csfYhJW| #K 0XM6E˲J˯׻/Wa{So@ӰMI/_S?Ƃc4ˢ`<2,o*G׮&D@49?ۡ؃[b^\+ y-&hx1sPXZi~B`|D (o>_O/'ʙM>Ov WʞU9[66Zb.IMESҩY-W*t_ SBkc}ݴtS/H 2&kh"$nfƑ˙lA ,^% dn~1EGR B^tԚ|ys:QS9 6Ϳz>o۸8ʱ1BДCuK 9WķJ$k0w޽ ʍKʓХЗ$hVz"4o~z KKnB<"6`)C8?bpWU*}L:K&?mⅰb].gEWu+ -d!?ϩھ[[8b9a2bK hTQ'^ꮌaID r=΃v9n]Xk"}0V\`E9:# \7/"Bp7s$֖yu oEGm50 Ob[)B-c؄Q,4g[.YЁv}K-*ۯn<5W{?IۭWRVT_'p$0[Ql&o5WhohH^y!V+l+2y +9_"J,/לYKbKrl8oN\7"AD=*%JmjW(oR{cxr} eYƗ%Pz..J|%sl(F,0H"!&Y>5|W1oàiU˜AQg,^ q,U.P܁J>̶?y}m O77a>°E 7O"V ԶZzKJf?n Tv[]3m-dRv[4#gn-o֮6дeY6oD8鍏G 6oVp2/ ֍>lL&wbBT+0k3n/ U&g LYO WSjxL4 9w}׋^Btp$%p`˻Q'Z< v:*%Vk>4sĖt=:y1b<&%0/`}!bd&9nVdV~Pp;~֊7 ݹi~1%El0xTR+W.?5nW}Ӳ"]9>X{w4t`= 1Y EbA=SVb}9qzkBХ=LS\H!$[c}Rx4]$'bOmpz`4;qݳb~Apv kѴ.d+KZg&񚈜b:e" 15Za+>,A @Plp7|P,tdKG'~`y ~edbpjfyͦ,%0a(cYW$okPK7nD !PKq7U$ __MACOSX/darwin-perl-deps/._Needs.pmUT 5-cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Net/UT 1ck1cL1cux PKq:U __MACOSX/darwin-perl-deps/._NetUT 1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKu:U  darwin-perl-deps/.DS_StoreUT 1c1c1cux Yn@ML1d-EJ~ 'p&^DWNSp&^,-%%=+١p&!GD2{;ck^ଛO|:@wض{Ԟ3r9}j0aO[-@k?lS=tr&hZǎm>wiy=sjrw\SF}t8طuCGwjⅭIyYۀs~ruոhTئǫ{NoL xZ+QbE̵S1 8k~`[~4S<:fyhfvZ_n8cq2rz{G?}TwҫsghϬ~OnµX-w 3g:Kt},F ye<ч+k'-UDğAMC%.~~e~!@U0?PK ] PKu:Ux% __MACOSX/darwin-perl-deps/._.DS_StoreUT 1cӦ1cӦ1cux c`cg`b`MLVVP'@S 8A0]PK 85xPKT darwin-perl-deps/libwww/UT t[ibk1cL1cux PKT" __MACOSX/darwin-perl-deps/._libwwwUT t[ibk1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT1$ darwin-perl-deps/lwpcook.podUT bM1cL1cux Zo7)xJr)pՉĆ )zARrܵ\͐\dNz8 b.9 ߼`d\;z;t\+rH O'܂Wٻ(k+W RgšV.TYQe),Eu,SQY9SLIEB?TiBRm4Jdbj D褂I*ڔ>-L *(:JӵN^D29I 3+xXf=,ŹU'JeˈMU1)ad%rlz1|[DDijv|=R7X %-ϫ zcد2 gqǚ-A4%ftŴXuBUEM XOJp{8(eczyYáU8am9l8|~E id ~3U``S 5ug%xAm}%ah}STNLO%mPȸORl %/`K ֔u[dl6dmϏ mݾR٧V?-( S.5 Wb hbh[#pau(NiUE׷çZ&M͒>w;?>r֣TX:)ӿ1-W#a CTB*2Fhe#:vB nC|g+7Fk$k.op*M7Uu`m1*́/ 6{(q49fj?% uZO{%.z1HZ]|ˡK[2gܛfMIysy M.X =@88ͪ]}*/,0rH@>sK- 㹊ܸLQ=4+N}NxrE.T mLo"Up cg-:!B6T`C]J0W'R LIJ>|m˔ÓGg3XI D8;zlR|܌@k.)RPBݙ<[{娕P0]ۑ4Ud TsE@+RCr^(\E8Y%!oԺ)PZzFּfu}T$G)G0 JE4_V舼#0F|Ls)$CC l%!22`*{,4S4ґhA>t,2ZvrsQ)Hfquz Y -а(Hx^M"S aBn=i.*cڱ3ܨ u_4&&J@&@)af y>8n5j[Kv tt)\$*Ekk1,(CMǣ q>"{8Z_Jm?o~f~\I-ǁ7O ޒ`O2?v4u)GQInUi[h ־q@IB( .Xfm(H rw+(;3UFE8%n*UeZlv]pr)&LnI9bEh08}C ̠Ȍ7J } PR,V_ !&ǞbsIB:1<;/6ΐ`Wz P%.l$(dm6õ-C㳳m])(!f.뢉:@\W5p$;_^hA"hLHrOYkuLYV_ϠNJ= )jtu̳>"]rDj9a&8E0p^]rx:QcZ환{"߫uΚhj|O&@8ũ%f‚-\K)6kzS]"[J4N`px|Hʾ[@AD0{\>ٷDY*cŶj/(?R7 öA5׷9/B'Z='ʄW)փX1`Rn.t~'U/ZN>ߞ\\]{]Bl3ݷf{(;^T ˬ!{gܶd//,i3ʐ30Ywi1ص|WwjezfrXw_}ZV.t;GKSFNw )`u ] /q"ZZݶ'u#%%H,FE!?w:bT+Weu>Wx9Tۘ]@4?}%vPޖڹ6*U٬2Y^*V8J{3)ֽӴbyϫe^욹;1ݣBl]ӻ)Vak E$HwGܵ]T/q5.DY#nky'v ÝNݥY7am:2CG1v-Fڢ+ =3(_Gv;(:6гy)7kmG&&Flʹ\=K˞%CSD zJw,OR KpNϝPKEe 1$PKT' __MACOSX/darwin-perl-deps/._lwpcook.podUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Test/UT 1cl1cL1cux PKq:U __MACOSX/darwin-perl-deps/._TestUT 1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/File/UT 1ck1cL1cux PKq:U __MACOSX/darwin-perl-deps/._FileUT 1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKOq:U darwin-perl-deps/Module/UT 1ck1cL1cux PKOq:U" __MACOSX/darwin-perl-deps/._ModuleUT 1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK"q:U darwin-perl-deps/Date/UT a1cj1cL1cux PK"q:U __MACOSX/darwin-perl-deps/._DateUT a1cj1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Parse/UT —1ck1cL1cux PKq:U! __MACOSX/darwin-perl-deps/._ParseUT —1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/IO/UT 1ck1cL1cux PKq:U __MACOSX/darwin-perl-deps/._IOUT 1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTva darwin-perl-deps/lwptut.podUT bM1cL1cux |ms7w Ɇd_dvbIfr=ʦT '03CfotԭM hӍͬWGJ%E,uR}L_.,M3i+ТS̲,׭x|}Vǩ>yFZz:ϖ MZy-[f2E:2Y˙oxOKmUU?22Ң̨c.$/ԦeпWq9SQ6Y4)R|NmnӉe㲠)6Ҕz˭6"sPpQ:.#tuf+询4y,8υ,ߌZS(4AbQ ;y%A1Pܚ$YڜHuDK,Ze$A>%V _IeICba}w6_@@Dt2$V`2F a^x41δgqA&7nwC-K$^0k:rLʐז~Ӝh-hbF/J7'&kWf1 Fw~L',rDqJ}1yvy/ \b9ܧ;_,; >bjSkul'XI c7Bܖ˜B{AS͢I0Omgy2&|A~۳\j.A_ݴ +Ȭ>,sRGh+xM yP7Kkn'P3}CMBټs"Ⰰo!+mM&EWhY0e}z:xک?z>ż?`eyDi%#ϭ, x5+"GU[z8a J2itf Kh}J0V{3 HOXlLs0  !gY7%\ 89  T>a2~  R? }E6apٱ_IZRX-{֚\, )P޲$gNt]\*Зg^hzd`1iӗU{P …d:iV1u߳Ԅ {g#Wew/PIqZC M[+VcwՄ=i` m T4X_ڊަ,lX`R( ='@I:u|SxEoN1smfJ`06%)8VԨh97114"k )zjpz{L/H;<ﱙihc_~psӣ*"g DLΐdҫ ǃ'If2Cyi"-'?k(_h$E ~ ͇\|˞8 ? M, A3i>t}|p%nL!&i#rY\ADj Xr0ȏ;}i=}LȾ 63//O r@Y9O$&~\!`6}nOV6 wx^{ՃMͬQ=f'eaWe_hE`otHBR)1$Mwe(G!GN KvdifDuAO9r! T˩Tp[ Kf6ޠD6q:*%YFWJh aϢxbrR!:E-9Fd0u"GKwʘCRe-,[*A $CöQQ~Xo%,q`'h~E"#jOOZ)=&Њ䄆S-넹wޖAO7Vt7,hT#Lzu0dM=H|?ĕp'B'İe>"ccG8Ye/\ᣣϹq|s5e$&["pA9bfQ!D"`pRG;@C )C;|SMP!c1? D X$RK.-k H1<ڂ{ԇpvbdNJ[("IHhi 2s%h-jok%8'Y"r!zO# @~m F zY9EvXi+1!VaCQN,$MFn3X ` @SQHO7fhM֝q='dkyDD1|7˹Y,hϯ_5zLNі~iA޲m6>16]Wb{uK]!ܬP29T1:`4^%%1R@N ֯}¤1y(rsf6'U2)cZI $*$S|^Gt6 \lsvHrcgg)ˆhTQ8-']20|QŷKFz%vayGC;W:!+HSi\̈.+B&{U<$غhq\ ud@ |w1Q%U?9g' WTq0I,1=!(0ZWS@MQXyY(@z'SFwe$Jba-Bӆ)nęǼYy rsr3z Y\J'J" -&%([![v ~_#w_(Vԥ)1}&dS8i<ܯdGPT*t@P\q[2WKoh6:XyG<`0Llv;w5J0. |쾪)("{VPi3 }umS~kZYt^yr# y}"^ ۙwD7 qa7Sh%mWC5?/Ϗ^?~Sz ?ԐÝ,;) w}M ˣxszᲘ*h-CT[pꁀZ]}C!l">s¦#5"x!acfmG!G^Z%(*v${(5wT`eCgV8/R8Rr;QBT1U_(qF lcO,XM0~X}s[M}?&uw۷~^OK΋Ş} )ndd= 96 _Xʩ 5c|z'TÊ6dw$Noޕyxz3$1׳REn8!o4bFB&~WT.у@ (3H8G=HV(!~ e2حlBe΃=ƾ̘- ˩GZRJIF>ch"4$$K+䑍:Hg@ qS DX,"Zйۣ&R%dp.\4qtX|֔PV.DEFR)cxT=S¸CX HwrNk:vu EĊ6Q؆jCWȣxD;+jCClNӫ v$֗NĨ]̼3J  [$$]-j/}xJi k>&7 lueeRƨm5!#M]/؇_6THpʖK1oـ+nrB9B6]c&S_wZ._K6Ev?7=%B8;wE zN\l*eHSHk?}=xHw`H'':ŀPN]Ksr|lZ q k>6f $${H?f6YX?d%įW ߃Artg e/$P+&'gp8ѕ96Pqj(D?r ]pNvIHq$|8N @FUFЪ,粝߮  Tq˹j lOKb.G;_ BPgCކg:L;vbd{PqFOSy0rZP5MLO6̽\EʀeLpAqzLzqb_,~hS,ΚutXja@KV#iaɺ `pH%ZS?6#dҦ|c.|P"d4qNJ!]3'bĈ"uN1-yy~>awLqܚ40QkY9Qq*zp JZ+: DH C<{Mǩ^LQUժYB>)UQ%1A9eW!CS F"N> a:zO\/ ;(xr) aEńVd`(o|r8yӜR6,R)1@hWg8Z<9U0z$4/!^X6L =ͺjQ9Pǃ=Ipj e ٫ƥDK.-g2j[eVj%f~ /{ a4s ?1>Xˆ+gZٱ#aá ߀0rͮZA~skb$BA}@-AKZ14q^\' pD, ǽJ:W09}C3H`5lɷT'q&.uG.4pDCIbM<˧z-wM~$X9eHڟ/HQa?||[6B09[>Psq[dvi'$YA?&, 4 _b(<3$@'k{-׸?OZѭx_aUwέ;YTzULo'o~?vɰ+t v|4,TU&p)tB ?p n%Q -O/&ml1~f} Mf~ U{vo߾۶t"*W[WBcܚ"X~1̧>%.tċ ˷Դan|^zxvWV\.k&gi!|yJ]%N3C걝G2>MNC5~2LН{;j6T1V=ቻ^bY;Y;?!BrLe}7qY4&+dToL>Oݺq%Il.0.S%*!wE\POߞ%D& V?q~ !ѽz2uOv;!^*\{酸V F){p~$Bi4A-Mzz:8,H9vԅ |{Q>1k/6KyZR᫶zan'T(;٧xf9;?dk eFfrFi}Lᦳ-vӘ!; ۲`ޗqr8\T\x㋶#{LBrd C߲|cg.],7#޼"{oڻvw*/4"M~;hw\;mcPUA5FFqyոA]ƥ>.j'}; +[IwJUJnfz~thpqq2.&JJG6Gu~G<1}z8,;-;"EzȳnP|TFVL=/J+0ޥCsSNՓ|ED|e+>ާoF\ѐQNo]񺴼.d@ K]׬BO; pBWژJ0PW+d7OKTʭf˅3d)d{=6'v!\ɇ>,B[ŰHr \CS: _:&y헀ԮP|t|AWn'!N @gZRGK <WiD_GY؄[I iwW9Aw0M}Uq?GXpsUnq~QgK|\D`]UsTj_e2^VcZn\3D4+h)-=9rZ=c*t| j]n9 D,ؖi]e3cՠOj# aPU;SkUWlDvw< [+{HUJ`8.8:'q1Y emvż9W"}`M^C}!PZgr{. 撙3.n)t;#ihwbJ>c8[ kUJ@]Diw] .Є;|i_W[nltyߧvueWGw0YnJO4*wIe"ٸ1h(:ZfwG,M}X,HR0_b5 j1H<'o~lG[HMDh.h:4!g}V{~7 Vq>DtZxcqZ1\M |Q7{ͪZ_XS\N,yso" 5@G!y[/~xw><Mс&W|!P]j1IQ.yL T<8a<:%&awBK3>Zg??Rb-I1ݻ3K_%ߐ(9/4r6fG>0k v:xs98H@A?s􇦡&RԂePK"vaPKT& __MACOSX/darwin-perl-deps/._lwptut.podUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkrDp darwin-perl-deps/Switch.pmUT :(SM1cL1cux =kwƶ_1%ĈI 븍k#6o1#p|$ٳg;{g"ɥ]Jc)8<7(.yN4W_~1t-y$]' DO4=!,xf_ī7}yn ϞhgwvTq: Ӄbq|)\F8}q(N޼=o~1- ~ N@n:E t.2N2f2HD& O~辯%4[z8؆@r2t2v-AO0neyy%ֵaI$s>4;-l <#rṌg.vɘ7pF#zi8AYB<3Heɞ6FPhDr#8 !`0c/#*8ES4 XƃZ-wvo֑e>g*/w0VH~jwyICz\ XAͺ%! $62&o75CAv=El h:[JS4 6q*^$>RE6dFA6 m5 QI+c>h) !@A^ZSσh2Bj˥Qh*h52!P{p fo):nnp^kBG\ =ylKoRj/:1VW!?HM^ Pk/5h! G0~Ѥk{^,}JESD8B5+3ʗ< AfXo$S e ĉJI&%u.)vg %7W9U=q'5'$bq5{ ˍ ?Du4Fȭ.zjJt~Z\Dz|`Kt'󯨂(XQefc4?j"Gs-8y?/B]nU[40H 8CX\6nq>-Oa &$pk/'XLXap;Ge3j _]SQõwz5q5OlRI;{uK0Iј4~Icx6#H]%R-w4 ZY;Yx^N慾sZ^0\g؊x*" _,B뿚y.+ut1_WoN69YK9~Έ]hrGW`TVJնޝϟ]_4*p]ZK9{K# n׻k]=~X v|RZ*e3ۋh^T뿚]LȅR6+Q3<΃> B|)SVeM"5m u$o/k?8nkvQ"tNGZEtj D]a_-7ή`T$6W֛QwO}SCľ}nPq VyOV>bu1bSC fA;{:cl(tK)9!omlʶ2$CGmfZqɋx*]|6 3&4i:g/_KU[o[G\j243q_r I_~N "vfR]Ċb ~?!{Y ߠZZoo2 !w(3 !_OOj.0B"gv_ug>o:)DaXk5Sڽ`&^޳z_(b"00|=߼3Q#L rd+ +~zx%!R 8G1nwe\]_dךC;^D]/ǻ@/x F:[-eA%pQӋ"W^Փzr]wdIQ TQ,LWYV3ݏqS- vٰ\]Xpab\Uۍn0c"b.UbmL@& 8C]NM`՘@H0҄PbF+dA3+ʷ,8ث}=ĸ@ NL7Q8JA+8}[ B^9de :3 I1)M%bNt c21S@HeдM#BIbiE m>Z]Gbecܮh! JTXFc̑.U$XVP[@":?H{bN%F@3tx S4pf.{KŲ7M sI**M" ?Q鹮D^]d4Rm+RVZx!9Q,5?XYe%٧I*rm~_jCq]PiTǡ\);@ަA^Zcc &\ o$n `76Fr:I\w'̱wePC !OxLϬEșkSş7Hk2 bB'Ԕf39BfQCIX$-EFr6:DQ4kf,G[ [EY䷨J4z3-~K} .{t[{ώ}8j1Syq;~_aNI\?=<_'K[\4 (ĨN04uFOtЈ4e_BWe薤(1H>?9bV ۍi؋YGAA0U tt6WJYGkAmI/XA&9yA_ȵ\_vg/oޢ$*=no/KWvȹ5;i@U+ai2D%EDiىzIF kaIeQX(,lW E˺P8:t/ O=JD@. lX`iOf\㺚RW>ћѨRDy5'vZa@Cנh5vpFs5SگQ6wUZ8S/jV`(Be٦jZ|e}aV3֥l;:P1fCZŘb(r8o l|pP/v".wD&-/xBgԛPKh'}8|n=1Sve_iToa7jCl(xE7ѝõ} 7)S;}ʭKa,=ثOf`Y:VI=o5Gr,d4dG (q"h}/UI lYG7ԥd?#:hV}a͎-ؼvqF:jUP(<^eŜL`K\WɶfPs":բɤ%*b4 C8UPʓ!w&tۡfóEo_??|}ptxR8kIS+G4GHdy#̘uYwrj=}ز;37]>sF 9h 2/bc2 !pcBaD4w 0rn Ir /V)Eʼn}1|zO' BYGR7NLG{sN+>mDh>KS5a#ah\(tĈo^'Eri {N>sݶ$H|}GNhpy*u4iA^B:Be07KcYx >Nb: Cƹ1K0N&a)tPyt Bw 5 'Ƈ^%™?8c*$5y=j(q#ewhp$)~.SHu0S|X~ShYzr:)ąHJNA"cB ֖O՛o*c7{+`d,crxɢQ {~?M1 fZB3F֔7YjepGē`;;ǧ7NS+UZ(c/ǂ'+:Vt1:OɊa xG8zC~ (~Î.y]q-% *: ?h^F:I9bƟ\V,|$ÂPKG"pPKkrD% __MACOSX/darwin-perl-deps/._Switch.pmUT :(SM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK!q:U darwin-perl-deps/Encode/UT _1cj1cL1cux PK!q:U" __MACOSX/darwin-perl-deps/._EncodeUT _1cj1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK%q:U darwin-perl-deps/HTML/UT f1ck1cL1cux PK%q:U __MACOSX/darwin-perl-deps/._HTMLUT f1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKXq:U darwin-perl-deps/WWW/UT ɖ1cl1cL1cux PKXq:U __MACOSX/darwin-perl-deps/._WWWUT ɖ1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/XML/UT 1cl1cL1cux PKq:U __MACOSX/darwin-perl-deps/._XMLUT 1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK"q:U darwin-perl-deps/Time/UT a1cl1cL1cux PK"q:U __MACOSX/darwin-perl-deps/._TimeUT a1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Mac/UT ×1ck1cL1cux PKq:U __MACOSX/darwin-perl-deps/._MacUT ×1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Sub/UT 1cl1cL1cux PKq:U __MACOSX/darwin-perl-deps/._SubUT 1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKt:U, darwin-perl-deps/darwin-thread-multi-2level/UT 1cj1cL1cux PKt:U6 __MACOSX/darwin-perl-deps/._darwin-thread-multi-2levelUT 1cj1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK՛P  darwin-perl-deps/TimeDate.pmUT ^M1cL1cux ==O1 W T Ht`)ι6qj'=!z';!ҳ-5*jEq>wC9z[5g9ha(c=fOB( xN$CChy82I G=}v?lBFUfiL}ˡp,(b:ߦmZPK PK՛P' __MACOSX/darwin-perl-deps/._TimeDate.pmUT ^M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U darwin-perl-deps/ExtUtils/UT 1cj1cL1cux PKkq:U$ __MACOSX/darwin-perl-deps/._ExtUtilsUT 1cj1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTq:U darwin-perl-deps/HTTP/UT 1ck1cL1cux PKTq:U __MACOSX/darwin-perl-deps/._HTTPUT 1ck1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTT darwin-perl-deps/LWP.pmUT bM1cL1cux \rFve2IxѣۊqJMиIm b9ݍz+qЗ~ks Ȫ\xt{ުW/>׿TqΣNO :-U_T U,*T/:mP۬RQ"OOÛ xNgYDêr+^,uQ7a`'QVYD8ŸzxVͳ\p0K9`^hw$ @%wr+ԈJ sHd``X;z e-rk? k[ c7m'gdRf= t<%pjJf`=E:XvÍ9 4, r]>(fKNqxzB|.T sp2ϪkO[OYM3B)Bd`h)2}̔C4#GVm0H%QSX& \SVݬ\6! i<^'V9>${w?6m2hbیH`YYw~Wĝlv&O>^ f43`}@(CGz-(+,[ ?lnޕ+CҸEeRe+Nʆk=F0bD w7f8a*Bժ CŒc)Bg RRyiTZ mFb-"Gg$dت3b]Bu=v jUHc,ж'SڛjɊ"&>͢fA % *M8,[sP^{/*Q%P~:Y#ML&@5rK8 ;NLMD|}MuN.8U495rc04̑7 Bl ^ې? @!`S,"LږGU^}I[sFc=Ż^.B Kh(IH93NXk51ڕhۄ)IK z/Vso rFrghXvhLh a&[Du b'ǘpCnɈ5vhe Dm2loη)&80^%|5b)iFa-a86EJq6QU4$:Z0*`8< )ȑ`aD܄y$"#5)#6#a¹߽9-o.wв 5hF,Y'ǮO (9=* LqZsk\8=27RYj!%_%npت @N5,U.*g؅G&53I]Oq5D-A"e=r6STg1fyp6$x2aÙKV5_u-/㕆VXơ<Z.AsNt]veyT%FQuUܯj~_ΧN/tԺ7uΎv"dCG,=p̺u2ctz&x*k}ɧB 7:UHzWJb-_ܑٓMn}4M8 [Ӆy؞yW&KK={m7n3ChӜӫcBH|7Ǣs' `94N2Ooq`98=?AqeS)JN#tRL)#خH2C>B=1<Pㇻ(U_\>]+`52WP^g3g)wZ$dcW R 񍺗']JNIvh^6A !!r @in7[".gg%[&u.@VWcF,$ʈ_cT^Ctr+SRW3B\0rZNk1fVaY q{N18wH0NÓs欥1"n."u:?WEiy"ـ~7^D"mKTtwMM5VFjAp҂^%4sh=0U;NudO(Rs>]_D,߱fh%*FRUfd %y[YQl DKvt(ҁ6VS]D U Ij; ғW;+0"u;jg;MM!of}" W5%h]pmBzB%%L[5ӌRfqcM8,sC!"`U3E3؁a}ƖEĖrX(:S++y%3ݤ(V+{״ wJ֎bM2C6" Ɵ?E܁glNfmY ^Iy@ V< a H%k^@ّf̍w 쫃=Ro+|&XH9[QsԋR]tc킫~♥ ibso65-Q=Ռ VŘ\|'m:&m҉?K2h2,u ,S].RAnUϘ?_w#9$[P䀱Mary{?ixIˠWsǧ6m%ՠ Y0XVMqADt\q~ .9 Emت;<GF'G"L`nO[4 =,JJ'pJ-ۏZ֬x\I6Y(ٲQ-D*;%I櫳w镼{W$BKֿ{eD牬\_O-pba8 Tf1d̿v `_*.Vpi<>2NcYZw5D9=6Dעڇ1@t2e/ YiqूoԇkwQB⒝Z%X\Nk+cHx:GJTd4!(e[n{.ԡfaBvUUSzU-aPޝЕޱKr$3?ldc/ӻU[aR_ .$JWn쵠31+p&̴7.6}*J}{'9UT_ִWȬSI~h1Ƌ|vB)dDew[[x?\Xo.]~86u>A3sS U_* Ӑ/Xm7tƈ/%إ*N֘؁ebT'RrNsaovݟƌf"V^GwDT,ʁVڕ #.j0oDz"Y>v9=D ݯ_a%ʝ9|+ ^aqBN Wlܚyb{[QIOtL#Vke~rjW7|;a{*cGIշm-m3KOL'?

76 ŮQItBI=>\{k÷X:J u'8X)Y3ioK%ܠnt5ҷ҈_,9?pM ڗSE@?xC='8 `teф]q.ЙzD$=D쮭\d[btE_Mh+5k~J11)768rXq֏eڧ |2x4~gѽr]v3TEA#`}Fū$+KUI堼!,5~ܓ$l Γ0O >Y$:.}.l(sKJIbިXp sRbzWՏW!u{9hucgy;৒꫶!]iy/u8[ jxdYEe NBcKW(?`lKtX\tՇ8L]@fJ_bI'g\~Xy˼ C 燖@%5]0,n[t'y6[p(ن3_b:cV,/^;нϘ=x瘞̬=^TӌN=֌;pWj\q,De>$a.a4۫9/_܇Uj .) @ug5pzA8b& p?ތƗ#L,Ƶ 5NzoU0K%U~ρk4gճ|0)ϙk#eVL*3ۧKjk?_U&;E1eE6 yD (諌*Bu^oL`R;%~ិejG:t&v1ryGR{(fc\~r3:Mjy6ܰd| t$ xa~F~f?kkW &D"9[8x\Jgi8vk?RëdߺgɱSO[ۛ:Lb)?O0Hw#,HiQ̏3~pw~?=﫽V8W\mz$n`7'Qweyh[w? ^v__~cew=ӅNgQ0 L(uOM &i2UztT(*I(FhxYI&pQEHIic0V }#?;?=ܨ}_ O`4O?(o4`Z;wosGSyyl*7ݯ4ͻnE&1Γ Ujk}Wΰ/Tۀ3N$?wT "7;UUsqU{a?UkI[8%go-L ӿa ͇0_ȱCqofǟ*<j5ӬNav̳BxqNrgh/4,wfi-h6&a$e2 Һ/ t ?~O2LыxTW:h̞Qduŏ~/EJB6&lLkY_Y5]?a]٨Y>Y6:ͺq{N2ؤ~{;>o(Vd=J@:8f@FEAutۄ@.$D|5 C<e(7` "B}ܳnN0ʒ& kg +@*h!m'TVq.,nWAV ! y-B)|jMPc̵~ %cFyy O8 Za 0 ͘CLMQ}~:S>@V#3z&6>o >zU}{EٹWj;HV_ j+_n-Ve*De׉Q jA#Cg) 2vv?K*W[aLXEuNbndQ Pb+F&2b5RAu 2,=# *ȀJdSVny]{^m>u6Z[-|_wSxOej47$TMij.kNjj-~ 1v\h3PFCКaF}b?j٨Uu|_Ɛ]*'f4sy1Axtn7 6q7n!V۸,̪Ej#49z-y}mӡ WݖyFf:ZLU8vXIXbLDzmGV7 FL9k3HTfܬ" ~o#6X-?uv8;H>XSCj h؝h?Tw?GQD4 Po ќh!("6Ac-` &? 9 m%4iЗ`e;Ms$T5 dU-" c?C h=W y0aD-hq\D_vP4L; 2an@ed'Z2Qoz 6h7YD8,nFՒ1 PV66Rj+Z`M+wBUOe{AV,dZU}G{Pm8kAn|_ Rcr*H:&B7&CMaLBΌ3,BaxgC-EΒC6gkn"*˨ؼ@*'h s YmclrP艊}br*dϣ fqkhբG`Fx '!AӔF}GC5|nir,?mϑR ַ6 l2tl$  ϕkWl(| 5KLVX+9O]}$1:iub a P?Їy/qݦ .h>cEU C"i-/,K`d{~H؅ = K0Y# Ed͊дE0K]p%@` (f4>768'Džĵ#Bi} }ҏk>w}[Vr$evz0nPӈ&]#_t6h}Focح^T8fܹRA (7L}7 //kԶ;gr`5 @KFUjw?~'a'JnYR$C(L6 ҂r,ЩNm 6,2Z`\ῂnb[C:PyV=S8&.,p 2|PODP=v⠱RYֺoYɚχ4殕&V(  {+@649-|?]0|-"&6 -}7ͲVD0-] :=7a.;| sܳ/* C7z I0 o5H$#mݯ}oL޿}0Zz|]#ŋE&L Y4kJiCSlTV._5VKE`DU߿hdqh̴^' 53ac pCPl#JD˝\N FG,c3;I9*lH9q+ xfW_/zs, .P b_Ka/=:,NTKh~ȏ774~C:HGq eN.Re0'HVbzi@mh>Oð G=%܍gbZo1%.?om7| HV4 7g5jέh׼'L#L=goXukniM>#ymN-{ JQwUYehDla2Q:?)L,M>b"g3JR0r֦V)FFu3#%7G 4.4$ (J! ߖL|HOec0/0~RsVkDD­LoKkckn-1sCf؝7:m'+V+Anwz;9s4j8eM.@ƉsP-!43UVӃX,8!,)xۏd4 ^ ThHlAPu:ykԯ b=ͮC4:lxyJϙцS /顿# Y&W8;dec{8LCR[5 <쑇fd(R|29>qg'E4C0juvq(~/mI| Ʊyhn:ONqGfI؉2DT ") 2w [ņEЂpM|_\s+k下id8g"d>-Cc)q&If48R e7r[- Rs`DpѕpC,!dc5f`3!DQ8mldKTyASD-,0~ɓٸஸ2!U 'C.}FQ3Uѧs ҅_{X~_, &o%|kvf:M8#Hj N$-0O},A#no22'% {&畊78"r 2hsBEy=|Pd82:=PhtDB,A°2k6H\ d3:ر2MC. B ahu<=YucJ2fiꖬ=i 셈AA0чV*HM\iRR-`H5LHJtm3DK V$G}GyK.Pǭw:ǰI|$-:#ƪ-2B=Wbz-PXIV•oZzcV}[`N\y"Xhu0+fh fA[YYꢐTM *-*,Ȱ< am71A:Kp,m8)pW<F:\#J,,*2*8P `'HQk;dM>5<%\3iU|uK% t:T 2` VRk};{ޙHN')zyc:I`Nsfm"w-M=UGysrt9y)0/(4&~"%'fLX7(Q[ &~t/~鐏~4&l7a%~=pVA԰z]{$&L$yƦ1 `b,ǁ8c%06t,׺ POr_:?^uMJ;Ϫ2M)@H +VuH +<"%^\ uȂ)v$HavM:Kp ~B^/6:GHp'|"eI"K9[7au%y,6R~yqiUW^):_1f|(xح&Zk5!s}jX2Hgo@1$r)Yc\Ql>i=wq|:F Ё~BKk2LQ*ϝ۴xy{ܯܑ#lj: X^afv wL ?S%z HSovBp;4YNZyTWF 548S<里opC& @ γzAV8@C {yv!Ɩ:ץeӮˠt"!1KC6 ,Qs Zw&I8#!J u)vp5IO;<񤌉s+&'vFkNؔY6O6# ^QTc>#6;-=? cОI_Ƹ(Ѽ`ayӒ% {U"B=E|)fX\Buȸv/$PQ/ToCrB^&'&4 \!A KGnnx22H9 "\GOo{#U&D+dlB~s2MSmC=l3 zs]]նRқk.sk< حW ڇZ@,qy)84/?b!\?Ot3%S4p SR AGP9"3ҕ?f,6@=z|gxdy̱'R_S E-fOjR%Pn#hl1c;HVPJnyC* ,1* R삂?'#(JCL׹a{1K(0Smqc`r_cR {gb`Ah'"՞o֋vcJ0]QAȑ۱6 d r`[c B\:"@;3f9*9{O[nE'2w1"/퉠}Vi%`ڒ;E߲y `ӝIDnfg8%]8Ǜd{B(9CK,g 4ʉ YY[6빪ԴksZaѷG*# rþ8)%.Djy)t, #$ʰ,mxa6g?dω,Â(k_as=H8eAyҝ˙XbGX \cfAhDm˄ yXEuSb]}Y;?B=uVȷ*n({}3t0,2M;r2Fq{@4!qL^cÞDaL\ pRf 0v? 5LwnzΏ9} 9_p(ݼbej&I½džj}noCs MC0HR*D Rpj'U*1ԄpE@ȱ.?0UbRspcѮ'xx>iގYp%oraW 7Ě*(XW0]=/%?fnI/tzF ؁G[ZRd/$ZVRvm=zf }_dIJ& I3I/[W4j܁q; ^GϹf ڹ`=CØX m#N# `3#?nOl! _>&1L>M0 X骿",e[}BOK-K#?c)]Naj4|e|Lz 9ʂR4PBQ墰iFs^sosnyMLZ>ćm|5Q-%_nl$o$Q^XDeC ?%9œ="y_J{)K}Uo&jK gM(ԘcBl@>)=VUhU8e.g|٠"NC5EJQu;zT N=N>X%EOxYstq3GVPJ#>zKe| aݚBR7U81̿ Vkx[ P]qwl%~5ߴ)|壷N3d+!>7R9+5й-Ef"\#,k(Sj׭,?4 X`yLgh8Wa\#.+/k %Yt κKxp񚭔4L t!TZ@)Vϻ]f]C>Ɩ=ޅJPD9N˒3!u9‡(:}Ъ@K|;qMcZ'በiSuYIVlZm)"Z4+[88=gn Uf5sՕ[OU<ˁFW%9psK$e x~'WO$/k^Kʹ0rלɻT]V"Sm5ȓ@xH }؏pfުU>6 <$| -==koN9{u}8LjB7qQ k)X3hk'yJ(H ڨ_XSEyJ.~>oWn=a x蛩<mJd‘, 3+,'h^,{X>_g9-hDUGpuݔ5\gJvX7bTuUŕrw,ç(}Xc%9d-t0Rvx=fĤ25˞=B(!ED˵I2mZpX|]?XV$%LGU5~:6&t5E 167{ ,,\NJ8$yO?P8Z*6@Ե=kB_^Rv#bvg(DZ"YRYsk!.4YKʠ&`Kr0䞐޷(sP/YDd); "N+oO(U\w“FVIzWѬu^G,+oW}E1gV\:Qb#rȜp^rr\$؏@FJUJbmH+0-\,6b1v6ˈ'pήNviik7T'99Ⱥ.TZ[%ȴ`ndLSh(RkgVeŎ`>-ߘ~4Tev:Qinjt)NI.;j |xV9@ )N|(9!1]iTR,BsI~o_M8eel+t6yw1y=]As2`,-|cƭ0hU'@}owN0Shi2KUR꒣g= %iCN@J MOk wkю3-k͒yyV@,PjF1m] m(&+7g"(B Dud.{.(,az4$28, [o,;E@chc9Tzh*~bU4cT=ߡDkuUi;#iCBŒU509<6v).2"8b!&%fĭ:u9NB,PW`6dquŋ2otb.GӋ۫ɩ~ɿG%7ȆAwp gҪnS@w_9d) j~4v K.}o*kaKI"OOl#X0X-48-蠴 `i^ʬ ~:,+/K1Ѡ 3Y%Եw8*xn|ށPW;tBznFpHqpŚuY^  lvԺnh$D8(jd>wѴy8좼`] 5Ox% =?o? I~eM[bo-qkoa5썯xlL:fuUgHΡV=^~iuO\xR[(0?ma8 O;?\66|!BmSJZ}'_`L.˸ZU4pG׮=)j7USW7'o|z$/*nHZn̪48+{qFnOF $A 51n]0VVzlӊSY3.0.^7N. eԍ /pJ]pYɊ$ZK :+(=*B]t qSlIOyc χkb6NYY53J4X ⳛm)|d1ysпÿ? ~ragϡ)Dͣh*}Uː9 XSj=]՗i'n,f?䴥ҐiUVB*ټ»{i=68doC T1($N憲MC|?e>k&xNq tCSӓsyȠ[{ J葰D \)kIty6hՅJw*sgg Zm OW e_U-k58h0EM33y S Oϱ{- =4mm;+Hh* je'wrtvL :Ϩޝ{K4cܥ%B>^ߜ_rt.lPҲWdﶕ+IR:ڑ[M <akL'Ti6设 ŮuPFPཚ老\hǷ=:Mz,]2$ð'N]cR?kX8Nw~]_AގtBFWW\зq.-2NcĄ]9{|+KSH%|"CsB*I.ybfPۉ{u"O?mET><*ٛISK%gw厪G*S:I[`1҆AK'-*#ͻ߃:O1ޔy3VI$/|}k&,.JUѺ,p|YϨ Iy?6rIQ0 Gcz=y5JIn/`b +آAx0ҵ7MF7ji+*OH5_Dh^PMQ|6糋7Ϝq=S_A@b!0ӧ{2{J٭c" 0pErO:AQ ܚEL=g}ԔЉ\a1ϬVy%>#aĂ^^7lCxM8 fE%t*B/&ˢ.GuQlO~àQEo&zWEbWz'Dk@ϋ#u5i?Bƃ X=vؿ? ̓MWem]L.G) p]>SK!p iQE+H5GBETRU#'fJ/ s>B@,'OZ[>~CECg<\ϻtAGYk`%(WPD5$|HLq5du!qá]I1"f %?!E 9IױwKWWzzK]󵗙?=dͬB|jLйr˓Ɉ|G,V+J]Pu"7RrVU^8i4fApDTU封܎|KQ<2MޕPKL!-PK7!H+ __MACOSX/darwin-perl-deps/Proc/._Daemon.podUT JʆVM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKtq:U darwin-perl-deps/Proc/PID/UT 1co1cL1cux PKtq:U$ __MACOSX/darwin-perl-deps/Proc/._PIDUT 1co1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK7!Hf darwin-perl-deps/Proc/Daemon.pmUT JʆVM1cL1cux =kW9+`if'k6 g' Yqno &oꇝ gcwKRU*)h}]Wq ?RM4Md._<, 3(T8эʅTdfkw*oUXgDJ&ՖJxVYZs6OũfyviGwBGJJ(i(7M)2-zRˮx׿Gq(kIQ&#p?I"WZ*r.&,'Jq3ٸ Q!r!k*uWBE8b?˱w50(4M$_d1 QTv$ N~X^ub=[l@x,-$j8 ķ"`b?|x÷0 ;("\.r06wq1!RF "x" q'QcAGh4"Ǟn1kY i2~JÛ> E*d5y.:î SoXqC=3`{5Д'T, <0l44Ѕ }KZ|m/go R)(ף4.D(掘BIű,_,CFl4a!tB2cgVh+1pz~ӹv($s0]/ ^^c²ïz>ts/{)-v?+۠7fs9KD+ϕc [lG1D~q4T݅Yz>U) Gq䎄Z P{BZ#X,h0Ad"tj:+]evg3AAo}?5RCD Q:#X 0h^d Hj $RwT{L7b_$T<1Гx\x&1D޲ίq{Bom]:"@ԡ;6 2 w߁.5=0rV pRׁ-m7hyerܛIzRE|8E,3IT[LheI NL8@Qlci;;5ѓOE7fbALetPIB2PL$At4Zmytmt#0 *!tH8ɕ{P5 <*IK:~z;U`uO=[t#*}QKo-#l`q3BPcY4`(ȌЪ>%n%'TxYC!Zſ(hx?ć6~I#ޟ*q/'A\9 UڵVJ =^s̀^v{:"}hgO+&M/ad`ylkdESQibx2x),>~a/bİW3lư:cLB > ^5t 5 -xf1QO) IK<wo\S Gj{pjKa6knV-ǥbp'fو&seqXK>OS\n ֱ< BHgR3gNzq9Ixm=^3 ~ʤ,ڳ؎(@CĿ5Gb\b00=3pȭ VݰlкsJz#"7eOdmM  gksC-7l"oV[?8\AL/Viu2I7O $i )XeZf2Ru+b89#P["7RiLF!W0Bi9Vɂ&+Df32]/| !ggXku<lH`[p5Cϔo~x_.gh 0h~9>9; Z煚RCRJg b΃I,(0@4Ǽta3E )Dj# ُ$)xѝ KsSG~gqG騥|Pyg&<7K %N'//.~D^@RE@˧`xaDD&L(3siʺ8O,.xej܂_-a;t$""a&ed `54)sS]qL%”.)PQqUJwv+جpc;BCoN0:m|z&Lʘ.,Vn{{  &-NvǦZhM z?ھōsXu qc!,J0#҈Fғ\'q#bvrD%%\IVIkӛ|zӳ:@GisY0 -s,Ujs%ce!v 3F\;0V93Dh6``s޴_. B8?m[i5K>[6Y+TvQyh+ VF.LJ'fI`i%ry4}߀DzS?`- =8=lw~ ei "["\AWiҲ`¨#_OR,x]Wyiaj ¢6L ةAbp\UB\+V^5D2m+%䖛m,Lѯ ǏV"*2.Q֒ϴPůIrػ"B @djm2Uô\aP*oO5Ӽ1WQWe ,\@ R΋l D xo*23F:o<; ^R)DKC|Q~I7VUžeG;H ,`t%PL=0eZEe67'8iI0jMܶc1!pEoЗ/;2\m>9>-O`= 3r{^iE^>ܻܼܽI߇OAat^T>1H(W$E䙣r|2ʁ+jbCP C1h}4ةFUIpU50Ys, 2`ݐ(vޏime1o!_w;zg>0ʍQ2f _[ir=FMLj5Dg&B-|x Ww'-ċĭ}w^d1AHqϨ ):*~2-զqqmɔyUΛ2ʉXVd-b棺c[JexPd8KszΦ"JC[bx[gAsk /GǠxlI(S$䚲cCg g/[e>tG ƅ>j'%ج2(>ea~܊7j_W9 @|"U60v3,at$qZĨt0FDqoH,0Qv!$YKF3Eǿ9"kT 27/Cs :\ԤA)`AoiFؕ0ٟf֞c8v;;9<9=<f-{Jma\kjq†Oٟ)M wt1_(3] #4{N {ͽhؠzSfՅ]QIzM_iWXI2z(]b|ٺ^5-cVخ=wgpݝZʎAZ`=Ɠ.T}l7qtn/a >UxˏhخX~OLuϜHL[X@E{w|^A6M7|dct'Nx@YLvIJlfl"Q \%psSbN -m`^Y4[m[:Qu+XO9;$QU${ٛZ8| řA|m߭0Q{>jsVU(AV|`{K"wH\$L@aw#.=*t[$A`{tr-ZEF螗M_ *=mm6VEY 3SUEij ߀xũn-P@,?(aWlQPT:l$dyl ve4i!6畆:&VV oԢCY9O9ђ.1uNr#JX޾ؐ-xUܕBxUOvI*k$j{mc2.yռʣ׍$Jm%\|\\r1ԷFd욖 sѓjP,0cx\/1)z,oGZ,Nyt]Ơd1UB/zeoS7!)=miҡ9,OHMx}71%-raٗ]*dLԄvXίkcl+ka:|_Һd7 K]K ԮrRvmľ(dۦ$iӢLk]oX9x)YrJ YiΌVp([;]7Z7Aӽy8~O v`>Qg)nYdɑ ߑ0H,RyyFU nC'\o/4z4*76q0cpVXtP+6e\ !~72 תRPǜ.E^W:_lnurv9\ӝG PK _IfPK7!H* __MACOSX/darwin-perl-deps/Proc/._Daemon.pmUT JʆVM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT/! darwin-perl-deps/Compress/Zlib.pmUT LbM1cL1cux }wǖWT'HZ21B{$g=4MK8]jn$p̙9[ǁhY%o0 w'{~'Y<)t~4AoO: 'ⷻpOIWͬG~i4w ;u40 ݄ڤY2O0" s Aq_ ۽B}ag~ ͫl3|#; Gpw`ʘpg=tVvAR;=J7xv5 5wlK7YOt!6A ozPحߵo&@ 4 ݱG0Ia$Q*Uლz7ȏQ? ׻`E,~/%0oj' y)@I]$DJ/#P3.(Pa"z&0(OlsAs3fw3GM_5M/AO Ri K(|m;¬0?),-4r<[f *ISoc Ъ,KQ >>i^^<{(BjMe Xkm^Rީjsx9(VKO[$;ajm\ﴬ.GVw>O:WnW= y޿8?E_-m΀Ïuh}529~[IbK:)[ğh +6Yj{'”|)߲' My4A'LӒeR>.!erSSXuj2EmYbLb/l5*#4kݱ:>wqDcgͮ=ҵTD!V<_`Fo"n_Rojb ܖ6h,KZjՆn{#VCzP虨Yz74C,+U4tgПtNs9+Y.LW5?J\:a6yD{-\cr); ?B(1xCXOBy$չA4 *(ܩ4K';בE8p?EvcE/ZpAWxJ9^Qg]4Namό :LB[2k۰]7{wu ~2fd)X-G|n xQF@ޒnhP:WZ?JFzǝvIlERSSFGK>'T83Kֿ:;PH%PFׯӯ6w̃dR&qvB}9$iV ~^i!?9+,in'"4^寀՗9JUꂌW&uuꏃUp1{_V  ƴ4Z SOrw 2|3koV%V?/IqQ^L&*O=tjk$T?'ؚ\' )yY064# iDo+i\Wdʎš(!@oEKra:yJ@PXm? U{Κ?:\Y`:µcDV`|=mkS!lEi>M.TX*2{Wh%`N78Pt_5ܫK%ۭ2l*66 ;(Եw7G5ݐ񩻩H.hޱu3y1!l1-“( [;XW˫,hr>qi̦h3(c fGݲ@17s n'*\lUy=`:&8,Rq.dOO;$!ɈeRn.X֪QʊiWM=(ƺ݇ ewz/*ղL$'KH؊ Ĕ&1bZzpd:~ ,/Ve-UEkjq:ՄNQGFʯ|P%k#='0+.ۖYߝwTb%\CML3GUa&޾}7&WM.x+'$;;imL ˴_RSac{V&=(e YEy^ >APx)^nA2fdqOT&Oi._I_gˁ5Pȕ{_Mq8ÚI(6"pE{ՂR@Z#hxxxTg=Ul_Tx-y4]}LPV<oÙ!N:X3Èy<5zHcQ_?]6Egmحi,pHI%$ip*šz_~j˚OM.]n5]fZQJϯ+{҂WYA.|շ# Z p|t!X=\뒕h@02 :~o~jqyRKco'ANG΅.%&WQ["CE2Z)UBV9,<=bfJt=:Vp[8 [ɹ|*I`!>c֦\"/N-E}%(UNN|?bZ S}ƭlR%nDWL|o/[%93ݒB8Z?\ 6/eLy IafӨr5i}I y:UcP2~Ԋbx)Yj>Mg^hix#ŧh\ E'iFx`740 '~Ѓ~9uz/͡y(h%9t9U3"ڤbTk,YcJ~GAptX=j{fCXtc`qUƤr^9HG=PiZMt9CgƻxUcuo[DS 2,X ˱G0HQuj4'Tn[܄Ա[}hN3B}i? 4 ^۹\{ΡOxW72H&xu1>I^ `9qzӼzqmH0p` 0@xrjaj-iG&p(H \?S7HxFdRxDT wHEu RGF\LmJ m>3oݝa`/_ i[Qa '\0Lsr |@\ ̄2|E]l.H `\`ސ+^cM,D(XM~~H[?Èj|4pRNC PQp'F0@)5 nbWO%q.X\vZEOB-IHQ=' k$mg] p ds` D]ԩ,iB<0h gga x՗%񔺑`RZS{2>cƃ$qBRP' V$H^Tψ0P zPk1l"ײC*3|9tŎ$`w8d1OG5}'rTw1XubY|O£k[<:x-V p\bp1$:0,lL)4/ж@` Ur9cO< SUyr!$d'AXH; Je>Ox8VXxVlX$Ǡ*@tp^AZCeiq5Tt |iQvyo4ᨎ h: (-}4 - 9itC &sNy T l+lVuBeP/^a@@2$*# (ѓfUexg2p8(*Hkz9s,s|_n2^Q| z5o8:_:5L3ODnqU{<]]Zc(!g5'iݡ. !30OȶDOnUIMtA #v([C1v:smޕ!Do1KCFvGH2旋PVkn#…8a1ChD;2j,ߎK=yX>Lzgqz5~f"sJV@>jmj m$76ȋYwb[=;GHg+!G4R!. uP<2h ;Tw) ^`$g|?Mp:):.2ZɥGd1;?BdƭaD}غ/:LQ AeZC&rdm='fc$Z|jT^\QA٠a#.aCbP󈢸1U[ڭRהjxn>r􆇩4HdpP  .OL6CN^3T4& jEh"PɇjK*_iT5w~f,l#$sې> vaBN_UC >H%` )}3ŗ*I Л`  <\/mY1f4(FYR-Q`z4bH@nN;PRyD$B`OۊWqM24+S^R{zAIoÚ?,:Nʼnve.IJzmM XR86GA~T-™VBJ[*Ҁ%ESt*a]0|^G>:!8V;)sY7d+ZK9%S)W; 䩀lN)^e_('կy Ԉ :S:k<Q>2UI_~;tVꁺ6H׆"OHl%(_<|:ҦQsʡQ'3*~\fjhvE_ =Lqf|][ 蹺C]8r 9Y|~ժGMry4k%UwFHLE*k\\ۣIK29LldRŐR*7#/!=q[ڎ``5w /uGd:DqmI63Qt';`)Ybɢt nmL&$)-BbC< }Fs2OM.DaH<G[mwT oS;۰R摌sȽ[ª vRF-.i,h|9 mmmZR&i|@||zU,$'5o~!Bd.L7Mt@.m3:*2,J,VM`QG  [Q;,0ݸ@c |e(cӘYn203Nn xdﳲz^ptXjX0YݭO5E:ΰ5Lyx]A(y-3q5 mDkg^Vh:Ґ)$Xы%\Dm=XG, *ʔGo\"SfT ٹ>WA\5. ".#3UvסqςobXhʆU~R:[r.v)mF'`Ԋwף0 \/]ޚ5Yml +E( KzvP& 4!7YNN I[z jDbSa%c(drY@Sp;N"ZX+cFW}>7Qy9síH=Cwoz+*z.T\ yUG4u>-C_< ^\u+SYQMgrtʡà i gWJRyYV6a<YuhEk}WTdF7 +I !f(ft)9QO1" 6VqZ=̪? 0{Ο֣0KT~e2FuCe& [a֡!eŧ:5@x{H:qH!s6U !Yq(m6VRQ#[TkJqr22NG,hs ]ϱxK1E4y^<٪9͌ ]EʅM> #,f@ ],XATzT*M;r[&{5U%C.d2iU}[9t9BxP&,E UҪT(]RU=P%1Lx1F|3td* rfW`Z.^]]bJ[(fH::SޅZX+!XXKU);Z[JkD}ҦFW/[5Ep!f[R`A[½ZԪqAk]knnفp1SW ~W,WU+jf<]V)WRV-իUbժeϮZ.tiS%%eQV.mc ,1Wo?KrP=[feN0-7 P8tl#.}bЭnLS^*L( DЃ.xƺ,{P o\)$O.w?) ĩko+Ye u+y]}Y#~թ_Y<f#J2ՅK^ { *%XJ~If<;;&y7+JB:>?|XQb.K"Q2B=ʈ8w/? 4w.]ZV` MJE(jR: ox#Z-j胿4v\L&T1Wbtse!;b.F!tѺy3.+"hT6K5"归ܢ>( gІxVȇL۠AH&<'F!2ǐ('(3ߜ2Tl$&%9}F&eG2,kR [kgKc+UB/wUDRY贴:.d%Nf]%˕7|Y:'yRA}\U$"\{p>qC~~ UtƩ te+ڼp<P8LQee ,A@Jֿ{g7?\Hlलɀ,LX"|"հ{:{ɐy=Ք&BvJϚ_N2"VG5V4a$X|ɳfɩti2)cwϮcNVwQ=N;I89 7m6H!kX{!h. \Au}}Nڝyك oL>|dp翆Fͳ~E>2@Dq m^ Y"9^b0F$[vPvy鱧n>^~CE2kV qd $9ɂ. gϠ߬iՃᜓ g~VP)Yg`QX੆-˦>sL\hzawwwu`+ 3:e')Xp0|ߥE>U~a gJ[c]wN:&zEwuϦP*߃ `jvKŕhkyi{" Ƿ ?|…s,%O&yW}~9.2T'}`e)@ѡ|҂^U x)#;t7JPKB>M/-/PKT, __MACOSX/darwin-perl-deps/Compress/._Zlib.pmUT LbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/Mozilla/CA/UT 21cn1cL1cux PKq:U& __MACOSX/darwin-perl-deps/Mozilla/._CAUT 21cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKoAS darwin-perl-deps/Mozilla/CA.pmUT [WaM1cL1cux }T]o8}ݨRAjt)lѲLAjyii|6I#{ιn(B9’-*?SsjyPaۏiJ]i>!&m2Nd̑P "uB|UzL-'ޖXTt]6*do X%tK~YHލŞsɃ, pч5kQZ-No8zCsh1&?~@.8+ LIəϠY O PZgHU( UC' WV/"(iMñaRiaFk-[RTG%d܉4ms+%sDܐ Rzp<_7[ebD-Ǫ`ا݁>q!p fh zƏ("$PK 7PKoAS) __MACOSX/darwin-perl-deps/Mozilla/._CA.pmUT [WaM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKoASS( darwin-perl-deps/Mozilla/mk-ca-bundle.plUT [WaM1cL1cux 1u K.8p~;3+dӾnEڝeG$ #ׯsyml' _C >Ŕ0Ç;&i|p: -'1 :pRD8u0įpV0 i̖v% ;}{s {ЕS۷Z+j)ԍXLr=w;̎ãqx8k}ꜼO Mh$æ5g!sZâ 1sc?µ`$0$a) r v%CMWkHaQaF:=ȍ*NEFgv\r$ "sz] \bÝdLsm$rEC )[.@{V"5d16]x{U+c""(oDH6w"x7H 3Dޭ"OA7Aa1F_">p}pLAߧx `^ ǝv♸*2wPįk0p1_|WX|$Z|,,z6h\Į'~ Ư=o4؆u|z4ofgOc_M\;5nfn[78KḂ, xؼD1hf iۏmvpl[em&QC{QE;|b'^\]&(q=0znWpQރ+U9~u]qBϬXL(,DƁ?q/tmy(<\G~Ҷu N,٭V8-O/Z$'0D_Ӎln7sN윗8\of*+h6QC9FMv < e '!ЩRh!$n >8h @Hzl!zPTʅ D j9ҥ`ц#7سݙFbMQȝ$ѨmTI[0 {.%L%v[5ܢZUSJ%.JGύw `!"鷽/?|~'Dgk|g~7X_k'Gv YUw7.i\dnd^y35zF|`ɱDPt+"XJ#ƶt 1$@ed \bwh00"}rKCvF܂!3F*bͥ ^C0&ĨGYp^w9HNE-m+)zj.ALp胹U-1}8" k,AՏ`DjBL`O/|k?eDQW#39rh B}ֻ{ Sh\J99iCAk!uD+Z(IB@A9P([k[uʩN)Z/\#%LE_le 5Vi˖( [- /)T ;տntUw @bO͍hȽ{ 2N&3r *1RߌZcxf-%oB;(!U;sn1dp,v$`k\g±cCa!'(;cU?ZblArٗ,{NU,`}$>E(0uNȆ# #O{vOf5-Uqp&"ێJ}>nX ¨a](y_;[q@K0s*`xE ư RclJGqQDߢ,T02\aU$q ?vHwx{滶;61nw39%\|7||RKCD4+E茮5-^yxH QH nWGx*̱6 ĤSy+'W[ bܤEEL,&xj3O惿%k_=u &\ /̀* 0pYPBM$ BV%N&,'V`a@-inS'!*qA,~(rU7j,p/0īA 6 Xc(mU@@r#ZtSȎA3{n4t!Cvl<; q>S厬hLt6ƿs_CKV\D/t t6f,Xs ` 喚:iwo1uAX;}`M*qa.-AN"̩M;p]i_N2"[-IjׯD9yG\ۨe=`m,0[$Gܨ8x0,#鵩XEyMVFs G@dȶMc~ )M $lB Hpd$\_=[(3Tl٘}M?>zjiK1,hs p7cBe>)bASɩ(< G? } ygK՞ַvn$8.xF<)3D+vpH>UPk< fs(39, f֞Xu5+n+ 귈j#8UX$usR@/iFe 4 ,#U-@Dni6+잱b9B!oؤE s\ џEt^f:|h=@V!^)5UTJqCQ 8Rz0,oZ0bhpڒ) }]ʅDvno+*@C Pb/%Xp's0rA PkC 6)fE _6$G=]>ST*!-( Q ~=f}UJKd7@"FU)B(Q\n+*)G8wbmZUf@B<Ԅ@ ./4mspSWg 'vۍEt \ R+ Si9~ γ q6w]j8ػNlvC#B) i:$b+u[[9Rku}#15j\c4֨mV Yg2#Lkp_FK~z ӊҶgyp71:/fa[\eT,:a[\"u{$KCB'?0n2,a%"zh@ r kSJl2Lc1VA|ƶ<ϯ& {nNi{Ga?bֺ%-VHPe .-٪v9#d,eK@XByc lJ~mV?-FGtRA 8DM}7A3("իicsgo(E=-"iDOZmJ]bi\#蒽;K(]ߵ;?;tby8f3-3T|jmvJx>&2mM-Х[x[?"bS: u a)w܉xx !S80X2{D=8dHx5IˡȦ.o|8&Cp>Lo!O LoSf8%-[MQoŃ>Bf_5:BͮY5VBBRU")Yb2֔iwOf;Btb;9 c uNS՘nB INv6^|X{~9aN}k7N}rI\ܵE9m=Nya#zMj5@s}m>@7(YR6Psտ93x FjQk9)@VfGo<>n<ǟD4q<0'q_n>Ɩӌ>~%l$HKWJi},19\"hxIFkKN>*&u9Ι|$Ѕ0$8w .E<>z> d D-JMJw_=ŇX'Εh@$ zI7iuzt|on휴~K3;/oG]IqO{rzR/k> ߼9=~÷n}W@EW] #/h QI't)7*ꕙ/zNUk(-[UC7ѧ*^छ2 VYndͬC Rt0][V:ݽ nXESi8=+Ċz]xBXS`Ѥf7bzwL NuEu'Ӡ  'Q(85rg +cQ8%Ǿ,sp~&(LINBgTǾ)w0] i|coZ!gr%7DtJ& |H˜r/=MZ_Cˬ|wC7rlg27l="YV=}v>:o;fZӕrWz"F&bnM % $j=^~I[L ^n-Ȇu6;CVtV~w;c֩!KZ,0\9QP̅:f0-x,|.Q>h#8ߛ߆Z)l.>΅2JnކB)zvއ(?_ئjSc>K]Ow-DTVxcթV?m*rY"V]X'BfF{.ʅ]ɪM,]Bq# !M\m|6o* n)CQP3hPUvGD좘݊:[~msQŗȴ5NW!M/Z 0o)R\:˥3[1t#v6K"6Dw.^j/jxmo֎!]1 9"c \ 7PfA,p@8e Aœ9YWf*&2j<@C⢂s .dS*Wā a 2"w^'ҁ=&hqұJ$0[ ?ApA-,U{كǀMn<.#אz0mP 602k|>H)YskՑ=rESe~3RE+*:|a"53J;tI|xXas N J}[_F?oYY5* X% xQj_al#i\(Nt f~Fr+.1}=E C?A+zo4HT>jHoBȵ A0!lZVuVctuj}=>DhHU}W!r&6b@I';7c](pEI*(!aϡmOq1)\LfB,jz0k'hxJιq&-=#}"Tۑ_E8@5`FUe>D0uLbtpS Aj,Cr 5WPPBAKBv96Ѽ|Π1k@\XK8JF5fQ"[`MF RY'efÆZa pQH?L)>s>-BKbbȤLtɤLqd*j'oݕfhN|.;i%EBt7RDiO -do]h9>6 IBUH]lӺ{knnFC d^AmW3ci]+FW2#@g(D&/-'4/)*T]ۼ֡%tЧOX@TR3}H2ec9bG]EsBt:BU|}Uyi=)fXV}#]2y1ģq_ Aow`xV2qض̀4#COJ}$ ( ;; eDplu<3 Nr8. мL5'2D:lhF0Xۢ>lbhShRYqFB:%W1o(䐦XΰKPs9(@([砥$8_ fzT`NIFރ%UxL`d1KQ09; NA'ӊaVmPw3>~3KąVk2t05z1`d+V/pI]EAVSPи~1e_o0x혂VOd9cW$KzYog 0nї&ri(,Ǥ5f(jڥm*s@x|p/B{H4NTO㟩jr%e8cx s(3ho2}駨>(7!lGM@1aWmK!t-FԁkpV\Ov mR2[CY"Vvୄ*vU~K^ Fk+| T,8Ne,dOWHSuṃEO&=T_X}s5i{ JvKLNi#S0y/tGQxdBq/XӨóiK %`F7R TXT@U=C-cwk vD&^〵uqdݕq`lj~jy* a[jҘ#ZY#֬DdԡκPFz뎚x{X/X7!N57J*vBz#[ g6>Nu6NSa vߍE`\^e)iFh\gAU茶 S8gƎ_\Wʂ*a^iؑ.1oB(|7 Q<~8OKy`Ltip_,nT歫/$a{v"uūڂΏ~(\D({ <&t @J50u]iCة`- A8GCJtCB{,`*5 Vw_ C'YZh?=X{0|DqTw@ѓa4E`ҁK"`k:u4$K y%b1Mv<1uQ,U<A0E`JYָTI{L"kc;#VCWDWw/#(ظ XSڸSz ^ZYTļWyʄ}JFbǔJF*"E?U82!Rv*̰*/CXGk^s6OݼcPȽx&D%5\K _IkR{2>^YUsrhorD8kބI:D\yTWqk+]$?]KҦՆ6#/cuV҉}I-8 Mu9䊊?u?PxF*{Z1dhJ$֙~"ZۄaxqS|IpIkƢp}s&P\S'=jD?GU^Rf1smF:{dBcm<>K'L)5_4z|{{%,Ą T]/Ž@sL=ֈNl"Ml[18&LY(aWFl3PSN4Fi" 8t0I:}KPڪr8IGH}QBE~pI}ߴ"P'/u_S_|CT<!VzK5/) JL402DZ@]oK,j<-]L9e-m@S=V;{7cMf8ٱNN7C0A*\C@+)?~zSq.%'1^ۼC7n(A+a:i]Ƒܿ>EYsēٛ*k|z fOBߚ_*ظu4MHL秔*X qH.BN!HV34(F$'Z!bŚ|q™tD.9/n2TlI7$ruHp:jt1$OnH?fY/&ʓO@}L?( E($l3a;[6*9e Fd#cOu+ ,9WfLɪ|+BCK4טCnٷЕWv{3}ˮ6(Jiy-Ƣijf&H6u&XzC$HEPY4h#oOBsRXQn{I!qMU"1,>ީchBEn}q%5~ܰK4 b(=U\AN>[*jK}nBs'θA()l'(hVʫ,9'IsQC{%ppsH€Gs&8JTw˱S~tyW٭J&-aiVhY0Kjhd&5^&GfΎLju7d!$iTDI dUTHsXu~C] RN:atĈ]$mPu`ΏXQ<$50-[RZ}ۺLޅwy_drPTnP5'}? <5hW "g}б2U'@5ys$:d&HEoĻYaN*wFܲeAZ6Έ23#MN*Co}b%X"V1tB"j/Uu\% c>)6`_J(UzOlX' J ޝ~>ֺW-4jf?ަ<2Rׅwpޡ'p'sM|8b@)^p_8gc.C5/i>sa@,+ZbZ{M~@!7x#7 =87Mw vTR;m`c9K>Q-p1~UZrt|B5*yJB)@Buf9K<'yR|Dk=/*_u w>Y HvSwh鵕&pYD{90>L7~uޫ-n}5ֽ ag뇦Xwy8#"onGc{R>?ӳ&j+x ?&8?`׺Osr  /+Õk?S}z=~C\F hѧ9^ et_1;2LuiS ܂W1b nVTnh7ݾ`=nW~tǯ)2?kjqtXҡ4$24,KsY6N5_aⶵe$g->3rﻘL:g895`[.vZN=-ETb #~~E9Ojm p. S#T_ AT-Zpr f-cߏ0GF~`+k5?gyUj`!ghhQґ-0P'OFGI~ Ic0N'I^'BeKaS?z%  7tq`8i7R ?j6yn[VA]._Xo@|wĸϲv; XonO E&/5FU8GmDebCEox,ʱ6'զ^eO95k VWe_X!qYotc~իNl3_EeZ\-ԣ{-qq#WD+YdfT׷N䬚B,<*l+тϴ%X|ALr*O_?iP2Gơ# :x 8Ă5 8a7YCiW,ͧzsݎ=y)3:6|֢Sx,Pq==Wl\op[Km$gPzL)H{H>߅w$ysU |PcT2Q߁7Z~D4Pw6wXj M&TVp+i919 ,w,u1c)ȡε$@ %&з.hŗ/|qwTG~oK4O -00^#N1(ᅒ"I :|Lu]Oɍ{='DPE{$ Q'sxE9:k#R-U,|FA+E\3Aca5Yyb\i!S/x|iu\&V&F&\E`dB ,pOT 4nbKWEsɭ 2yj0J1ϋ'y8gw MQ{M'Da-rV=3I|rZ( 15ׁT z0&P8%*7ƹ&|GCc5~ke&P>j{TlMN&(Z%Iyzx;;9Q|;noxp_[v[]=@mvBAiXp0K,Pm<&i_Q}x 1ڻa췓d6V/`^ V]Du29]pO >?Ńr"j\&NoN隩jLV30͠%0bжfxK"dE-h \c]NX3u;&HPhsxZJ1 jDI(u'Pe٣Bö@l8uYq3ɼtl]z ,ժn}{3S-p\ ԢǯPCt^K*?˲MJ<](WUqTRMzVOK4&mɟ@þ9q"&b4UޮR<#VQ'rnݾ2.Ly%_lj!NIg֙>L\TUt'LOO6&ZI죴@lNUS#uU#.u+4 ZBnbHMŪ{{c^#j;Mj9vߘ( FOG]h ٤-؏& NsDdd3 ?.c7S{%c8 <`=`a׷J<8&gAO Z'V$e2S0t+oo0=@hbHɵ)bpPyNeXH8;9++wj=UH85",ݐ-G浌t-/ TP l}^m!Zeo27TeuSe}O7BeˎϾNB(&\eʖ˩εf4=ɀ@D 2>{zՇ'lG69DJl=\NCz;6I՜'szGw'c8 T&S\2Xī4[L%a&譯^ә7L:K* vZdCu;5zrSѥ Ϳuν ڃhlD@/g"d] 9MMho 4E$9|kDuHVUXGk`-e_F|H݁/'Z78("6fDS'h|Ne9M}'⡺U;'B8 ~&KP6!c"}!|=sW;>+7e3!d<)k6 9lok(6U5E=zv8B"4D^/-cOXss%62#8{jXPfz^[LЇYw|B"ۚzX R .Sb0kIn&zrΨ.zLNwE@ћ7}Atjƴٔ/ z55G "DeQ!@3WS`';wZ7Q!*ds4|hswIO34 4.52wƎGh':vk֮Q2`ZH^29 _YGuGsz%8tՊ*/58Ҩ[L+f7hn٨̐ s~x||32A eJaiV4>y߸=$0h][C Hvf0z 6`@`. uըi~ scc׵OӭhS;ֻxNRcKT3b|v4A &߈\V?ny.&JGA`sة4oqYN62f-`iv`!Znj{vkʆ493^>("`5/Bnڒehw^ 7GCHh}|{6K̎r_`7xҝKr"p^.nS|=7O/iW#]4ov٧:3J}n/'.1Ŗ kBh+=oI0gBBb ۳È^rJ]R՗ғ]Ɇy: F$v#`c0#% {7:l)2nຏݻu[3cKl{:եS$޿zml r7U h g =[My 9o"9ILQ$ Rw//5g"tZFR՛ hGд*ĵ֎i}m %˘~\{fGKkzxwd3_Wk_#s::uUdۍ+Yf=\JOYyI7Д'qӼ{Ҽ8;3wיos-ˈ ZfiaJl} d[7=9q-Uo0vE3>ΟG-Vvvw+U,L[h^kA~g2ja`GXu6k◥'i XXbwwN2 Kfd{" mYŖ^bbGn^$a gO8SCCxQާ7v$e+:/jmf 2:[9̓(֛r\xa3a&??ٗ+=D2x1b hD)x($0~ƻn_N۾"t9 I諙x=9Gࢗ!t84Ve > >j=]oɸ_ 3h 48%sw(W¥4JCf(JMpK<0a@;uVk:n'a ]rVyy.hJTguu`09L=SItH5jjB*:DҭpB4;s$,Je&{x ȵQLJLJO-qv'b1_HɝYc=150kvvJ=@sYy_R>#<FathM Xxq4N#}yLr]$T{" }v nq*RrqS>ڥuR4\Gρ:Fzӽ~@YL>zGmĦ-Ӧ9$yBW-hK䘎K#?PK)l5#2PK(ptN+ __MACOSX/darwin-perl-deps/LWP/._media.typesUT 9\M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK(ptN" darwin-perl-deps/LWP/MediaTypes.pmUT 9\M1cL1cux ks6s+2z7v:JJ媁HBL rR|Hrrә }?LDWR«gk+1ͤA.?*0^g:2GgpnrwgSYHcf+B3Z9x2tKȥH ^E_g;da$Ȏx}D"0O!w3ڍr-p/xrӥ0nTH~RL-tƠRDAfvD'"aӱkk;Ξ;\Ui?TZ>fg3yYgt8I5mXn!{MkYS|D616X{ݻ!),udWn-X \T"2h El oJY:Y%K^e9KϥUV]XG+zZ=3GOۮfb۱|aL۰MRA{1&Qوsi<tU ^c1-g$XIwS- CuѢ&[VdhD҇0nI: -a$Ұ t!P>I@5j%$}85+70Z/UyPr)˻oO"m"$6ҩ<(6e ZN=D [rX W:$s.즹`.~]G]X}d .$ZQd?c1t7m``-eU:J*-ŪTUFAhx?Gv(ܺwco^R.Xz sCY]"U}<܈Ԋ<2 Dpl| q|=&l88Ǵl?`р%Y]i2v״5V#rf=w MRDK(}q7DK0d K+,7iTg~ ,/1fhrQ+i]VڶUfŸ_p02BY ߹96| s ]oLgCXGy(l 8ntIN4݇I)}-7d}@̍xzG9i1^y6e`5>K[#.Kx78m4g{FaCsK)C"3_{rrf:;?]Ϟ?ׅ> 5JshZɯ_^ }Vҟt9ګT_1cZ@KqMbI{!iYƊ4VubMɹ''%X &zTCJ$^U+C>,dѮGVV"/lCI&'hpyU5N"A٘d^ ߅/[ TaC<aW UvXbo+i TDRD[m,EWhzV/}L*0|$pY#a6xU=&"7M|uSbm  Ms`Q-ⶋ^#=7pΘx\o A/D |I )5˸(G&9I ~x:b,jGM//Ap\].-<~=~QLDsE[.aK#?G T/U4|r0xUy:vhYqYDX$PgiZ<>fOE܁Y:狕y>gI2K X_p,i/E2RX '|bOjr"itt|y(n6E1܏/,/I~yc趈/Jާwi0yz2Xv\ EM4~>$%AVxWER^Ez¡LVƟ w6o/qS*\u6&^Ϻc.HhG4=1mΊ234=_4-ʠ!IJ:Te/婴s}7r' es8O}m;pd:-ߵΙHY ?I{@''\o7>Ev_e5O.n)w?>s, | x7 N{_YH4e*ʪxX-*4YEȣ?}z9::O_<{6io$v{ѽtV,ᇃm>/cW,3)\IZTY0݉O+@oN+ީ7uI|Juw*^ 8$VCh~Cq㉺ag6S|n/NvƑDq`@0`p!كfЗ=g~ kZ۾vH:4!T;Njj yTv|ieN"(}3[?4?=1J۳7.ՠ~MFKrcum~Ro[_+W]o=Ϛl$m 4/ohamLuL4#O𯯉*࿝֫9|OC#gc?̋ 匒w׭`It?qϣ'Lsl.olSuwzoool[+_zo:7~[CHkmm?~ ryZL^f0x0l)Xtm0+l`šms Bjo>w6ȼA59Ja'#ou/f)YᎠ]`)DjG1re+K Wv^K lj߼89i˴ȧrY~CY:/9EU-:7A:Rwu~܊;S{ (DjO0 P qZV~31w;zquU)f\.a w%{2>I F\TXsU+fM?dXuD];bg(V#_κe<ѳ|,Mw5t=E}s5ޢuY/i :Nf<ߖ_=Q(рm_rzdHC (sGi'n47zT^4z2~9:z$ßম?[hnOF^8;擃ݾ3K0߱WGW$>2۵jN.Rrs<ȕ#ptbMRy/n%f[΢/Ps*僈`Dnh}7} JG?yM/.SRcM~Tx-r«fתn:: 붂ܝ ~/'g8Y~O>BӏMy ڨAsZJuK;kU> S_xZ=T\V/SU"~4ې6~(xut0}<;<|POѳ;}Є/4_٧Vgȶ4|`ýcRwz<ÿ7J}.$FSLJ3>TF2GH%z鋣;dF$B΅c h>^-zDp,nsnr!;p5IρV㻸 {KT n~oM5lvBy:3:!vg,>ęCl%C{ʈFlF bݼJ ĥmlqB%*4.&m_xulw(`4Ly0(3_Ŵtc1c*/xm>`Xv9ZlkQ Pa[I6[|O#}L(ȐuIe6&"W:;q>,J`o@@,@T*b0xnk6'0o[ gqpnf%g8Y;Ui+lL4\ں>_%?eUy[_*Vw13,n]5kE[Oo2Ux\~^D;B o|z_oJ^?GMXy~ERRyG0YVe߇4yr:EŌt'dW\ljpc8 9"iл,݋?-Nw׌ Frăc p7mP 1\PwCt~|q|qg&Efr RezTZǜCuÇ)ORo&EMNlbLR piblzhG p> =>bё$C6"M~[]|r!)3JWIY 頧a 䂇`.;^Wh4>;X!LԼ7ס'FdĜ9‰P@wxroٿ(E{_dpͥ~5(JXWTl>M?fNݴ$T dpGc#`䒐f7ru/ͨ8d:/K$_o)~1~@=` mB Im'Pȋgx`,Fo ԽYC3?E-?,mZ]2`1Vvݻ'KSELw8s,Y{œ!>7 ɺB{nFټMv]Fq.0/m>"ZP7޽{'LJmmqG2c Яo< :!)~}$M.yb%d,n]@ā7#+Hb8VqsQG t=/<]|j JcS}Zc;r 2!:N$N˧Ha}V lmPӿ,Ϫr~>V5Y@Q >?>hݹdvnUt v6/IX/Wmx]l4ӗ.U8I)؃. -HM?Wt%<ŭ_ڐŖ> k+~qN&s<8[|C0k 0$>bt>47F;awG#(JogM-X֧@ù޲#U6y9oxi\G#`Ȥ˯g_~2?ޮo9`IfoncN;͖_bT,wcJ Fֽ2ATmhPT؆ZG ! c8%Y_Q ,$靓DZ$WGq 7?;{Q=dV/ո.q̴Fzkǝlku,#Q S|Yq q >B]ͨFto &X4HG]$hm7;!k Y3OLAvtxiךuБIㆎLQsnZGڑL  qu!m Mmt?87'Caaf#qGRG'v:uM@<:>8A3Z~akF.h ͵/@.GV(EYV\r< b/TmnfCɅqP0Szx^RqEUT_S-5rC-̶v,p;XvW6ֽ5"1]wa1`O'@?y8s{P(ޝl I4 n ɫDE{8Sf]}Bq/F6!ؚPemVNtn{dviR|6' dۗ?8 uwm."|^/e]Uy@i0U2(oTtZVZe&H1cMS0-JQAؐ$.5׊ADHuG_ ql7c Ԏ+{9y |fAg~ ag;7yS;~ yndћqJ6Mi㽗Yǂ=FbZE~<^@mT5V?ʾ `O6q9Asu-[>,t 9.3s͒sn w&%`˕ 9aBړ޿q5%qqce03Ųкi'3!^W'CQ;9Yʃ~Z۩⤤\d2NR$\Is*KڟV4w"j3Cr *Kpu"!~orڋ .۷>q\;m#ǣJ$@4Og6>uE th=5YP1ڇjek~L^az<,FG~~k"`{eꩧdh؈uW:?F.x6mxKJ[ژx5eq;0h-%  :/M\VM_ bAZ\7v޺ݵ z5liGCA8]I$4O`> d4r@~"Z]%jwPBy 2%&+_\bu{l|K=˞RZJ!}y ?MR+%JO6YTLe2ٸXGEGV}-5FuQ탳g4d2垚R#e lY}w.o%/0,ef ѹSWZhv"! K|胂u)݋[_o[Kl=^tWZqɮCl-Gq$?Fֿ <5_{NVc'RݎhY4ȅA:*yح5 /z2H` 8 ]x*X^mBxu uX`'l\L\CY5o?;G)8R *igX׽gNym*T/-LMu8HkGKU qd Iv0  \dwH[Sho GL8,A,҂(0z|Iьq  { RDB $xxN[M!O87/nf\@Cn-Ykl8wtK/a,a5 V@$!JT. O }Kz$}ۗ>oJ17kIfEiu63T!\v- /4'P-L$ybF݋̈́{ތn*F1D䱼*=EUW5(앻*,u#k1S.7TSK^C7/QRDOƌR4 q)5'Sqmd6"zNΡߧoc&-lZs/P@;Si#g1Ok /L+ah5v]n$bU'dK"8wWA/WWj71cܿ)Gg;͔`Aim,ncF?MAI1 <Rofq:fԾ敄MgBڔyFCҫ(R*0lJvMB_΂iN ҼQ1]fHtyLs)8hoy{]a" c ;NɑE~)ێ:A}Ea$\Y-fX=U)@XBGZkK?W7!mCsm ~7>`$TNmj<`Awr"6[{AP9i@|P硙iKI-ԭ /q8n[fz]R;gTVPM5B 1jE kʹl[nNn{_+&Ѝn8϶[]Tl8-)g ~lEHI/7??X*1_h!| :Zei^c`lΠVu4%MC1$ FTx*zӌoT!5:4XRХ7%+. :\]k=߭: E$`_ґ9-ά9.MrkN.?=Ϟsa0=ζȴ@IKLE9~w΃m([I[ߏJlPiVr9A(:K5c*g̕kH0K"Q.>_)8企̐@]k/NI?>;"UdvAr=:jZliy2i0+Mt]69EHD*8 I^8Y!W^QEtjP;؏Q)U4B\#&̮(U9܋avx[M1WfްqxjL#?G"Lu/)91@B"oEj/JwbTA3>giۄ6j5KiÖs ε0tnJy*_UTQ 񉓩iyq G|!O/ Gi|{/&xvϪ0\ּ@" /2f ' hZ9˒&F J,RNPYc_/D_9z(f,G:`6ԔCC3` =G"4=T e̅rF{'AsddнJ $'yT)NreIqϓ{Bܦl6`/~pU:Ψ! q\S֤hi1yM x{[}ib6wuB9K{MA}d3ݲKTi&?x DdcFny:',vIH`NtV"E ]9yjU;>T3oĺBG@ CJSu$eqVތXrtt8n@CwHM%*j7*pKR Ni|`i(%z̺!BeZ4*ܚ ǽlN,k n$Y$ N%su ȝdQciY%`i{wrW{b# n:NFB V@K6s>"ru"r%9>3q ycx7;;yr1T+X!x?(m#=hs*Q: J(-8M&Fc^0Dp,=pSbGWCw4R k1*M͂ǵ>#Sݭ "kh>bRМǴڢcJqO}:gͩF߄ɲ1SavfV%b/SxԡbIqGP)tHF: aMFч(:"S#8Ӳʪ%2Mn-7KtS# I ܉ q3ӦEaVvVJg+T=MY^.́=$9 ]aqZH"b1 :F$0ҩB4ҁi}q?A b5-* p%ӆVľOӊl1 5q2%}8^hjă#Son[" 2p aIQ ) )T?T*-$iepnIrV.T[s+R^@?Fo`H `54e8XXfF ]&ȕU-2ME)Jg<-;fO4b[,dz=M fbgGAg뭾MJIsh4 Rk2ls$Z@']E*g : \6}y5]|׆Ȫ \] S;Ƃ[Ey#,2/)W o8 GZ&&t2B[wex%`Mx8#ꀑciՖBd@/H}k)H@$k

c[Qt!pK:lsD-Kx˦ 7tj4 Oa6:Qckp,5~V>b(:_KWkz0TK߯,;yLihl%v$Ȓwgg iRDY%f/\Fwr8=L/Dz-\Tдu??|2Rgiuϋ--UMP5*ң84DH,1pي  >X8tl#*z ?GZ9G=ƒgWvg0udak[i?D;F͆wTPO^1rv܃C+tw^ }Z G'.pv&1`-vu&_%>]v$b)d4]EkÞY`odjXz4_3egdCNQ"c'ghCgɘM\U˞D;-lN+7qA%jژQB-Q*yOGp>J0}χUYd4 \w"^4IX~u$jwf1`Iov;%< AN~LǖE (k8j!f}CaWT7@$ԢrԊIPCĽuhLS #|se= v{UkJ$͈>T4FII:"_;Cf l@Y{ܜtn \Wwᇝc0* pi.mekuz5 ayG¨:cViFG4:=YJu獺{Ħ#Ԧi*9Vۧ*Fly3PIʅ5 @Fa<DAl|exaTo1<]>֛{D$hոTlqhutXZa%Uĝ$?>zp_]\KQHS1xX-rZ{1y̬>ԅ#ybj|pۍ4 w!V niq$_)c>v\l/h%po%_DXP/wGP)3\5;Hof8:=R# wom & $ |ԤoMy,>v?YxkN C~;^ws m9ME 0Qe^5`8EYoVq(%y霎< % e2BȰ 2B3Y2>ӌ";檤hWRY`9cظ u+IY]yV+8[D$eiD2n1b#FQGtsy,Қ-H!\JCe5JM$-*E} ܔ&:);<'QVKVB$-ZaXJǭClV4ˊ^ \c|S_KHƁʊ9'#9QFG?<~ XÄYBfG*a@#YЃ$ `l)3wro \3[(^Dr{2^+[S\Ԃpp8҈TvۇZ [Xu^+(o݂蟱/Nֶ'6ky069~Ywj = W  }:}n}.N_z oiqb<,E?{R|`#Դ# ʌ<5 GR p}Ӊ!!v#BJi1>h-u 4~YNL AT/pFݤ<+ɺPYF0 X#^yD|JtI_-tpƩK,5{e#`eBQ$ǰ9]3Z0Ry`T[J59QRTv x(Ov,MbizZHU+ykZۣ6!K$RcNm|xׄ4tU&Bz6:E6Ao28 89ZEt^Z"'mc1 6˥%݉T0^נ٤u7'm&(椎_Y8+iHݘ2g6#>qby:[44?E>9@KV1aPʆ?DkT9l/q#b2;6o͗}QO86$?Q|67&tNI8wlBR#ɪA`QQE޳#IƏu";Hn'Sb<#{1("eQ)R ]Wz\$OȎ*;O[9 B:A$++PTK=i2NO?9]}9s*2j6 cx 8_j |˅:jFuSk7ODrmShƹnS.f!thoj2tMB.-9K`x;s4]K;j=AK!hCUj;4$FRªO[-rJ/3t %9#6gLxb9M?'=/=xqs2. 5HVcnWNi„ɇęώЮ \ 30'?M2'04]P(]8aP9.H; To-)sĔEd M;ߴ8hqlȖ1j!_YE,6` /9; <7Z|~*78;[olrRxÇ'VYC}:?A8A񢪷n0:G+(\| eԤ;x,G޹]7S'ud"u5<ɒjŠcL^sqjC@!TNwAh8|&tfT#k$ f *) ޝXׄwv8$U2*zuStT!-BsV ]Y;z6m<#p*|?CpSQ5ц#d@Lk nt5Єgr"RSI2dbFh$ gjUmvV N"ޤaTiczvF;H@ʺIJY&ıQ-mLތ0#&H}an92 &ʋd *gN׌:rмҵZIH:JDPcLz7Go=0%˘.R]tqZ.3\eV,AtqO3r/⦒W:3o?Eѵr.Q~xEAU_Z- s@k[枭ulzΙXb##ˠkH`2(Vg5yO8Fڦi`|2toԁrr)1IBZ&*OM"o0 Q]%Ӽ279:_Y-r@xݶC{f>dЀw  (&\\1Nk0 SDb0>L$㸙aL] ;&G{;tg8XlvV F=EQ*TjvKcb>QMMѻohu?sl '4i$Sj(XNzt%!N:|64j]([zQuf4*_ -._1c[䕀圲_5kQc/ᵵea3Y/%4rN !#I}TK3&ZFΎf3.0d1!rmbe ȱ@?AѓǪz}wKp 3zø+FbC $we[M`e@\)IJ_(ن!ɜŤugVHi ѣG܈4Zl2N.)JsXemj̐֬ĥDZ8HEwpL ngpLō,kga$L{ה% )%hFʆ^}N{4c&?5U j,kvL> :Աz;rrʚc-%_ζ%]wX& 7W O}Y+28لbh MK]ޢ-HES˥ɊL>m1,[3ПQM (U#KR5j;>o#}#>;eVw rdz2.McME A"r6SR}G7T7dԹ@A#lP\æ+S'c",oAp1F_B\Dr{X⋻iW㯹N'B^Ww]g[f 7]Zۣᨿ_Z8t۵tf_C, ~ ~ Oj_>i{Y_TluuuD-L_W}5-wumI`J|L*N5+i]A'K/O*7o7O.PJn3n|%J* *9uVl,S#+I`V"ER7E |qAKwQ )0#|sNV`>譩00/V} J7cu:9斒RfLL=C^36BFB%_nSިfJ gDœc}!?5Y L]S ?ٿ!+{8늱~YkVeˁ$%^vfE93]_+wa&G>_)Uֳr~ҦuFZJuoo'XNY6a톾G1;|ם veg*{LnMtr5%UyP*k-W ^UOݳw ~q%&ֱEyuydͺ9՟3ӵҴZWIlMa?~pUfMaPq}0Dl%K*#9k#v6#ubc}S\0^|rA;F%}{&i3T%'tb<ØT)1] )~Rk\G("+A*dA' ? 4n3-5?RG9K$➖ht;өS7ӆҪ]2Rp0,8"[0"6.q.2^~gD\݌ziRL.j@ (JnVK΋?${$>x#_8)Ѓ?m>Ǭp/1Eʣ* Ϫ+bѕ !T9XV^D" kvl%ޖdYEPKuQPKT, __MACOSX/darwin-perl-deps/LWP/._UserAgent.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT$ darwin-perl-deps/LWP/Protocol.pmUT bM1cL1cux Z{s6;D8w]D㸭g8;t"! g` ЊN}]|H˽4J&>~d2]`~z;͕QJЂe<a!_ˏ2 a]9;黋7 Н&9'GdBXN(~Bρ -#}w*f]]^cv\XZ`ӧB߄dިƔɂMM QGG;;l6p_ğk;g2Ϸ KJ*|.k8S Os&Zb]75[9`veJXb$76G6 Ԥyehiᳲ(ۥMk,vcBi6zS+~iRKگ=œv$@w<Ә.kyJ[|: #f<5_nS*{2Dsz/C}=*hw g}?n{$J#w6[+xzeji*smaȣ;͛ <0FWRvpGǧo^A,S1 r> Fzd)2;]ۋ Tol=N>jk[0:j/O/Nޝ<;cMA,9g{Ɋ<_944Mh`el6MŁMOn g'!3TfXZHg  g LV-c 23nC?-!R@ 6ޥw#k5ӋT>O j 6WQ( eK5W3. o!dEyC0Z IXSMʢJ{MJL#",M۞#K `UH[@ē5XW\)|(q3 #( AsU@d( 4md&x$obapx)n<ƫ4}J#۫\B}8IbK"hLBcBwQǝ29^@aT%;#sC#DJu4J! @p̉'WON+_<}O@aCsQoRCh+9jifHNUQP\[ [}O]oeHclh#z]}_TPK{ٟ $PKT+ __MACOSX/darwin-perl-deps/LWP/._Protocol.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKcq:U darwin-perl-deps/LWP/Authen/UT ږ1cn1cL1cux PKcq:U& __MACOSX/darwin-perl-deps/LWP/._AuthenUT ږ1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT/"! darwin-perl-deps/LWP/ConnCache.pmUT bM1cL1cux Y{S8{)4Ld`C bؔc+Dcg%&}nIUcZ_+08;bwi/ƼLi)" \W'gl}i~Gʇ,l0Z( ZctԆ]2k3&(3XК&V UE۲ǟU1O Eq ޿g?~Co$+^( ݍo%SA%OF 0J9AVlnnbوz[dۣ=L ׁM9,8馹ܹnr-&]LF|ЪEBr˴Qq,CYk Md;6Xvz޽i[mʿifoA!v; vi""޲AVGtԜd ![~ٕ<絥/.%qdqYs0 ݟ+پu/5XJj9Ɍ~1'w/_ :57>!?1+e-펃]Fnݤx%811Mf Ht}\B,eI1u+"M̦S޵si5-0"c7ږ"xn-Ū*:&q"A[Mv[lSterY~%UV-R5./.NΎP ״*vQ̣{.kOAI>j965zG6 ﱢ1omAg.mHbI²c>ABv$8|2䲔\2(bRteG:~-XBk>k@%Y8L=F ]B -:NKjkޒ"D܁~+2:3߰)"|08:+YA32.Gdvȓ{PWp(F eMx<BsPjqG/h&CKI93yʟcx-㛷ޥ|zǴ(/5w =o},>~$։)5uP$Wӳ56 m{#DFJV\[_Gv׍qkc ~ljl?57;LA0ώ ؟f10fgAPmJ A%W0z }װz,dq-)P RqDaC$a*Lf W"2F9o\~v~qurifIޅY (2ZUȯBT >99W˓k 0UO2\PUTK0C)b&_w`ni_Ϗa,by6 ؄q+BŚA@ݵ[wp,glbεA7!M+f?A-p:ʗ,0XK (S Mؾ ;OFLMy$Fit REpcC7XshDta: C,aTծ`ڹLx,B .thg1Q7M9 ŇveKkly6b>eVe7%ؔB*ͦ !Qc[#H^Ao25 |%X1h \#S_J") S4Kgpw4%EWRƝp0a!Jc,C v@ LuwӪiڞ0@*twv5#FHMARBmQvy"(9B͎!Zf[N PTAB"}C8&x 'Hk5brվܭ'GhВ^i`EǕm=sDK6`30񖟂,I)SGD"{K)_Ft6<>>}(o+5,''ueZ TΪA'=&01D0r aNJH:@w#@M n`CE8@_c Lij:[NX{|bTnf(]+2&Ynds+>_](dq6x儦V74" ֚JC\hm!DblXF[Z\/5J5wBNRT'PNuh*]i'#27?9_gU>ᙻhxUK -Er7.Aʕ>nȪKmcJTcWŘ;ukv`o-tU ci &tWBѴb["Y%G[b6?[[OXxKQ 6EMսOh3C^ \8 alx N3]\P1YB< 塹)՗{WW'gA L+4KD4 gugR:>:`}륜|3%^{xxmƿ;=J)V^j; +Š/oWh=?k VRh#"Sxu{KK9-MTLڥh:7^m-KHL6n/=I8y,NT{mr 3.rBB sSS)mm}|vʦV2n \-RkbJ\ؠe` yBC?⓲tB$X.K 6ŒV+"WKB؝d9XXo&4|hı#$Ld- YI5 tdXo9p pbn5}MVG9.pWWX\0s5Q݉om~=M,>%^ɒ ^ļv'~UTF.SjE\G7JR5չJnfo嵻to "lnt?? aq鏛Ё,ɧSހn2>ϣ[ؼ(J06| ɨstny b42d3wMAwo/^Ĭ1J2|&(H,bd(8/-ŪrUV(U(AHI3@_-3Ȧ4}N{WA.:W>3N#ܿ:ޮ M=x|=@PMRz=֙k~NQKiGH|as$䄭P0#p}sC1Vns  |Oij}\Jo8qOqL=RӉ~m:LbUM_(>T >FvM.'JRŋoP2Jb卽AauP1+ThaXMU]a\B}^R9S'sSoyaT،s]C`\Mo_\:[``mR.GUe(ΡJgVM '%&́~Щv}sWRJmx!#^^ܶ I :LGs%%]dv}w4x4(qv!u0Bɼ7hDډɽ┰Pڍ\梱@jMTMLQ=GSFqۙ7ɹvpoY'Cf"V;FG'J| UWUVy+j6zqu+Z/4EO>^7bB/H%[x˖N{T/dUm_>|x1mG>CcҍVeE=ЪU{G_U D~}sqb^_"5gf)&mrztE(q 9gk@Cc(֦`4XYE'HšzBq jBоؾ'Cl8$BV!"K !Pzׂ= sH06#ug?6t.!d0È6b`3cVia(XŽUJ~[̛WW7,鄢B"LmFhąa3l=^kEZZ Fl=7f):_%ݍ#?H-'eL X֨ƮCRHnU-*?'349YZ~`?GH%![ZK\ ʯ4͆r. h!iYTfqNCN㬿$!1ѤtB[ÔZ'9qvV+waVVH'vcT~ϩd{3M(G~`dH|0UWYbE9))sXϔ=Ⲥ>K n8qAN5#0`rK*q5fjhDl's!KBH˒"zfEӤYZ 5In9ΓAA ng {dy}cy[H sT%SqAfP? ))VxM-(RIq,?HUIB_wCA ֭2uxRv`Xu 2^ A[ j`E\{iEzSp.XxCWOJBcnV1LB)m6/c liSmQ (dg$y07d8+C/k7<1;m w\/(}Ӽ< s7Gn۞vӎKA+Z<)" ;auGQ%< 3Ey*UbFgPw7?=DW/Hչ?]_M3\[={qzO/528T JpUV6 ({Ԟ6AzxÙ|֯cCIk{, ࡬CĺU؞BLB j e v޼λdD;>=B綠@_O4z!O~Zl{'})DQl [gof"B8t䛡ջrOB~`Wtbz^w6mjö[6'Cj}R-T!m'4Z% E("/rz`:4tTb0/n6]t|}M-6|߄}Ht:8N >3)}80R,,IUHʄj˩OtUHNX >O:MM\A?;Ll @Sr< z"w*G.H(R f+~EP+5&%Wp[Y:J%AW @&]`&Rcg(K" 0 iQZ&U%T ^* 4X[7&P&@ss`,.>,rrTVƞk >~ sw\ 岿Cڤډ3dyBbED4B [XІ?O&W T7wdS󊝣rQO+& PQm4X8qUse=kf͙A{YeW~jWtc}KV! &Ql,?z/I(Ńgh}B> u),߁iϢE`S27RrFpS$sXXaAY Ə*>C(J0D`.j$6u;Z{D#3*Dlu &GXH [[$nQVo.!)޳Ect䱻#D+ PKy:b PKT( __MACOSX/darwin-perl-deps/LWP/._Debug.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTm# darwin-perl-deps/LWP/MemberMixin.pmUT bM1cL1cux m[k@W̃Kh\҇4."RJkidJ^][nљoϙU'bGz4ZP%r cxw\7n53 _5K;AOU5r5\O%~vjźYThN ʲre*Y(npk+yN`y#[ӯ:MRpIZtyξ<>& M*ܑŖl ^Vbվ.Iе6d!"޽ !)H45nok9t;CuJ[, {jƁ7STJb1:S 񼿽^4߯hN>*9w5bRrXxO&g_[(Pq9s=KsBsX ql07}62g; PKmPKT. __MACOSX/darwin-perl-deps/LWP/._MemberMixin.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/LWP/Simple.pmUT bM1cL1cux YmsHY-CMv $d[8!]T4H&\*ۯ{f$lo|pIۣY77ۄ[V. ^x.ɭwJ./_~=q>`"c,}k>s=V~5XF֌F"N3|mX.ZMwS^FdO4c$[DzK%H#FIII8Eb!3MhȺ =O#&Țp%%x !MXJ6*L *1MHd&[ rynmsndh2_Y_,͞lrb0 |Bq@cꩉۇՠ95_/Ձ4a4|tNAS}C9!/Ɏ(K(,,Si6*Hb">[? I`rS0iir:0qycFOgcd4 a\ V74EX/O '0IfT xk*x:&CPoimxcek^,ް{@(^,:mPb}s&Pv3t='_&6O>F22XMiQw~Cs{6} U hKOo }" yCz<ӫgӳ VLspZٞWuT1H┵I\,qLUV`ל;J؛`*Ntw"4}Xuzm_9A`OGA`Y[_LWd:ؖUmt"TEcbM&,>l3nHHgR!,v]Wݔ7Naס+"TKhѶ3l$i yD"hU(:Bo`Ԟ !x`9W=¨UZZTOz@7Cϙ -BC6<5|bP2H\Uuh;퐽ӱx j; ,k$׈d (3( 'ZY{ 'xB`!U'E#K"YP-ҒeZ'acKOǡX:3xkE#KA|&`,uB,<@ĭ<ʣ n LBtHhWw[&3:.cK8K@Q,9lF@@~.\YMɞȉC̼Vf{{p9dx5Y-~&422LY͢R$i09"3M I*ײB'M l=BńCe†ViWė@(^&jh`G m!UZzT>Shf@S65/wms()VlahFQdQ{ꑲlŽJ=ES2x F(K.gdr3P>zbԐU)dD|"OKB~XJ@'XG!ϝ+ÆuRzw"Θnic6ښ,|J1i')!4ӷuU g)C!뷕p 9Ͽ>ܤ7 D9BS^<-Mޗ1W rK3S&5Pҋ )먲`\E֣ dWMW U@#Ḿ3]u7:y̸;<{#6Y:u`߸p:vL\o2P$XS x[wb; o\ghM[{l3qߞ\o9mc{J.ms!n0;-9?fЯ:axF]L rFjx0+hq"eT9CFci;m뫱3,^i!slOc)3jG x]GM- 3{ ìt>[ hU'9p>B|r ~P:׻@܂̺#T0s᧔;x0Cth9J@uBjS#%#-ʲ-sYPS}uT&4B%P.i[UTt5֢2u10Een4X֔ pՍ5;\l]bўl6G3^;}K޶ FI)헔]MFe()>n;T#K?|Vvj4WmxZaA_$mz><2;&Uw@OgPKl( PKT) __MACOSX/darwin-perl-deps/LWP/._Simple.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTC! darwin-perl-deps/LWP/DebugFile.pmUT bM1cL1cux +HLNLOU rIM*MwI/-RP s SUP733W++䤦'&W*&qqZsPKIDCPKT, __MACOSX/darwin-perl-deps/LWP/._DebugFile.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKcq:U darwin-perl-deps/LWP/Debug/UT ږ1cn1cL1cux PKcq:U% __MACOSX/darwin-perl-deps/LWP/._DebugUT ږ1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKF5T  darwin-perl-deps/Net/HTTPS.pmUT aM1cL1cux WaoHQi{ (5=U;kװKk"f!73ofnܿS0x|붙R~Ёs8qeZ6MD&Sf\i Pg<H 7R%`_=w7Qeuxd?/@XLT_- HVLD/^9o{[[kZȒHh}U[-WQ w<\ #{xm-3S- eO Ig*4W7oPUIXǜ.< q13f^5kEMh돉ͳ9Լand?KJZTK/VX $ccs/QaW"~]EKWA͹vVxڟnrm'r)m !LixL&0w~.%,~;ݿ ݱ,dnXTI$H_[gdI B/z~wGyo}9,Vm1Cђ[H+4\FP=5/4Zbq_*$*iL"LP4oMRB:S)C خcjZ)TR[̨Y5ֈi_΁y$D^㆞UE⫀,>jkN19ЈBD@olxB4 5?z Uh:cɂUckA\w6Q/Cx`|'fiDR#&? kx+ LnA6X^C2Ф[yH 9OA4Arsdfp)EBOQI?0Iq;= .$#qoG5#%vFM\cUhqq26i1xqR"P+{;ryԁS~^ƂTROxlR}3b L*" ڊ!(WYe0[v>KM',g`^Mr+°[P>#Kٰv 6˭?:zΘ"O;=[ uFM_ň:ːΡM7KSDŖS8L1޸2K np{= !c';tKf8bXu'lJ5j!P8h*xtG7c8W0w{#A¬ Cb3|^:y5XYHN!J6,x:[dEi>ŅY_س Pnb )?z r 2?:5/rYn&mؘ%-Р<w krWV?=+vs0k!/t 9O^w^92VZwtRH ڨJfUn$wј1PC r:|]!?yct2O^GJ򓗰\ɕSil D=nzրxodASzNPi*}=kH2G/7 4)pY)n䛅J%oj5+~Dt `Y]|r \=~U#D\,s!lxs ci1Y@*]s p=G2Vc'B]Hv\؁G"j@`w"N-=Բ:)*Kj x}/?w )^]_gݳ>a}yv5kB.upѝv1ϛ߶l5 (Qv10%FsߐnHi `AX(ϵ{RClAeb2M@t]|$:5P`WMpc K  /W`Ϳq`kxټ,XکŭXJC4b%y8@c iMFnkF GX`*J@Aeoo^L9k,x2JevU @@CQR;{þ5~f;t8s#]jBWi›iJo}KVt9띍臚MEj!.&)o=_>?̒]ެe 3TI.WC(["lEIZe] A$RmC1!A,x!Y=8{ֽ^5ڍ.{Ew{$mW>:Xa7XF+>,%qE ,(43|`@I2`3W\" % m4:X8;B$EʼX0 z* ҷ=0dHփBҗ2(] 1_}9lUah:ʝ\6<ޤulQuZ D];5A* uj F=09 DrLN)(7E 0o /ڮ v| B{R ("[ yx7R-pR|PǬ>s%ݷvy2d`UH͒\dZM890+Z%Zh,Vc )Ur$"t+ƒ% e.3o:8כVu\Wzdzb'U>&]Ap~s)j"ִr?W[p! <p}D2zȧj@?75C>Fx_rkINEm( )WZCTTcݸgG[f+<~UZA9WAǝʨLV"*?@;w?'쨂Vʼ>]l!塂/P?㕰ex `+K;zV'a3' e ~fX7TE,իMۡ@~1vJdRA[/,UKI .'䳝+*+5_ؒb:^?d%GFC-h}u"Pl7%pC>. *rZ:"+ήw'_jPȡ1yro.BP lxؐĒSB4ZٲOʘX[!Hz.vFsA4n i}ЧfVȡ(o)͕\ =Z'$,j8C"= eeXg`"9kRIApVaPI<tw/TXQ,QD'lt ouk5"PN$Q0gxeO\mH]nRL nۣ,9`Fe~v]3On /x"WbIqsd9>:cԳ)OdT BoR,y}맵z$u5౤[4wlLYh[ˆS}H`dWpTOv8L+`;,$,?Ϡ5؈ #US3YCb;[}Y`$wŜ[GGf"Zj3KuSv;L< ;y) U1McF/$>2|f> JBPk钞⍹Psa*`!AKgAVD Q8 p=`L@KCAPdI6#u&2H|`Uz-ҍ?ipv g>"eÝP4On@.]<d4]-2[~s, 5l usJ[iwY!cS( % jr3yޟNm9w`"0, `Qr6p+^:bq d:$_ Gʰ@<*.e#2+0eL̍BJ:2Tm>Vv7m -_.+lצpRBQV6G:oI@ }ͥS r< ,M_ zn+2Oݧ9Њ'fŧ KoCt$BE WsKt];0vtg o!2en3FKPdEm%Jr=oNƪϠ~BeiXa2I Yקωښc%)US ,_FE2}n;d=tlyAh }чqG!_psE`N>r_eש@E7dÎ9S=,t fp0BVzJhonw\ro|‡?}/O=@b)-j?XV7Van7xn3 26'6OyHK9s)˭k Oͥ'q->@ϫ]ɛ!bB#"NB`+#F$! -ͼᏫvDZ|Sa={gg'lpw?eCkwt6蟲_gImd ΠHG{Goyᠿw;8z@!?:cHᠷ{gwwvzIi>x{{o]_N Np ]pD̎Xol0< ^ ~8w2866DaqT¡=#&wFbw;zĿe[1NvȤr08i7n:E* {7XxS C7~|y8E̬qZm|E?#\.KIyo>e/q\N#vEqQw@  Q'qP "0.c|{"@]GD/A,>GS::B He.j?iggSDO=`l1a0cE_6GJ` &y7̩6pjh4[ g9m:4Pd־;8G^_JC:_ww9{; G.wG8j2v*ܸq[^rB~co/Y)[럜?GcAɀY} @|-qw>8:5⣞h swXn*: Mgͽ?>  rQ׶aht7pэ"KM,K O>x*@&qOW)iE?;_C}!BALcҋo¡9ʢC;\hIUڍ> HS7sF_7zM*4zԟ82R>UM v/+!T)O8CK`ͧLw=&+s݌_yϢٶ㯃p~ oGNXG? fe~KXS߾`d1xhVQH8IԹBZ/uB feehex0@'@eg5R6࡭Nn?ޱ 8A?Om6:嗢QLy)E}>W2"+|_UoW&ҕ~T}8^> n(Qi:6!J,s8x𳓦CWj IoC|Ida=؇=tZ n֩ysxn`7نڴ5lSB!ݐdr_2k&[-4 cwVV7R9r?h4opdz>$T>EΊ }oW쀹N~垂} 4?v7uanGe%?a9Eʩ/jMʷoZr1HYm'#l_CK΄D/%-3*7 )-/ň}e?oUNx.Fp[;k%gǡ707@wq~ Ktz$J/^̃,ݲpoV"xP(2|@Nwjl.`RMv{9t\oyD.ʏ;&R:Ex"/I-nFu*U Х#HH*ʎOTȿNHEN}-nGк3EPU IxM+VZ^R\oK74e45oP~1qpdaNFٷNmBc=`ZsL[$Br$s"b1說9:B ŽG-+ ?t͈4ZBk,rMB|3߆$Xk"jcč*t|^Qri-7Q7M2=D~1tW"׋`N|Em $)$9{ Κ Ӊ$w|l Ȼ*Տ5 =ڰv7TV ek;c^]|S. 7,!C^|N1Lc(8}L8JHܖU'*}L[Wb/f>06N\ejW0y7ɐUq\>.L@ B A8ydߝU0i:"ZUz?5yc\&B W5C}3Q^8 N7`a LA5쪃:0HQiVlA/VUpZ*if= v61.˿%JȊV4&"OrUL6 @󥆫U3迒_2K-U.咏6j剐-B7͆5U8T7pg&K6e* ,P(? N:)ZwG/`hr0|b;n^ykd`Jydz#o]}{򾣽S,bT7`r MVbRe. {>{<r(`iriw~'~0cGu5y;*Na$Iճ;7xe꽚EQaJL/-îV ʒsCE*@z~?H#8/OfD f7]ݨ, Dcaj0A * &.QvAS~;B^ӂ͋p: o%@y⾸u,' Jwij9V.s P*s݋U}j)8/0!ך7!pIO9]=J?|ګ*[Yoy!vhO_~ytƛ^k{bv˩x+씻QK m.?Z\y_Vf(\;8 \Ty:A u4hJ;fM@>>}N˞QPb9#9ATcrm#FmU>>UM)")krQV© 79G$3=TKb,vxK盵zPBGj;|_^N\~ I0LCO[E9S(}_b ˬL'$nak}S co?::$8h[WW΅1d p1{9} v%м\bG[Xx&{' Ao_p2] DYal׎#(BG{t4䧥r:1kg  eoNQ cYjT>b 8=2E*BOcLmmt&\zP$;:Bڑi*Qe  4c-T-@SyhX:dpf9 ]2qA_rZ2}:!Yn|7Jj{H:Wܸ\,jtԩ\ rYLD/uVu؄(:9\כF- 8G:b񺜃u lspRgcVs̳q0Ds;S[,Z+V&uNi./׎I9Zgn/@.y*As_4y$x8棼^b9Z,f}y֝S0n+`^sp jq [Lz{=iN>?XkBDq^ BoVmK^,]%q> \}X_e<(卷4ųp_Hq?<ʂT叓5.]kZ/סI#{x}/I1b ,jIoR. 9O['UM cKtir)gWjLsy1#]>V%X)S40Ҙ o\#bUN^{0]׹֫T^o&K{Dy YqIq VouO0P2g <[n„j?xa@芙?tНyL󒢛*"L&nWMO+hs3'@BDk=q^afF\{ކXh,O*ͥJkm(G%Tk黿db%ύ݊׌'h%\nYDl5MfTP:6\3`"nwoF"5埶K=}xo4Fr:Ye:иp 0G+eaw; ,C:A IH.}Y2grS!!C!#cvſǶ 3 E9ZSH6y,; }EWXI2k|zs1lJiZI@55-$= 'Ķm#:̥7G2IdBiٗeMX| O8[LvӃl;Lm$Pj7:x)E$)&4&ya?$%&z)UiZEfSNro7'T6اc-!Y4)e Hj}&KWE '$`CR!t`d^3** W|A44DoyY?wPs*$m骀e \S⟌j׈6Tq$_P>[rMTEC@5y#)\\N p4 ō{ŕ]%?.#Sz5I^?|^yDrF g\Yg3iӘksx:n ȶ}nAgna2yRWGs.xR/L.wzAW͛ҍU:u}z z{^T)7p䧵Z XeBށ-^Vu &ӧ3zxU)]dqtfC-wQ\ 嘦P6%uZwPV5~#y0kI.AQ1j;c=Ww!zN(pvwq!E>o/Φɟ4dlrUC;.)aLׄxܛgbT0=OCͯm6+9oB%f ~ /"PaX9 }xCi"7- efs!dWqȓV E9rlcR')$_P<)Hx&vwTNن "bTvwTҗ^yg;O2y(VLmߪNB&qdEJ .\ԏCB |aPl>->!IbPh$02bz&Fr%rY؊~dUCHNtƲ9zqSHB|O CfDWqCIȆI2tQ+ ֓P}eAxL5PPyXF~,}\aZNƗO FoC~HK!3֗X0UQSbBdQ4[b)G7GptJhԺ.gڋT_'fݦRqɶw({D̔sT9\ ɔ۰K O zԁLAmҋVԑP&Gtfe5:<]7^`\ U+)P8ޤ<?gӲj3$;ꢹJS+u eSCkUe/JT雺U1~C;EݵE9#D%g|R<@}yK>MeeG$Oڤ_.FERTx#/ʠtFC_:dVlVз{"Ӹ[6n]„]A{Uyp"N XY㸡Y4&s;Ɂ_$inHpb[*i-F[HhX]g"K)YnxAt#l rdp-^4j6$ &muxF~؝$H .oFr(1 i~奿5kKGjLSF7RmܝdF]hfܟnWd4k?is.mOTlx]ie1z;w:{@| rNH" Qins 0nYTsWzB6Z 4 IkSR@Du<䖽;G䟾i'x+m c*fj_+m_(ߵ8P(9'Fr\Bh(Iios-q9 :,Yk"}jcη R |$OH&݉PS۬rw }r ҍ$N69,2"Wux<ͨ˚ ʯ~pC76p*=)g(>!PΟ9Fva5Bc|3*•i[k`Tz~zO/xzwV0Ici\~фt]LXN*6 \tccO74+R,bڬe~R۠z^ܱK!yc V0N&_d%}4`2al ìvXI>ζsYNPZ,z.48Q{?);U S-ʻ 9C7VbAN|D9ueO_5_;e(^Vtў*2 r \OP0#?D<7ۨAEv$A'Y82Ђؔ|0HsWB%kJkz zĸ~ߨZ%s&Z!8e$<<ﵴ~ X hbAOaZd_H:-na?FYRbbdEI/rv" dQ QHt?aRЧ=MIy*-s8V `ϹU8U=*xG[9,91*eyFuV[Qf{.@Lfd\<]ط104@ә9mgn:"]\ϣp>X W})gdsZ9+u(P[Vs>)Ӳ sӒW% ؜!tpI&j17*"6v*XaKt`RΑ?yZY1wAs/׽@R=>yLHGn|pىp—<2ۖZAt,P­m)GLgtxQ wtǫk r,O;osJ <#a*g4lߚxrB]V>^ݶ HpFXahy_o&"9seoq"+Xl`z:<,7)2up:y9kD,8ΌLNVF 2%XJ˱|FGfX[@ld-;Ōع#`A ~b9^vc@7|3 ?}U;"T|*O K\3&m)<(*? .Xb ^eaF5G[?3yBϴTK5`Ojy=t36'dY@3YTLX~>HDŽCXl6Jp> t](6ɞJ"EVh)o,>i+;:{vzzMLQ}v]I?1JIB E!K$Fh_s;RfyS1f 2ʭaۋ@ 1=UA3VXJ*Qs,6f:L^2&"[JU5Ԧjݝzml!b'MDy~ 23{ sNMw*S`0ߒ.hm;1ge%s~@~y%]. 9crph$I sD$}~ Nͱ6h.&4q #p`g>i1I]yю.4$a!fʔ6H+t }PՋ o]3" K~HjPE9JC'It1fI> #K$xS\=E0Ņ\NhY==mG`dr7DžkxpkE>P钔2 ʻ^Xs ~hk|j-ti6Sme6pX#fv{Oħö, ӼbMo"b VH*墖:kbwBy˕E 5aVȚi8)B~!rKW.%shAx ]|^`uMIcʙey1aZ4q|qW %;iZ)/ .arc!yO~ ”NwT'/v^>3;K,l# $Q7D{":[ćX|"8!pO`۷pz9nV;)g黼-;ySQ߻X磃i6\@Ibs |p154xJB8䷡\(ҶC: /6Kﰣ~t.9SX^ b H/IX?NAL5,bK(#`yڨ7N^uPn.Yj6Nj'˸ʩr#K^IJa*ET[)[0i.0q*l0G" l((ΤE-fF05]etq ãR#פRxO@K],1 NK$>; yf- e#gBUjxK颯!A0"ԡ"iu$-VՉyW'L/(L#tGsco.ߵ0R:l!JJb%Ev 3cf ]]d?:}r-6$Bo(q1Af<{S!Un?$\á@l]rFqO>=>ܕn)՗ui7\aV#E\f}]9jׂo֖ NWS,mބ5Q `d3xXkGb &mܶ@&ݑ]tV@* kT " ,mNRbPޗaKH&GeE2EQzҁ'zH76׫ ^Dz)`g0߼Ok O#5Y2 DXI8aRZ(5eWt.+ѵڵuCSJAG> $abI(UXWByqtn UQŏ|-Dٜ6FhdCTW 2$nƘ^d-PC- ( yxs0zkO8;ҡY4ZžA~ a~6q n1P-1D0 ,N1 ڝ`?H fD_K|!"Tn}=h81SeI,e{5r0wU1E4*׮[ v7h1=6^L4;Oc;zςpyϸ{&..=p|'prMrf9=Juőnk 8*I&0@{Kog $"Sq D'6 \ eapg!ױz+rZo#-|*yd2\T IϏ ]\eKK"OYd q[<5:XMe|JZfSd2|i_`p=4ۀp+M\,T$ܯxay$w>< (&)(ƱCF'*vj :.1H)!Ghڽ~Eи^LVG+?3 .6ojeR`E/z.jDwaʓ}4MV6Z݋f&2|n*_|OY\MnIpђ&+˳T;@Р֛]U|6:d3{]ٮ+iF~SjH H25!ȴ܌u KxL-SZ\\kC~|Qd'srN%IDϒq\N%M,¼hmqvǛo`Z^ qmvNn?c¡%,.~$&\a'&)|鍷Rf|Th&:u4L7( F?ZKM@ r^tKS$&rt D!23gPCXd\BKr_K/y /.h)*_ay &tZYWzxv\$QʈAqO&,1Ef3W1UCZ-<5A3n)L4ai;d?PkiW"hji"'V{;HD c B Fu %2iO莺,viX3wIG*K12ŎJ,@ CWe%w ..@m^`%kr7^/:'ᡟ - NB=9T/xkwŋ{Rq"B3N4ɜ~(6p!MC5G mZjmIؓ']IЎO{'Bh H\f\6v댜6`8u w\ f !ȍ"V:o`F r}u&$ޕ3&FHLV‰plt$REIWqptݜDDzZ|~˝ӈguc:K7E]f}E"Wy)9ɩELF{'{嫍$rk7=r؝as[ΰ`sao=vw8e`uyng$o`8;>;#C>p*‰t[Φ Y +%Ngf]錄OZ2XN=Hp8<`tꭗhM++v88[pZj՝z 9Z3lm?;8a)EL:?E` gӳQX;0^2f}kK҉6pԽcnBodav?]Bq:YMͺ# ${ac,km9 )yFR|V-Ew5j.jsQ!kc wh 7; D?[['êګjfZu&U{yj'IZ餷| CnHiVmvVmazj AA~ ;KF'9T`C[8 }[ob524*aZbY)nlJ{HuM){CSS-t]GeJqop0FRiФ/|Ͳ6|r.jlSwpK}XSit؝OjC\*rb|>^D*$+;Zg},V76{f ׷zKk{Uo2 pL!| rj_>| œÓw}+ʛm)^Dle l+͗@'4̇Z"ʼn8wHz8A6ALj…j0o'K%?1+"e' jNW깳ҳ,B+y~ T;wIysG4R&#TUoH'C5<^-GRga4ӲCe=9Oi{KPK %B9!PK|A% __MACOSX/darwin-perl-deps/Net/._IP.pmUT z,PM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT1$# darwin-perl-deps/libwww/lwpcook.podUT t[ibN1cL1cux Zo7)xJr)pՉĆ )zARrܵ\͐\dNz8 b.9 ߼`d\;z;t\+rH O'܂Wٻ(k+W RgšV.TYQe),Eu,SQY9SLIEB?TiBRm4Jdbj D褂I*ڔ>-L *(:JӵN^D29I 3+xXf=,ŹU'JeˈMU1)ad%rlz1|[DDijv|=R7X %-ϫ zcد2 gqǚ-A4%ftŴXuBUEM XOJp{8(eczyYáU8am9l8|~E id ~3U``S 5ug%xAm}%ah}STNLO%mPȸORl %/`K ֔u[dl6dmϏ mݾR٧V?-( S.5 Wb hbh[#pau(NiUE׷çZ&M͒>w;?>r֣TX:)ӿ1-W#a CTB*2Fhe#:vB nC|g+7Fk$k.op*M7Uu`m1*́/ 6{(q49fj?% uZO{%.z1HZ]|ˡK[2gܛfMIysy M.X =@88ͪ]}*/,0rH@>sK- 㹊ܸLQ=4+N}NxrE.T mLo"Up cg-:!B6T`C]J0W'R LIJ>|m˔ÓGg3XI D8;zlR|܌@k.)RPBݙ<[{娕P0]ۑ4Ud TsE@+RCr^(\E8Y%!oԺ)PZzFּfu}T$G)G0 JE4_V舼#0F|Ls)$CC l%!22`*{,4S4ґhA>t,2ZvrsQ)Hfquz Y -а(Hx^M"S aBn=i.*cڱ3ܨ u_4&&J@&@)af y>8n5j[Kv tt)\$*Ekk1,(CMǣ q>"{8Z_Jm?o~f~\I-ǁ7O ޒ`O2?v4u)GQInUi[h ־q@IB( .Xfm(H rw+(;3UFE8%n*UeZlv]pr)&LnI9bEh08}C ̠Ȍ7J } PR,V_ !&ǞbsIB:1<;/6ΐ`Wz P%.l$(dm6õ-C㳳m])(!f.뢉:@\W5p$;_^hA"hLHrOYkuLYV_ϠNJ= )jtu̳>"]rDj9a&8E0p^]rx:QcZ환{"߫uΚhj|O&@8ũ%f‚-\K)6kzS]"[J4N`px|Hʾ[@AD0{\>ٷDY*cŶj/(?R7 öA5׷9/B'Z='ʄW)փX1`Rn.t~'U/ZN>ߞ\\]{]Bl3ݷf{(;^T ˬ!{gܶd//,i3ʐ30Ywi1ص|WwjezfrXw_}ZV.t;GKSFNw )`u ] /q"ZZݶ'u#%%H,FE!?w:bT+Weu>Wx9Tۘ]@4?}%vPޖڹ6*U٬2Y^*V8J{3)ֽӴbyϫe^욹;1ݣBl]ӻ)Vak E$HwGܵ]T/q5.DY#nky'v ÝNݥY7am:2CG1v-Fڢ+ =3(_Gv;(:6гy)7kmG&&Flʹ\=K˞%CSD zJw,OR KpNϝPKEe 1$PKT. __MACOSX/darwin-perl-deps/libwww/._lwpcook.podUT t[ibN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTva" darwin-perl-deps/libwww/lwptut.podUT t[ibM1cL1cux |ms7w Ɇd_dvbIfr=ʦT '03CfotԭM hӍͬWGJ%E,uR}L_.,M3i+ТS̲,׭x|}Vǩ>yFZz:ϖ MZy-[f2E:2Y˙oxOKmUU?22Ң̨c.$/ԦeпWq9SQ6Y4)R|NmnӉe㲠)6Ҕz˭6"sPpQ:.#tuf+询4y,8υ,ߌZS(4AbQ ;y%A1Pܚ$YڜHuDK,Ze$A>%V _IeICba}w6_@@Dt2$V`2F a^x41δgqA&7nwC-K$^0k:rLʐז~Ӝh-hbF/J7'&kWf1 Fw~L',rDqJ}1yvy/ \b9ܧ;_,; >bjSkul'XI c7Bܖ˜B{AS͢I0Omgy2&|A~۳\j.A_ݴ +Ȭ>,sRGh+xM yP7Kkn'P3}CMBټs"Ⰰo!+mM&EWhY0e}z:xک?z>ż?`eyDi%#ϭ, x5+"GU[z8a J2itf Kh}J0V{3 HOXlLs0  !gY7%\ 89  T>a2~  R? }E6apٱ_IZRX-{֚\, )P޲$gNt]\*Зg^hzd`1iӗU{P …d:iV1u߳Ԅ {g#Wew/PIqZC M[+VcwՄ=i` m T4X_ڊަ,lX`R( ='@I:u|SxEoN1smfJ`06%)8VԨh97114"k )zjpz{L/H;<ﱙihc_~psӣ*"g DLΐdҫ ǃ'If2Cyi"-'?k(_h$E ~ ͇\|˞8 ? M, A3i>t}|p%nL!&i#rY\ADj Xr0ȏ;}i=}LȾ 63//O r@Y9O$&~\!`6}nOV6 wx^{ՃMͬQ=f'eaWe_hE`otHBR)1$Mwe(G!GN KvdifDuAO9r! T˩Tp[ Kf6ޠD6q:*%YFWJh aϢxbrR!:E-9Fd0u"GKwʘCRe-,[*A $CöQQ~Xo%,q`'h~E"#jOOZ)=&Њ䄆S-넹wޖAO7Vt7,hT#Lzu0dM=H|?ĕp'B'İe>"ccG8Ye/\ᣣϹq|s5e$&["pA9bfQ!D"`pRG;@C )C;|SMP!c1? D X$RK.-k H1<ڂ{ԇpvbdNJ[("IHhi 2s%h-jok%8'Y"r!zO# @~m F zY9EvXi+1!VaCQN,$MFn3X ` @SQHO7fhM֝q='dkyDD1|7˹Y,hϯ_5zLNі~iA޲m6>16]Wb{uK]!ܬP29T1:`4^%%1R@N ֯}¤1y(rsf6'U2)cZI $*$S|^Gt6 \lsvHrcgg)ˆhTQ8-']20|QŷKFz%vayGC;W:!+HSi\̈.+B&{U<$غhq\ ud@ |w1Q%U?9g' WTq0I,1=!(0ZWS@MQXyY(@z'SFwe$Jba-Bӆ)nęǼYy rsr3z Y\J'J" -&%([![v ~_#w_(Vԥ)1}&dS8i<ܯdGPT*t@P\q[2WKoh6:XyG<`0Llv;w5J0. |쾪)("{VPi3 }umS~kZYt^yr# y}"^ ۙwD7 qa7Sh%mWC5?/Ϗ^?~Sz ?ԐÝ,;) w}M ˣxszᲘ*h-CT[pꁀZ]}C!l">s¦#5"x!acfmG!G^Z%(*v${(5wT`eCgV8/R8Rr;QBT1U_(qF lcO,XM0~X}s[M}?&uw۷~^OK΋Ş} )ndd= 96 _Xʩ 5c|z'TÊ6dw$Noޕyxz3$1׳REn8!o4bFB&~WT.у@ (3H8G=HV(!~ e2حlBe΃=ƾ̘- ˩GZRJIF>ch"4$$K+䑍:Hg@ qS DX,"Zйۣ&R%dp.\4qtX|֔PV.DEFR)cxT=S¸CX HwrNk:vu EĊ6Q؆jCWȣxD;+jCClNӫ v$֗NĨ]̼3J  [$$]-j/}xJi k>&7 lueeRƨm5!#M]/؇_6THpʖK1oـ+nrB9B6]c&S_wZ._K6Ev?7=%B8;wE zN\l*eHSHk?}=xHw`H'':ŀPN]Ksr|lZ q k>6f $${H?f6YX?d%įW ߃Artg e/$P+&'gp8ѕ96Pqj(D?r ]pNvIHq$|8N @FUFЪ,粝߮  Tq˹j lOKb.G;_ BPgCކg:L;vbd{PqFOSy0rZP5MLO6̽\EʀeLpAqzLzqb_,~hS,ΚutXja@KV#iaɺ `pH%ZS?6#dҦ|c.|P"d4qNJ!]3'bĈ"uN1-yy~>awLqܚ40QkY9Qq*zp JZ+: DH C<{Mǩ^LQUժYB>)UQ%1A9eW!CS F"N> a:zO\/ ;(xr) aEńVd`(o|r8yӜR6,R)1@hWg8Z<9U0z$4/!^X6L =ͺjQ9Pǃ=Ipj e ٫ƥDK.-g2j[eVj%f~ /{ a4s ?1>Xˆ+gZٱ#aá ߀0rͮZA~skb$BA}@-AKZ14q^\' pD, ǽJ:W09}C3H`5lɷT'q&.uG.4pDCIbM<˧z-wM~$X9eHڟ/HQa?||[6B09[>Psq[dvi'$YA?&, 4 _b(<3$@'k{-׸?OZѭx_aUwέ;YTzULo'o~?vɰ+t v|4,TU&p)tB ?p n%Q -O/&ml1~f} Mf~ U{vo߾۶t"*W[WBcܚ"X~1̧>%.tċ ˷Դan|^zxvWV\.k&gi!|yJ]%N3C걝G2>MNC5~2LН{;j6T1V=ቻ^bY;Y;?!BrLe}7qY4&+dToL>Oݺq%Il.0.S%*!wE\POߞ%D& V?q~ !ѽz2uOv;!^*\{酸V F){p~$Bi4A-Mzz:8,H9vԅ |{Q>1k/6KyZR᫶zan'T(;٧xf9;?dk eFfrFi}Lᦳ-vӘ!; ۲`ޗqr8\T\x㋶#{LBrd C߲|cg.],7#޼"{oڻvw*/4"M~;hw\;mcPUA5FFqyոA]ƥ>.j'}; +[IwJUJnfz~thpqq2.&JJG6Gu~G<1}z8,;-;"EzȳnP|TFVL=/J+0ޥCsSNՓ|ED|e+>ާoF\ѐQNo]񺴼.d@ K]׬BO; pBWژJ0PW+d7OKTʭf˅3d)d{=6'v!\ɇ>,B[ŰHr \CS: _:&y헀ԮP|t|AWn'!N @gZRGK <WiD_GY؄[I iwW9Aw0M}Uq?GXpsUnq~QgK|\D`]UsTj_e2^VcZn\3D4+h)-=9rZ=c*t| j]n9 D,ؖi]e3cՠOj# aPU;SkUWlDvw< [+{HUJ`8.8:'q1Y emvż9W"}`M^C}!PZgr{. 撙3.n)t;#ihwbJ>c8[ kUJ@]Diw] .Є;|i_W[nltyߧvueWGw0YnJO4*wIe"ٸ1h(:ZfwG,M}X,HR0_b5 j1H<'o~lG[HMDh.h:4!g}V{~7 Vq>DtZxcqZ1\M |Q7{ͪZ_XS\N,yso" 5@G!y[/~xw><Mс&W|!P]j1IQ.yL T<8a<:%&awBK3>Zg??Rb-I1ݻ3K_%ߐ(9/4r6fG>0k v:xs98H@A?s􇦡&RԂePK"vaPKT- __MACOSX/darwin-perl-deps/libwww/._lwptut.podUT t[ibM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKnCR! darwin-perl-deps/Test/Needs.pmUT ј`M1cL1cux YSH]EqVbd]88 k%E!x랇$?殮*y{zƉݺ7 &,m{kAn Dq8򘾯ŋFpVkzSM5]}?Nw448qNs~$Zj#Cji~ʪV6淐- [~l-7 ?ɧ3t'[o%^B> 2p0 e7+ a 7sSYA(` +^.^c{& PE2Xӿ I4ԖQrob'b~X-@G'ma!|c294hh}C*fd^3٣m?F 4W~$dw@H])8{QXlD B,G#{?`\ܷBeҀ?y=v#=˿s- aH#xV,e 4voR1FW p˸@@dH1@B`gTGk^[Oŕ`1.27G"ĺj \UCCqR,A+Lɗj_!w;ž}hòT-tUaԝUAnCEkpiz?ͧe;fe[csfYhJW| #K 0XM6E˲J˯׻/Wa{So@ӰMI/_S?Ƃc4ˢ`<2,o*G׮&D@49?ۡ؃[b^\+ y-&hx1sPXZi~B`|D (o>_O/'ʙM>Ov WʞU9[66Zb.IMESҩY-W*t_ SBkc}ݴtS/H 2&kh"$nfƑ˙lA ,^% dn~1EGR B^tԚ|ys:QS9 6Ϳz>o۸8ʱ1BДCuK 9WķJ$k0w޽ ʍKʓХЗ$hVz"4o~z KKnB<"6`)C8?bpWU*}L:K&?mⅰb].gEWu+ -d!?ϩھ[[8b9a2bK hTQ'^ꮌaID r=΃v9n]Xk"}0V\`E9:# \7/"Bp7s$֖yu oEGm50 Ob[)B-c؄Q,4g[.YЁv}K-*ۯn<5W{?IۭWRVT_'p$0[Ql&o5WhohH^y!V+l+2y +9_"J,/לYKbKrl8oN\7"AD=*%JmjW(oR{cxr} eYƗ%Pz..J|%sl(F,0H"!&Y>5|W1oàiU˜AQg,^ q,U.P܁J>̶?y}m O77a>°E 7O"V ԶZzKJf?n Tv[]3m-dRv[4#gn-o֮6дeY6oD8鍏G 6oVp2/ ֍>lL&wbBT+0k3n/ U&g LYO WSjxL4 9w}׋^Btp$%p`˻Q'Z< v:*%Vk>4sĖt=:y1b<&%0/`}!bd&9nVdV~Pp;~֊7 ݹi~1%El0xTR+W.?5nW}Ӳ"]9>X{w4t`= 1Y EbA=SVb}9qzkBХ=LS\H!$[c}Rx4]$'bOmpz`4;qݳb~Apv kѴ.d+KZg&񚈜b:e" 15Za+>,A @Plp7|P,tdKG'~`y ~edbpjfyͦ,%0a(cYW$okPK7nD !PKnCR) __MACOSX/darwin-perl-deps/Test/._Needs.pmUT ј`M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK Q: darwin-perl-deps/Test/Fatal.pmUT X/_M1cL1cux [[s~ǯ0j)2uӡ(F2-;#m3m$$"KcQ](RmLT {ߚ%LdKqDS-ZNR&vD+h+?+a"Tb…X$@b}@ PcHo8gg9 틃sq˓K~iAZ X!re5v?D]Z+>.[`:K~v[EqI]X̔%A(Z;' ՗1~qdN$ O/B]qC}eh45?f2Q7*n,˨܌+Dc@TH0Qq$V$ZA HCӞ]#q"ie<,P#tJab+\$P ={|L-Ht9"BFΕsFX)] H/:NHIa*Qw4%i4/*l"z}VґN\F'Q_Ps U|0*[A|[1I1k,6Ȅr<Ţ$ F ##I00>]$+w2sko`KC-й\"r˙Fl@=kr|=f채"E 2bȚz|<\1@F+<20}T+a;'opN6*D kT-RqcrD8P䷈6.NFz;BqɊfo ߦZ$tmCJBJhj2\O?8׶3b킄u:~o8\J-N#R<Ռ0 AC$ w)RAD\tNJ7@PRQ"[t]JSNr$ZmHpիSQ~>]d[9%/ZOlt $)5v 6B=F@J rybÿ7{Q+6[lgA[ѿmPv))gGl9U2g6r?_C/:m[^eyHػkB2tSu<Ϊe9-]d[, \mCk^W2efQ jZ?Lm(U~)r3o;>ye @WE2&i3t N [;T3$ \dz(C(nkdM{J%o5;!WE@{w˜U<5FyhiԐ"ro/ l5FZIu5Jf^+ oj̴F͛lῴZs `ˈ)zw:-օ5<8 z+yj;o->+ zg?+I(XQq㲷9 Wk47"RW~apF( .PPw& )Jp ^6]B6Ht`z{{hD{_)ʯqYx2aԥ*>G,bPS)2{娬ɱp#./x:"LZ!Ji,}Αf.T^rlCWC,8I7tϯ.ISx Mp 8)^΂q^,kmEŕM:SP:}b[z*eO$'l`]`6XȜ^z&ꤵqҜQR, i!bjJ`qa.bAcueu;۵q_ 0?AQϹW=NP$ACx x5M :(M67Kfy4uT@B#^}zkm对_ko4{uԬOu-,(+ 6UCpsJvThBy56kdWk'&NMc5c3ޗve1YO !8P+{o#s8^ȨgW'>\_PUg$VF::֊ɹx2if~*Š☼\ORGe ܞ/T.[Z>7 U0zuߓNʪ*p2upk= )L*'oGg쒪6$Ki^lwŋgϟZWy s+gJVjC`mOi"HdE/Ks# ߫8/I9I(iJNW Y(PK%:PK Q) __MACOSX/darwin-perl-deps/Test/._Fatal.pmUT X/_M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKqY US> darwin-perl-deps/Test/Warn.pmUT jbM1cL1cux [k{6ōF,l)q]'6q3m6HHbM IE߾9IP$@\sݛ(w#9Wi Hl7* Tq$Xdx,*~*Fq"DqzٻoΎGyDIpA ܌⸱'E]kDmtŋHN*uLZF~qQ9^I9DP&Nk?~6UT!z$/71(}yV,O}[D$EDbxDb2BwiWj>$$DeJJڒED04acF'=?z&FAlD (Ik :XP@)ݪ~6(yU"/,a,&ٌP^ʼL¯X=Se(>k[P^{â1|Qٽ}ZXK*MGf‹3b' fou_q]WO]ϔALfڠIC!jƥ;:;<=~s~q8}fKl4F̒x 5N9f-Eg4LJ&D%0L4*n-H-p裊y96YT^+;e<y6!9R4 d}/52SX9pi$X1OBt5ޞ`wK|25.߾|}8;?=>yGgܾ\;'ipS'Եp)b4(d#^nBG cP'"h%Yb#- &{RNDBF˜[0x&Œ/:) *Ҥ0+'H:@k_(+B6\v^$KqphD~d.L{eI]5QZyyZƧRQ Y[$BIH5G1dYl4Hj?3lbngP_vL@Dcl*(,B9 k2|2OITSyBA~Yz\u"ٕ=_Ʀt1=z$'qZNFQ~i$ ʏ&"j;'>S` `!E@[D7R 0B-^D~^@ (= 7]팎h%];;$Iq,Nɀ-8YXgL4\:b6pXn %5'WK&#`Ip?߶˯یK|adgY}pzz虵!6gKdB`,O ٱuqmciHi!+$E\HpL))N֓- aJs%l -D >2SZqB>EMNb (PTnDcȔ2M⩡g"@Y:0G:I/18G(!B L*0Fݑliۯ[WvV%ULpwC` 4wq}[uoNi1*{ck=@MFG%|.P퐎圊Ŧ@U7؉L'2rF{z7=y*EU$3@pJd;_N_cќ9LY7. 9*R <`-drppz+8<;~y43<>74D wZM5>;#"9lT5WA$FX5QWiO5ӏu y/(=i1$gB C-~]f~>Б w5$sPaec& 2sS-c3Ȕ0wB ;}rMG+dnz8hmxI<'b`L 8w~r5a%z/߾}~&N/_pKp [Jc(f޽>=Go[N{ wwGM RW),77)̟34Pk (* pyp/*&,'<)Z kbLtK4Df9@nW׌xwt[U( yOBz:çaBxdϒ)Ai}V$ ޗ;ww|Ŏ||Ýn:917H:ߦo_ Mbͨm=y9vvt$^v)ȧbͤFѵꛋ_xtH$49'_,9ELӂ&1bj Tx,ޛ E<5T7pH8x{~'qp.(Q&WGdw_?<:9;~l_x٥ذڜۻ;/i*6 PFЂHУ7ҍ`W_  FqQ?(X<L)%]hRHSHЀ5K[tSkz>'|,4-imt=G#pYVnv#seSzSM VnD.[7lD~vSĕ^Edxd؂ɦZ1+` E?i 4|; /1K/-_sqDy#˅}=7^75zB|B`S_njh>gv^q ޺:^SO1l3tݮ-ݢ-wmZ+bJP<$&P0D4<*1ᑾ=|ػf||c`#Z8cU3Pw sfPқӁ|gP >BB*BɓhFM_}[]Tby% :V$jCjP6 WU\`5'_!RHnL/yqݘWC43TR4Ϩnv9M{2O|uz⢸hv&t%mr& = Qk*ǡxh]`l_JgL 'WjY~uC~źf䪣l(w }%73}IºtA~¼6$OƱyѕnCxNphϢd5.pfQͩ~Y&2^ţau0^my۴HX;T켹ŪKmYZF֚*m Лvz27J7\Ң6H(=x\ '=?ŐyTj_~Y^YO+C>6eQyubUliR9ckyZYPK%yqS>PKqY U( __MACOSX/darwin-perl-deps/Test/._Warn.pmUT jbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKFy ) darwin-perl-deps/Test/RequiresInternet.pmUT cUM1cL1cux Vmo9_1GH*UyAI)mQ/ڪVf׀]{k{*o.pt"3[YsV7J=g%O7|%`.;;_+i+'hl<%{G \ﮇ3q+-8t4fVJNKetCY Rnd<&d2޽O|t5 xYjc O!B=ߤuڣONjzJw6[OPir:fT쬶1X&Rg-T3d0%.Nar}3b" 8QC nvg'xF̑.|7ڈto(5r~0=Ohη(iM0ʢ̥vYXS,Eυ'4B U\-%8ĭ99)q<ĮBg%>BJBhX@cճ aH V;ȴ؛,6l!5íi+CV8ЙiƖ"- 1v#]"}fbɫ""Clxqx G^0ct| %SRlo؂ĸ]D*X;W/򌗃plsǝEdr'(1쁂9d߱A1MBDH b% Ζa#1XgD4~~HU!P|% /~|_Pt+^1_? r| Tac=Z\\pDBwzjhR$EVkhY { 07c㩹s0N|~8|7~nדx8FxZth˭:14B4~ *Fp-ġ 0Oh KcL+t^^UEovk14"_i?PK`$y PKF4 __MACOSX/darwin-perl-deps/Test/._RequiresInternet.pmUT cUM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKX0QC=# darwin-perl-deps/File/GlobMapper.pmUT @b_M1cL1cux [sȖx0ٝݪ&qQ3sK@ IÄ!߾~J;CG˱7zA4<'Y⏲}v%1L5'8nq鹳rxxO/Ec $s'jw>qdQy|=-mٛl8= y+-{|,fI7>i}b0[|n9#I%-_WקmˋC5 d=ޞ 0 dH~ Ijat6kyf^g/`f?, >-`|a;ʥc`0hlY8#>El^:ssx{l>uY}Σ㒦Y؂qV8)ԲU?ߺw;-]qh8#& :ު՛6MZYiGԇ- b{֠.apk[օi> m6-%kagdoX:'4V|Yy:`^v{!_4 ٶM,񾥏%lDI^3a5C³< iޔg!ũ`/,#0t9e,ؘO9P=҉,(fCunWmvC|lm5aiOj5zr+c?%*w6f0RM[`3`RZvv+Vty^!C2Y5^P~2-SGmKh]C'Dlܶ2fU"iIiYqeH-6[)Qi}aZbq 3[0邶7 0ubrp`Ilg3pOA(ThV^9[845lDp=wFqRL_ϒ7r g& ZquǵɆ ^YmnQqYtB +ST2A^(A =Ǝ,t3( 硬u v~ԙ& r+^ @;LuVУ5` d?vH2EӖeM V5|70*`DR (>J+(j[Z >Ǭ(<"ɶ`|}1gUVn,i z;r#8dCHIc检ҚnPJ1[j@Ȗ؊s5c/nD2 (Ie-n8ZQHdt;hZwt:R-,dQ)@uvz~醹=D V b7j;Ͻ/Iy&Xz&kp;oN? SW ]7g{p<p0Ků(!)2U3 w̰@V*1%^9/uy=dMEZ}akD/g5ewWT^|a=6ӌ 9{1&ԴV w՝e ȑufl $덽ZQ=3vY~oNOf-Ud,+@r3փrX57έ?3nݩuAmv+緵& ,5:Ϙ4t> |6ݾ;wh;Λ=v~tw5e/Pj.4P{&e<vń*<>,|zVKD񑸏[V>g2ׯZ4| X{P'~׿>:98w8KKOHs ;y.uN=5K!H3/)q` zp8 R֣N-Atx||DsNhnNa[ q5ryCID&0)zp̏ YBA@lͼ̙a.5 9$sA!ָũHc3`>$O凣 . R7ĦQLE4e1ay\x>qbkxmQA¨ztVXļQ48(|eG$gᅘ/^) e(OQV K%KP`99%u ~vAλD R$TxA<$93/|zpb tTLb\:h>E:uPs`T%~LAKV2[;MN.=R8RF}pqMDa#USVeuh@ʊǪYjvDW&avE]y]\fP'Qc{MgMR0m ,!ih Ks?\_!@^g܀&kP.?P8&;;&bQ '%v9 I %x^<({ȶbڧg,%&|xT?Zy9"CAwSvz@u,{O HH&EQ0 G`#oO=Yr Qfט( dm4Ԑ`eQ -ۯ99Z9/9 L E@"bFFGsf6-~h1=BGmp'ρmA "3(5%=@{Gͩi&b~pu!v=MO]LECH5-hsQsyI>5K (I'P[Eat(o]q+q=Ϯq=]GR2%"7[."E-`$4",iu)`]ZZHKvL#gSRJ;$D )49D9 𜢥*Vڷ_Swاc̣h\:vE|B'-ײAB7CF{" |C?%YAW90,BOy/ & @%(|Lg(C+u2b^Q1X}&".X%1:c1(4b! Ƌ KQ@xYc "?{gX3Ё/g2tPq;Ns?zvCddy2t *Mvy6p)0)6V!K|L[yTQ 5 _2 CpPڴ0DLt:=g[`8֟NgGO1rZgzOb&ɊWvjb5|XaUmQsKTJ0uqw;aU+t8:ؿ`&Lt Fj QE4;VGo s?J<c5,: vkIXgDR U"{>WcenͭnW]o_'E4ͼEh[VeSGJ4:QS97L 4={D8khazeY4PRe`X x v3&~LP^Mrs=ΗY4]`11,\ KlNۡ> jݖ5eX|_\sﳣJyZُzŕ@ )* >'%K>h|?oGPtdh':}cOO}-ğ2++])X@V (ԓh !Z$1$[IF%;e?Īܧ;.pā\g!b)38 PK~ (C=PKX0Q. __MACOSX/darwin-perl-deps/File/._GlobMapper.pmUT @b_M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=aTT6 darwin-perl-deps/File/Listing.pmUT w[bM1cL1cux Z{W۸ߟB YC;CP CEh;s$;cل|M-ɏ$@sZ' ,mmoKsw=j2reR0mx#.Ǭ\NZ= A;evٳ_=sGZb;/g;g-vCtwPQNY8dbg LeɸދP>JZ-mY֋'ǧg f4&%nNōbX>[Ѵ\DcOh:!0+ Ѽb_woK-Vc̳h^p ѽxu޼T$ƱU~kobXg2_dﹾ I\8 "ҙ'Fæ"*TH4xhhЫQ҈q?#Yrb`4=!zAPQdyDòazlJqDpɂ>) K%iF?;M(k^`szrGJZk&-"Ɵz`wXXCq%eP,DTq` 2ɇ)\m6PUE!6V o|O) b{nDAz"C\+F0 rd7ϩ77F LeP|V`?v.Oڥ-}˙vv43@kO,5e]}B\y_nDHxO>&@8nTS ザljI5%XJ?f/ []s]ph-H c{͏Woen0rqr:kS//Zq [lQ\Ak?Qli…$t)YP#ˋN.;.$%a1$Yt?Ry#v}J5672"{#:c əXXbZƅSaT`V6Er%CE^7(Vl~$ffe=M"P$s,`4]65:w,M϶؅-A?lV F#hj}HU[JVP)Ditw4̞`?{\i\18 ɬ"@3S 9*cw&@ot4 `Lj,54l& m2lGw"`Bm1=d;S/)at? hB92z2 /jOpr+љwyyWa4%c R,(33?]vg87b|,/zHRTW|Ujj[E$"sPI >[VцPDq+,K}UP]V(34TC(J)dE)SsTPiY%Gj 6R>+IjK%+FI b+Ǩ*sʽӔoXXDB)ͭL/bzCRn\q PgU{$Us! $sa9+ղ*& ͊]JOhvO/O/Ob 4I{,ka3Ɩܸ2GM!^v%>tӠVXb*{}w]vck̊u pOJ0ۡq*\ '[szz|2mڽPSX$A4ͽYJ)fmMw0Yhb*#1b9QGZ}{n{l.ofE?rMn&C=l.YCQ\]*?u(}BwU~| Vٷ޶}D?,VXod@u dN  *"%0 R~w c &_jk`meM* uW7ً+Ts|V[J[6YY[ydhץOVjPs ;8mg#wG5/ ~)@x j`U]u}>n*5 .lxdQ?D4&SSzhPm*(iec{nCcX@dg>@QG4 cX}3_ EW?H}( ff#5ƻM.?aʓvt:/'U؞>>e7@A,Y{TGqѓDקBrЮ?l{[Z>uE?w[v|([\>~rKRyeT*J)Wt/R٘Tjq7ŷjsV->W:ŅBOj"jѩle^  y+?y+yb`D:1T6c\F]pit X;K-}i>H8/$*}ްr!! ɁfQ|+ߧբ6oMXP숌RĈWSir=3UK("më+ Q|M4OV&)D-<$a I1m/v-أ1ykOē^^,h =wNxLum)< #('f$5r'|a;+. /,NJ!JfKZIϙafHΔE#>%t6.|琖 TՕQ)ʨz1]N7!tvwRcHu{ҵ(k t֟ :+M1aCJ LKvRU&w`,N?eӭĢ&C9ܸM#ƒ qPJr+.knB&IRĊڏsCuc\uG ӭ$y6%*9Ւ3+hf:a[%H/pIm>0ernvݞ3l3K˟KoV$[}S-i[ӖnYgi˛XS~kT/xZ~M[bZӖc;6ӦF7e\ [7%lڟiwZ:tswueY[mxl+pvcY3Jݘkiti-}{Ѕ~,Ki9zpU(' ;Zcl;xT)YFѓ}ΛU_Q锤(pHa*L_]{sKPT4لM=8xOdbAQUVd#yPYg6%fKt#D(b==89SRX]  uiCI EC?m!b{w3]^ Br҃E"$;ڥe5cgIN'A Ʈ>Pw6AI NYc}[ŷ[w˯Ģ’]M)n&6f 6XB:YUuK+"LJ qk=:Y #IcR.j^Ϭ&AAZ]2hAjmL;b檳7܋lhV\uw)IT&'>A"\`qH*r$֮yY8h8».<?5(}!<=Rr;]N:Ku])`) $춓x75$ +MN$QٓڕeX,ĦL jo_ʢMR#[t`FR#|%BO+Y$GuDڂ59+ij uБQzF "9ӒV, 'KZh x0n7Hpޓ)EIr@YR?B^{<&! B7|hnK{6ckӏ0є69.kJ@3A F[s~ߒԚ9\KYW,,U>7͢%~ 4bkҁ]SdUaxt[w!\7igгצT vOysqtnʑC$_$YK7qyMH{1IXfw.o}aNvt9׹`YLtϥC1{SgwDۗ+hs}nY{;N?] re:n$\` mнf*iaq%{; 2@> WTjrA1@kDku\ !e~sbe6Bw . uЮ= ]/bS7g;GI)*O7R='6)iuiKmkTZ|7kib>%{n8a\>=%|ZY>XVv=#]h=="Gp_=jyYH&Rx>C$Ҏ%eŮwO8=xÃQcAIruQ+\mQ7 ` V +˻p S|BmQ qɅE O>mǑPKT6PK=aT+ __MACOSX/darwin-perl-deps/File/._Listing.pmUT w[bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UQ darwin-perl-deps/Module/Build.pmUT 1cM1cL1cux }{sG)*8@{43EQ6c(!Rڳ${ t] Ro2hJS@YYάU6nruk̟myr_\nmum-[4._\-ۼͩѷߧγ}껱ar[Gy軴RQ/ͺ>4[⺘IRzYPoi~LbuEa%yAk;&їy2z!۠?Ƭ]n}-tM]%ۛ/_tN-Oed7KCo./JdD?B9MNå_ݬ.VBg^ĴhE1ń@jN-3xL+^0+Ui>?jo`US }wؘ6ل1/~zwv~qraECivUWe^db^y)}| ?dzN[̮hEqtvhu;hP翮:7[-M|΀ E<,[sKbG@=C@3wɗ- Wl}7NpҠ%aGbS{- {4CS,[BiWO}huC(1G}AQ -ut||d U \CVvt& kmtme(jcU+F {&A!t~rn!{$"'g& eESUK:bJ4XR*UpeD=*4BSv$QPO4G|azוM~R +1c1!_6$D8r?>g$ }x{P0xzI[cӺ#^rNKyY}҅ imvzL% ٺ)V9Tbs#D+f:si6!Fr8/18QUB|(!f88/p0_ibZa+iV]`*АyC[3y6E JCHHgl EsM bg$:nUez$(͊M8of,!ڜ=!=~Y,p ~͘U{7X-x+:E nxᴱ`ND3Uq&(20_v5r$3I"^fZܞL[ M"nU{ Iu _$XSճl T܈8"f6] qABڦ"rMVKwj9rى #^g]ܷck>Sh O ^d stt6_c^' /vhG>ooYܓq>V߾[ >C|Ҥ[(Ϻv к<[@yCol [Ќ(Xt넄SW^Zbrр:|{jفw\d_q =I6e:gS>>KX:lS05%=,%e:b7w`5 jHy8PVV|.;yEE3hs3+!`w\ 'V%8?kd7lcR\e/˷ƷuA) ,W^e*DžhѲ61[2_R߳;Cdng.Va1I""r~U OXD 6ixEʼnʷ;t@]@{Lc# "2 O׬+4#羂b{' ^4`S,T܄3eSU=eTHi i*K-sQ"COVݓǨ*v8L) J&!}͛Uj֙K@)oLD|;ӢCs ,ӁP,k6JH}E%#@렭kۧc$D%PgKsK>$lp \ZriHve^* fŬlZcaMNއ,d;cF$ "!eLxj* =}[ZGѰLZ{14ē&,E`a4268wlؚDS1GAP g`0:MX'2`/V߭8)%93' M5)蜗\уIp"+tJ̟sxA  փ5+$&$o&j= ٽWd×u[_6@T"uQ~<_ fZ>ͱ0H6KQ,+$试Vbٸh_?YeՌ$2V/Y&˂ ۊ`/(M4/d+r-d1B ` ^azH$tC: CцEx_Hp I'Lt綵cT…85]doe~Fd|NdJLRcz[*U +1[S}F8=[HO<jVⴟ4ѕB ۉa/j恸mq(.b5ߴhR=?ݶu-O:&>a+IqHXb^;(ޱޟopIXؓ3D~HM9{KE"zdYvߊŗ|=bQul+ˆn>G[qhDo{ b1jڤ1 vh _ET׬I0vZVF Ȇe>%d|,$r^W4~y=[ 4;[g__6nFN (躐xzĩHl?@yR=x-j^'*kn@Z% ;BЦNf#<-$SG.J uLS4Ƿ]tilzOOW䊩"qW:%lfUEe!*GLJ4gb#$NF6iN'A.{n]5]Dv(Kڳ欏Y.xsl[~8=y:ts qODDU'!.+"|2cGVdۄg^igDN086D1=(U( ۤLjLu& p)ʤ$@gh .?!XIx7A>-aZ_#Cy kO`W/s8Id#ץO'[1 `AM =!w%<5cG``jQF5&혜CCʊ.@FXH~2$lzvo^R&p`p"up`2BG. WIuMF4W^Cx5G)Uɵ:De HȺGF]]fڵ<%^nR^o5&@@Ah|ݚ~d 0"R"0l2)/&BeK"Q>mʬx 5Oa@0lZ]QW>GX: dö7vvd[c/6 &[]J+zi0$!D! JNj!,dߋ /_0bK$~i0E8H~6'O_٢p>R>]\/Dt4Bw`x"h֍oB NSY`nb"rV$k J W!<^pdYg4PU?f*Zs ?S c Fabh!GCT4M9 tܯr`XqQ\mvzF댥q#iRVU&%m`%!xU76V6fQMImqfp( |=}1n)gڔw ͺቒJeD[if-&bwmӬwwe٬Ơ㪾EE\>%˽]X\1/%,$…+ %W3é叮ݞKtڒ/~W2€OPVsO5GZN6M|mjrb=t߈h–b?nK!hηj?ב4&$ux7?N]Q@σqؿK߇%k|#)9Aj)GNmWlo6(TQ 19cU >g1 &UmN#x^x|zut{Ć!tBv_UD0irTܔD dkfӾ)R˪|\V`[jM\Zۆ֦XGSUᣋ,5>{ь|S̠~ri u^֪Kũ(aYJ&!;kK6Wk]@Abgו"S2?nn_X)tf0s0R.$:05OKX¨sHr|#7X Y_1WL)RzY,1ǘl B$ATWi.>Ƃl`p ~?xNnT⌏hfzN7A|̡긐$mԯ8Mϯp!xHF6 +oG%K^]ʣcrfEΙ !L˝= zӮBy^vk KpQS! *:9rX0P$'l|&vBB#-H KMs7k-[~b*i 3o]"ZgrQP;}t':jK 2f+)۞fom(_Z F4R'"bZ$P^^*z7aOA7lvŘW9'@**nC<+畖rlx4w9 _ j]BX:b #(<7H\@Bz W\_TXܒt~-&c;[mϵS2~\۾"tź(廊B5,QoNu "CRx8Aze>nnf-fc&oV&.D̀ H0 E$l_HR$i $$"F<m+ɦmW/$$g%/ h;eh!;mFnh'XIQWYv"}r{` W5p  Ssm~+':Ū)%/ZPD2opX54,́Pʹմz=2~j7\q6S|UGcگdD"vG>=kZ q*~o$ox74Kt'%m+9f9E54-28:Vѭjey#īӃGk"Ų HjR 8wťu1{vKKZU5h P|Q@3P psLHDU\x%l=0K:< XWƧ8ed8E :oG[gr(T&Jl@w:;bƼ3&i3>T^p)HfnYE9?N"ԍzxO˛$p@??X hfFV6sxן?= v`:]Q?O#hްhI1J1k!a_%$cSbZ$Jc%ph1g%ws.nAJӄቾl)_KS{]{<@(ع\).tDc5$L DY|O$j țqIwYDЀj {&WuqOkQ|+L)n'|vSL%]'ige,_'i'g3'=tIT ˋ^^Bz^Nz>^ӟL=]?h8 8-2DĜzYRG15BܸM4$64q’{vD]L ZR+6mc6ϩnxۓw^͙%r~ֺDƚohZ3EJfaDLx~e$]H@͑5~Ҏm%9QYI!ݑY۬K- E+$Z؂XC*6!Wȫkl RE AM~pP+.nn 3[uy]YáhR`pJ d8_}s&5s(;ܧH 'pLmjb}5z mAqW']m8A XH~wn+.SJ]*)ѧ[8,9=Q$4J U,Ro` ے+Nr$E+$2@4Lȯ,n⛯a&[< us "LumvW`:4T}rD()QbK?9i bf0$>1S:7i$QOKЬ<36Ǵc`LD6*l9ړhtN?X^kOxvr<>B|,i&ΐhfâǢcIy!?ֺ=At١?_To1:t.ۥJC')zZ$lsiRj0hg*o M!Vt`CTX)mu❞oDX="ypi1XKnrL$l⑻z% QL GcwE96VHON`\i\Rj#q4vŎ=q__gH(| ~ j%@A j&CJ `]x>ZMj LnK&RPS"eSFڒBxN+HZH}N=(nQ V fD$G4$aݍ 8iejzuxqBhV^i<{  y|<)G~uClj_s!# ##+ JJOKyT\ʯT|ǶRL3h$R\V@.u#7>ERITI~.IqUVݸs˜u/՚\BeB7z'K|fA;o l NL"p،ˢ|P9Ct̩r5 \Q)CyI)-h-B! LfE%3%Du -j<Kf۳E8B& HX;~Z@re|5rO(\ۿ`@Hfo`'GU Iq|Jǟ*G:M9CE}"K/ gR/;Zt WZZqߚ1KsLvIuK8 7嶯Ѳ5x-/@c|>s Y;_>S4H?O8Uo%? ’t+}JC7 `lޟ5m=ئ4ҪQuQ2i.,fs:hFLyWqZ|'9Oy]a$8a / x'*&MW(D36*Mp4& ijtI7ߓJ*Y6I5ޟ|%Vl۳fGlE["f`D&…ЃU aum0d%z_05VV9}pYd:c{xzA{|gz5-^;dcvhq^oz0t[ onx.^֍oPK>40QPK5q:U+ __MACOSX/darwin-perl-deps/Module/._Build.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPq:U darwin-perl-deps/Module/Build/UT 1cn1cL1cux PKPq:U( __MACOSX/darwin-perl-deps/Module/._BuildUT 1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK"q:U darwin-perl-deps/Date/Language/UT a1cm1cL1cux PK"q:U) __MACOSX/darwin-perl-deps/Date/._LanguageUT a1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;% darwin-perl-deps/Date/Format.pmUT Ό#KM1cL1cux Zmwڸ 7uihP& 7m4'nM- vd0${K^yf4͌F2/=`K}8ͩ9w`09}ocގ}ƴqpo /tg#= v;*z>̼=^PC莘7g 8J29 3g\дiݙGfj<fuM 9>,l>/eb~2/|]ٗ枏 .t]\s@",Gb%!gczK|\\pKX.Sdwmm41sc!sC/2OG5~K1+" L-8?L:kBvYd>iP:DݨACnOT^P[c)SyH 6)qM1/D`GeS2zrHfLOo"!3vIq/jT6wuxRE ?9)60zs0mH?:~wFryh/F#MxFUF=e 9qd,y 5:s!=΍vh984F2B+z 8} h헥Qz ]%OGż @d;.T((Сd&Sۭ7s䖃ލ5,u(z!HcdФ3HBˮ@ Ep@JD O|y-sH7n 4A?zW:qqnge!cR rl z26r`7ߦK BoBJtCGk8GM =tY,9: hg͆n[G3l8bT̜c `z%@)IE*B+ţi-G+3 #GXK$yxJ]2\nur+س"r/MM Hgg쨘]x i)j<_Ĕ]*I-ۭekTP8ҤrȧXe{Xiv鶋UfXrzjQ"7gnN6i%2#-+xYPD1%j'7/5fjŕ,0a)2JrEg$ J*~xr|NBrpf!_,on/$cK̲Ƕ6"/;:t:vOc%6dB!#f>ǁxzr"iu) kjLY>+'Xd<xy** N%ؿ/uo O;q20V My! 1 %SPVh8, 0*.k궔`!c~76b\KeZ䕤ǰl $q$ǂ%Qίq}^ĸ^PHr 9O@46U㣬nӷ8H*ek bL~0%nv‘qkbe9,c]=O{XGGSJ=biȕtXu>fW 3~RqMJ u:}_y>=z daV~tFHPw5*Q=2jon-?xj+7ݨiG-V]M o%*#iXzxWh#lR J/6e e3FY!ƥ1)y- Rn\ELk<`=@ V7%R`Ǔ!D.FhV$?8q]n|_?Ql"wpYŶNmNنD}ކK$ن%Qmn݆D}نZ$Qm$*BaLj{7XWUQبk[M;2sdYִ&ӣv ؟0`{N_'SZ 0RDx-0Av"D,'c3B0%epZV\tNJo]tz73ox{_Yfd`:s7k[7ӻ,{}e)6C^вQ@ռ̇*han9h@Y"65\d5Nj !OMZDO\_mnIQ@1PWTsP)w=(:}9:#'q.iPenu~봚2iMGgniB7%ۀ9܆ǡYS7Y(4SCcG;wO<ƃ0i1Atd]Qn(P&fDR;\Sl6k_g7St݁9Hh& 6L<}WAށ|[+WWprRvk> %dJA:t FW{MǫA0ѕb @(*` R}0a\CLf ft⽐$L2`9|:N"ҟ+DSX7 wu(Wa*0ԬÉS3;ɋwV)H8`V,j d4D.bl7"\H?v<%UJ6x.#q xeU@9]|u{a>PZAe{q]A}Hai_^ԋUx&gFєtN"D(wx3&{F{HżKR yP=$Q/mK(!CBz4_ay)BȕadO@xj>JTvPÅѶ &5ɌȪ-,Q,ygyG^fҕ/ ,0{_ ).āns 4R(&TeϯhEwHXdlMj9t;fTuCגK-^&w زjd}%a~"䭨Ms ] tje]RYkR.QTZ5V7N/4-U&x;p wu9>'?CXaePKY %PKk;* __MACOSX/darwin-perl-deps/Date/._Format.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK՛Pl ! darwin-perl-deps/Date/Language.pmUT ^M1cL1cux Vms6j.#GH{3PH 9fv$[.0y+]g}ѮlQily6!i@=q"10tRmvOTmY8tN&}K4BP$&k1TZZ6QXlm !!)$gb"^jQ1# F/-m[B2P9BR84/aOԇW&9Uf{hd6Y8IAxt1aʸg:ߌnuUoVgضlfX'hە&wm#k))@}=kA*D7m?VWŸڄQY!mϙDj)kdᄎe^әY<0 ]js柅f\`,Bm*IE:$9R$ۊD4`֝$KR) U֍UvXaAZ,Gqόʆ VGq'jj|5ډn@M1"9wsUjE'w>j >#ƨ GRDuS#swr:2\~|hlWR 5[+TF%;~\::x uBz LWɄr`kUr@U8b.qͣDϸIӈ`$R ~9?aQpOlV07[_fQN0Y56~̏Hc9̏a`*GMv{ 9hT2L6ΒTcy*f} =Ameb`--_*_ Y!oO3cOB C%T$=(b4 k$,֐+l\Ú0HR8xgkY􉚰?_Cl׳rbPn 4$9}!SKUg;vӺ^0{wtG2Ѯ`ĀHbFd}/_n\}kϠ)= sыHbs?Ŷߣ VV{P Mq}@I~rh <~MQ 3[I#ڤ3L3e}U3̋3Xou*&`gyogOmǖ~l+ڬۜa6$H6NR@BrϽh4JDZ, Ftԓ[\ZL(X?J6u]YڤH*mvvïx9r&0BN PawMnnktMk;v'7څn:a7}SI8R~^hΡOɟ53f7Pk22IR"^6!~jnRYZ¨;<~vkW)ݬ;1-mۼu۲տ~- Bmuij2ӵf ;ٲ6tj1Q!KN㞔H3ə$3g`)խlb`A=avV1qܽj]JV6=+g䇘&E&k<ǎXO1,=r_ʣs-si-L ޥjjT8iX+=/n[oXUy*oJy 5l]dZe߭)[-[Vc}$I cPʪZ c@!$#t0":A؝qDM >>2 b/UvNg3OE8N'UhI&_WzPUT{͟U ePAZ.hy?L ѨIض㟠Ҵ ]s=;*>)0r}.'r1ywItQ**9]TOw⫡Y9D6}Ҵ^bWYN=ړQC*\v\-%Þp^gTXoQɿUJQ??PU^7Df4t=SoMc_ᤌa{_֑!2~8Ba(#S{}/ھ*,u$kc_ũˎ"姽R'_1lU9T%TuBҬ;gXcG7)?R~$3"")6)vj砶nԉ+UcŸW:^Gm^dP| vU]ksuDtk0)ʢ쓸ũ0Hr4ԣЬ$J].']uD|+5b I'[")Ɔȣ4?v _I%4iHI.h_U>!꾁R0A&W?I9MwnrqV_c#;Gt/P-zC[[7BrrSd6i!8!6Q%i[ }bN/O'Q"r6UŵSpCt ה @r☱Hi¯%t[йQozOOz=_W9wU?2ٷ}PeûrL)I 7:AGW>b?XmUoSW@9Rlnfuݶ*9$¡ t5ײzucI-N΋p2zw{='0Jo&<ppֈPZ/.O/ DPrN:穕TʉmϖV99'ޟ^\3W/Km0 (KaD6\8U|S:D"<$x}|uB6vbҁ 2A$AS~"=yY,@Ȩl1bg"$ٟg?I2`\L smFI@F TcZK$i Jx a[UQ?KWr#q1f42n?(d*4(.W2(8WOPipQ.@>e>( ZD"A.uĿ129W*-&l+$)ci.#kZ_0VЌ4Je(*Qh~HzpMc>1AQ|ϚB7("ͱo! `DȒ~]zJz0J_`>ͣ~K__雿o[0,5PKUN?#PKP) __MACOSX/darwin-perl-deps/Date/._Parse.pmUT j^M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKRLt darwin-perl-deps/Parse/EDID.pmUT  ?[M1cL1cux =mW۸+$%$BRv9nOaCy|!Mv,/%;4 %͛fFd?cwn&!֙i]C56g,w;K]T+ZSѹwUO p[uS *_N}Ʒf ~}f7o->dނ - B,B9!ZfpG‰B۟bۮ3d8C lffLp `oHEDVx!(fjVT̛c:@{6´jSjш9.xs  [g:e-{6e_Kv3Ǔn8^3O Lރ8oɯ_~F;|vq~#;aN>^Gᯏ8k2va#Q6/昺$6C˙P6,6[I(ΩP7!v>f6Xպm޸ߴFzլTuc}ppae ~\ǽ ;P{zNj?߳#V՛Zs/.8>ß/Z4~LNWc嗦H{S=;>timuXf^ U>4_]M"-$[}vU͉mAUrck.|7]kfC9UXR1th1 ͡7 }ǚb6H`Rɭmܸl "6$PbQ08_:!"YwfkwКVp`~kCT nƚͬ cBAb AR ÉA~ JmvZ3Cgqɇ+-_*383DV}ԺȞ8Xfσ`W%I[镤q j?]Kw N;Sgױ2*s6+s3wRЛͽ)*ƛ&FW(5Ko2ȧ_9YЛ.LD/\s Ux }rA1Nd_MԱܡ-ODJ_&HE0u3{,.^ٓ[%E{E{FqQW*k] dE \IW۸U^9Ņ J22Ba0in.e>=RhTc0ܯY먡R ([㋇"zBjrTH@Ts?5v|1bjJjpF Y^5*:+* ʙ0!f~.+VZߋ:i¸]J ]+fb2EkgJ!\4_P0~+$+~6y 㴲hmn+A@|v]i׌H v_q>ß5㢄ߝk]-wzV^]Oq>6ۏ̀ -zT.?@owZ|aBMS5 eԢ †v$s$½[С;u#Rf]8-\1^ǂ]wv_=;Wؑ:aTB߷ÅCt8b1nȜNRŇ.oܤ3U=#0)S<<T|q,.cZgm%iUóZi}!~)dcR((ҿ=@Ԓ71HHhTz,WRiNkjYn` 𒳜mdGz&oƠ9Cx4SjK01{,jTl[%fLz #/V Jm'2df,3oa.Y8I;hv >=;a))2 GxFM(c0g/Y' wT6jbJK_$)›7,-0k s kH*OqT BD;*nUMjs2`|+8Opj /Y".䯲*  ~M/*:^g@8t̍)f0u`Ǐ˒ #[8WF'K\wcP?OlZ7HOv0)FX[<ɥ: 8n|vTIJ*6%!GS J3ӝy8xk~BGS?-) A| q@ +qBz #P䙸-<J `;n8Uk;hߣ#O( wYIqoҔx]Ln:)Ŗw Bm"[B,WL2OQA VW#)PD9A堯OKNE@]\,˝Ow 3 MG"iYxe9n.DV:0lzW&l8-zvyl( %a}׶pSe2o%UT%*iM[yQ0;2}`Aa^6[?ΙmBH'>e+L䞡A]7>8z8r~hlll{33 =L'-WxqM-rO]hl+=eӳ(&߯K>K|{JXKzK(U\ۮ't+DٕV  UHY57I0-1/ #+HI,37T)$ bo(r"JT52~t&@3WHBR;9Yeg ֚!T67䣹lnnq́.]QFHZv!R1MG;CQ!9OrI d:i f6n.BOKcCo=1/%}e-J7QWOicZx)$ 3>{;A(iNѸ*%gՅKά)(Hܫ`A4͙+:A2c߾՞wI֗`v[뇶oH:Z4"QbXu h~bL!uHQљZ kbߡ]cZYo[TII:z!YǫTcxM~2ߜ\|?/5EԿu[5_|q#fECtf/u[ȀyCW s*‹ٌ@!Cz540XA%"|k`~i/Gp1Bl¿/_Q6/ʅƄjۡx F Sb4޿1JL'*m^nE#`}{`pٸj{svq+zUB7 WG`</\Ro"Z8s ZX ʚ|I?ءZ=(UKgm@w6gCkn P'[IϸrbWDzHJQ<8ý>L%A" gL_OQC8'Ëz8JƂHpgvghc#oIg0z ]Idہ[̈́ $~tR9tc+ 4 ́[=n- {{6#ʙu;Djo  χ[. p" ,w1)2reX>Ψ)kV|$l" B~9\mtO+ e=Zq(My_R loOدS\oz+6WSIbj/j 0k?怎,J +{0{H@s<Č"r]՘LrpqU, s6o' 9y/|*gfŧzo}C_\#li8"Z-oAm9EuRRC% ~BϝRU|C+ckpZ-p'ȾT߁~sjHXA}%܌Ҭ@_S17T6'~݄-\`!cMSAlX9ȩ=ƔPBAlՅSv0Δ4n式&Q 9t#NV&iy䑷|@OmPw .b 7b`Vb7pt\зb$wXzĖ]zS2WyU_q+PB"M' +c3׫a3pKlT;gp{|vޔigOv`"Y}/3"R"w&ʞO~|1֤B۸Hw[04@֖%& )Z@h>Db=;J Ǯ"w ׁEN3F]XiNlZF($A''Ţ"3Y[ENb֗Uo6޲HIZSNBeHrMbKVj"cRU촚6Z}7]!Xy<;JUEg$H9 mH^!DNHiff,/}2z(v֦OvUz!wP~6*| ݔ?K٨18g_S*:ޒBME>I;k ߥYm>d" }g؀rrCJ'ih2ޒKG:Zuu+&o)pdR•!>al{c1ApObEGl}HP@9)"ؠ f=ұ3+q h=,Rΐ oo}}8=)1jCTQbFLwk7 x8Mg3>V?e"=7㥬K$UDα"X='1>qrrÐ6Ygr*u^O B@^<D4Oi)BqKl-5qGx̴*֤g ldp`pH(!gGfbE&z&Z],2"頶/7Wfwhɜb* #]ZQ񓷥J|n~ TEAgs:9M\iGH9[WJ', 2曄'<.[XS?4WzsDOz1;*@]ݮgr)5 J+>=V BW젢Q"HU}zV'ZQVi5´")fɬڿQ<|\ʓ7 -NqRg( 1Z}<쓿"5ƽ+tFz8/EkY€K5IjUXdysş֗-eaGeY%'n<"KbijFDU%"g=qg| T%{Q^|QbTP}szRHsCO(`,̩bp%F=R,o륓ܤY0sz{TwjkG0;cN,8~ծMqd{ZOrf}P39@IxSޣqLJ0cpߡgN}RWsULjhOvs0H6cB7?ySjHםD1 r[UJ[[h6Y\ch͢;& dm) ${$58&=T?G]2L:PK37s"ٷ=W@I9TT|';t{׾-\(?2I6ղx:' XN`[pw2TUBIl]1^jD܃(<%05#?FN[Q ]New_#pNޫG #+f_?K"mJ=F|M} i=6+@+hF4Eî^S{tF,Xs!0!8JqxDaa ,B ݈oRm80܃YjJ&%Cpqß1i ##|մN'S PuI84=q:rpIaX]J9wGا*+'xb8)wLOjsU&WyJ:r x?a.oO:&iqZ,Mf6*'4E:ԒIQVr`hWe8V0a%c1H}26vN+8Iv::!:m f˄ЇsMjP3Wܣ#*Mg4ECzwjX3rWY7j&Ts!sb'iȂt"%!V1o9ݳ<߫n7i0Vb}IXbz+zft>YWmKqd܆e ^\QٜZ<€&-}8'Zg6TF[pZTy!Xriѝ6 .ql#c\̀l;YN%]5w@A&t㐢Zd1b|OQgg+z*. \$a*5|]"en<)ց XgȢ&1g4n6:ņ>: 7n䌗)Z:2PI\theǟEeJCK!:u'˪wtgC="6أ +G`R!.NF*j+"t%[*n-jo]Ge*)**| ) TS_w5}ZI) ޓO簌~jD[p:Cp,Vtt<2)jsjU3V/x0k0L"Qmh [( nfO!l٬\#]P"ޫ/TS! ɜ8F̥)tȉ9 0,fKIu\;V>!wB:(4MQQILlH+[ ֭ƷI#0${*k%5yaҿ2su^+@?-$!y3moqan/ꋎ~U֗;"TW\{ơޒzp)z i\FFT?ݱc*xnI`Y#gل%R^֤ ^lYC]Eg a nei#ҷSдgmɱ u|^|=Ҍߺ`}mI @Z/2s+c7u(NX:.;,N̦݅}C#̨QIHdз ;sdڐJpƕPEHZvcWnDZe/D"\%W( \JU~mvD䄘z_dq8/6ilkǭ3:!eҨ~l7Ǿv$6i qƅ Yw&oNvȉ4KIL#WE ΙEV٣aI]bSd] *UOcwW+9uHV&ߧ9̬ qo0y3eSN k+$Agg*k'TPk>[⛍qo_ 䙂X9u.hQ[~:1VV{`2bgSdԉ11ߗ .X&* eުsK)2G^-9nRhvP\P?j~#b_ 5Ӊ6}լw]1T=J/IʵaLFqBڔ%,Sh(IƊݍD ,Igrq H. zE^3NYDY;$ *Ah\1@!9:Im74N6ƀ#j\UHS/.їE_si*+VkQc՛AHc!u2|#~MyRQ!/J=qA4;iPIC( 0/Y7}!$hZ$Ee@Π;-F/C1쟍]T bOe{pnWV+zzbXA+{ѾɅ-.گXӱFKg .(H09Kqjئo`WI촇{'~NG{wZv Y KPl!Ta#`F}Yki蠆_CuA;4_np\l:,̙!':]C48eeٝQ35Ç#fŅճ;=xha> vwP%6u_# _{tЁ5R}M#>dn^\pg P_\߈iV Ѡ 4h&=lCC̶ue2AuھlÔ>0)v/bxew C ! _I E![A:G&Iz3P_No+YNۣ`:<`jw:36r0nOqN̶b[g`[〺LҼ̒JBtϬu9}v2]͕9InPKTLPKj:Q& __MACOSX/darwin-perl-deps/IO/._HTML.pmUT qo_M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/IO/Uncompress/UT 1cm1cL1cux PKq:U) __MACOSX/darwin-perl-deps/IO/._UncompressUT 1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/IO/Socket/UT a1cn1cL1cux PKq:U% __MACOSX/darwin-perl-deps/IO/._SocketUT a1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKFA0! darwin-perl-deps/Encode/Locale.pmUT  GwUM1cL1cux Z{wɱ;):w-emC \Y2sItZ3-G<$+@>{=idK3UUzҿ3%o3 Չih?;L7x%ZZvD$JyÛ'Xi|,2-tmop_^ ./F ën\^5\~:V2>hgwjU>Óƫ R]w@`q>ۇ7S|W6֑g:?B}_tI {ȣP ZdFI&u$Vsl *gWKA:}j)CQpTG*?QYD}uB>9!q7?LWzLĒ_,?j+Wa{;~T`KǬrxz@XTL8;!Z`'Z19^[cXB_Kע6 &-ԱxpGD!W|ԑ+0)0sR[ޤ(3>L-{7QjBLߴX(!6(u` ^6Sy&Lԑ0ϾEX CEJ6bfVB+X ?SCL@RJ6z0MI .2=6-ؕ&o5z#KAS M~E22? 4 s&2d5rP|ӻG4S|JRm"G dJUGs\PԿ> {GtDQibU4I?wr$<|=~} 8]LLw*[2f n25Qneq;:J˨kѭTvt8<[ϟn fmy߷?4b7 ֒/_^+LV: &ȳB1*6QLC9~ w tY[a5u :;vjR#Ƨ)~olrǭ(z-[ Dla\JOlnB@ 4 ˤP춠{8VA񶈶gG7*#KA!a zed;R6ɕ\f;-4#MWRb c0>TILž^OT'*DW~;it|=-nc;49V郌zEKѾST)ڬ5ȳ';_ p*T}ޓxdѺ@a(_s.$EKj+v򉪴 1;XP+"'Z]~WaS>:)SL.~}vgctʹ^x=" W!@>]%P;)Htޟ?ZL\T\ gY`3,8BpMp94*[ }gjA5B|H ĥѶOu>uИ;/&H)E}*<)lpܛC0DE3;˷BEfesJ#krW*X( 8P³lgRNLGĪ1Pl!˗aLJ4a4XJem2_?iL vy05a_V4A> tx'$0Gj* _ œ@HT}bq\Ibjy"'Zf% <_D !B8 t3d?ս;M5oda^ͷNHg.4ڍ;d輔vԦ7{f|UУ[By = 8NZb 7Ű}3j&p)ͥ&t%<]5 m&ÃTv h7|~4`5WOڜ) Ψ R?x'83V`/(%Wh)ުP-*1!( Pu&Bp.lM[.4RiLYS97>$!\$=(a\O@UݿTMn he&>nCN8ս\ġyey< =4Cnk#- gTŸWd uC5Z&MϜAc >;3c.驇*A &Z}.)r 3By)WxX\E,ceP5q kyhNź _U&GLM*2 1p9sbW)r"-\ggXqQ),bqW,?ݒTjJhie}8Ev[rʷT;Cj~N'v4W~^Ha՝fӗb(5,VYО.;r4 $tùSywWJŢg!}o]{ K_ GW{ZxX~Xm'lQȒW[#э&7è@M%p~{MTMl'N_Xq8TԼGl.gӲp6&7B-q%j2Qb[SI$/T .YR A2'4 U]F/I46Q@܉ J`7QJAl t().QgN)ۊ1Ge՘)ko*. j8QNl[~9>op܌(57ճ< >w/"nXm,Wp7+ZAZϻ%Pⱈٍ{ե #_xB.SLAuZo3wB; 28SZkEѾ3=\qfQSuu 'uQרadA+Nm:ÖTDމqAOAdFU3N!AEpt 7u!v/AHhr!Es8$b0:%[IzWtHE yf@`hGa,qek9>l+h3(*X.bÓk%~(DZ"0Spj=~SBglUr#^Lge:{=0 Xvj :y"g{+y NTڱu^U*DpoWUGc5[7܃";зFv^'zPe4wWӃr _o\`;-(}};񼾉 N9ï%Ȝv!ԓ`CGĹh:8m-ڛ՝ $VÙ`F4="mUT%3@ jz~_$ 晙ëV].AЬH\Q&F""S2kH]]$߽@]whEV{JzxEmnѮGt&;ߚ3/t,E*^S2|ziy1)CZkʌնz,3/eiĖәP &iҭC!B+%)Pek R夢%+MըiZSq˫?I%zߑ7(z꽏5le\f6 3뽷#ϝradH),&X;cڙ TeHZF3\d>M}xlYKb~+l=0a`l"9MXtn#̖*?NۏOG혧AlLgYGrN&)kirmR|fXBcD3t4Y޾Fo`z)55OjA֜`vETf*9YX2s4r ƙ֧BhD-׉HkwjI&Ձu똵+Vt$K 5tuD!)~ xw}QS 6q#<0m[iM(p"+υ+5HmK2|,qM5RӅ!4SHMP3U %@%*MZOUVmoP~biv$bo_!Fjzl_GSHKpE_VKD3!4V#}s_u /k` _Qh%<76e?{%`- 0mߌqu{hNxoߟ-4Kf&ܛBSl_V;SO+c\mcb& [kӆֳ̤TaҰݐytٟ~^ ݗxd6b˴ǁ#h! ȫ uif!'jpĽYV؅ uO%S儂'qpjV/5k7eBh;A=pY34Y0%K j,Xdu׼+( eOp[a ՋXv_ hL(]!mª\{r%" ɕf9{ͳWVvB=Ͳd NN#E,Q8Bcf8x ֦&j%zI* 3maA+$LhbҼy153GS81#0[3"# YL?Q1K 3:Z=-^Za`bfȗrqMvn'!Ej># #2ܶ /Dva5p@J&Q17&P B@&-|9qVHZGZdbԥF(`[s.+=Ij`9TD";SYCuqnHaVd֌u X~,G lZ:t/FtZ]4emI\ 59 +bsB^&Ε` kD[ZA5'ECtzO _{jj/G3[yL/cI"}kǯ)1 TJk78v /ufxZ+K,PYYʄ /4č68o ''P=tgz\ӿe'նQ7.;Q>NERsDY'JpʚQkK~vԾT"Z/tySOu{0d18~1i)!n^x*K;`Rn!PHL5@>"ދ ~@X7>N] ՞-~ NmQ]5cL sNٸ{.vUZivn5LWw;0Z!Nƕa%m1:u`qo))էG<`i.wuq(zwjr(eVm9~cu8qIoP3y8vJ(԰U &8wcYJzFyC>*I,9~uړ-s䖭h&cS;!@1Ztg'{@nw'+Jo[qrHP9:di&KUzD%5RF4iA؏fsW[n Hmg%^KC83;VsT7%IvlFӅx55 @A5D|of؋~:~ slB5ߥr4(y64Y9>3+7bykKfVmm!WS9~zE)g^5MgIb%9f"cP lxA{`a]Ǡ\gN{AmpzCDY-Gm=6!O;{i9rL:`x N! (Q.[,b` X Q;3'0u+rQNFܑzRe}rV8&rf9.Jk ztߍN |> | }PBGfXM7TY9:.h3<H%='.'8ԧPNbE含:hN25j gLQR͠vm7uPOwy͡Hh8*:;uõrxtd=vVAPIE:1h[Ծ|Ss^<>-i^\w|t3]p}>]r[+PEيIp0 K|~Q>$rD" zd!L-E.}f"[5BU,^o۠yEuv9fwzZDL2" 82o^DhfrWsc F>N WP>E p.KҌ/–^ /ᨇ:a1 ҵq~۵i@";7FpK-穭.{+- BJ~.sOȂ(3 `5_Ӣ 8,Fq `4 Wiͱ*Pʌ ¸T ǨD1K?Z **0-PL{4Zs9j]}Mam!b|a`ax m{! o|˫J;fm}Γ_oFoΆ7 8Kҵ@^xAoD.".nx/ m٭ޮ#2#k:~/G YsrvQdCc˻XE(0dd,!|)vu}j ~"qi*WCk&bīQUCنNs{ȳ{#NrKxw6\wP{9*eM@zSCgt}fq-TsiVfR oLtH(=`B*쉯,ibvW8YR̝cĝ|$Yà5^&"_Q.w.+V݁PHb`0kfftXݍ٠@=U |̒q*8”ؖFPKT00u2PK8a8* __MACOSX/darwin-perl-deps/HTML/._Tagset.pmUT GM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKpR@+" darwin-perl-deps/WWW/RobotRules.pmUT  ?OM1cL1cux Zms0FLd&ȩ亝8w ypYG}v{ᑲv:X2,vϾ ʩ߿ X۫|#ga`LSI>rY!~wu. xUS 3_wDѫfO/THEjRgJb)ȈP8WRP%xC&"S2r ~ehJX<:S-OY= 5*zuC>8S&ԆWBfb2z :m8(b<N2ef5Ndz+8 24'q(SY*N.^8w:LTsiMd N/SçYLK6 8Vиh_FE#گe(ILB水+ôfjDhw.Sh₥ uje߁JsoVt35гcH1*@dviyKx?gCF=PZJ#ty{fE$>SY~?i}wFe'axc:G*!OG6da")IZ2*2BOy "N8L-z˔ 6ojX!E +AԥK%*bc;'c\vj&! k=n.h{he9Tk~?zEn?xR›2{ȇz2c쑠^٬q{aGQݱ !q̈8VNK*Ṡ & K5j9cib}+vF=gP]]lb1#~2R@V (/Kވ(k1ܡ,-/ίOpeU`GС2O{ܻVVT@\, *bg\Zʝq Ų^myOJڶWeSEU^,9/'GGѤ ' u"wND8Fjo8>JDЊ8"QeW7I@Tk`}՛aDݲAQ7-y=1| s,VlCŇW1?*3y %mxI3գ,VHvz!wնEsC^YWw5Ur e _ s6. dWߗkЖN/{N (=]`3'ڷje-3S8#Ny- Vf;G_gF!N%:M8mџ5TmCFgo~8xIuwUtŹtg]O+dAHqAcKiu$W=!.EN(G)gJFOśgA@Dʱ4\1deyvP_Db2nԔ52;%6t@oW$Q[ `,f*`sPNfMB闇e4N .d6R{$&r[gtz\*m6L{8m+olэ:@4buFʰLsOo7u 6OEk[>·%xN7)}\?)7zBO9әLd 2F1™Su,mLU1̉r|o_t^˛_o ts\Re~.pmQXyO"&uڅ 96ڙ"u}ڄvygP@q,lSHD;#\(~!e Ð+QB&'S&x$I&FH2N%~*1j`Uȷ!V]H' UKX9W 7`B'q"^ĝ58?6?.|+J2[dsj6pH$Nk˛Rn^ە7y,j6 ^w;G4LD>(t%)5|KΎ*KEK0 MS[bDM[SnF-_>(,a;sTaٹ;rJ?V($F4XED:gJޮY }.58ֶJ CR2 ۔ūC1[pv\"~҇ݬHH$02pd^P -$KJUDhhvV c1B>cU Ri((z[‡8gG}\l"XTxq͛B(0~BnYro.Z};GIYsq0\Z|u8EclfNvr_0^F>k@ |]lR]63xg zZm$nStcq0ս5,4V|wJrM])\}^*ma_u;SGFNm@cS<7O>2-W!ޚji2W|/Q%.We[}&4@+sK[դR(X*c[kVD9ˢu#*My%T\6v[ ^-71B/]R(䟐m#qᙿa雤Wt}v&N./[+\;9 tףW$qzoW?醎T/VYlaKdC$yʶq~s{quɎYc8dL Mw=.t v/bXlY I$3c}}u|v|$K0_޾^3wޡ?/yٿ9Q/]㋟5K#4b?F}W{gk>;?}ݽaS>Λ[ aPcȘIvvyg}'Iwwwww>MX4pCpx?i f!{hIJ`c36} $f㏼!=OL7k b0ZLX,s$.0RyR1nn޵_苜}8SYf0@h wtAJW{H+{F kF>0?ʅ4% LkW58 \ʨݶhc c"8Q{>b3)ЛplhpV1p3E&) @0 X6ƇlYҟu`*]es-YlVZ/is*Ț-m21Iއ1L8IaXw^[}B]+fe"ZYNILgقg2@,-p {UGƲyWE%6W5Fû>o>/h{a4y,M4yľ,MYduZ,[G`^{1fq$3y}lBE3$)x 0Ehoꨛ,xQ.d5?7|k`뜊ZZs:Г1[$9 Gc1<"do3 AH4`3Qԏ[!(dBwSއDq@ Ym[#N"dYȣŨ ni">876f20Fҳ< 6Z`fl ,e:Hj9@ '$4l0P 9*_!{.0}oi|jFCCV8&QL3r,e<^^KDe8LҘ ^vB@K_-X܊YutwE > !AnӮ5c 2b qBħPfrxxˋ"T?iZg\Ha Z׆)) /}EW%笤x;Y3:-X*;Ztis롽F >kTDú5RW]2ׂU5L M!ȦT s=1eK67̱#%4qغ1">ކنF"JQfE¡f f5$QX~@6OCRГM6l1I0'%6$><`b1\Qi$nd Va:QGCGMfXQ<}8"Ћd.֦ iæqb.a|T]Р}xUJHu+JP5:ŃMbJUͫG1 ɛun‰ʦ钎LlT)Cמʕ]j]zfHLr5jؑ.>ъy|̔a N`$4oc}UlO^L@TDHA,)> x_߀(*J+L6kW'^)< t2p"*@T^埓s8\E0]C\*Sgʥy,cP\@88݃?YdzdElSѰت@ّj~K-GJ(<?z"';lH7Ct;GiO 1ȓ&4r,Xpo{?]>?0S3~  8h⚷8PvO% .ů#$.vr.L7@`a2)Dlp@YA(%َbvvEDa GJ1J I8@bN-Ts!#Si: sf:z{]6co0T !QTXAXȸ`\ґ~b( q:d`cqɿA`RFTH$՜ ]0T)tZyƜ#3!M`u$kb7-YyDVA,q2hx!! JaiŎW. "y@):؂[xbC|Kz!FǺV'efb6!CȈW)6e":^F+; Ɔ p!'Cd;qU8)ՠQ !/kA:Fa61x2$*k,]} @bz@Bu^Ű>W=B%#1JVXnb#y1BǰNZl-{&G%r՛n.'˨"L  0Fw%|f!JRH&rM A̲BJx-5 Y5+YSck01X}2AH Yz*j֫j,_B er&X;/9sF.J+ \*gu˙:U+|Keq"p ua2YIs䃲B')j~fgc|@e9 *!*` C@E]PFe"1Ocԙڸ(ѿת4ULUv5~Zi9T.O*nGʛIEez0*/R[11 JfD,U.BKI՟NZ7iFI"N<*ND>&P 0UncװMe&h/hXKC{jI:i*.liV We]iiV>^?* = QByN_!ϗ~Cģ*2nP&ߖkv]p0,{PtU]l\ZlM@཰oj8 TMj Lr;'m-7-+_h0ƾ6P/UZLz~uX+]JCݣʛZ0@"tya^tzjg@T;TTrb t k1?&[)u倱J*E緐Qv%ЃGi |LS>rS{Pjw/IatR5ßA8ۆoNjAR j h2 D醙3:,pOB =UA-2Rn=y6Q2¬Qa4zWgW`Xԯmr;XAbBău_^5 R A,du~)SND(o0LFC:3t41ۓNO=ֽ % C( !GX T45d\x2DOt0W/Ʌu]n.~xSEaY2C 'O3m&xq !=a Cvv !`LzMW,`nej=IY2H>+R3jd")\LPKF|MPKӵ~J3 __MACOSX/darwin-perl-deps/XML/._NamespaceSupport.pmUT nXM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=N5$ darwin-perl-deps/XML/SAX.pmUT &]M1cL1cux ZksG>bR6D%lQуcP 400=D)os{^le]q}{nVMʎ t>8NSQ莣}y?vKvtqSfxk {ҹ#VoTrρ #*V}GZIF+59sBA-GүYy\OZo>An~>Hzt&|\­V;>dmlyOĄMeȔ@k %XOsDc4lRl +3GLN E#6!$Esfb_gܟ&ݨpA}ֿ:e#'9F:E;g6\nKsvd{ЛƋ#2\ܙ/C1)%._}Cl51tSywqE;E&pNqPp6c4 +G$yUσh;eHUe*.O^*F֗$j fv)Eα$xծg@UsаbX˫-V˫l='Xބ!pQ5A2BWKf}J=`84O焋[Lmfh=Z;LAܔ`6Os_`bRM`!d ߼ɌAe"G.G4*bGey~,7msc0鮶m9oܱH`!.ߗ0|t4V?=MGXً(T,8Rj2a<&IGt:>YubJU^_ӻRY{Ul߿(z)(P~/w/J,\ꉟ ;5'`XWeR+ ;ngq{GxU!9T]m dؐ/D&P|v;,.$D+ "@`}"ӗύwP?B)ubU> *6N#G*QhZF»VylζL7X ZK PX+Uh?& si\ܔ~#Uӓ ^@DN9*Ba)Ϯ ɲ(M:h5n/#Zqj) Íh7y(2`ang(a:HB|aZ4]Dzi~HTuu#67 yZ% 'H\%.)_g &yV YyU@.&SD8-N7&*5Rs ?׍$3ZU=q&(vj?Sw:z}]Cd"S 8+7t", 7/AbxS(XmPLFV SDc޶_v*JD-y6a*ʏ0FZgY3ĝza8V^~|9\_va*p.8>\%M| DNa3˫7_NC`.r\{?חf5uc+qZ@v[V_o 5QXbMB2r"e*$wLLeHRuӻ}Ԥz4^jГq<9&hRe^@NVSKE#އA=֟,*9 ۳tW^f{t3㘮bM \>5r_9`gI8ri)c#%Alq# ~63p8r Z)v9=Ts_F3)WJzl~?n4;5SjYtE6j@a6`q3w\c<~#rƚD*#UT)I1βkhnNx$#h, F: A9[syeV_A7 SjkAP+@FK, XZh.':nfG'R2m:ľ!;ol^=FHbFT򇣓˲/=l )|#Z3hڡһ/-K.BI>geD*ڙ/V0`V$;چj:ij* SysDs$?K*: e9"p@߈%UKԿ^w=_J"B?U>HAHY>t\LMZXRL;cN LQF>#-Bu۴qȉcm|7DƝ]|n1|,sqQBvۃuV}>DȈVΣV ĮSiPȖ5wRJnv˦QT1kZ̼I 39#vx`tKmnd- Eww* q^ceDk 5r◵Zm*Q-/]FARF Y^MHQXʬaY˒s TRP2m::6&.պQLX0,u8#" Cu. YC뜳 H^"9ЀrJTwP0>B>r#5DO0Y)yQ3ZHQ`>ycifLr%  L%?֛5d}u*F,G/ڶ5wYym"epFȽ\mW2+|g7hlm ]ūU+mψmh_ h(L' WȌ`͔☯]2rU_P;:\z٤ՙ@ Di|_4B$_+vCN6{xhbutv\ʓc +Jjlvh~rVp/7}%XJS?I5w7n l \psvzh(^}Hub|.8qF?-nǹ_}rPQ-И晘Vx@ELJK͉d|PK4 5$PK=N& __MACOSX/darwin-perl-deps/XML/._SAX.pmUT &]M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/XML/Simple/UT 1cp1cL1cux PKq:U& __MACOSX/darwin-perl-deps/XML/._SimpleUT 1cp1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKM"rL darwin-perl-deps/XML/Simple.pmUT ڭZM1cL1cux Խk{ֱ0Հl(rvXFc9M$$$%UgRҸ>X"u֬YsE:^d^,ۏ6~u|'O)ُ/t>zuENx+>*7'yY5,#wקoN΢㣳i]-o_'Noy|S.(,n.:J"/.ⴘ:~Jo}?;媷W7U>ix^N*:`i<˛Hb;b=9csMYeh3cۆ} >(M^[Sr6/Gk5?hlyV44XU2'f["uw.}tY<8;>>͛ӷ6A ?='}8e @1e)Yq(5uaN㦌Y]c:d:K חr60rK*װɲG:=o*_?hsD7i9YR1/tgu 鬎/ 6Sұt g, Xz QHǺO _{{UvЃ?V ljo&!{eE]`yvr8&-:zV5.fS)ӓo曷/߾=~>zs-b5q4ѡ&rm3kx>{{SSrҔ j4'}΁m+"(#OfC`$󆀐`{QO2oULFƯnK8$|)r:E1VOnGiQ;S_W>|:!6[K*D3\q_Rw/!)^]!ěqD nYBɤ Q\<Ï9Iq!*S`9ҡeŶJj|fq'o|cZ_S:Vz ß>H7D]OWlU\== :1yg͙-^YXiRrJ-ܦ^26G''ӤHu4^RΗiZB.;u103lV^$T0@s~V 8x` mpx$of7n6ެqXb6 A`RodߘS:+[Cu{4g熋",DĖE"JtY GAE]{~zrVIG55fpGWb-ƥ=;zy֬o|kR+v 8Ngvgxuc@޲f eGnwan|OFHH SG Pf ^@Vf!>.mJ[XcU7ww*=̀#b E}e͠C\kM]B}AG0tD8e@Fv}Z6UǕJ»Hj/tVQSe=]Uyɦ:n ޷O C=sl(ӯox/]FDgi4?%aۀO6w^e6 .T>wzjY!?!/<j*+&<ѯcQx>t2W淽GSK# F7*3fX7z4b81 BqEO B\4/r~UBqs, zWM 8EKm>~qKGSiPv۵of6˂V~[gvP k򉑠_H0!HZeEWWO%ސ݅dE@Ih4[_/cȻmѝGࣽ"N%JC8\I HYf469jS@>} ?u ]ZViֺn/+Cx40֚QnbljGv|Mu~lW:^inN&X8G, #0aN;|Vjo0m14py ]Je'E|rBMEYlEhX: US4Ga%8Lͮ'~@Qڤy떺< ͂Zeӑa|]X^եuxﷰɫ7/Gw'jjb {-IuVHos>[ekOg.2;wLy.ۊQ>'PiHԻ)qZ>duMp ׯ ̠+fa߆{# ܳy"Q^}#6!ߎ;5 7Fꎍ ,O3̯eBY8$pğ{l+:&b%axڱ\ku6c"̓myBPl^(*xȏ bM*_TԠB0 Gc fytTsiM%GH[CBsN:z\Hm%:ʶdM 2 f]jIy0;h =͛˅Gt}W\ L' M?{QZ{clُI09tvu5}j}xUSjdYge:d:ώ3DWd]Ɔ{n*ЌC(н0qAD챎K ѭ$[*JD^"OyAN;nIbRsȏĨ2 Z[)9z2m);wJ'ckY$`M\7+ il֍CvS#1{%D0?]G-e 15P;uK ԅS ٰK8&/GK/EKaWYB d9d =HxZڠ9:ƞdr<4%سn` ! Gw^@xt'3ږ5{VV1sS`Ss$sUplxqf !iukF)J_;'T[15%jp p)61 E P5h/!lo?)Fm]|b[ʆ>JgzFhJj濾<:XϜ dCTjWl>U?S>=U˨as!`)4śmBy:=o9a7Y`l?m?~gJK[1j 7mF:6:RxԹQ=ndA iN[CBwy3 q\vF9mˈHr@CXzl&9#[Nrc74T3 ˟g(&KG5¦ )4J^`9XEVLt>ҋ?Bnp[|9iIb s9 €Ef#tр,Ϊ!}}409<9 {PuDE`W;hKώOݿ]NE5G @-/d>8h/ԓ>e;&6_bQd|&~itlfueb#ԯ+}~o3.$>Ў"wh*ņ 7f|V3Kv%$iƌn&>njCM ?ūknv߿;rE絾娸zo޵ൌ7wïّ*Bm)KzbӉ~f/$^ Tiͯ`,- 6#T[I5{w};ć]8+ϜI*ލ诼/w ;" 7Q67а½k/dukX*/ה󯪶:\|0] o 0ŇLfu @pҌM8p|zGYUMY u~8hKlCPJJZǽL9+[͈ENxWuDbd6w1T o*{頤lB_~%v[HJI %: G鰵%#*+ 5<~(Nf'LWlښݒC2*.!T]$$YZum&F͌6TYУOw gkr EHEɌs-]۳9S3Jhre[iAuHv:/mՈ}bˊi!fjZv ?IJ3X(;l{0$ Ǭ۰Q̥K12԰b-J8=h u<Η@.Qo c 0Vw]}ן?SU(x.E3- M61=N"J֦]ȏ;^Nd wr?t(Ja-C]9 @AX0H8'(Sμʤ]~"']WUbR7^Y8dYUh2*{} r"A\{M}c_) 1.V%{.S]q-L1I=O+TJK2M>{b% H9? rD@z^&`yI4oDFrxzs.3 5NfZQ;axWge'f#խ%W2x'+9,2E"Ӣn/솵!* $^|yn4 ӂNEV.Ow ڬױyŬaWE~ åT~-y?g7 ܱōa8e`0:`Yft0s]먙`D3d4l;F%hd7A ƮY.' vV._ho{?xw?f 6wOƚکx A獄=evWo؆hrĎ)mTTQ%'Ȭ&Zׄvzev4&BHYT{(ؕ'`.P'IʒIpIra/% p?x"?nS!_cCu:7u~_~֚{(C>.v\r" 6S,N&I}!XkaEfhvk5lUtX^3}>'>=pdTt6\}F썱2xu]GoS'^8'.GA8lY;2]09Cf}9rn#|=5Tim\fzLx0]l0F[y1:D%<fM}bE L)DFLMN(eH*`b,>(jSpIkj ,jYJs4(tU,1/S x*rg_Ix$bW|$b;~bg?7>N}%m>ҤdNh=r¤N ,@em@N5Vb21@r+7) cLI\"lx*=Hi ΅h ?7v]+ɂU +Z[gIy %>=mC4dZ&0);@ke{z43¿S/ u*Bn {kl^vi֮+zXTBay6*:6hCD[Yl -N;dRls+lV[O봘cfc"k=v갍`Mzdr7X=8 T=tO.^3Ev4^[fȭKMJm5;\ErFV"P[<4١5?0y/i/ O'CezGXG"C7Hŝ /_~J@b%>`mW>ᆗZAv>d'ʉM;}/:(F=JNt^6%V.M%eՉTwF$mkS_}d hVݔ &Ew҃D ~pY*Բ,dHvjŧ-/ mE ބGJ$nٰ?(pnxMv"9aI"Irzý_n9yނ4m>%պ;4gPjj^YpuלKǾ;ю8}zjDžVW*99 .mQpLQ‹Jtg3LA 5;-SȚ7"qvMot4r/%܎M__t13zCpopYm& ZyK7víi;;uyQ'U `?:_< =;kYVAy$S vuң-ZoQ7ԑ?sDX>ŏ0fiYZa+X`U `b"楓[ͩ1.-d*8\ 0dFi㺙6]4mڅn8iGQ6>@e$Q'%ita8ià#VeU6> ;^[ev΃ůU}b>^._/ՏJǬ,YKQ3% ~?*vr8$јn[r@3OzD"u*iW« 67O>|'%bYd50K4w/h^A\q3\ ^ސ.r6~3~̐'?I<<Fr*`96nXA̦e9 9> wQکU;lծinh:\oP~=ln3qYg4LS]b<:5m"`;!YN_v{&=dUR⡸  -H,+.KaOZ[6#Lga6=p#Qi7?7.UTľ:Vv67d{"K"Xۨݔ`btMgw @Ϧ9o^z$/sxk|m@P.@ݖ]ͪhqLh-LƷoK%)!]OM7k+' xUxV5w>|c_|#׍K .[gU>g\Fܣ5uixFrZu8;Vӏ׏ox^$?H1 Dd碖'~A^?R?ג4W ]glg n9mS3l oQhs_?F5U?q55x?M+lYHYPf̂ͤH3wwي_[j{"%gU^k˚R{)s]wf 1==I^STUndNY^k]=H2Ph|>FfXf5* {9Zθviľ 7= pSC{hw<[>@HCNemQ86KGrc-0O\m (p)g MU킚qr)[Un7B) *;XxXrKq(]5(z) d =[ [''B[i#fYώWA]0hZNӸUɩ4E޶%'\x4i#ܸ6KjK<-,|CzA=i_2X˟\N}{h Xў h_̟L8ck'\9{(_ p_nh: _׌Ah2N#,Xԣ'cn{#bE"X?x@wLOWnк}]ͼ(fUW|I/buc)9D|(_\E1u'Yau[ =:?HF('.TX7t8'PLTzSXoPndD[y-^ؘͰol(5zvjp`q |0%Y9re X+%¯}ol&]@6]+rkhA`XF"/~@ϟaa.4:~|4,g}{}sr:}(t: r@<˯1,.f"<%_CUGTHc(Q|DpN"0 ]pWPVs"sq0I792ÿC\%4C'I9ۂA8VvDWoj;Q/q|bhݿ.fsQ:߾țx;/w՟m1@xk|qaD¸Ybӑ7SDwW-2-3d`EA? vTu=LB;{uI#8-R5]pkOqGQ}C~ զL{Dǁ3`p8 )G@a= a#H {y#ihE|_^):2N֎(w{A i!3Ҳ) '],'/ U%~}p^C)Cu/zwRunm8aX!`\.^%Ӽ:V;tpB/mlcH4c:Ňv#.kk@4ȇO[Bo4M>}}{uhsËZE9z*Z'b 7L6ˋu_ך |6v4|-Iǰκ" @rho ʋ)nb\SF1Zթ'K=${zcm[AfDEB?lЈZP7)4#p9䔄aҺQ ՕY;E|@?]M7(ӘS> ׹:d98C:EAOC&H՚,Ht9_'e$Rnq UѸ>MD#Q$g!1%-=b 8Wf\>;ПVXw[Юv[- %`ܖT~;M#nJ_\yZ1_/=xlYӇIQa@][^={zB:X0{~$XYV: uk{.Lt'A}XV邌b㬹 -ŒJ40X4kDDѸLr/g0@0e[!N"rvoJI aZlcꆗ§n|ITKx[Z!˚$ԼJ(ϵOυ T,u1g=TrWJÃfTMrϸb}KdIX!܌Ji,rIfn0Qը=E~#xZilEb^@ /J wU0F,͝;z'}qxcɜʫ~$NvL_-sCY IR#;;24 n$|9"CLD,a0+ф& K}'V#S~ K.NYqNs$7͍Yȱ^SEJG޼<>SPޱjJH]qw$UI.d&+D# uDtDFHЅ^WqLD{.iWb"ʔrBIOkSm#|F5JPXa \nʮ; e呀v^p5 &F c#AH!\kVHOX ͠)~-L!]ڪ[U"(r>!1kJ$gFKzN9olL|&4hSPv󁣿'9")ϒHE2LW?RUU8r; ⊮;8GM q$\HicQK P>>}a%/t,q,,Lyl q-=M0iH~lKƟɣ|=iG_;^r,fDZʀm\Lҏ BD|a~p*aPU\p:DìpmϾ}; c]fCEde4µ$AȤʬZ\B#v%<`Ta5{n+_0U,+/x@_-LVWNu&=&=!oE@+掜n4fQ6^UMY:%3sK!>=*-_Dz !2orMxIsFuuQFʴJdlS! w8}pI'tDR `J\YBQD$oOFa*ȟ90$(+[z:' RrIkidh( キA9s Z%U Wc $\D`ͯME9!hD~IBguUuɲSCz*np *д,ZXhGLbkgP.4Kv;w5BJXmUDt-0=D嬑Y0]=GC;ydہ2آ`t: Om8I2!,p$Ql|F/咴!r"½Q-2neI^p{kGL~*0_4 ' D`Lďpqz,]oqɳw߂&袀b<"}-P c'5Jw^+Q-"O .Sḭ|&EIZO4mQQj4 ΪLgh$PUXY]7Y,0oékA۠I٤@jrUΫs y*&2eaG4E(`B꤅Ѩŗ,+#lJl%1$&B|y&NvA<99&jʾ#[ %oxaa,'XbP[Bns1#ְa dQy'fڃ4ipɏn=M,f72LjIo '(+K$={6epI|?a,&o` GhgME^1]$&hA|[OL>xu{VIBT"9 2 =SsG -P=uZԥ95"fR}269:{M'ۏH괚wo)ө&Wԝ[]Bq}>Dr Q˭pt(3N $`B2ndͦ+` ]zޘ4SW):8ʂ ižmmB%eh_YiDXAZKDB>5:^bi4Bv)?\Ayp'|On&/@d*xE]Sɼy-C%wJH.>oI{$P3!(%Drƨ"̨FxB~adrK#2HQzT?/8PҪ+ub&(#nhe;aqT.^~0dZ8)FkSd$l~Ѱ̹{1#7V:=Js;ji#+48ak2;Qv*3N(;B ?@wĩ0rU<56FlQbpԤ"j|DIuYg1XH7@J=xC@`'#t@]tI! 9;d pf>\n^dN3|EHÃ%3ѥ'3 ۏREtR68d-ضB"ՇZCX@\-{Anߋ;G `ѩTPN>s}aK#"uqM2WwhY٬U)&ҌQ1%&oc=Р= 51 c%ˑ}p8yd%.AE5Nkd1d uQFDCǥ&E]1K acpShLw4_8/J DC`rl=qFE DhAC(FHlQuQcvjCת0Z٧VɪBCM"6$guXnKgq)%/-҃B/^=O,!v Mq_+@: A#a 7UPn^Qfxp=)wvpO6';7m:nZ?q@0FyŔ~y8DP6rӸjZҋR-"~E;_U3? FH4>텾^ um FUѩpڱ}b)Sot۪e\ZL Y<4gRr:&GuvŚIݬu]l^\ȿpKܭn_(͜~{j@GgYHLJQ[(>Ihzu^&:Vqh\w ލ.pfʀ@ZMiG<]htָGtIe1oإh_zDw݋?a0ErC5$`ϳLOb}ob s.#ֿ[] wEC,eZMiUۛ`t|)(>_l6hA0H,[JƖ RN˷;U9Xz b;dpbvdk\8nȽ2qh:q'I;|]h[M3Z~0$r;xDž +GmR#EŮmsEkt?U2\EUjV]@b"%RZ!읡j]=I?I{ش89jI6& =+1D^n\,A>+Bm|\Win^pw񻛺<i``gZflZ &ViKfʿ ×yTǔSt"PIHgԁ\>h°{إ(uRf&4cw,_#JbQ`u ?4y廙#:|Ab>UN:pd_M)6k\~&ER+&Rgq <ً@-hҺ9$7jh*]V)뻍q.6Kx2}MVV Ց:F2y#ש%;&E&x $O`8mKHZKɺy<_I;oM>gB{E9Lffy]XoҹETv aSJ@i|8U1aG?ʅo TG'jXODГD78%zeh|$=2wH*jSϙe=װ(M! dz1OtxߐdVd2Pʏc,'aYF\;X8NH(nw刴GZ  ~@ Ds7Xn, [[+WK; FԖ%t!bIOs's h >cۘ/?] TtLN+d_h;E{N3P2,-:&"hץJ".RgnTV) &D E̬jGg } DݽI-ϾYUG˭14kGPnVISؘv< `:BZv%x1:"ezrNjn7\h>`o;{/hM1.(}#hg>u{L7#gLpqQ3IC3d➨ U*PXDR[ISUyjt;.P0Zήl~-s%jzY=~[cY tFs`g&['p^`H K.M>gy#0IKVŰ.j&k:FFfIE7i6[+Hժi˦ a9pjGxcꟶKrPL>U)gM%Y.-EKц{ڣsMbC9! ԣ{g즊pޤJINF+%^HO>Mghu+`o_C4zZ0Β^$3~$$xv@BPsqGD{71fq+y=4O)^a0"*RQIRfʈ,ĖZ6'x%f4PvQ mI2GGOR(1KtP2>遗Zi9C|QpH:[-vE.AQtf U"rjp$KWf"Uw~޺([q2i)Sg=GE/q؄$Md+yIkd,hP a-ᓈ1Tt2#l\ϰsKYM$CוkuS`G& H)Ũl6:y G9Q$ebH<٤F0r5rMz:4y:5?-Ёt&4v/zo;%`bʾcD VW2AN^1u&#[}uHTV X^8!i*k$Dk0 h<̔L6LmDdCIaթ_rRdRT ow֑#4e?eDˣmAKUw^% ,{yA<DNH˳Ӭռ*RZElG(ccĢG%F<Ąl'JI)A̶gj+x¬ Q䃐Tz !F \GXi_ ,-?uW~'rFi?WS[/VIy0Nٴ 'kob$7FZπLԼx+U6:gWRRc]}I3l8iWT ZÇu`ଙN~D x:h^KyN60ǖnh SdP5(@70ƒ3L9Lv'1%Ng.` "?yӳ%SPZGBOG_IrZ5},YΔ,^.Y%W{ "R91(Rߗ<8: v읞mN'9קt0tQ/RF.j-üWv+3Z9Ij}\TlJ2oju58$=>_Q|N`n6>#Y$ڊ'$:u9,Ô2UrJw 5\,HƔy%$\yl!d*ⵙbkh;P4Zpz/ibPbYAr"8<rpA`8m0Om@lsQi8h5ʦdd+fԂn Tr#MPzbeT,5:Lmj'onCjmfw4Tt{w"kLQ Ǧ8b9:HKM9#L_a2H3wdu5؉CLl\YZ., Dg3)@C: 80TL*l?Գx˖B؂go`;~>6^w A+VҺ7Ҟn寝q+!nh׀| jTǚB+M&XCN_Qt!| D8'U-ĺZ޻(ʛ 5Qu?drO?BT\+ښ3oy i5IcI-e1&+mo|E5CkF|{>C[c]jD6MRW_QݭL`%inmph3l pyzJ} =1eCI,>;6Ì%Jw(严1꠨LT,b{]kqvZd@vS2%e-5-D\7o@@ߑoXq3/`EcIN*?lF5.DMra2F.bKr(j IheD`xAAlR)$+=񊐦 iD<[@\+puE&̶cu3Iy"T{Kj͵ ~y_iTcœq-5KGcp#ajLHniuĀ.K\p!;>x 0r2!'Ҹay|rYb,4LϐWrUzL %SO9N=FY.h@Uet?%^qgѮzCwk":NFKBBP]eEtٶNn) n^84)xy~NOўOXP;Ko\hL)"z/gp*bvH#RHP>/g, 8 "a[#>QGz%$rkQ/v_7YpyJiV)NN W:"NRx)J<$]* X T(/QQȆ %)yg 2'MZ@G ".;UA#|ܚa$ |]Jk#"N6 ֳf?^t}7v2xUFۏ޾ ДpϿ>g(  H0xy$jT%ʟD*_[V%ۆWZ)KOkGg@HѻHϿ?3,Rlwc?r6S ͝ +c Ӱ)N>ntau;IzGn1ճ»Q&0 Yeҩ+wQ*AQ^qrBƽ 0c[ 9򬦫:.EJ+[C1to c^O_Wͣ~(~E^+tkQiW?`ߥ Ʀo#uOUuR\w<:hck]# ay# W{ kr!ǯ~dՐj/E,(( AԱA%yJ`\-&H1\䦜*s$^R3FĆde6loYEAdKSd b%r']Ԣ#^8bՊyUj|d1'՛ǣ7o_}{|[XW#!ABIlI ߐO($ڝԻI@6ئmpeV2njv{VbZzڝɒٮĂ&9qY*qiK<:9)t0@(&ҌO@׮q(5M!6/66qRP-kmD 'Öo@i]#o="N$f]TH5^@)qKYUw{Oﷵ4ءjJ$IYIh5l͕%PIS *$ ً@O )D@u~;r3އ%+,jZ-e׬]g2oN^DӄTaFt;SVBߝZ6}`yY)le>Tabf(ob_#ɪnoߞ9z2EͱGy55Z/stQ̏* 7BP٪/@ 4տ\? 9E0glj.KJ"jC fPm]w Z4'DfܮJ2p?z;Mm_qF"|:,j!| N$36| {$7?7V[(c7+`oi65 m⪈,hmECYIft*jxI 7L8/ka0)+NbI#u?zRif!k'!s֮YFշR$ȳ*C\Jcm;AgU9-7K[WiuՒ|=D3gRrːKq -chst*z0êe]pmTZ'=1i]Őqcrl pl@I>n@Jl4̞6ܯՈZc7_5rb@ z*dFUtݙAPK[`ـDz;>5^*2ys,ToLU\ ,ϢN"<vzHu| m]sa F{S޴+3<鿖;+JkDʟ=~%;u\q?IoC7.X@>C*2-KF<ȍ yg,=ء'OZ|Pg 9'iv?|$C=y$C2p/;ø畏qBPDNeWqi%8A8Qp[?O_J/uVQ(@+=aR8-%=|sNQJ7@$eEes./̾ӉKJy SXΦO-zuA_sA~k^bO㢎(:3q_,$Dv0"3v-T~5wxLA?&1&}HͶ@gb2f?-Uِ}!B2n1ș.$"'P$К#N-8Y4D L&WT#]MQK`ib&}10p`M˜bn|=C.!¯lЬ5Wq1a7&FmYgU ip-jp *$=4f7/|Aefb;:RJ\nǜ*Xe]O0͘8 BMf́:{cJ(k1\8!Olt|)zF4U:PN0Y•oU=D]Eߪ˕uN=HJ79`Lk{$ It2Q@Eη Ip?Mr)mQEH깆l `o'R4kr+t9\t´נr"Sixm8&JVFbi;jxBTr X F\98VG^غ̴ 26M.gĒ5;ߨ0fA'3[ޝbI>>wQ߈޵dzjp1`PKqirPKM"rL) __MACOSX/darwin-perl-deps/XML/._Simple.pmUT ڭZM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UE darwin-perl-deps/XML/Entities.pmUT l1cM1cL1cux Wn?Oq`kM)&V5u.Y[aD$}Fߙ(Җ[lH9|Dwr藟tqfJB䩢43uo{{ﺄ&}C_dW^I5Uι$PoK:"o <{#{EoXZTz64iF (%8S Ŏ UaLpLMBӴE?|plQsepv빊痺IA;%i>"mj'ap8{io[~'kUnǨ,71AEsVUz*UL_+jJlAL8H42|n?)ݥ-jnݎůݚ?ϓ%>Av!Y?6vFu_vm6ޖGjbT !W@0*c8.03욊taya2ҸN=S}-UXJ7Zц< SuFP*a@N)M1[꫐6jQV51*Ɛ}eOAۮȭX뢻SZPkc;JڰV01\ƙ4F.!m0arڮyת*A656|Y8^/|) Te7.o^f%mSn~W'uU>}U:!oku6Gy&Uon/$qUl,+)ͨ`0v/pؿ<8R1)'gw=U2ا˳BԲF;tz,'(4)W&}!>tyu=A/vԐL=-9K2fA[N]41NeBt7_c]3hmHfRy{&;g("JƟ2XoysoZwzo5X21MIR*6|%ĿGKְ $;z.o Lq#O[G)-0ŗ3L$P2*a1mף3$P =a5B-}/afEHe3ߦVy@$^䶢uD(:_Rd\ePm<2l@V$Hѵ#6{jV}8Ql+gXR) 4Vrz)G'WՏ6 n3BRC}*#,WƳٙ$]:Fd"-/mQ-HbAP,%sɴ,"6J%EhϬȣŋDn,ꚧ m(Z J׊-)w, ~3!(YQ6;F-4(4Om@cEﰖcn'y`k@ VFzb.4_P7e1sʃz6TcmzѣKߧWB}^OBwuoa s9?ɫ(0D~4Qv¢p'2fn'qΰpXi[6wo[m#Q82;wPzD}(=rSɮN ~]rG5Hs1S7PKb6EPKq:U+ __MACOSX/darwin-perl-deps/XML/._Entities.pmUT l1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/XML/Entities/UT o1cp1cL1cux PKq:U( __MACOSX/darwin-perl-deps/XML/._EntitiesUT o1cp1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;  darwin-perl-deps/Time/Zone.pmUT Ό#KM1cL1cux YW۸SI(]hh(Pqt.[IlRr;%Yvđof43ʘ#2s}{tRi)qZp~pv\d3l2z h0qng|# 0݀2-e[,$,laA t j3#{WO5-VyL8߀sh5^h{:bj殺{wzq ;ݓ%w88Z0!1Z($^8!#xdB*!U5znK\BИFG'g=![ŨfT-pBg+MY\G&SԩաZ)4 >-ɇ9?kF^T3k I~t]sw8KC(:n觠Kx)s`bq:Yi _Ȣ}?9#\^C'N;N15:Kb~CGŔ翀9X QE2+J D k+k5\b\p<ܩ^ZU+ ߻Ӵ55vɺֿO66,ژ}ǬG,ȾW.,c-C?-W r_g(x0q!,_v{;GꓘZc9ġ˱A*2aH5.1-"AN!Ytp{alknDGooV+O8t\zv/vt(C~Zf8ÏřZɁI׍RyX&T>%Z~U=&'jZnfG8m޽<8aEY6m˭ î(,agkKh͹y+(dؽDpb=b;:p7DXP9gh8ÈbѤ)Q4rZn%"bO$Þ$#>8tzɹ#HKغ@jD< m8"@{k6[;sN-oԎȃ{<"\>FdzM|v ?%&Âu%?QqѬjjp6L@у"4xG7[& wF lKD'#Gngwa#R<:vL&pƢ~g? q"ixe?Fn첡 Ouk9/ I) J#XVB2a[NUwB6Ch`k0vbt8Td)PCEѶö8 NJ\ZA¸.INzk5qLZuPЌ*ۮkj0us\a[^֐5kV[$<&D``b%,qHrுCZa9n/NMO#!p5ˆ=|p~7BmK/$N_J`0Ő|PN/Gs`VR%eCUZst6X3I^!JwEo?HTbsi/XJ ͌Vk<klQ0n+J^ѕvЍC2.Pv2jki`3 :8L]&?m ȡD63A MJ0v(Kf@ztqo"F9 xk>~×;\e4]iu6t0X'4I7`HM*c" **-5K"_*QvY9T 4|GԀGhKquFRpDd0tc\+vZ#s6i5eM=t< 0Ժ5nS6KqJڮUs [e:ޒRsNs㤛9 P|zv T^1SX` &26S+L2-Ig) {8$/SmV싋pTF썃#vpM2%釶(ÿaIQzM酾&rUI^fQS#ofcZr%MivGj\r׉P^%)&aiʭnŪ6Ւܲo7ڍs|YV}]]syk=%/ !Ҽ?t2aݣPoޠ zLUF1 ʂؼÇIԍȐ1p*\|+ L cQJN/i |R8ljB]˂"o}kq,6W[i%>$ګPKnP PKk;( __MACOSX/darwin-perl-deps/Time/._Zone.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U" darwin-perl-deps/Mac/PropertyList/UT q1cn1cL1cux PKq:U, __MACOSX/darwin-perl-deps/Mac/._PropertyListUT q1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKrw? " darwin-perl-deps/Mac/SysProfile.pmUT iFNN1cL1cux Y[W~_x%m@& kvMK0t:XG3#_N 4uUC.ręw:ݙ4@'j7&V ]=&І->\7;։fv2yt"C;Q61bŹ gE?KXkFDݸiC틆Yƽd~?o&{$|=˕-`귻l࠷*hJ{O^v̝Vb/b+62JIЋ~mD`#NnDA$Z0vN&憃00./2# 4'lIսz [jo?2Ic57+TЎ_QnbR^ܪ FQm-5s(ϗ= Ule͂3䰶)U`b(ŦjT$՞I<#"&`̣$tri$V-]Ј| ks?̭4\ǁw#H)1$NM4U{35̬HV|S,*,W^FRU5DɶQld0|<pUWR9VTJ"͜@*Xޢz%dL*717it2J$l`a3dYNEsуYN&VHE"DPG'v|\˟c? 3ʈI]Ӊ E;P|(LhR!IZR=b2x"Kacdz7J_%a SQmM:Q5!-$QwRSzjrtɍGwj^gમhƥzɫGQR=jR$+-_ DX٥|kGmMْ@G}ӢEjIb@3FE#X h:fhЮ΋Ǔ5W&Gj6X>DCC"que/P4~LrP{xur#{]\u d_<:6~uq Ͽ,tQt[!SF8Hw4FIPk1#Š$*~2D3 q;/R`@ t̗LЂ$q%@ : c.-Zäa4D}~;ix*PʶfGa.jÇL&0ut&BM~-e!!kT)C mLД< aF8Ʋ3 r@A^5vVVeH8:ݷ"}FN8=f1ڲw Ɩÿm'!XSE14URjv6P"1T; ARGlJ42V'`c`͞j?C6Oo:r`(ZdgfY qB8! Fb/ %G (QE( N8N2\ }C#$"d\TG@$*~ة9GQϧډ.@m7fRunH@-lE/ mهH̍|j~6Q3|gY2kn8yU_I0r1B?@l4*O8B^0"W!d!H|őoamWZIvq=-͗?©/ddP}"Bb(ť'SF{ˆEx;s> "IX?W]ϗ9Z.<>-_#XZ<6i(~SW k.=|JW=6+zp]cWP5^9_unoqVi,uRYM-/4K7)Bh43:yfI^mU*EVlJOQt]SpE%kr^N%k!#Ko^EёLJل^m\ڊ m[\=d}ΓËwW'z-Ώy1v3#'~R"Hߠape!C3P-jXfQWhrJ'./PKJ PKrw?- __MACOSX/darwin-perl-deps/Mac/._SysProfile.pmUT iFNN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=*TF^$ darwin-perl-deps/Mac/PropertyList.pmUT bN1cL1cux @dMT0CyPf HhTL/L0ݠ0'A,`L0Sws)[BDA5B pH:HHzqd"/qأ8e2F5Vw-e kTcOc/Pq:I(fR2Nxb$Y4Cah1bLdMS8YB6+`bLD>-=;8@F3nP%  ds%%^mO4 }pNp6pS= Aŗ)C8 $,IbNM&u= q!!` v);q82!bQ팱70IN~KFSKsq)ȎbJJ{lҶ( [E\>2?>*{2Niպnx&㖭R7M7qaj$OzG$),~jFǽD@Iӏ2Bq<+7c/4?sijT6H D&+8 + *F{" OtSx"AEktIh3 %cOE$"NQ!YLaaF6tluA &d1E[<>ZŎu -" |L6 #k˸Ay2-i3+e0H`#0 n#'c9S*C0A_mn2K,|A5Ir"o'h8m/ܘιv ĉjN vTem:;KqG;b.$f $1"-}"aNJ`cl:8\J`~i#lUڠ-%t(mf/5>Q(V=`*dV,U>Enaǽml6`uFmDɠD8Z86ߡOGcM|? Yb? 8qy?X3-12{]^}!mf8E)E@5f! -ɠn_G'[j)LNdBS3 a8+69(h4@m8jF)n$/` 4CNa9[ DžZS0I$ 2E}f%qp O7'go@G:==]ܷ 2xE?t#0!+v+ ev _aڊդ_a+a0^|Pb6!+"͎d9nDţ~:Նw#z!gTcA^ Xw)JxEa:7( εv?9 pId|pPC|]>٫.PfAMs'YgCx$F*1bTv9!&^d- .tLLp49N p޼a2梁!Zh]n_{vˍXWCו_~^{t^~iF[k՘F/ `AS6\϶5OYݚ=Zװ0ZXꏟC3j^yXY! Vĭwt&nC B^T˜6&vh Q9ywOQC;4^!&*s*@$Q{nx{RV.Ec^vv On"/~)(dg}\<ά\I)$dtHZKBVD"6<~V)Md= ;q! X0P㑸 EEA!`{Vح"  /(n0BѳFCKO0 ;C ,drT-z8kjJ}@>e:F#u=ILW:\73 tng8{pHEՒqqhȓHvYJj6D2qHk{D-l᪡'ʞd 874SwT8Gy -KO\Ķnj7.:՚^ԩb#>Ѩd߬mޭw`K/ƽi5kA`K`Uc V9Dܭy5MoIA3Yee X8b逳 <3}5}[sj+,>X`_\CpK^%i)m[aci;w(BZq=A]'0GVAeɱ4_(Mz{kY%ʨ 4i;֘zT@u( & UĖ):$M]DoX^ya@+F|k3yy2$ jP@lTU{bJj1~[-MXQr@!p-{7սk:’Nqx86Pǀ @ ""`~m~> lPK+ pI.MI.]V#{Z3rZ*Ю"Ex&<[I+8ZcM%*V: FՅ siT94x%[pB[ D$vހ;DSSlnTީ?CEǡ$ǓO޿:<Vkk^8TQ +`UDa%z)25KOD„WIHssk,VWc~`IiY!d19Qðw{ǧPIkåVodr973u)S))tiڱkJơs hixN$n V?3PN9}ݱ\X+-Ԥa>Qhž~:b#>}ns(tNŖs} !^ ü2c:ìȉ:#f `+ 3_8fIGTE?˧"??[kճ-(TrQPH]*)1. ucDˇ5^/WwFXAA6k(j_FcmM,[z*YlT!_,{A_iXFO##//X~*6kx"][-춙H9[mW걠 n `"z 33;(4t 7JmxDGD*htbaӥ(V:к(F1=_X,[7 >oiC+RTV77%gPAx;WZ޵ڪֳ햌{} XRL/ 3$vV5w*[s#oR*(F-똾Ywl!'eQʊ$C5`CCCkzY1Ą)k\(V/Dn2C};gO.Iu,6ȶ?( 3}aӝsi8ϣyqIuQ zsժ>Fvs6RRlz>b}Ly(dN̨\ƚ)_^Lt@IΦCVW /2W[e[Vv ȟ  dPUጀ98 LdH񒦂H"j%a}{U3WRtx |mYD6g,`X Q6M]r5f傦ʊ̺Hcm^nh\"[n|a/&pFQopDRI }`&/vbɸ7YhaJY鎼9~e?ᐟ8D%vˌˉU/Ii] [ C=kŭoR"e5Ljkp_1_kGq#iFq^ݧ8J)Nx: SYF<3V(I͹ȊO>˅7a\wr -^dw7^j_XEGT)YIB쪳+pzpHTuUw+ka DW1Uo"x#8Cӧ/_\o%ϟE+|-Mwl uҵ⹕, e;&t{VDKOAdh6Lq=l 6=L+otmWX"06e7}*IheHAPר #L<* m8 4Y^!#.\Ty0+6| y1"me}o/9łE{( X`eRa J$lɅ!6^Q\0&u;a'!񋧠m>R ˵BG8H}vڇZ"9:G>Wr!u}Pg׆z)k py%/Y],k}/X{ȭqtR>| ݐC f Kݓ4%jJ,fx,+^>`S&,U2bF*ˋ [dNuOH| !5Mk{c銟3VT QJfnҷ97 Cc)o(}^Ͽ=p@!1I|Gá+jkt2ṷ\k\Ȼrߡ?vgprM؁.1=ƛR]?f,:0ǖ.7˪Sos/#!_O8D:+rY70 `&.]UtloO8V?ߜG}9ʠF#>0y>3oRN0U4hr{'O޼=G`{tu=Pb߯?x 7.l0>#H Ha0X$RgO?M8-*C9FI\s&٥Q19*.wEqx{brZo&6yU2ʖ?PKxӻF^PK=*T/ __MACOSX/darwin-perl-deps/Mac/._PropertyList.pmUT bN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKJF darwin-perl-deps/Sub/Uplevel.pmUT XN1cL1cux \S9} P N@nwo.#7 Pعljw_93|r=HIBp]KmjnȡhVM/OfIϚS:jw[ǝLT3䑐bG,#зQ03A_ 9VXuBvw7!?R> E?0=7W׭wwtB|T<{{( whAqf"UIJ<;>m4^ʼnP!8RI(1N0jPf*{(o(΄A |9<95rğ?u8˰88P" NJ$*O{Zk0Qiܪ5"~0g @|~ ŇFLd=13FFFS<}JI} Px)aZ/Mz=C_n\k솑,:>-yK6wkMٗ5F^c9qи; ,KvY]-MW9zJ|~@ρBi7H -,sFw%1,O">q:<2h҉hm bl}-7'/ݗaxX?kxM?Hԧ,Cd>epfAxD*A߯[w]\vDT/;>_/ߋ 'I-rg 67i|֣|PIAFƋ؊Nސf0Ө [(n!螂IT?'[Ie#1~P(4юP۰3]#uM4i~CTǶ܏ lXuC:|5(lCf=հC$Mi00C}Fs6fk*ܗi15m8lB9[+,vHahkMͥ[!wm3G"ϴ|0}&9ow6?$g#{Ap! Ms<(<9}KX%q$mdVMR a(2(ᑤP"(Iaf"Il*i+u'*"4R~_ᐖ'KP)p皂ʪd!u;z46;$e D$i{Jax Hț xLOi SX>X9 [P  *ˌ8p^%!!I R fI85t>KB/O.m o׏ٹuLGp1T!)@KGcr^YR-2.3)4IVe,hE/O^nSYpIB`aOJĞb/2q9>4xS?nAckۆ%X\+] akޞ#ll062&H7!-ǀkt 4fǧ T ,A # 8_*(ײR|Xk΀ e T-i~5 )!R J)K:Zjf$\8HRq1& pG:3ҌQQ=LT7ɗaX_:o2 HkЎhz!,iso]P]n $qa"zu8G:}U _8*Bx`qvFΉx˺BV M61 T6 .v=H)L\Ar6.02 ƊA!)tYl`86VJ93*-gP%Wxvٞ=5i 7}V9Ɓd*D!,+ LUZxyRc"Ps6^Q`=*0>8IZiQđҐrKs6p3ǹq\OHBQĜo%BC)=j4=uU_0fnOe1Qjñdj6%3X܄]R9-ÇzI' Znf\ley/z:jTP7|"0Uew] %2 ͣZ4FXh0RxFݰg J )Re{Q>8~g2L ))rDV4g<+)M! x ]V䤁M~3o?w%Dz_?~Gf^ߴ^v΂xICJ]h~*kw2E] ;;r&P(^@c9)! B_i{A(g%ߵGl x>M !-rX}d|% 뭬}-Wo 7W]|)XO/k^_x,ÿ]/F8y\I޻ﭦ#* ʺ#jjK+pҚ K*Kb[m]|u%UýGڷJ[ڶ%mlo=nw@ 4 9>̈́c%ge>^>!#&<@IpO"S$$4Y0;4"_kؖBt SPlb`޴%*÷y'{,+RNCڶ_h#66T:q0n(7;BY ѡ`M:,lgrm<+H%uօ@L׽M JΔa1-D,7A ZY'Mv;N `)@U׏C%C`u -usvy^?w%Q?8՟^6dxh>/^3FZw:s}~W'˨ ˱xQ[0N6LjjQg׉aew/..$_obr̖Yf3Y%G2{9$#/%p?!-e`n_@f%F{Ƒ 2L]͒sx}#Z'EXGaSL_>ċݽS<#d땝 UX DAM(?ùױS]%ҳe4b9]Kg) Z&PK&5sFPKJ* __MACOSX/darwin-perl-deps/Sub/._Uplevel.pmUT XN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U1 darwin-perl-deps/darwin-thread-multi-2level/Proc/UT y1cl1cL1cux PKq:U; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ProcUT y1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5 darwin-perl-deps/darwin-thread-multi-2level/Compress/UT 1cl1cL1cux PKq:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._CompressUT 1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U1 darwin-perl-deps/darwin-thread-multi-2level/auto/UT 1cl1cL1cux PKq:U; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._autoUT 1cl1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK/q:U1 darwin-perl-deps/darwin-thread-multi-2level/HTML/UT {1cm1cL1cux PK/q:U; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._HTMLUT {1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U0 darwin-perl-deps/darwin-thread-multi-2level/XML/UT 1cm1cL1cux PKq:U: __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._XMLUT 1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U0 darwin-perl-deps/darwin-thread-multi-2level/Sub/UT i1cm1cL1cux PKq:U: __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._SubUT i1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U1 darwin-perl-deps/darwin-thread-multi-2level/List/UT i1cm1cL1cux PKq:U; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ListUT i1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U,7 darwin-perl-deps/darwin-thread-multi-2level/XSLoader.pmUT 1cN1cL1cux Zs6W`4vgn%Ǎ#;Y:/r6֭"!5E*iYy Iŝtj>T,U"&FL.s~3(I:Oq'Jgj1I3%ϕB uJ GQ񭜪v?lx!^g*)uf*g S>cZ)c|*X*n)\qQ &!]1SZu'L$ͷ{#ZigUB(/rmI+!ҺЭ6&nڭݶH'ngz-^WmR"7&|%ZceJwyd8sՆp+}n#Zo,ϖ22XEh]VYIJзb3_i,4%3EQs$oq4{;( ­l9x €M;Njd4` R 9|X94,-[~QXW{~;!ŏݒ_4ovj Zտt}OAP>DQ@YQ<Ze֝ϕkOÿ_LBt9t&ֳb,Id9g2 BX4V`DKs&tA ( WWOإ^@i!"/Jy p|NE\$?x}v1$UwU^b͚`5qK"1(0@|K7a$}`s)I(cqCE" (:x 3I13IYUcb-H K/e 8ii^,TWS(,13&a LtƼ F)rH`EY39l*q|q\i/.~Y&C{fENj^VmoFe3[DEI~VTy}ߺk[ _SD*kXTvdzPҾwDT4?Mquݽ^}|uwl{'.;&Rg mV!E8߮u+5_+LlIfcZvHZ&q+l/͛9=6xݏFD $kv-]$右Ԏ~lpif ^rkB^1Ȋzw{D{&AŲ $@]^<]pAe0å<2 2DT%G$Ue#Q5;"a$/P"Up yN0TF K).2sn[={ JoNcirv GEk^MwA >1ls;+c;7{IXG395Xfl4_$H߉Ts M/Qt,Ղ͛)M(ٿBaO |>5B4c`eK s!dD¾m R//vfQ/nTmv*Nyl#9ݨww;!g4^Hp[GB#Z 7}йɂ%ߵɲI.~=wל*?WEiݓK2xZ-rD4IH/Ekp9jP>w^-G6C*m G9(S&zj?\a7PeԒƤӜhc5EI:npp$hPs1rP?#Amu'Qjs [N,sg7H{[ճX0Mf*:_ڣ,TXX(0>ݸ8Ei<gX:VڜF"$A1$YԤ:\Fǟ8wphl&#=A7NՂDX8u=hQ{y,oQє^^~@l pd zlg^lhjlyv}|rp~5`e}!-i`t s`vܵTehM-*:AܠZ qz|C|P**PxJeGCy"OcCxdc|õr3n QgKXCn] 5bR⢇Ю`m2tNVտT1!ʌog6`=XAI$WDpM7zG 'cB-[QzowxZQR9B"̉2N`' Wr @Jj2\j2I&]\ciD݊xow1G%bk齁('lը> 6#av>>\d'u:JcxȤʚ4W<]Mَ=iknxL,If\l=vlʭnYhh>dB)jWj.e+)WԪȚ.HSTn*1;?y{H6dRrX L&mtȦ.YђcKb OYx'!\UV1AэO99fS^\3@Ar=t'tLÁM<$G?s:a!(̡%>źOQ*FQީ".#nDB]\S6QBk'wBe^ݷ[wՙɚd7:29_mpC(&`7)Qp]|X+1'7P;C$ՠiҲ.,qamMְr5 kGNmhW黳,zzp%_=uu ۔=z{O.IAgqE= 4I>^*OM7ʅamMhn6ݢ~^5^mK%Z,q j"4hOj3ߦ!u~p;)5!59m?sƴ1 >>dX;v>+ӱ_tx:H+Qc3{gB+?-O'3$H+r 3cWF[n sb5Lv.TG`,uTX%gYh|%0C-WOE%XoQhs]H,JN tbsfGv4u18bwyIuiWԮMin'mHS\"R^SG2 I ؘUUCsvgilmء..ěFj^ 1AC' gQ=w/ nWO۟&Bv.K f{y# IYE4CP0/W~gJ[#)t:MsnK-cpα}w!0ԏѪN棱è\C)bJyaV޿}7Wᴤ.ע2 qHwbϖ(š^⾋$gz%^@S4+`V֠-{߽<8 ϥF􉜂lEHxS`Ggr))Gڡ͑>C~*(\;tL'?veB+ K PKaV,PKq:UB __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._XSLoader.pmUT 1cN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U1 darwin-perl-deps/darwin-thread-multi-2level/Data/UT k1cm1cL1cux PKq:U; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._DataUT k1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U3 darwin-perl-deps/darwin-thread-multi-2level/Scalar/UT i1cm1cL1cux PKq:U= __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ScalarUT i1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U" darwin-perl-deps/ExtUtils/ParseXS/UT 1cm1cL1cux PKkq:U, __MACOSX/darwin-perl-deps/ExtUtils/._ParseXSUT 1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKD:# darwin-perl-deps/ExtUtils/Config.pmUT SO1cL1cux VaF|+FE@.j4AMZEm{ hwB 39Vw-\!{" uUW\t~)vվzU"XgVD%+?x ,aq@'iLkZ}2|dreCW lreOzPdrIɖ>oi[v݆7;P.;[x]HH㔟FD484hK ;"AҦ[$ )Ӵ5Xy-e֑*)l{w;/v"!РtH||z4 R[^ I19@Մ=OA+U=9aN`.7Yö72ikԾGM,*{Tvx{q6y΃t't>.:t[`3jvPGΚp.` ;Oy5(a$ߑ(%*%`$(uk ~+#O)*βyYc?uoPK.N:PKD. __MACOSX/darwin-perl-deps/ExtUtils/._Config.pmUT SO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U# darwin-perl-deps/ExtUtils/Typemaps/UT 1cm1cL1cux PKkq:U- __MACOSX/darwin-perl-deps/ExtUtils/._TypemapsUT 1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T darwin-perl-deps/ExtUtils/xsubppUT 0aN1cL1cux uXms9~re6A]qW$>cX;=\lk3# Ǝ43$,LKj~K!mJ'BJݑJ^ZM$ZE^ǗP}P5F/ժDt}v >W+m'0ʂ;s<N8ϳl9a" K!ZL1F`#a%aOgo=m=e=l: 'FgDh*KW{/J\բTq"(T1`p]m0$xai|M.u2T>b}< 4dNJ 6E:Z-70-Uύ FqK| VJHH{[?_'Qdΐ\ x)ӏ3, x\БZ 1zpлVV΋@ _Eysh]]K/j/)oAP*tCi_5I= Z+a"T0AH_Ǽ@b]Y"TڔлUa|9D+bSH}۽kTz R,{k/٨v+e qA9*Q}V5FZ-R\Q "쁯.P]c4|y~Sw(_o"L6 ZfbV[ՖAUcB 6PVȳܓBP5hDSw7Vmd,SlV>|PC#Vhk-9End @xtz )}Mn) u3)uh CĨ10\f$0B0;#UHVD9QrUz78ŢO)К#'4 9Sj1VhoŮAQ_wO# 0L1|ex28cfn<BO")L2h{N/8ǙP%h#c)d1дytXNw< ͨ0 2jp FZH@cpʩ~Ta&qe=S* %(9AO%HV! }azј.L*ڢO%o_?9U=[&ur>VAn HFڿ}>(OhUe1աI jq8N/F ӫLrPz9O C1*|!l'EƖx$Aacn!umH#зjZ ӊ׀5CiE 9\z8-DUW,B#KScKٙ ɗK2+pj{L.i\~DGQAm m7Rb®Fr4~ ub92ҵT=ߦ׌MT*T!BX4߿WUZ(L͏j`8xw]﹜^ߌ%?X,Bys:DF#~n6e2(k҇GRKRzPKfy) PK5%T+ __MACOSX/darwin-perl-deps/ExtUtils/._xsubppUT 0aN1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%Tj$ darwin-perl-deps/ExtUtils/ParseXS.pmUT 0aO1cL1cux }W9b*06̘&iBۼ4}0SƮr\ I%@wzvz]%]]IW?_{~HQ$8m.͒@$4Ko𫝛GNiLE#?~N獟?gI0߽E x{aTAViXY}>WT _/@lKc2%^[R"ŗpAӡM?FOC x 6n4H& ';`t_pMqg H Pi6v%$Y4=:)8A8A h_̦Sx`h6b4w5f]G ? KX%$CA~ hvqEqCh-Xr{ztx| cafJYR]l /EmPwwi9n~??_xd wŮ}}(\ϢόM^dzP󅟊4W%įK@tTp/}\oe ?uѣ*mXr"jڷ ҆!Gs1 jspwOFi#)]߉[ڋn4|яQ xOװiOÝ_a4 ~4D ,ڝiOIGsDLy`:.|GBdi օW"/Sw,yz0 X[w~yk&3An$0,(!^x]{eVqkH|_&Ђ u~wKqaxgGE\(ɾn 1G^0J _AɆ qg'IJk;Hm^u#JK4R ^y%- 2Tv A!tm4 ]^xh 2T/uLbM᪷Ȧ%7سqAl +N@6yD$7󫯀 %woXt(;.TSHiXYpr{hѐ(u@EIn}]C0Iwӡl( ۺQ\Es %ԑ83H[1 +M *' &G-Ez y*kW,AkywW2)tԐ48 s\+Q,}"|!3+s!(a܋M8eX}pBB7`ߏٍi$"@j`o%-Pɵ5iJ0$Az&t$"JFMSfd@WA$_@_hqa3={:X&uC~+]av8w?g[6󕬆l6 Fa0DDa j!fAS0C!VW&f=nH=Z]*ꨲΛVM*-ZANȽ i^ pH>x:_]{8 "ZɝI~;@ ];$ȯ!7$Q9x<C@~R0@3$,#T"E$?+ed1ƈYD.UCM|ǏN2 _$Sϱلʂ2\^kY_;Z ţ!*W270Ɏ8dCp"33-A3 4R/ !/Qב-Ѥ2&I"4qy%X5*1VE,i:sVT2PZu{Z d:q ֖Q'Xh4%fR,σ@hX&:_ޢW4yf]-@@4vq9LPA$hfNOgc/7)UG~Ua̵%%PŐLXh=xw6exyG+G .נL9䧟Km0gW P`_達K4E4+.݌а"o@ Ôe8S .L '}y}K'vqW'tan/-AoTZZ NTh$k`jW-#-6Iboo@Ǹj! %YD!׈{Q*g$)AP qd퇽n~XC7QW;rvՈCPJ)PsKa麃Y H>4!yp3 S0fyji`F<9i%d@ߊqxu +6%g `ڭ DeBJQuj'|GA`%,E2D-İf&oC\c_Z!]Ȧ UpÖUo{z:6ih# nST& (aG-0 0!LLRy`' tPb _`<}vwj+ZDBzX"@v}Ai S }`! \.A2c 6 T"1GEkhj$^4fKL^YlIk53򧟍["5#9L%p鴐 փh^";T!@.! %VFq_å)aY`_;R#b~jŶY)43Vi#gD^zR#i-Q0fRC2Św><=m 0d 58xTV1, ܡ B\=E#>C$X  ZGY"PU|h)G4 #Vr(D-9_u^wɪ7rqz$KKDŲt.G1eOېK4|`DN6MP͆<&1JK?@.r䁮lR<2(k1,a\J[[+PʖK/R-כ8Nmٻ%ΕEvy?{RRL<\^:M~lw~9>zoh2 \{h8ir1 pHAFa¬[t"ۢ}1ϼaȃ3o?Z{u~.^ ٧~H55Y4 6N,:KMRI[L[SSU|! 0VWH*zk1P3YܷjT.H+wh{*1ЩRA<#-_Z6X˼%ꊁ .c) t;Cw8h}Q5=jC }2,Ka}K0CGKjfN"|<%fsK/J%<ܓwP. c}r2Vť?t\]#;bnU1{p=~}8il. Ϋ+{Im9S_VNԎ{}8:><9<{a-}^j}~}xqo9<\[ڢLKԼkrlNt@$љRt\xr`óؾ(3C5X]kR`{{s^E܊>kg+ TEhEz)?S& V鬃ِGEkf Vj 6Em)Á{"NDFHݓ{0O^hi;prlv&8QAo}F`5""ґZ~Y>7a%vNkuqaNfcN4.9dߏT^ʻl-FhO*`٨@v1 hbÁx>3+ӞuAx>ʢJk=1KGfKX`Xq;5Rт" ǡDr8zY&ISn&%;Qqn4 @~PCC1mo۴DŅf\Ey7j;HP e/l3פ/>F9@)ν|sl{T5vY!F,Uuslv3MF!zU˨Qi4nhQ9;]JPQ"Q+* k@},FVMnP6 3O _m= qe QfJ)hۣO坭*tL+U* 1i: .- Zp002~NM&%Ya4账~x !Qr% g`Sΐ*>)`8y;`hdJ&QWv{'Nn!W_gt0p / L L)V ~Ocwx3 mt_k&W4|%=6L1:>;$<,QQxp}1@Lrk9vRj`o@`{5خ1GWaz@ؖ=ɦzތΠ\3o:M0EK fCQ?==`h(.@ ѭ{G_7'W@d'P0v:\'ý Jy4*&¿UC FzGbm YtE 2F?ӴU\rY,]ޚαG;۽.މgsY1&'(]7 @Y8W.pз `cXaSlp\4J_ zpDatsC7W89v&8 ^}oN9YAMYE`܅ 82y2.^t#HhXÇI퓓^%Q.aIn)yX"ء?Ed1(F/D6. s> ?0WӘr32q^eY88H -dE:"½fQ^(sAȢOaKUE@Pd"1[08FF*\_6eΫSH[KN0і:(< rF,ZjfBzU|K&b8[{?t0_9{HBk5Q+KQI!y ΣÓ0yVv\d!Au|q-WfhsFUg\)S%;vA->a2xtK 5\RIne۠#:N1m¤AC`4nwȰa y+#URw]%| T/r^wۻ{/ ɀuRá<Po\wl6 qܥd(Z-3Xmm2Qv`.b*33ʹ n0Cetjѡ&0#f*Ke=bB' AXn7ɱQVeiTt| wA &5YM{2:!+1eQ0*i%M{7k%o'݃N降mXoWs%[A{ZD odܺ83kad=|LWfe-VK2[:[= LB ^qڴ~[} ֖ dO-Ĩ`f]dujk_85ay͵]@+»)*M ?c2$3cxԹ& PL"| \1Lb{VZB`>D]OUA&bN.w(XMhr̩`Q=]{NL77%fonbfҩtʴ`'#eGw~^vOvރ Ŀ܋c=]%~ >І5)Z$UB U}Op[}>Jzf7 Ke09U.OڸSxc~٫I dI0r9ݩTW no[Fm0h&v('^2aSheb͟Ƀ#/yeMaÇ V84XPu,m+B<?:}3eSD`yԋS fskZ3Fdjܜ>}Z ?*j$P, U8&sa*b(Tӫh fٔK,\u! #0dxR@+obFMÖ:'#MXzDz]nwUӹY3N p|NKuyXFkk0 )l%MN+0%HB/_S2< L20 2=g;Cu<pKQN geb=5У 2ND+~_8CPr=f[~t?Ķ[,Hߊنݵt۟LFw'0JcI, EUޯ :C$g T1|̌;}ܴiU|0F- %rRc#v2apѹi?%oя;DJE*́O\j\k~|{bAwa;NjފN XmQO75o7?"$- eT^Ud1$ GX o~O$"sz׎sb:k{[p{jgTM}AW qΑ.82:%=_Cߜ\ɔ~<1r*;5I_eԚ΂QJ[jLbT:|KFV0HAgrZTW/qcꢢzvSVeTI`{ϹTwj?F7j`P\:?6ˍ-=vdZ[)fԀA]hnt7xCXa^[ob"iSs?򧔻uYǽPZQQ)G9<ݒwi ̀@{C MO.dSnguSO5)oxSW^6 xj0#n &SEe0 ) Z[ C'1_հ,rFج$7? ~KQ?~aU!ow{]ϳɆ&`AAzI,BTjuD =:D",KowT=J^₠̘XDVyEt岗\_Z)zrlmSecS6yvPyrLs);񆜯𤋮 EZWaIk62YCpڑ:| 6hɦ7A'm }!sj]G|2g ,kA+ Yi9KsԉĦK- 7ew8gpgkĻP=yg?_]$s\XJSt6Eꄩv).dM<ҏIleN:\eV\5J(Kp' @ᆆoX#/]k^ףL&=u=Ëh@nu#+8{ύI|nUF[x82kZZL;K*̗Vy" t..$x4_Eg'[P6d;SY q}æ=ϗEA"cL{@`o؆!HMx&!X1hX5¸zqiy&Da\0CS@: uZŠ^FnK*a\Co/Eڟҥ^ITTNnǺ3J{jp[m7E bg(uwM4!2Z} (oԦqz,|riӂ'7Ҹ5εDw(a5ItLGHT;̨C^@_G8xp F%4+mv"!:%0d/|_zjB]ѼR.\jIۣ_e:onWM 0O9A2y8[:  Z$Pr162@+p'*FXLmŤR:`\=0MHS R]QyIL`K8 |'}LT0fb|diYleH0x0\Isɮl.W b(d8vQMT-}҅g2͹Kw-obFϗ[:4s(^@Qz13)FeIVuNݍʴQ>˨d:onϖ).ȑ\%\uTH0=R $SB]M,Z+c% Mi8S= .ct'&UJ\9* p*|a٧ ijN{ u(/lF{)hE֐ɽ,z|e eQUm7t")&?e7{%8[S+^%x!W8S}8+ˎMEQKY9J Isݙ!,+g *>|I4/4/᝶3"m%m uS„66e5m4#r|1l65ݣe#dVLlg7yENfױ{zK~uJνx礥 rkfVJ }246W_7t"SnҴY QԥSn\؊B>U%4Ӌ޳AQ}ڐh5[yR*4xy[ 2^8lfb]\ˆO IE"9߁Z4-,@~8QFE$Ve9L,I^c잹+"EA8z JgDhӦ=fkP͒\Mej-pHSy4A>X#;K×|s`M:i݃7{݇=Zs8ꢂUk`mlѮ!RZ\ٸMiY̋6yP׸'(k7r#[ƌS*a ֶ|#6ٙo Fո+ $P($=GC2X'[@ՓV1MѶ)1*U:XP+[mfz'NM48uiTu}bwsr7::\i@mxdטʲu܂%,STlIWi'lrʋ _it4߈_}j"b\׶)*P-JvB4Dƹ=*jqDx;Ot/]<7  0?κ:udS=Wj_@l) wxtgyڦ!6}!O&D>>#FVV=Kg0p,K]|mf tcC${Og,o >,rQU;J_W #!||u$n"_b[2 KzPy{}{'/< oCMy4o]9K0W\{V̆ |XgyZu?1ijj9:CSZQ7R d& n_/kV\2RfnUh3nfT w 1Ei~ ) 0"2|l:Ap5] Y(DI^vߕM)nWw8(ȯ0&kfH6_dX˷ʒ]W:k2$;H grبdz$O/W)S(ťtU#IS[=4#LպˤF:djFmbY| Ϥsf=?CF!+RMĕURo.)Nz+)˫2%I{b({oM\L2AB:x?(D Uw>}VԳMTR+C%v]Uȼ9NT\ڃ #rQp2]V ]G bރC1tiC%FȆ F3RdJ;:` ugv,5m|BT?^ށJ5WU-jN[a?|Z4p0TF RD$z~ZxhXQ2T`0m? X I&Jٮ)Om  68nC/:ţQv:EAM4&<0C g G`nШGw7GU%wcGt&yW( nhMS|C?9ϔT* 7:RwL4PU1PN˫#%IK#)˟Y'7a5uaB.ʾ ;GDc`1$jt@?]:@7臗!Z{5SlBY5GXOfc>wpSB^F;飑,nBnxL?)I243]0S˖֋9`%@aN)Y*%2-&&\RD̙9eʡ/Nm-{-KAWj'\>-rL ,q&7% !DH6 8 :<}b;91[&.Ŀ4^bi lbT]B ,nPȚPt4y+R #$fG%A a/;c4i#*ߐKj9_k@Zjzؠ @2$4kF)E$cQP25xL$}62^$˽nRhP 6[qר֕T_:Z#x@}Tj\(,D:* g]}JGCXex$k\zhL49~4%,LX8`bX γFKBnN˧G~mFF9/"(@WO2xIHt%!wCY7_6j(Mb LD$?~%a?~MƟK_^nTcBO?= I 7V'8'$Ugu=ï|q y[i>q-1˫{& FVmA-vɀ9NiOLbY[¡:_} |LI`Ik%GC:x(+V2ʚ \p LH2./ٿFbMԩ@P%J)68?kޞί2&~B3]54A#9RWd2L )DkLmODq,xJ!$ao WNPV+Ј j>EznCGѠB}dcTVH9fJ/ DiTaj%1Cc1_cΤfW4=U/!:ߪ&ȱwx(TI<'9t`liX(\%m f){{͝oi9q ;xQLdX2zuxk Id $&n6Ǹ}O<y( } 6,&;n[`}:U4WeorOqFSjOה8 (+2V@!&Ϳp1Y6e~~AyJ^SZӛ?+/N& z5.MWAuX/Ϝ.OTn١Ff: M*BIQT\h0L_,+0 .ˋ% X{ 2k6Y?cm㿨$<3W!^6*-RRV 5 /IĖ- I:OP4\ 'G;n羖ovO q-Z)׹i&++ݦ` {%BIڒl ^zu=;GGuuy1gۑpm&#A G*"l > :5"W5"ӽ+'gqp"~, 6-\!'t0~ͱOd^gܪJ kӇ'*YPSDmx5OU Kc9.A*W?m@>}6+ְl %NA"uVAL8T(,Y5gbH,0M,ab\:jMy2%S0R_n>L \FtpÔ+X B^XCWgSl@TkH_1^hA_-Qsk tD"2scYi״cH1 ֊9_UUG5?d}Ng\l[\F@B廣şXn'$J47YU>g%̑T lu y*<4aU0ώXsyK [M*1pAV,t% &}tpx' 괁HAf* UR_0JpItt&+Q:e_6T%#(vөGp_4Jojo+~@SꜜQb7'pֺGk_GS Fx6؄}x`zQP G1Jrh{ JӆMl+dq0r0|/OT\R;= P:Ng՚@>rf\>"+1fńJ,nGZ ͒͸0[d@$AT]3PIՒTN ;/R^zzK {ю}i:L 'Y[΁\OiWqR3mf*[fOňme,kX6/t-?j6j,md_luWz2ùKeQp(hR;٧v:af z?r G:'_#i9xcXq帿+`Mw_bxC#/Br#_Bڹ l[} D/~R\~eď(ĺLD;? ?{"t)zũ̱R}VASQ%5L"IClFiztp+F#fܟ1q~.VtvJ5ø[H Oܞl=ɦ:,]~d[\yQ.w,Y^cK'}V=]˗ R~@ GϞ1Ga$".ˣ_ Rw<יLLJb=P7L0X^#`܍O0;0uV.~ d7!< ,I1nec*&͡DӊNi]EW]<8Y&g̫Hᣮ5U9:\u,: H)✥ 3\ٿTX,V\2rR`׶7HW!椖\,OQ|lEd .+Eh-*˴a;W'_OϜga!F>dM;dND F6Sɝ>wn[)OȆr*p۵Èwvg(~Cߠ.ӱȀJd3%~@~w )Gm*Lɖ46hOyRC&N rZFdX@[_T* ]Rt(7TuDq8 7id'|+.gDjpX>U(C&42DjI"tb0k t\+c:mO M~j I㉨?9@[yR5(`q^ZJlKxt ;`nRGkcBCjs 4 )~&g Dv7qV]=DcA p-*[ZL[a]XzݪJ)sq2AyN}O[YrZpgLfzC,_ \b)4ɿ$*ʧbQnhpg0  ,R]{S>b5fX ʚ"ϨTMh)>K04 ;0+J3-ݤrtөR::¯-*W7*ցG;"M^ 0PK)IjPK5%T/ __MACOSX/darwin-perl-deps/ExtUtils/._ParseXS.pmUT 0aO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T i% darwin-perl-deps/ExtUtils/Typemaps.pmUT 0aO1cL1cux =kw۶+P[X~uwki{bW 5Ee7W;)JmN 0 ?}mFjga"DzS%skkTA4!K=:8>=eoz^* Obw񫝝$VgAng8L7dyiJ5'oG<\/êd,uQ"Lم7= Qm%+|كNe|M |-Z"H\S@Aw'o5?6wдrBhuS2`K4N6T.k.+}EFI sce߰89ECc$կ .otKx.0u3ʧ ,-)9{\&8F2綖 ECJ{ 4l6 H"`jѰ dְ{sj~ytqx~|v :.8O!ZN:CuF[C2$g6N9UKL" xcѽޛ<4R' OHCiTaTBC4M`  w+hOr&iBeB({ 1mx  IS2@i(0$ȏ{y'SE*LdPF3-1X:Ui7 HDCțC:;ܻY׶ׇ{'g^R9=~{iM=hup~_ L 9T7-39%h`l@-|3$-.[8&daE5/@[ CP11bd6b|OoTC}I"ʾ%BtǺ9gTtsJCV f,mC5!b|/|@ӪQ8v (F,{#i}9c:S}@3bb9#3kt&k~2@iQuj_&ͨwtCi%יU2f7 JBTw>:@Eoi,Uh+.v:!fTm#Vʴ)b7sZWm5#GBtnvAyY+sf2)wT L6D2tUf,G:;Nd pwS<S\B2FZxlErYۨ8V[ir~Ǎ6݉).%by4nyYBoV,l7\!T2b 8X Q[[Mb{m|Pdkn9lyUv-̭x;f2OyV@+-jr  }~ϡ&y'ŚkrYDxzH˘d5%%`EOhSU\Lt1b0wRjKc21Y0"|obSa&9cȸ oX45}Loe#!W!/x0-ݲQlR)ؓb61 4d*)Mϓ>Gp+D(D°9Lt5{3 e{,,f+]|B?ü{!o![.x:(.q@$)ȷ3b9C\sL):,`e5X^9}Q\/bp]jt&Z.ANsb^ yTIt'EI5.$ ݝvݏ;޿𖃊"ERQ옔0[߸?y6; 9Fm.~G~9-CC{8$y]nLb!JbzGcrC@$q.LyfA>9G~('aYR,*<9GH!#M (=ȢWtޔ`-:$"\.dָ/T{87It;5c9HBVW6egdTŕNk!'fVY; %2 #*1I6fY [JAUc쫫h\]le'Ԡdgˡ|?y֬u#c0*[\_]Ѽ'3E܌W;Ip<砸d3)P*UC7D!d]YUsZ>"O5?%a 2[3ܙ)l\"qm- CN yTm4r5ߋL p* $M8-c=55Vb h]c8n#hnCS<Ħ;wwkvP!zN Qk3iW,|"\h+4p>)eOkNLXk5Fd#TN+&:Boi[`1| -Yazgm 'b2pRj?Vc/ MH$F0{R8I^2ȳ &KhNsréx<9/uBYE{!lMjzW^Hzcޙ6lv߹}i>g+Ā6ghXN4W! IS&I'hA/{_ƷT1^ nz5ލK@1m;89}uPwaMm{g)Ih*_ ruVk3`x0}dFb.32/`'uMk^duqǗ`+}5l5%3Sg |Ř(8#A0S4obxՁE?;Wqg07VD,grk@k_f}־l4hhSYWȣY  #4ë[f$#o>; Z D5ܩZ/ZkmW?kiZ[PI0L]mtė-QKlthuTw Іnh6o5wMwxw[&uOtT~z=:gOBXD?tU=7\'Dô-`]Uȵy3Uŵ?(y _)Ylus M^dQ$:fNrMT6}k+FxLFaizN9#L,(zdJyn:Y:UĹt0r櫢q \X0糖P ׍d ^V1hE=+:ΗMhXKNr&;َ]gY:-ʌdRls b_N@*V,05m w:|4 G%OPh5B˪d61Ye!AsYzO!%/ש ^7=o9tf=F.6+^lӜRjOڕk(M(կdZ-OѢZ3y^]yZYy1c imxCS(`_4-9:n%c0Znlܝ= S誒ߠ'yYU.^Ać6^8 %c$љȵN]܄D=ȇK6> eUW^c ,ܝNm3/NWtYo./{s67?m5D9LcW(ghNu*Zm>(hjՄM;?^NgƴQo1xccra9$$:Pi|k:fB0辜{5VQZ )ST:e-ܶNIMi.^ w|iuzNkعO`PMl^VƅT]"ijsW/O@1t|[N&] dv^/P^#urںFw!9#h*szr?EޡjU4.@4fK ORS)2Y2.y~ZgLGնYellh1% {J@}ɳg:?r&8I3% jU$Ώ:mqLOS.GadɟmgE蘧VnH:z5Ll c?o')e4־㜘*EUqdFnoIڗcuBh6.ʦ뵺$6"1b.30~1E Ztu='c7grbqNwW٦E4\V#"eYh;̢_!Phl9HŸieK|phs~>k^0Fl)*~4.N9d6e|1PE!Ҥ_bDl\ɗqn0ݽ38+\FjYژyNἸ澢~-]HG}IWNo &"UOdnU䫑737g5Ϋ|1-\^xqs);ls)?E~8' #]28|)=Mq8p7yOdFI3?K3}/Vׇnqa(EErYC4m,!'Y8 cБɱ? llN/ UsÔie6Lxڃ ~!. h|L%y$Ikj$P; O!o+ko( YX\塻2[Xy.gΰrl@3M yɃXjq2k?62Y̳ \Tpu@lV%&vMWpt$LSs"nR-aXCo[K +֑CBqui<6\4j!X<_wK\?PzE+OAT>\3Vm :j_M:t%`snMyH JQo$ Dxdlvfs!)_Rmd~DC)|aV"x--I4/$~bϦOhu3sE'6p+VU %@t5MJfS?"BؠYEԏv*hsI {xiwÿc-/66BÒeGP5m滦 lj3X>~  Ǡ;zɭƲAhlv N-+|5@4јEhKkXm *|g6P:=аmݲYM-4;HrȂc1J--7)D))>涅S,(G>o34èl@y8;?у{YW]D,ŗb]nAނuNVJh,fPyŝ<´@ E)nootGmm$l(VQ8~L $|%)ߦ,¯[֨̏a ؟9UB:9 5ۮC lȭ j(!q 0s]ȯNP^?ekm%Y搱z܁mЭVk_1Y4 =9Ѿ ϴ2« n8*-:6*Iz%!6HNka<\kFmeFWF(H-B̳J'f/ 'fh2$^,*F_l@>zޠN x 2""?$Q43y77(ׇ&JEKFZnJ Q i$v1\)i &AiU1tζ͉mFo8ֲH|6s kint1#&DTA2 pPeUyEf<I-\|qgLp>Ig'Fak]L܇tW5ĺ!bRݤ-,4#= [e}pS1h.AA+e/#45IGtRV^G0)b`p62F^( T"= dD˚:vˎ2b}ғ@Xtꉸ8d$̹_aU8)?iRdFҪ֫Xҟ8,XOuտٲB(Xm0c4$HK' ⑌'A$O^(B"@+d[A~pS֮Z\S&s]Ł3~US .)4 es63/|ۿ;=S~cfY;{Pd#9{SM2#F1ʢ@fTBhEs'O"\"H6 [!].yRx̛0+kەmX/ }JU~,<0׽ҟe:N۳Wh!,`e@++ {i6yɡ kT;D ׯ] &@_-km#Gm}2^_Eyn^“eAQbǕ[IyEkT Hg"3rEyL&=Jev쩺 Fjy.ێzc'ic%],9Dpa憛: 3Y_il6z-*6gߟ_4ȑ&nۯ*&q$^za뛓"\ϯxWU7c'̍>\%v Jd-U\\D겙2Ŗ)odS^40^m|ڰڂJiY8xFTG>QI!l\-vp%H!$G'X]¾bD>uWa3{_bDԜ\ٸִ< H鮦he)tIATGrb/ǎz"LI? WnʆTB ^ʦHS t$ |_(*h0X~(.z5(iezP[\qMNkViI"{O'o//S? d^V 8UՇW)rRmWп"7j' +\R}ka qF~ ~ʿoQ2›J6=Ҩa[m{:z 1m@j?z@:kDզ>(^$ u419H ՠZǏ]R *z".%활%!8!TԴrϷd&).2;)N{ݞo?nhX,+L'cS"~[&鱠YQ ' zR20& n[%T)ezB9Gi _BP B͎\6g `:%7r C\YQKb5)% V>ltZpm*Uq>w(z+\&Oɋ뛷'7=bFՅk R1GRH?_48NWA2B~wj;fYQ@-v?0L[7ϗoϯ 6PBx{YI[vώTsAJQR_8hJ @=dʦf|t2Be-/m8ؽT֫F" חgקoϯn7S~@-C9^a&΀ oI4j6>`!}V ZTA&x^S ZDZM!,$QybxX K!_Um`Qx4&T7.@rzdN_.8Y5kVD7l `}컋9u<:N(wI'OXb)gass&bJ]as pJ5XB$󳅋6 g1Kuod0eE9}hw9*<딴PDA_'35<5roJf1w2&x:ꤳ>zC4 @X#f`ԉ %r;? 1|}rJLni4d3~ 0&bt$a//h )b֜'5)gV=nqiQX"-Q#ܑd0/r-`𹘹:Z+uE.%ml; IEC R8;w%A2 Z Cb>##04MYYk­Wo^b/t>göf609UADIS=7(QN%E ؍x9Ck$Z'_z#0 \g|(nfOc*l/.xA W&'sm w໿FxZ@V9N8pfmՇr\#9-;)I&i&Ĩ\SO"Iٯ i9+aI^ zq-ѳ)Kd`Ka6y}#΋uA{%n@&I)CXLr|gl"K"J(h_VucyS$a"xpi0ȑ M3.EeqnW*aLjGu\pZB\ܦ8I,R+^ U;*߮h MHjCȴ`uGeo'4򸆅120"'`8V9 YH"N>2Cqى8ʵG'tM*@|c r9vȃdܫ)e1]m4;F: tzus~LC0u֏p^?q|]T\[n]yx/%!9F-{ηUަp8P矠C (Id)TmAqTh|v#9MBOB+lG/=vyz-jOG9sK}V %*!~ڲOs~C. c;v}sHa@2G)#H#H w]㔯/ q:8C~QDZe%*=g`o˟?rQ&$XhX_ UzV'0CX|} эjɅuzD,θ}\/Z}Ev' 1aȟ$n񮟆CܑFa !9,{ru%WXX+j(:& ,D6Gwsό&߯f1/oM&IelL+aThd{ 'Ls'죻%V:;DNw<6cvȈ +$KZ8@̽pJ,49HGR|KzS<υֲq!iH!Vk&[7T6tjG!K_56:\C#?p4(m O=?{v=eʚ6\c2!~FںM:gݷ6&5Ć/$^N PeDA}( ˉ,F}|?>CqO-d*"to buMtwG}.Ѯ[RX,A+_rH6=^wT b^"y- -G׳q/1*z4DxmN \)sosa2Wu17J58S}{ t sKam8+F Oi1vV|ÿ| tXsKlY hYLP|dUN'ml!T< h$Ƹ>y[opֱ2Czglj t ʖ;M]ktWU/PXpYGK(_\df:V;:[1sd)>]ծ F(]ضHESO!D-_w q3p׀& /NNWHq*sLceu2{ʸꩫ4AqmU|O/ e@V1(P %,bkkVw1 r`[XE.unRQs(nîjHo80$ eh(ْZpK2O#{^J~1aM&t^- IHN/16H4QXcTPKH }ml(Hzpn+}n.mԔT7tw4?><АFƥogK`ƕWn$<qeܵS!#  "[6~EDJTwTa6Ⱥe6 .Ұ-2>fZ-}OPKqo˰Hol!|3C-l -4H-95 zӡ+jDO5Ɏ~L5+]GQZ6pΛ PKђC&6PK5%T0 __MACOSX/darwin-perl-deps/ExtUtils/._ParseXS.podUT 0aO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK])I $ darwin-perl-deps/ExtUtils/Helpers.pmUT WP1cL1cux VNF?(M\[A%zRu^'[lowMO/ٵc**%~o~3dF}REq>(BY5ǹsGAgu~iY ` "$\t'k8>B}JPT{`$d\EqΈ )|]Ÿ.0N8Y+d15$<1#2A#0{ }R3$B{. v7

Q?Sd\1\sEdKN3Y@ʀKmW}xv% D^i%݌ >VOa*ЬT?׿ ^ {*Um<_b(%׌ vami\C70w'y5%6j9 ͺ&Q2EN=mL$BHBB 1Z//ȟ__ogGg#̐rc\ZqPnC䡙PUWm2vͮ,kͨ<4%:FY˵-9[ڵuդJ2䨌`3u,j@El8*y$QKa},fY͢-jfU<@)O1 *ϯe77UNSE+Ђ*9=OFā;"$hb)CSKȔ~3*AWr̃ cf䅴,sgY=>i@7SpaNIkY[BgѲ-WIis0_- i;ni%p]޵du< .Go0_1/L/X<ś3Paumk;d TG 0o`Ý ؄N'%K4tqi+b\U+OP@*yTSv =+OsAh{j K #҈( +WAtYUm JTF("PǣÇ@ E7@o.†F,&} rq|48V(K",QH,â)Il.f'kOXSax Js[PBPg<] 6+h;=kmP%(-g &Gxd4Y Y=*)_@Argı`BtbRj;Ue,t1NO/C _4ۢ)g(NTN@Ao,sY );(G/m4/_Ty]IH< t &D`'7#Q|d,] `&eIfutim|m+f]=ow\ ;ϪBV WX@l8,G7Ђ.QL0K|f F3L?PLh`S(wu%ڏ0RMl0Q Jdaf0XD6WdsWA4$AX'$l"%=mf;0j `n uߡ|,7ߨMgPtNE<r$pݨ7* mCW;ۺh_/tá ' mO6o~UCC$:IUSC Qzm0L[|"黪(* jX9X!hosi X:fpL:jfOΠX>{l,<=qԬ5(MG5E4v2Iy~X+vA&}ZH+XA2wH<0˛"x {AM;Ohqpk YvxIѼVQѕb!u> -NCqkiw&0IXdѦ.JY Ee:?Qh&@WCUfd4^D#YGYY]όktf,ԬVЈHA쯵u,@[!SqZ嚨nKu8бg/T9e{xXVmB O+43+w+NuDInZ\ 0ʂhN*Srnt#]xM凙N"ˀf(400BeSoSPn )Qδ ,㷉x8 `01&l@.2z\ςٝBхno_m+Or7 yl)i r2HnV'F1\o}m[3|;DD$B.Aѹ1qfs/mQbY65zJOU@7|i k1.Lԟ)FhM0s7l&Σ1hX/<8<iә?wumF.4*1SUa‰X[{K*yt2#H߉bc Ƴ΅g' " ;E^:p ?č3{ȱ}Ah? { {8LH!p 6dK| 2<@ Gx[(yr(HXEĜ!/Pg(͉P6@tN2tD r'4ľ J3sgh) bQBGGt8l\"%¤ 9#5Dt9Qsk8;8bR.D#{dU0#db(a_8vɅe}[!14C by] %BSkz'/;O(S?"a0>ߋf@`H5e&L)o"Q2*?'[ZGwyϰjǺ}$ʂJgyHc ȡ6X+}g}}{SlTѶCɆRS!+~4i^9Nbn&@q3ńT Lt]2qI=k\h::*kؖc/"B_VmNd/yb@m/4h?sG|Ұ_rtr7MOħ.bV[JM9[=BɏaEL;ғyD'NR|^iۖJTy!NyGD(lMroՉsu>G+#Aׄ8J%=:֛Y|j8"T;Ksn6-a;\ݪ#GӜd]*,sHY`;:I&O[̱@d PaE~>ZcZ8et[>cspKs7y/AWxQDssm,6J.9;,Y|p"Yn琌B1_q\9Ib.m+XCgkK\mՙ?ř=+J /iL=4#YC*huqiW*#§XHSL m/]tih4n%?O>Vj(v`MI3WRhCCei*fΧO 5OjgDzKK0V2vLyx\P&B,'ޤ E[%r2d6U%~SNJM2s4qS?#.[N]LYLU<q`D K:LfoHIS?z|ں~aշVOHn# Aj +v-6j]T=_OTCu: dؿ>Fb@O5-aHĥ0= ̮y185{)3!tSma j`i-]U}Z= ]ƛKB6mm7)Xev>Fcp32#AZ4KynWm2_'(!>r×V@g` 쪗c@0ǤIB`Jln0I`✜Ka*s)O'cʓ-]]bˊn qђIiH4,{8ȚPD\Po6T=0ƬD  b0z`~4fGHзɩ#N 1~&IZ 4h ?[* Bd"G0`T@, `c ]VEcyXoc9l|OEƮLk>m眾Bbh8Q~5 qkQ$o#GˣxW )t( yy@~_Y1j]s@v&x4ؼe 0̯cuޗ95Zɳ@4ٯwK9R.&җ |]!ƣOh8闥=M}mfƀ@{v7%_-$,38j߆r[D#;{ LB`bT~lP)Ph1x43Vr=_qڟ{jY.ͻyU/?-t43ҽ wb8?!uv|UrW B{jWÚ|K^;DZH TE\'\; aS<-Rb߶tek:b.e;I1Oy50r-[M i8: 6p]X4I3T46ܘf=ݏHVcهX9ZNOE.M݅|5h(ЍYWl'\s[>Dg 5:hp6:Nnz ΁>[%ٴA+>v_?TOz[Q1|f^9&Қ=^G|u~y~|` )|Fʳg64Arp awy&* 3D /Tٔ"oUsp6Kė7RB= hILƼNdqrsqgUxTz|*w3t0GWIk 25qQc8@=l[xbىj^HuH[|-0/QW@U(vry,0Ňnc_3 xK2kݦ~0$7mo[ UCktjXWE,Kap]q29pj><ʂF++VYԏAJ nj#f쭜Q':7 6[ZK=k!15_4+TSR,bCPtow &axOx.Ėz{ˑ_"Ԣ'.<×H֓?޾{r|At V {3'+19 Tz_{ڢ[!U8d"I*GD=w75!BIpR,uZ]BHsdLVV peA/DߟNZ i/{/̔VQw|_bA]<#u/j\,a]yHۋuS J? ҩe8HQ "M|)k@>F' yi`$ИGvr_kGfÚIJ 3#k{ov B_˜=p`fMG ~M$@i:T/~ዹԕqq2 l0k{x$Jqe l 5P^NI*N<)s"I`G?Kܝ\E\ rS -\J3hd,˻7ʈlIҋi<\07ǿ 2D8eovve|4 n-Ag4DRooO2'sg.&]Ix?n? GpRJd`9#0,Დ!U64}6WA/tXIQaV/o"0|ZբZ^Q ^&3{vN2t /AXhЕ^@AN羞$VVM3ܬWt7Aphq;;k(A(if?I??V.6ST?Q9Bc65 ԡ2uc [hڞcm8#un" [޴$X$[4q `XW.RB!;@JbԠ1!M&9ܡ$F `Ik|h0+Ѹ|:`Y_]WR9;R3(2cvbw=n5w8,(S=I`΃lcK=BLf/B_msY]QuOK7sq wKY|<4U?TKgx\78^ P9V~uYa(g9SSx 4A8:fPCH+yi0_+05iJ#p$5Z@T.G3ȇ hZ Ǘ#ȟMMUWX=*fi X 2؟K]8(L[Bnz=n[H(| 2UJQ :ge>sE+D| ve c纆T69h檚ңqint Ӈe*ޔǹ/v9񼇛$2;' \)*@̕,[åFnGe!\*xmJ IFGG9gMK -q7n%Ҁd;P =Mu9_.}Ai НNsb[C}rE8dIDƯҹ&%ȝld ?Hɱ{iL?r;\ #:  0`YXfʦdK: Mpzu N|9 )>kdJLNL7%^ |=^VkXjSc?Rl+4M; ߾W撯R?(sGn'~C)v?}7R/1(ez^€-ȶ!"<{@ŃNd̽,zXbH _#4f [;yi8ȃeIё:xsvL#&8KmYGٞw< v}@s(oG{LJ_/՛ã'Gb`pTA fˮcRx: a:9zBJ `Z:tٛb6^C ğb~ W4cޥpAp,demiw9PKA!r ^PKw$R+ __MACOSX/darwin-perl-deps/HTTP/._Cookies.pmUT _O1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$T%. darwin-perl-deps/HTTP/Config.pmUT bO1cL1cux kwF~bM8qrlbC"mղGiwfIvKק{3qg΄WiIϲ$}7~8I`+bf{pyuvGwHP^=ךdb_Tc`a0Z, gF:pg[1nc5&fC5Z'*26iHUe#(b:tK$cU7'רT) V0$5}=avʡD$׳NSV(0ҦynG { "FN úםDЎ,& x8I |;Ü7i-ty^#h{$A? =5im0櫪{m nT͋ µ!û%w?]p=i/hZ%+aw4.gUqr6 Luci45?2ه뚟f~KuLq|=͂'"M[ѪeFN[" ^Cs]V˗rBYߞA0 |(, pIYY)~be~KǒƋ )']0^+EZ['LYړ2w?vsZ"O *Yx|e#/( lK[ $NSo"54Qͣ%1DQe@{b:(Ϻ:($(Qf|.TąCMjH*3s A%]F51"ѱa޶|0cIMpaWC`6ē_97 Vtk+r(`Bnp^~4aIA}л:#Gs6YFN(3y܇vOۭVV .֠# qTSGі@nG>dt3/yp(p fg^ܱM\1<bם/h "cS]WW\qs2Չ \^ `~jv&-㶭2Mj93mE(hy'a ǾnbS>{{f`YNG1};TQ`M|, 4ė|󋫳+at՗u C_;E;n4֯<6@(}[e><ʩ;2wEz9Tjee٧@ysW?Udyx#: ORf~\^] ɸ'!;=ԗ`~ĢqNԂnw$ `Jܹ ǏcgE/А 4 <!9CD e 6`&uv! XGv#Y[:]*Uz]f'* UeTFT@s|}%w@ՠ2* t6ceRTj+*D%aOKhSP;#Y,`, *#Rǝ|dS9=z Q"*3ȵLѴ$)p%w=murOorb|,xXB7F)%8HzFZyyd((N!m%\URRV.G[|7Z(8< &Z@MT<ݠ[`Ȃb'ꑽ~ciJG9Z©>J%5%?Cglz3ԣHD]LX2XMe)+I-TEU?.lz"@vd r24e(@D `dq`(!n LO۬0gceN~ &00;P#2Ծ^T|aW= t:Uc@"w; bw5^-]QB 8]6PPzݳ=54Kw FHR!ɫ9OX|PYG.s񟦩ALtRVk%h(j3cTkK!=m1b>m]&dJ~#(PÞVз?S%'u \Qz?;Gmi̪m*59h?٦H*EHDG}G`l!n^kWLKol Lif8#J$ bSճ$6UqnY6{}h\~+u?>y7|u~iY/J ;cM) jN˳/$+<,XZ؟LSt[l%ӱ;qyˇ-QӡO. Eð-OS&-v}a<k[ wIwpvfPG_F#˲9jxyr:< PKr/WX %.PK$T* __MACOSX/darwin-perl-deps/HTTP/._Config.pmUT bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$T} darwin-perl-deps/HTTP/Message.pmUT bO1cL1cux =k[F֟ѯ54؉/4!ȶݘ1Ɩ\I8)sH2?nI:LH80/x-cӳwo3]<,X2/|-vN_Sq#؆q? aEp&e8Dupz28z;;/ǧh`PB} *1T#ЀΨB|iol"4Uj债4G/E]qE(RY%:9o,JE33ʬ3hX8W0ݺNfb/F6Lt-g~D&b`4lp9Mhꇠv5ET}C $GR)ɕj3҆:H$[z})`2 /]TL2LD#LPAWW~qk$k_-"qyg6gG׽SDfVhx8]ypT'jD;bmj@cD(k4mKF0H jPj__xjuvO>f٫_l"kM¨F-6F3|Edp=Z4MVkZ5WOQ|:?m=uz|Ԁv wD"7 kJQ4_ap 8x 2tdZ!xMY_BUNU[LCX"J1 ℜ|sXٮ%wc .#|yy"['vXٽAWASpȘҎ&X R E\NAh|uoP0A$1#" e"`7 pl ?3@Zb2d\uVsGLmY99AVwT̂IpIwU&Ցߣ~O-Vr6y-kYq󰖬6MҖNze(W_}ʰg2L,fF䤢{ 4$s'llɿHnz18:}{&4_y<8;=j$$:L9ߝk&u!vY\/-.9T4(Z砑b(;4A2`vMcuYa#gi68 nnc%m t혇C^hAR$ i=;Q 9?PiG=,V zY[~ѵave ;}b'K !w+( DEJA-v6Mſ8+hlA]wȓ9aa{7^Q: l4 Hb;`X,0ss_@6ߘ{gani w&Wg#=?c?Zf2*Ug@IH-7#"O)nسԐW_ٽex4k[htp\,s Y0oЏCOeǧ{ul*8J ҩrUNO"91L|P+$j.OS- ` 2@M옉[[[({,nitmnnR.d:0Fm = r$ ͂b}fq!aJqCij8-1a̶fbq&aQhO-l-cdJŽ9; ޜ9ECmBF9Cߠeqc!РŅ|C޾_\t2B*~ ʛ) 5^޳·K 頢'DƵt|fq8_Ի% `93N7;@`:jkN Wh{O@w4dJܬ7Aq!=,"8LlM*Ҝ,ּ[ÑKs&1[CzέvhֻRVtlq+9Oyt%gQkj7/͝Nj5ooIg{C!kLXOb~lZŜouP925^M[8fo4[7AAzYt1';-CN&,8})uKVwQ‹KU7֌>k6f\P){`J&S*^Xq{dzøRsB$fM-f+Ḽ|VC?љ-T[t4dI眃44n5ބ~c^rr>".7ԁlr/vէa[cpm0 յĖV:W[玌f+~+sB;ї1͙tts$}O瀚0l 9ա؇ius2&Zw<L|fX*oxL'n`Y[\v oRxE/P1Sy 2H<&J̏RkO'_ԪZ E nM[1-I>H'h8=57Ta{x_o `qܧSx2/)aZݫk'$/~TAH|mQ'NJȩɲuWF[Ul@ETs?$㢅Zݴ AŪ/@휷V  :c ,:ś,=+T,2Ԫ,vTe?bUI{<4Z56VdLQzLc ᶥ0 oZs{YH LWs<`Bu5cк-,ZB8޹K*Zx&AS`Ns ~PP {Gt<'Tտ:pQOQN[Hهg  fۥ]L 087dxdùt1M󑳑'.R8hq.Y[Dws`:ޛx6rlyp- L%@̊:i$Yr+607mt*J! ugyepEFRK&XaK3E1t zxy,D0r6s E 3uՙ" ˜l\u79pIv7w+PTx-na.Kw=a#Y}|-gYֶ7v Bd 7Fl_lxcbue_,2Fc$k`7"[ !wF5CYo@p$5GvDv@7;PpV@bpT9j-XCVQ#TU  Gm1\ E<rts)F;y씐pR|y|v~7pn>N)( Q}\·HO߾!R[7\(]O]ݸ 3-\o[1,X/ ?2`Gs1ZtҜ7>~mU9S9]z#O! fN7v+>XA?d sB?(;NMv8噾~M7 tʗa,ݛQȦԠ+5?vFeJADؼ۫8G2:A\OJBkyhZcSj7I'(Lv754Ϭ9:-DW(IS)v\TriC`P2mp/$*gG &8Tycr"< I?yh;"L]=9VQf;7o(j}W_TFoh BhzYڢь\XDkm)<@/UA)e.:Ÿ':9HV-%4'Q[i)~=d(hNUw2صAa06xZ+,D||w޾w}Qer S&G+63HMt6>,JA;q)2_,QNy-<H,wxȠZs I{8`̕+wcNYTۗ{0TDX:z_h_TPhU[(|ZKr׿}oxC780;K(-i\p\}*f~f'%|ruI6d,,\E֪)/ D{Kxdo{o=ϽYA\zfΜ*djlT+۳޾{vrL75Tx;j .seWGF~&\-*,50 N"%޵az̸oC[-dY'j_:xc?;#t5C-V`M:Z6Ĥgz *g*ib N#E *1xhhMG]C3Mᵬc4E'4LMvqt9\ 5s .gcl*b;ͺD˰. Pm,x?+A!d@~jVEuO{;X=I/.xv`^W7םDݞwJʎK 67e 5mwXf舻yW>,;uUXZ&x)(Ln9(A 'R#]pF3"wQ-MGҥOa_Ucя PE5ɃX" F^T=DNh*)2t52b09ՙ61G聾'|~2)"8x.L}nUGZFSgF3zB 'Ip~Mpo>B̃2RKUI?L* /w{eVWLх` qbT / *O|-A%ŷ7A`pÓaPbZԀ@TETXyk93`$FdJH+dXzx:]aA$1%J m)':dSdnvpqKIGMH kq*{| laIY(FECd!2\i2h KP#rm@Mg.\4iRTY6ࠡ0!6NuʇpM7qb2Ėg.5ؒ ےdHNVQz/K)pt`b]})5p̪ϤJ/{֣oZj E̥G]bձ];KT֩Z"qi2:F \DI9.qGXgWKh9S^wtZ:(6"t싊3h󀦳z?zފ& =X-hSTU $`3/J"%@6GѼ5 @Zm C@Z?uZE\`9%w/#D̂O2IcQ,.{/RHQOB]S ,:K',yL5vYWהG&?Bͬ$J![ g3%)ehRJ j.M S"漖 ҵ9PA+.HZ2y99-U ɆYaښw&XPe`T뷒)L.]gSñ*{!WўST!M*X"0tڵdGD =^(4_vfqb6 \Jj!D@QmRudzuX{ؘ4 ]g r5^Lu(^٬VM'1S^= ]JAb]cW2O37~F2jj<&( D>;Vl47`T΄/`'UΏ9sȹZ×T*V%,xEh_0T{yGqbD+/4?TfV=w/&lZIPa\(Cmt9@UN͸-39&i *ѥ=UT v4gg9:荐{-n9g)׉Nj;/j*}@@I̘.7N֒MR)O'BG\)q8$J&(^`ϱy&z1Lbc_,YQn͙eU!i9EC[SJ1",7$T>+fNiD Ld^ڌP#!TU YkAG]>ÎgUR 07XĔrZ`<*NST늿\e5_U@ PسB8AO)8r档VS 5Dvɢ08[鼚bt&mgUÙ $ʣNMCʪgV#FO-d22ViՀrA*@{* I=N;y< ;Ȋ9_0 n~]z|Y1~L|4ruLq;h+Wvl( hM(^eaUvfWiR&PĒqEpgӸθxGvfLx6fw.iЍd5oqAYRa8}T9eܜPA7fisא`ߦc5 I9=6y9$̦XP)WBšD*F[ #h\n`}IUH"g+џ7 麩zޕgopmxV0 aM[kgn#Lv5=Gܒm\;ytfʙ:d恟;[8NRӹp*kGK eϭ  KN)j63Lb9@NjSZ=N` Ձktj$FA'jW^c\s9_p֬|!/UØ%QбңEi8Vb:Բv'#35\͂9i0_%XI.Yef {ןĈS.1+QFd{&݇_rSSduIdiBi叽ЖO191KsiSuO~Vxm)RJWس$cBjWў2$JF%is$G)JheHpV7T0|o_wiٞTϕdsuYמ%5 b+,HHB0"gWOM{+nP-FW_cek6biI7@9t%(/+ p^&/7.9>bPf/u!нD7-k,n]o( j?; v{^`F2rn~'Mo]WS噒wJ. ڷ>(L.0sVDMj<ϴ?P]_;/C? FwVyއߝzOAv ?#ܶK%vMw;=s{R>9:~{vl%ٌ?S:]`364];B3P=}֝-t9}T{ҡ#ShS}tmNLeUj2Lz/O{GOPKC'}PK$T+ __MACOSX/darwin-perl-deps/HTTP/._Message.pmUT bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$TB! darwin-perl-deps/HTTP/Response.pmUT bO1cL1cux ;ks8_S15#[vZ&L\MMMfT IS$ h߾@]ֹ* 4ݍ~Ƀ:XHхTy*9JI"}_E SYU\\'N'Kf|2R)mx J f"k'gw$Pj v>VjKD/a2-H/;J&s{ˏ&GG^ʫh8"NSȻAd .ȏBw?ǩDP,"ʌݾbţG߄D|$iS<K|5)]:d7)8 Y%↟O*({EA"dbB~AEVfa!GP1}}r#.By(dٵI|-E m",dP-MVƨMp$.];h032oQ4]xx7e55j/`KϾszd Cy<7]&YZUemó0:Noӄ1d7Լ- ~Z@J?N<3XKen\RnG@+s7Di™irDxMi^å\I8aFF3%U)Zz;|nz#7 T>ņA0dRD\DU,eV^.9ARѼeXƟeq0QpFdmWEoh 3Wb6|(Ԋ5ـ8Q\Jܣmϝ0r2Nq&Ǚ]>+ѼRK9G YgM%g2(`0BB' ;s$ V:YBժ61D^-8 Fx B ^bpD St"Ԅ[D5 >SM! V~Ev3e!%>꫑ @0CqL<>xg!StC#`; CU9bCZpSY\u:}y>No=IO8XX-C1\̜9߷o'GG?Ue8-G۫"_qn/86w[}]y q' ِCBf{'&6V?wXMtV>:iMFUazѵݱޤ0]eQd-۹;ևI A;p4, Oc OAG__}soT%yTL0 ۮShd|ߡ @QG?[3GIi'&O޿yr(h3iCxHs1"DC _|L[scK\ N oJ 8_P $SPXO42ȰJh; tz#!`}W sv8bEY.a-=H0!r&tӠ`y;.d#ef0$K,¬@ەq(v|k0bbNv!YcÆsgKi ="F2 6X#k9nqB$0$Ny$Tvz I4ӲBQyRe ^,~.qӌFB)OU\,s*X4Pa2VdɑX_`TB4.~;sH ' 1S dϰwHPei5'}Dx' 1bh?qdo%z.WL͖(+JƜ[mDT75:= RnzylPDUj ).Ң SV)^yP%e玂TYBi̡PMWqB8ϴ1T|'<;hN'*WY49e=?<*NC)n #nKG"ti.YDbJ ŵʠ*A4PDSWfzywx/k גHij4 EV܎ NxKNs'F i^ky$}|G9vHm`<x;4Rd- ^TI· NTçrxԱsR_rwzCAƚOsFT}&ێ'TmclRP5غ:kJ->2N5YٻCuyg|ǫW{tˇۉ5`#$|T_E{`B^KϳhaJs^|Ӈm%!H()VC#4Q^ Im:q]T5zث7m.z9p14 hjI\]"Y^ d+̟!u_yWIq Dܨ2!*\#Baհ/e%ymp rVoO3E4K낯3D1G'gP-*Ux Uز)ām¦  ~<1Kv5Y?YӚgIѲ(t) >8%T$cOK\7;}}+F@~_o<RU8.Pc>pq*, sDz˥xHx֌` `4Y}8#9&:Xk:} aD:$!UZn|ٕoQ`Ln!٦fJG{<,&P%(g9AJ ZW`CFuAXg7oh*mwr*!ހ N>pΪRji,E\ziɂ_j4h o10Jk.CU g]"RfxUB}c:Ez C}(rL X[,f}2+JoY "#/FXd_Hqv)5ׅ$%f9l"\`9,sl]pӆŠYvA+pu$D5ʀ;xRj!}Xk:oeߊ1tN!Ŷ@Utoc`b;rt`JR bgf.&:p0%3 ^Do 5!cȯ;ZkָGֈz-ds\9 ^{orpǂ 1λ *6j>@6l>ru(i#!X SVe\ΨA6=iK.Źnv6b| F^3=# 6}rl#5_<\eUg UhE\;? &uDx1(B޴7[ˉx}1yu҃*7@-]X{TܗhG=J2Asdz+:{KfAxSUKt3g%rq5uDeNtOZhq0Wi"_Đ{h 6R{n(\3\Z=Y2<0FL> l ~6b9$TQ2 -% Bަf*e.l~}~r&>f #Yc:~NS!l?F~pewX YÊVf `DTBl1J)1Mː?n[s!{]6# 3(38nI72~ԖdZ-q^D5{WiԼsKV{~|uJ-~O!KpT%9Frq1׮kJF'[3բe}LLc_JYC 8O0EKĦ6ZGaKKh6nm;j&2ijBĨN4gY46*_D>W.{/ ȳX D@t:8h݉i aVk4lT'…uEnOZuD-y"1>{]R|Fe,Ιʰn.dk`,Wqih=٘aAN2CP긾g{*{ּcq5[oag㤜Qb{-d^оΆ]]$[zټҢNS@t+@sGe׍}o>O6H-)st c tߴ{&B/9㋧罿=hF yd#᫵Sw!_lKG߸gFgM?"ZiL&{k߹ vRY\p1xO?^~y? )>bSCY8{ᗋ__w/śɻˉ6#5Vto __[@ڥ#*-KN5] $: Pu.>+1G>" EVhI.*4mD.9J:rN'^N=<}qyuqzvutPKUFHBPK$T, __MACOSX/darwin-perl-deps/HTTP/._Response.pmUT bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$T" darwin-perl-deps/HTTP/Request.pmUT bO1cL1cux Yks#2K A}DL,ݲ%@7IA -]a(}}S-<ݧGɹэz);NiO>d\c+qR?;_iL$~4 7Jk-MDVGrLu[,U<|?Jz*i*L[`p6>āV KzpstUs>WkWWD:U26oCOPyB&l aDBnLxT$+L#*ճt?Cnau23C>u%3DEZlVyl!Kn>N4FYUǁMlo8.(<]%XUoWQU7dDa$ŸW'R#j{my0zfU#itmܴxc=l*o'hqPFQIhsѵ'"]ȴEt=8{Z: ٴK"y6zBLeLD )c,W:o*QT5Z/[ WoxQܻ fgf}E4Rc1,4ǡS6t @)].GS4[=c{`׽ᐄo0cK}q.SrEr9u/Aūˋxp\AN<_3N3L!o|Q6L]k~=ro78Ų'v.Q8\zhUQP2 0DYJ҅bӒ?P$M˥r7Q ^fǟ~{T8wLR, s!ɻ⪴-OD2ʧvACC=dDY,2cj T |D$98{jyX(Ua],,c?yۄ`о},kWG@X]HCL"oQaD&S{ !p!.BJ4.51禍`PLR-"迨[Ԣ~c6C*V)N r}B W}̢ VdOy>4+!Qz'bU|~ݡWE;_̛b9m>B&M2O Ė9m?)=M ۢ,%9a}2֚[9`.3m^ i~PLcY>ڦW1ŏD,!(bPbpe2uW 9p &_ 308~:\W."ԺkڄXޒ 7Nl:UkixqĩKFɚyA=)uK^y9^;svĝUj%'Y rE_4ךXFiz/[zdpԨIK^1!$߳&zlUZj{1+]l66~&` (DmWzd쀣1m9A?%ي{_n(*ͳSS) pZh L cKI &BՌ=5W~ܡ}i)-1ʅ[mJU&*fVkB; NO\>Uxbaߊcϳw.T/ DA^!ED!>trc F;8S`ӾgDsebsNeeȏ uta s5ƠiMKջ j6wZh%f9+7ׯhL2Z*AZCni2(zR-; 9m`6)q}.>-G4ۊj"7$;Ogxu)^yϗ*c\OCvro: [ R};wP%gϿlb>ڈ}݇u< 8Bs"uOxiR!ˀʇYՉLm{65tڨF.SVIkr#T*ik'HNfvg/a?2ոy3ѦjoeDhz8ΐм=mS_E<@JjWJO!zB;=L ASŘ35/A]ĨD}e h-];iM:mAfbFwJ ; p|yXm(L=J KzGEO w)ta4VKSqp@Of2;=j\d#=GE 4 l,ܨtN$1.Ҁ3|d{P%txI4c2B`cE}A(wR@_kU-ғT5;Jv)d<$iYlvj'G"7BF7iW^DQ螚5Qznb\ӵUHOs&xyte(Z+uJZaBwͨ~)@d{2輕fE(r=3/U𝟺N 7yPUz7J8lƷ ZREf <2 V|Q{=rYU-QxvyZpݎίn畯= / `]]_]xs|$z/r8sf:a~׉?_dN[_E/N9 Mc2>Pbr"0~5- STB#xilkTyJy"K~\Q뵦YO顝ig<;pt돎{ PKiY "PK$T+ __MACOSX/darwin-perl-deps/HTTP/._Request.pmUT bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK-q:U darwin-perl-deps/HTTP/Headers/UT v1cm1cL1cux PK-q:U( __MACOSX/darwin-perl-deps/HTTP/._HeadersUT v1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK-q:U darwin-perl-deps/HTTP/Request/UT v1cm1cL1cux PK-q:U( __MACOSX/darwin-perl-deps/HTTP/._RequestUT v1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$TBb darwin-perl-deps/HTTP/Headers.pmUT bO1cL1cux ՙjj&jШPez#=ISm(QSBW]G:$icjW}"1jDtg(F WJP V2H5Fau0 3B|GIwi0S<a3,[? GS=dJ*h9Mԫ0׸,TYŰkuQ:$(TF#=OpfF|&g.iE0Vtޤ&!ݓ0M@Q24Mt `dVJN4 Gz{-4)t. ({T`V%#aLSGDMG XF#dʙ3xtz:?ԇJ 8N,: $O^}fows,$mRmc1k S@tսGA[܃cPݎ쑿 TwiE02qyN$U F=`0Qy/S"P4ˑa2Zp OzD=19 yh䞐7zk"Vix?Ɇ?=˯ڈ]i% CbtX6Fqh Jit8쌎tCGH@o{MkX;BƎ(,f""KzGY~l5/Q -A֠z^ٶ `wOqF넿-"a.tfRZ@C6=7o?|Y^MSD|2ca=@P#(ne׉7a&T_3|\e+ǧM:7Jm@+*R}݇A9U[l9HUm6Uf-i ~9@"P M l^ [Wbc{s#o[\H5CV6+h8St&Fk#5\eTj8Iea oǓ4EFxDBL=i-tEZ4Yt5iИk6>t @ e>%Vk`zv֘Ҁ.N{i豴+GxGv!hd/Ϯ}ЃSĥ >9e!]>yAްq&PC]g`犹#JloE[a|>491 P*s(PN1*@HŋmpV^׿怨Pf`"PR?W=w36aUCӎ{VO=tHu)vcFajMkم9o=.@ha2 /fEauYQe Űb}pG^Çb- q 0)%Kr`sPDƏ>?i=xn p{RI`.4NƱ/7J8EKd廄-FQC/D4m@R^RSbjL9AJ>yM\',E APsfagl|J$7kƞ%̳t|K¬#) a9bVR5wjPf8EhUXcb[Kų&p XbfYb-tLc|=}f @i4jSgC=#d y&W 5|O!yn f<i^mکIvk|[@$),</Fo%O0&x 2_}A/!.1uJb&QڒDֿEC"020 P71qCdT;xYT6y4e]"q2&>~֤JI"t}R+C@}oɂTQ.wѬD@Nu0BXZKpz`K4C՜V ? kTU 4VaK5SEeϢ@y ?~xɦR;T a!0$Eӑ`0!SrcDEj鑎n']<(Iš-yHxD1yv7f8^`&faZXKb6DL"Y.ѠF]c/I1E*M4ҡ /@?8ch`)@(4A&3E!;KԘh45lh+A 2&A aLT<M0#&,(W*ኘ%ecE=pBM,|[҂$y%Ka8HeG ;Z$->ΕrM9&$iĴLi{X &^jd0H=~SEӶ1Rv#ǿ<Y@t! qG3USoLLDNkg+aSx&N-9 ^cڟfypL5[BdB1_:g}Ɏ^_d9v_Z+)/٩=g 6AF M/j⻺o++gRb X#x}u;ĕ|{p+&1f ( |ݐ֎Y̸W38@nJZ<Ϣ9pBUszP={ZX} `EU cݽZ$Ո}0X$l#3תMia/-:K"\F%W_w0Miil0Ŵ(+.U)7/pPeſ"mwNj O|Jl[zb~C>-P .GSR.O{J C䧸f49>E|@d jTV Sdc*̱v!2FGAU*A-@zJ%p O&P 9v~VmkFmmD=Ϩ'|:dk$b@)V"ftmH!cAdDq(aZf@ѵ|e0`^jKJvd/Iej$tm^)w 䘷ވ;0rkqH7@-,<Ǻ聳nYqZMft)l *]ADhRUEqMJH)|Ki->ޢ{ꘔ] %)d<RCl0=.')JQ#"M`9",L8 MtYA+{LjeHtzxF+Ͷ(s*Y%QR1Y)g̥v2ޔࠆ+P*F՚ 7c  1os2aX"~t llYr:;2s=R-h#gJJ@Y&~ #%BvS1s9#cO#0ISsj[Qp-͏N/w`i-el@{݆3أaE8; >qpl j{'e5x%]5GM]_zlJx+\L s x#S(fh 3g)O1L0,gXArn!Z5O2I ,;n@Lq`;ҽO쭑G[fhJMU⨄fx8g5*-7)dvDv/weiCgo1p8qPDM- %z)Qb=ps*tG jKSW_&E`ds8^!6e"Ǟ;9WWD` i>*RZ52r;4y_H߉LX” |HH"m*KI-HL~\ n"]9}U4I ˦4Cʏ@3 #7!\BSpw6p _P^2]Hޑ68O/#I,@jȃQ4=Xjt2>nBc y]0| ˆ>Ž|(fJ+`f3R3ϙQYfqhz5]n~ .'lAFd >/ 0#rupfd}#;X(Z}@]_˚;H]yw9KAΝƔЄH6Kvz̄q9j=nQ]8H)P,-~4Un^Zc2 #]%[R82zIN(qª%Oۉlk"bf&qpA,>H;8 [ϐ;[ oVy14 ^ 6UC^M~;!sobSG$\D&7Y ,DuFmIIY tr, LI+u@g0%Қ\yY5dViVH7eCN<`9G׸ͤl}ͽ9Ҧf8 \SZ,;ݯQb(}+#r:cUcJe6$R#'ҚX55Xslw(Ñ)c)T,Kkrq e,֗Ϸ bVuI}KeQN9E\=>b-ւ;˿a  fK;O$ѼZ9Mst i+9` *,9#]N:3|+?:MxMzs&thSl'h"{P/N!PZ5/b[!,BkEǶ=,uGNnQ+V8P{I@RJ["p"S Cs^qW wV0h m/.,>}RD"{, \]U +/So|vb.3wyv쯾?yo zg#'f{uʊnZ5r.Rb5lZ7(t7xJV:u= hZ34X̬CEZp'Vpf$!KېD":p"D>6 #S}*JRtkH5jT)U]skN(0`^>ԤIڐ_`i-$B:^dꐃrtEt\y;V`٫@..ـV E8SԹv| _)Xb6ԻRȶR 7+1ޞâ쿕O@8GV\琻mH`Qo*'@po-ՂQ'G֎OF^罭v\a9(piu~Ƥ#YGQ7$Y:$W7Z0vnStgalE9o1 2&cޚB9vNBB]꬞?{g䘄;h5++p&cشG\©SҪx'v#˳v`rQFP\v񆝏qG:tSQuzt)* >'rR u/qG@8 ȵϢ v?Y<~pOYd`O1I o; iơy Ij+p{("g/H=tL4j \͓@Qi Oul3 mgG6!4bXAe,Z-!O. }mmxVwE;eN͔c>FK=VsYQh:7eKp03-F# [nI~, 4xꎱk sª>Odz)֩ڮnk ]p$r"XaaV%v=/g7Zw;eG0D=rC *VmysPݼ/B{>(f43QxAٲT?e)mr'%ogA3~ oKp4%C8زa? j Swnr/f#7+2r ,<):8ärU XD@.} Ή JWU2NըeKTtS!J*@68o'5j\#i ?z&k1j tu@Ȧl0ng}h]5Ҿs":~(o6N҈\)n;++sqaP苀0IԂ䞗o5loJR]\~{0mγNp]G_%4=Xzk`Q $2r;8J˝YE`\%@)C?b1F4,Ri0kp#2wS%G4wɜXF_@5ELTw==gg5 0+zXS\ӀOOPRhωśwgA}d|@ ~NJ  Ydz\W1%`!=ߑ_Jtd fǴSw\5(U$:l}1:XmةaWT:-32QsyK G |w~qvpxwPK!BbPK$T+ __MACOSX/darwin-perl-deps/HTTP/._Headers.pmUT bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkR@>" darwin-perl-deps/HTTP/Negotiate.pmUT ޙ?OO1cL1cux ;kw6_*Jr%Yr֎q5?һ{\$)e<h7"A`0K?gRxxx.gI*wWat S"sF׌fB cyU-i09[qTAFiP{eo,3E:Zʈ# cTcUeV:5z~# `!p`b߂/0iJlSH<3Չco#`uMhGߕԾ8+ILD_p=M uv("'\n!NHHd`Aܱ^ŋ0A1P [qM&nD!O8ZJ-v7O/Z>N 4 '^akɩ"[ʺY6hiX7}BY9š(i#l*tdFrwG.-vnr5ɐͫ^m"bHueh<mʃr]tZ !; ht=:=;+ DkK>X#b^֯\kzQx`C%;V_NAѫW~p'0l"?ZnF5Vse͉Pp" T4:7=:'DN=،}bn4k(زM3q<715nxƪQ迭06X {v;X1$%,@}fD4/ѩSQ ՋỌ#o:[3Эc!(VVffÚǤݮA!((`. [ wVERˌO4$<̓6AyDH *L{#z([ɮTQ""5(&Trl4Ĭ$PhW ~d:N8 {X`QTji(DW|S(T}JUYBng)xGo-6j,u]!mF\&eS *S͡&i NХkL@!7MBqAԥ٥rz B#lQ្t5ILX\ U@jkz[ rěq~ϑU>1YJwB^ǫ+UQn`sVWWcmX+bW'Y?nbѴI2o?uihʘ~_:'T8t`Q-#?ٟlCzzū/ ߛ2UAK߿:88 T_wo:iJ _ Q;o05 (-÷˳g=Ilm%DsD]em<-q+v4Mh^=}2/PkB>]K2˕hr9v1hgG68I" i 9AV|'똯 + $4Ai0 G0:@6INϒ;>(#GfF^03\=+1^%3F=0k$Oi,I+=0XE/r$+BRxe6➩)ECto'r&!gKx@/xpc& X2zO>Pװ0~؅iDϵrCy|5sw4ЇMtA#A}"Re(ʬ2 ڪ; ^I"v uy>!#}op%1*Df[oDF4fRoj7umN xcj歧?$yFB"B|L (آ}m^ߌS5/,gݚ1ΤߺÊSpyB^-U2A5Hc1p[ *Hk(3|~"P kq%~)JH[xVA-*ELQfiD˺ո"(uK1FEWz'mcY~)C[7O_5c?Vdo0 *Fq^$%<{WORy(Nc `ˀ2œ5Զ>$+4x'7JR! _#?1a|ʌ-xQ}@=G}lyIʇ\>q hT 6^3 ήlE'>-0Lp A#LqnlTѸ}a1}:N0} @uX $^J'Vk\i2T,Xu{GHU#?k;M*O?Ǜ^BsߘoS?&4XO5숺-Af2 ]O դf C@#>4JFӢ/uKϳ3||Mqr <PK8o>PKkR@- __MACOSX/darwin-perl-deps/HTTP/._Negotiate.pmUT ޙ?OO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKcTs darwin-perl-deps/HTTP/Daemon.pmUT |)!bO1cL1cux }zF=M+i8k,KZNM0hP4x``bo)khH)]ΌE6ݘ;wg3/=g3?a_&~v7WWwo9;y};99v bp6O%<~1$'!}_q3q8*f{?nnϯ.ۇ9^!'Zί]_ m]>i7W+QAZf ^~՘|p|V# 7 6qዄٟqD=O&K>go֬BO{,_, 0b.K(w0W.Ch0d*K>>Th{\'ЁѷHj5E/~)O@P/YF~矙7R[?m7>^ + Cr)O1@7j<.tJh$HG걆#VNTes]c=FuAnvd7֫{#\-ބ0U;UÖ0(Z 5Q`=0c` t1v~E:PYxR6 4of,<'ݠx &+ 9ʸ ݭ_~%]{y4|P{ qѲ8'Q -jqzXY2',jua/X}jڏ8W5|Gjtqr`$?#EX=)6[S +9V̐~<-Znη0t+#~ 晙gbJ2Ä7rĥ{ahe%05-;U:oZՕٱQgRn_>䗗,ոZ{/HZ6raGKj(v,[] .k,|kNKn'h/x2<ԒbB!iIPGӏdC?傪0=#Tbyzqr{8|!c1Dap&Q#uōcUI~B*+ 4uÈ}|F7975aD::%Y o\$ۋGyR j EY?<̂##;ڝx_^T/jd%*'EۜM*lٝxH[yVlɔN1 q)`j};.HTg1˗47, dD1w֎{ K)6=ˆ|)}و|2EQ`JA€wb5c@q*XY/9-0vC1qcN" -3[\9 ~K kFv2p"ށ4rH'Ty…o -\^BUn p:#t<=']D WsJ)iHM0 H5*0 Ǜg3!O\P1(6J\"x~$VHrJ)~N <(K$2+2XeEr HXE_UK7NZw`/*xVUa%M7!+e (f ?h4^O+6@_-zgvA89l XU.znϲIG/ S-d[z[Ԇ /6rvŀc{E)s}yKJc6 7fMwpcLXT=W{VJ@Hv޳%nfJ2 i}lk6 0MN?z'ɐ%y`mҢ[cmGO+Y 6f@鿏 +h"FlvU}*SIC9]S 0+\TSU.Rc?wG4[fXej$* FH#@?=dj;Yl&cWDׁZ xbDtVxjd4{]%3iڮ!9(Oɖ,7Le͖,1`:DF`$";5{(;nSay% /Mpl=f#˶R)=`~;,YQUNu {DM fҵl0B =n%WiP]I{RX桚vλx/Wb%9DbH4徐sYΘ-}|fbs"4 Hun Hpb쎃 z}Ʃv\wVR V1()+vhBd?^Χ OeF, \ F%C.Rdc@0eqޤӨꥤâz(Q-bT{/>}!?zrulƃWq`=.զ-? Y$vװ}rIXbRƗݢǸ[ !\F3uYE]qp6ܼ?\/~ s;#Zgپ3k@E` 5b >BAwXrZ#xO`OgfEKf$ỲCLsA@ݐ|Q0`b[S $2 ^'?$7ltzN 8ZDzDHڢut i4RRk4YE0KX-a /I|mrV6|7lsΤ FU5yaG b#P/oZuaǴ {G on^ .-8c?\@^aX)zRc~7@wVEK(Fn0(neZ`cX{Ͳ be]^Sض^Ni>$^Q-(+-?X&qWCgFmu(Q2h͚p5 01/!2Պz-C^mfb`(}FZj-t53灐D7SDzhF]"8@pۊU%l}i^.Ϸ&MzfooҬ/[I5K%I)~KjԂN´$cV+deqh4<hy0|P:q$k켆Ʃ x< }WgBGꙢҙdV9HUPxFU\ I>\t+ba9Zw 7.%ql]Lɺ];a0ܧW8^`rM0 \}Q hD,2 gFzɤeZ[um# YR@sc_BF3>?ܞޜ_IBCDVg/,R&dO+л\5C:D/P&@ƺWr@ᴗ<{\lB%BOZSZ#DQq$qB0='x\oqFLTfq"uK`#"[ ϝ:r.z-n?\__ O @MЯ1%k?%9鴡IZ~`u&e#k:a-!{N4SuPɜV;S$SMʱt6%N4 ]Rzҙj51ɎV%:V@)0-#秅BMccwr h[NqBWj` 0x]I&Iԃ۴73Ja#]XF ?Vx@iH3e'1dQ 3O`4\ؕM tIT$KU|G8Gf~(+T#!i邉Лrv?/e"XM$B<$xBJ\sM$n<[I!.:E- u6^QѿǻZ)2 "¬+M:Q%P$ 1^-Ay]u@AA_[ .+:\^. TSBwZm|͠@upnb^Ѣ_أCv°#>w1Lز$MrtuGC9MBkz1mai:KگAI;.~7U>uP.RyJ0kF+[-5z^ [uJH, ѲGf|LIiCFa :`$F%JX^,UEcNKiqtr:Y0ޑ2~Q K"(&k0VA\$# BŠiT+d-`N(^JQBx'≫ ǖ45im'V- e\czb{uBS(#$ސs)R pg(Du@*UP}l͓P!p| $)eÝ|g>QRW ˛H:rkNڜy[AZ`C%/p.(a?UL r:B0S]Udj)^j GsF`Lyƌ` GNc5sWmj]K1e ;/CyOcJh8ArQbS$vu)@'ΚAĜ'jk:FJWGhAAF, Bzo+7`Dy)9nHV5=φ@+&'Ȝ]wE cځwdJ$M0#wX9%bj2UV+Oȋk NΎu$Eڢvt}ue nE.ҷe(p&y V UR`M1μ/-7 :@M_X;&0IЕ;p)&Xɀ6nRe  4 zQ@^ )7臓`D{_rC%MddbMo:T:JD?!뢈=-"rϕzVU'kO.u(jr@e_eZޝOVXA?h.ѨN yGwRc;FJ됇@IS"G)k,UX? W,>Y cs;n_ƒ^q{GREu  *v ~$ցe,!wt*>maO 1QidI 5m9K4̕)e >VC _; /dt@@\plu}ųYBAGȃ:iy^0NL'mf|q|fG8ڥOzu99axus H%䮞`W;e'?$/Jj~6Ę3v;Wqw9~6ps'Β]_4v07l11p E.{p!'dSs[{`oW nf4̖D)mvzM.?c$Edgn!6{˽%{l8n~bo8`oֱA|7?_ n0>Dڑ?.?i b4`JEm#>p0;W>M6UoR+q1Xhb7x'8rd#X(: $:^w+܈r@}^O[eaF\2c"|7~W+pg+ ?§. DZCԘ",<=XJf6tߜv8~OnHZfu uͻmiߌ=)ӆ]FOC'W?_M3[.}_gR?݈y~ڜ ܤ էf{fN8O]lN3no!o6W~oy5@-nwX KisůQ> )Й4<,һwEMeKӅ8 Dz`zlj>nSTeXբ ɽ *9֓w/cwG`zBeex]2Kd[_UsRYޞ[ /c{%}{/vO64uC!pDsi~xS?oLܺ~aj[|=zWn9όooRɿ}Hr nN2/oԋWsq}5zTb%FV΁{%n0]6Ƀ͉\쀌 ų>,y3QJWъ$CoVׂ{rG=E_ O}z·2P϶y}0khƜ51Aϋ> dd>{*%ʎ$`r`rh5'3 7?3vq~:<Mh=16Njw_Α~*f٢Ū0I{ܢ 'OQ-vf B^}3t>[a=DlR*q/PKB$sPKcT* __MACOSX/darwin-perl-deps/HTTP/._Daemon.pmUT |)!bO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$T2 darwin-perl-deps/HTTP/Status.pmUT bO1cL1cux ZmsHίKk*-$=%HwSa4 Рya?%w۽p2/2K)I$KK RzW\,GGxWё(r82Y͚OdGYG; `NM,0-(TF$@lydUճ >{Pc r<[8z~zAh^-%JT*d^U!M3^FS.>5s8:f8NP[D8xh.h *lR,4؂MSpyIxru% b{ĞM@ rnV!@=>A1pY]c8gP*^ oE#4`2\aٚ,xRlMع?Au)+͆b[&E77ƝiRՈ0z^E[qWQ9(9oR9^2kF!je 68J\r2_@ERnl@Q +O婈HeA̭EhiꝹ(V.ycHž$EcPBAȝKn$ 5IG1< *C&^Nw,֩PH:wdpZ³!u;[KϪƱH(a<d*I &I3|`餼EA锤Y3uo=hاw}0ݶ=?`.q+JBV[@t}ن@;Bi7l87( |#8֠"ly)82/,^=K4"1WPuށk~@% 7Vl1ѱ{)Ih!=1pD@U6ng:[GOwܾnw-[.x0GW{h[ZkIսźeޖwښyM;k87K;7s7u%X3-۠nMF,0v d]B[7#F.37}Tb1"{ {_>Ξ4&>IpjN PXCe)_2GioĠD 1NPt,?,:%y؈/ןؐ 3%ޫ2RT_T+#KH|JeRie=c?CjiÀsi_=([ykG;ioF3|f#O UcZN`7چBb>f6y+\Տ7T[<,F!#F%c XS i<+7gĠJL+|CYEI_Fq(OW by0c8]IZ oj.jk; Vqo/Y=H{:/7_b+Ў,nYO\–4m2WxP{$ 7 `*doԑp.=PR`&aVaNJ1RVBVI0$RE`e)Z7@'|A c; ŕOPF2W3] c u)3"`x WZJ`ݔo&>H}C%o^-=Zɼ ïq0Sۮaղdj;üwm˵uVKji[%5x:ۨkKƭ/_oں]Zwwĸi}YBp Ʋ;&S3C۳uGwwlꆤpv Oԝ^5noƁTITz^ PI1:SDx~2ik5yA& dMneQKttowdMi7fYZ&h*dͼF 5j>6S -7R3sRk?zɺeC|6Z-\ͩWˠ@-)-IkuC6a۷8hhES95:u4Yf囶j2oN]l[nqu`e0n4ՒÚulɖlf rNsصeh}%[n%[ߺ06!Zepx٦گUoq"bܵB-im5HH-io]݄j%º*i+mǖ4ZK?ٰʜ@zb5z}ȵ#~Vҷvjaچ~ G"^Th Q*8*m(݆۶%ѡT6OCNdomV9PN>YUjw{Biȉ#y,Ԓ5ۀRrcMւ•eLo@`Ms‘U{>ú<|6䬬o޽iȩݯekRj4oz&UiYc =S0(;q|šU+"QCE. s+xd k`_CK{W@qqYY<(<(jJ3MHOXC#h?c8GE@}xsLUCAcQf4Y^,€Oph>F]G``Yl@W+bmFB\:&hWlw1^˪D)*ZʝXed=Q?#tPf:_7 **,!WC8e :`WY߯;qD WL 8 2m,0Y0>y +՟}ۙ!pJ94 ,ɦlDԗG̤$,UpMbأj +pe: 8X>08J@!;28J>}ʑؗC_]'X5)Jj##,-T18z+k 1dҵtٺe0iB3lkHhFgO&

;;bX1c)~86poGq_fm=}g_te[v z(9onʼn< ~?l6Q 4U0VNk5>h̤5IXo+ڃ奴՟P|ċ(D|O@%G⬓8'}<CUꪨ7k8=i\$ήAKoLƷ"g`u{?-"hȒ߃i4q$]C3XJd&~H]oB_MGc6EHQijiƉw]:FR˗/ABõ1#/kMX-5fT Qq/:Q]*8Z^,qo`eDKR!E`":QgP籰3;sw-u:ix}9&Wݫ->jӶKY".S߽U0̩$N -_Wx)Һ"+4( )9-VgJx^h\GEhVp 8RUZU=kw~*~}udDJ1EJ1EJ1EJ1EJ1EJ1UfmNk"{)r+#Y n:V! a{ C`ȝ"ǦaHD:%Fj{B= uӋ"B W( .TR\6{>]?^So8[opכ TzH۴͞I ?%Lr__2@#lT]bD@+ ~iT_xR:!8{@q)^䥙E"-uR$c^{43MUJsJ㓣|ҊwwD=xC1ShneǣlF,E2QߝcI89i, A"?IAH%*3UHyMc:!W?i5)PR38VVJ  \:uw:1/9;.e}}Qn %|V7 ?^v3.na (n{ R8#RzeY77G773a'Gɑel Ql+泭O[-4$_E;Wp>K&M/h*@T5 Rju݈ @‘Qxx:r|3c6@"]qȹ}|t%,b8u-wBF(PAJt )ۈ*YJjبf i8Iu;BٽqD-6`d~]SN^ȳ-3!ԕ$Y\GQg`[`pCxQ 3)ܝBl,jAbdwLͪ_r~~h${$8;扒HV}:le*1B迥~)s̝ Xʟzʻh}HMR(FFBRghbbAOZc-_8Vs2L6K8 *rڲP}3ArL5O=f« fR>dv[Ƶ®aIhĐ-o!fĐH,#O& (D%([¡(ϋC,I v2T%y, 3 uFt g7d2aFh#U:?fv\8,XrCJÈZ AX W"DBVXA@3pb3HL=lp!QW:9ʸz낛e q=T{B~(s]B݊m엩]f{8K!=H.J`/⼅:feRw[G\CjaOíԮ7 !`I7ySJ ^zQ*/MmrC2 [꺽f] :Lcq9Fll4CλMw|Y@pGwd8]_6s8/;ѐ <2E5;Y`91jZ^x^Xze`1H$̻fc,5a"FɔJۋ7 h?{m0L}uQ"? d9:iDLUJK'M,!!'i< xk‡ӄLѓx 0,T|`zUJ ys:ϯ%1՝@s48iI+84L3,}{pT:a\PY헋H1XN*Tw63ՙD){ SRTBN}T VCpMfR zqAՐsNP-*RycTt[T5q;~EA8V^{sVJL9=FP#n]є8:[g=*"[t2e'0}PO??Эw8S- romCu$F_:6p[曭Zyڋ$s)'FwsͰouބ(A:HĆ 3#`$Gu^䪎 3NPKUS:l.PKR sO( __MACOSX/darwin-perl-deps/HTTP/._Date.pmUT L[]O1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKwSR darwin-perl-deps/Try/Tiny.pmUT OaP1cL1cux \rGv\A- B0(iQvZ;3aIT"U*Cus{ %S`hGwzjMtnty4.Qϋ8K;AýJkԣ7GѶ:~r}su|rQ/4DrѭZŭXմ&jEY?^]]^j;E-xT8Z< n<_-? V6| . M i8Il%Ot>?vN,O_|{>?P"fKcK,svqn.=~P}b 3VNt)zf*,aނ/@_o-RV5i&ӧynZƹQ#dWMGl>D?~|7#NO,up3턛7ވqgße__?8~ymWh; NsRcRmua"#U/b97J[WiV54#M:/nIf] crx_3+آ5fFV-Reiģ)!0*u\TiĶ Z}_Ϙ,H':r&h 2gGꏲfbUHhͬ~kpت[ &n GC]=1ZXcgČY,tZ<owJY՜9,jϓxKj0MG..UXZ`nN GCF:Y"Ƨ#-6rP5*qPb\%ᶦ2:"kWU?3}vIoM5HI$قκT2)ybXO[ W xLb?g¸:>Y=]#P+t 8NqfTo^ 6w 6m=[=,9[3FYrQs͛ngg?©l<(y ڼs}`J ^H5y۶:+v-E2=;+dL-wc! UD{`kJ b[r#Hl'ѕlv:޵jW=jz;x)*0%ޛXo;ƛ =Y:nW~aZ|'1`R d:5lbWQ{$~v;|^W(soʧљi,##ϛڗuHق{hg=JR4ey<%kVةK# γ8!vj ,u@V^ӄq@UJm6Tc?6@hzt_t&7!s[{ڝ¡UoUqjgtT}̦?:%d _[u&A7jJ.Wjn `YIӔ?Gl4qځW;9GgbC"t{[҂څXCvǮ#Mp7ED=A-,rXѭ*{a${!cւPӺ2fE5j:bYW=Q  TJK4-f߉;x-)e!h/b^ -zỆ{m '}C3UH18˦~$@3 bE?q߁GvsWV8`:~}}l| | O9~r~:xzy~~|u|CGhl}p Bxb96GՁ_g{à,N~!A>q]-*Aw>p3U:7"@RB^#i"ZY C*<񅺸QONիWϏoN~Q DZ',.Td-Qt _htK:T;c(ϒyOز1+1k-[@, ʅ$/?oH2p)E($|3#/( S;._QʼnsHFmMlKbs‘Ws;u bu2kzn9 ٥V"9՛v8Qi%ít+2悕E)gk& <9T*-*&BkJ3L kEVzu IA0Qs.q TpW~i]Sem,}*#d YM:bS0ݪ5O_]xkr p/X&17-$Q:F(>g_@*}O2=Q5StC2AHjɚw }B "Yͅ $Y522KuSIk*Gl(3K)1m(Nb51R/B& Ab--vH{WNٹcoZy*(~J({~WmMzJ׫Әppޣ.c]ٿ@u#*x]x v׮὞Ps7s4+KE^JifQ?_"$'0JN˹"_[,0{q묂rRAeUp(ӸȸlEN T`DGuLm; y<-ȠK$r͕%2AX2D@- ux@MM$ةJgCNKTP)[RV+$7i=lAN9I6-18k;.XňTBp(FZ@,d1έ,=qs$Y߾xUIVgpBLU3nijCޤ6F Pm|'q'V_Ԭ@"2\"HE/nVX̮(np@S`~CDIv\UfО+Tؙf.Pus\-M.ڕ|m1|B$/% q)7\o!]?&M~z8btR}vc[&7ԃ|ϫMmCJ ={Zm`Q#"xj@KWǾ ,\qOQCjIL[ B1ĭH`T3lpIB@JrԠ`99޳,Z" Gt۫}:ACx5)V#Vs\ rA?h xQ ji!b[\`3Œcõ rᒾȼz#7>6Մ>RU77Ag 2 LT WI`+#y4)Ԉ.`Tܕ$WRlPf =89QK"! "}668J%Qq=Zn-r~1 ǀ-G^WC?_Jx 7?NX}7?z`05Ca#XDpye'@PŢ~w}&$\’V8gDj94z:<#Quqj0Nø11A+PS=mG.&pNI|r!uH}8EmE*ͥTc>ؔcn|Lq1f5Z\Ǖֳ*!B<8yf @=~|'66PEpE&G0ƶ$Ad¤sm:zi@ CʔtJWnۤ4|ʷ=6S3sfcLKffG?[۷r |t]7dC0QHKQN 8i6BMDjMLJ׳A\94*;tE^E"uݘK 8ޒ_'ڪ:VHSc3$/U89]_l}:IP wTgGJ̥"]6lD#G3(WyeTmB322S?-w2 (@ؓbw@ū8t}>-rh=H YpJGǽ )t#f2}IYxBEdpkqc+֣ï&)ih }lxh"$\Yl zcyj?LC{I\nޒ\UoN.oNi(zIoIeuXZzA:'p[a2] yb cCVn_,vq6I? r؏'9gmc[.J^O>%\?TrnU0q;U_Zh vahzIriDP ONoNYL[Tbnt$Ak)W aJ|HcN7w?g7]m7!WgNOtzLm#+DL e'@KF4[f!-q\K2Gc"s@/=Jl*)ځ&n-%ҷwzCY6Ų/q:9ZT\m 6!]]jgДcmY#-YI B ^kiYʩ }2 C_7WeWAUC{}DpL[L?;9?+bO}=*5o%q/ԓǏ#orW7`OOxz‹?^)*mTz@Հ,hPgE1lҶ Vd$u#M"A吝u\°aQ@5%n0 4Hba=E~} A|y!#UmLh6@H=X˿`HJ_|_~MPůȲ!q!Z,~[mo}x4(5 W_}s]hm_qb=_Έ_(zRNGp( λD 4ݙ<h4T b|GcrR<55@]k˼YcZ/6~l Tu.j @#4UqoE;5Eo]CO./nΞVSTgPvczK䕡ŕ+[\5y8^jgقR9th^\`oVIߠO:UgL1MS?1;Mkަzvs7 h xl)cuD'& c&,4u"X!QwMI!OYu]d=Ie4QW8K&ܘ|A$uuVn]l7™o_c|7eh7XI K^@;F_[V#u7;}{l|\ݘ/*m&mYҬ&];ڴH4Ԕ+zuXW/o`<{uv݇ |•vbw݇>bn۔ϓe{U|wL~ݕad,sQq6Lv<'P{oRAu_ ]Wֺ?T!)kIb%*jnݯ)CS͆b中L#\w0Cu)`&#k՛+)ɩwŐJj@"@|0%'Fy#v1]r| Ahg{yΗs-c EaZ YD@So[K"54Ӝ5t4q\^]GT;80g7-7&N z &[eaGmyKF봄uxSdyD|x0`ƺL*Ƕ"pu4?бfXš:x>uMPE` ??-~.@Ď*=[h<"ș%W4'{9A(4r` %AM- ;Ѷ ߉%Xk/ĽK wR dNLj`wįGԊ41rD9FPK?ȮPKT& __MACOSX/darwin-perl-deps/URI/._IRI.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT|  darwin-perl-deps/URI/gopher.pmUT hebO1cL1cux UmF|SMc0oIzMD$U;b-f n̮.Ei<3DȌ»^oƳ9}: ĪIf.ҦU|FpC䒂T"T)uPK s: a*5N<+}gJ\q‰.Gqx9êLV r;E;|K7TjvȢ)JTS+\ðَeYzMjDI&jeU6`Yt0=كq=;/a-Z8|`HW@k"3| pb`w !Rz  YAZdH}{g$Kf}ys sߪ/gWs}(Dn4Y!^4лV3!*dG^qѱTXݫWylT?U3R//WBHڰlw2OÑMo%C#u0Z4N'Iⵥ7w/T'ݴ p4: P< Q,\:,1eUQI6hڈR~}iӏW; C $3ޫd)iLExq"$ g!K0\6t)8flKg9p#N6KFT+2Md$J \X SM#J5:z&_ϓ4U!.=ה U@ xEX9836y'mp%.X+f!H 0H$)|%,ƙ,Oc˘ {T:g4$_xE*bD "駉PM;Zhjk \&w YR!a6NAL>!YPPؾq}-]-SO w^?mCnFN[#涼33pP#g M5?S\E1H>Y/~HP,NSaӔDtNqbUjI%d-_=Xi/@tDp5T鞸pRG<3[",iXS@-ٕ)gPƹo qEٶ{1_bAۂ GZpQXjW2Tyd{I]&o8LɔK2i_QKIN{d b|20^Y06#!so\Wڀ`i@TDQVrv ۺY24kyӧuMmk22$GPKY8fD4c ]V3^u/VϟM4~NĢ8ђ=89aar)}yVǢ5۫MFMMq"\ρVV18O"q*\fQҋi Z_d|Og*y?n ʈ)-jnhƘÊ1pϰD]XFpc3mqpݲg~9NcKP@|OHVT[o9&I'Ku&XgetR0fRCG`ަu1Rq . (֖V–jZM@n9iLS%.CٔfPsdmi:P1(րsŧӷfCmmmw?ymj ڰ:v 'ϫs!~z 8/~4/-{y_Bǜ(S+뗂Ld 9]_^|]4W&jKG n˫ nuwv%۩JI.#ԠsAթvA-Ed?5F>)J-ߘZD*!ȹ06v]5yv_wGk\mFo~vkS\Th *s̖F3( u?F:i$5vYfe[|@^xi—湨 NpX'0 BU~S֤>&aPa Q{am.&NNU" s-c$K7,0loQsh6՛ V^}):q17 V5l\:2Ht6,>PtK7v:.+bbE0p@rAzGa .:'ۚX!hJ6WT6Wuح+͒Q]6 ܾE+WWzLFg8`wAb;! Q5NhLVo6Cb`!N(GsPi}{ V6*29S+ƗI\=ܓZWXm>>W99o_%g (I5K*P)~ZQIF|}Dѡ*{O&K*TJ GSZ$.*9Η}ErhLBIZxሄd $D;*]ia^ +DBIJ&4v$7 `3aƄ)M̶*O-PvyJ^1Lr(Z ^1w!C:t6GJ+PKZPKT( __MACOSX/darwin-perl-deps/URI/._rsync.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/https.pmUT hebO1cL1cux +HLNLOU ())(*-NU(.)L.2ARE *aA~ zFP-Ey% p@ťI )i9%E% && ҢT!HК PKUg&wPKT( __MACOSX/darwin-perl-deps/URI/._https.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/sip.pmUT hebO1cL1cux UKo@>_1Kdir`yIU*JmDZ]#"+"k r0oPj]DJaFO \G :Xe# hfHA$f$@*Du'3 _`;)O\;sz*!4wdtݢ+Z3](sAӼǹuQc7]݄6TAT:[E2QHq9zae~l߬eLV|Ff9(=cXT&j2PKd ܫPKT& __MACOSX/darwin-perl-deps/URI/._sip.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT! darwin-perl-deps/URI/_punycode.pmUT hebO1cL1cux Xr>s -@HBXX`1s @DU>8\]yrAr˛X7 O;]2o}I{/ڿ ǭ32|ZY:ΰ:=r-T&{٘-F5r^ץ oPW__U寯>]A0 |v!8`^k5i3G:Q'b*+^hqi4QxSZP"[|Z_Q6wz^{赍;Z-?ͻ֍:R,%mZdU8hhG_8jV[B*)Dp(t{C8ꝶE.5 g[F[^<AEbjHU3q 3gz`[˾r^ۍ̒-UOxF GĠ )IW+#I"P26tL-Jc*\sшW#.EW(Na[rXL[!=@kd*VƂ|<f ްb<*fT|٤y:گ36'T Juk#iY|<&esydo<ڪӹ}T$2ߝ}Wyzg5c05*6TFK[>c8gC7X^k)uVl4shbI:d|rlyIݲr{N VJZhrJEbF) ϔݖ M\KU"WHԐ=(LzBh) ƱG8Օ0)6WRNKHUAV "Xjh9 " }L&A|"+8@6~Gr.8[<[qT Gt*<ʐZU.e :FeMH6nFXR-&}$-˩UC$Gjm8wѺ!Wr#Am2"3(i_rpDu4jwG#hHđg]Nۆa,p 9B4tŕΒIinlWs+{ѩoZ-WIzNz7,8Q4U*;[M%c4P)̝1@9gOxo﾿?U$\.`z'O,*YuKNHdkzC6ֻv#<׏GT!vt[*JQw;gNk'y$5IIG v&KEw1PhlKӊJ`[?~,۶"#oቸ"rsmjs'-yjDv\س"~_\ LqwX,&39XzվZ0X6{rSx u-%]YF:u)7Xy')$<>/.NY]|1o39*†"Vڸ̺c]~kX:)\ƎT,ٔ-v42QOuwGҍh*tMބ!`\tkSG82PK@lv?PKT, __MACOSX/darwin-perl-deps/URI/.__punycode.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/nntps.pmUT hebO1cL1cux +HLNLOU +)(*-NU(.)L.2ARE *aA~ zFP-Ey% p@ťI )i9%E% f ҢT!HК PK_wPKT( __MACOSX/darwin-perl-deps/URI/._nntps.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK,q:U darwin-perl-deps/URI/file/UT t1co1cL1cux PK,q:U$ __MACOSX/darwin-perl-deps/URI/._fileUT t1co1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTl  darwin-perl-deps/URI/ldap.pmUT hebO1cL1cux Vmo6_qp3VMb#^$E7DYdR#F,iR{.t6rY8=:z5+CgWz?'^ % KFXa>,a/讐*̍du5\A$ 鈫Pȯt&'*\qYYn)qoE'U\&3|Pqj#C%S>jy2=:f*PsY@-59wc r6ՕކI|vjG G*=.|$zsTF*nX.r%eIinjv9D!tk9\rO]m$]@z^ `{;l!>бC wS5/,E v3Ꜷu.; C}d&,GN{FL'Z^b)2뤫}yxi\Բ);E"^pk`c0='ItRr1%EQv3k,&Dؠ"ޑ7#xK:>K0Y+ 6\qi40 ¹i]D ', *My?lFSvYoYgKYr=VRЈzX㴁H."ۧtnO𢡊UC곻*{fWcPKM'l PKT' __MACOSX/darwin-perl-deps/URI/._ldap.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/WithBase.pmUT hebO1cL1cux WmO#7)DD @ %mEWTJV'tK\%^r9{ ྵ|x:Yks vvHfВPyRXvТ55[vRkFW7WpEPh3+]ΥO` \[CD|Z5igNbSTi;a>GN٣ߥThTk8qZeF"'UE2R% 橰 8 |ZP3kaUSq+jZLb܈U7XEt\$Z*s.-7z]SyrN;\YI:(03"YVzV8[U \5h2]uT́,.'PA\~x5ooWnTj44g'Ҏm?ӜteGYݳO$D¶e_h2I%A 46]Xr~w-y9.O;L!}.(NuLNBy1ɫ(;}t@i28p q+np c6_i<@V&"K ;PK1  PKT) __MACOSX/darwin-perl-deps/URI/.__query.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/urn.pmUT hebO1cL1cux UO0~n[(4Eh{I*BL (D&q; vJwv&i|wI@ uwg*)B ' h~=\?]1>vZa%'Z.̋Ƶ3I "3ALЈM(1 ;qJĠafvYtsry|z׋Dsƚ0'Yo,JTD]>t6Q2!]K[EW wy&o# >ο@i"1I!"`lĨpҵ;~CnoL&>ؚl(8i h :XƔ^o6v"m hu\@2YHhnW=;E!U]D& =S;$a$bR}a_pq=UiA0X$~.RvRӲ8PZZyZ0Bv喝{-yQHU0¶楸RcEe6k47%8XYN])דBY^tVyl(]p+V~S[LJ@1ڴp갱i* l L?Y5-Kqxp aU91X >uQp6x`^:|i#ˁ-P-ug(rkźR;$1g16(bͤ0&s .UJʛfꪹѮo[tIf;ժV6Zo:oPKPPKT& __MACOSX/darwin-perl-deps/URI/._urn.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/_generic.pmUT hebO1cL1cux XsHE`iq$[w6xx]e?䡒=Yr Bۯ!@`6lm=Mw," `D*r;P]*S MZFHKp|Y 4*h)eXJ(_GY~txxݟ;]\_\{!.Ght~<ߴw"2ŰJLP`0P'?Q~ fcREx=p݈ѫ}|RsN3*ReK KD V4H]?h{xі#7 q L4]F 9;jw_Vv[V* &U:ˣT: }( w"Q9,=p]L҇_Azr>`?@3-OonT\cXsSk06Aӻ?k_dÈn5$?M_4\EiZZ6Q46BbűVvm L"9_> 71&VU9h b#2HkU$* tZHv vWuk$ڨhÀKZ TJAtADL9?u*u(0k8*{nxuփ-ނr,2Mqrm?g !ENFug6>MB}^ch pckkmn.9ѺDX {"ʚ?2z@Kt1YkmHi{;MPh) &>+U"Z5Z *D&%vKq!Ɔ^t{_{mwfی^w(Rkisk 1TqTJø>%y]xkYf¨VѨ~3LY샧GWoKܫGѳ#(dT^o Ho(Kf,2PEuHa4k$K5FR[#THZk3<ͬ)ۖl#.TUV7sVկomXj&/OgH4b2564mSPGVj׳ԡk6uNg_aȉ%KƐD1{5<\z ýĻJ akZ+^ guRNMBKރm;K# $%+Q}GuT->m;F> b٪>j˪3Z+˺+CIVZ+Cg#U͕y$ZNwIVǣ7=>& W ZT O=7h lTB4@۩̥y%$kg8W 63~Oi[uf?PK+ PKT+ __MACOSX/darwin-perl-deps/URI/.__generic.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT ! darwin-perl-deps/URI/_userpass.pmUT hebO1cL1cux RMK@=7b6K_zQEl&]ۺ%HݙT(Cؼy3K2pXq*|G\RpJ?Rx3-ZΡ;]ĕ~q6-Ų)jڡ\$+DMZuw5a4*X7]K` Ნ"d} $`7:q43&|&H=O 72Ҏf-.h1T6?N;hAzAz״]"q`VeߒZ 0jN^˥YhUFFIjJ.6NӲ*fIAft ~Uvx,~|PKGz7e PKT, __MACOSX/darwin-perl-deps/URI/.__userpass.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/snews.pmUT hebO1cL1cux %1 0NԡѡBEW9k(ִ%t{oVE!&+h۠]׿Du^oRQ$pW; wމUj 3!7f٥2"?i0 Oh؇8p=|#TG?3~PK%ȾPKT( __MACOSX/darwin-perl-deps/URI/._snews.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/nntp.pmUT hebO1cL1cux +HLNLOU +)VPPVH)JL+MMK-/--50*-NU(.)L.2ҋKT\=lM ԭ!Z RJ! IZsPK)sPKT' __MACOSX/darwin-perl-deps/URI/._nntp.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT1  darwin-perl-deps/URI/Split.pmUT hebO1cL1cux Vmo6Ds.y/vy2XeXgdZQR-,@|x>h.O6N8mYz4 E2rb)-U\x&R@DF[MawOg"itsvͻqq Ÿ+ҦfԡUcwQXG--E!h-SrX Ejh! Zfb.mbC^ H7P\X 'ᒜC5)~WMny'*I&jƉXЍv0bd۰U"B-2=~Kw/rKkph@aM&@[Q؃EBtf`c -=OQǽyޱNKe-eލG7M߀Z۸d1}4 .^O&/ca !W34pIuc`;K O{뎮4mОے}=]bld JeNjei(-kVgZ <+4r# a#(:a~2Pt6pTB9;UpRXxy%@vI}\s+FX @+P_hZ9ȸ@zvkb$ʂ(Ď[z.4 S6vKfs /w֒=hHYPMh 2ˠ|X3nUAr3S9ECKnJErL` JW9u 3Ɨ:2T5, Aϡo^i7 Cw%,MM"$ƙSǟ /qBuxj pvd.'hwڑY~==;rig^&~kn~}}>*UVU!^"O/-MaJo[[l>T./דK\ol3wa]7unOώ__9~W`/ Գ-Wd-utXfvfL\Ǚ)K[FZ<}P؏g:"x2=CǕ\M#y0qx5yifaŏ¢L\Ύ_5w/Ǥ²W}pjy:WZn?t阨>}Ryۅ3 rB }# Aaia$ŷu:B#/;GkJС Y#SWsWzΎr tFzki9~T\lHwprwL;vzcǤ@۝2YaMF"zD 7$ПaxRDt0>P#v* ;wF$Y,K"Ӭ<|z(ly ] ]I!}77J=pũRm׻TQM.:7 [g'^^O t[=R[>#IIZ3rUwʹ6=MB yU q^x:9> xE) 'KkW`A350Fu~,pQ&ɘYc+ W+g DO׭qMF=gN(x<^g.!)8 F7DH{E螃tL^Y: + Plp%@r H6ƪ[ƒEs< oWt_f &Pq)'x (! +:ҐCIXSzWt(%ULI{Xb iM RXɴM67B%;ZcV=5ⶦNpr vk{_ai٦lZ"nԫ#f8k p0y[sKܰ볙]:Υ|_CHxrI8&z^^/ё mRH Rj"-9`EXMl6j%Aj2rKŽLM\W $ŻYe1=Qpq"- Lp@? G8m "v+_L ռeAe0vHQ {ۯz&VM#ui;}o]_X\MwLHRtO?SBa@`ƀf%c(^: Hn@SvҭO={kVpK}bc̹%h TQK{^H#Dhף=Z vK^pz<~t1pf8}|pXn w,<{AݧǨz_=)ԥ|^__x/TdqR.c%vz}wήXtX(H'} e]kYuGD{Sv~!NYQ9WSP}֍|LR3~&N!J+ݥ}Lr-&glt D@)ɳ G> 9ȒigMSՠO"H-9uBU…Ei;RnV-XA=$tF"6z DͣO5\niyJ$&dS P.zu m.fMU@V+#j]P*9.7 D*چ&1k~Eh: @%Gm{ruyvczݡ9>?"( 7X3к1!OR531iF)X3zAt3XG> rƂ#2 VՋZ$!3,?2&JeV3Ne+L<ɨ ڠ|٠X]OvrѶqrv,+>q_ -P[HĢ@- 0vX 8 􆣔Yc8 #K$+(֛ҷtFߨ|CL&DhijvԈCI4kh仉 `6qp]3B6ibEPf%8h,uPKS= &PKT' __MACOSX/darwin-perl-deps/URI/._file.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT} darwin-perl-deps/URI/mms.pmUT hebO1cL1cux +HLNLOU -*-NU(.)L.2ARE *aA~ zFP-Ey% `2JJ @ťI )i9%E% 榦 \\\PKKJKo}PKT& __MACOSX/darwin-perl-deps/URI/._mms.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/rlogin.pmUT hebO1cL1cux +HLNLOU *O̳*-NU(.)L.2ҋRE *aA~ zFP-Ey% `KRRKsJ JL j PKK 'T O %sނGH"R)OX-*MreR& ,f OI3 t k>Z^}er&m׏seQc"" 실"}KhJ,^0i gpX߮f.\* OcEX?䍨t mYLy.Bn&p< YB&+ SZVm{Or-&N6B d)d:*} KKIc%crUM%P:-rE "%|-&7z %G,T*5"aja#A%WsU,&[Sʲ4aloDz`ƙoY~X3[1J_4  %7]\v:9{>(My8hIi.ժ\4=[VyJIW5Vrq<=w&R )۸F-}/0tW"R9pmgk}׿z#4 ɻjYɻo$~O_cm7YW7>s++Zג )P+MػAӏ]}5$iotZ?@csկ8( BSXp/i}j6z7FtXa󫐱uVP^=bxڸO|iwr- @ƕ|\% eQtfEO“Y4*DB+w\3"SlfYy Vo'tT)N>?wq2>Gy{Zm11|gM:~{wrv~?6݂TXmWQ ˊ7Ƽ"=[a?] ~~^]@i+|S 8ZY¿p@P(Dx1 ^H!~CCbʣTShJ w{X?:(lL1gejs|}b3)2iGUv%^yX }phO.O ͝b%C`m [*HF]^]GC>dh}_kB]#yJ8ۇ!grNc[g<$a¬a}XN Hty*ق 9{1ZBsޅ$Kq@9Hr᳤rEqaƻ0)U=Ws)<[8O~|oXazVn&$R >X&4eNe.uWRHFC,!&]eeX*s@UE8ZZS h܈ hJw]6K0u ؀%`+ \pѦ \sK:KW |=:qmy45yļ)yXW&mҋُ0rHꄃ{&dn( Ԗ16j@B6WR@*$Ȝ>8;osn Mtb7(":J.Xp3mYŹrk:^ EѱGmEh]IuqʮybtmD@=kx㜊J<%s+('T'wPKM"oPKT& __MACOSX/darwin-perl-deps/URI/._URL.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/http.pmUT hebO1cL1cux ]N0)U$EBB譇^*Ȥ8^ ڙog5ypJq,1g,SҿRK3zݧ|Čpvd6rs{S|ot]`Gf$} >9 oΪq&~ZE8vL2-&q l`ՙ/lE2PKBCĴPKT) __MACOSX/darwin-perl-deps/URI/.__login.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT} darwin-perl-deps/URI/rtsp.pmUT hebO1cL1cux +HLNLOU **).*-NU(.)L.2ҋRE *aA~ zFP-Ey% `2JJ @ťI )i9%E% & \\\PK_p}PKT' __MACOSX/darwin-perl-deps/URI/._rtsp.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT" darwin-perl-deps/URI/QueryParam.pmUT hebO1cL1cux W]S}F.vv*؁b Uwr1 kowH#ۣ_ϴr1y7)=t"xjs .1o@7'>r +F^&LYF£H v6 > #45OT*ь: 6I|XIe*w}V&V#]SN" _z2 )$mO`WMfD{>áB>'uۗJF0ɿ؆P io]|Ġ>Z &Wܚץ٢>`;0q$Y)c ><׭ͅ\_BRi̪Tx{)xfB!FQ )~{ w*806ѱp>_\^yŇ˯}.Y|;DujZk#,q˵ZSע.#87UrNzoH1 O ESME/=[,,>oO/O/qZ8zM$f:.f"Ƥ=\:VSU3L纰\'\ b@VQ,*ٙe<$ +AX*w׸xƲV <*^fiW)[袐&'wݜQ8SzN;ĒyΚx*Tc5~(+gpH3uz(Hܰhѩ6SU;߰{寔QG*z:me3&ia&Qq)4FQK0pUcfXbNVΰtF$,I9r *YqX[q!K|7;ΐF o"qSŠ:W̋ yd2K}PX k~lQ%G{*&wز²ٌGXyĖ" ,tJit{|KdEƽUyZ; bSoݩ}7Ye=O (t 0-8CA?;-vqoHu 1VjæcWjۀ=&S21R uY$S5Q4 ..!ko;acqs(⣫2cWK`32/H)6'697SL5ʬb^ڋBa<ƋpƮChFD$E#Kr[X% 1ObON9N4 #xOаp|~oApEA^)8$IiPKo†PKT- __MACOSX/darwin-perl-deps/URI/._QueryParam.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/_segment.pmUT hebO1cL1cux MAk@+6(ЋAŃ,-2c7Φ=,;}2vX섳#[s-׎E+!cˮHQϯɣH"axy5 wjfL#7R-9jO;n\k,d@_veE{Q $8!}MWzܞev\]!x_o_7/X"|BwF[s%("yqC麺 uYqх0O.`0P]%n7H>0:6gc4?PK$ PKT+ __MACOSX/darwin-perl-deps/URI/.__segment.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/ldaps.pmUT hebO1cL1cux +HLNLOU II,(*-NU(.)L.2ARE *aA~ zFP-Ey% p@ťI )i9%E% ff ҢT!HК PK M\wPKT( __MACOSX/darwin-perl-deps/URI/._ldaps.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/ssh.pmUT hebO1cL1cux -A 0xKL ش$Smt{j^zJлNl/lg Nj֗`v2Jh)`:;LUu%roL5=3^6B0\2 i @Jfd PK!,IPKT& __MACOSX/darwin-perl-deps/URI/._ssh.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTb darwin-perl-deps/URI/sftp.pmUT hebO1cL1cux +HLNLOU *N+)*-NU(.)L.2ҋREy% -@"0נ`O?[uS=C#5PKU'TbPKT' __MACOSX/darwin-perl-deps/URI/._sftp.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT  darwin-perl-deps/URI/_ldap.pmUT hebO1cL1cux Vmo6\RXM]'v(0lCòԠ%fC(qaPxt)rUpSV,YQzDZΎRJ nx'C}% ^˴N5+6)tI) JHDU*+tgf7^H.`-9d2 ˧Ae Ԯqo%ҠJW |ݛ_<~6>8|\lW&f9_b^)n41s.y0YbWxUbBl?tor)J?$  v db>\lkERsQy`צI}NމE)|Bމ 8Fю6_ɍղ\mtu5:IT Kk8gӞ:f>LHO Jw.M;ͬ7kσo§!αSu]B/ٺYNEOݒFϰܵQeUz/W5S%" o0 MpC^WT`o}X5l?plC1ODDD!܀g3{x  n v#j+#D-+!.c\M1HɊyep0R&`Lp>:N{0ǓK;.tF,lhHmQ#g&VDQ0OatϨ-Uܭw\^ s)4,JZR~UKWC+W8@o7X%qq]DȘZua{L \**5F ^M$'62&xZ2P׼-[ 90Vɲ-L7܊e{'u (SZr4c~kaڍI8V@q6-`GFO Mca.מwGO:SnrQ񝇹0 klEDF`ltCͤUg|@SZfpHhs p v_Fښ}1d!T9l[at@vFQQ[ ׈ytLK=QQPn .Qi:3)yDZ%>ق' >A(`pU'.=QFd9Ny͐I0ԴQM(-!>e^u15 L9(LPK< PKT( __MACOSX/darwin-perl-deps/URI/.__ldap.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK,q:U darwin-perl-deps/URI/urn/UT t1co1cL1cux PK,q:U# __MACOSX/darwin-perl-deps/URI/._urnUT t1co1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT! darwin-perl-deps/URI/Heuristic.pmUT hebO1cL1cux XmwFlM@uSݬq8`j!doΌ0nI,43/ÜD뫳fW%Rrr>8~v]VgsD2% 曪 ~\vϺ3O%O /[Rm9VxgP+>lfX,|{ųMj:Џjss&vC4xpq˜6k&eCƜ+ Ѡh ׾kwO.{g Mb8BI|/DRGS2aYb2Jc2> TPg 3u"3ֵ 4SEy"R'47O7GUʓ-d:eFS1C6rDH܋̐c)DY)&"`3W" d2x<Jə ylAxd 1d$^((fq t9- $&>"c:J>[ 'm&"]LŬ l)H]q'4Li`q9 ]cJ^CaAQ.],N$"Da? <`HYA9sLGP#lW\I8HW0fs|bN"2vsH6*2(bW%4ɰP&axG1pI1p _@b ňr`׃GqrtDiKiMa:J!9dJ *2wIw?]P&nY&K<a}5wzq@6B:`>E.@0#N1FD04)14g]< U:'f׻/{v ĊR@HkI5)I'>Ob"q"8i (%~"]t jH*E=knn?8nw^}pbCTs>u%Psu5 br<Nt! }%P4uw@WqT(4Щ&2גli@٦`tZV|׋(C] 9^7vY KK2Zr2+Fpby9Q%EFaesQN:NQDN):XcRse}( (( qZGlқʔR8qt]B@Q`^$ľ92h-"Zfn?9םC)}e7Vu| LDW}ŀ+^Mk|} GeCAuE`,)ڬ2`rLD) [ TRb 5V=$O{u(L ʒْd cH'G Jj#l B|Hw"*© V=QˌλN}fzV@U+ޞ2}[FmWռ:%]d8ݫ WUlWfqi՘[8KNGBRhT444Qad$>Sb *z9y*py>Tɡ8C>JRuw-FN>|BקL""m6i–Ge)FIe=[u%wWQ|*1Ρ;LS 󴰗t}4ɱg@9l'S;ݠɪc>pr2<9nu6N&k|WCͳg>"netzgƤ{~fH,i>4~d.~F_@} mјP"-;_`vԽCI4"ӖSYrde{c *H&sdwʺw+}0TMdn#*~jl,<&S{F˾BojB#W)f*eMv)N\ >+xd"T)x{"\0" | *} 35Û>CDŽG7] EoANP"OM߿U E+OW/L&FTy;},Fܛ}6]aW w[kM?W[qh]Z?j`U{V?GSJ%n -Şw(o?ս˫ڷsUO ]mkF̷RJ?覈 nZݭBF{LqӬߧ/Z6M\#cn{vmqtFB!E*]߼ܾo}T\ l_վ,ب+/t+k4e.^f$gUY|FRf٘W*(2s iH^-أ=\|̬vj)(d^hFl h ъQ~35\l\}Ӳ|uv*nh]\RKEB˦:5=ffE̠RF V %'trzy-@Sj+ SA.q)ԓ#E(L5q FYMPj$TRhmcP;ȢB;;g+;Eq!lcpN-5WLi)3ai`7/o ``J7ᣥ[\Dap8* l" ik"Q PK{F) PKT, __MACOSX/darwin-perl-deps/URI/._Heuristic.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT>  darwin-perl-deps/URI/data.pmUT hebO1cL1cux WWH+*j-E'j^Kd$f7ڿf6/w};/;.1ـys{gUA*/^ZV8(OW%bH/L(\5;)j[:|9>ϻlGsol/SCy,d&Fܼ'1[pŃ>Q?ʘ}I9^ɧŸ~r>|*}|^,vA& >#Ay{s! \'(ש\Wd(wtzB~">$mH+>Fo*'g wVµz6C2r?1y\ҚmY2;:M"C0ܚ <-i4cA0{6lڍ&7dzRԛM aiT!17Lp ȵHH8ڱKvi%9S2Sy2@~ 5J恚M^ޅ7=1 v !Kyb=!vb k S ݙj0L%x` bnŸE% #%'bOU<5,\3GUj,Hj]}`<'%Շ' 标 }0z_:QÌlb@ʖ2pp~X+ `gѾPC7UӸsOS2ۓ3`e~kYC2Z ˚cHE|tT)>Yٱ, ŒyekdmJXHWfS̱E';t,VGH:q]Hz c9WH㯰baU2뫩4F~GO":"pƘ166ǘnx< _)dZKka{6kA r}dw$싗nՎ&;<6Fxܼ{.wh,Iq낕^]/wkݽmवyu~gk}{=?6Wګ޿^|r=د Ϣ=Qr,]]]ޖ#up ۷ZU|q}^N?hjjHa =gYdbaCWKD/cÉqadm%K+Y h|vg+). ر>E=kxW0{es7Xd,ʈD>NyyrH1ʠٿK>_]̃< zk9i^? >8K&^cAd=jk4Dsw>z!m=R-CGX){Sjq"ʈك9%_ h@ӶCSA}vs<|C.I"C 孭zBjL@K(wA'ǽe_o^L‰%EKdueb}B i28NmȳEtSPK|ܜ> PKT' __MACOSX/darwin-perl-deps/URI/._data.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/sips.pmUT hebO1cL1cux +HLNLOU *,(*-NU(.)L.2ARE *aA~ zFP-Ey% 0@ťI )i9%E% f ҢT XК PK9^vPKT' __MACOSX/darwin-perl-deps/URI/._sips.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/pop.pmUT hebO1cL1cux Rn@={b6DS*lbR\LN,z(|;;8v.3LfߒhT%Sū-@W*UW\hXa}~{&п>GD YAhc-On,)XyFeW41y` a6Z} [TU4#>)>?™yjEeڗ4""5G8ɴ]>P)V1vo8s%#s5JϤ_˳ V{O,|8?\EvT>)C=#uـȭ ^RŠ^^:zoj;. 37JTFI G2UbXhۀlvCݱSω7Z:^nApV2<kح^{|"q RJqI_blI>ߌlƬ;Ea[#PK/3PKT& __MACOSX/darwin-perl-deps/URI/._pop.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/tn3270.pmUT hebO1cL1cux +HLNLOU *3627*-NU(.)L.2ҋRE *aA~ zFP-Ey% `s3@RťI )i9%E% F \\\PK-s^sPKT) __MACOSX/darwin-perl-deps/URI/._tn3270.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/news.pmUT hebO1cL1cux Sn@}6_1ݐ*q<ĩ*""J_mb.]Zi.&V3g9V4+W)gRL()m4eMV ycPsRZŧ0x7%kcD1.sҊ׍W<9ó4yCe98%h]RL&qNzutJdJa,Yv]IQWJaf86G grmPf .dqp鴀>N"R̵T튣CCJ}}Vb%Ms}Y B,rہ@w\p[kU,kÌQ7<]9); ޷a à?\һ7E5$\1.[*% 2ف6 զIOg'GêZl!Z (KG՗^ >-z^Rd|0,,"kV|b_1n( ڀ=Xʶ[ޔ &sU/FF+6+ EY( 5Fl>7,wB9QurnPK2gPKT( __MACOSX/darwin-perl-deps/URI/.__idna.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTk darwin-perl-deps/URI/_foreign.pmUT hebO1cL1cux +HLNLOU 򴲊O/JLϳ*-NU(.)L.2ҋREy% my@@"0נ`O?[uS=C#5PKmy\kPKT+ __MACOSX/darwin-perl-deps/URI/.__foreign.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT. darwin-perl-deps/URI/_server.pmUT hebO1cL1cux VmSF~ƨArfZi(;e:ӦvɇE#䳭-@ 8{wz1N![w{{=<[&w8^*k;;y* ͒0\}'QR5e'WD$0tOM`7 3OB/?[ ﻽ }j4OgykO}0K:SLOci0K%±N-6ct;jZfiqjaYFbyf4-LOGw1Ug"Ƞ#wX{<;&"k1 zf9Et1OB{Qƀ~?MF#xA]dkm"&^\Au!}DyW6PZmK&f߽TTF ;K)HM' h%]ɰl B?"BڥO㹻+iUzhpj=N A27TJҹI֔5~lNB>g7BUjaVID ,!)ͨot1.k.30$_\/#XjM6L%ȥTf Xh7(t|5Ƚ\+o7tdn$0K~PK˨ PKT& __MACOSX/darwin-perl-deps/URI/._ftp.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTy darwin-perl-deps/URI/mailto.pmUT hebO1cL1cux Mo@W )Bp JD)"M/)B{71fw ]@U}{f<<ޜDdJvt=˴0S)%thDrƧ*tQHh\ Chw{vXIeɼrc*A f+h)%A,2Bd1,$R^w1i@NhCф) Y "W tJ%@h+ Y6u]):Zl n@jڰ3Q$`}4$EXfY;c{miQ>.v"'2k1t[3Vv7A@΃OAMЋZ9B[jjw?{[w0zc~ВĂV2g9fGjlt ;*2ھwH˘V3m5d ɪ-3gsˣlp^mw[ꚐjAD- ˨NBNXDAgY 䴩h`"MȳBbS mGFqlq|T9oxC:=Ktg`-T9ӠJ 6P]0h!wcCV[-T!qr;wC2ֲ~Ӫ}/tPKAE yPKT) __MACOSX/darwin-perl-deps/URI/._mailto.pmUT hebO1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKmL.! darwin-perl-deps/Proc/PID/File.pmUT E[M1cL1cux ZWHtn?BL3Y:S˶YRT2~V$IN[㻏S!yADK$tFߖ2s8Y|QCWOZpJy""Iy*_gRBdzl%S8D`gJѴbOٚ aJd*]jǛKFE*8'aWVBbmzj*&M9&.Ɩ q̂8 }*nT[E,Ŧ2#S'4"Y9  b8 ]0%rfyd- .//{p4:?Hp$/Gq-Xc)g+r2=ԫ_8 yf_7N 65TdGs)F`&8kUlny~ߦD~)~PqN~u)^:BvCK G)]{Pr+OБ$Ys2ƙh#ZSA> g`ybfabZy6VϾ7/ZM'r @?e(f<%*)L<\×hef rp`Br-jLyWxRVH.xa_w괽oMVpkX\+6}`tTx{$'^'C$KuB*A eP1;Vob0<<3C"XL|!w{z$9$x㑡.^F;EvoqmGX?||Q5(<) sQF!mw~%kmM_VB,H5ӭWu'BNնR&Ay6)񃕧 ő*0d\ \/{…<9X-?8/Jx'jF_f!9z-h*bO 'J'#GBPaΰE4/u>))ž"e_^lwßv-2mix$ί {q5uMO dl7U|^߶,8[4crbݻd(5+r7fDz)X,;u!(pת~-N #(tm +:>>Yl 诶f , +V <1)]`õZkc^#2L#rlvOra B xp).5 %˂,Ʀ,c<=X`ͭK``%VJ07galpywߓYBJB&p 8 brHÅcJ0++Jæb  J. U<)XŨT1ӎcd |R>;Xa%`7\#Um&HP} o;T,?7=Yh| r^$:2I PdhtʏsI~{os< ͪ WUdfT4x&DP-xdʇk|[^k6p\0MTMm(C#> ce<4lJg``VABҥ{wr;4"Ѐ9D%ߨa#֫ ;cI(^ٸЀO xup3`W.A`ijVM= 8AX _MCb6\NQoM;3'u=d[Oap?nِ2_2@lr[xf`Ԧr^Y;E[,1fx'F>ZW߫V4^ڢ\ S<9 >PiFj-O6aIDT3Xkv"2%PͨiӛDiyMѣS5$˸ []\H9ѨvLvX_7ZaIuiLѭLJjߝ+Ihޕt&l7EnI56LsJ)Y ^-l(+ʷ>Qb2הjJ϶NƠ Cn%2V Mbu]o1.B9+7i: )%NE)|C53)WV#f"ͬ"X3sOn,ϞW_[R}`<7`_6o[%e?yxž8wB=$@Ɛ<%*R UDI1a۞wS)g*.{hsWN{g.V@eKE)ړ4 uY**^7 b%IkO6DAm,X5UYK{$T/y!3=nvw>>`&W)Jsq&afsu Ɔ_WBq{0Zfs㐭>MUCj-uBʺPfw>\wST=VCNؑ[h>M,f(MCjn.z^vZw>խu:7\* Ռk߿>?\#ˆ?M2I(le)YRqW5ŗf S71E[my#P"=.aIw>Կt: T@80;ѕ^dHZ"? f iR9dQ6I_7.WaCe] |Wm="@A~J$Ai`1mK.EL:t'5M.E)vl ‚wnM CyT]dXVMEZ0mK}C>εh: "#sS FߍWGE^a˗Αhn # nٛ5NG]ܙogEԉ=bEi]Y4?=6_4|>}Υ>nqhnM8jTzԅLmE.Q;BZ <ɗXvɭt@fTz l@3zP?iQ`\[6elZ.:LDLm4ƭF ؈VZ^i5(" aZcM(ͳEllzlB5$`Wcɣ'O}TH&rƢ '' #]ݶIiMȋO;`1 Ӧ4-.ycJ]x}R4zmpvy ^"y" (V/ {RX>[I}+0 Ʈgldi7ROdԎSG;;~?]5$uKx7[D2^.A;{dGh̥A}PaȮEU2S10S2ı"<@Diۏ=lx\=Ig~k݉nW#T^JDMOx:59LNun{. '7w+*7ތ戼޶>LIv5,Oˎp@;GN9iQw&4*l񵵜SCP/T8l$ ww3<]n<)v:%̴涇O w;ZqJHs zZw{t]ob1|3s79nxc]ǤYcy?s^}D}]i6^xm{[`uҲϒq\ދSWtv";4mFP~lxݭ<_{ƣwZ }Ȱ[޳N7&~?KL?ђh-!8 )tN% SA0^),@Q""Aa䚑q%0z}uĺ*⡁~|0(o,oڲ Ϳ,sͲt ,3t.11c@QP.D ^` zv7ѕHCkT632tk|:İRĂޅ0`L`~9!3 L1b/FWxPS2aә0ؙ1FD{ۺm,F+/:J49\Pb*o#/}"|Lzw?V Sfh_؟|=9RA%g m84 7ӯ*smp=7G9lATzY;;dA5S\y[oPaaƹ@NL *=SY3;Ev-1N :5_kqWdrWΫ܎N+1$ީSȡm1ƜvW;U1-< uUA`u (R̽ ୍D)>XLMg 3yԄRH%i ݜɕ|Է Ksdf,NAUf k<7E׹FoPACC'hРrhs{dz2A# \s&/F_V?״kY*]xH{nY,}ڒ~ z'mm!~#O׀5_0p;]hnnԐmٵbҏ_N^A y}4P*8. ZN[#V(jyHfڭ|#z0ٱ}㺿 O&=^կhY$|t"j,}eS2-n)p &w9Ԣ*0,a50ϲjqk`.-)j}x4:=~3k,AIy̝c0A~ /!!4Az iǍN?dQriI" ̃pT(Y߿ʰ|~~AI&pt5fK׀]ٶ'e}/fS-9E.s6 ؔatuW&bYL̨O8=PqP7yb )=37|l;CP!)HV< G0>*"NNhgWˁ8 :7']}$!տbɝ{&HIqtT|CO ]`b"Ӕrc"%jzu>"7NxґǧR;t֫ۜvNS1`37[,8_HH<ӔڐQ3Tey&ڧ_.K㞍o>kg{_(fH0Ml,̟ 6;0#;#00Ğ@чOZH+VwsM}X.3tqOɝIɒR%W 'Z}]-nE/gd}%w7K7E哶jZ*¦;?6|Dj||8UͯX}sf>ȲM#FۭD,|ɍQi@kܗM3`!dg?OԚhܫ,}-Q`)6[IOPd Ռ~X=PXO_钔xo FDK vGN,*5dtBk섛0;И+uX (wb#;Hmf֝2N LBWldO4DxNH_Bg|X;v/xzM%dSU Y=xai3 7]+:dD98 E&ؓ*e~{J&  Mm<<{G(U"h W ;$Ѽs#y#<\hN2-xn°<1gΏac墺#q~J"yH̢2  Ȧt]\ae/ӑy:47 ]_Z &Dziwq/Bu c{2ii"0f 3kϊbڼ;&B1vNcǸcF_!xSXHF@w+z?l: srh mY&TȶztU Uݔ8qNŭ1o"'͙ qn5(^]UL~_6K; &z6˚M/ \$fbxd:)5:xƴؖ ^>tGܜ Wg6X3&RfBÄ&uA) S(naT3e"7ة:,Zequ&!g),qTpw#˭ڬa@ ?OeN%L "΅8xH/oEՒe{H o[2*1)+Kȝz4 k7 :x 2)=!O5*pm1 z[ BkNKDK%^_M Oh G-v>jks7%d~+֤?Z?4vVzpc3B8.;?9vӍ5vOЫK*԰Sh}r@@ߡQ5po7k`/J AYF h;a٘T'g;ctz{ frgz< uB*>].1:ox갣2'zIZ=~QKkwgg'OLW8i]U~v~0`lyi6cnFl̶:N \a/ jQ3O}8( %GyMOO2qR b[G:w1d$"l skZUZ=0'.X/Ω&^,#Q\hKri 0J'?O 5 mqn{ wvzWm6mh~IS+I{<,CPyɸ|X}yXsb&%a]Ew!'qtjԽ O,~6\ CS(q GF=Rۧ15wO'G:^5A iU۞ۅd7>]<3ϒ CGI>L1lNyBO_&dg;Z G>I8aj>ѬeM:OU,sVO8#f<#f䄄=9qS ]+8WiYgJk7=GLJ^һ\2D;N97ż(XW)폷sP)=vHXR,m͘h)hv ܵ?/}n@v[r ~ƅfn2J[B^`T6ڟ0Ltjk/IJX$ CN&M᪒\i$D Y/NX3j%K'n_жex7#>Ȏ@Jsw2 ~Oه dɍF[.u9X > u gpz#r Ɋݒf NL%?ԫx)0/K %3J|X!&鉍ˡ:!TUG~ώ|5Q#S9B;K7gk?`2!&P-\aa~&H K>P 0GpZc&5^h;wgsqs;1qnPHThݥ#BtkYcPhhW3?uxF#+a T5rd}xmuiC6ⵟN7uq6D@f'); GAA wN l(-2e7wxe X6\~,MxAb(,~A!=3WX}s}ԠѸmڦGTK zxfDԽܞZRHnOVj&d~6]&;'95g侚b.w|LN8jnVA$MAbr%Oem$pDDSjy>^J͇Uba:DSDXȎxh)9>롗~|#*=ALf$puՏ}0yJR$f>aVǡ<ݘj.Xp[VFf|4݁67y?JQyfBvCg4ګg ҁ?Jr\A߇lBCn@D$+N~bZ?d:8~Da71H4ݱtwErZcfSÛg!iv%:Ӽ^hTMP{@J܁@.(GI1g }hK: IZk`,ag #A0GM\dzRHZvwmNS3cԮI`U 05숭]K(ܼ=N2G=o^Bpu&JIn%> P+q^<@Yw~X˷,>jxUM1l9&E'ژnL Y 㓿.KS8T*϶ iv& <\x}W 4.vP@Q:)D6uKeڗKHg(\S₄eAGV8c\c3sʘX;,t{U8ޕh8$WR|Tڴt T$Jy)%$m34d8ԠA͑D g:3֠1sq M,ݠ|Eo"2iG#F [R28 7,qr8`CuBkuDXR8uϸmi;r\ v %Wf+HA4-yC 1`CJÃ/{\(; `+AO25,iLH]ۜqχ{`-xG(Rؖ]N ,񡯟9qTg1ZlKɪ*uu 0-&ɖaK]>jHeO42yAƃ]}F)SBz,Y-5@7xY?A@ _;6 M p ʞlM_l;#D]V m3V}7T6d،<eТ#"M\*ڲxJd$`vܨD&OH 7DjeKvppx:/Z1WyT;5|o2DS^W֧AF? J8ԺA+&<10MR̥M{4y'ԑҢM_;Q7KOUO|YOY%L+=' gh("4LB/f71Q-#:lIm"Uy}-xϨTip>nJĈg9:Z^]{v%MjzKl?ĖՑ}-+VP;=SKD8撙pI {0wꑖѼhʥ)OKuc98;aQR eG2'8Ź#Hՙ |ӭeanUamH*sDAMev3 h5EIOfeS~uC4xIRo#oj 3+R#2G,gd)dٯ y8sj"edf9("gx&KZ =#oB:dQN霊pbQŸh~1tR7xYoF˂:{3ed:yd+C~FDIݵ.|s5Zͻ&n/i*sc_"xm$_Z}cwQ{8',Tyo|Q& ]j L:xg98匝$;kV6@>̊sĥ;fieM (DIf.eL ݜyqX.Z(&pR8<RtHs7ԣT1>0 gu^Qj+gJcܝG pa[z}.bg{ByZLYqoA 1"j0]*#; #{""z3-*Y7hlV?~ki2h:q87XD#+M䴼1xV4S,PPL"MgTS1F$|Bƫ=m5sti0%kamP{!Dd=Bz5۝ߍC6W If[ZsUr PB<-s67BVWQ5:hL/ C f%Uh`v{b^Q1&g |kf3^5G)/m{wpĎ /.h'y /F kMRS}rwqȪQӐù ;Be\I얥(Cҫ71[7Mb:TJȝpm)Y͢կf+}sia,BQ=,Ĕ6*8 X(}&(u Qz I˭WbXx." p h &!~Vtށ:! i C9C}zҸg7 A?l1tt/j;! (l}l4+O&U`֬F̒DF#!f=XH8NCevGog"pkts-&l9Q# oL!)/g΍B*͵C4lkvm-:631UJBx2ue w=1f>Xߨ->yt%] f>9fto6: b-=pѡ:!d=bFw^&0&^^zrjv6i~ǞOހ(ev^;yh8{bkhMEƢ;EhI7g~oMIbx_^78Pb GL >cGO@6[zko#NL 4!b~^EIӂnY6RsE}ή-ݏYܩm8]aMVF# nK6,D.OvȁIXM<֣q0>xI(y&kW&Uۦbgr'TR5˽hgǰ3$ /fXJ5y7]֥{ʷ"uq.0( IUwԯb!15/8Crw晟02t14Ȼ?b(׬Z/g?$fxk-f·Hi* [P{$#E8@jF'o֎1q>}Yny*klpJ<띡Nh?ai k_/$u?Ev  I"Mlƈ;j;y<}[p–u~=+^rۅQ4|H]%EU*~ncZwlO;?InѾi%@LxzY\jrղ HL˟9H^:䇨`fR1h@e\6<"v!ФJvg@ǸܜkOrj s}$Qp!D"d|Y>:"ͮܒZ}j@w' N7XibnE9&.Oj,vnJ4'CQNS/e'Vj'Pxz|&6iJoq~xW6fOCj떞!xdGBbDFѤ=Ph--ts-* _!G^ɌhKcG#cT7Fyn9ͮ?EPvqeo@PC }oXxYO7K~i/e &UFD楏Ȇ+E'D٦Y4\>V垈[O_XB#s4,4,S\?JÁGv~ئ{`%=MC.P{03:%֓RtуtpDܬZ<7%/60;ViicPk~k)^pÚu5r1u\Sm<O6%no"宻:f8j|-`)(k#]%fKʼ||zg_2B;_s̼_0##=_j^'󍥚)y# >/]=Y WJ#/qey95!SgUJ}/OWw{DG(D|""Q:K~L,S".% ?*rUr\lrTbHmȫSpi8N-CmJ+4rtP.[t<&&vE|7w.!̒/qР?M)0c$%Q,2nIAɱ^yi݋~6)Q۷v^HVbﮰ Pߺ@YY`I0! Mw Ydcm=|.(gc;QXXq4:Q nSFdnA¿}_jm4g}MOG$i@{l0Pz|4QO^L`F`-xJE5ܛ{\9Br'TGDuM!;`z>&{H݃!–҆?6%FcИ-c}Ф*2ƌHzY$x<[J>q&2ք\]˧-I3JBgcŃ!!.CkZYR;׸"ΉD!~ɿ(__bn,`)w;5{H^BI~v \zoJD`/~v}n~mlD7@Ws^%hK)+Vw"stU&;ÁHuZ6~wɏSPmɌ5Rk8z`X|8ǔ[Ċv1YCye8'y!$ -E ܽf8b1`gGsET"f!]o4.t#taGZL=jHw$`hJi_Ɂ<9>aP -s{8+yAt{,[軼b^ $JӞ /WA.13~ʏ([߽9]_5CMaWEr?7Rjˏv l=9G ̍ҳE3>z>3V_?M7w`LUXKs, 㚀:\ܚ3&꺊]S(6ԚFۻ#xVMu:Rs5 8mKcl|\:5{N^[׻1'yEMu4dRދ --?C޴\audM RԪK9Og]FLUt1}Bl_H7#x1Gv_l TRZ=iLk9P@`3?,FO]q^7 )x3\q%ѩ(E+ON4&~~t"摏YrV9]Xvdi״ %ED~}dGރci;iDB:q-מԔfE]xph֋|祊0 !݄¢%53kd$4uкS@ɘE_PeF]#>VRj16#n JUj`b[֛)b>Zx†i%0Zp]0.*I!%˿\r\|7!;LೇbnPusqJdf~$+AuYhNO#-ȯ?~`v [}m8g֑׷3g~Ӿ9kn{xpSM4#~Ks98H;} f~wrSvE2|ST5`?Pq|(TQuJEZ( ˯2t30_ \0GwdZnZfo&jTIxt4ɕk@m ~`8~0!aHO ?%zVWv!JQݵ8$x*9my>zÑ.ϴ* Ty;3%OW>TP(oNnU=lǸBjGOR~h(W|>sӧ*r_~x׽Y; ?nT*! X #%MtVgݠ={gWGt "{#ϊGc ?KJt%;[| 7=l֫;uǻ:I`΋|2@QÊX> Ϯe)dCAHj/<5 1RfnihD)6EԄ|Uzq m¸8poC <2L87D_+Cn^l]i }tKJi:mpszAaF6s@crD]e$l]ҨǸ-V;V^ɹ=8~]nIhi\(Z!nl{-'E*0yR&WN;d¥!+{(<07W rR^$ ,ĥjTu K;¾YŻa>  v:%ԩ pӧ֎!zAR&3\>Lv[بH#M4O%P99=x4[QYjfnv#Q޻(} ̅>34S'w>寗6EGpv7A*ho<,q;7._ΎY4f2kh֊#{ ୔m>-sEmM.'4mz5_ ]Op\Xo 5T}(щ)Sʋ:5Wu/( h:;TT򊽮E ,TjLؙ۟q :Rtyãq#87aSwLsg2焽*N8";Y;t $.vψ::% H=:Y.:|C1F*s*}fa!ʾpMƉgptL ; JTѶur< ^rJ1v+W"6ѡ{-^lDXTMV~e \*tsLf}yjٜq:()1 6f3O,*P@8fՖFF]g0T:ύ)qem@r%7찊4΃_N)6=vY^ҽ@]+iX B> yFU常9/O+}6o4uh AP$V|B VRgs2S5#gfp; [8XOrr^ gg'P.qMB5 gM{uOl`3$8)KP0X2{,0GkGa[yg?vڍ]o 7FSׅ85Wuo65zB?DoR&)֟kn[&;vg};X v~Q}o}-< _NpDz-ê/GaB۟ׯ\s%A+p`0nכ >ʃ90$t:i * s{ : /Մ:/%ca|EYG,ÝMsΜMDXڥ]*–.MQs%`nSvNLc-/4>SPFӌ5i?%c W #;YOyiw(!!9'[͠G y^oŝFޑsv 3yq]-+h]Y"U.Y*XD1j\}li|ޢ5@xȪO#&hy|p0[Š2v?ߢn+dt)d9Y I\@1}_sb9 sl.'@ q i jl'A^q w]K= `B/LQ??tH;(yn\uHذPޝ4!#pPs ɾg @_/P_hj3L^MV?y?iƣ!kcv>W $x `!uA:4pan$_1"zj7i=uyHHnzDVYWuV7 !`2aqFPgk'OPOMINR퐜+oe'uh;W۷{q0ͮF]״jkn5,`> ^TP~~KdV4cQʜ'"|Ҝ4I3TvBgL0Fu%uO!r ?%Xp !f]Lj˄(Lv(SY|)eٲ5< lt=<4Y$AkW3`ڎPgO>TnF:~t:c9*%׬43$2 eתޚύ"X=Z=Z,]n'6`XĠzã:lU* 81L7jBr-v~*Ũ9F`_XK_K;TzzwBkFrO珲bu%Fkjy`rp^O4 *՛M-GD0: e4l`{ ty+Ŏ+`|oWxT` |'Yh-p_W9_WԽǫ[M&{ MvәEϏ*l rumW#(nn ۉ6<ԍu坔_Ss'Tgw< sr״[Ш"Ʉn/_-a>clBٚ@qDǦqK3:U~ܒkQÝ)ϴJk1>7~ li}1Oe)5L?@~I/`TTZ ͷ.?)dbcDԁ#[α#'g7| z Kz\ 4vuL { H)-F% P!k8m0@^Rn+NK2I98;.^B)&Qjz Jk5,ծ(3 θ= +\<]ڔ~{n{#*CQڏ eQo3D;"f`QkУ-\:chЇ- 3hy^j\W7_"nxf} ;CD"6J rј4jk/o]J*mAkG@bO1g08Mݥ_xII _CgI!xEO> 5d|*ob]h4 Q,rv (3xE]qK>4Z'֯gcM$JS 'ӽcFd_pf?Xvm5o2 گ1,P^ϏUߖ|UCj_ZiA~;m{X{macÍ`aH!vlCa->8Ae!\BLqP8ڃT ^ۜqBWoMT^ @=\yxbB2Tjħ&Q Ȧ1 &u<Ի테jgR="T<&^/OyZ,G2#kyοκ1{?$Ƌ0 lPXZ?~З.kSrpXP-e?M|YL">y}`R@dxjz+w&_ڲM|\vj&Oͻd^0]&>D7R*G4"5^,@:]Y,/$xB;]'JΙ%vnLUR/պCNۑ)@%k ySs}p6<$xP-Yuol'#'):Hb>JJ'KC2ݦ6K"t~B9q:w7aKD%?vKd jpKؠ`y)\娢w^PU]DMoW?tvbo|\^)וxz?;Wfh95I\ xZ7Fz+0z*yao/d+%~Y6biL>| xoTy'UZ"69[o ~X+8ѬB.KbYKмP˹-b7pnC-\>)ڂq4%=+}&そ^*DzCs.́%=(ŭF,1F+l^ gJW(0/>g&rDW6ȝ Z[n/P#{i5[@sgwaKD8-gs ^W j.cJ# =V&}/+i١(??tIRzh~=xt-X ̈e0jSxF?5f&5 M'ȈvNcG6$F,ԴE(|':O'B'՘"Ko_$G2}r(K#^җ4bj*P J|3lڀDwF9Dza7'Ln"OK7u;1i>n~Ҷ9Xي붝y&PIBmуӽZ "Q hHN+1WbtWADeK|tZd WfÞme?h^Z ُUYUIlHQ[OuQOf*#dG2My`BGU~|FwsfzfLTѷΕ@Os K0  k3Zh mJk/j6si׷%-cJE al@$t=Iš0LPo|hOj nKQ;Yӝa^:?=E6Wf`Y@.%r9M˫ Gw#"О@XhԤlݧh(뎁`(qmB_ &rn/sK>VkC0߻hi޺YBC J2 R]rs*{@klNbdLI<2FJґ#d\񢉿 u&HhٲixgxݍkIULVkVD",Ieo5o8P|-j b~]Sj~>OXvѪ}xM6A4s*3.nKʚ!YhǍ;N0W2Wz]mAK92N3HAn]¹s0C?Ώkey>m%}"0?ryS͉4BǐhTK '"O녒&)zjWRtb5PbWnY:NWM@HWyzǵ Kt!).KFNū0M^ٿhPڸ5_gM/߯??k{(ŎWY r;@ÃYX' ϟ$\.,ӭ;]YO:ه̂H$P|+ӂwr@ $(i.YݿDx d.dة*w< UJYo'cGh&ˑ &a꾨 s)N=&=@Hz@չ`Bڇs?* $pů5۽{6 )<=sKNFN`zIhx2hCKwٍPtprbmQjxD]:D,Q»wZ(-,NYWژ17pUiWC[  uKUb(@WsgXυ oZfo3YH2ͺΝd:u[g!L0?)e4v}eb"Ϭ:~ukWdߖde-v1 ?-n\r$N>GM2D0v`,z~G){O~+pDr}^Xj5~/O075 U=vVS%ٕ -[w <$ vt܍5#N>BkhT@^ $0Dd7.-[^ͤS\ߥjh)?R5+Ƌ:Z<^rTx2|4[ZE֢}6<'t͆(^*n Q+|17ґf2A!"T-=Y#9_Huh\scyAV-m\k&Jѡ~r/0n/㤒5O:18*6e./{MQ ?j֣W$?Pj't 󁐃{9-r'K` `8t[tn0I @ \\:Sۜs.c76J{bBJts7#ەL̤9fpD7}FxDTp~JJ}?Ta=]ˊP)@sE.lb4|8dβ5> nsTPx I e˨qj}u9WF&W j_u1}^*~ x 理]d-|aoM峟Z`:{-+Aѯ\_Mekhuȧ|!w}gnm `=ġ1CYё@K2?#AɎLj wv!-?E"rrEЁe֚uyR}p?_ʩ^F]^Fxۮ[弭j2PYtFKOxnMI.I1eOYG:W `=[9 y:NMN4 ˜DgHSi,5fn}íi8FXcɵ§V( ,`xI$ɹLN8c-Ik6~qgl=;"_B>W&t:h>MM*V;k`W& ֩WA(r-A zv˰: TAx?f$vN*k:z܀Rn1'O n=噝!u/$S\g7,&=0y;7DR)-F-#{MQή\ lDnm}~xMܺ?NnVG~ 5ͤ:8Je3B> PĔ Y\i=*F3D6t< ӓ-^:K jJ/k?a H<9̈́ST哱$̯y7u3y~s8?/by?y9Hv0/ɔ5H]CXa-|G=j㨯>oK]Uw՟hy!ȌyUɥ"aaHy}?8z oRVxEO48kuEK"'mOաNNh#O#\*TΟO;&׎ ms@ 9YMbG4|$Y]w{:1Y>a >*2>ite].0z'b\xurl98?pf]q ˸SKkAK]崝r TnS~oPcNgb"Frr6 s1gN>tq>q4SJ)Ck6OKsƱ׉As;) .>Fǀƙ'd)v{8F '~JCo!M]" ÷`yav6GWrȂw@O!{)q劽DU0,ulTʽsze\gO淼_agE@;J (\^,6ĪMx!vJuvȧKI}}_*բ㶒Vߦ_<7nMHH6 ~E[//wP~wQO֗:h~f?ߩ (ҳ\콀BT3^ !d,G5s%Ҡ LgHrpsTet^+LO]"hAg@;2l 84)`ff[4[H٘1 )%> >ҏt*btO ؍PJ9e2,+Й K#9L^?M$r-cyVc1os+8+T^ohj a`m>ױ~ b!Vj aAbNğ>Z1ritrl1,CJM4l!,ڟc8fD¥H 06FڕcJ}p]4:s< wkutߝ|!!wu-:~o;B1曰F4[L3 "9/G8eu3闹ĉPPTe畐pm\̮t~Y4I { --옘'†H:w$Y͘9/V,:Kߔ饁]ͼehg6dϳ>^]ⅮemjY - eQ<[٤v(rK4A')Nhn}e^8F  !I枆HTt/z ][_9av`;ofɰQ2P=amnG Z쎢Q岛ԌFnxeT_w@x-8>ߩ3{r]=h^>Z2Cðv&{H}'Y<ޞP\4%hn3|$DzK(|#}iAŹR"FxzloƵyn$7+s+z6qybU/bRRD`M2 k4eNY _=ݫ=5Q.'p\nZ%:I$88R{>׸߬t4nOMT*~yW);Cwv%!:~|:3\z䷷q:üe>B_h?t+M)K"U(PtN*L1Pt;ٱC@)ߠ'J $]($__*ZqDQˁ(Vb?Wq5 Rd˩~N:?Z^s&ieWU&[>wL7#R՛מzMҬ2ͧwW[s݃Lae*dP$e2ǝq}e%n{x1ޙ|+Զ[q[xlnZ^;z3^oK?ʭhy]: CkT)*L=kXHxf }rjkѱ[ǻ*<";nsF7P*+7䢌Sy"'%K=UTώ>CŐw$sre85 n< ëB&b8x" HDnU_(CϜj\ 1EDy5l_ EHijy ,ă2)|xz]|Lqp+x,&0qf+">w&}a99rT&mA(MS~p1IˠKE- "8LN{GmkS> DAxރ Ɍ s4⎸=/# ωp,P.\ܡ@Cckch4֧@sඌ Iti0 dK>I.Y83ou؍CFW w'N*_S"ǶlmڃG0k3KUMFa6yNzEUm#sK516j2ugߣ"R%Jϔ@rw<dH:)i~Ǟ&{;S.:@idEe&O# "j&pyg i$]4Y6psVN[^g,,ngzbͷzG]xL֚ҦCgVl1B+9%> TFϿdE$a|;TWTbU&xl¥V! 4f`nyFk(4зxgBsZa䁝!$6J|*S0ۆ G5%>{q;nw]ANN'8\#aDSЖrMbHXbP;U f(7Z[,ͨ(`3tr+,wƋkT>kOz %":t0.aG=~~9LL] {ߧ4?"= ˥7бSDS6|~U%l§3O?0Ql0_g" H-|c;#|N8DZ<,D_Fyii<݇MWw|-"k_fE#*?Ob 'WH+BW|5'v;ۧ5gf&qY쥬o\Q\l<.")nœSE( {mUD|2d5 ^uUsy[o=^_@Bdosb,pQZ~%ej On(ƪ̾P q`<S hUsDVAVMi #;۞MXYi rs~L$%A:'44찡-dh4ep7JnٓA]dtRӈrDa>+ywZ{7E'%`׼ԁ+I0b?J ">xk206^ޞ\̏ Y.ͯͤ!|ڔuFD :Fi8\(894@}_]I;q)}ŕgdlEnW NtchN`(GÙ4cߠ83Kԭ;bw⯓&(M3z}'wO/8l繯sӐ``a?qw, q֨c̆.cV֚y/}ۢЄFP%-ዅ~XVJ'n_si@ qmOY[L_S<9 ğ$NO:JFnR e(~i^߲K>]_SO0lZ|ů?j B7( lފްor<GgL݈W=`Q}lL2enϛ4d#>tӃA݂n<KheT*WNzy}Wɏb]~ݹ&A;jZNV\Ma"2̗9rzH9X~)6S"5Fdx+kSiU3l]e*37jM-SV%-P=(b43}.ensc&F IE _/{EX^(Y=?_fCA$4KG.R-e (F(.-cJ- H+rC)j3 U{,&Fŭzd|8AM{ "Ww,ds ymFNb$vPcĨn|=(O !U N/n={hAgĠUdNY\ȕ L>*r706e5O|(O=2j''o%¿#Զ9|`q-N[8t%w酁15h>û>}1OO?f ێߋMEa?GƢUבHcϟ{+:=L?qqWvJJFC_*FB 4Ϲzsnt16 dEJzOHsشl  4ˎ#)~ 8V"B! *MX1/ߏRUHL7 sVs=Tƾ?^!s6V2կ]0Q^\ hѪDCKj퐥-fN z(q6(./?.ta1`m+ܛa)=@-zq/\ʻ8K` I00$ S8NA>Vi.] {ixVjM_]gN^ <Sf.Zشx,qJEp7lTA"`xB8J\<.Ǜv'ԢDjA1!0ә`nyq!UU%tPhYJpAS nϷ {rGicv􌦐 <5jW_}CU8L 6-Uծcm?;4Yգ}|WY*+SOͭ](1zdh!U`IE'C\V;@V'Cew村N|()e5cRzZY띧!Tnfu2uSk83[udW|R-!mYv1xǵN &5vInH"ۮ/0#Չ.@ShΈrwuS AG< m@Q/rkU7==I|;eɩȿLRjy ]Im>ܢKē<<I|Нвߜ~l1!v_RK~sQd,G0}T~>#:XY<ӑ<ɿ)8w4MZ ilEfELo9i+nQoFbf%+/P0ͮS}gFCOk$=R3QP1,\oW0"rz&:$ba Ś>*= ̠M<*+vlY\ܤ:1eɬb@dzv[AvIzw*&sI+mkOO*ivAJԻ{o35]| }W*(T㉼K^p҇7l]~oDoE[V Dіy$#hCp;*C0{gf`̽_,Ļw"w8kěRRE>Ć )^.)4w|RĴz^wXTp?r>#8E47!3^V^s.N~e{3wF jbZSGBFQA`!ږ|P}xB?TaCWw2c#3FK((c)In}^BD}!$51vc&R }/D1mFoOd3.Z2dgKܵwewckl"pn'sd䖼S=aIǨ$8x/S9WO+y,_d%`^jz_À)ݩT% 1Xl܄=0WlCGvdeiΚI.k^P' ɗQᲽfOޯ [ܸ9sxZ_\sKՆ[mdQ( VOoLB?y,P0ɶ)K u=Co5+:K11^y+]P+(6j`nF]}Sis0*m)"ƴHpƝl<,/!STVClUZob[~ُK{2b l!"hee]6%W3WΎ UDuC*\Gct뭌] gs* [?r6z >! ¢f[J[CoKJR@iuZ HJ:SYZoan6ZApi@ z hw;C禣`|a?cm5*UÇa$߀^ n#/PUFWuGwf!QVaڷdv즻6}E1WmJY)GRFflUU>~!0C1'$<($5HZ#pj;  09+pWFJ-@:F3꒘L)~C('ze%;%5nVȳΊ-fXZpX<ГTWDyS‡Fhzq0[Y މ XŻu% rءpa` ^t>́/|.z"`vwbwc'r 37⯎?*x)`cdƺb>jp ŴOdk|񣫨FK a@18mEqɄ2(?J? ,|L{S%v8xEb,ij8| W`g_qC՘_ 5DfjƢ >ITEEe Ǐ%i)Z!QW/ P{? 2s$l'zmjro59y{Ϳ] r*3u[A}qo{Aǥ?5T9*Bs*F7E!K@;z6Lk۫F!ߖw+SȔ\`\MjhJ\zEjޥ0Gڃ+{Dx[l{um9J8ѸᄶNs\&h$7kp 5}gsS& )S4Ʀ0.xV^4SR-?Rf&Rۄ OZǔ ɈWUl!s RW]i_>E/$ޥٚVV^oyI~ܵi'nhj N*r]˞F>mc;id}Hl}篳MӒPJI7g_3Nށώq t԰C? Yxo[YVnd~??G32r~|vF;k84SS9GU0񀠙sViQ|p|rjxdh\"\,B=R4lb+pͩ+\׃,\/ _I!֞r*r٧W9cv d+2T·ʲ}nZׅҹfKEnh^ ;U-Wܴ ;8xO\4\F!NqڧɥZ>2`t"ZEOiM˺BR]nر9u8*YqA޷>"p0HLGgy`7÷faP`3MܦY/B _d}P+w^Ԓwӵ<'~@O7.O8 ~%!\dO1 q=_S`jމhk֧AwU^ o~cGWƟ}'?u>:_}o}i~5__5UI:[N)%^g; qU:wظ7P8D&t’oURU:jB3oXx1%/E`mBoRaM2̠$]pS1~R 0lo/MCxڀL$Q,Z?1mRZ* Tb`LKkO.0L6:;< %VS3POW)GbooBF`[uƥP>cy1^//[r'}eMX2SR -kNn!0?l>vKǼ_G^T1V3墄9[AwN7* DAx fjcG;-q/1O(/i$dDmZIօ2^U'IYG٠ k6Ϯ@_yA6/NK&Ď$ڲ̇f3J"=# |;,?sE WyUz\rG) |u@\h`ğf@"!D0!wQUq-oGM{M9u rIe7KOg_|鿣~&ˉIDZY;K9NN̈́^9\fy7~IPj#`:9_2pa~uzهisIZ E-ڳelrh_ _r>(/Fڠ}W7o4M@~r6H ƄTԅ>\͖ `AtqP˚?6D@~'Wh~!=BZ8}C?}ݧBM^ c6:޼  ޫ%3fzf * urYR{fx»=90x"ɜ͢|#$ΈjX_ 6|E%i˄d d2oz۟Z1?G$sFCsH.m;K<,Җ>dP6CYk`MаwǤ9u7 I{|1 Endh\tAX]jQ|d7O s?*ɿ~wтfa4ytuкbUP];ɸ1/:^bƎݘn/_MpŽx KZK1И]G=tGrUZ.Rt;r@){wy%N mkp~ՔR+mows2o;M֥(Jtk=l~{?31Wo> : lel") xL61A5y~E}I yt<AfwAڦuEr o Kt'>ōFNRLzYzx_ZqweKy9 '9dS3R)Ǿ@So{ܯ ߗ/$翫17oj06RO!0[O;p~:/ߌ1l*Gw?o}*$Ŷ>CگNjB!#X© 0I%|X6=|jӁσ^@>N>NomoZO&zlMT`%TYCoWxTu2 1kYӶnvmiS^0\ H{97JcRvw;W瓷y1s2@.25. 4m/9ahWAx1 ]z p@zZGߗTNq}.jV,0ZW=# wqYD|ð,Z8x[l\:i=*Հ-bO.M| uc`ߛ]|e:0|zO,񠛚 g"8~AOCXӚbiKgؚ9YSS?G?8~U 2#g D^7Z3DhK. Hs otGnG08*+<@2Q\$#UNٻ=_C ZtK6Se%V`KI>33]kD ΅^xY8-mC^7Ѷʮh-X }J~ÚX ƯLo*%],+ƣ|#9DKkLS _orDDWxCMr-ɷ;*KYfB`Yw~lʢ1)G|A_7'mfSu!nrfae2l'Oyɲ&/׿3 {z#H0ئ0<QQ $ 5aŧND ~ط5\_ߎE}2nRGQAsx9?G_)?՜MPL:c>.F;o͝7_ں/wdBcye+@53 JU+!1q0s*6fF\HTW~^ ' #~S e|c35lD`Iv!]fDT ٴK%|?!wufP>d5,~ ͨl/J$4X_3վ a}O4܎ֆYE8*^Q*)GѓN6sxN0fΘѹٚܒVn \)D9:=}SQϧBQ:$eb9jM̘/o/z,`蓚B?ɦ2kߤ.-I0?=߿gY f9N='ؼ.^)4xblK_\˕6e=+5*@KMn׃jz%a{w?oǸ< ٍYW}1ndo.'Pܠ,NN |g4r,<*aSxtP"@]JRx2o5N<\ WuE tOF )bU zӉ\v- {ޝ>!C*9]!ݽԕiҎsKv֘w 6 47PI e r/o;v k<~uHoʝցsO~/|ٿx'/9?dtٿq1y5 j=wvT)pv)&ţ!Fi8āJnqذ͓*rǣ*ˆ]uA+a;DYsc~`$59bY32`E|z5apjv_:k3=U.M]Bx)] 69ĪbK#wp&l.3)H<|wm/9)>i|)/TVwa`_ l(gz&Q`؊=, c/*<ɽV o[77t^|/k]o *ٵ\RRNv2|P78 K 2ŁysV-Sp%9J8C P<8|וݜ Y=xBM5 \x_+ȬTf*TWb%,_aaT91>}~І@v__0* ͕lNU Tq1%-5?kgh-Tw2%^W**\]#"RL-ɅK4l'* /1mz0dGY⭓=fH NsG0$e`/Bn0Y]n)l#"FUInųFI%RaI|ޘڳH=x vK5bz8,YפҌNk 8&n2Vtd-^r'Zg܋|y1?r ?l{MI\. :WSN߸1~5E3-Y>2얙?S:3}߯DOtv09};GD]$3_|r?~KKƧ5Q:LVcw&_-M>  oWtCw~Oٚlzoׯvlk9wm>G*NJ;Kw0I9o.eR<cYR(m$˭"YZ)QJNF Jf1ʱX- a~5DTH[^CI屑h p9V )8a^_'dPd)QQID,16 Ǒ@V;AQ|t#2}Q$6-yJ4id,/@ej{#[~%uBK{C{} G;;S福 )Y:*\ۆXW,&\gdh|rf6E^s#ys7&tvEǜ !~4˳;!ڍ%"Wm6rrLԯRjIvn[7l( ^'3m *'KcbMGQ}R%`PΧi9[oHJ$El7$Yv$YʴVq7nLs `wt 2U3h<+E lr-Lh4\xqY}^OɆ2Pȥ[%%5a ' QxI<\`2_{tLVۚ4x>d(_ڰl5y&iҘr/q`S^nKvt31V@g| :D/}) r,*1}/7_yT{w؇&/j^,Jhd(V >r^=RJƗ"3J$еFk \PNvXMfF1멫# iQHeu.2 "TzBT݄ ]o˨˥u4IT0GD$JVV4m"1:Iqs;7yl2%e0*Et] Sz8qZG <-)&W|thS0)G,GV4.^fhƌYgF'S~'_X̝هJ0+ FȦi8V~*+^G?P՘vn!UMЅToo4p0ru+$VU!X",)Rw˃iM --k Ӫ1#T/&+0]tTPtS5?a>N~P|Zַ[\%f͛_iЏ{㵯#8c-NC l؏gkV=U1D'6bcοrIg5>@k~W^FS8=Ԥr?;oi*pyZOğlR.~gT+Gwoϻ+?+ Q@#c Kid"Ox44o`GKkm̷c2@Ά2,{~k|q]\EFRw]Gnr8ϏiJ`>m{6Ǩ*>RuQp_č4򡦧sXE 6ܣ$ ">^٤@)3ͬ&v!$ 'qסvNŃn~0ermq!xFǟy?* ]D:|e$H%OIDI %h/@c5`b,17.y*fzАs*死Ȉ;L`ƃ\yqJ+a}ӡeԷd J Ry H,pHsBO4dLHAL9FJjuWxZ,@eHXмA&!%\(i'>^ f [5v$]f2MY<yc.1ĻS8[nEF푿>>t\}IHoeI?)ߑ 4T;S5XSώ1<4 sIC2ZUDU^Lӯ b ֫zԾJ}Ȉd Zi9ljSoo//zrNגB~Z=5 $A~Bigx𿲓)\9H􍾖 C݂Ҥ ^NFɑշ?88k%}^ퟦM|9Wfsx.0:GKCI^Ț(ʂJ-*ަWΗ6\LGx 6#,RkeEYc򌭕)6ƑEgH}5FIE^)cG;Ϛ+ds;7>pPoOL>G3,Xx;0};ԌI-'*#J?4&b|ozdcmK `cO^RGCfi>tMKdA-mxY5l^VCNF27dte~{9('|p8 pZ@pp9fD2\oQnQON 4lHS{;=.BOP/ /{0aޯSZ t1k<+ 22ADÕOh!袬t1E hJX~ 5 54-d>Rc^@js 3@_]a_!"^# A *ݕQ-iy֨=/|QÄ > +샴?v d U,'=wK~sRY/6-~5=?юI¾He*|=Ֆ/ Iؐm1B `}X]Vv 0Y -3AHzP^(YE5 ;z݁nJ`G3#x8Npb{?FFZG^Yy \¿3 &(m^9:z6H$f 1 Tr u1Ct><$*̝ȔO V7,T'ToːV޶=G/y;8BOQ>U+- lQdW8/u.`ʩ̿ceH&2x#,[9q՟M~xZ&0E g>D](Vq?v1m@Ǘ Ulwm}vjZ3kN>jok/y ~Ʊ_@^k?JdZe0;9#yKڽA|]33g|CWG` ,䚫ӵTH ÷/c` >OUgu?9g 1blPe;ސ(Q\g;r[)³Baѫ6GLmRM" 8tr,dzӎ\m'o+x9y,|?"#&TSI)KneEG[hv59Xf5&{cv^3L˞l>n8[k544dŊ;v #IE%; y/;YSTBET%~-Htdf! }?><ٽ2sSػw?ydYbbl~]se[iEO/lLxY0#`xkmERDc6j#Hn[SaT6LJm ({SK+nٝyel`554&.jYBi{z膰Nt~7r`:l$.9泾/-gxL9D/Gv$e!(oDeUSieϗC;%J]_#qfoQ*#%5W~2a. <`c_IBRˠ#h질8A fMPk:0C4X"o,Q*1$DH)ˉbw8$9~"GDX[169YONʇyFg̾Tv:r'qp~.9Fe/% Q EځV}ܛj 9;{,-7quP!JjZӅ&qYqŝοy; ,gLH9C,ˆK+WzD$yw>,? MtCfz@Mz8]BUJ@@&tzfk9 FŢ[%A pz ]g4 ͈Jun0'1G7L>Fc0h//+&OϢʺtpt+IGZ Znf7 "jۤbhD 5 ijB5? h_C{Qw_m*+76_Epdn_`jseìXG W^f ETe7{j|pcܿ{:K} 4r?:#S3A(eh{CBYVF3V5rǫq"ǡ" #0mhn[iʍj$]]>A̎7DW]n-zⰡ-[]lh@( 4K ,fѬlн, Ɯx+W0|j.deXܭ8MAwRRofCFS`R>ַ蓾_ίhɀR'^ڽ^[f_%oµٗC*[I E}\\͢@_poB7Wм_)> C=VNp-MI]1n`FD 5;p\aulg>Ki=" {)]{ -</)%opYb1il)dߓ*[_nK}K=~QD<Fd7^9\7m{o)aUoKǽ~lN WVMDL=]]s~"q6ʬkVzkLMMtrh.0Tk /n װ妟;Q5UıM ,F褌]N1Yf+k_40\Vr@|%!4݉>9V/^e=EX5"P?@ZQjح>7+uֹR[#sx 29{*}zl]nV1p9D2+ܱ2_ͩS؂aIt S=&V< dXGVWp]v"lzRx6kU?(y=uCn+[t0P Ip3i&'lJDBI+~V./9u\;d6!)⚷7Ys&>YA I^'+.D;%!,j?[+>n*=.wT>:n8-pV(/')ӡn\3r N~//f~3-s 2Oxa&}~ޔ3XBf[f25ۚ{L' T:xs?odeq'+#m3PQ[+lev q!@q& T wbY&pšH £*UmAx4{,GS!}MNOH@j5X0V}„@/\: fR&#}[oT.hڍ^3 W_ Z\J~ecvԠ R lL$AAR;;ت$-I@W+tV'tn$s̻Q 0sZyaKx y naC& ZLީZaݤhfw=OLd԰v?;[0/d5[j<|K zM6^ ٌG9䲸cgC2 |''EwL5<5*(:``ÁCj xz]&/r1Wu ե]B3ke+N͓~~uS8Eq[L !"un* ^+O~@)ʳǮ)rgja&#{,ӜoLIJOp~T9Vj3!;ݵk [TZW~{TK1 BMwi {RkX=LJWeFB"&b4a/0+T po]9c/Uz׹Mbx=Q˝H.lD c5x Î"f/ԲPkx\L^g;4U#m\ "Ϋ~o0cBftȄ9kr73|#Juy 7Z}O'b`suزj=[E6S}urc ǾEShL7X D<*woe"*5\Dv|sIXqn<x_/Β_?WP_@6;OXӸ8Oa٪-M":i d wPKi3tK(oGqLՃ(DC͛/s&vU.ձ}C_noSWgc +3 MrgѷЏ<+W7@0RCkyoWt>?{<=D[[y{ iL_ I[q2n2fomɈHѩZ@aqܔ.0bŃ:[[(15>bNr#U0zԆrDܗxؼS9ԩË>xC(0Zdcͱ>D= 6wTY$[?0l#n+2\ah}t9e$U7~S)(SX?b)t &@ǚN peE4 ]Өκ)h} e{. 3pSBaэ0S< UKqb+D5)W(9)3 pZ>W|xǩ̒wD˛.ږl=an ,~tn8}vF *g/p%fyc TH 0!#Xݘi]{ ǂFuüҶC?gzBH$s1'K8{whH3;κF+:;%\_0zq9BNڃ%Dް ZnHp>, cS2PFxH;P柖P=lt imO]=CvWn N-7J[Sl$_KbqBDc@ahPc,:FRq;&) B{Z b/,qpz ÇfE}EPOT(ƕcawK{ Ft}$ړ򶓩oi Raܺd/ov~whz5x 7=_&,UEvYۓME+Χ*%5csBzgBEZvdKكI%]h(> -L/x&Lrۡ~4wfǤG JzJ&^.CcF|8[7ߦJh/J  |˘.O/*US/CszqhS4.c!X[5\?6dN0yH]^iPe  X(U;SѰ2`z:,r(lV!6v>ݧsKFgZz1sA/ @PZ>{02l U_jtn4qe/65z{|sgC oLbGuV5zT6ZA۩ܲ ~Ejb,?OĀ1ܳoJo?X=3J+i2yo5_&Ƹ燐׿̶ rPӝ{!+k?Ke!Y ZaU)Ü:Ҙ=.Ѩ>$b0)MTaxUMW)X \0peA$/K&A&+0<7M6<ϧ>/D+.3 L~HQJQQ.HWҔsɼ &&r' E @PRuC<9D֥͛'R^rYPhGϬ(vIx~Kp w-혘JPȳgidC0N`^NJNX@68nfiC4MN|aHPŔi]&k+߲(~SLfP(}S"$ [rͿka+yS<%ϖ`u賫NLѣZs%VfjϹ}#..U~ ayܷ{E]030 Ҟc8'vMbC"GЕ9$ë}=8Fmt]0ۆys#&t.,?xj}&iklSG|j1b.XxДd$~Eus8k.<4SmZP_*_#啡c}Mm*VҀߪdvOo}Qǫ_\ki~ɞȰ9`|m(Z#a-2Dk6YgoK҅Y5⍫.|kpDp`[>|xiQ7Ѵ ć7_ح8}!F7$ljHkY4`dˆ60, ?cJG_U݀HnO9ɀ.#yҲ31,"o8Z w/j@U[#OpW{RO0leef˵Tro TWpe:`'v\EEr<,K{>i 90tRR #EէySpގF|p0d-y??bG̚B8S7KKd9}[Uy.(@{ўjGk)dhs%ў ZPnub^ļWxQ1ʑ:!6ApYwjaaMcPu(.mg=-Y1aK6|VfxOm%{?`du~ǃCs[nHZ)}4x(h&fl5ՐƦџvNپ-NA O'=\?ig籅_PC.UbH1y1s[8c(5>^a#q'N~bUC4Iu#&c6F!gj`z rgCtb_3kb姁x)->G4m^jI hcI'zVVg5A;r)iҍq{d8YZheIUZDG %I,b(ObN'3zL$8,Vk6<rxfȕRrq:ti7K :N$UQ.S/ZE7{}4A)D88;tK'(BP~~1|` 'Y_D)7 ~4ThN'D`r$!7wŃ͞hq~ȱwcnQݴ|Z"3?j-IB?&9d{X]#V{WOgac.?(zyX~>(B\D%}>MW `s4t r<ԥfŰ|Ϸe U!Fﰱ:K\֣;2ƞ5O{f]".*$u0w,J^5nt\.xùyT)lN| ԉc G>=_jzj-npO޴\,1Hc+;ݎ:d2-`x1~`sBJF.2*\(&Q4y-hPdJqEz@t{T-O|\xCSpn.b3pL2JōH cU(z#5M`d}*t|Y9._,tL類%,(ftԖ'_j`hZklUn+u!<عM8R}?qOBs=qoyR{ gk}vaRݧz@c%&Nbxb,zQUڴRGg-&n>P%7ob>Ov ,gHm + ㏕a.އrD-:?HSx.5S )f;"\[E7qjl զn} C7h=ǾLgBO>65Ψ@[F%Vߩ #jB|ߢ s5g,<#ړ Sp?fR ĺf[?عfƒ(aّ , qZ` MC)x>z=pn9$М/4@ ֬F6;5L9V*d;4&<,IGH:ty[odF&AЉ|rbj|8CEqGv2NkjKp{̛&Q*JiRzLa ~\~8AW6 Hlٺ( 3#pRکe/{UtSm6>1jHC/c| ώ#߸87̤]GBxBNz̋:*1}GpEe`ٓT>;UFHy{iX)uUiݦ ,wb8Ant{#rz_yzIt-GAݟ&50ꑪq:D+htFEG躃5} X-Nj3P|IVG8ؿlq|te3ӎG=ΧVSr+ G O'br/`r4^E`|lXޔwr;X6.gVl5[sha˫kOJ-G1h&SFFbG$^/RD^mάa! FPS[4/P!;[.>3E};?=0ބIa@zp1[}nhwzswH+ԘDzva{ "DborVEfrj8 + fbߞF*7׸gC6) ͣ|V>ҙad5^ ghz@aŝOzwo;A?f/QI~pԉKG/Fb8 sJĩ`Coiq|$IڅrFWEl;l[hum-a!0_Q\rsy,fCsBѣPoajM(<Ԗ#l>5泷B1g J9v%Gagg}u,Jʕ'3Ўa< a dUTiZ,}m/uL~76YLK9B=ąh+Ǵ?x{}ݨYj%}~[)h]AZ~~uPf+ |HE&py̷&$V"㳧eIֿmm5W%b5$M'7s3<|wkƞ\ }TyrkXǷa\DfwT$+j>TbI_@,5vz/)~:7UЊo=x=^0$ɖ Bׂ!3]b vo2@p%~*+,AmQZ sܶ)祈SV=]}D/u5aV&L B/}⍷ğz/j.lP3, @U̸"¨jf1=Mǭ3u%zKtj=_db,dRp5bMc݆/AT`~L-Km4LLӼ1qb 4A# ylv8܂>Xp/{/K᡼Gx`$I)+q _ˬ؄=yf6YpDX 0 :a n7 s]*:PNNF]--;YcRVsf+cJ *EIPm(ɶ?K,.ʶJqeE_؄y%UzsMY㇔]k_<@կj-;F Ӭlߗ>"ߨ 9%!E\<(ӹ( Kj7bNweC }Xt~vtԲ3VǨQǽ+1`Z/]㨸)#dE7OL:wen~ߊ /ITH 8*4+sAA(􅲗y$`rz1f۰#v,1X{7`]}NW*[Þ^\DBd ę jȶ__<8w#joޕ[Z-z#iCH V_Д7ZEH[/|3Z7آ-]VwWɰYFi \.6G/OZ^G/ fdzۼQeOǵ\>)R^C5}g'?uHv&z|VOկ.b ٹUQ5}gβ~8KY|x/7EWYC5i,\9K`9 4?Q^e. QtD!qٖ`ћ"?q}/%.lm@o}mE=ʱ8c8x|3ȒkcIľT5&*m: f>-sYCGleY eů%NލyTl|rKG+.V|C{u{Žr¶ ++&`>ٹW˩ cB"yw {FKSM~`TF%6 9# /p%/zh!.!Hr/r.U'<R+T2^D_~)fFz$ܬw(MD+ˈ٣>"0E'ī]^'!rMBi(K -43 [.fSFLi#a%7D+ҁ7m QS쮗*̎A-3tՊXc*R}Lt boISodτowc:yvGwL6,^ou[G\LXkԷq`=lCR˅/AedgM8* $3WR=-9 nn< {HAr+vKVlGt7s+;@"![ X6? '4q#stNAw em&e$oA_hMO "p‰eZԿk2wMDŽC>[h_P2!Jw E'7q1 EbW 3*C*5=7?-2 [t;~!pbxLѪ+U8 Ru\+M'\IWKn_ISLfoy{x?sHj$+o& 1KΈ F!8>AFL{z}fzQi AmeD m+0fAgl-g zy"Of*]q,{YgYqucŗEϞtY@d3ph.XZ+Ź Nm<4֮iL@AFB$T1PqYd^nff,9p*HrM_>O|;,8 S*wFQIA> ݆ab(ĭ#5 80ޡS^<[ "T@*񤺼 +!u%$ [YXճVC"褉4vF14G [U Y&s .;H mb)|L+dҹ)g&Hͭ}IL$ZUº/;Wnl(!t?neΨOI,sLkkOnOW`2۞/$(Ÿ0&Z@WY2n2%<8-ܖ',ymjcz0(nRp7 KAC1+ѕ(\x"PpԖyxZ٥\G4zĦQPcO_|Fly>C ʕEk0 ,1eC AXDQ F%U5? t,X(e‰ !(]btfH{!DKk> KOPBPóv"5\r?a<퇢l6X&ps3kf/W&U<7tmdRNi s,O{;82oo_\_/Yx>qT,zUpæQ5]]r4$T($"|<RƾX!c}|ޗ3՚`V$785 ~;@JF04`òR( \p킁r\ ޞhQԇSTvׂ;*kzsLFb\om2DViҍUjأD$e$ӄNw٠{dfmZ^(IZdH~)5leW JyoT.CQC׸Dm^m8CΩ<eLht8F¾>3v^nsR]VR8}Ŭkh|߇t |=hKh5q(=8VF{q^L_SJ{h {j^|}mӭ8|ݲ4 r2r2^*^jܳϳgF\*$A۟dX㌅{.s'- )H6%G pszV2ö夻!ӓ1h^gp;I-[dt\A.nol,ϵ<=TD2J/r}OQa/c Zrὓ+Wϑ8_e\ir;a'_$ukWDm;W)dmY:T2.B=wKTͭ>"3{H:`[E]Q Ֆfq5|$Ve m$KR4n[mGo/3K~<=qYd-MpdvN/V`gQ%GDb )6C)cOXܹN)B/}UM9IZ;rvmSSꥄS\g+_ĝ.//9,?Zl-נ*h]Pw9Q6[aIζ/}zׇc<*Ge0azd5n,<{8yښo2[Mv{͸IYUO&i~*kb(t~ِONzYJ42xM.i^b&S?]o8@I!ԗ!o-\(x%)&g_] 3eQX$ؑBl,}&y"Y cAѾgʏ/%yiq0zGޏy} }R+J1ŏx&ԉhN6Yill^Eyu% _U5 mrςV/|Aϻ͟ d ovA`e0G =dL؏7wcS,\/̈ъR $U>^(]LCvlSV}lnolN0yBx=G4gmԧ9*-殒J]0JX61?%n3ճn<bu.GX9l%`W*)/UnMt.5ix0A ƱT K=k_-Xq|)qQ|s=R0F݅ SfR4zZ~.?EdG|m49O+ɏ .{`II΀+c&oL$I4̾_NuWopآS#Ke<^Le $Y0S7Vnp9o>oo}K%׋jE wgpebXeCoۗ0(  AQHI 3lXqυdސ.bN?v)@*G4B,c9 bx^_ ~ebߍ,o-{T(mrӥ߀! iI.d*a+<&4mE4@e{k߼Y 7t掏}启d=ˍ\WA_ix^:zw61-Q"0kIU[Z/Z ]oc60scEٗyӑ\zk"Q8PIGD2@K _Wdo'@m(uI}6MDʏ1Xz=P6S7!bOBgSLz", 0PWtL8(l8#ePIo(d%h@ǧt 0F@ޟ!BidL̢;kJ!Tn `h~stBT.s|E>ߐ|xHKTֲDbv^w/^d/UIK _Cq.X0!sIVh%uFI{G$} xOZY`<"\ǑDd%hSW^50 Zt@֢ТhF`d/;+# ,_Jqn]Oqn.xyFѕ8i{15eeP?/lw=%b+RVahIn Cq, 9är<B 1NW~ _7 lAm P}%Q9H^ğuNKUכ4saH\&. qfMWkMqcF-d*q韡}*%sO03IgȚ/a=%HF( ,g֣UDпO| 3l[L 3REe9fQUG'lR.;pXXf00֎Iڟ  ][,*cu{}id<3C~]\KMؓ"Q-JSQsScqӀ2ԏhj]k\⹸\" 'Ɯ:q3d.v6)[>p "w};]5g% ?+.ӱ I0^[ޟTs9dkd|hS~B<[cЈ>b-G^O.:`| DS NU@ry^ї%F_n.D m{v3MkhGitB$dPwyPޒJDnp7mDu$ qw:c\:Y*g&mX~ZrZ'aJ{.ONcN< q Cyfb?rLU*͹P[>TwJ_ZGGN)5Z NB)kǫSJ]4 eaMHLIj3W(8ѪIA`]pGW&O VP*ao9Ӹ^HLmtK@3V(?t\>i(ΌB~KPdR9WNCXؽ[؞* heq]&["{fEa,yX]$چFȉoa9,*,'Q]s@=6E" Aoʓu+i12#O"aBf)rŊL`,<5M}K,rt38׉1g[pPLIh$-&p}TCz\[430ʵU'Xom_뺽*|15~YSzr_qv vt;O}d-zڿlO}`W-E뜊ľY~C-k*1EtU.EV6d8Aclʾ 'YUf^_+5~דQR(S$1˱qy\y}z^;ߕMxy wCTCܡLkTN0\:gB _Ed Uq[oFOy7F>oQQ7~$,?~>9S\I4g lQAHq+W)Z'kXaloavEɃx_gŇvl f|gw. &ߌpytQc z3m6 #RpMomPqtyMGj ?봗 CVTk~RGaJ xYBD27ҽN?,$v!:ȝr@ƮB5ke/ӌ]+K ͛EvVG0% nV/i|ᮎ.D*vI+"7Bt[5ru䤷D?vLq#؅IDSǍn8 >P%yac`P[4}YI:' -dl (BzN{ b'y$\`ϥӚdbQy'6AYfb  ~BuZn|]@B@ )1Rq(#e9-PmDJW~l|KV~l\;sl-bN)WSuKzvPo>"=ح~KýBDoIs7~{h_"lÔO'cZ<|~jKG}%_gثDOT~2(89 ؙcb9]E#2Ȧ,v^rܭzJlK;@Oyc8D1nψCa7 wA|9V/OqBͳW|P^j+1o%WVqƶ1F7兖w'G# &kQd2F([%D2 9ll5={']ryݰIٟK6rLX$+*k- =dW3# *kG MhOh~"?j1fx8WE+Dz) ;G;Sn`(qYgņeLA5N ;O [|k&>3^{N&1ubo/*aㅛ>U/rCx {]ua Q#E]=v9DEdӕo׬MIUEk;"z+=v Ɠ͝-ct`@N@ϒmerW3Vqax,E|"W2T{V*+@G>|]4 >6>WQr%׮ 1# M3p\:K[Fj^n1*W;8 i xIm5k[] h"JR90X\n' 5{?!n{^L;Fť{%Ί{sO{}[V;,[!{+#v2D+dD{I Aǯ}x׹hɻa0/.{jݎ:~9/nC2KPrg,Ψ(sB-oOryH@]3X/v"g /,WPJ U.IQ@1yo N&b 9&NÍ0萞\Xtޢ})< 7t"7iwT?ӌ0툺Cy2uDA<ĸGAM"l\_9Vlb߆Z|yӱnOorwe𶛑YIO(bD&.~rkpԼ =Hć%8 uuBa-` QTR)u':9҆j&wKؼ@p8 Sn._RsW)7D  vNs0yvfo  [ ï&neӥw̮8o?Aq6y[jNI+iC<w7/ٔϿڿ54_%)kp<)!D$%eW~!o{zk#*_ O/\f-O~Է~![ÔEf'Xɮl9)+=ST,c #%\C$^T; <X\˵ /w`K =o6F{(Lp T23 9TMuv y!aP" Jc^m T ՗ž{ ;}_ }Y _LuSsQ<ה4ZFOKoktcJ)UFe'(oOSӗѽ }0mbp[ruf @te٩QCፒ1t ̯A~Y n^d3u@gŰh_ l2_u?X D D3t#( Px,ī^@'0ͪZ;i BA19垔"uś=>]w(Ӑx+Ao,S\ƺd$f <_j~7%Nr{P25BL udI!P[CU5*8Q%1Ia뜇ԀzyЩCs t82EvҥbL81#*:v6}fe׭2}&Oz~"þ<7þrp<E芿$M^{tRqMjr{Ɏ+޺ 2@l,#qC͗Ld :v9Ќ)&!ց#YDC1 r͓"yëA6C%r5xn6+d0B395iFv#'~}YB>**u3&iq7yz<o[M([kf,-w>Pd s*&9 W3u/zLl64 7L-otd0Q(ۼw8$ž%x,[=g dʾ)W0po sVP%ZB^73@>i̗_C7}" /R:aBy]mZqOTnKd¡$%Kd=?B>֏l+ 7R}'=MeQoYOfm}8C_}+W Ϡ_C8~6?4>ڮA'&e.+&]F3zq`IK qhgZ΅_T8Y_&~,Y Ϯ5m,{oh0qb ^r\XJ!i4[ܧ1EXtX5n24^;.>=v'3mxxI.ۆ#W\6כ-1U٫ qd{8}+hӼp!,FEX#`n3_7$K6=w% \cL/6کL|gUZ4V'ʛa*{awziqٰD}9UԂ~Fޚw"j8ϻ~]n2q0í>πYwZ5fxU"/l D=s >4FQ8{D`&*r_m@haBteRP'`mz8,M#'{2hVV ˆ9y-7jT`gD,8%r_jb@9FMfUffukZ6'I;Yn"aPp^rϛown O $n|(: "4wgbőxf H(e~ns0[Q:[Ie2 VxsCbq#2-M xIwk h⧀xU7MUe9OijY?߆.&&q̟k )>e4$ oQ0Tω=2Әj~f"?v8a>#=g B^.Dڛѧ:8z9P ΄OGnw;yk|>_Od9d9d9:=Ԟwԍ߄E-s:c`fzd{\t5-کX`𣞧Jd%tB 6v J/X-:? XjT4V%S%Ŏݢ󾃰c[# Ћ ɜE(QݍsfSG Nm;Z}~.103_>ld-i`6.|(9pD2%jڊ #eX/@Uw1bWhUgͅo A(Eő]d8@i&;ܡW:Ҟ\Wߚ.Ul>jzy\h< Dx<4^h__LßVͶIXP$7)ިI5%wR0~B4!e &bz)ߞjs֕!]k wgrу:+:lTEnQ1ME'1olS$*LM<"!;h3rK d?,ɻ^Wz`% -%Co5˽Pi_v_n$*74l-V؇{kfbV柌ԆSnzޤ;*d\wNڭuL`GIoA #bXsOƁZzț>$*B_њJKjO }s5\@9Em>P<6aIF$̧[E bIq>{n|UZ̧iVlfa} |r#l&G:-67 ڬ_F%Pq?g*`8Ou|t,X94O +/ UBJfCiS߀L /:x7)K|\Em,^x߽;t/](_. 4m-cI@ݭbD&Y{^?0&Itp-V'B!H'K* ޏ{eq\<5Ʌ˘?pV02'%d𷁈 ݸ*0ѓN8٤1\xJ)RseYC m쥥qSul[=@'" QMu5c[+z媍])fuVϝUN[O ;~]U1~,#5|L湚Q_`pX3|J , 9?26Eq!{? "S9Q)];1h|En |HKLŸʾޮq5Z1yE{ VR"825d[Ν!kPF,3YCK(狭x{CQJ o 1DF^Q{`OOJXa k|e曹)P5C=bP p)*x ^=Dr U^L9'bl!A7Փlx,&bIM"Jl+3pQ/5,*)`4I]W*X[brl4^P#<3MrNbUJ[1D|[v\UgmtF\^GuBA^Xvb>u0C^o鲲sGvuIld:$ʂ+dtU[b7x.CH)FwQ=}h)&z3\LHNT+L٢|zI.b-XĮɤ!]@mQ񗝚6q"oIP2I"* *zsw nbX-Hi012Q<Ġ|t{eK2bJ] -y^bvHIw=I IlT+"`+\vz!M3%Bo{ wm P߂]nrZV|?+4[U㦂CoUK^;\ɵ{Ǘ>Y}(!k.cSul@5FY_KF9vcRqy7w/juwy5_#G`4a#ff\ ?*űvq\ ¥yKHb3sx !ͫ+osԮ*:#n|/y _Lod&WfQn->*Xp<㓈&!{cZ[Z;Of.^Z Pyp|.TBer+B#c'@B׏^A㐦;+?TE @`]a?#LLĥʜdQ'?3~Gbľ4=O^S#5߸ԧR)%x+/Ͳ<T^U&]rcMy9gogπxa/([:Xsٌ.Pj M\ݪo'kEh`>*,>ǜ~nna3|^5~E UzͼYL?b^vz[_3HRa/Y=&O9V]8Y_, 5ҁ޽eE^1!60H6=/g7ܫu{2!ׯLE]:G5^jCp-[C汵Q9xP );)p=M^ϷK-K!NM`h09R\C=n;$,xt.\&Dr{r3h@C!]X/!Y*`ěY3XTr r$G5EKt~/,C|74 B{2Q]Pu%4vifrhft; 2N,aKZ0qOIx2@(02isD߁ N[DVDs3F@e'to#uX [NOa,"|cqbdpScy"{FDz ZQomߦ -dѤL%Y,jdNت3|kbB\^3 %ė kEfۅT%N<of F, p< IݔBP fu_,k&7}7S\z.Fߏ˱JW4 S 5A_j#C$+KvQِ€,Hdu#UD6C}DR׻ʧ"\+DZ՝8A {}]A}_Y YD^]nRy x\ci/8yS* `{ƊCe? j1>OyJu=pv0Y,sIo^΂HlɎzrUM$&)ήgL= D'wnD4 1$`#0.\ZT|&{87ZDu =|֯;ܜ]_ eoC/(k gMPbyk:N?cjqC] 2oWcyag$/_E3_+\pxI_D?qD?W Ο! ѭ/D?㜮,k靖 !xjHQF.51R.:i<9(d@|}( YwjÖ"t}_mt&:4nHfam$ix+Tm}_z1+aXZV¢G TO gh\nz[Y'~$,#7B9%"oUW ;~a!@i<H /׋wDԖڡȳZ\S=J>oK9ΩF޽u /%/Hϱ1DgH$e@kBcB\iU8(oX`"B"ǜ!vAH :}JѨ/yÑl ! yhiL tL 3- 3aϔX l/컥 "룥 Biڃ`{o oa,1`Tro7zy5[w,gE50&[QjnY%3guhex.[ݎDC|GA&Ⅶ} */XG촯"8TSXoRߡ ~U)#Ҽ EkBeu2)ѯz>ExJƧjM2]`gRTPHѣ^78z9c{Rj$mF<`x8"m]Um)~0[}'0?m[= rm8P1 bJQwW?%—6D=؇$4c^,k{L¦# ?K9*=UQ7x~؜r Sl:O|nP >_axR~>ȃS Cmz6ыK氮{y9?yǧw1g-FmW^ALZƧWVz^-D͖ݍU~fkexf{7޹$=lEP/@"Ǎ"H\XZ~)G?O3Su~t+_k˴/' 3>5ۯ}>f#>-so~(xt?}~N?¿~S1af\FN_cUc@ D,V^Ə9do(wgeᭅ/A&Ù񆘠e䑉h7 \Q֮S")9S7Fs2-a=|O0{ (VMZ8Uv!<=4Wu {jb`=6|Q% `Fð_yB5gl$Oglr-OQ:x mFvFLǘ5xthY7"ǘz, `TSsr&f˱؅O S! ?-^>U+OBQdي$ W YcoG`ZB0ЇV=Js1 dTRTOMkaдl bx~ln:R1˫KH>t"[i1FSz.x+9+޼7^~*|˦Fm HFMCߋo2zf\&<~#S`>"Vu75(xHp ݂F[[Χ myL^;Q} mpTn}үNls-E䥰_|EՆЋ/]oƂA0м̷ӓ/4}h ="7 _NݦbeӃM7 S!k'p>?!OC#͏DF@%yB Š8HѲTPc5L#сCf [ ZtRA)2ƽ nVoНz vA:ܚ3JP27 }*.&Q̨jN/-9Oĺ{jfNicj][*Șh^ 3WH\{>G[準 Am4lt%vA/]d]'X,$~F u;&rnac AUQ7IbIYu|Z o& FlicpݮdW@Auob6hnSE?<1lټ6FĘ6(~VݠW֌)&=u v =s !ĉ}CZ!q pޓpJ7X3UXs$uM43EzǞa\ERW}z2i_W[5[R#7:CJ&$hS \˾ac+1\̰v,OG? Z*mއ_ʽll_?i;jgcE^0 9R{R=Dw*gکW~Fq-^\_4 ٰ}30sL/:)p@jw{$.IѬ l;ϜprmAiBCvޭ"M/kt4/d1\itL*Gk\hmgwfP9WV,vcBB|]s.HH=ܡf$ M*s'N}W1TG/1DŽ7C2 *#+܀_R.&y¡4lky\k6fk2u5&__6Q~^M/7m{=KLFL'%]n&7H-k%PN7 )`駢kJ̎le\kRLGrŒOBYl!>*>&cڈ댦Ge89bUBtJ</P=0[^ne^faR~1|БEމxNU[ O.ϴt#U'#\uW'NXmp&>=&:^ocq2]×;o# y^ؿ<|9=8:,o)g_&ȿ/.EWɨːvno~r-un)c_O?} Io5#O#O# WH$jyg ALI3+A,CcR*AjE=1gkDEy5v9x׈爀>EeUG8/g䶢? F {hf<\:h^մ9Z/3Q—mC+ug _ z-^p+j4[+a.Y03E6+b$}n"YGR9O wɫCtcߕz`?}=Ɂ&b tic*5!qKHϥR덒^o%OS7Cbn2@^=4Cv:Ǚfu-zdx~32Tqi@1|4/w쥏&fibp *vd!W XJQSJ`me/xz2&laݎ\I8 iUy߷ Es\5x=fplJFv©dn4m}zCL2r*ihϘPd}R?q>'& =;Ӛ{90+i)w/ ȮǤ, +] ^u:U쎹' b?S}7q,$a}JcAxK@=X c@i9yh 2KĹ/y(?.?*X"OF 4 X/ -)< ԣƜ9 2?IkdY<攨<;~]~6I YbgX Hen_*qe꟟^4Z$4%mm!6*~^U邠ejRzN{mx5OeIh&({졉,$n偘@Utv%=E}qk܃6K5~pgY ~AY޿_򎟻wxJvk ywo/x1Rg.˰}BmwQB b9Ҋ^$,YbTB_BDԒ}"<1FɈN ,V$)Ƨ"K񅷭\LomdUOT;jr_aBWZRǿYf3%'j/L@Ы+H̞g = 9*=gQMU,Ơ`Ql_s;d&`ǓM2f<(+0#'zQ9=uO=ܪ }P/;#D_Iď;i[xv?!#5y ZpUx+>e?l3,C дe?eɦ} /1~?|c`^43Su+-YN߆;_5fol"} 3`am@ Ӷ}}NWعJGGH,),ߵ -ƺ8t P?[TGTgʹ7e{kJ:WWn7 pX=>3LRx)~=iEn'!˸g4PV!;1#6biw-AjFa ofxRބ` ?r]0O8'o޸i?B4(uq7j`_]LʠОL̏J@p;Ž#kl+ld'-f._%-*4j|N Ftϭ#E[HQe1"+&#QM!eN@ݡ|`i]L:y{%(W\#{rF5dDu+ Iέ?5Q̉,otodI:gv1!N+ $zLTf>SA}& C=9 Db=wP}9[dyΫkZ II~+U~jέ{g!C/5TxxhQ9q&_^d--%Cߌ =jXGLUճ`n==jxdY `CG8OSPd ]DZ t.a0JD)*nOqV|w~|cua$֖LQwg˴c#}5hɁ6ѥזΞ dsNN~yM6ٯlc[+ \I&ۑ^(K+Y[n5o^#_^~z.9S0pm'N1H4kl4}cC~2 {=U𭗧|H'qm1_9Ǝ)GYlsQbejp;Oo^JzŎ(w}[w4,yMU4w&GnjbX}.ҬfQ# |墀`h˔"U >giSڵ]%]CeAёB p΢ (Y: H '?AW\ MٖWl(j|T` w=[) Vcr9/05 ELj 8^eXsgGĤWVQt˧x짷ߨvA3SvSU4HWaIƓMGtd70l<| `C~aJ]|#M ):0Kl+˻})n6fJ3uj{A<֚H[s;_S|%X5|V HKeNp| K(hM Ђ~:CsI@66OG>o$pR/1CMUkAlOv*R%g'~Š~T*a3oGNəeطzQPMY'Y\#< PA-suHmoE|}$Ts&K~܄h~T2?1Pz1h8;JsIY'#2Ѕ]ާQEĎKIR(Ҿ.`Ox *Y{ֺM vp$棘nw)Z5d =ZxA~3mtzdO7orGȿw]l]Džb~])~ۿ?}H {0~^V/C~\Тxmߩs$*SmxߚukQT+A"[[V[{=S&pTvǴ(R,K_?_*r+6$l\Pd;@LE)ōT!X2~S_ݹ9aY #Y[ıI^qij-PrC:.m6dUmT_Q)^f k?u):H P1_;V,;/9EZ)e[+_oOw}3_E'?:ؗ $} I;@ҿZ9``+%KaE 7>56RzyPd'Ņ^dBۖa,:xcSnvﮐl4<7 ꇧB!c4ޑq=%X/Iu고'Κ.K6QWD7u);s~"a:i3[*[M՜5ܯOF4+]ratH؍xp(/c6L/} sA9F<ʙj*vyjS#su+>0 .KO[NnRtL)6Þ) @1gC`*K{B8{1ƪ7D!]ỐH%eԭ|zy=6N;jny}ugIvfxgobut`أ8CW~ӯ/&(l$߳6+,+;?yG% Sx}L[r:c͎ʬ|CX)&\nCV"9^}U=Q'rOqYZSoZQD4 W{|^1xZA>_݋JF(9"+\怤PN4&;.\,㨀['~t{ P8Wދ[?Ľ@{{|SNyճ*?s\b}|9bŒI遈jyŬߴbm(|uItzyO~0wD&;xٛ'_~jpH[Q$Ֆ`,L$8Uz[iN{BiP~n*{k[5aФRH'|z OS={2d➖*ڼP:@C acrh-EZM,lMx% y> 5@sܣ=DSqiX3:B \>m kaSS7^*^[PqV{ "ݨߔɜ%g;BBx)ܲua9K+x2u`S(G/ R'8гb S 'ε,UčjWrQ'}3|=hp/v/{uh-ݧ MFo2Er?oY$+shA r*\)S42m )QNb>XC9UhT+Hu[-Ox S.p mz4ႰA\`O\yU4Uy:b}#lfd:ĖRfн+T#_SRdaQ.OWrƲ9ĵrGMGb`cT[TsJLV-CΙ dإ>"WsǙe uzckOO9!K,꤇,R~d{sUJ#Zp:ass\ H~^ M. c R+z+a!|뱅FI~U Y)~7wH+uT?; C(e%XHS'k#pz]Er|g.iDa'OƄ`Ogp+`{{&$ tZХj UȂB6#:SnKu@[I"3AUEzI7=vPjhg׸C-}k\TzLRHo jSXRCODOB'ڊTEʨ8x?~f@{\[AM3~:8,;D_UA"QtJ7 8Z ԡ'?7gfeo8LC dZ*|viyhػzR$(+Ѽ|c[!XR4۽TP)*?Rp 4u*7)֦p+zv4`;uCiEǚO-Շ6:r&XyJINzW)_]-ZU>QM^oqTH[zV*:q*7-kX!L?x C nׂZv?@چx x4NcI g)PM~?o&'G Rϙ_fr<;T%B8Y_؟ dHzK9;+Xt='~SbJ_/BO_s2vpT׳qppn67~6V{>:!/;9/::gu>W)sa+)v:B7u|e"jwekCLeF報-Yn436KwOo or̐A1.Yh8W\Wb ~A9ErH\gVv0w:Ip~C<|3.[rIoJ[Đlm`o[ַcV2+ؗTyKE~j%?.\IPl c)b97 lI89ۓ_B7czOm4ajrL\P?{y%` 3i0+GgH[XK5X{izy%KcGW>}Exq,T0LW|)/5EC!B۹f5C 2T}4rKk֘u> tmK}tSZ{$0B>:<dҩ5^)} xߦ%'1{8So2mz(z>PM N_!vh)XfSVw:+xyKX? 8Kzİ7ljp8<-8xm6?vw])8 k:Zz`qٓzOtl]׋B8n?ch5M@x'f`eGLܜuqIڀjpJe`DI_ɉNL~GKJ8& k@&MmgE(Ժ9Z-b(1G[Rb9OH ?v&Lt5  RSfOyxȃR`.(ݖF݇'y e.ϯO5N, |!uFz\mʏYXNV6La1#ӓ򽖆=[M.eiZԒ%mA7L܁#%J HuN~<;=NAKy,?\7}(mxY~rLn^`M7(Q|A$jiH5ep[n1 }~;7 俀 jX^`}AXh01,}e  `Bo￟?Sǟ9]|falOw}3gO ơ t~v"0N@u$M'.GsƷ,#Da5aQ^+9d(*5;+8}Oat-k<A" zMN#4qzx:t>A${Oli{ގqS-RXfK._UIX0q8&!`FnLn$ Ds*4 ]n[t(ȶó *"_r+MpNM1GvQK@dpoGm%~ffC\KWy!h6 SbN&w>gnQV9ntlI9%,b=O|IN7dY* US{~/S}\'Id/-щ}OYK#4~b>Z7yz4| bZT{ڊr?qTY=G'5<ʋ͠=ы3`k#z:i{:5cc ?E~l.S}*hԟ'!z7Otfta3"PIzAJo;$v] cyڭK%!@$*# F,}ܖW{fPo-B޽lDOOyФC;'s%֞5zE䆝<t`P$񥻇z#jh$$3 'ϓC LnWI5УW(/*9XB S\Q=2c^ ]=?@`%lY^%3/W^{[?QR؟Fψr0>V9QjЛuC3O*>'mB gL@i_!j1!{='7RntFG~ |zOA(6{z)>$2ӯux= dFr Kgm.TtCKgeG{c], ~C.) #?=sYU퓧шw_ (/U9?!ReJOےy?oS.n)>̾L=__.FS!3_|5%2ǁj]5Ս'1u~vTğ}m߭HaBuzQ/X? $_.YdoCf:e/Ӌd۲{_ҐH5@ivŰ4w<pUP݊B.wO\hVS!P QU~NnS00=6;*ylwrH1}5Hvu(T5&ַ 7$ Qm7~`Ǟٮ11ѧ{|i|( ^ٟK7,n"/ =O=vuY_JЈQg"wT).I+Ks>OQ_Kqĵnˇ\ O=p G?v#?c5[~5\ཾb!֤/D)f/P^9wrdG1~Z0n~j^1؅y {#KkOHn55Lcz<7>C.>:7M?3Ί۳% 9 'd3;>'Z@QwP B/Vi"NPyY|X1 G]-%tfbP:-~oyR ;YQ6@RA$}R/ >3{?jpb=ߞ-H,(WLph=sziTEb}Y: d% t(ܽo)By(EnzM*ZW-?7%xKaYwGY ul>E;U^O'M,Ž{k3ԫ]Eg^11| (Ś,h<0A6]>;|vvPH3HedSA^؟Opr?jo=dӍ;eݫ_Mlr3a3C?}~Ux Ef&5X>|H%g Ӝ L5>6 uvS|^F~޸ID,jFiu RC:@g4>wUt3ފ6@eBkX^ef03n  z'.L qB`oWL/ ,ݲ*w3Vz9DPS( . 1dL7}a.ź!YLvKsc;rjY ]fju"iYiϠ]xDGTOmB-Ax;03Q%];W[Z>L;\L\ohP&n[{InzrbdzˎJ2[/(n#ՠlBa;4'M` \闍QrvF>xٵeEu#yvlƹ5l'Y*dUwah QeVrFsiA,Uo&aõ@5k|,'s!Ga'&_n12)aa#HL?IN[b#vWDuN7Qq[C?rrh:;ɨM.e@u)BsrK?6}ʐg[-  x\n(#zs1DX+#`UUL32|4gog#94Y( nu븲l/gޓ7=:Qt_4˭r˝[@ L1"2b 0b?褀/|R L GP0DL9||9:V3p=z{,mj ^yAo.tRYoy/HX{u cn電 ^0C_Wvݫs}?? 2t()VAkr?69+黓rkҦ KtrǛ]m}B_nsnt:;~ȾRM@ KF k@Qyߝ*I|0Wཔ<_ͯ{iy@~T{|g/w΂(oo>ؚ͋Cg!X:_Ґ[ds;Y˵?B-ETݺ1~sZlg1wy`_V::t7xCJ['V=c@[&]n?&AD66[X!"eI`gxcIS1r`R`EykCh)HzG5R@/H2=pxEΚk= [,k%\UG` O-wJu%Dl[Z aVgN guϰ {vH@=VL 眇+F|/:vkZEcys{rЁัO.DVm _-}ְ3]zN4a~o@(:#nT5t%y!ZP4٨ JŕcţZPPqkM, !% LP6jN-I4 eJN)pu*Ց2WzoYN8!}qBû |'%_9P!vЗJ< b=ot;xLK'|JhL R9WP?$# oSeN}f߳'7 |1>'|r;D[| 6Ou۟{ MXMNͩ7}'ՅG]Aî/򑽋Z|!",75ۿ'byD(OK"\&Og-⦱ܮ9B5GtM~x^ o= :ozfom2w"R,v#&^%wuR.\[:NGBf'WH;L.:'0Rpٞ9r@7Nk j5 `R܅d[ܫeٯJaߦ!;qlmeA^H<8(O&={"{AGz1Z FDS0q&Oů el&Row#XKvq_mGZl b0 ĹypO >1SD}׃-V҇ 1k4ޞErP-Pø@5א7 /(>Hb[~CGXL6Uklm-x{yk*bzZ)h<o5ؔc*g}6g]W$ۍljI!lpxnkef v=Ͻ^yvEq`GBf!|/i: 'ţ`.Z:W֬(@6F21{yЏfcZHՋ_tf]XhA JI^K\؅0eBp*aؖDCo?xY=19˃Uɢctj<=Tw'_UZg/foW5#zHQ>T&2bf^vyM~0Eqy1]UËS@Zg)O&Do_m_YJvg{zȉ|N*zo`bz>)nPu" Sɉą;%o;Pv_-`0;VU`]bd"p6>ľvEzz %X{\+Qňy[LurL63n |wimA#T8-"La<ŅʅϲxuU$-7?@Y~dsu4U4Lj,d2z'ޘ?NMf#_+ѪՊ 4 ]w~3X4t+*G7AG@𑝃56?[߭7U_iC/U(Qp 'q^2X2-|{8E0~%co0=IJsLnN73mȓ6]D<|fL.k瞧~d9˕xsG]OӰ}o)P%GnH1g|vӛJTB'zdjeoF^y!:MOnӺC3GjSҐ- 7~Q Ƿ ZL k\K]&K~zUYp4&fd)itk|lHT DƆHvz_,~7 ET4ϬzI [->;^YBT|10Cx ]K#ԞDa^,_?Q%hN(MB {]/xcH3"۝N^@ X,W2n_icp8F _;%__Dh9~>1[sPbH @<`=ӄR>J69s7)^KT]@d󘒆ABuPB;? 1ޜmQ76 f״Bodȗb Raծȡ#^ QP7sF¼;D ]pJA$<{i[->!j| t=$z拈Ueرyv!U2܌ēi]H_ uv{T \?ˇ]2팬3S_cdamu0Er<(#ĎhO^ c#1hrzԮTsj3 {Q2ޔ w Å6l!J+p@IU,Z`Zt&Rv>*xͿ7I]?NÆ><KJ{Û:o$Hz#)GWH"EKgn!|a) "hcT_Ϳ0Yti,8 ;_$mqj2ئdTlnjDB/|f$M@UxB(.La'i[Vd?=H5ΥzjCk 2Q/2JvNNh` Hg,f4|m꺾:uG LޡhPJƓ֌t{Mk*qɏ9GWidz4zʽrsh2MSZuʘx{8Uךtt|<"s\cd\uViA! /QQ'eYU鼐Xt‹p0'~l|_>C©Ӷ3|lO ĉ(#gMͼx!}˵!*mRAh8F=]7Nw! .~ui]ѸUY-p!XT,]z$QX)$^ZkTQ3XQ34SaEt9ݡʇ*Ls5oe!*(S'^S{Ye]y'vKU~ MdG.]]LL@RhE}CFl4XOWaZ"|ꥻ{{Jd=m? 3„,N_G5lR"~pBqSb Hf[qu..v[rll ;jM$X$Aa}H([ob)fֳk> \}91|xp#\+Y Z?nOKB~& 7{dƠxru*}q4Ł|+U#&ZkmBQž;Z̴׳ʀ8j#ǘR b eӴǡA ҂|XPj=%PlgbmV= yXrk7镩a31^bf~@XaM<"-#%V=.Æ'*FϧrB*=DPǿ\ś@ԠrdW8RArU`mZ&LH ɾMO~ EQ^H1OXᎏ;bgϓu' BcDddKN}Y7Lk枝?q;qϘ_?q$VVOMsɧk/~%߯d5~ (xbh}6Fl]Pi v*~֠N/u:BUpCA|ږډ4:$ -pǠe c6(%թHϯݱT.̦8˲~&Ȉݕ>NYY\둮̵ -wV&"L`LdSX|ej,aЕ5QIe]*rRl,k%}8163rZ`}+Q ˣ~e%֝̔Wװ{+*bMNyryCz@omTdn #cM/zd:&-v~n{I\QX[tQګ=[6YКYs0Ԣ9Ҧ}X1L/yx } )p~xhNkB lkv_H4I0N9{ЦUclۊ?Daf z}˓ װߗ4+4VOM#t NzTi# Rȃl6^+`o= @G KLM6a"0;Sz\zJG(n Mmj b=OP)%pbg;7kG˔;DХ 8#2}wOA^r(>ko̮=}*i@a\c Q_i9FA ӹUw O.Cxj-;nY&ݰ2B;e$)KlPኯ:~%gܴc-LA|"<11ܳ^qʮ *oKMKL$ػ=-Z/a7eb!4ч@H#ҝނ4@ cHX@:rs$3WZL;:0. (r#@;34Lߚ~&ݽb>))\1#l3^x#OD{14lgOOV" |&j!=o4cR| EDꮻ;ժ}&7\W< D]Ut&S1́VU )j+SS6F`$!^Jp Dnٍ/W\ >: 4DÏs.p.]ME4wsibz<{EU+4u5N:7ئEuwtnG8mRӹ|!gy"3t.lsJNΰ\G47;eA=ZsWx5Z,Q{zK)Fh?21j8IrO)=$p^GSJn56p6*?zks4%_hYGX+mN.cݴlj{CDkCl0eu32ΓK(P6U"UK,fsc \B`[IJg6WTK+k?x%k061^?̯\N :_r8͘ NĪ%K')t{&YBΕ$4E1'W)TN w#)|&[mRlv#r] |d_;?>5,~Wp-'0oc Zx>Prmi`-Gexxp;pWTQz[!a ǜ2̽𐛁ďANP.utwgzaf l, gؙWõwA}Z;^k(],׭J>.3(HZQcf~>"DqGUԃG" jrd<$2 ̚:yQj7Dǥ/+$`ѥkk8$ Wfdr2.`{9W'IfrςL16I"X1y h(cW=ExMvJY ՗`xU|={¶C lM: w?nǘ"8hϾTo?}?wɣ7L׹ȺZ:k:@ɢve 䥓m-ģuۅ}o'G{X%yK` s@N'B|/牖BvO 0g{ݎ].:|X8^\<~ZHT3K-,};t'!4}47V0y Z]pD7RL%#6z8r2bB$~S82s~ StkSP~ͅ服"q LswaT?J_nBųƓ%#oc_͟T-㛿 o?|ߨ);R+|֞1Sy/lWu.SGclV>Dajeiu'I<eG0ws֎jLc8kK /ej"%vQ;u-Q/m` ,-#B|/r8 ; ILj#!O.q`}$?xė̉0'#]c>եH}OfcRkV>_P%֔ث0 ~ (X7Z*uMG r!dtz7gOC@ H /2фEŃU$V.u}H,uyw9Ulw\ɾ qT[ `^lJ7=Uxgzr@6[(eIy:^'FSy:ф; ~a"_F|pR3`I9]K ˲ MBMf,=cÇQ{,۱]̢PBl# hd`ߴZHݽSq {>B4,@.gQlkq$߸px[uD_p~MW!㶧z`|aH/SF."W 4><P5q z?,id/[u=I-ϔhCbxG'@a[ym6I|(:ȣ'W7/)e1$:֍J:@[e2,;?='ۭJVQ̡]҄_Oy@:dMm|cNbb]6޻ *ұ\7t= eWY,8ϩae L0nJ;hOxDmN.'3u׃4G,63&mwYPRoeZpr"{ɐO$oᳰ6|Z"]b 9!{`㐴X!54A"P.z_+\4%eTpZ$,>Q~ҿ{/oByQP90'yOs2gCE##lu(-g;iXc|S.CӎKom`u ڑ(AMcl͛!Qe> ̕!GE[^F6Lʶ37oo.OmUkmeԡ/f~/d|B`}*X[ *a{kՍɡr]3űZ.R̯ݖ5c|Y3m|U P gzo^r-*59ub_eMs1~;t3"VHWx O)˘|SeL~+3^‰elu7SBt.Ԭ|RW/+ּa}>iuEql}VQ`jq*^ӠN뷴u c;a/ P| \od^~G liuVps2=Ƹ_%38'طCבYy㻮>fکO}nyŕMk1JiP^oB;ރ9(SdkWLA)l;OP)։)žd=B =9oen8=R>M^+܊PP'?5?+ǯu!/;} ,U]]/ rG:ا+@CM)r(dM@%c;} oi"pAEd6 ;ζahSZѕ)g u,4*,:z 1FVz.oO6Dh;;0%֭li'KpC4Џa҉n:; 0_FBŅ^ FI:A=L=1CyFG%YGAݛyt=}\#b|E H-4T1 ޟ݈CU628W&|9ad1m)UiDHXB$ MseF) dJ+/Ƿ.LBP:bXSVp BTY!i4e/Z!! &axq\4xϝh.j^š\ }9bĻX~׌MMfhA._=30&Ļ-hʙK?QFd %js=m_APV ^HPKtPKoAS1 __MACOSX/darwin-perl-deps/Mozilla/CA/._cacert.pemUT [WaM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT% darwin-perl-deps/LWP/Authen/Digest.pmUT bM1cL1cux Un6} Dq l۴HސhF-%Z/S /ə33̐- 8SqfR%m'H% wK TM'w?p K/ر+ ߿y`QRmG,𯾃**eȴEĠќCdG#;9*9osVS#v_„1t A\`!ަ,JFk/(q'{ $"PJ@~sP H3Q 4d%=1 k}=Đq*8mU*8iD.}Ț7QsZ/RcfMUN"Cd[gTNbv5 kt.MGQ'4f>3;lE'D:Ղ&~jlm}u,t'EKzo)"ㆸxΊxŤkUf9 Cn|y|lJL /jñ:ﶓ9ݮDLj׼V( i{=QO@x tGk>zQTĻ5zC +^}Q##ch-Π[vt,x=j .=p `[i)Vb4 -tpZ3н7W>Qvõw`gk!L`.^Zˇ0Nfg6:d*KQLgyQ~9Vd  $!ׇBU#`9svAv/n%GZ67_}~%Hz'AT\vЪCy,]v9g |M["&J⥗Φ4Mݰ k{x AB볠U_arm"ǖcox&O:؎/vNv)j%V }\VK;3 N$]ˬ߿r8 +:b0짳7oZ/z/*}<5˳~sjAd ũX8I#kj?Samoѿɲ\#m3+;~^Xֱݪ_La֊aaPp@w0n<VȄm׎>)ŗ?ZF+M*TZNTe2!o,j%X9j4t6G/QPSj?~:Ʊ粽,64o"UthQXGI2'M!ZJXiZjsףOD' D/:L,|nl*q|id8ȯa=,P{caI;x "{ZIkej~4O6)&"Me6WvAwTQ}EԂ#y}5{5(lZ<)Mu!+9fNFx݋pJzQnA!ް^o|JWV\YR6k9dd. &TdsǑ5Ej"sx|pėsJZp6k+CYO[}3|Aj]^o@Gsi$-Q_^I:JqT!Q͚t:A9ڐ/ΖG}kf0Q| oe{ [KTˆJcDR3Nu&KJbgamb~*+E[T]5eje  vK垂:ڀ(2uR5RtHe *Tb5"}ULFP'd"cvul$`HYe4/FXdȆ-%6Cv1doC_9hcGի8Nsm9Y=KjbYmu/UlSJ͇777hhz;pa[ ~#X 8rً"ي? 0-4Й"a#Şl¦0ɌeVldr &Cd >AC-5/Wt`G.W<b٭ NʍGnZhY {^w;i\z#zʎm~s1<MP%@%]Ju Wg7׷G ]/-g/fȈRs/Rp6YX0$]5`19,$:/R[܊yխrӇAȱ=IgYЍ![ i3Y9^|I Dr/2!go]lJQ6N;zY9QY>pLm'oU~-FE집 ¸"@+b/;haA>df #CW@QއkcPQs|(G'vL$ +6X/(L HdʶΡ]\\rZI=4Z3O8r+ICaEbIŸ htxkXlmtȭikfl 5ۜ 8"Snnt1st9E"a;Wf)g">;8Kˮ D>M!rBwϒI*٩a,Aycp$.ۋJQ1LF@D̾fDyWx Ǒq6KcfL֪fȁ9_GoQtﯔ3-C˰ C4%ڏW8:9Vi`;J IEnw\__F[(gЀ6}`_P05l%/NAi3}t"O^b_a fҺN ǀ|>j26*,UI|`An^RR|q4=fb/ y|:q_Tt2ix~1|y~q~!^LXfW#gx|0EW?0eRO.MjTӘϨHkCM/qLr~TkǡQ4ʨQ;ޣ#Ga-/~x&IzGh*3#éA Pؐ(Ԕ<`\5_TG! @t웳3^ܼ)GK2ƸpPK}PKT. __MACOSX/darwin-perl-deps/LWP/Authen/._Ntlm.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT< $ darwin-perl-deps/LWP/Authen/Basic.pmUT bM1cL1cux Vmo6lb&0$x (n^?t@KgKJRkW;RDV$D>ws'7,e~{E_2*a"O6y+y"iQ+xv|Fvڜ#TIf\zFCM;`gRp;LӭW TvF, 1j/=QowA&e#Zu!V9u&bDu|u>&%Ȗۣa>~ zwv4=Q)g/øxKp-V8#zc:tC%t|te0G '2tDSW!!l*{<)UdXm5n2Bצ"qxծ:J6+[ӊ̿*b9ӹ2.Ui ]{BPHJQGbф}?hNZ!c$ O)Q lyEX1-*\*:Th ~,Tk)ֆb>nnWNOS'}]mۓ^cO25#YNB l^/$3x@} %/JK_"5MZ~S,M)m4ZƆ~Fy~QCUKHz#Wm \H\##0/Tɟ8# fMA~7'cWݸS /QϳRC)]7hgPK[< PKT/ __MACOSX/darwin-perl-deps/LWP/Authen/._Basic.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTb' darwin-perl-deps/LWP/Protocol/gopher.pmUT bM1cL1cux XmSHEp+ [|GB0 6[EKǖyH#~vϋ,ٰUULO/4=S\ZI$"/ [i,iW*Л!1.\D X3h*xh)xј~ܔZ\l#4;<:w;NZ>> nj[i%"\,5?$&V 5eF80vJ~p}Ru<qq,hd<;w/{gND KXATp/Y\$(#w0I|vaq` 2Ǵ,9|R6W*Y Þ@FY[WpA}͂`1ai-#K>E+k,d:;v $|ۥxp2[?TpvgE]v,8%ؓp +? d@pp]4*l&mb?>HY5{M(Qz7\> ϞwM؇`O"\D_~]A\  MQGFF3 e`]W &m},cXbi(C1{2B Xș唞{=K߃6T3%4*JW+$-=3BwK i!MEi44>~-M)Oa__v?w18+ .X2 '|3w:=N^Qؚ+GSNnl`fUI˗[#rQ̱`DkÀ&ܠk79 rI\I)td!;?;e!ܦlRr+Y,[p T2",I"VcPQIwz9Fc6W19S9O2 V9λ_𛣥?ŏfL:xcNrNEU*xw2rШazJ& ^%[10'xe @- .>:Y9/IHZJ%ØqT bdr6NJJ餔m8MlXYZ!o䐑5_~YܑJrߨ:{[[qQmP19KB0QDaBa>1!7N2r4nI[Uw5cx2D WikszPϙl./eDv@1әB?sr13(%䖄V]=R/SJYjSy< zRݭHE'ReC)hP,xSHb{  ..<ݿΘf [!Uu4 e9~)7qTĢCPJ)ysw)22 #fcđlϗ ;.O=X Bp*T ]]TQ?`Eq.зaR#˖' ;VIS.FلakJXoM*x3L"9{% OJ$O'ħiF{:b4@-w)Q@!u [e$3>'URW돝{R >Wkv.!(PK: bPKT2 __MACOSX/darwin-perl-deps/LWP/Protocol/._gopher.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKDQ& darwin-perl-deps/LWP/Protocol/https.pmUT P|_M1cL1cux XsY+6. YI8)ŔT-ŋAD ;iJ4,{{tUw4כibN4>.{4O<-?fJK˴jc&%dꧫDzG4լo}j3'ɩ+:42A3W3ܘ珖}caMJ;fԘP s{lcFb!Mz6' ?'YS d?I&Kpa-˺xm{UOOS[I(PC>(ClSŸ MO$";VV{7Qa(zAđpo7R"-tN:r>tzZ^^Jӎ %RjCK,QT-*@T͔BTICiLLyse(m(n%ԃ$JMF)] ]k2ߎ. JŚYȤ" #\b*cYX^G* BO@rr=}B({!hg43X[Bc\ "خ^ ]Xg=k*$ɛ'묪W,+]&?L*84׭=Dȋ^]47Rq3U>q55rFw0TEĬh K%Q u'Mz(gi{SKN$ E1{OE|?YS`Ls#SG^Kr5:|ߌFLDwF઱u7.55gq}r+[`KP kN #.9r7*TmಡB`7/ݓG+HO(__ ~ׄ-Mjå[LӍ$ 7? %˭v\-F%Pq)TI5(ZOfV=ꌍ, bqYGU >Pj q]~6bcz"Anr0v4ij<l2Z cBkb1! 74m5mÌ6#G2Nǯ^L/;:ǝ \܁Srh[ qLkf.hk:XFMHƚ-Rق5lX#*I K= ހ?n_w$"o{L B',rW rB'p 6'Mn5 /%d >)Ư=BadA^>_pX܀7 U TZ dg=Pg+3'ʗ47MVӊ>2.[&]BY`(u6Qܠ'{f).vtU%˒]>ݐ@[nRjo1TUhk'[Xڄ[šiCZTZ vX 80qK yHB'*w1U@ՋasúZX1-wG4n2`RDyIEl'Yml'e:7 4ꖁ [` RѴyUq&B:[[hktv^幕KOؗ-%f%~3+;[w 3ʾ)og>?;=$t$֮` PrZkԿ)f*)6yse'ܓf؍H{"7K7@M.^d7%w( v[.2oQfV\pp65dr##Vv@+Y"R ܀%̹,!;zrZ+on1pv-7a&;fyc)f/:_AkMa;s}ۯB Hq[åcͼ[aZ XF}E!]Oj=o %.IKY+TqyX0Vx?wqLvڄ7 M$1pxo!JnǗWф:uN{(^~hGrlv693aQ+rّ/x&2AxyR+;L.tLU!ߧGḙp2x7]y?Ec f-)цN.Bu.g|fwmآL4u[ 久%[t%SQ^F7epYUx`;D;9 fv/& FM I~ܮvX748-wċല%;G b3o#ybCa[:}洲;wJO*En@sŌ>I4_Y-h0:0|H=^vm<[Ԝ(NauO[Yv`)Ǩ UwsOQrVt*QxSHT(=2lW6U樽D?)lLI\ P< ʻxhܟ[Zcn[W"*nst6X8Rbr t=)ۈʋӁ^%Q}S w﾿/b4'Ati::>+뙖iYIN59 ta~hƈru; blaxx#Q`Y KPK˥- PKDQ1 __MACOSX/darwin-perl-deps/LWP/Protocol/._https.pmUT P|_M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTS% darwin-perl-deps/LWP/Protocol/cpan.pmUT bM1cL1cux TQo0~_q@Al]n5r$V ioLt/{X >W$# Qt!)/(Hv-)H%X̢" m^ }O/LP~_/Q|RYR.L_TJ6fbC >\#m(:e > Ѷswm,[mWBby{~I[$ht:v\NKezG7;~x!QFOkUb{kCkFui0-p!~O3Mϰ24gTʀEz Z*P6:ZDBKWAE&`3l#VA P-[cHk-x=I<6&bO~cGpk].iz Q4 oIT-7'%]{.ƽ|:z5zH5!%%\'š%趹~+hkZQY] Ij/㙋Cxt ?SEnpa!NvK\ &ٯ\Yn`DG[< n _”ىB'KJ2* >ﵴ2ER%APcuZ:JCcq9]O`Agp֤MkL() z6<Ңh,@O U>A;ˎV3ziy-qPZdtۉi6a4Iq*%) YZ5d.<| u9g4bϰX+8WwBgo)`F;h+-PDCO|Q17-saPK 7DLPKT4 __MACOSX/darwin-perl-deps/LWP/Protocol/._loopback.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTf% darwin-perl-deps/LWP/Protocol/nntp.pmUT bM1cL1cux Wms7ί\p$3i@q`xBN3ŇD$]mI ](o>[ }lWs" wtсW''J%־@iT?tGAP{y| v2Ak$iU$Ut'Ö1,‡O g*I8?kl /?T|6-‹^DJfCgIsx9edfmխ;#+|xNj{ٹ7vORSG W2fLhL QǾTK_ř T/|Y@YX5N!;<mV<<5fb&g'ad_BaW{(,Iw?yiuGfBCLN[zUsʘij}t+<<p2K%,9݉"{v8'vTb 3Ndol`P#p/4kp5%pΰb̢/|5( E@.>TJ)/^GcNfCuVؓ'Ng5X1*9uEH6/QA%]|~}v_|ғ{%I~H>)BYφ)pYXMN6a5:\gK4%rgCX_xK/d [pC󬁐%y,9shbϪ2M/oJž[o^˧NH.=ۋsahcӅm|<Ƈ{9z1hKo ; 8BNߢE,F֍ER9(T}+Ϥ;,2dF$t81S:-Sun:Sd1tff㛉QOl[KTꊊyĵ/ɩ)sʰ4?[Xp>nn3KavU۩}?KUovC$O!1S "E^ op5s8="K!YI@[f(nOʻ |Ia @$J&r tNlcc(+\830$s9Sc7`l}ڙw<}c>A0EFqz U_$lmkt d\Zəy, \g`^e`}abM/7t2% t\W }\҆8Iy ]Ai]^^%h \ҝ+ 9"':z:AN?]E ?_dz22ۮUerÕxTGک bf*1'b-.vkD1v+Q?NP"ƞ <1k:$\ B܇@,t?CE&՛z-E ΢"oT2}-:ōK}pK 6Es# ];+Mv`٨]  E=;'+L?%lPj;Y WεBXI(H+R3dW .*yL;%"RDnܫ }~+h/w"(0ZP 4 ®}%ef,`%ЧK鈂.hb ҝ]%\ v'oں bc1sb挫u=[F5},Rr=~- P<ɥ o^U,us]Y6bP- hh-cv]ɭJS{uV|9p6N,n axpOaʤN1lW}@1cVք,0 #/_41 )]uWvov< tW…c] R:všyq6"aϐC'ǗqõErGdg&$=n'ƸDm@~DyOu(@wHqyc>= 2fbe3-NG 74ZdKk'02N>r%:fW(&2Y<_sٍzKhti{UNTИۍCQCC{? D4i[Q3>v6\l~Z1r8&kB^y"w8^jL)CF~_tU;dܗ۰ &R^PK |PKT0 __MACOSX/darwin-perl-deps/LWP/Protocol/._file.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT ;% darwin-perl-deps/LWP/Protocol/http.pmUT bM1cL1cux [{w6[0Vds&v:;k;F !cdg{/):iwϪ'}P{.|;M+9M~{w{^mX/k::|^Z;+f̍Omd<\Xgg9IESc}v9O)2-"ٌC|?r9[͂"71_s $g87Ռ,lZ; C}jك0d_fo`ؼ;ڝ?FGkd<ܱF86GL!ī`;,Sgv|"9n⮰X+/q!zTx'Z+UTPIW !Q|Y#P#<#P1qV01cA: }Eݜx{$%ޥ x(Z ܺˆ^8!'$l̟inm^ZgdиRˤPAC#\K ΛXrI5i]C.-bH dA:ҺLH"ŀ-y 9%*~{VBG}4QrnTPe(d%7Q ڞzkZWNSFNv<r:,=8^[!H,0DXM$m3`^:úls0\fBL `SticmC;*[%ET-@dL5ZLR2NuhS{ZMwdXrjK!z9bR`QD\ "bؤUM.R[Y!OMЮԜ%x9R9Yr+c 60\ :AKALbv\a uu{pp*# 5$ɨc$ =r(H"|#%Q \LĮ1r)H1;.)ʌB^ȗ&lpb\5Tˢ\KK) BZUD-U$=wE$FŹ#LQdϨa!P[cK䜁L٧>Y4Xf+%R'XY mUū`DoBt輶S^oչ:U)#vS*˸ÄsXUgSYHPvJ,&sF0kNe:ZiHe]^ : 24v0Ql+LF$]i<N!IlibJT;Љb ߢ]nֳ ҢhĐe=plwʮF!HdfվeXhOU9<ϗ]ܵ97*u l׺hݥ^-xڟD5E/K+re"({QYcRnm2YB7*u*Ա°rSXi|TFU{zK,XӒ!4IHX|"d)]4{~fǞ--zQ3kD-u>Qїg\" 0g/_< V_JPNeɧEҲhuQbwV,T5qⳕ+AL{eܕx@3OiM#bW>%cch>apO7w>"( h%6@hCN#;lt䃹<=)/\{Q$r'tfDfC83 joɨf(]ȩ?)dxD4t$?^|[>4ն:~cb"d?;Uu];- ^oϪ4rrGQs%sYUqk+_<;iebjbԡIT|Xy٥{39{3XSک}= `^bKD6b7lD5n2-QUTb |B6jtn-fpQX竊f0b= #uܨ8,I@5RdњF? q,QeӁG NfW[Ge))#]0O_eUB K9=/.i(HFI7`bX# t^a5A5G0ZC5CCZ,1#vmт0C.^BNJ%2Z~RKqp*;֙eͫUbL02)*>o` |E:QĐ;*_ cQ,n\cIn\! g!Z,'Wڜi "H} %/?S5%CKG7&+~C?CwTWv}Rl*6:ڝK#4i%a^ ~q:0ThUyb T_)hhP /5f5}7 w_^S8rX/=KϐB3t#cqH)o\{m0ف/cihXG"qvL !6t`Ʈb}F#"_/С䠑d=ZDSЃYd-㪢鐢%3 6IyI+kʫ ˌ"-LXIFAN%$Wu8U=ȷ1?7GAKv¦2/%cUZY?n %W*Efn_DU qCdOaD"W.jbPJ-Ei9dڏ'dYfJAbDnb U*>blue.ǨY[?Qyy>eud[8p XG,{n⾻z3=A 4(:EJ^_k@BV)8ʵg[9"T(XWO?KF#"ї41< <͹Ȱ˝aY_{9'ϰ+Y;\C yU`x॥*H<%^%!yMUEk\ ~ukB ("y6X.$KýS&G:Vv,ow)/⌕?t?cc_/cv@/ ,--qWHAB6Sܻ+T z.Mޢ5).7ʃSq;f?R6EWIy^^U2_91;OŮCQu4{уkdɏyg78?._\e<[~2_X%/,uIQ׷|,qIAK{?Dr-~)Ho݊3SG͸?} z}6$*&Rg(EOH[pPKrR? ;PKT0 __MACOSX/darwin-perl-deps/LWP/Protocol/._http.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT% darwin-perl-deps/LWP/Protocol/data.pmUT bM1cL1cux SO0~&)Tr*5L VTch`mٴM",`NRR0?;y&o[JTA&pIƀUn:c"VS/YX-KTm<]|s`Gg s?E+ip*>fP̹&:XF{u1Ċ KI58%A% 0 F٪:A_VF.z n!$kL|D Jq%$@-|5x(Srbލg^p@ P$4([uRص?%F]?6h*A%xXͅG }L2¦H\c*iqkt5m sEÊ_8>U`#bf0e$@&hQ}[ Y2y0J6nܼSK/Y=dNڇUjWG XxK֦ P$"I~q`x}3",bDz/և n4Je.Yt[$,w>'Ԝ&5xvʒ(;:1||v` w2Iya첌, 6"ɂ޳KY8WL肒]k',BǙ?X+)I&?@^PD|nȿJnXSS 'O|?aK8Bpv/h+~7v=O`OǡF:X5Q|`_7ÓWW7yprH~&YOV`\p )b7̩#وd00>V+S\VMޑ6Y$ &^$|%F@!)Ki' <=s^0 @8\ZQfx4 0s(S3JdBJd,b<itC9':lt3c)kRkZ+Y1SG#=f$pP%NYʂzIq IgDAиe˿wswtQSV`ĵ!NwZRSۚ{E "X|fXϡg(`>gXW-EI.& D-EíF 0(| 04N`ÔGYm{rW7.ki}D\P' ؎JG>Zd ϼ f0YwA &d}5@fkz9 zR˞ŏ\\'/o.^~Sy E˲7q:h('hLyTbo턖 @k`NDYSv';XԼ{UCYs\lXgٴ>~۽0f>q%wў)3t@0cv-Gӄ.zXM0Oõ.l 2P-  &M˹V e`K觻#yI2q F'9͖ tu vaU &^V=,8qݭs?ϟ?ߞ<=xc z^2OBOsf۷}K8Ǝ`bBM1,&# Wꋵ; Z,W!$urhed iM1;h ̥ F\Ks 6iD %џY%ilyER&,jֳW÷CH`< MWFuJ+Jηd}s|e`?PLʞUޥЊc#?y.{],.:DdS+)OCT9ՕA,aPd b' b~pFaҔַkvMn0Miw&zH UΉgwv 2&j0#F |e3^E%a^s܂M0)RJCq~[W&?6Biה6/vyR ֔{]̭Ig"{-Qխj2!]2q-GρO0c0 (]V Ba')s3mtVxR(J;I*޸gk>XvW`8: ~cH8ʖL7Yt/$fT,-}78^O!MLs%t$R*8 ^gʮ)e&ow^;3LVE=)%aPpT>x|=uOO:2bCD:u臩"6# Bu7NrWUt]w9^ԟuiV fh7nEbNسNa?W䖮F" 8Y^c"ܶ?ߩ>X޲E'&`\Y8D:8Y]RTbF B af*c i̖`cA}I \ mWa6'|`7n < $y\OyN`[˞f2+]퓫NS n JUzwSbWKۮ$AubhP)sXxZ]cf[59ÊU2c?ֲ(oS㔂 7)}k5t40;Abꞔs^5`iCSn'[d}bBcm^S9Ty-X3s_-ZT$Дn6el1;N0sgק''FVie=[e@N OWÍȐS[b^j<52 ${q혴k[o;7Sx:6QN$!Ԭ64 BM7mS侮`}՝))3>蝚Sd\o%k\u=IvO4#X?8I,vv,;*|A 1kU* xd2x5[}clt=a PXςi=âo²ܧ. |Ɛ#9Sͻ dԭ,gRѽNoH(gx p 2 1L]RzK^Rx,pTwZfy2Ж(s:8,x0'r>}:&]W_G2ᯧ:)+X& 30j5JQmհ-U\ I+c%UC;L@u6f[W:Y W㑡lhi7m\@Ð.U )uF߼H?*xRC ݧL;J vS-[Ljxː/` ˆDodyQe"K*E 0%^ rew$K<9; huV%Q@Fn^۬ӎ~K^F@w$"zj"ʱu8UD&Lf391ǑIj)0 |T ּĝn!𖹡4N1!!Ž+9)LDŽHp"5ZB g C.\K*)03pl.e!ن<>RbFK)Rt٥ڄ.4cGp\rRIrvIlKzzxp&`':;d%bIrD§lN3z7 6m%h K[2w^͢fnDDEBBqJB= *RĈ~r DD6(Kw(.:$> Co I,6exqA΄o&bR-;u.I[YܦMD3[<̖S ;)*<-L5D4( t0KƦtkiǿ7=k^KR֐DYWWVF DqQ`^NwEOmƘ}Ԁlb%DYk\*p XaF8y2ȶ1nFR{嘌lxј-f71L.(W$=R$j72+yO>RN@h&kL)XL @N٩[0""P9<}}y/BgyvK99r4 d%tN iAi뢅-%;vK:nz;ʞ 240z-UJ>(&3A1H!!/;&УA`#>Q ǴVYprDp"AN];0 swPK,A7JPKT/ __MACOSX/darwin-perl-deps/LWP/Protocol/._ftp.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT8' darwin-perl-deps/LWP/Protocol/mailto.pmUT bM1cL1cux WmsF~FTbi>vbfH:etXN;޽IIݾ<ٯWŨ|eIrXи"# "!0j{P +q41g4$޻< ҀTa]D 40`>p4sҾXNĞe1LQdGDyAsNE(J!u?.X }׈!$[7Z陔39xr.[9eX}>K*QVbj=Kgh*V'׿K-T|,Y<(EAh"KkܛNC>7l PW}ۛ6eMuׂ˅QV#2GmF7aڠբώGn]%opzNm wp0J䤤VR4٭ejcpy2lx,6*Eؔ|<Ar.l+覣2߈sFZ cV>$Sb9s[EI`cV]?g~ "e!3L9jOoYNQmq!ҧl16R?v=Gp7'bh^x0^M'۩0զ ɺ n\Y Eyڶ5& G+Iт~}ra9r.9wl 4&h E[4xm6 6^hPK73N8PKT2 __MACOSX/darwin-perl-deps/LWP/Protocol/._mailto.pmUT bM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTY' darwin-perl-deps/LWP/Debug/TraceHTTP.pmUT bM1cL1cux J1ma+B*d("تiwf"⻛-BQ.93盉f|%kJqq3!yYP W͟XJ⪡RN^^9>_YR-ZFD2cT D#;mhZ&C]\2ēuHgL`;P'а /ӧGEauTR`eDy<Wp:Y!&̱Pp0Чd Es|1Nc۽IAKQHqD`&fq ,*fA> FQęw',(MHd8N +fq4`> G- F<$:ۏc&& |+wgQmj9P`wa3iF-|/2Z? \}Ԍ8 >fdn{F35f2J `5jIJ;8 quֈ_8Ufv "S<<8=99<mrZޝ><`|z cY:ee F= <[`E@(]88mTioo^䲳H\b[A]Bq-yxM8,a4`oNbܶXtߪĄ(tsbhrj2[,炉pɨfo:ww? BY%yE1_LQ" l&mLPBN#QyEYIH'^P(R_c/kb"eݠa&s:+V,}ȉl>[-!-eX:Fj9y,'Ӣσrn<%$=}ݴXH A4Te4ClƜ) c[O aG!!TPh\E ^1ķh7c܈@ͨJUÁ~yV-w'KE):R,qho~}q ep@S!ex1Z({WTG:g@]h L9C# tcz5A?=wVXV*i}K8{N\vZL r [>jT*[Y,¨{ Tl_nT].<<1ˇ&M~=7WآZR&u2zG3x~Cؠ4ÛR$NOZ9Z˒Y*'I8%}KPsĒ]I58ogB_ԔcYh$g]c@i. GL.ځk~54 򲛡˃5\zuk;&ڑAW~,Mu45tNM70KrMj*ę|>CE@^fs㮉si1;ׯLV2 8 @Ǭ_bbtT C. |vп3p“+-BD|)5R`!C|]'fVFw6'CIj\N+ Е3$2lϚ=]N+ bO<,r?b3vXz19:0p'P:n7(q(<+x*?۽b#mFG>@=k6(hs# :N'f<EKK%gS6n Dbf=QȚE7l62⌴;V˨wQ.Jd|F2 wUyy'EAz듵X[g7 u.h:v't:à}C!R;1bLGQrC_x hyGbuE(o!uVe-/X0{dQ9ZS7,RqB|8nV, =MrvִfRtuYPO%5-C.3 HЙu`K!3U;) F%"jO-S:Qdud'(ZCh"qH7S굘{*ozENk2h=QeJr(b7[e(ЫaHN}'Xk<@[jl|jb;Dhu t%E֢4J\Qüy=i6U1[kkшL/VtуI./p1k##.Ue/mVߤO$3@JrRhfhӹJ0LhE-r%$!p_]G}"%҈L)q#Qx}1ޣ9I"n{HS0c`8+Sks~WM%$J'? E-<|1 7upU@݇y"ɁYݕgpΝJ?}`"Z G~X|7A?B@Tq}#Oq*-Y)0Dc$,r,ryPEsoJirR:J=gˠ|:GtD-\Ps!Cd/J\1HBJC%X m>@'kR-|k:Rj*QA@m:Xo'FCR:J9=~q4.C3!H^S];v ,奦,5lk*օYmWA\'ٱɐ%n͠LLA]nv 3<9 ;K$*jšټJ< vs(yψi##0Y( R8SY5{ZI|~=hΗ=MgBU3~tfFRa7qB sn(5saR#fSv3d9+%mޓrh#NU<;~@瘶׫>*M%2O@H[PՒ7;6oqjm׃9L(gi&Ü0j<`^ZD ;m,iN($oὣ4 JUׇ;WTWe߫,vqw cW|g>. w[lcܪwLgx8/t5:oL̄ۃ;d3"_ӏ!RXT:u#`d4E&gɒG`*39ݤ[k*i5E*Ē;ȮQWX; TK vjiu~XKc7ytJuwnY'IT̩&%Z\7\4bHfL])SK]%ZՃ%2 +_r{8v\9w >?OcB;͕r[;g:L l1NJtVpZM DI/&|M_׹Nz{ZSWstv1Lx[әX@MH: HN!lUDg:'jS=Q=q9`UbL~ebBkC$Y:C- LtdYਙ8%ta/ 1bB s>1HU= J-a˽0GL,v/{ 8oD-.렻#9 ђ!S_K:Ru>Dz  BZ.S\m#Ԍ( F}K`ܫ+W__wJ4tͬiijf&3  뙡ur=DxAH:gaF7F AuUnDʇX5}eikrTnUD#=vg{e  C+"0^K`Ez9pOV7tz[ qY %# g-3T@jn7_xY6SI$پ)Պ*yE>8Gg^ʃDQԏmP\o81]7Qq+}MΎX#'2g*L7XF1T[JDG0. 1N9@"x^,В~Wos2Q24Țol$n0|u6U>K)/Td//$QμjY8kF&H׈TXVP3V XhGhSϦ,`&t  XЖEFئ2RUeSZ잂,n֟5Iͬ&#>/0Y c6UܹzR=f"(';?9:LD/ t,S~5fmw^.6& Sslܧ7@e絗?WV\v/-K9 Pܷ)qpYP`51v5cng@=IK!J?K͟_zhT:$-= JpsM1FCcx{zhr%q_0Vnuv?yŎO΁ LXc4߇lQX f-53[s*#|  a}l`t=^}o: hydz/݀CEb'w?E.0 :ùh4ÓWE[PK ~VDPKF5T/ __MACOSX/darwin-perl-deps/Net/HTTP/._Methods.pmUT aM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKF5T  darwin-perl-deps/Net/HTTP/NB.pmUT aM1cL1cux VmoF|+F /A. rjOx{]CQY;ߊgw^yv{w0Fni=0((>G1|ʯJ%A=o]%XK.]*E(r`:Y G(4}wh9AYcPڲGk'ӕC%4f-iTǓ0w5&gY;J (e9E=S< h~ ߿CqQpjnk}MO^\^ &YaY P(k)4:!=!!k᤽ƍ!_oYb՞SQ{iCG%KYlu OAa9KGT*1i@KjB0!KtI3*Vh%C\Tu"UOu䏰w^@=)Y[/|AZbҧkQS72`<`Dgc)Hz8WD /t>3VXb:ʼn&wnkTQÓqfl#w6"uz_""f9Gv{ZMgR>|ez+gHjaSc)A"": VZm5k9eBIbw?5;yTU×Yl(B}m#jv\݅e`ʎgn;VkRS"&/:5_FE:s7FbAC.,GXb#k:Km"T) Yc45 y~`ah|I,d82ACSp*^q}9MWi "*5MNd?+A {:51鉏3dCe!F^bI Ǔ9{'X.c\L}ꇕkвr22]_r020OwBUf ;(4. 2wN&u2!Ů|$|Ah;4si-SR[Ƕߑ+V}wT"%3_9coŬhr PKc PKF5T* __MACOSX/darwin-perl-deps/Net/HTTP/._NB.pmUT aM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U*+ darwin-perl-deps/Module/Build/Authoring.podUT 1cM1cL1cux Zksr_*U43Gw5\UwU[qA$$" Z9(Rnk=ؘ2?=7Dn>sB|}?>LnЕj<=?4Ifָf9./hpi3[vE2k2e)zi2Uk9ղq:?B҇p?b-0eI?o*)(SZ~Ƀbd|s2ݨэK0xa/wi{4zF~ތwcy&{)dO)G!ҙŲQGDεjְ/:SN:;kk`߰Rk$ePtɎ$kxio,ogMH`j Epr]eڊ )£''_K&CSoTpUfƴCKO&1%k4Mg2k ¨ &3f9¶Ir<9%! :$w9=yX]׆$Vg)<Re$@_lDRvU=`ZNbyu< 0}Q>83XE#NoY3-<5!\Nkyy'. j,[χ+lm$<Ź `_k8%ǻc3ZY&ț̼ mOuOۚ~ŗr|>HU4}+dooyfY\<`ͮI=L`OV8BH̚C;(CXUPD5l%9rR' V僣^llHȅڿ!ءT|1Q)n3 b۳[N+bSzk;0Y3N|Qf^ۧ__QGy╅96NBMpaGA4݄wf^xY1-DxH]dd')L "axp|}MQFb9X.F VS!&Yma"1c*RMCib r̗k"BEO;aTCʋؔf*+ !.C@j :.1ewƖސr7ge90W}dtDA6_9C=1t 6ȊxET-[O8/f0zo [V @+|SlyW!DP4UPjA-b;&i~0OPk]=ab4TERM/FEeMyOQ8a=m)܁D%Oa^A+ P .R-%oAH4219?KZ" z 2\*Zt k9M&D`!Wi ]CL=}mfL!#-Y-5O,?a~ Զ[@duٴ;u8II , <3\U\_5E[Q"74D-cjQ/5%WC\8٬YCt՝c|;Λ<'x|X/\֚uꌧ6Ճ p*cYC̖8Lj 6ӆ$B *EYI#}JN;"TWO/b |J 7\1dfY@QhH,:bC3@:KHiNo(aS"dVEHMQt*.E)S Y {.^oo{! CK=S !x^!{IJ6ȡc:8YF}= u-#4:e®v$ 0cș+i*8x0g Фs,𗞦js3A%{,.:CYir-ݧYjS4 oJTې\K}jYPTCpֺBL^` Z^)OEL,ߝEE(B`*RoJ'ʦPl$Y舋 ޓ1TAoUN!a7oڊDp!shcin+Q['l9$OkF@;ߔ8xqHtx}k _ D\-)kQ8d3 kI8, TPTTC(`O֓ USΦh-O4alnSjwJ'Px踰cKx9>VF_lx aY mUn S[pRK_ݜ .7SzDzŽ<^QұvZ7Yz].`R8< #WE6ܗE:Qh4؆C]꺦:/]gRh:j20:~"7r}7=「x%}}l*3g;+g܄r0wRN=P~X5cA|/ PK~y*PK5q:U6 __MACOSX/darwin-perl-deps/Module/Build/._Authoring.podUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTLE$% darwin-perl-deps/Module/Build/Tiny.pmUT (>:TM1cL1cux Y{WF} % pCI;tC֕1V%E#^wF/ٶg'5̽w1]ʽ$ftיLgkU><:;{lceJ &7 Rm%L/XQW}1ǃS9Kߧ~ g/V M"pXJ/KI~OǁU5A n5]Hz{QM%Nl]=(T l/i4Dz)聛Ιm g5Jby'[|ShV$ySHYGjz=7aO/ ݉ZEe joeũG(a,foh$n`@l h*ǟUB3Zeq3Owb)B h / SMx˫2ژ[ɡE@sRD|*R#6]'~랹I;}x?I",^"q's su)P0E/DLd cqO?;o~Z.niċpY,\ڟi2۽ 2Z\0g˂5?(K+oJzB@2TPķߊ{Rs7L̀yjTa! ݵL&Mb՞/H1OKcʛK ^& ~0{J1!OXH58[e`'6 }=VVRĞpn kM;کprqDN8$hGa0Gt]۷﵁=kWЋ}j4SMVH ,)C3OvVM n)$נJ)6QàrkmR{똒lެ8J++ ˍ /Yd'7$Rd;@Qa.,o$xipbB}G:j-~ :><] HGA&X47F4ɵohZΊ8-ԔjyDѩė/\uXp䮀 2'}45%VT|b%9\12dԉYr'qĎ#(tɎ㏛>>QY('/BXqj38Y'/{Z#ΞC9k(Ϝ@+L~Iنc k0-ХSR!'|h`-FsL. Z(8OUX7kh t"-'/5H&RW4mK8}ƫЙ ~N^8.*LQKX@/tи+t*kVJUQEO2 D'ς"H6LELuANRV z)gLG*)J!w0DriXb) ,Hf, kd.W!mG:S.t=C稚WrYW1as m'֯ )aWa[Z q8'dJP13<'_4JMShzi7s?"(t :W:{&&I52*gB"XU}Ř* ^^@)x)'iČ+QC7(><#m.=Pl\z`4A%sISP*Uc$J7[;ڶO5Կ-P *7A@Ibb,t\X3 ƭ0YqrݫM6t̒3z>klNt-U/kŽHîOU@<=r-T.:ʞzS]JxSŃNn>x2w\8ƻ |AѿwQkaCjk/|*^ξaB컇UttO-W/BUMmQ{F'MQP/-:_폚e'_͗W{;X? Н6cB`V\"V$̼SַviZ[Khqv)(ʻɆa s7ȫ.B:"$n/B~`'ە4C+8_eZ|7O^{ &fVkKTc1ײh)Z6^Ѯd2S .ӜJU\{|`}s/QCB5-Z׾#SnoQ7'eX"r70G'}z6Y0̭e7b{`x4,3XE@yrh0b'.8aHSqf:_jka&2I3K\}NQ۱F;KVy:QuD:n0K=2#|~όD(rHEvIbem.!VE#"D|ast  !KIwV:GlLQ'c(ٟ!\( 9EMjjmƕ#wxidtW%O0[rӱ]ֵVy4#R۵| )D50B$'(4 &O-|j7ƫ| #KPx#܏DHE*m4=XeFɒ>fYͲ~sgAV07 jc'0.⽎2W70ܨA¶%u^PoFsI&JH)ƚEs•$GWr }cf+GbU#|4IlK,t" 膬eLU.TƖfQCQ)WMT.~|IB&T@]_ݝѻӷV-SM# ]#+1Bz2bze na"yx\q#: .q4B2~?qU難q_ Gg'ӑe^\x"O ⵛٜO7^LOu9Cd7&RA_t꣐5aV3~rYF5P])"e+N<̜U eDP6i^Tbv4^I |l΢>OA}Tmu*A)ӒD]#)юǁx8ő בtb{  7t\YP]O;on(v=`~~v)Qf*2ha>Uᨃ]NqyO"{rvA/eQk,z(:/H5P𣀪-I 7kaGL,xJ >tWHG& na'J.{Cq)ޒfC;u/Zclw#㣃鰟ghEOrL )7Ya%w %RvXTLoúD(usْđL[,7(Q~d0#cJ[PK^b$PKTLE0 __MACOSX/darwin-perl-deps/Module/Build/._Tiny.pmUT (>:TM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U+ darwin-perl-deps/Module/Build/ConfigData.pmUT 1cM1cL1cux XmS\u+{.N'6x Ӑ0LPZZ[$]n>gع-It^sv3J:INRIs +Ai$[vlB QbR)%:SYN__M"]P$2MREBs˔5^v8ªG;=j e! EiuoY, 0e*-J~k#rx=i%`/tLxx~ a/[{caxQNB{ @ t+GȤE KBiG+c͊ȉ?,'SY1ܫ15Ƈ4[.g`gG\Q% eI{E(F0K+T;-,h$s_‰+)C:O'$~qA(s &뼻t"#] dF at#5dQ{N(ō$e|E߹c7`GOGa%>˼F;#MөnRI#D0Ԁ#E/d6PyB^$9e4u} 7't'^ʸPe#&+[ߑ9X*~/w/ޗ>n.J3iŚrظ4$-<VU3VKY܉"_ YX LB{Wn$E]D +š^o3|y-/[m/ŭP9N\|<:>kF:M Z3o:9Zr *3K"5[*- ~"`'X:[#VC ԏvU5LXw3V.,yDlK2Ҡs& ӔF<ܿq,k2Yg# 'ز2Gho5d~X"~0Gc}4^eus[,\NˀF=]7Wk6W䈣xLaWV<^bĭ .]Tv}K^qF@}s&&8/EJ7QT)pBT;+ NO$=pu;"Oj`Sy_.cBq8jk4/"7 UT@9F7rҥԗI ZRx@9uT:<` +9Cwkp18X濿EǚYy ZA5^V7(L΅T*kqF0f[RW)Ӹ?U͐-r(F`(*M4@\P(Rn:g79X̝\:Y&; x &-w2[zr`}S'LM,78rY`LpЖsB?C+*aK|0K;҅1.-|\|Q|x#6Dm6@B6Kv{cӅË-yͯ2Cngw(>\ Lf}\8殄Dh&s&`G}SPex@_w<=۴vț{ɪt:gxD~#$ZoS&˗/,tx'j_ -2 U̍rU$z`D"޺6w Lc1[6w{܎rb[ȷ_4Vu7p#_PKCUPK5q:U6 __MACOSX/darwin-perl-deps/Module/Build/._ConfigData.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UN' darwin-perl-deps/Module/Build/Config.pmUT 1cM1cL1cux SN@=_1 H4<&^IҰMw$t[;7[K+\AEw$!h!xYš$Q8Oo0뫻%V=^ A,b|mhe]/ k3I0Lv:B" ȋ!Q@1Q07v;CF9d,b?:w9xT@`>0}GBff{/ XjT9d7+N==e9&)R;|&LYq&Y zjwViՅG~XX`Y_s#i-}TRk_Z|[ת'kd]xaQQPK?NPK5q:U2 __MACOSX/darwin-perl-deps/Module/Build/._Config.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UgK' darwin-perl-deps/Module/Build/Compat.pmUT 1cM1cL1cux \wIx <,{zڲֵyW@"UTu32Ge{뱡*322/"NdTDrgmFd: ]+2)< BA]%E*zW'b_/;}zsCd2R4I< Gg2FA2$V_xg稘d |8˃(iթ&[ܼ;?*_=xxKN{9ybyɛMrz{qӓAi!=9?)+QLxlyPM(hL\Vef(Qx/DFQ#){wWG$ž2ӣkLE `ov`ͥvzv}ףp]9i&efi@|hmCz֘ N̘ ڪ+S~7dhӈiMTE+ QzYDH@3r8Q2lu8 aYZVH]~7 D4l~ N87G+Q#'L6ziD|Y掽h\c;)B3w =]~yuau5UFX|٫l<]}}xurySLVOoÕ+V)& 7PxkB>4^')2LA4i [hbS]!BW_rk4q=5(j$D8ɉ-! ELO\ =d$s)յ~ .eS,5i7sP|/u~HnA"gJ1NigxO3UjߋF곦uIAcy>mַGSWp)NNB^c?@JoZ x Y#Q \Jb`yuDa4PJp>]yMWݲ&n=W 9/9, Hq8';;(@dQ}6[ׯLg@~ *jgא@YP}g +&]qV1cޔzHS1?c 5 GdC."A󲃷a2,gz5^67ڲ: B3rUSp2bh"0;qtr}:jfc3`zE9)&FcaWgkM5eNQ25Z(8bQ,o-ftkU:65YZ #W걉Gs Nxy?gTVAYY>>AF}{'=&ʣ|kl)>qdjiI،3KmZBg B`Se%xDlobr s%]חtdY.SUUTǩlyѼ]n5-#%g۫!FX3CSzLZ?Rzm}#B?ƶ6Q-8A ,윾f f7d=uE89<-]bAGTţeTh 4d< _٣)ՃON!klR}[v5lw$ȇ&ONl+zNsI$r co|v9 ލ:#59ໝEqQbGe`s΂JyꛤwB~̈́ZJ\HmHqP ,J{!0A$̝ VΚ#ɓ ;Ix o9Q$3:Y#`Yb|e@TSCH,qÔOnCzG4*]-~,j1c[:rM'{L>j82(QA@#"]d.a3?C=uwyV&l^of2T_'!lmerDZeKQk5NlM [ o"E0"2:ԩ Ag̊'3YH96[9Sߵ>1+H5w#ws*J}T[f2JM$Zj jXTȍz#,[GӸ!Jp"QE2'$锱KޔcP&fwotT76NYбftj9[3{Fʡ>ӑ??q,~ѬoYKی^ 2=W|:[4:^Qc]zvbĹCtsd%m ?C0~TTΈ>qOtOP m `3vɆͧg]W̋ha. Aq]7i-S ffx5V+>q jhh\Mtb[fiHĩPl u2sc?("S\ٵ8;:;#S^G(EKNQP1 4GTa8¬0ifd8Js!d}_v!)k)"C6;S|ope$:gTiGS{'CT:hm@&mǩlY0%u\Cj,RdqATΞ8nn5[lj0 jRd*%iL7ɵwS۷19ѳc`g?kDB2/9ǭ$8KA_ח%/jΰ ICa'釹Tih"F`QŽs+ߞhG=NF9Uj![WO FViտ |q{¶FI1d[6J,Զ[k{WfUB"E; >3iLN8yA7+.:'W7V ؆[sU❓ޱO+ys8՗٭^\Xݒ  j#|}"x[KU9Ooluj :ѳԁzP76j/>Є+0ɑZvm*ł6Jģ3X@ u%_ w*Gzbhړ˖ں\@i)>Y^o 5o%uA?Yk,_G$|X4VXj囻R'0PVHA2[Aj$#Tf  ԃDU#,}scY_"dpTR;+{ΖK#YA%Am%)b>m϶WSd6ORbOrtyB}a Up2)L'7\01\^{,GAqЏbR6j `5/701i tmH>8Rm@b Yģ e4>2`t*i$qog6m.(f,S/) $m '?#eR*@'o=sru!d,/8{7J}G* Lfnůр4MaCBm XmEbd2p<ÁI be ]^|G3H*Aw3A7 מ5O\[q Et +Os `QL*Eˌd[6!W8ihuEH4DZMt UFUk[IAy5Yc$( dwpBh2F&); * ]]@CM!k0hyB6$JKH[ppx܃`8$}CiS܄dPe[dҞQ 0ru5谮CON&y>vҼCװ:IzuY w[Ga6EgO}PO`nuD"Ŧo-ѢqC8<5*߯tƧ4bf@`摱*E0|eR>tTHRyk^jd4dA, ,حE|(Q:|r@6YUP/O_=Ys2Y)2[lzKU3'B ~(CUWQorY˱Yw_vM@G@\] I+"sԏ$]YȊ8D?'@<#ji9:!R!=4ԕKm" +QeެPI@OtPP4 8 gScXvZd<#UXT*s5є|b y%JE\MTv!"[^$i "{ՒusO `6Aj" S{flw~purr:i~@Gi|& +0:؄"*ji1BAS4#Ue㽫YK0xO_"R?$럀w=Xc*B訙(H[fƐ`N_SΙ=-HGFxqTY%u$U(" ;hwI4*hI0NaPxjE^+D\\/ K$CJ].00JTQC~ N2V*qh |!Zeb9UThB.MR`ѵ82\ĤHtM9X"*PvH1mQ $TD8Ɍ@ %q0LIu-j+.Eރ7.<'@L\7S/.~u$dHû ")^|_.5*@4 sKc%E z~Lm,sD]Meپ֥Vq1e]466n~椚^O^_x(٪x4p1Q PK~%gKPK5q:U2 __MACOSX/darwin-perl-deps/Module/Build/._Compat.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKOq:U' darwin-perl-deps/Module/Build/Platform/UT 1cn1cL1cux PKOq:U1 __MACOSX/darwin-perl-deps/Module/Build/._PlatformUT 1cn1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UC) darwin-perl-deps/Module/Build/Cookbook.pmUT 1cM1cL1cux \oH>'8I's9[э89a%3Xy)%qL6eE}U͗Lnq8KT?ՃC0}szz'$fLѶ,ⰔϛHtaT..7~˓ޙRщ>K끾XDU뼹N.o?`#&бm+uu$[h-`8 Jl]j dl^$Fϳ$68.Lj0Gd)BgS[bCzc2[ri t ̋l3%ϋo*ʤePY:|z9wۋ݈bt--(ubWkl_o5>5֮ TZLT)qDB+|˪'][6:6(guúeh w> zZS&hq^#OSIIMA_bLW[KR?EI{;dI8²^[N3̊Ln҈R68} K~ޒbح- b6+?Ͼgˋl̠QWFĈρSޢCM*:gPL :8&vq=*CO׳ Bj;MXcsXTs9h?N6+ȝ R]!끕`mK"{fNedOSF}nr)NnJ y&[21qchSdb,D/ RNMQdŰ}|Kc&Y:|MIH501 E)bE0ZqL̀Tҭl)}Xy"&c܍^ďٶ: e&zQQVoj]I@8ev;Щ$w;(%$XX0t#ڒE+ժXvH 2l:^c'4"w57l#c&X6U:?}yK^o6#$H`*c2Tu]#LaXO"NƑq*>[l36gap)ʓ嬢{j0n2;<~v0p}Hp3ND{8EiE71h YEmӡg}Ֆc>2YD aHPBdgzjݑGASNI^u)1kJc"[NVrNO]OAaE٬ՃgS!Ls癳΀ l67-*8 HMj$X!j"*@l+<>${o@&6ԴY@ؘ<(gwU7Hu$$mahPDa*C?-0OMq#c8~R臮:SJ1íҚ'OtJ m&#c7ˇX1AU5M%_զFsKV7F$(c $s2fn2vWRWyF@F Nb` gL}dT@ G9D+h='1Kpy"\GVoN|@0P*G8:)[^~9vN wV*?^mŋq&zNvI޵5ri(ĉ"\lyII`(EJ |+Hk!~v }?CXLISjWМYv< f\^O?_]c*+jhªɠX#FMD % d,(ʏeX|C PΒG m1;l4F\'wo/~oB͋w~s1hmݍ[rU =mL&`mۥ2364| 딆7֜%|X^OɷLws { "ɈK$wԐ 7ɰ+rF>9a9IU@P7W'JI^q-m⑵aNN*jQvuLˆAcE^%m%+I"=]Ưз.‚I\y]L 3$VAHH{ e5l *^0 Ox0HL ֢Da) 7+էg` Pb ^" +uK8,aHR7X`(m@`^r 1²L+P#-iH zt'5bkSWT3,84g54ʄiP'cH}HU=6!= Ν=Up cDٚljEX&u (S`OƽGIjDu$a5<ʥPB<\ 9oG /9aO6:1&KquVb&# -Wnn%[:w+۩seԙKn&8 9n ?&츑$svhPg`\ H{aUkp'};©PS@^ nKG,#|8 &ZBbK։r)vA[mAb7w􍒁r(j,=ҙckQ'&V{)t dUeϸZ@n="c1[IlxWXHvAM+gEyiЗUEMYC"?"O_Pcs)&z!ZF ol0nTZc_f9?'RXd!vvcJ Aû{\㽞Ϙ9D5DUgĤlML σY ѩx+幁Ŋ\$<+>1㭩\Q 4X"&\&R>^o=wҗr}Fi:{΁a0c׹ ֩\츏fq:npG@壀e9qH f6eV9RLJmdt7sDkVam<웉%xL-@kCloQAOוټQ箺p1t6c׈\W+VǪNԚ¡SUfUit/Wnnz@=}zL_AS7E8B_8nAк`k |zC-$A,3Y-dV무+cSWLu-e)[/}i}ۈ4 Fq6 &g( k0*P`4k]t>W%/03sm'k~ht ꊺ?Xn74o.wD,:IrW4%$YiWRU fiB)@z8[hDuVBcⲂ\e~z|,=0aV,+|S;O2շ22OF;SƝ$`;!WLJ=V yX1l҄ XM\RnWcбOOJGqK ܵ)OOwg~.#L1cdAD{I'θiKGNŘJXLSd2v9hL}pM,Ȇ҄X3,SC Z@XQN-8y:?8Pߤɶ%:IϕPjy[面+\YA.rmUSA&I).RWxzV^z8l)WhwjO4J{HB):%YxV:][ :;ͤ6\٠il.̶bwS1rJ$OTνqMr,ylӏ'Wiı^LrNOn\ww1o/p5i*.;c:BFjTWdQ2oq8[waSh'ZjJrTB'mI6E&^H'*t]jf,- ~` uĬ(hfL9QlOĵzhCdT vHT\_K) 6rY% d~Zۢ[_13 61u|9:ڕo/]kUE@s9kT:3؇ZWid-Y*)g vF{a^u6[[Fh@Kl'WYb>V+KTI@%L Hu!)oZ_'`,.~h/^)+' ֫ 46a!P Ry?[Cw7|[8idw0G@ owDL! 퓱/ @F6wl{;";-2z@XF |%6K'ڴbb3"Gv&[:ZZս3i]{g{{ڍWMv\^DRmQ/Ψa mTk^u!l1dm8cba^ _8#; @oV2B$ }r=Q+fFEɔvU"7G\8V^uXgOY>0߿}vJqʮp}r3B}piT Κpaj\+eK m-=jwtmbNs_cJhZ*_^OiI:`"21K~+u.('}PbEPwY8& y'o둕_r&-8Kܤ1fv9W鬑֓*R,gD SΖ\t}V7z+6ŞI#*N)_^OAFGyS&7]&HIy7P(5I!>/7gVwV pCZrK/bXB oB5ۊ8*9GE6Qզk̒v!\]ۮbkxo=&-4B )oxiitlE~ߒH2FNg[76_8_fx ҂.C5 d4k0=K *g>SwQB5z u';B+K8؟5Ot'E y<̖3X{ިt0Ы,ZF, Vyy( 2][ (*Z."@UH炪YdĽF\6O5*%3ml{e@SUVoDvu VaDEn:VyRȬ([le^=+9hґU8~(Aws%ЫSV]H,7dxUfPNeր"sj弑іpoUMZX[{imaIK^|G.@闝{F@f޶&R:=Fӆ\;h6r=gE_]]JQ:CЙ+ՕWs Gۛۋ7]KVx;ysswCE}6Q(!kcd0h#R[G28 l0%JPp͕Xt,8M(JJb꥘(8OUgI (;ji9>el7[#saێ=:UU7Jc1hZߖC`h2(U=V)ӆ̔FG$<)EuXrݷ7=*8K#NyɡNgͻ߿;ϻԫ5znϢ ]1IG*S-{+UBbY w_[]CUه1W0DIK'D}rg\IbB&1ueL1{_kd իW}ؒ NNWNz-ONUԢǎ;aN`OJa?WA)phĝ<)]gaL1B2 zć3c C!9a!#z~??]QFDǡ%<W ŕ)lO8*v+ޥ ߒ^АLj9^>QSAs(j*E5# |16"kYŃ? ̜T31ịzՂDhqTTxCA2Bf2#lov; K@9a* EŦ.= s7f E-]/u!֍vf9И#L޵(b4C g~ⲡ8m옃oפ Ձd ;XۛwoTh}^w˰(3S,JOdsnF7Rպzx2&Jʘbąlj.ќ<^o\^lV\Eہ<{5^l4#P/>R\K`ATCq-~r1X`E:e 1sZ @sRT۴C7;j+929*3 \S @<* NTA&~3k +꙾_dY:E o{t9d}H+6d5]D<= /l%[#`Sz:dN09*na!L[\8 nHQI+s6=VemxĢKͥخ0Cﮔy)4dmhnmG$I#c})}(WRi@Q9=P< sP$ɿqԈnn8P{^i{Y FBH %:+X4D4} c iaҚslZECN, J+Z6a 3sItPKt.$PDXѯn[[:7"ᘄ^a(~(λ8QgrdOf̃%U9$*B:O9aJy/XNcAii'')RP!ZMs4…^R XG%Goe8\u%>]VEoąۮEzbb^$bK~V pZzAݲ\q5WQk1} \љ+:5hE Z].9uIơPtq8^ KҀ;_p0m%,uy!MFR5@ GNw0d:T"hYF:!1qrI&QThe[JL<>e WHJ%~Jv_p5X܌O\cW[ G;vݳmS8]v`loPKDe:IPK5q:U2 __MACOSX/darwin-perl-deps/Module/Build/._Dumper.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U) darwin-perl-deps/Module/Build/PPMMaker.pmUT 1cM1cL1cux WmsH-p%n0&6ٸTU b9 I֌auHBv\q{V0i[h4[V*9H_["\Je.բ4ʯzx 6߿9[%!߰P3t%$ќ~#̢$|$ZCI)Vk0B?:gM[Ve=H1'Ԋht2>0Z+n[m?Z1OW @7.qVjJ.Am8Qtcv8'W]˒ BtjowP(w@ p&!.%/CP;b)x*d)vgf7y i:g '!t󇇺GuDMpd<@ LBm\? ٚUGYzĉw/`iZUC+ksJ`%+5K*JͰ`)^/]dQo2'ݽJ̎sdaUO"@1KJUv5Ӯ':<.}Zū1s籼0]Fu0uU>0)ϡ}s}ٿ8N[Rl9?N{Stk&ja"J EJ8ʚs9K }FLILb)tATse QF,8MKc* T,8]%" P|"?o &#+ı^\V6r~n:9k2J<𝄓xȽO*F*}U}Ѽ"2#1s>rHDro;Ԟ>scё=^ΗW:~:3Vܧqݳ46Iúl  @гہ(.@h_:2N2LyI%`>?G,ftɠjU)X1|yH+e4SZ-T~||;yw=zGfއ]9B,1JlV/,:jl`}VL1 2s1*L6J w08p6 o!¹$=cul8`XriQeլI=dv~6 dtE+P|ա~L7x=_NHhyLT>kŬ/?[}^7p9v_΀/s8l)3zrG5R\qd~ 0RMp- Qu?!VƃVlB:|_Cl{dJY'D h vZ.Vr]\K Gn%yph.xf]hG{zbWj㖀Qެ?j:ΛG"=ټb? 9y 7#F'W@Rυ:jB/ ;C1Q֧t K92N+(fO6s\M*Q/w=>-.5lxiĴ6A?jWIP}Fjd3[ǹR;XV]FxųsWgYVgLse^85/,ďtHbhr=!œVAz\fGdAZ*Ur9X#Vbez Lɰ? Uۺ€$BO [ە V8)Z@Wb' K4nmxŕ(9m-&f2a$dt^E0\ IY-m8@>젍[8E\w 7% ?fV9B^G8,]"+57gߏh!$Ɇϝ,%,H8G[-FvQ > DW/L/Cb#Ax&7%)M Eл -غvHkoPKƁŜPK5q:U4 __MACOSX/darwin-perl-deps/Module/Build/._PPMMaker.pmUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U % darwin-perl-deps/Module/Build/API.podUT 1cM1cL1cux }wؑ@g$%e;=Yd5j{bL$$!&%3=j Hy̙$U՗E>8}Ĺ|(^0..fEvY7iۮ^ͼU>.i;eˆ-jʪłe-뿗Eѷxڕ=~rq՛/;cvMzYdeQg˚UtyE46JYeg'ɴ#n&춮*yټm]ѶEѶj׮EN:Ȳ]֖XCl6;fϮli会4RtIeEN-͑ԚVVW}EjQÛ!5|KK Z6e3ژ(h.G0-ߋvtfg/_\y) fBܿmYW;g Fs 5Y4֌le+-6bhrY=k1먝UC;RlhB{3˫l!Eʮ͞UuWcꐖo뒖(ִmz8iwdca%}+'YbbWDڣ zh {aQEw[|whSF@SSȰUS`QOqtj|0}0YTC}DZn}ng'YdRWC /A.ۢq:v*teϳ7qLެ^Ѐ84leMG}m_:k;cmް#~a:tQ'{H"KeX;F,=h4)-dNq〹c (bKK{otsu&ڎk2 |˰|%*Y Џs^c,UMزP먉5]7PݶYXCD] 6aIm]՜%F ,c~qإ Ç}$7yGǃ~ϮlvWWDvq KfDo"M>92T=tDΘ b6WkL:cܘ,z>x^p!_ ^w<toy' $eRbftzGpJΉg?lSe5wxGt4YQZ1#@nj7}NKƛ0" io/R֐瓮UU~OqJi4^m$~+?Oi׫$~J1@q/yATQ-Z6 zc'Ovk㧅!Yِob庚Y`9Y 3fF.oıqxhĉ?uySo\1,IS07k 4I-LzASZ>X\:t2cىvlӌvK=$LKNsʼԉg6xŔ^FP-E7b7tD/PbVamt m $.᷵,u12 x0 G?<БQze7b{F.\Yo׾]@`EkO.6EKtt[@B/aKRznǎY-TEM +z34<<'7[_^Ϳ%]@Agj_o^)rum`xwckß=>tLߔKZL}Kn(ܴ[I Sã:p>})~ ɺ n2I':]pRE@0f*s(-Yi:7uパ{8MM(ևwr8E&l4DSl@%) [/t-jWD2/bP<l٥b鍢(]㛃hL,jQDIiXP~J\c"qx(ǘȝ_O5BUy.Më-*zq? i모zN cŖ&,Q'ڗSNrb1A7nu I-iYj6>] uq*|5ǹYMi(IYj߃,_T7eSWL)L t ݭr״%y06` {Hk%j.U[iM)wXV=\" +5r5KAG\a)vE F)$g`xN%}ƴ~i x? rPufW`7? \e~rHIjihCQĪYB64RoٹozZ Dnco~%D{`5:R l~of6h -`&;e:g֦Nw xMq^[ vGZƚ "{A *T I! Dn}א~m6zd#lLbQ"F[fTd"+\jqzX,$[V4#Fsẖf ([xلK ^~ߞ_yrAnސ}o:rVdZШH1qoDU/GMȻ#jOOmAR,`dfbqY/A mo8WX2I i8˷t%V1>;9{ubZr׫go/AxO#T]fU9Ґ{[U<tY.l{W%AZ0QA'G[?$:s*" S}v>*a[sL[ļ1<+(CmPmbA}gۣddq8-M=X?Owo; )iƴH8WoT6c4XBL̮Ƕ'nQnŢ n&15MnrfE7`U0[0N`a ~۰`B_X}g¯E-MY$Vn!`RAI+IK2I;"S,LVIhԓa96:frZ Lr➘ 1-pPhH4*᢬U(]h)83}$tYDWuYҖ%vTMXu/oٗ>8H61h"nY>w|}Mht|A@g?U,n6;yvdsnA~Eզ wP˔tOO=yq\^e\^G u_uJywvrQ_vD̎;cIKU2aWda-DfшhBH~WAfmb[Eщ_lSqF;]I+A C'7+{"щԌ.ohjocEe n6-#[]咋Av5*'i(Aϝ |oLÇ?OTjGi89j 5O` Lc N]ABd8j`Gt"d+q DYɇw7:8ߚh4նD/~5|-*Dy.XP 70iϋWm]0oN=S:=-f,F07f2D6 +w3'GV ֖j8/xIak_zʼnsL][̲\'Ƒg\;/z8UٯwE nX{MU| 8*@" ØpҶ]]CWÌm!r` 'QdmNo˘7|t -t1Q_WNJ2W yoҗ"98<qO<w:m'w+q;3un:Cg ;}ۗSIJ.ӭIy, Ϸ>#ic'dRc|"hE+'`/3 T~o E&ͯڛgNsO0)fZoѡ,f'FӮj'lOp Y>M]_^SiB&od=[4N'@^N VD7˛)&̓tP-&uU~܂7O @+ KW Vm^|;ٍ'4=O9|0zCbDC]] Yb.ZݠasӚjiM\LH-?UN_%-~:4Ĩݐш=0Ş'Ѧό/D-LXH7To:M%va ])&V1 `pӂ_f]G9cjݬHHO.J;u5/Ƅ >7Z.2{]05i/$7%S1y-9hlf0 ,us-x^ᗬ4vcIl'V@a{r1.;{l/`5 *r($; Pd^Q ~(.DQ 9ʰ#T_)8%;}MпF# R^҇^da=ogYq 4 [@˺'K#9lEmG DάuX_E7#6!VyCl{%2ciDP_T6D H<xձRw õL .:].gdž'v{L! \Ѩquܵ4#%@Zk#A,BYŊoGb:|Usv7Ų5HtQѼMv-teٱ IcN>1f0tmK Ĭj# Ze ^1۬I[/{Uwtgt]|`1xŦ-[a4t"#c0&,Ӹ."[;Sȉ ٦~ٶs+bݶbM"Y.` g ۑΩ#8 2T*%j3Fݐ+ q98կbLaDJvqGb%}7{#۵/xߓ7կzٛ'/ o~ I)Ѡ%<'U{QHfxG ~|x8#6>o e^ -Oo鴑#?ЫN2=+^l<ǫ G]W fu]Ί@[wDh/|[QK{鷉_;%m)AzY,qxh0vMY*tSj&>Rܕq-1\͈>BCj; '(bTV0v M:zmZy[|b\¶bSI'ͧ}kT9gsU\^2q$@E,'#=G"(#-9 \-""rxX (ʻʢaE3dWm-H- xC.ھ)礷{HwPt &T]DcXÇ19kRL{w>o]Sok8 l3aK_Bˢ@6i&ӓ3V0'Xs">45aC@6=x;my[>9?{u[`t޻`P1PH#3yrcIن,8%sLN@# K.|Alu^b.R+8ڈ;_f҉?wNnu|t$f~=R!aq;[<=ıЛX=]9ay$x:q{>2Ei̳WBChDlV`%htEC}mWсi}ƩO恌ۆ=_ҧDD,Fq+(Vxs޹OQ[Y24>{!Yc.-3Ѩ..Fzmgv UFPAw!bkad0;LvKPe#3Ι- Iڴwb5LE^Y]>`Gc-!4^)#n.c(>m r!> k[K 9ZEO!CIb xccMN|%Jɡz. pљjs`{ҝ2@'xF]N8ɌTcw\CԌ=q5LHk 5[4kbŠʵj&/\'VJ mh k0߈ONN@m^3\ō [>h-ȝFDO 4퀫S1H=2!rI|#X.@n5l[Zԇ2D)7EhϞd؃ hˢ*~+{kwL?0{ <=;5JXEynktpIXcyYbd5u s3qxoEi@V]O; Tp|ψMM3$6jF&Lَml 08 Pe>jR8 Ҭ'Q5؎N)`kzvb^MN{r`o`ڠ;!ӻu[KE!I`hEۗ=`"Fktgee4w\AIߊpTCw,Þ m& @>r$C@9*F2$@CC-Ű3`v lٞ~:qXvd=e^*>Y9d뉊vqexPp([j8hz""[ل2酣6j(Xg'zk{7bkl~e)^"I`F=N=C>.b[S^22w67rxIh@᳴nזk~e7jN% j ,B{l;har؃+8Ywi{=3}0 &ΐ> YtV[‰źo0m6D*XI3V;?UBd!Wt sNgrCjp5vV5:ACHyiG\Uʧ`y_lBoJ>qS MOZ/01CL|aM-A27[G۳eŸ (0/~RM2WuUm zGT.{,I8&Y |I[;;䄷Pa6@DT.䩒Y,^?lH&=yxO:ώms4-#1w`t1HuN;Q⋍1I=%Pb$)qO9ۨf;x0pQ1*(2Ơ84QNH**'__t@&|~GyAAJĘς 3-e Lj8=(ddWd,>WwY0_;O-rrj-,#8;y,aBj2w$*l鉲^|(^DYx%_HeNrc'b8XeV'am6dypt.L~EG:VXYdbNPϣ"ܑfX; p9lTwH,hE$:܎hpfT]-!F]*i ;y ؿنσ,-Zsڧ#ǁ{i*PX dc6D'$ ڂ-'obR(T\`LFarZNF!T p#_z+U P/R 8,2L9Dto ھolfKA!1yMςDD4NϧtV0f%'P^}M48Vs; 0 #J v'Tv '&)`dU.IMl%q$K7Y]7t4ƽu? ?X0"up4cKh]E8cȒ~`ʎ W?r"6@nQmeCGu>2&8]y-$Y4?wCzR4\sTo EOPK6qTV61"&k ̈U\[M]]H,Ź_w+u2}˰\XR۾|֋5۴|"N3GZ8NKmz'# :sCo1Dɸ (=ZqGù,+&fəs:{UQ`VjrX`p}v~0P\[PV4=V9ڱķx " K$"?IfG1Y&(y'Q62&21#Ȃ ?E̶;gxsKQuw)!QDx' :WP\cOi@&.2[m:F~ų7f LtV3^l0Ua/Qڒd[ż`ljBtHyCр̜qq {jg+㳇3?,sLSCյ^$U |0)D[KepQ 0mGO~OX!VIӼeP!# nI_`PK#Cē0!/uj `ڐ:&pJ ٍГ8A8HrRnZq(^\&, 6G[l.6= !4F85PˑY`?IgW/Yg!WCRxF SRˆ7-rt-hIBn`|_#MU ?^_MuWa8{."ٔ{ժ8(_Vsq jD}v[cSAo޾~")tp{qϧeGNɠq 'o#^u*$4 ]yrGeO4*Ȼ8>Յg;V-~z&._Mh+c& Q(<87>D?IV: 陨Q w@HIefz*xvBo-htcĜ? )%K]I/eZ;jw0>i>('TW v^Evx`~;JlA^OɂAci(%DWcs0Փ{EE=E*Z`vgu}v$\`q0ߨI*)f f^'PঠQx'V@ћ$}^m$1\8|J b| |poշ|@{Y. ;c{5-8gK\7fW7JU鈋Adxk%ry>EQ} ӚK3y"Q G7RlA;eAo%nC-m56CE?S-HY.~}s}b)j_s!7cZx.l7)1&ms*}rldZ`"S<9CVΉwP xv#7o,jfFȯ.閵oRD֒C\9O,uX+8H?P@29~a&e]HC:S/Z7)#y7]d?^26mJ]yy"p^OImh8?2s fájw[^b (sel 7c"\ L_'mg_&4"9wO'"6# )rscHu.F;m.[n!H"-?(ֵu~+2qI)dE{JB K[.A gj">QQA٢f :Y,AZolaMYjBB뭗Q)Þvj$Ujb/>ZV 8ޡĜKl]sA/VI̶NoRf q)dA'UuJQ)T2*M}Q WE][_ >pB+xAK0hF7]^ $D}9jo<^/Ia $GP+6R"8{ ?w\Z.m4DsDqC t:Z|н%VsYA~nDff]kVwRUn#_ '_c;dZ\مRŲӇqkaoSn т'Ѓ,[+ XBaBceq =а'U]iR(`dz"e`hLrk{і|1J32@fԣ|PKF|th;ρ}0z{ѭڿqguEԶ[/,C#ꔮ2'A <ulP _9e]5-Wu.ē0RqO );PG1RESx lY uDxpE,]QY?&AQ>/BWmAF5 ioiNm8OLMF%/esZ̳(c03bd g=B"ЏKo@P䃖M~cʥc>5?ܪv8]V//Qy~Xq.F;PH~/.o@ gs`h~qHF1i~;Pmx_$Yۙ5`?IZqJL65jLϙAUKDEg3ov{~KrZzV7Kк:XJSC2w#eKe w%UU"l#Ixt:0ql9F^CӊO-Jw1Cg. /G 6$*`lUS-x~7e-q"kjiK`>=H͒w}n{_2pIrD6F;Q[Q kX2pr4"8v{SSt+%VVhxY7tï궻j aQb~b v̢=>rm4aEj^Iۭ>%*[%kxb-%7}O"䤔H2,ɺRtG^ >5GR 8E9٘hA: "f6 $s@MGǰlFDMGL)~a"PS%KF\<{F,7OϿy/_?Rud~739&6;0Y{~ߏïD1&$[aQdҘ@-$jUT"^>NFQ=W(1ƮYc=+iBgd{{!̼xmdIuqځh WIy9CLonlfbDI=`D"}J<)•u88^Ԩ`(3~A9'&{ ǶMF::y Y٪G-!jz!a؏ާ>=fW=Jͯ@JxTIcg5\&$Tt2⑔ TFZO6֜z)W8B) ԯ}Q:TKTi9ڣTL΢TSƟuQV6e>/,"Hqq$@U@ݪCOIQJrH:&ٱa(ܧg΢ZS}U[+  &@R4ݙ" E񬩤Y4uc !yFOS "݆-`O8z.$-:G=ӴٽUxC{m>Z4 9R ]ų)v?>ͭQvbշ^]$]ӲbřMď}[ C=|.-Z.6i.x2/HIr383)ڪ%EEp6YFzm|fe½/ |F`#Z*l,\ވ1{ r_@,[I݄-&s"u15Z.і !AF&8sY=ia<1o4v""&P݄Ey?~ZˆohǮn ~׬ 2!f1}j/oM>By'^B8+{F\$w`iЊ9/L)R -O$ZNί=a(~#\8CcN3ᨏt)HX i;HC0(LJF x*H_72C듬y@B^5|fV,x?Pz&b4 v8%4}43aDK Z۾ɚul2 5v*{oSiZYE1RD-'1*]Lq1,#L(fyeIMJqT2\&~t,G- oA5f 0 f+/7Zc#xw ;בN"$*IXdަ:%7AP)aIM1eh ]B9g bj:XJ`;P<gA[C_|xȼ%*ґA֌*p4~m @3w8-LkКnlwY(oNq<ꉀ͖$~#GZ}(Dn@QȬ;,+pFpjVZpy61@bˆ7_}Pm 9| S{x h` o^!Da5 ۊe⺄ʇV 6;<[cc%젎ɫ{!4QIz5 Tע8%_g"xM"-]"/n&[MFbL s?}rK~wpa G0(RN-(:ʼCO,_΁Xk`oa5ӴOsn;?mێ'x`:kXX wx`Rjr\Og !lx`i(%##rj{.X{\09t78V* (q]vˈPʘ0?+Zټ5nٳ? {YL3̆@g*(7\ߧ8ePlaϽ3ٸoISՇ 9RїԑX7˽E $xh;ӾP0e.wxzyㅈlK>mTɩn:pZ}غʟx:LPRFrU˜ j㯣 _<3as2#lۡq4e>\̳?"ޑ9Buptʪb\gꠓʱ$u`4gpLWτ#bS?[GawhFX1}-AFf=6X"p*ۣ(YVES|F,IHxHɜ5kU dD3ER&=t[f L<ƵaK8J Gюbme9ל#f3L3Ti⦈fI=$ tmq]7Q!İh7с>4=g\%H,xL+dm3Fn]ȷ3B԰#=t*.mFuIXjXEzI~Tmͨt';LdiU_<ؑ+&I${-ܬq,7+Cƕ%!\:IFb}`g[ ?MOC;X SBS )ϐ1UCe~*Н}ڤ28K`N'c߰W xN-(9ni-cҜaSxϣ0xixyZ{y $rL/&Q%ѝZ4gѠ=i=86 _Aa6~3YvRKe"XL{Xg'T 7`)ȡވ,CY .j-qR̸&?YiO3apרءq?-;6x(`weJE]cxcp”pkQRے%`5x8M |QF'vlw<*5qW%.&g]Iɤ]c(xI7H'܃[GPȏyW$3;4T2 94< 2LyJKw)/'5cuhi܌MeއxK-\@)y8$k&qeZ\7% {@uB,C2g?6:̞糗O鿀o…8N⮼zg~uD;-jW?e YyK֡`np7M8R % %*^a<8))6Z-vr$aV&鳳=~ǎ,!Z:F)H~k!'"Ӳb@0OIP_ dqЏDH {2:Ba`QtOz bX"P;m||}pS'zlݞոOLr+*5 \C59Ӱ gױFpIDm7/Ml+UT/֢@rIeHLZsd *_~Z3Jܨ(v%{2ť|pT\OHBEd_f_M_/-v'U̐|Lx?5WH0O\782O^K;lA 0{”"Ycg*2nH3Ke&E `eKY&Bk,"Mg-W2Bpw:J&$iw·Sh$&x}nnESĺi2ؐv.6p߂3ze"a*#(UKq_hk`_"4|a8Sv$W&[j5!j jk۴z- RBXXTgWvjf4we ln1Ma>;>r>15..IU/ ߳<>ւ()!$x嫦ƦU;dfĢd!YWsGO\FtQn1HzZ^}p/ H(J'x8r+Ɓ*h#߯_|2y '.r$kwWZ`jM3^3E*KҷG0CLuQ t㏸UՌaOJ2ϳ3NIC_U ;RZB1;1qO)#h#-^Y3Y#j Қ˻%xIwg耾b/|;P.W&{(i;hu&?j8_Q:޻ߙJW \˘PWVeޅR 9߳G:Bҍ+B©< y""&fŚ`X5~5%l9U W1/-M~цb%4&EpꭗDik]c-҉>sa3zW4 i<, VZR2 ﮣ`RðY^጑WmUJ٩,nM݂{ȷ2)7W9B*eOkNlwRnev^ޗ;]{͖t<ɤғpOwm'ef:sD+[GD!ʳ򄌑e8p/>y>dg&+\AV':da4PMk GL`t}[ dK+N[PѬ]v&mrd)v&7_(}lœ'OO>{CM9\0OXB}F Ԣ/*,ðlԻ5ښ>P!bF)kU*$GJ\WQR>"(;7GzXf?{vӯj)CBh@u9ik_tm_. SU7!oq}7b{Q}o1GI&Mw5Ӓv~j">yO_3 g=A;ۖ HST?jrWg'h'ӛ$P > {+[stıM얕:=]Ot9(/{]EAm1c>`Dwi?炢X_VW re_{6w{)l#䍭F*Wp;D6sR7]cv$=τ?#\bpqS|{mx!!6m,d @ Nκ ^ :=&!k(+ jURv=.M36 rn4 ) zv2:Ru>߽\aXL,K?~wsi CF4?A #sa ;n'Li3++J[dPVE `>}C$L5}$ /|ȬV\+(\;UHoGOPZEI4d [a*䴞˱eNXK+l;jGrmLc?7ЁfqQ[v%=QzRt%{ 6|o4)yハާ[W=om+qENF*h(&IDf34HrF42 gʤI/M*-e@)V55c+엸9%"~n&M*AQ50(n/Y!`$OTbTtqB׍YީVw@c뢪K45s |OH2,l3o'T^^M/U -Ć0m<螝3O\6 d%yyk)ɡDڕ+|DM`*?j-Mzb虸>T85[IW|T g1jC|6YN'˲]J,@j,k24/p-(DO8Ϣ/D{wG?_?=bRV]H(`&B'OCd9G7EԬ٢d~/0}YTm|w'osdeּz^#Cdf2Q?&V#MSBuyXRM"<:I06;zG%=M_Iao _iwI]>{,"}ƵD<|I͎o7;fwW[yrW>XG ߰ϋ"ҼqgofFL&PcEt&SnZ\Ů?Ea;f}㼴Wvjr7Lo~B|5Rijf ޷L0{y='z|'̷j.kuVa$|RiVWRN[\8QENas!j7rjsE܏<.[r9ݕNG-}GV !?ʒ>ƃ.jq>zJaH.ՕA4@n._dX 4$|W^;> ?%Iuk&V0q[LId}܈C'XIi`HL|o< :>O^n4ϒ~-鯍*$ׂnj=\ɞ{DRBE)Fl5J$( (F4С`TQҦS\Pқ$>=*_k$7ZFe3\fU@IZmZV+jp6E ya̳C'{d.!RiU%OYZ;?)*idJʪ,F^Ba LDKaVhW(h(M/_X~gjދD&#w~ j%Û^e!Y+Ð!Ze6na#.M4RK_aDHO(鍵e[!5_ߞd0z-m}+7AM+sYIK) E~cK^i#@LH;Y1mWLA69v54L$7`CK5Homr3/%wIצS@;%Xn#9.ZQfj^>ʇB3.'ϻ#/FJ6P칀/m_M/2vw'; 9H̓8tLyrA4, ED2v JҮY7F4 m$! IM+V$fϋ Zq@ %EQndE-rM5(TNF3Xm)(sL]kMvOR5St5An)8km&2&[T! Xb++N8xbu[jx( uU>@HGYԲc+\ê)OYYHtw@aKn&%? q<~L˜wgCcӛc'Ln7'~jcxwqwN]o4Ak*=cU_woPKD"PK5q:U5 __MACOSX/darwin-perl-deps/Module/Build/._Bundling.podUT 1cM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U* darwin-perl-deps/Module/Build/PodParser.pmUT 1cM1cL1cux SMs0+6C+4^x-cMlH ] lLC=UDܟdMҐZ}Bϲ›XخTRIA&1s[w$振]i g1߿}wkؕRnIX!LWk8&A SԢȀ84m<fW!R'iC C'kP"庾[d ccBjdC\-@"k4/+ X4" jWU)1MҘҳZb㨖p/Z t$ =Glz+>':s٫4inO)s.K"4thd]:XN`׏:/_A"%ڛ|_ӳ?]"˧xa?ua#E>/L] U,O46[LnLHgEv[P!:lz_A2\PVJhׯ4W׶p9y_(KMc4o"7lHvvcs@ 5Qk̋\z*"cP,d=6c@J4 "^&4;K7d29 /dY,|95}|oLsC Lrqaqз@2 E w_4=40MG0EGtq /=aƽrNcth"<_n߽|O߼{чLEUDW~RlL=lLaΊ_IV8YޮeVdp)-]{]1!e`M$pV"K \6yV 2.l:u-Y"d8:/ap0JɦJ g0&"Py =Z[ZHxU,)kKnHsyIF.>D v왃l`٧"({&ےv{,YX% H$E 2\Hes`ԢlOp b']@;=C (@!ǰT屁CoH9B ND 8 <}i0I Dn9jmaV$$ݲG*p-fFn 8;&v>ж^}9˖Cth4` Gj%45; ewV6&F}g<8)EO'Or:CنA9¦>a=4 9Ȩss 4~g5gѽެRuːMg˅xp&;{!TWPdvLJ].^iݐ8c'z7U[~Gv T)$#iisr/N GmwmzU;Ehdϓ9d{߆Z ' CmcӶD^E*vvc勖l4pE?_Sō^ +QiYdtG!@˙!P+*kqÀ  uFϽ[DI` qmGqԀgRgWjZaK(^7yD [yfrR`YJXy4BXu72:54E yk_0 (yƐܚ!I0 nY0 ݎA޶2lYZ;QAL2xNSuLyWk/V8"02#wLp;o/p&8+7#V47Zoʼ1:vF{heƖ >Y3nP6qC jE|x p8/Õ" !vi<=~4L UbU:BXU:r;s^ A* c[(9"APsBd>On |& ܝ:"ҖZ̒(h(fl/;B ]:{. -a:u}>((qa x.ı[ï+m.s=V} h5<,*`cppd0Y\Z8X' {TZ.P\nڷ[OI3&Y D^ʊ /h{ƒ|윘2i1Y/M Rchicǚ\τ&z&+Tc,.D_ y:M,\$m>KH͜La"c:W<˗x,pH4b^YK2a> )|rbqCOntGr8τo t7j $xM#geZl-zT:LЁa؁(dִutkaal7A Imhׄ"iFR'pүPfVS?aAO^E k+(۾{ۛx&7[ o_5}U~ˆif ^a]C@9 q}5nܠ@D [X;Mi\:`Mk8#U QQY. o Hc6q\Pgw>AYe-Rk~կ:o2(?"DQ8zX䁪[dr.C^U^[%︀*vrϚbhJ.1 sz)-zd8C#Q3[$i~5GwU?'?9͡~x xR'1%TH'zFȖyԨTVЧ~HJ;"8jw>=w"oZ;e떆NY9ZvB5ږ-[sKWUlXBZ߅hVn9k?5[fD:b=%matc-Em߶R2e_в) [eXt )6dΪ9;KU?Xln^d8Gfv-~G>1 -7!{MX \_#MdhA#i B;틱OS|۔WHٲkN٣E{XalZ|LϚ#Qe1~^LEY&U,4ip@(TJM ) hP BOĐ֡ (*>vphy> =҇1KIwFO'Ƿǫ'͞gмYo_ \gOP5* LoLb/4f| Ǐ=x<-J GOZiDڱGATF!@v r /ډޖve8 >)l?9äY6Hm 8t4OЁGߵѓ pH# ="bus dib;o~H89Z* Jևc 6ߨLEc7eu5B 4Z9sG sMo.)).-n$aNPKl|^3݄θ .1?'h9"зi12>'ό@`U82]*^? S~Wk#SQ4Sc4R3Mοր.A>Q59-1brD36aU7y% SYYBlb>Z%c @`,4OZ@wg4… w"r2C!L[0[:ua/<ңK4ttlJ6xbب;C~Ec@C4!mCZI© It;%s)=i]:ɧi}YGqEx x+U74h n 3\G*@,OHjH`y>:ݖQg(?*|$C, PsVk٧-)<3u+"92O )ڂ\ wm m5 +䶓|>-E!\T-?t£ s0JESdoỶy>8 g0EIr f*B\c6?|I\Ui}+FcA/˽M{py{f2 B><DW^iuJ2Mg #\ms.7̠5Z9DZ0ʙ~/ҕhk2N۱ua /EL$fe3 ) =|O*#5:v˳~%80yU S{ u.V˗jO׵|"0yp% ;n)*Sè0?Dh0l E*1hN37JFO@;"UY;k"Fgݍm%zAyZ"R8DJN# t9::#'M#J; A djm6<¿X#5vF],c- PT$M|C 9g :mQua%Zx~ :G1N0T|.+V`ptkbƖ3OSU H!C61qp:ζٰ!P25By>tݥi@0Ɋ˂ݼղH/7ZYMUsj< bm*oH61Z3$xo~|)( K5hW-;% `_Ds.凗/<Ǖ>nSi04?YzoTtI"Á;/iqMSO^j?\OPKdx@ 'ڱ\JTFk'.:qE' [&iCtd&k aInOs$4OL𿨒QpΌ a<0Ҷ{3N1Q8G }%PtXNuoY6xQ-cKfל"n'84U9 Tuɺ-\:NdTK9< 6+VyDJ:nPZtr-qes"FG71ˌy'tieܭD XV {4eI9ؖaZ N#/ofzQ@.?yǤ#`CRN";yj/=g#| 89) :)8Zݤ2F6]11B,iĚ-ūfM;9]~|U+{)yɿ[)nt}O955/ܹqJ7N)@zMF|:!؁^1Cg>]x ޒחXб XU˵eX|*BvL.&{xK1X2¾)(ӂNXZZHl>L2M-"viQz`M볨O5t|đި1ˆc =BpJARJD%m~$^Z Ac5ΆgW\.$\0~tM#ֵտV!-h5#1)5F/Sg(qk.ADHA.I6n1Crz9=?=uE|dz?WfW؄W0!"-Evb>,?k=|{oYm 8ܚR]^Q4,)DꚯBP\L4 Hl<X1lK D(!u!vƧ dZz Z+B" &n)L׍›Qdv`VT-W!kb (_T /qks˝z#w4ëYj2Yt~ge$f0NoX'`'Moڙ#ፁXn15(S./%LM9%lHŻ~P IvLT 7b&E}@ f"؈y2fJi(3D.+moZb<9d&Y8ubQ3=4J$Ebj N 4(N17!({USHe\1&FU9 d(6Z@ɠJ,CEՠ~d"O& mw3UPEmKf.-5g@7~C~D7t/6:K;?{1Aor 蔞HyPRc5C?<@i6 iEP͙Wfk<4:FQn>vU;Ȧ2n1܃X1pVBIZ)nv^e58Z0b@lTi=BK _] ն wq)}W,dM]D-mU&S.uaԇ$Wyvuh +5-OjST4&I68GU =ĄMPMg06:sW?(Q|Gs<~H(JZRȳ&msz]92ŻtLQ79E }=6(FA4l3|ڌ>&E|ġC zZHcx/q> Qp.\,q>1VZXݢ AݕtJ Y lA+m[}O+_T3b Nkp%k7xEow;c`JEHI6B{1sOЪs& 6I AV6t"11+lЦt s,@ĵswH76@ȉFb8nz9,B71zn$-dKk``2!\ᜍe *[(R`6s97$E{)Q]JvZ%kL#΍I끦eՀ1P4؁sDv$RgS>nZ>j%gpF+RL?lSx&PS:mN% pmiwnaή@+)x!%SҵJqm߄ k< ȧFi5&uLy3;PB:گAU{y} (4>j۲;`F}S=g%¿LqYsÒo.pVhV=vR;:fcXs[Q['e8&zR7yD]RtEPLBh0=k~碐:—j$[fJc})Wu|@+ p )}0M>9څ^.Yo< r5'ߣa#2Uxo7v%\0:rDUWqcAnu-Bft bRz#|Pe Gw.uʫ,= 5A/Qzew>3q 9{ɴ-aϵ ) Gc={_99W2,/Wy>RWI}FE]_dGa=u֦MQbXQ-?M~* Z)Fݴw a#jX F^ִSٯ8|񍴑n6 i(QbZI*d,xKȎ uߣ@ʕGp5vT҇ۊB_jޱ{Qg_z/NT"fVBFÇ6*(uN3n\w̃O;'-AP=!27" ~è`OOܓC CZfVBWY6m69}q5'j9KK~<O5aw_КK0/i=48df`]?u`u>a7 Kjp Noޥ"Y7IQT]`W4?'Rz ٟű9>f^D \AGy55pCp @v{s+9'A[N]Yȡ"K,\XPnlj/ A^OUb9#v`[yJ TK w|#8l]XNإ^ɼ8RD!%#CɏҊNܢl5"7ދ!Q\x/{#K(FӾF^jeqF!yK@>&|tŒNs V]{:tXY8?CUQ1N[m9 Zi&NsGY-Xp( M9Tn vV)H5lȵZ9 E|*S"& =']4n3 AA-3uf\0֍MQ+r ϔ)F4#6'N-kg~TJa=A7F`8E+V V;`- *q8ps1&PUsؓ"ѯC#"JaHH9zbr<Q}e,B6]#{r&NÚUI003eK+ص=1:1VF 4r`=}c$CNPR 1y3qo('g XU3;Ϗ]۵+ž_wkڭi,h'Cz 9Yq #7ג#n,2MFaGPWP'rqHΞUklvbԀfF xNAyPq8/>G~O &ZxԧnpK8\.,lט$<112+o5dԡ{ρ >mP 5RG.e덤ZÈdE _ Mr2E/T !K[2'bLc WŷgxDp:AlQ ָ-oyѰ X\f3Jn  aŖmb7`wNٔz[nT8ـ{FG35|u4Pɿi0M8Gä ]p 4nƛdG۞qO(‘E]3Nelm65PnyݔEDznN>ڭQJ1|j&ꗯQR| + q$hPdȑGʳ2=Obyp'qColxc2VjDAkEpI>B݇n!rcmAMa:B8[lǖOxb .qLp^ NDv50=mz @< |ƹXq5gynqt j[| |NEC ƍc;XQC,"ٰj[+ڮyg@mҲT4u1!n#c7t}u /,kLmT𻷵e,edEFq(QxƂp˅XKZJ6~>f! Q: F),BO@&B<pQߧK2 :[XrI3<=I&q1&GXeuS**-7.qIRJ[8N歭bQB:ˮ5aփ'Zou[ ڀ%'z\|15>=9GfCST"z\e' ASЬ5Pp9NBPJN4JI~݆j9>V[0vEl>44M A p2V mB5_ #<\l.E+]((cK,mj1g:ޘr@L%_ cDE}. C ѣv(]~~Bbj7Q`}񎗓l B=1i(գ,9ʥL`CZ .^0[KMۄ B ג}]ddHnۆulOP  c2TO!v^tՅ_]8@K}a$'ŏ3"4U:}_$_L@TcqAr80azJt(B)1(^s܈3aphIj/lY/&"j[Ջ~xAn>@-*dyU9|_[϶ặgx]h΁g!]-gtqfn" g{Hk᩠Y#]6ňoYoM9 ĪʲkZ}:IR&Jl>l;#7ح A؎Ri2_P=o#AF=hI;[liem3]HK#[`+DȪ7u X7K~wnC8FJwXPF.OA`w!=Aw;7. THL@I!|`WiG($ղ\rT{;>( ]u.G,'S:&[gC\g[OZ" r>w=T+!z: (- Y"&о[y!=*CZE4p@p+Tɝ/OַTש[Mjf 3Xwz0ExzMSYdf[1rf mJJ:;i(PdžLçݡrd?;ឮ4^ea|t)a'qrG(S|{^j X.82Xtr|>τL`5> va:*{M=;n":lL޳𿽽Zpg}qŵfPi5Qs>U[;N'}WϣU>o{ﳽ0EJ tE!*ԈDk5E>Q,!u\oܾQ$:qM~X}x׋k`uin`v켟:" w Egܫ ޻-KXiFEcS?z^0Zp P%cVFy t(@ܕG}$d|6l[wh1/{P{kq0wp1 5J zz6b4mŕ!ֶ=eu=s6}v /Ň|@7ҫ$_ct28[;k.|00ӧ0rC6Kg+b6yAoR3ՄGIw|;12_Pxx40 K$@L.n 7'Kݵu>BEŧ ]Lo^`ɇZyn+ԟ(W 0j_t(>J87'D^OO'v3i}֘%}{+` \սp"`'L?5/|vM*R2Gƍ)q*7YQWX~xM@d&z0kH݃rc:x'T+PF79;vU}\I 5M4; z_eƆ3_NYdA#VuK#icxoyJ0fk>nď_~<$Ϥd`bKJ(y\pg'J-|[k dU-EE^"?D@S r~IT`=[)-/gHqbWan?N4֥d 7L h\syQH aHq H?|f,Ob|Ju2]QA&CSf”^pR=}v};M2Hdp-G@e~OaҀ ws`Γ(P0Z/4Ķ]*AjY¬'usU4|`RK԰Q׈BE^ @_(El"kSc/o%@[Z5HnJ$/b%tǗ>F(g4MJ^K?a00fkgZ:KW"ϭq:!j`91ЉP x7jŪSɈԱ"- ڰ/KVS.Yڑ]_u&x4qkQV4b ?% ߺ{BJmhVY@MsƱ317mnW^VFMK;W5< mPjc\@g> Y)\#Ep(؛%׭̲5PmR;{ΫUQ4*VNXn 5*mNNЫWGU;&ecDh)y@ 0G$ pNK60n|@5 8|8~=%ڏ4)}.SE]nPL37u $ U%L ΘL0Y"k 7=ٕAVɦhqPi)pBD1sc;e=-:MG]H46-838Xf-/RǴzm F do-@U( lS5msvQ ?E2EO4/QѶ7*2 <|oQ fm, -`S@,ˑ4vJ :ʢ<52^HIR8(<'o-6TLH7ʙ6#EtAP,"|L>ǹѓfp>`R լZ*q~pT 1eBt1f 8H Oǝ'=zHDv KM9^ttZb馵w[{Gr۠GS?t,_I 6FDz*w<?h ƳrRVCpgC{ur^A,Y..+}pj2w=yS Wc[eN|R='uȾvtt8^pjmWm7X)AtX\a>Dz O-MR?K*s$/"5*O= 9YL^'c|HG콥t bHMP@)߈VFgyw#6wyS= #",0RratX쎊k1p ¸̬p`0հ kxGhnbﻻQC%{;4zyJX*J-k 0  8Dƙaho 8O_))lyvk뎳 u+U&G VMW y9C{NSfz?Bk37q*2q }\pq(<$7 ps ɺiXՐ!)Fx1hĭV׹8tv2]&.1A +;z'DF$h߽ѫ;6yq|ۇ櫷hߪ0Y;agpE?+9)خ.vF`j}_*n2F})SXB2U&ɻh9Bq4M=mLR%~r"TD'LFlXI!p-ʤO+q٥ǩVVQ߾~>zsV-'*훗Q9Hfwµث|6Gr;SnJH0]'kKp"y>%C&X^LʦkGL& 82eN#DkWg:'׏f}\6 AÇ=z.f,_0!/I2]u#  s&xN%|xkk۶yZP8y5ޗʿ7B.AtJ>OOoDLȫZ??~yba`N0<^GMdbGZwX%v: H9  I΀mX,J F鵏`ڵWPPpn/2n)e-[qbpvh$&ZS*Fv=W+4↎Å9cڵy%eU~\mA" {%^ n&`b :ShJ%'/Hcbժ,S%8Ӯ^Kmo}\*_vMkZ%Dv^s϶KZN{XΐEԚT(*uaSVxAzX'!(04YԿ ͷlzm7= h6a_(:>~8ugvT'%ˁ-K' թ,2kΝ>Tݝ 4A ^:"P;hʾoYӏpV%'^oo~|7d&l\:H ](FOS6POfONF]-)F^ :<]e1fji2.ƢHi髾%sr7D0Ru{]Q@DžE+GG(T,nDCݨ=yyc ų|ʡ!#X'"4_i DRǧA~-QԽ%먫7,A1 =KCdTpGK3}j6˺ .ljB 9- Ы4-D>w:gAnݘE=v8D2"dD3f-E>'39!cMK)[8_8˾}zabT^^=kR?8x@98W5¯eF&2?cdemgӏۅMxp a<=S-ۯ*esSw6E}!N ^I6 FeWYcT}HSwC^2\cWq`kt nyh~Dvxڂa>^NHgyf_9 Afn/#eۊ-3O]v|c TK>{kq>ƈEִ@tD:;OjKUW2 L.]MQ|S,dIĠqm~> CnSY2)8] .؋xrR̛a`=r˟²"s(tcx5HO~bN)f2d19kYp2[\,*.IgRI_Uovp.|R:$7 3>գ&^0#S}fAZFNsAGv%,'0(m/28XN& -r!`8ݲF3 POp;r[G|21]3qlSg|biuٗ$S`z&)`05?/M)8#h7|S_~.ihPAfRN{o>ERM(L\|Q9[,^}'U,cK|)ޟV({rGoG#Sժ_CXb3aA&MdL"aoZV{Mx(u TiD1.3pGǬQL)vE!7 Ep[aY!0h8raWV,4o"P€qVCɢyә{V|BXAn 5}5nPלx?JghDQzv/b\4C|O 1I+z:N{[$EЎK@!%hԪ ̀PZ߸ˣapOKL ?W~k \苜FkxACY&](3GUdΗޏEe__y$%"*>`XvLŨO!.:sú(Pbbȥd@i,˅԰d*&FPL.SjpmkǦo}:1&-[ʊ%Eh4\|$$[镜G~<=DPHT `ợgsU@kј=) hǁ͊Hr;G'8ʈ~.I]9xE ̌@Oⱳ w?_ʳR@ާaS.$h*QU7K ) "-fA14D4' I fj&nI9к{J y_>esXԥ\}(k~*-߽ЦW{mfFϓq&_ (vI;`X Em -JP0"^YrCBa^6*0 |ͯb0v0!A_^s _wh$Z9VaO2*# l.QL@btKZ;r^Ki%C4) kM 8 dl"-PxaJBhQ\wIC 9:K\ɖGBiO,SWy};qR˼WssP}hD44 >7fW&$YM? Q^8@[&'ѥS7rH-  X9:~zВOnp*V&z)ery>5վ"ݵ^C Ǿk_8 ='s~Mqk%5.Sy,1O7BH|&ƾm ݧú.=ZV+|\Qg`S7ev<GlAF6[x̼";@n_GM/ 5t˘B h-#ŁRd!XfX$b^񃞯> npِ?M%GP%LG_]b>3+p .Ehzqyz1?t֫2R.@ SM%s zX(2֝MQl _KY}aUBh{p 2=5. osP!?ӬNF}H?i*9TƼ#/4%\41B;㢴>b{~I {v;ͯ$w {i985K Xp@E}\7WKzp-\}& CbP\MWZZ7wy{qZYAo+=A( xqʢ,0ԦK. DzĹƠuvv3&TVa;kh1D;CFuɽt_>/o Y%m)G֨~#cfj$SPdYbC\Y8|$Ֆu20}!^'ӊއC1X #N+5/$㱄g`SMO^6qdCGGr7gKO9~wD8nWg8&w;DI L395Ma%KRJV7Tvt4u'u4 8<5:JHCU;S$TC=|M}ր\eYՃ}G5|㲉t;K9ּt|wQG9<}pW>쾽؛9w{w<7J }p 5P+J)0#< ~8HVjR ~́Zo8jZ=tE8ЄWCI3 /m_B0nw|NNtlu+FB@$mxqɠoXnnGBH08Fa^2iX,~n{ j/ijz!*v\򯢋IXw&6 |i> #a%6dw|E UiP(Kt[s$oQ6R4532 E*-2stXLC▫r=*W*T6$Ify/Фdž=cxHpd]SWYQ˱n4wsڹmb¸[pax?P`@M޿AM3CWs =j[8~ Pd4UKcHzm@o'*+CO؏t^{Gh0R-3N.[5ps }]/̛Ȏ`~IoS\(]lSbʫ1Y&$ qC]ly6I.g9**=aL'"8`5e!ώuB#~k]A˹g^F(vh5,b<['9-P3 ^R_ )m`8U,Ќ"*¶K#*颓SF8KhjEjU Ke/ NxJZft~`2e~hnS.mW_DT.Dա#K (&#: 93jw+Q{-H(:sWP}תK*¼wXC$MQ71{q(:t`XL(4s'b n$ $Pʲyv.V9' =XzxƋ{vѐR1C+i BIy HQIo )LTe[?֫Ep[>_o}(Óu Vɉ;rBdV QvsP"=v$"m"[[geΡ0N\ٜ:CS#l '7:E!`NA0q'&}e/;H/?$kMgA.L 0q'G# Sѻg 9dpc.#53}G%@^MqGU ?%bq'+ ️h@[^5f:%7ݖ7iK%w Rdd`|v{܉55>-g01dSkԶd+,dž9L){a. 0^kA 폕PFY'ZDeJ_ޓwIG''yd{黧Nnޝph{epc8/~&AbZWZ_ODCrYh$c2^j$XXH yuUs An%`.sM u(N&mm%yROA}CA0\LvE@ۃ#dP\tȦw14bʻoon_nLߚ.g¼nrF̝X~O&D-Jhop[Ĉ;ovոr}$R&~J{BIO13>Lzh=]7Hr<<ьv'9! Ԇ9[d ,3]2g %1Iӷrq,=}=")xʥ7~0+? 3pb`JK QY)`7fOǟG߷VÄW,1]mliX6%iT1nO~D?[' x,M|h&LR=Õr1 P`lph2F%_ۘ7i DܙsY۬Ar䒿Q`Or`Ri}KpѽedAGg.(#tE*=|TL>E6J@D rv _.=(-Udգ|y1JDN(pbYSAQHGѓڛSYʙSul]s6ƵT LC! (]YJ67d6QʁPn%s朕m= 1Y sAh|2_2ߩb"&42W!Vʬ?֓G-o[vMS؎66qE7?y G]gG0ө+bm)PjkSJqo^m|`gsvKk'ἷ]eʄp-gd 3rt5gϾp\ky3,IdsVkHHj(,+_-O.0eFXOڪ ڡ)O-3G$ ˯>ޡVi1p& MG#a4IU$&i6{;ۿ?G /`$Kl6ޢq]J3siTZ nW>pyoYZ=,f|h K2.&=Uwޑ ?v܋*T$/0ki2 _tÄ uY SxdΘa~5mr 9];j{P,kYdk<Ġ{I "T H]^ EwWxt âaniԳNlLc!k !n \e` E]]}.]šP8d 4FCNk/8IgAxQs+^Js~WgfpGc .HI.;hqzR*5L=.bIy:U܊~5t8jcnfFC=Ae>=t7ܘʲNt&bY!a3ڗb L.;F{O1DhoA9QX$Č,X }oC=$dSNgDM- T7{.+yYAͺ _R՝Fv A袠GYOEA 2ٌIi;Znk+.k%}wnwp> G{a1px&_=v:PB32*2¨qDjܦw;pAQZ% ]v UƄ_Lŏ| J{$uwrmd,6Q4Bl/au$0|˾ %ƫlQ4QEj*GV\D*o 0͍>4 5JBR^X]c2hnZu{K6P%;" O ` d|umюBa+~018JR~-ͯ%9(2"R?Y z\*5r`T`(×:󎞧fZq8iuR'a2R*n_)I dwJOOT-I[bmO7IS[蓽ƪ=f4I! S6Hdy AiS @O [k/9BEWx,Eh<{GlMgn/VrSu|iy i2BQ׻2wUBgd: HR![o Tb,|x'`kMK#*Z--5pl b-hq:XE3Gð{-& jq(绱anwp;%43 _TB^7mJ)%uuTYn%}B;^3-c?u (Z]HYWyYo}P@QT^/$z X{AR#&:8_22}yz+\Ao#ic24."8MeeqU8w݅=JһcY*\0/){K֡qK쨫bCj}LKɦ/:!c+jruQܺwֿ&x06ptl zW]ʒ(Պ Veo_8@Mycڂt0l0͂ *|y TGUĥw}Ma -Pް}2 D'ow?9f!@&T-1:A+tϜJbVD, mIV|\x)3^O8]uwx эDqwaP@%RL1n@ɿb;6fijCQ;/=]OWWALÇOo5]TiW\ɴ4Vj+u@0aknt&|ZH" S{!jO'g 1';m\ja"Uejo?}qlH^ȡv0'CG,˨e蹇_ؠœ.%|7`r.% d12:QC)$e{)h;VD̂H| seV4AICۚ7uSOΆ8s^Zhz 5&]DI+$ NLцG<(QЪ!epX֚w~džêو& ad*.I\@ra80nS*k1sW;meֆ-hp^(V[x{G%W@IyP>'FO܆h8~w$c7 Xϛ n~bgQ7 5<3LRJFc MN(4V X~Xp-y8,C#دI8@|Y#W }JBAN1q-iƻ1HMZ}:f D~{Th r{zw멀$ғ uښ7>|ێ&ɐ!wmBAuY P+ Z: U+3 eSh{,uHKzizHڧ[] 1o)JTH2w,m$JijD zGmuXC^kdKՔΙDKJ%j׳UVR+L.43hz>,\$h̃:+KV_#4$+@(@=)v*Ѥ=J}S@򨏆mzDi) "p ӃsWwRI˺0r"#4W-\FXo~}V3Z.H@.ڑЧ)MV +{UBֲo?~{KRAW]z*%ޛ$ }5[N=I :$C$`f߲8y18`+V2.3o5E|#q #! '†UVbڸC%D?eL?b@K»J*Kڽv޾ejwvWw9U@KŨM ;0ƽ{qW뒪e`H N]qQ:̑[FjX]% ˯,GN˜ kfD.vlq(P|Qs` 9:l]gQPՏ#,)TJ̬O>Zν/@ k8bnJwjrlXt8;綌BC*i3~,f֠CpQI%1)I᧸0(bBhl 7F 0gb:1ZY ћBBʠ8KRzd2TP ȩMukEqG%$6Z+քnR C)i;c 5L]H&S ,yMK-j 0ܢqᣤ^L-?mxNc<7BZ*Տ)&vyLim,8cTkx9_8V mJ ?:'^P=?D7o d'ftaB/d`jȇyh|ꢸ4-kx`d'i+no[O'·oV]5FGiX-VN72̹L:XLJjRϴ'*Rh#6 &JKh[jqGn=.by;Hл\P$C;zo)sh|׻Yfi|u 毿*3!1-iF8|G'9-w۞`Eze`+֍1lI .ǵrج`q0 `@r/| >;2m^tP!梎b֣ͩC%omLb>XoaR[H"zayjg$6}VuhbA*,:٘`A9umӟq>YfHX-$P)J;2Ch`#܇MDi':@*5|afTpe* 42\25Ж1tͬUauzxw0h^x:ƌ%.)GZF-M QӴ$[0P$14~ %x0pdT=~?SZw>^G'6T5 OdXTԲzzl]wHGiNp[t[ڀ} -k:,t%"C)Nf[q/[F:5Cs-nL4rT4<i0\HtJvWn 1rl"|, ϰ l_?>NnVSc388&Xv{`5 4N}mo6WrkZi?pg/EKf|vu1 kMWbpQR]`YusAgvvjYbېĞc9P>,kA7Ӽ=+_^ /5x}읾>?0s:*rkT<|DūYNt'NЮx6ɻWO_%[U0 yίC f嬉dj\sWQXkIG׀UQX({[Ix\mݾ]?I^rߡnHm\(^-%OZYy¦pLấ9,_U ޥnă/m bT[ڀ%)[Z)zC+pZ&iniʗ nk-y||Ŷ%q^ :qס$1&,i1 BV\ y>&y0}Ua2I_<`g rAKAUK dD@me h37z@863I /(ظ1*LC[OXE8c|v^vd#?hd%cegƾ[_y?٭~O'sb%;8f`ft]m#J:[|M/ґXH2H%>}Ɨ>/O^O}6xtk Ԯ rI@;~pɪm5`v[hS"es/C,C\JRWMMG50~HE"K,.;x]TC$GpoZփSowϑxQKt+o":mqV¤0Lϱ6;vϺg[Xz:[sr?받wX˙'q'Q80M\bhԴ8?;IRCJg`¿5?lێp5i )`.RFcZvXMܕs?,h?8u8;!X2|}?ߜtD:l&cA>Mן h~D,3M"SQԓ-XK~?Xo`\bp4/%lpVdij]dZ|9DU-j9{`BbM,9J[_(ϥtIA?,hE{C%ӽO&Yc^ '\IC9ܼC.у{ k ._jN@ -&LH𴸘qˍx8u =Ɲ&x 4?g$uXC&5UN¬#v7#0#|V~9 53ms(E(INt`SJt7U 悟(F$(u 3O/;H G&wΩވy=")Bklu3VΣd[[}<)if%(z#k$$Ob^GbVxq251>510d;["5&9rDm?C(nv0  ȫ?zhEbP=RRxy~(cA6x8&yGޑh.qGYjeUG\_8ta 䑧3+S1D3hA8OA$Ɯ Qlf 6v*R/wNplD_pqǒ+H^}+g SzK(9wp &r&ĖoAݶU5=Mq^r0B*klrŴew%-C_災l*BםL`:&}8.7t2P9.'epcW.a?ZmN|Qv~$ $B%oG(qxhfrd^XdŃ ,m g'n M7 {tu )~53g 1%sº *w\,p.!35xCmNx͖@S3(ha #*E4|;dh"K6$tWƍ Tv%84ct2Hlw` Cg Jhlm6kJ"JJ#qݤY},6#TN3Jmbkw[ !iH mJ;^YrdIk&OlgC\{-wCno0-ƕMo$k xZO4wE[OhŖ?8]r+nJh}v㶌(܌TĶuXceH5r7Zu4"':CBT KEȅL{ivZ2=tl2rBTepy6J#B#90?Tʹ@aEX5#BnI}K+M3+o*p 1,!JDYR6Ý1]jce|Nt*,nSN+cH͸&I EtL;̡iev@X'^_nA%G,9F8Up# =s7!Bz*Oq#n$Z£MyW!F(h\&m.cKd^2>ڍeA?<~k*ŨgpPt£ujJDUKה݃nwsJ<<8Ui&齃[rsϭ+K75~M[r lR\Wrn0(lrX|A?]ݻb84h?u`CȘ ɺWᏣ)_({Wd7W  8e5f4aQI sP&Z…z=*Z%W^CQD_Hʵg(6܂BR&BU@d#}1Vm7O$V 27(~aY XS2쎖 qeD(T%1BtN>rydNf-k4m+#"VmC%z;Gt/2 r& pfԾ(p!,bJm0 ]k;=C¸^= n5EgExcuN‘e߉n:̀\0SJ¿϶tq"XLD̙uFDñ=-I;V؛5%i@:$ 'y:hx@zTXbՆ7P ٨{n$ģ$]I\uutFCa8aTk~p][=>a )U09Ji;G}ۆ.+.}RNjF ao"Qd|a[4|cr: q1;v|HnmT H9TC}2{]Yȍpu6W8ш2*Miub犴UB2798.\LggHұ"1;'5D2<L 0"YkHKDHt? qAH f}_,IbBM=[aߴn?}y]ǝo|Ɂ,s&6#=N=&:̈́X=>+O%w Dut%d%kgo$=9n]b]u|fqrC( 4*m=9d |;;]%r/-fg?hhpr;0?u4X&uJeP$32|Q,KLE?Q@ gDA\+ a/BMau+])ZQi#T$z*Gy0bǯ\o >UbqjT西_\k a3iMU];拚$f:_pFz\ַYulɝN6?9EzhAgI|L¢Hj%&3bߐF>^pPhvB/Td 3ѹ %*rP-d#?92ϻ|D@(}y} ٜ=JƟ7?cf$` <\ھ 'Dcx íőI #`'Sݱy?ÍF"0dq,)+E^6,N8m'Nǎ@]=읧=6''U~kB6_}}4(=ϹQj+t.j _B3rB}b}ٮۖ`ؑ.?) ZODkTG,ܣ@,(cZR&E A$2E8B/uSIkMWPTvnPFW_j/h)ZW.@ʭ+Eejݲ޾[l+ ybW7ob#$pɤF5*;) hv&_~N4۶1j"@ OБL`tD&~R+#ZoZj'pҟRx['˫lOƨ c=iCi:cusz"IBjc9H0X@ޞ/|2|(5 4/({2cO?0\3%[ץB;Q!ri"ߨٴ*o3=\90t>Of2INªC"bmw@y kW_+2'ee,C_7kR\ܫB%+qwdy9JpVD.w=rUMՄuɲl~PYǏު5E&=Ж]Kb) R$n$ƴR(KJ;鼙:a!OA% !uCUG8-clJi6by?^ ZF|:E\ V ۂX<߯(IO~NO~O/\x񖷖d)$ wvd;{iqft0ܞS; nZ!g0'B$dľ?r߂7|SHDb@%BqaD{IN;Ό}PbIRF){ G~ ^vq*i2{N(S lz ;zz~AZ{0kBN -l{47W݉IECG.7}`d2sȣ1!OfnVCc:h)6FF n0*'%I_I7;)fEoQ酛>^F F(b{5bM7OU;T4*@ȴG^@GFsQy kkVomSNY G-5m4T>3L+Ɓ%Nѐ^2Sxw0FxXϹvKԾ0]c'j3 5]ZRӎ;Y`\LG3(̧JS}Ex6OmT Wԧ).V;#DxY8`&7^!#+6I ټm˹a%G{Oڂu ؐG2pX.εԕe9\`\^ڶa>snWI>ZKv`c˃U\Ќ kq9as5q\L]ղQ4YAs{ x% [7LIoP^Ɯ jb C%JzJO C(tP־kY5ӵkZkW.hCwYу\'IH4 `;M*Q!r/kW>b)b2lμʖXUhxqo]ޢ^кW٨46f4f@ &>eo3.Bl][?%YV.>G[r>tTh=CȜ<4c;/6qT] ,xCZRQɇTR h4XKƐ/ceFii~=|bJWH|#OW0&<b|Xk>-1Qf rpF)M<5]0NTZJJB\481q+u\TxxdL CPX/קOXhG;?dGIb % -.F꜉@lFUw`p`btDIKrVE pAN:CHB] 47+Js|0R19 r&y#y69Lxٝ1BEw#Z0 dqm1^p$@`틐 ٪q6Vsq84]Ct̄KB(\#6 V+*_a>,%H)4̡hTH461X."ew(4qC&̇D>uDIRDH:eJ))i Аp}8;T-ϊz鬤"ڕbրPfG`Cz-c1Y%鏝N\a^G )Ѣ5s|mՃ:iԭͱK8ciÉ~z=>vL%Jmx%B &Kwiv­i^_ޒ( XcYP!%|\e 6pf9;~*G*YWuzzVZ WJfZ6 UV{tA;946&U5;z<҃b7M}vJtedB#ۇ ~k{o8j:o]+=,4uw^+W{)PTo-Ȕ!L@BF:Kղ m|ګ.{fNiɲ%5,<Ov;-FGT,ᄧOr[9^,,04|-h+ 4Ls`tE@D,]ܓȖkQ2HGQYSôrl0A{o!fEWLT,ÖH2 [lz}.ddr |L.;P JBze@CwƠF[v`V}?)Z&4'%T=ʜsQ=(h`vu8렿l9i>P#lDX4`N;b!Fh2qOFss"*Dv:0݆[שM6"]&Tqٴݔ$jE[SN  ,s'$ E"^Uogんw|y9bp.2;|hr3nˏ(gI+$Ea`. x((#rTVjSY!(+fXQ+ Ce|9#!-x~r5DEv unTv}w;_U&Uq^YDNVa,R0zA,g[OM|94>I^$2mĿ Ml3WO74JV*z84pR&,5mQl;2=IPx)R=>jH2zLp |<])+:N4RXE֦ \} G|l凶s,rhX:kw'6@LxX8 ;g|hs%)f\F@orv`M!}1-t_>tjǵZoT`%j 惼9KPҵ/_~-vƒ$ 8[O<{٫j<,P%*9h\.<բH{ɸ{M~(k` tP{.ZR>!Ϻ=P%jlTV躹2X.0n7]m:>GvwDsRcew8kX#u8(iaSV&!ȺڐP { ѥ/ZxKI77?Ojk jջc8둺<O^g] kԳ^#݂Klch [rd[(Ncb34״tI ]϶ޑc^*?ܷo_jvdP(PKezK.6`L zL6*qyK/د^Ve+FU ᆺ %PAzeXg6u?x^{E_C:Lj)pa oPKC PKk;6 __MACOSX/darwin-perl-deps/Date/Language/._Icelandic.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK՛P) darwin-perl-deps/Date/Language/Occitan.pmUT ^M1cL1cux nA)v$6^@`I(Bfa}^x1ϙ.s~盳ߔJTmfNj8,"͵3Y❚ ^i/ĝLʙ•tټz,ZBx{XEBz-ŷQzE*N/ ~OqSʟ|\߾'fPiOQQ_4ᔀO4$[zmi[4S8ZDq^= ^=N/C×#*t~ڂ={q]n#( **TBnxق`S&l\=ظ /Gd(9"YfD osez{ڕ<4ƒ,*3?,ыKdH@'&{y] }g#\8+W7l,:7FKPK'`=PK՛P4 __MACOSX/darwin-perl-deps/Date/Language/._Occitan.pmUT ^M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKlk;) darwin-perl-deps/Date/Language/Spanish.pmUT ,#KM1cL1cux Qk@ ǟwB.! N;6ݠPeL8;ԛmewgokȇŤ3֒$E:=OxLײ.XPF̿ʕ iU_z8СyZ t+o߃t u8P8InJf >d<>J;~4/*B@%eW9KZrm4ͯL.!FXL'{颤'@]xUVh,Qk[zs۰2"iaɌՁ?EnQ2AnnI7I AP_ _" FA8#I6[}0,8v+rCL]of e!{d8ˌ=JZKoIWhӗ)ht,J_N"yȘ"o"o;ye~]8 7 R0F1?PK7mPKlk;4 __MACOSX/darwin-perl-deps/Date/Language/._Spanish.pmUT ,#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;U+ darwin-perl-deps/Date/Language/Hungarian.pmUT Ό#KM1cL1cux US"G~vT-K0p'A.eY53Aff˟=r-I|g-r핛nTf(uK!ZeC``Oy*$Rj^FjOL=ʄMqEςs 'oU$ZLH>3wf[,% _(0Sni_ )q6ԝ&bM|Danz3W4E`2|۹וje[yV"3ll͖GtB 3!E=" 0y;;iR87Py2>cfJ!TAfdE,D=QiҮA^1T󗠩 ӌV*׌ 7Uu^}?arlGar_BlB~Z@#Obnɸ7a=͕^/cJsu"ٝ*6 B}44b`f!TTx UY'c -je{"jPK1UUPKk;6 __MACOSX/darwin-perl-deps/Date/Language/._Hungarian.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;) darwin-perl-deps/Date/Language/Turkish.pmUT Ό#KM1cL1cux UnH䀌UlSrpMګTqZÆ6-BمCI*eoٝYT14*OGAƂ1S6T$SiZdD(!xd.ppm}]zJ<g,Ü 1ld^mbWe?I8{p60Ҋ^((Pf(_uyX~c38GGp> ֥6S2Iֹk?* Rn+.[8=KTi;&zl;mE~˒VOFvCJD).'Нk6c)ԜqX0txG0:B({d$*94bYF}4>Mg9.]Wmv{=,֚ţ@RT^Rެ)(7?W!k K[v&Q߲kใЭ@NBHG?8};PK_bsPKk;4 __MACOSX/darwin-perl-deps/Date/Language/._Turkish.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW: ' darwin-perl-deps/Date/Language/Greek.pmUT hIM1cL1cux V[o0~ϯ8 Pm7e0u*mZMI DN)B!؄j/;W;)R >Sga&R !QƄu5h}2FTT>@ePH)^B?aJ1\6wacMf/fL\$,ZB[A8B=Gْō-4d0'Aa'T&qC5w5OE>ǔ5$eEcqĉhA d0LfCȅ!N "B+ Ѫ!÷ȟ [iœDl;4ٗ0 ҝtZۊewY+/]w9e/,CE+Vݷ'ս,qPvc R+P?OkFtϳ^;>!J,;;7829 NYghzotuT{o-='f9B-Wi̦c[+Y`7V=;wm?_gW"]u TA#< g&C9LB-hqծ4 ՟Q:5Gps ne:ґ-WdβPK(!pG PKPW:2 __MACOSX/darwin-perl-deps/Date/Language/._Greek.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:p2 darwin-perl-deps/Date/Language/TigrinyaEritrean.pmUT hIM1cL1cux UmKAbH"$^h"ZTR % %%K.gR tvo\{3<3r$I&ie;Y&@wLcQ5mF{fvZ}4Kr0Hg-lx. +kba}!\<7ag8,l棇Gp!xph6>8ڮ*jV'Yu#Hnr_BnF; ZďF@O֠$?N$PK<6pPKPW:= __MACOSX/darwin-perl-deps/Date/Language/._TigrinyaEritrean.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk; / darwin-perl-deps/Date/Language/Russian_koi8r.pmUT Ό#KM1cL1cux kPW| 81:ư6I;ut[㼔ט16}+;U=7΍*-Ğx萠(UbjUsgVg.I*h-]Da~%B~-K%[CB _>x|ټp]Rs1#6bԍ"!{tqyǘ'nwzF:G^07> 1{A/ϸ< syD|bK~g@Q0f=j.zG>ݐ@uN[h;hJ2ȩDieb %]LL?m#,Ib0F&idzl?)EUb@8JZ,G V" az4Xؐz Yb#T(*ξj5u8KLT,U\x6ﭕ&:#<7;OfLad[-Umz-lմX"K}&BwPK{K* PKk;: __MACOSX/darwin-perl-deps/Date/Language/._Russian_koi8r.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;b) darwin-perl-deps/Date/Language/Swedish.pmUT Ό#KM1cL1cux ߊ1)>eGn)t[-,ԶTh)"KƉnt&IfWtť73Ο|IըZp%3EKǞF{ \aP5o-Br\sb]rd䍢,LZx$$(*qq:\{X#,d^ )}XOT'&:Pv w\RXLm0 G,ɜc^jEK Y鼂K/TZ7$Zpdr ( ޣKlyE۰/x;bhкܣF[+V".tN@ajt06SZ1ïj"| : ZLZV%IC|. e0^OfYηOuw\=3\0bA /["nلل[ߋ=^N!D2C}0' ֔%A"$wQn#)<_1nKCKO [hQdx^^ `\.`{fQ7OATv0" F OP0N&oEH_p:8gx.ym_!dBGDgeȮáVcs4 zJNPKdPKPW:2 __MACOSX/darwin-perl-deps/Date/Language/._Czech.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:3 darwin-perl-deps/Date/Language/TigrinyaEthiopian.pmUT hIM1cL1cux U[kA~_qHRHҤ VŊ"1`lMD" ***'n.m}whkz]כ:m@*& iQU`v* ڨu^ !]sĊж ׶wamy_,&4;w6UmݾuuoABsD]TfSBbEXC 4$GD4ߨ5XA-BNHPKpoPKPW:> __MACOSX/darwin-perl-deps/Date/Language/._TigrinyaEthiopian.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:, darwin-perl-deps/Date/Language/Chinese_GB.pmUT hIM1cL1cux ]KP=bHZH-M/R궮[r[nN IF,~t-EfoJ ^(L㢥e!s2sΜDׅÒWk6TBYi 3BwYsaQm^-WToxr Y!"5 af9'?~, E . "UT$%66WV{s&XzYix_^cGzOgNi/:oop{B韡 QNob /QNQXvu@Fj`W 2tx>LaoOzS41M؇r`6IȗT ԶlOˈC&1m(K0lx5(HUʅ (·Ҝ@-RD:?dvYDMmX80+JvLGj /Z2TkgZi&ZxPK73PKPW:7 __MACOSX/darwin-perl-deps/Date/Language/._Chinese_GB.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:) darwin-perl-deps/Date/Language/Amharic.pmUT hIM1cL1cux UjQ}$)$P\IIm Vł"1Iۦf-y撀"U*Xbh?q3g4i}9^6I&d[묽aB6!l (.]EIU5ltfV/YۂK+e_h=˭bcy2V 㻏V'[*)d9MjhBRU+A`yYijV7L-+lJf )*P Ɣ),4f&FeM/l,+0#H5dfZL],QgG6tV+l1tZrk| 'oެxn#b=`@nөIuȀ-K0Hd&xHU@U=nJNrPVJILV^#| lؤTs^>:} N~E/C:t}tuAo;AЉCKx\g?k Ow93.CRYT{ ~De+D/ #'C}4]ct)݇Ɖ~l"N/6p SS`leXYS/#dD!QQjoNgc{ ڭ.R~h *v8Z[s| vRg#JvrGR3o %i:HU*Q厊6PKJPKPW:4 __MACOSX/darwin-perl-deps/Date/Language/._Amharic.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;h) darwin-perl-deps/Date/Language/Russian.pmUT Ό#KM1cL1cux QOP)N؈kMC's(hHDJ:(q밷Ő9?kt[7P Ϲmr˘[腒p6T,6 c@u,ʆe}̕unVwz@1Tn]|TUH m?$rK[ZerKkk0Mӄ_ll>}"g$]$īV#2ls,RJ25rPo]8:t?tg|:f~WO߽Vg*>#;=${(Cy(a$<rv%'3Fҡ#yA.N&}uG-YK?C8/xFhZУ:x" epрސH&2BMd,zTxHK]Ya&*4\1 # k9Uߊ-'>'l~AӠ6, f@~O"r3=BaZ"p Nȧ4P2IH΄:l?юwW#rIp-<~ѻZoKrH3MgV-fgg~3D lN%&dZ9Sa/*GF{u"e"z@.=:йwutz{}Tv9':}PKp½\PK՛P3 __MACOSX/darwin-perl-deps/Date/Language/._French.pmUT ^M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:( darwin-perl-deps/Date/Language/Somali.pmUT hIM1cL1cux S@?Šh)ZHR^I"~lڵ?{fgglfu 1Md0%  ?IF}5L}3-٧Z,k}y9|';b; QG {y٠Ә,Fo1Υ!5V.L3HVnh`TJGk3Rb;q Uؒ sC*>8ID)rV\dO__Om1k5}atY[;7m/D72U;OAOŚ][ z´Mt`4Cޛf-@9 ,3%11sxkgёSaR&շaхn.h3ބ9vw Mx S(TE3+C,zb᫫0 yY,y}*>H^Vd7u${!\[w}N. o(~PKi[WjPKPW:3 __MACOSX/darwin-perl-deps/Date/Language/._Somali.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:& darwin-perl-deps/Date/Language/Afar.pmUT hIM1cL1cux o@ OaA*%RL #]UQuL!!Q!RM.lVUQB8G'iCZט'%sm!JZkoT0ne2u906rCyg9,BҞ"RV[qpa8%| jK>fRj e'Fr9ܖ M/g?$)„Jj+ ٻEГJɭ7+k)q>j['MZ̊ՋF7i؁ ` h\g; " ;~;/x_BWB ,@gf@yf{{! ?hAsM&Eml-ebj5SZr9b9ho75GP9̈*|.T<U_Aan1D#gG΢l^"y0?!_#;mb$Y|px-3|QmPKNzzPKPW:1 __MACOSX/darwin-perl-deps/Date/Language/._Afar.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;+ darwin-perl-deps/Date/Language/Norwegian.pmUT Ό#KM1cL1cux QO0aC h!Źaўn1_z{sz;cG\}8"J9MĒ_,61f:=JWkp1 h0ݢi0bzlڼ>w78m.Ҋ ۍKh$#8F3B%&tiMP`b E!#hV䈓J v:_݁ `3L CX}x=j\MFf.q$շB$^C $[gy~uêз_cq͘?,K7~P-dt.!]ven [l<]EŤrcә6£%5ϛnxp2?C*#A&"}Ejd7H]< O!51]c?PKf0PKk;6 __MACOSX/darwin-perl-deps/Date/Language/._Norwegian.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;|* darwin-perl-deps/Date/Language/Romanian.pmUT Ό#KM1cL1cux j@O1D 5RRz!.iP5!b)kw[=wJi`ӛ?; As,4%\Y۵mv Ďpex~L/~10ͻ~p$O ?_>v]B'(IɍodϡVV}ԠV*PH)3Xٔ\U룶{YcQjٟrZNj%-ņ+Qă-/{ڐ ӆUfD:ݠ]}tMX!pHW7Eـ&J&K݀& ?S  YdCpyPK 9 |PKk;5 __MACOSX/darwin-perl-deps/Date/Language/._Romanian.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:>' darwin-perl-deps/Date/Language/Dutch.pmUT hIM1cL1cux ]o0+^">]`JFWR !l;6uj899a|,0,θߟ0*Kď"L1(pp!U,Z˜G H زǘ~ebUgR=1!^ߍ0h '3& r ,V 鸳}O(u(]iEvq~DT%srƔ+T!)6&K=}X*)54/ c FڷC \}.]ڨ:o@'lmgse=7R\ hֹ[LӡuUa{"zHR 9D*۩t' mqnڗk(Kì9m).ꆺT9˲G(ÊH'8a>:Nt,ƒ&z27}ٚ 2 }]VI xJhXĜUOisf0}7a׉n'9N/RX䘤4j3m=ͳj,JJәz?PKU!1>PKPW:2 __MACOSX/darwin-perl-deps/Date/Language/._Dutch.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:) darwin-perl-deps/Date/Language/English.pmUT hIM1cL1cux ok@ _ϟB.ؐ;}.inK]V1\O'n)$m[ u\ ˗\cYkV|g%)S< oX]j Yoz#c0!OwrD06O0o@1R?)٧9_/[caL)L}?8iL' č KO|^ˆK0 I"׬L saDDQA% \[r.T⫝̸ +TCyi)/&fcX5lA\*:z3j'iͼQ g@ y B` Y[8)t:,ؒ \ۨA"n![:A9R\b,.bJ-D1I!>uf}`z#O`dPKPKPW:4 __MACOSX/darwin-perl-deps/Date/Language/._English.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;( darwin-perl-deps/Date/Language/German.pmUT Ό#KM1cL1cux ]k0_qa I6v.nF܎6F0EԱ3Inv?dze!78zΣc;s"䖗yZegBeV䔱Z/MmKEU<~F<~ [dª^,/71K,ѤgNc-˚KZT' v2/(9]eASPgTH p${rfH*h`@2&UYjQT.E#;|_]RP.OPjGQYo4h0e"/3|9QAⓗƱKruw*gB*7gjLi4zk ,<ͩ"%;R/7B_݇+tP[`}jZvcY_ +\'q8BFOuKR1pkf k^ȅ44}kfOR {ڰʌLB:GG{ A',$ƒ.Re~X'÷#-22?"o#[eb&|'4 #a E-PK4E&SPKPW:6 __MACOSX/darwin-perl-deps/Date/Language/._Brazilian.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;* darwin-perl-deps/Date/Language/Austrian.pmUT Ό#KM1cL1cux QK@ǟo?`*W9|H6G,(+<d[t1e7 |[?ߦrJ{3 kc+Y>/q!| A "~qUE;vXm> }/Ɖ퍡qxqzc`rzt|*qGanzUJT4sgu%KJZIJ&/<+G6@C 8w&i1ݶ8JY^PKPߥzDTBg|{+dޅ {{E(YEm70obK%A460 '%CLrGE? {djŭJλzN>qiCl?95"q& ;3E˯E@INg# O蜨Eœ8@! PK҅PKk;5 __MACOSX/darwin-perl-deps/Date/Language/._Austrian.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;* darwin-perl-deps/Date/Language/Tigrinya.pmUT Ό#KM1cL1cux ao0WJD2ې!JL]J6Ӧ)C!$&Um @/6=c4vowO E\z`o%ݰ&WcR~3V,=r]-\y3i>×OE($UPmƆFeB}~3{̐|VMSsSVqriѭ>\o]E-HvA<"&%QVtP,=RKVZ\esE:6l8h %I`Ŷv!xKKa!-aU2Ȅ}|ϒd@O.~LHʱd=r7CVEf9M{iA, 'b;KrA|#BD?PK|p0 PKk;5 __MACOSX/darwin-perl-deps/Date/Language/._Tigrinya.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;) darwin-perl-deps/Date/Language/Italian.pmUT Ό#KM1cL1cux Qk0ǟOq)$ q{pH!дcL=5sL[Xw%/9D˺k8"Veh&J+ˆIҡc!6K8u?]Ȑp8.p.-9{:EXjqs:vM8Lq$~Ms ]USIK㼡^mr{{mYU Ca,3`߲J\O, #Noén:_VrƷ31r؄EIuvvBӘ..5/Ě"23!!3y Sb=1W"R' 3:XʴbpOOeIY9,NcH߭2j>T)]8E캰5>V " y5.p(W411ﺰnJt̃;#,l04A;|u Cje"bg##yX_Np>o|]F>9oPKŴ-PKPW:2 __MACOSX/darwin-perl-deps/Date/Language/._Oromo.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:( darwin-perl-deps/Date/Language/Sidama.pmUT hIM1cL1cux }@ϧx8=0`%R8ū)Ik/R$Y{gחkCLf~;V*^x>`(] [RDS>nbZk#;WEK?nPp ːӺ|ĥM_ZC|{}ޮr:KAո))Ob*Cvე+O[JPn[:en7"U.fjxAYkP.ֈi b4"O}f}]/2Y΋.rZb]ڨZu\-[gNп .3LtV vQ㢙 8>}6$aX5ڵ=BzڸYfc-tF R5;Do!˙6=AδYxH1b %K~D<˜Ӫ8 Fow#yH-a/{ub&xTOga`7za PKHPKPW:3 __MACOSX/darwin-perl-deps/Date/Language/._Sidama.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk; ( darwin-perl-deps/Date/Language/Danish.pmUT Ό#KM1cL1cux AO0D"58mVEVUbB;fU7Je =G  2WT %_i8~EpRƓV>ֹ=O`dl_Z˙~G\RsIcJ x)х.s#2"XgZ4ZˌdM{J`KwVԁf޹qPk$6̗ok?l`գNW&7bm*}/2PK PKk;3 __MACOSX/darwin-perl-deps/Date/Language/._Danish.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK՛P + darwin-perl-deps/Date/Language/Bulgarian.pmUT ^M1cL1cux Vn6OqH,Xr!si5$ ALjefns 뫤Y tҼF46CȻ}x2[^P NJ;".}OQw-D=1.kuK8*(VrײYyS8VS hjH~X2vK`hх]1Br^ZgM&Wɛ5ߧ/!N> 8{2$25}D'ow#iHzJN t\LU"@o! M]MtErM佦%A8}O23}&hU]7̔}Hޑs.wsIq5J@L]g^"dńNRZLg ALff i&dB\R|Ar?|1o%TSf6`W.@jR˧C4ؕE(֊E< :s)a6inu:E= &u\ٰl0+W^Sy˲3ӳh=8oca=$3WJv(P P R7 {#1vluž 'f+ <Sd 5 e%wދQ$! p8A aU0Т*ztO<P[E/纂tߺ& HH>1Q0Af Q.*Dy~ktk\t`Fc`:՘鎈oFne#'fϭMϨNꙌuZ֫2, tK+T(bx@)34-AqafrCgwͯ"0xP5??փKgȉPK PK՛P6 __MACOSX/darwin-perl-deps/Date/Language/._Bulgarian.pmUT ^M1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk;) darwin-perl-deps/Date/Language/Chinese.pmUT Ό#KM1cL1cux R]KQ}n`&b? BcEA)a 7vq7ݭBXDMŧ>mOM!3s9sd0MX ZݎjC,]_!"DOʖ2] Z ]w |H$ ]dX m ,+**iB,2[+Ї{KF*|q oa~x Ѩ{9tt{;fG @S#: N9=Q&>NLɧ:i/؎.ݔ`O: x]BHlOW4&A+-E%m8YE>ٕE5&QC} Sl}!bC(i hOq'hA&1}zBM&BZ^s yσsIEK^W4HA%sE-y]~$}Ĕ,xP|>d5ky\]:3NՋ:AܴlkV3#Yo74lPKPKk;4 __MACOSX/darwin-perl-deps/Date/Language/._Chinese.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKk; 0 darwin-perl-deps/Date/Language/Russian_cp1251.pmUT Ό#KM1cL1cux QkAS ;zi.jI چZj[--<䡭<4.$Ig3mĴwg=M#.uրrfSTi[VkW,)k\- B\ nl(s8jT \J-v (s )'$xwo3QgvL-(Lh*Mc؍tgz_?Q8 db"8u9LBO( fM b ßPpr 4:/(+a̛珰i8^C"-ւpw=^J]5y0/NP3ςVY3TDHifԴGkdMR t阆T xc.U#Bxwh4AF!m#nb_d}y!woo"/vذqyE +ڦ6rvU%2+Ǵ 7PK"h, PKk;; __MACOSX/darwin-perl-deps/Date/Language/._Russian_cp1251.pmUT Ό#KM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPW:(' darwin-perl-deps/Date/Language/Gedeo.pmUT hIM1cL1cux o08%RLDGXkVM Ii [Y[!L`9SZ I*`L5B.oG_.ߨrM((4''Mcw8c4B5Z8 KM3F,I0Ϲ p*3F:pR;dsX,rIh뎐 7fTe]Q+[w\ ,>eYU%vf_CYٺ@6ʭO`mU%97',Ǩm$"|ݿQ {&VĹT Mv\&ege#1w  <Z~ОlmMsؽh/khQ:4!D{+^r G5,UN*+dIoSi 61Ev#}}Jq|:0o$ }+mMl v!hG:_;ae6PPKkEY4(PKPW:2 __MACOSX/darwin-perl-deps/Date/Language/._Gedeo.pmUT hIM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT׉$ darwin-perl-deps/IO/Compress/Gzip.pmUT LbM1cL1cux }SH+r(c(o7Y3NYH2}Gl ]/^LO]x#E{tJ'LۏT L{eRr)"|/aDMBNi2]Y‡9BQ횣p +|撾OD~>a1NZE~q48:j(s| b{$Q"GY1h>$7Y8bI|?V_sY< ħ/KLloԾu5cׄ^Pͷ=v>=k׭E߼óM\z; `-Z֫[^z]JQMz}i rDz @VIl:| p"j$}Nﮋ&ނ[Dr"I's9zEs1L"u?5=l ݲ#Fh\nQFTP;uo6rX!P.іmbǀ"`!^Xiuz}7WWݫt`j5_aO<J6Ɏ^4םgֻU{/El%FU|^VUEI_fg֣8=?o_gMwQ"_#Tp,|v{--&+Lľ/_ڴ-~k/ 1Yk`oȞf'Hz8M1JɅ@Ke+9m:"3 Dpdǝ +ʦD<9^xbׯ7^b˫vWOgNػlOr(, &r\1>ubA8ZϜ<> 4RMKS <jc]Vyj_lX JSMBRG!El䮟Q 1JRû퍟O5n6Gĸy`^Q~!bw8<$x]A&!A2[x[Hf "@oV7uXn9,uq=%\0e 0l 8*",;=!L{LWfCrlJ i!{lTF%Db߂Fp8k(T@\`T]zT%OP&i&/QY;y{bcMu&CN5lxx!۞e& [|WQ>; NZ,,$vVuZ:W 0\5!dίatá˺+hIw.[;mCRXYѓ:j82|گ;&Y陙LV¬<kM N ha'_K;'5>T=o}PUh98[R_H L)P'mאBP1ߝ LnDojd"qڗnv,c~S ם1lQHT4 <jG\@Z/CGV^'js n-Bͭ/3гcŘRr0"fI <"@ˇqJh}a\Z6~K-F )j k7dFA ďպu")6;:r=paF"qҟ!sl~/4ps Ԗy>LIXk8s@(6C:?~mA!.ӱ5n{s+VBDۉtc>IdI8+`1l2Q '7E#ΐ;0Nsm#l,"++D Wh>&G"| 9O#qWFNڽU^A>YzdAƥbl%g8NrCO9 (Q,,"M6J׃ E%}c7D+a`G 0sPXaS9TFjBmawΎՏuY2DZ@$x<c41.Q`M!yY64N`p/xuuqJø咥Hzzq(s g{ݮ{@?W::Z;7ivI9ѴKD4o cpW"&SP9%j.luI(~Oi 4z fԥnM8K'0S_-t;BS`܂XA9[[ZB=`" mf#Ձ& Xc3K= c"0ʁ-\{gг&d82DIpr#0JxB`ЕVP*bYuLJ0cVI>˔u>]@52ps"L ,Ί8(x(q4x$C ƆJ70C9f,7F]X CKF@eCBÀXFtXs4$.L<:S}.?h0In#=S8)[=J pxـKaIXT%Xr,ІSJ eNrkŮNN31²CK`-\QPcgh<GèK;Bc stlVԥF񞎍ӎt*9v dk5,[@bv_=i=%&X|X>l (,}K D\p^oz:x&0`fT3Tt0O_g[TڸO.}] }\'L%"ۺ$Ŏ8h%AB9$҆MǶݮl;/Йl6(i*a(AG0PP%x u|,"mQ: P+^2r W"ژ[tG^WJICl#VF)R L%Uا7Q)Jn0`TW˵2]dt${\,INA_ԬмVMoliGM6؃LKH`;:Sg8M24$22"G,uE4c cfĩ:ZQ^[Ra͊WdH<%AX4z(`TR=.qV/Z@e1hQ -ZǘnTê944%}ŀ`2@w϶m22jJAz8T|4Yqf8wX3uj;dSm*n%xHx$>)/n}]) h*# %$7p Xȿr & .jt&34jA8=T&/ eE %)Ϝ)ˤ օŇaiW"neΡ*3@U 3ƫ?LORxR б7# D n'mXL[nE[o2 zǿ nw~*06,+lT_/?eZnwt'XIgԕ?|%ie/c-!ddwN䆛M;Vj<5XnjW =:  *:uix$g: mfW0J QȒXo:uSB鶠͆͡~1^).jj4|epwZ@+vbJܚ58ڎy\|xaj__/OUUft |DY5)k>I(qY00B}hR.}@Vg«TA a&FEI$H~uh\\!nZ%1}ij} `bNyUyzaYYlgo,WXex[6yjttZ& TA.iz)Y[Bгgҫ1o^bZZgTHdAdbKP5pJp!g}',=-u BPpΟ]̪vAyW;Vuy'ŜkbUX'y̫}1􌫿s/_N9<].cGұkK.դЪlgҲϥeseƱZNU_2*TCㅀRS_kPxV;:]Mc""D){vM4LSVbyڊ!G{.R}c®YT~-9t̀Xǡב%.roqa@%P MSx"3lǰR@ |Aе|ȐgXN9()%:'sBs1fH[$̥k2HCl+_-*4Α:JDmɵ.&1㖉uHd O ~5ξMeD˦#C i榮`SMU'7\(I Xp,3eTRhgo| *UJSvq18M_`[N{B% >|7> (`|We!Κ ɲ%ˡ{FMTP.0%%H=tQ<"qGQljQRM37?27Ce7+nEaPa gqXjVbV= =Q Ѯ:/L{hUlyFώ!77,! 9Fҟb5n(5>A3_[v{%]٬((:F@d0<(ě[<usLĚ/]}ɋWnȮ.OA>7w%o =9[t:SOHP*{Fg oka:˹Mۀhn0'z禛:ňf HyǰP{>FیF5FAeP8\rY^zGWʖ'Sxt}J3qAd2rb p!f KxbS_eR{B*'"GA: )8s  FAy^NE7WӞ>x Fx7/HnW&ZYTv}]:+']SǷI3{*&nUrigIr;dAMvnA{ ТR|P4gM|J4euY\4^(޳J7m}V hNS{sKW\4;<ğh̒*\,EDV閺ӋzKtpIRPg+/*UILX_Hp)f37j:CMd- P)”1^tzt`{XQz\x&?PVKW_Hֱi7sPx. =>5׾ra.FwyJJ SmB&WӹE1wڀӉT2՛tuqAGt3͋R+k?';wm%V\زbT#v<8\BF'.TT\}l^;3 P_(t7p\M8Eh9Ǒ]K UKڗյ+sSuu:Ueݶ-쮬vs3:9 x7XW>E}|doz_iv%Y@哦hNL{ex튔#DjRn@}^Q΂PYpv|[ho `{n+%(<b{Jnl߬aRO8c om1n^Q_ xZ4zώ-&ga@.aP?Z٩ߠY^/9Ԁ)|׽"P} $}"*&v:tN;&RxWXE8^ry/'j_ڸ;5gm!;"C+R3Wp^0D.F bPdh1DpK؏PK-I&׉PKT/ __MACOSX/darwin-perl-deps/IO/Compress/._Gzip.pmUT LbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT[' darwin-perl-deps/IO/Compress/Deflate.pmUT LbM1cL1cux '}~]"YvڻWMC؁{?]nFw~{Q;:W#x%If9noXag w-SK0CYX:L)'z>nyu%"3o|Y7/ 翻SA⇻Ի{0|,1Ē'%%g˾;=`E8b2SZ)3MD%}оS|/F00na9HX١y|UA EQBYNOվ =ZYHꅙO'ׯMB|B(ovZaFm=*1ɍYiv (A$&$K5MDYTKVG/xD^X> to.D fWQ$Rt%غ.G-qV=iS3~0CtDJ |̋Vpˎ]31|1Vߒ\t?⸪<g).1t5ʦR8mV5 Chjf)~{sp=RX x̘ MN5]7= Ngf;_ Np7Tt|36%b\+"Og!NHጟCW)"A, Pg8DP8}/0]"q_; oyVshc *= qDF=$hھɟNq]=g 0x^ W$4Uް{ӿAhH<ILIZL=_tªx)9 Eb&^4Vҭ{ ~LpjDa_Ax`dg5kv~E>R y`X_S=ɻgZ2MDԙ $+q$,N XK!"Mh49 (?$y bk}!R\6FIAж^m7ț8KК0#@p'H${/[֓oNR &R|d/L/:[@U:C$B"jy6Z~BLo!QYh . RҀnbUEjɂ-A! d<I)tM$TdNDTهf~R0ػgFc*X!琅Gi*cl2HI9yT P 0û$2lhsJ^ϾPo8, YYxݳ3ҸKH3v[W6DR(lcV`0@U%Auے|HHUi &M0hH_A8 4Pg1FM /\5WdIK#+`+B]}'Ց >ED2\YB HXa Bamfc69@LB9 G|' <9Xy ֔5AIa]ּ3CIЊ%o4֊*#obk=M&uN6sgJa|C,Z"a!Q8etK -b [紝sЂ.O#3lמᙶ>' AMO}$/9Ծ%u"xnK1ʭ1l`:֡ၚN0‹"+"#1>Τ wŠKJEhc];r`:VˮN`9k| I&j+8g\4F;žN(խz1ʮo*v̀Hwg)} m)UQ*m1i0^9ÿTҼǩ,(o BE!Z=Keh:8|G&w*:m {oO#/$B*%2{YA.zQz71c TR YG/ 0BnlqwLP1 8"SGޢ_͍c SW'hmǴt7"i[f hIݲ)TgT"[(&Z1鬉sˁH\TT,ؔ{N8wzPJuY'===muKLl˶S+3'rf70ic#V86jח7k)Iړ[2Q* njm6ia̢,[ՊSvG6"I9{I|[DU@Tb4b+;^=d^YbU|-E 0nYf .0Nhz"26ͯG\ fOksb0{%vb:~=]VfkfQ$Nut9!5/T&^KUIghC\X CC+"D@ˈ9rz7j 龎c;[bjP2f LՊ_`̏['c70;ܞi) lcEV= 8tȃK췦oʜj&+" K‰qJX7l2G${G:"-2̳9s^S-iS8_ertӜ+SC?] 7!^Tuw|_u޻^_CH+G؊ԡq / 9ĹxQX;65S V -$CQQNbY$RT1=ċwccnpuI=왁?Q1Mg{i̐iK6.B3ʺl8 V3iQV-eZ*6ptbfx%T~,t`@puc8 -Ll*OWƒK@2/a' )'x{JW XV |'2 <)Mltg;='1 v@7RGi /dOt*>r:(gNm6 7Ŕ~tNlV^ͅo&VɨZXГv@1_C*vǝ/(eZU@C*H86TnV޸D8{2DXá[R*D,:m$XW< Z8tD+aK)z*Ŝt 4GGEΐPY\ P$Y&3N)ocpz? {&O4wuH#M 'J+_o*E~sυ1**ikr ]~$tRWퟶr\z{9?zow7t}VOأU**5?kV,TӚ/\ѣbq{6铊y}RUrMQ6P}[@՞XķQsFFCo|մKo%-ƍ0] n}mwg>m{~qʹy)0KUwNK8'Nu PuW߹uB_tB5d? im/*=] swa[^%DΚYS`e|^&D&N'djJ>dt DH>%:a=]1 a K]ZDsDjR2r ߧ+:?u ~'E0$z*W]a]% ~B?V #C4Q,8*X,nz:V"+1X,B{oE2I[ Y}2dVMlTPUHеW゜2eΈ0Mʕs5Q7vBݮ7ԙVٯ $*~A2\C)$<#W] UDF:"nox(!G`l-*|]kTT?TAҀBݩO%Gj8rE8OQRsX]ů)f^,U߱RJCe=zQʅ*uN7T!C30h*P- fs*SL3:HuDPNl,5穻zݹ;gy:y@e{ g'NX0T_fiK˷ܭsWJ[ꮬuc7^9XHkn{_מ6hUzgp%R7~bB Jvc>_d=dq 1AaP"{0kh/L'eԤ.fim6n8\0kH` 1y''i_xQ+N19xoz,sY1$ȷyrf`D{%X,ϢWWr";@9seUN ?}pׯ!rg3 ӊ?tR3U'Z _zm3fѸt~ğA v9oG^Boq_ݯC[?怿R*:N@SRI&SϜqL3'諪}U-KV/:lC l-Z^КiKL2|719 y SH?ķHGWRa;@B .[,x?ffIoH L CчMQDk/h%Fh0vYvwp4]C:J9#޹:njã* g) 'G''EXhe)Gf|2K~ap/!;68">*?0S)hPK'RS[PKT2 __MACOSX/darwin-perl-deps/IO/Compress/._Deflate.pmUT LbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT9S% darwin-perl-deps/IO/Compress/Bzip2.pmUT LbM1cL1cux $zm5 FH%BF=ӆ"6G1` yJ8t?$e :}F6.. =纹ȼn&Q;*V xKƅ@ Պiҷo:7Ԕ-oaE-"R uNe:f #׭٣Ƭ['pЃJb$l'J3Ãb)B/<)ֽmÇIS8@S3I3Z jq^fQAJ$wâ|8F&N<s6KBLg෴PZ@MATGd,0 By!ݜ Oq'Vꔩt4kKR;M? "yY Hr7MhOa|t&eZ^{x4-O TA<"xiӊɬ<# @!6*Bn'νUQE:KL =pA! "-H F9fSxт s9'\1xCϐ#k#0. Oq hyd2rHlo zYF8>1Hf*y5)`oaCϿ{ubA{1S9ʁzr)qa~zmR 2uU_X:bw]oHzmP밫hn0. oඟEOoo[[ޛ}?<+Ju ƄნZo:"Ox|ݸQ=܌w` ݻK>O44!pSW}:٥xڱRg~H'}T>Qծ9\߽/T邕Y44 [Eu-dQNBUZ6Jl pL1R W$}dTZ!GMEA!R+$mqt ( /I2clZ?)鹄j(m v vqgEgu'mLV>HD mYAQ?'{=0a%hmQX^1_0<(' /勒nh(Qqx&I@אd(H9Ⅱ^L/q5f1 5upZA6u Y=Xv\v HU삧(V^eJ6`ZZ%G"% &MOPSZlpf1 yG|ӝ!ľ%I*`FÐdhKk>reW71yjhn>Py - uWd:HȩՓB%{MDH `Q?\(#h*yob3dm= X KXn 'J: ilt Z<ʻj`7' )Pj 7R93ƛy  T((o̡6E[A#5鶶֮],̈́Shp.wl˴*s̻xm[RXN葜I8r2;joEd~hI){F*Ç}^l4z\Bm4o[v^[hS YPR<H*T%Rl5~S`B)*N)2vi/NՋ6lK7^/k\rmI4̰Z> h7%"+NՔ|Yv Ѿ&Ol.3}ηmn=嗪ԥFxOǬ :قx\Qt6]\787 sX$Q*29xEI}n mjۭ4rh"@4A+N=jǫdz3~vzkij"ŭ<0jItqlK7붠Wh|rα=GGK{ eԩD]:|(g՚)d%z4%%Pbj^>Jhom=0{H[GOWn7㸙Ϥf/ h&ԵBc׆YzN͝ c zU.B}ݶQ`\ԡ\K65L)u1."yWBzk 1i4D"soso(9+:n'o{)dx &[UtAоkmvhf eB*8n'>'|ѹ݇7)'L+25J? fP@jEB&DXnx900poːDtӼx^O u-2}/a>dMlO;xj>K"HmdԧY>Fho4a.(j{KaI"&$ w"=Nam5%A; M)}"?m0Uq$*%8)5 ƮPZ]ڞ[` JmIIG n:z9X-HI!YBh YD5用 i ( $;=N)O·>Ϻܷ,dw뒈P0gae>-R႘M`l[3ɳǵڹ3Пθ"9tm_KuP7}Qzg/#⪳1ʃ̳ݞȞ< WO/L^@ {G>.mԃh5eTҞ]_>kr9ժ'/} 2R)5BVH-E`|n(: 'i:m6zΦŎEc7dkFabrvuv2BoљAoey ԳÂ^b{xڽ.x!IuMչu`ԫ1*}*fb??gq tbOGbs'FE㞾 %;p^{ɣ⺨2fщTE;"g]w9 j!>.YS;xUOo` ?K/ /A'1SGok~x?W?^4/_\|ݵ<:''lIp;Ieߖw˸ 5VɽX0p :ȹ[vf |AEp#H(ӘabI#PKxp9SPKT0 __MACOSX/darwin-perl-deps/IO/Compress/._Bzip2.pmUT LbM1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U" darwin-perl-deps/IO/Compress/Gzip/UT 1cm1cL1cux PKq:U, __MACOSX/darwin-perl-deps/IO/Compress/._GzipUT 1cm1cӦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U% darwin-perl-deps/IO/Compress/Adapter/UT 1cm1cL1cux PKq:U/ __MACOSX/darwin-perl-deps/IO/Compress/._AdapterUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U" darwin-perl-deps/IO/Compress/Zlib/UT 1cm1cL1cux PKq:U, __MACOSX/darwin-perl-deps/IO/Compress/._ZlibUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTi* darwin-perl-deps/IO/Compress/RawDeflate.pmUT LbM1cL1cux Kyl( H IYpsL(h4F3{p]Zt$inřn*ky%X_?r^9D$}/cơ'kL%Juk~G@> /eJ q "3? MVUXemO}/\֪^_"O/%X|W//8]snps}0fNF@?#bXt4`[.gn XʩPqȓhlg*DBptljDG搷 ھaA N`Se/ Y糧՝vS?j]MLYմl|&# n}}I#V/B%WqغAJ4bO^ݟ~L i㱌Q>fP' ]xYg2Hx 6UŧO9QTVLvΦzm:d ANK4ھ(yI e( +[j65-#^"*{ze+OIfǾ'Kغog*.S*pʩL> V v6~]C'[̄WsD77W7}qǁ{yvw8?L@{M 6O)A9Ab@&J˫~f,DX Xtk~8UE֯ukCQkeŠ5JukNe=53`liQch$AN#%IFdht(c%l ȓt5O#ik}f[IWU \7 (Z\1~4l~DZ3t^'Wݙ|m?] \teD|DZƁleQ ,U,yY&2z*/ɱSTMo,\q򶃝dLQ#JԐ?7k󮽯(g܆7?FtAuh:A#Ճ"}n:P@ݓ`$#Щ 1;uEOg! \XJ*q$OyC 4 My6c{4Z WqMYګsבAp묟[+(ڨm ̎0OFn;R=ݨA4T}db)dz*'JV:< w´D3Mz>( +@kDCIO[-\{w6bCD-x/`>SDa'"~9h(o[SZm}?L.*lVTݍ"Hu,YkkZkb3A~)xs(lQᎭ…Q:|+QkOR& HPoo+Û˝f6a$Dx+N/hU:|kIj'swsan/YN7H,Q7tvHj$%bR~,0N2Rn&;KP QBb gGfjZ%wpt \x`$|HVBٟ$GIlV,Culm\8.pMwFX$J@c64OY4iKP0>rxqI-tM%?xDe ZBԲbNONA<t$m b `74_ɰMVSF9YK˞ IMKTF CrNKdS;`?!,nF1,&S AMɂY~Isa6Za&?|d/\G8J`-7è@r8Cer;19MGSM68C8vZu'bzwh~a@hU.,>ץggo+W ?Qҍkuİbd 9P,_~^ H2 al?F+)#{+)ҭ KӠòl3hɏwz`R]&SH`g.FSCT~l})c xXwy4f,u9;[3I,&PN&sWHʀgA6Vs^y%Y&6 `?!9X u Lq ΅zw6wdy:.v:h KHZr< mx\ن9 N*2Y\0+gEC;b4^bqg`(?B6{Q@t[afg;6۬NwYψXP1)֑:0v&H#`$>;5ޯ;7J7Z?BI0QU&UZ: 2)*JґTΚm!_@mzOVj'hR*hx$Iiﴴ%Kp@]uR k釴qasj8k[B源n0WQT*ϕHخ|RDtײ Hc " R¾]EZWOcP|j?7͎60H)}XS!5XP:p|MP©'Se嶚VVTVabQ YK|N[pXP8*%d!|!ƚUN ai&jiULYu" P\uj+ʗpf5>z{v 8y.L@IfN2+}.95C4I,p=9a9fMX/{}Pu8qn)W=ԇ+?8z$-RX>+SMl^枩*"oTn}XTr*0ke'+,pwk,t7u2;Oyݶ2똻w@GSS叝yXF(F\?+[?(^Yܣ0\A%y$Ǫ :"G:S1](3Z6FYlv]*N{ ``DWS1F&1CzQHTFa`/na`<5^\׀a:;D%Ebu+<\+&(DJBF =θ1WZt)/g NG,A7vGlW*&t/1P}uݨ39^dR1+,Û1)^,Q6홓tSIҘAڔ[|{Bn/ֲr9?a\X--B/-x\gKaG:?V 3LZXJ*݁ Zݠһ=""H' ( E)5 M.ARpxWjJh bK+H9ddر`K uNooPYs#Ϊ26үwvX0f Ա:AZ0'`|^8%jYSuPI>h`IM\ ֶJ+Xt%g2⎑$Q[jXte.tdZ) %d 21kf9KV }-ޜxt6ywH;F1i.)0ㅕdW 7W(+䬉ujy*,XQQ1qM} Sa>ًYaQnR@ `avg˘ȂX01`U]\:O<0YߝaE}:B]|ȜVH\v6f/I0rXfQ_ *üheN5@)nЊt3c : 7A s4Je\y:9aS,0y@˟{d:`l"g6 % 1w\,1JfNOY%y6w ʙQڬ$ $FB(Z95JC[z[*k2uzb[SoYg[t ߘ+j ꥮGAW&gU*eDɷW dP5q.u" G 2:Tnrs }Eta[7w,Q!}Q {;V\W n!,h*wvfS\RYT,sI,YHc~x&oի;e9 7g[!(#5Д\ԔJ,aeXɛfz5d|Z촴8ʏ]nVLJIgyݹ:,W Y(~Po Tx9Qo*Hl iӁ5ΉImMs; ^v"4nDn&xW&n䣟-^}%5ςrP)Qi9~NL)\h|"HobK!~cAP{Pw35*t.N&i:KZ|sr0?I^[f="Mo(?5flNi? ?X`O:A4.:}P'-(D{L~83JwuT;S@\ǥ%c.n0*Ӛ  R\]PK"_4qviPKT5 __MACOSX/darwin-perl-deps/IO/Compress/._RawDeflate.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U! darwin-perl-deps/IO/Compress/Zip/UT 1cm1cL1cux PKq:U+ __MACOSX/darwin-perl-deps/IO/Compress/._ZipUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKOTi# darwin-perl-deps/IO/Compress/Zip.pmUT bM1cL1cux }icFÎ7evh6Vlj 60hI}Q'Y} WU^&d`c ^%BŁ=r?z\Îo?=jxjz`Qݙ//e[ ;,[4\| [/~>>?<#+R55ty7ܭᰡY({(].˂CCk-ɏĘ9?A9y']wlԬbㆀEaєV^tYo y͚(3 n' ÝB[$8xX) l,?R܉{H_n- efm,>ھ _h4c=֥%—+oj XQkQQ ݯ>4>>P+_ kĘ=j5.NE >dp ![l:I?p_Azd@TYGvg(NV yŮ< _r}b"w[wҿ0n,IÏ%4N:'iQTY=ɯ'؏"Djᓂ(_YBX&.X@d]YSҒ~ HOg=Hc?RlU'qFF Z"ő?VDȦ 9m f?fcM{;ӽ^FI:`89Mȋ̈́dkLsxZ5\n-k7o.۵ Z~c&z&g_x\ብp-cm]_+/KU¨ CO+'=U H0LCė\pMepL0j8i3kfiubAK J|O絻˗|W<K}C b5bLD^^eqG S1x&P7hn\I†,ܷU^%זܒ-\ U2`'9lf>| Z{7x$ؑFʵAc+G F-`^G]i쮡̷Ѷ/2^_Z߯?A4}t:L<6FYIbO'S$k8 `a^_ĒW Ĕ@rIdBjCzii$녈jr+ Ƞ:<ګxtY3d5v+LWIK!sX5,U`&a$NvO*a|VX_/U`2{ϏfYz]O,KQM҃C&Wl ~,fx9-RTGWz"h"` ϱ9( OFI`n%_"{x=Zu+G*`p+I/&Wׯ} <ճoWϟ]j^f(Zq(wmrm?Ëܸ$ eqGlRE4rB70?pÚ'[ZLP?J-ظ Es4>~5 >@u,qTdcnṐqo5R/)[]􈠢 q8 HOrU;%|`T ޅ8ldsi=xClP^>A妙A/jMIDQY2جb2M'I~kXA WP5'lNo2*Z[ _"8:Q ~nZWBkpq@l6XP[8%y[)DUrjrV΂q0fu )*Gk@TTPP6ZZShju* _<{CSO;Z S/\I-Bs v6fr-qXz|+.n*ͤIu"GU{"{R*RTJXMW3) QӑXEZGu) oSB@Er5TReOeux]14f S[TPD6^X?MAb w?ak2ƒ:,#4*"2!Qa։I T,D >o)%- $gx?3Ǹ8sK_ۦU홚7ֲκZSNb*d^r)E0f!_`gyT|2Kn٦0H2!]dsXrڵsv6a*$ IW@_}s=ٖ AiM_:HfPDh;gI˂ňd BVW !ou VHFt<2;YjI< H|A_U-mD"l^fo璴4wOƥP"ˋ]=QJ-GQ_R}\~JA#/gB2Pt`MtcuOf8(Q\&TVzŲAł[bY(>k虳nnjnuxhc^@R"{Ά|NZa_[ U%mmF%*‘JOTEyTms=`*yA&:H"ڝ-ڜ8H ]\$$@.uzCr5d63U>.V;3UWXI̔p3S |f̶S[8`ӊ H3#?x:I1`eUj>s wNjh'ᜋ܉}=Aeޓ~9wiEo |cٿv:G@ϙ u`o`%xI~܄ eغۘPMc_!|@C¡*jalSa=MSppΫBd!9p/3WaNt`ny kL }7#h!6К"O޶nwUM*BnTڸ / ?j'ln^+N#%7EE}\áT;b`l3 ؼ߯SsxG0@f+U2 %6SgSFF s&`J6*0c^PêTS 0EP~͍w{U|.KpJ|)Y[G4jX/ ُ| 1 J\17v%b /LiyRrYg1#,wtF $ LN\s)F_Ҋ Fy}iގua;N&|ey.8 &)Ty][hwsvpC5GpǓ/N4be"s`#|@ATP%21mX;]`Oouz]nJB)dŚ.-T袓 9%*6PEѡM't4r[޴0U ~cy{\c}EP5ׯ񡱱 oz_I!l=l4˽ L *R}BcAZ;v|ʚ,'h;}x~i8ۧGNL[:G$l\*~LxA]y]A/o-7a#]'tCMm"Kdހ#[J`5J%u/:bkICk)LHcR!m=x5'j_)LIOuxed,BB)c#9$Zͯ`=^Z) -1ɯ) f&efH Io%k9x&p\=6$Ll,RS~ с<7&XA?xf[%J9V X_d!)a98PF %kLk IzḙݤR",`@3+0-0E^}߂PA˫4PG@?``> U n6"A^iAM3敡vg6lw=*l\ uɅX* o O a.d%QUk?4)XaL^ e8(cvLѾ XG  oΈq(9-:cu&hk,ȃݦEl$bߗvK F>( p0ؿC{ pGd_/ڬٓAxބ%HѷR-@,U9Q p Vtl#T#rj7ỉQ̒𤁚$)򼴐2›f6e6y,]bէQdcI$ NȂLΌ.4p*;s<Mb1qUZr*"CNy[(9t i θ:͛F6*/a&pܐnRq ҖKd;;GfgCj5-@1H~$y>qMW6U { f0@i>Gg5 s؅S/Bo.^AafYء qfWvB"4;arCu*gX4d'2]./ZwGG-[{; Pڬ}=x)'tک=%1X!5G[B19 b[K)k}(AN<ޗ^ !@09EޚAW|&UIW@XJa %ڧ$םAٓKl2)/[v()%AΖBi]h7@ܬpWlg{[tyCZWmeCRC.#;KJtUcUi`Dvt1&r#43(|ER,`Ȥ~2E|QѰ%kv޲u%xꚩ_qr\qL"H4s6T;w8mPM)Mgkeɱ6M״ԲP&."Z^yOfTR/N\u[(SS%e0acp 6[V=͔0V#1ʙ $E~)x`qb-ъ:AbА?>`WJlM] lȰȂRBԊWn:]#h ](pw/+)3Iƒ6 ClDA#<995.MQK N~QPQM'[VNKc/3A:.M>.9_"|%'p;X` )Z-'kbσ!nS=f E55fpR5)Ңn`|l,%1u|NqO0zrؾd$뮾{X[%Ub.!u`LlMX83+こB=8nI`x/-.qvyOچ`pSECELlzTBj@do <'',dc 9!o鄖VJ*i,@^d,yQ]^&e R6Lc xNbI0lȽ7}@Y&$EIm5ɸz !=Lb5-%5]?V՟sU7ml /F?ioCz$b6`IaRl d;276I5K4$L= G[T=$%r/9-o#@,>~Ix MZ8zvV"F+zWwCF-/D=Яk꫙]OsT'1Y i6D@>X%J[#vTL/@^W'tBRn"@K19=UHbHMؐa ;/g2iNlҢW?jϿfD*_}^K*\w-dw)K. r_Պ!?>`5h'&m;ۆZ&F%KG+l lŲy)U=N}ñ9[`Hu Di(S-5+qԖ/$`(қ4WWb[Z]Ovͦj'[{e[Ymfki!*J(r/54tDF䭇JQy5רfxdֽ_] 4G(nXRKlxJ磟sA"::sI r,/ eEyX _2F 0" )<,N"1({vBDEh[GQK~i\a#[*%}R"PYdH!h[.)&e; 2zz} B"0ٵ豾d+74WC1GQeU ~=~,l?^R, boAO8*1⹮cuBg=""Q+Ӂ*0LCe s F긘/i0 |YD`v{s;N3 %7Oy|6-\?\?󶏥*&*T4|lBsP0[ Si+aYNeI]]ЯT0Rw%,K!.>c,#iݲ2eepiLRW%2JX 2@p*8+BXWLFc䗦VC^kP>XwU+hKcߜ.!vݪ@bAI3{bZĜ*dH;oN3(X(9ZlP ?xP"%_ y&ulڦҀsJ1\M 5 䭎V1;)ޙhxbS +ɵ28n}8R;Ikh߳4H'_t5|RɵB S6u| xutNWD_""?c跼 gG~kx&Igb)2a5K!oyxqxɹp`>ٔL\>hf3;mhZNPD׶P' q4C=zܴ@;CsUG@@RjqF3(rD*:'R%x=MBc u dJHg1C?)&@9y3i۔"aflؗL) W&fM9szyP[{Qީi%Q(ڳT0]iSn%k̤ن"G{2ThnJJ+'Fc8 žۮve]$ҳBy%t7ՠW_!"kV\N^ܙ\I9Q7Lr:=`b͒hwW@낼[Hed?X>:0|U0p~l~`1G2[dv2 'R=zX_,]c F71ȇd܀TzY/B8Qs..5]SU2 a_ia- u&YD~?3C/Kŕ$0#D7]\P6뫰,%/5 ei^˛M1e>-v3ߧA7nvOG|&`E+ q:vMCf`ۈ+MǏ5X PA gTZH5)@ V[Gwp%F~zśRN Hu-|xgm:B•w Kb Jx,OQ4X3eTW}G-鋍R֏C& 4!9]dh(UȜPi@peF;W S[ԷH(ɳ Yij֍gY1 mLPMv>r!;x+_Y2hhRk l+j/!CE<\bt1VA*m: X8q篸tM8= IV v|DgU/ÜĻIl:ӽ]Tjwos~~(Nxe)I҆gDs2?6f3 (W˥eBո8c)c3߭YSG11{5ejM 0=I?WN WI"G)tىb yBGSu<򳼀~%eoqJ-T<mPfjeWU݋inJ\~ЂgQ=Wb&{|Ղz<>Q.qIポ0XCWU2LrFڦA.C1+ҊKUjN^6F%mC[,o̢lN\FY9SX 5oJbIΉ<9/gw)>i9ynd>k#+i*Z3{? DnV"VȓHFa++ q8yb:;(E.rV}i tR&%+.J@eZʶ0z aҨ'N=@ʂP'c}`LB}[B/Բx1%&W"Z;FR`qd鼷̰XIÃnl"{*?IQjBbյ`.yf{iTSzv(Rrn$UhERnt$rkb;bQM_cY-uZC^ ՒJQX&8qQMafM>LcubpgZ.@ PH`_`w0ML'kWrP7˚ejbFKVyfn3fIk\CRF*Њ3$(HGNme *،f{(E*I0RK:p/(;jO.1ӄlG% c om*٬Ǚ[f'd&^JJeAL:zsb7 -B˿Ai@.M2IE˸ΥڙT92= TR!sؔz3cݙmJvяה#U4H"Wu@7ӍA|*l+-:P`77USM6n@-m`Ҭ6=R5155$q; /~ye•MGu{;jپ,ˠΖƠH>wP{Kk^*_7$9^A.o疉XRT~@O8={gK%'*wVPHHR?p tqp cftfu2?pApðuš*sg$k" I||k2횡QYxg'(c}2S/q9{X`K#k ] k 4`M6#=Ugŝe4nWSS\@_\X9m0D?mNVXc=.ub]lz~ -Y& jt6HSMaq䍺 善vh (p+p˴Qڔfj>Râ欢paѾ #'e=p͙px"QEr:YnaKpx8co˜F4 f[bM3lė5EQS{@J~*Uw}P'ϴ4˩MTHFWS`SYmo_پ6Kr+S#^߈Il6jbgWsY:lQ4 Y‚=8#RH>.gE};K۽g+)'?DR oy,d-M_a)ҙ6J ($"n*}Rbr˻ntt(vgaF*Τw:eh1je_,V^.1@VUIx_k}נ}Ł9 NxF+Ñ7v"fa9~jxwS(S2cUG\ºk-WlAvSQTdZU%,edIOe-FO*W:3UIٌՎOPIt;q^Rd綴fsh_F=d1qN6}wDgB[Cu0]KAbWѐQ6jW|2"2^uP2` ʦwmo >cm/΢, )^W|sOJwiV4l]Ĉ?~Bl/Vmg: jμّV^Yp!K͍^a~4&iP{h'ĊKNM`USi)xnԒ#S:kv2dbSaK$5H*LH7ͦskzk %;޵0rBǦXwȕH}gsϤxisWqLuv*V s}Ӷճ/׈IkF%FqhF_ jrl=Y .W9烗ZZim(d!6ֶ SM Q0)8d<>XbX9g)}KƌNR XyWJog ˀsѵ1cۨT^W&ӫK[fm@H4/͡ҍ*.Mb}EqEG 9,%EֵHt1NڞBi* SPY쓊y)x#?&(CKF5!|sSN:vTVE6/OYN+.ACcf3hHzZN]mnOȚbXWgNȝCe4H`@4Ċ(x8e#Jr?Q)07.yU0g*~%'8Xߓk۴),8-8clI 1X5|aShoORvmc]!u$f.ʷ-MyTS9v+f͍|JQq6HfשC9V/ȉClQ[g:=M4f{+R^RyOsxՔ 82 Sn%$WܐKi4LYy%@_q"-&[Jj[K&`1fˋ|GU&,Z5n(`0cv| ˦-tyFifo1ނDrPj,ɸm|#Ys3"|aDvTw gQh֌7V ql a^hpx0 sZr;""$DAQQQb#YE8{[. i_ϋ{o;G{]M:p! oS7c󿾔ެ-U7}j9ޫWM*JՒiCtOOOz$H4`s|w <p*'%@;hѵ6*0,ڢ1! .r?n%mN3g|SY_tptn[ UUҤa] żVԐNVbu_ϪNUfErr;y+SR_#10(O)j?u>6b{ʡ ?u_vӳ@__/G¿)]$ƽ|i. ma2XsܳҦB9`}^~zKRFxK@ޤ凭qᔹ#? :È$}Mq&WTV*'i8ޡ<ՃL{}}ݢ(t Ɨs,PSYI_N4`R&ieəR߰cYaO)S C)B[mtz;tQUhogo~8<;AmrWh V&H۫뛛.,| !# hapNk^$pjC d0g*X2"k< QPK?iPKOT. __MACOSX/darwin-perl-deps/IO/Compress/._Zip.pmUT bM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT R$ darwin-perl-deps/IO/Compress/FAQ.podUT LbM1cL1cux ==Qt4/dR+qd(~\HUDi?Npgyx|rst= //<D^NLR2g''ׇ@~8*Vb3*ފ@/_$#9Y~8̇DGH'bc h߀Vw_tD1+R \~ӊ_1JYNs>>T\z #< (BJ%sJ@ʽ*HGp:4:P8|sgf (_LiGl`E78 ﷞ MO #5]=,@A)ta-wyTHD=KC ,B/| 8;q8 %S+ư0fOG~n f( +uQlG>Rؕ6ŧu+X`~%l /@'i^,@@ )rX- >@dI(MT34rwUxgj(*:WH=|Y$,h7l鼎FBK,BK"BO\>dWbw;Hihd5U~<:7+ZhE qZki5O$M=6]9TW"˒-~%VqQԂ[)͋t)T A R?>lwRX@U J_E2gE,GY! NQp4 @=9*<_y2Bs X4ze%@RSt2 |qA!{g/(CiGyUi|P/}`F5Q{=HBHt <_ U$%SSq}; "iR\";FmP i.k[ #G5 ;f'y&[BJ,xn3v$'/BIĠV m*;{$d0K"pm{  BsdX)oQOqp1t =\Wq=qEFG A񌼁)4(b`PAde:'Ok8IG֯,_M\ PD*ɭ?dԡkXV#  zل*QUr5}EYٿq.mEդWcm!Z47t\|)nh+[s aM(v(Yr]ȻPNE\٨@kЍXzGڟ['YY,z(ZX;0]A <cwsA㬍~pWFpz>_)W<)0)h Tfq]_alq'g"&o 0n N{sNz{e@C` =lˀeZCsGFd>-H=ҋ 3:Exrol>5yY[z }x%8x 5|ՃhOW*&t01._zJvF4k\tH n OMVi+JKl ʮ"kCe|Jc/ BEh ٝDق'ySa2Pڹnq1'whrZ('Bn3xr,(D9DEʿ˂f*Yțf/Z$<=Wӕ SCηO~kR(V=Qd</y e3JZtGE7< @W^p[~gj$L܁gE=e/HM@ft܁r=F?@̚vsڨKcOhm>Q-}|BeFj}*_\͞^ UɼbBhҳbI%np+̜jb6cg0cB`nr %]QeE& ©/ҩDYA8 +yQHv :/,lΪn[/ okp2a0fyu3"tfIf*8i`c Ɠb\bz$o1}˄d<ݗ`|)RhjV2~y3:|5ڱ{#c 7Ӌz\kxl_;co#ȸ>#zH#KyuB@ c"U("$E A뒣w|b@yY;飠F/DM;Ĺ L/yΒY;d*QD[xD9m\ݕ?/4V)`7/p2 m~^Ѯgt"6x;MƒFjpdEy>ʮ1CrBh#WDU5i_>S7j̸v[WC9ihUsq%mie -OjKwב7(!s>E9t5=}n6(Ǐ!,"k>M80BoLT3*?X;ȞCGd%7qp Q%R:4۹!?6j}7fsbҗ3_FW qq2z}yCY`&qr pwixKc+fSA7xD,!O㌳h9:^(Z# *BA-lkǶAop`>NeIxpskH\y4a]BIaݎ;m Z۷m4 K%vJjm`#A#$b1A.>0_!Liu_GI.G:t_|ptjES,q ¾$r'!X4:;sFk+ `Sc丳)lv.1!rxUcSOzEt7 5pߋݦ:3^*ExR?1`%Hh}"S<2E0#ڎ~xgv0{@SĝD@Mpn XA|u5/>zێ2ft}:<\Vf$f% >ִJ,&,[}Gm+-[zkI4]|1?HU,%E}7'eHO!z*_`x<.KtOJC)<쟧0ndB ,*ȣLk+x`޺*a ЁӈiR5d%ZR,NS$/Ÿث{ܖ.n.B8&堕.U*Po<,mO8=W ?6%MMui-oi.[(]L(-0[#r揘%h4Sg64\c EMEqCߩSe:-a&kbs>pmAw]qt2mH0A13 "[!fȶGþͥRW&laKk"r>A@λqv)m eY^=NJvR@0 lC>+J⢌W|d66OHosQ#,E&S<MBj$Pe fSiu[+%"t-qxsw.#:>H\X %߾\[l " j-ІgS/I}۟'Bƒػt<֥x[ؽm7Gێf IE+X?nzy`l\k?RJ$MDR1 x鯔ɷӅx1d:a1ƫ|>%v,ٷ9iµtk(D-D6u F536w܎(]WT'ʷ"=ӶeަC,ew]P]#9™$Eq'ElLSf|]jy*lm`fs*TQ{}yu.⌠$ 7 >|62(& ^ pGRa@Z3,mI6TQ쪳볜uzT*KD{SQ.9E;, 6j*jGxs쫌A88NG<ݤf: IM WRzl DbJ;D Owsy Busu>7:>mt"Ǯh86g4eft/ '%kRAۛе'_?)'g8]pSos34*h2X!@}q#huu[Qj'gtoA 9Q% ~ @`8%Z[?mu0Q#|v;≓tUac\LAlg#示^3NcZľ툽v̿|Q(P;%551~mly&'1iDǑeG'QM"\ [݆SWq|`&Z7ZVuseZ'tmGWku 1O7*^`fC|wO@lgm] )4*: #Y?uSEc*8םh?+j"U5\+x!@sP,p0SG;Ek$ղrb/6'؂u{)OԎ8RԒ&3W+M;W.ƭ\;^/[Ox84g;OL~TtU){e@?$EJZE:?9;ٝJʢ}k'?J*, uI@0VN䈱H\6Cw:w2tWx<,#RNd[59ZtRӅRPH}os.TiwZEYWRgjr~Q)Ly*mS1Հp\&J"54&!f'C[Rp"]j8NSUm_G4tS ]$xgf~e6qIrGz4s`}o**gnx ~#ߥg3&'LƿQEaWɪky%O|Qӳ8 7Q2x_z_2{_^\^wk؏dJq㕸xxUT isPތ.)&J%Zً88ãlSM7ݽݽ*.t ÊRah\Gת&9I(SE!u^t 0/GBuğ5Sֈ2j PK.( RPKT/ __MACOSX/darwin-perl-deps/IO/Compress/._FAQ.podUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U" darwin-perl-deps/IO/Compress/Base/UT 1cm1cL1cux PKq:U, __MACOSX/darwin-perl-deps/IO/Compress/._BaseUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT]$ darwin-perl-deps/IO/Compress/Base.pmUT LbM1cL1cux yag$_Fi$w[Uq`$ZVk* |Pw:'|4t^)%JB\ %?Y3?$ T`y~{hNq ~'uRc A&>,$z' ! z([1a96D.5%h yb{=6s%NSɆ){ Mw~n |9tFg;P2ⷌ`&ޢ фS/2#S03?%OTAb4|.G兲 AhZMI&8Πpн2LpPty爱ciF7ٌ0|82HtY436t=]^/S@f-늵t?zN̥ޫa#Gl:j=4+ZN.1^ScM8|9 φ0-?Yq2CV5 8lġa(mrW[A)}eJYLnh֏`%\:CGe ԟܗtFJ85Ms.s~wq|y~[ , ƄCϩѡ/_NDi4' >ǦlK `9`Xf-uDsXk}%LhScDj7mҡh.gg W{؝˥|Br cO݇,"BV6PD6$Ct+hscr٪C%֊Vآ'RYl@F5@g{p3 a'tstnI6&t@ 1g;}`5Io jN00O0^_E2.+ 1݂sYz뎞 ?g$%.2&>VI(qK\3?륜R۾H`j yJ9~ '!WՍ^sk0\'ժϠh %|4%*YEldh!ahC+l:( r(52 \ 8Bw9H:_dnӨCҔb(A .P۹'Lw>aOrMFzjy$wF5BAKNk bz2E- =f$U TZis*0کt *p(ޏ!kDmgkW ZmZameɵ))LƼb|1H?KWW׃a=NY|8URb+oY=X#:>Rwv9eNl9#'KZ.2 a+edi -t%bm/T zB*6FmhѿMe:\$ΐ>P[N Ƒf9hrRRڤɤX*忀[6wTwa99vs ևfq&,*Gֈ1eHas>M+E TiT\(iij sWJQLY872 ١qt̀~e[ ~LHU}<߈RԃpOv(|4YѝƱ 爬T# 4i \<UhČX5cD* :΀h݇{"m!y5$Gijq4(6K ^l$AU+ab:*W>`da[mB.+}>rMvƣbee1h/wBv.+A> vU<3(,F¿L`h;QN"Ua1]iʰƩWa մ/uQW-9_J[E("Z"\"[ؗ&Wj;]J* YS/)Nh?IǺ9!˷8AGM9H1Dt9֖=SjDa=lF¦=עKU0gt+e,^݌(!bcos=~T:;J A)ѳ3H@ES[$U>X<сDS=G`j!: S90|Pɾ[D$xxh[5 O%:YDZt}pʥPz\]]/x'& y%,ubZdNq[rqs ,HA"eE'SYs#BA,#~'KIwp ^hrENrKs"йdƟpZR7|ڡFT;6uG=؜hl^>eh'ICkM@W-dX2 H8/UxҀ@mn|(a6 {S{^q}v6͕ͮM ejhX鏊 X/HuP,[+GH%3㷔撏b`{w9`4 vEGda)鷤xHoV唗ɣ(Ik*Xzn D[P&Ok67Du(5u8a,.wB V1sċr=_gd)x3s<#;I|$=뿖=5mUxG4{DYl8MMh!H*V݀*NpߎYORnʧyg٬)9~Dw;]~$6^Fv mc+${thͯ1Nl`(Er_5ŝn3*j),p$v[68@@}W`YvҢsHߑB/Uy"sʼ1*,`ϜU߶@+Zਲ਼4o [pkI2>UYB W˒ J]RZȉiE5WsV5 rn7'HN%ފAYL3vk xO=ze"j-M/eo!C 9+ykXT!Yb' r=.4+ZapNӋ2ZIW6&[k׽U<˚*7`eMB[msS<37!ͨj ؏bD$8&!x iM+boS9\ařH? Zq&\:cK?3Z[I ׃` oC)mxFh-p?7 _‘Sp+.Vx\3 ~:a)OJl#+X 5)bq0V2\|B9*p|"{ABɌG}2OxsP&N*Lz!ݬ@>v}c220{_^[d~e{z-^ݓc{uw;Ysi..{WD$p7ҳ_.{W]9DZƾ&DTH{v6-wD=C<>9K {oAX&g :6:o*PI q+Cf#ﻕ;v&z~Z4U`/Ap!oU^/@:O_@!h0lSeP25Z;, F%\_\/*^5?$SJ')Η7rߔ#8 Y\9{1˲Eݽ rtQ/ oJn:Pi5^Q+Nnv/#X "[lčP{-%g~`w5 1F`8?e7#i>sP/2Q\>5 !sq;\GFS>_Kk :!|'>#bi逩oi6)Pt= _hDS߻_ |.>`'Yp G͊z'E,)8z׿4M˽U {?AN*+x:NXwUJe@)sgOf~tCScN^޾"oY{>3{/fo ;}9Cº,%IKe7Y&BO3p {8W`Qn0Z]0/\s0StH FhyhGUPK؜]PKT/ __MACOSX/darwin-perl-deps/IO/Compress/._Base.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT~( darwin-perl-deps/IO/Uncompress/Gunzip.pmUT LbM1cL1cux =Y{ɵ+* (Bd&L,KÍ$t̖O_nYj=!у ݵ:9u~pIdHeYƏBT S)iӃ?}yyL,O eqemKH˓~<\PNGGGX5hIp(쵟I>ObUh2;u]{~gjK>O} J"Isdoz7-^'ov<:y3l^&)a{Oz>`G^ڹB߮w~q2ݞֵXf3gg?>Hҧ6V7q_f)w/>̖c˕'o e&Sd5|^3nOֳQJXPFQ('exLr2i[nGp਩̗i i ^?$OK4~I eWdv$D}a \l(%?G+!bI&4q }v̿l5 A|ɡtt߅xT/|LSm'e$?qH y0sePlA>vI0[o`nCbB'4Cx AO}q8Rk@ ; (^cH[P[f<,Yl`!Go` _9r0x9Z%ʩjx\SY'\u*NNqx!^?wZ$9_F+:;v%- VTLS JꉝٗuvHhqX~y6.%A[d'-4Eh=.Avܧ]anۮn N#5xeKq)w/qMOʼnQd|&;?  6,j9;I%~IVRQQL`nt孊 ζ3K1 X<#I) p$l>7k#X_PFNQ`i=7|;svtsbyAU霚vhkڶbney}.Ь|VGezEewU4:a>|fK#K ;Z0#2M P(i\M1(rGG AL_[jy۩W /`z.Fv*sJnv Be\>ɝW's^%\27Au [(a "Uqw(KS53eW^ゖZ @_iBLLQ\U씓f X_}srS{I\`ʟ$w5*^C(kْES`KJX+l=&!V{}wl\+hZŌƔDX-ð&Hܖ F|f@g$˖ :e>K&L ^P7ψLOˡXr7e.eyLi 4ӄbisO_(ߥ2lӁ<^OGncT˷;H-Yp=*}_ N0Km|w.љ"#p ,%tqڮ(b5]MT]Ui"ٙk{Vt=tZ)=b= Am2 ٲo&'ŬIlx- 10f2W="1NN7AeE 5q`LW) V7As bJ^Qe9_3)[IJV36K o5UY 3WY@|t U`#Bӧ&"فaG&yJ,Tw]W &3(#|moIrE2%4lGd;h1c(6 * q,Kr.N>[ AE|X_cϧ`1HXQoQdR W;+iaNq3}:mN}s bM?4"@CayO'<7MM3K= c^jɁ-\{Wg[H? IJpr ,0O# i:TІ!;YQ2U7职ƙxԚ829E= elUEWMO|%,̵DZ]ajNV("dRgoROkmEj]YEh3l?iE%5Ըqa8Bkg9'A?9NH)|:U2KmD"wApA+Oկ*U^W, AX.ͻ%G#N`!%Q&$AT5~(\fO_d(e,"mR+; 鬁?ȍ!| ؉tl&c@a,$~oZ֫)cdW{;T#Al92a`EO&fESVԋ4WjAƎ]'`)\ʀz@wٔAZ.SfeRK"Ls D2ʼnJ^G%c81 \. '];佄YuPNp)UX]ªG`ARN>=*\&ܷl>!< U!. 0qz3'Ɏmri(R<] f]uĺLixQSrhfMq@sPdYяbO!c|)5 Shf\6Tf}b.VxvAҠ55{.9/6?\q9|Sx?DŽ_Jm J5*6vK:ھC|^}ǓrnUI[KtF#)ǝbZ-Dp{%6 󶛏&$#j+XLvM50_Oގ!Cay[qiN09m5bR\ bRl[[Ia\'r0׉-L !V%çm IpᩓYövȒ8IҸ#Τ!lA=WYTݶRAD?jM`)Lm9MNw4rT&VE7h)@N1&e5p%J.j[UGݕ晌8$|,'+fheڄm"p,cy6gcy C&L*`,HxC.m: /瓮7,gA`YjNT_Pu\|#JaEE}duI"3& z&'nG@¼$u̺qnH:p.t.{sPҌ~H9k%FuT)n9884n=W8 :l@չ,TB+i:kaEH=^&oI8zlptRD#N:LGVM3-( pi뎛;z= eWMHծvu.SUUxu1ҫ!ae]dRq9 p= nz]778._Ufxo)fzxD*9:D(UI4"@k衃8if&c/{BEC2[W,_wMqS{!neƤvu֥,)`XT)}Gǟv#6t>| C-fY&:' 0 >JrHVO2.`wt^6Ǽb;R DX% )e) LӜt6¦ )Lv.)#eST@H[ 0G%,'2Їq!J!ʼ=I َk^~'8=Ѝ.yQuC3]:?kL߬fWM^|lgi<\=FtAN{Wg;t~xCɂ:lS'~WE[#8I֕*&^WT'jQ@N*]'5 FhlʬJw}f- xڝPVH"I}J^hGf>OȡO#J vuغN^O"> }Ip6)LFF.T1Hς&,Y> >FӵdXq@]@: ivORz^+Z; 75$,r*2x̎,+u1^3Om`sNw`|ErJ+LPFT &cM%U$U\I+d ֑i@(@W#h]%B1m h#h=a""0?c-V_#-v2_>m;Υ)l, n4ktȂh ۅzؖ*iׯHLp@J\ִg*O1Ģ[IE;0¯.f9,{C)݈7&֝Y£m}au-A\ߤ7S af3|3OL)?n1-ftթC'_adBלp_ \-٭rqy=3j 9&+pl)3ۣ#-sw?vT( #5nb,8@~Z-doP%0#wHQaY]|q𰷘0`.΂0%tNNN]/@콳0fLf<3_:v- {=qr1x0B]A/X]to޸4U [_=lMam15}.~mq w|9kv0i}OtX$~(#~"l!XnW8IK9oG~Boq^dCC8UHLJGP:92LM`eh c?ӡ(4gyj 3II,QPjs?_fbuŜp,<, l5nܢP2\,ao8>>_tGpԽ abW_(,>쀑cIn͚ܿ;0|Ye˱CUYxepO_E8H% =t`7M]P:7<'r@ )9(~ |Xp+}W~3ҴÂD5*yίv? G+!]LH1`^'h)aَx Cmfsp1OkOz>0<%~追=] ?U~J0a1m̓i7 "Q0 Ѧ)c%0Zc "m>(}fmޑ'<>}!Eڎ&+ʜ=,$2l'hwIނO-nI 3IP,4FF[ I]='x~ٸl̄]%%_$&u m* >$Y|E dJ񳄘@2\keF*\i6hfC T Np55c1iQj2]a_@в(;3-DփGEe}5OfVvDuViUNV$S2O來02ޟzi0 L9Ɛ4Dq$V dP|q ,I¸wE3|CMBtd9ƹf8d%(nߵCbx7`=+B/ɰ9$P~|Ve cZ=4AI*EP|K&JH@?2:ZwM8vi&D lzYL& Ccw0(6  Tw1A|s9]FzL?FH`q!~pB H`D@LG@Pxg IPk7t,5UA flb%:I6-dj?muHVad~E%5qa8!(B5  ] 'pT\7^P?~H1.*?h^JU63!eܖͥu7?(sՙV?3E2ʤZDbF6#q2|%"C͞/x"`} |K@eXEޭ*E:6I5# @wqI *I$6䄆L &!.i :&œ'@C٬ӓ])\0#=t(:UdavJF`}g8MVJ |eI3ji('-7+<6"O`UʣJ=Rh6mQ𤭈a)"mO&r*8Yd0gWvH*9NK8?H]Xp"qf Y l$[R ?>m8+/92޵*̸Txh`S[VTxx@:BBbݘJ+0ִЮX=&b.CSDe@͌\Hp¼6PeXY!D Ȉ&K:l5ýr4XLHȄ1*qB)mb]M=%MwA'PDf"t.N8,cj@S {=6`S[(O_^RSH <ƍ> aFh*wr|߉X JKEV- őf L~[؊S9P2Jk Gyg-NB8sHCvFZA]w1|PyMIҧR K,cH + ORLx'w)~&[zr;=qO*;:ܡ j Ƕ'P-Z~h,:nE)T "9UZ0iJV Fe{k)?{t\Z Ȥr'eUřvk̹%~ʰ' M PV'f9dN+=@I8ڡ%Dd;HJ:!̦:*wu[R޽*ä* _>oI'ɕ5%^\ ?KDO_Է4D|esQOk[=^t^85w,hKE;m8u$`;: *x֕FI+~^Sl x):vKpLٱIJLDc?KᖭuȤ@AX OwN4:fy ?)8d㜫 Xy8o)A^xC:#MAFЂYam[~?"'>lt\s3Oܩٴ!8$@c .d뺒ʗ7խDŽf>xHԇl TM2O?Sb~6]\Ta1pxօ#A_Pjᜃ#~Auɛ6Jqnkqq'xj~^)H@"'nRijtlmADÍ |A݀]&6* 2Qy ջ3ǣ'3JŶx4W#9R7CœT>R!T>ptO!ޖ!kM"AJťo /k yc#;<Y + ]'+I h) +%m"\7@& M{>9`ÄtW R;ɞWkhpz1}=fn_ƥyXQ~v=b r[Vg e(S1,%T(u6XyBldH$Ԁܸz`ȭ=vᚳNM[g- z]pĦk2t,1ހ lɴ(rZͪ閈X54)TXfU Q(ŵt [gKV'kEJ>T|,'u8re愝2p.c.6UêmcyEt8#L`$W|OLa5>мJ|1'M"$.%8=aVZ0/XֶaR/7hmnx@YszƑ~>dúj$  z('ڎI>"-d9!O)՗}]tUx%9m5Jl{[TnE8Ƹ4X :E2tkyYOHe:İ".Vъ9V>DKvF= %k$. ET]r%ۦV J_z@w[En"-!hcxpi?*cc zX$ug{= L) im`PdvGNle2XAk-UAL3rhl%igBV-8*m|oHGF<:%C호L[*+(l9AQs̵̙{hepGZɐj)Ʊ,R ׂ0m`!f&[Yÿ#O0UAL4t7UAחRh_dL>yMݹl`JJIj23,jaꡇ7; -{ɨMJH[&DJu4"+C:2in]dVw uwa`}n&,xhz5 |w^a9F3~ FUs3۵ۅ׹Tᷢ ȘZȨks<[WpU3b>f-/nWy7'}0^PՍM)ib\ KqLj5]q:lU.>Fcu9Hn)jøP>$HLG{9LOШ?Tb\P) &}eJ-'<ՙ480Bf뱮k*ӹo\;TlmZ RAY]dM5OM[ ObgDFT/qɍ}99Zt~1x/ok4wy8C`%'JTy2G]}\mH$YؗLչ4Ű]O,l*Vt%7DKf j g_U + 4pxY*p =Oѯ" Ga~zWq?Nmw胁Bt +,AsdD{<-8JN>*f־?&})nɯӂd[[(^G)bJű}^EHz %qΊҿC-ЉO]`ZhU226߶7v}IbR=_;.zCcCw9Kk'<ק_2 7kH}q+_<)D1S)'/K|pf *OTU".NfyȎo _=~eC`iuXt&y;Xq;Ioc0 yK؇7؎a'Á0-/Eߝ= yQ^X_V{<sbG"Gs.~qᑝcx 77Izƴv´bY>P?_zlvPj+/^7 f#?~.J'Ù~h H* hZvDPSRI :ϙqH񙓎ԋ*'H>~HI?Er!ށ[h{ha{m9Y~qb9@|Gy!xe0݆́bWt)3@jjH$s {$̒TߵK 35bv?~\_[bA&-}Zv`]|? boD U2AsNW?]03q?]{΁Cr v{GGGE\ )4,&4RbLw4 b&L dR5v샯&RCBc$sIqPKd#oPKT4 __MACOSX/darwin-perl-deps/IO/Uncompress/._Inflate.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT' darwin-perl-deps/IO/Uncompress/Unzip.pmUT LbM1cL1cux }WGoxY`bp8כM `.Ҍ232GH8}]94]]]]_]]]3 7U$O't<ɢ<ǿɫ Ȣ_qo[K0߾i~/m%qr˻"?o E/{0"b^ݞn&#=Ny\aIe۵#[4/,*$/¤uCjgS*Mq9B,4Y)*D܉^o&oaQG"> ~3߀7Z'OҬdG{ݏ㶿gS^  ۖzu? XnXtƳg'M.EMxFbͲ4WQ8#`$%PpkB*zcx 8(i3V FˆJj R$j*Lkgz9ăM hpގ^z+«WU^O{{㋳ݣg=u~O@GdhV_]=ޯ`&ȏͳ? "@ ݳg2Y:>,?|{xC݋g]ݟWqtyL;wQqqW]o{p{ Bf툕g,7} jfOYw' ~6blȧ"n$ ̳(̑$u<,z "y4^a )~v"ȵN5 6EJJ q#{",H.q2lBĀas@,6 VbGAW5-z`H4JQ8^Ye0A_.hQ+r`-&.\Y ȉ:}Vb(Rs zZ"yT䥖- JE(FQrU\ۂ/״WSU<ۜpt ; byu4jЛWmxqP}zW;qT_?X6_7\M5u= 'Më2Bwi Y.Op`"c@`> 24~|d7T><~> ~ AOmbZi # 8GpknLz.Nt8#$Z#WmmϒK<05ƛp P.D/AqE_MAWVJc):1 `6]%VZz^WrV(,EMA(1}9#zȸMWRx{ tDIY)s3gE@v+5yp->x9ˠ$ڑu| PZ 3с\.A)m|%t Bߨ)cG C"ff`,[$C6z.9:J M6A_'E2 d:>q>BjN_}U*<gU *i"&}t}IΖV+`t*;E[xFClh<2t4s-Zg{<>.<48}AMǣ kq~^K1[7avȤYw]GffT[c6EC*9uZ.W˜su&+ zDCjJ).QE#P .iUbD.˸B:eIe;&@U eiIw}#Iڐ]lf<{z4nfܪI9FƬ؍m/Lpk J긖 M\c+9ꠂ,W{g{/6򟃫WmbxǘU`HnL@[ҏKMeCaKusFsnMme?^n> _nno'{Pb)ʼ=}.]ŋ梨o_rtb?Y<6l>TDLŮ))QǴrٮzs~`w7P 3,zV稪hU^jBNisȖY3TYѿ,5 1/6O]=T:W:ѯpdfCMC1_,@ ʱ `\K2h4ZVX07:Ȅz[_QTU6~\y84EZMp˚[b>95zUCٙ ZY`6+VhiFg>f(gmPA*vU qʥO>#M,5hf,׫b8UYjcqJW)nQlKTP nav %y]wPxPncfpɞ/ϢQ0b2-tC\POAåŃ;v}gOM!y;͗b F;q ̓C gnmohb-* h3ud@cqvoxThk ϶ŏ k /@&ʙ [U @l.\ȃɏ> kf_ØC*"{7FdZ٬AH!2 | / 01 f 2ۋ @"@^VMf΋*G=0=y8MCȥ;C"(sGأFn Vh5+]OHZR+k]8:nx4#Ц~ ]!Xo٫YG-wõaYs;IO 7Ȏ#*f* b#?mg†=pO3Hfmiz:5hYR uJ|U>G#v?c0]6t-8oy_GqG x:Y%RLAXPVX 8L/~/,d]~24UŽEj K dMes4FOݳp#C{ʚs,{41;X[Ǔxyll `c]01[.AwѠ;HG7ڞ}gȆtii}aߪ?;P6ܡtOsr3HijųU)@`=QX++b)EqٵyJz/ϟ8D,LI>`:_R-z`6M7q='/Eg- &R8T}.T&kӂ/@TߪyBP~BPg$hP[ jNd}HeHOu+F tTeqN oňF?SQ|1Ѫ1{a.R4hi F"~=/ш8$,}3 Lv(L)]k 4tILMʼn˸@(=J^\!hpeew4J|&swpYo{v*0BJgP|'Ŷɞ%!z-j}t g&nI /N5ef=> {Ӌ>҄O-Vui=Ctb9ZBPY 4K=N]C|?~Tuaެ@WA8{ޏWg8l=i1jX^_$dl4F,}I5=Zk[KyB(-E* "|\ρ 9+H8f@loOYxK?6Ry;ֿYʘ,a^:1D*a|~ٳ SŒit ƪ6+|~[ J/^rW=τ-J]",J4@9ؕ!I40|UXY>J. r; (Ũf15P| 6(rwl Oq^(־o`bmUM2}ie> D^`=~eþؠlXo L[C47Ŗ7WmDN?³\`rgN6Xmk)lSswՌaN̦NҸx]sJpvL;aź^>:SL 7P/Ӕ35kn\ݛؔ)Q6k.a]\rD̪ݴ.:vmCN `+!'ˀc0| ΫJ*9֣H;cG#pbCb-GPK<<Na,oHa,Q nL['K])H1GXޞlBf$ʊ82_mΆ{yݡ!]^v/JGg5o0Ͻ*olbZDi~ך%t}<|t)êY-`\̧8Te/+*e'Ux?a}japʕ0( uRPfKbUe\`n611V.OzoEÅ:iZ}I6oQ{"=}wݻm A~쒾I,*Js@;yOe?ܗ/y@?!rH|Uyg#_:}2bV;]QbDA_O}Q>9pDPfFЪet=󬊲\ ތѳzo'_ܤe&/P l8kXRYd_4h'wQV tƷb?Fl_qS* 6]Mt qAx\)[*5Ɗnu*_FyԷE$/ʐG7P!j nQMw T76q7QtwZww/V 8膎h$:B#΢~ r3 DOTMùmvt7PҵzP˦So<S})WW}pr{U1\P7%)mf٪kU1%KҠT~ӳNmXh9e. LAe j ln,B"N:7OUgt D=3=j˰ȢȨ9@\FZ]0:Dg;פzdK5%hg #ΫmtߤH,}K6sX;#h:&sŴ̨QW,eٝcum(3[Kɝcq+ڢjj+՚>>_$mó2̤j5yWDR[Z-peT[-i`2zqq딑"jjVs2|'pHɀ`s:Wf?.y 3;e ~ہ{6uR-Kp^!NjP}TT$ BΑqu⥘p;v{RTӛ՜zf<{zJdKN h€ت]bJ*vcNͫ%z,mK+HI3%WKuWSD`Y:?>Pޏ4 O !blVw DI?b֗{DQJUj6=fRy)%}ғcSi%GIZOw}-56K5Qt 7%qe}j7BraC|a,%])'nʪ9R=Z^>ĺ ~ M895םq|rz~xnP~@6 ceӘpvZl^RQ~mɒ= Vmy ƺ~sIkX 4d=d{1/zֿAyOыήoA$Z:9y3.( ?Ǩ`pa+\" u)E:GcDBOKv9WKd,q-q69X԰cIJj3/p2:gqBb8@Ѿ\ b!"Ԡ ]S͞74΄ GIC>cS"xP$ >ځNioGwB١̈LL9ѪNB˝bHb7(z9E ԓ1L-!m|yq6όOom@g a8֮j,yA F8SZjU# \YT\(k6XO#ͧQ'^RbMp~+Y7Ɠz֊Itk;V󇖯bOBG\#΋ -3%Y^* ݿu voXN U,^J,c[uPNp< N<`#i\kzOiQV72~V`MD0jjăңKn"Uֹ`NߖS6̰XQn=zbFKzK,- (=Q2PLjgZrj6Z!avKJ`vV TR#XEAٓaqHcLN;"hP ?Y!/DaNhRcԌ &xmeT $1oe`VvHz!t%ɭcT'A}"+"s|xPEFM1yC5M#ަMjm:yv>4yCANQGM˳AF#u(1igdSxVzq1%KwT%E5o)PҎ--ArT>6k2||*S 6)2 zt }mNU3iʼ}f`*B52YEY*QP#5zH00Pŋ*L3lm%ǸPفw^ 7[(vg9L(O;ʠ7)ZfifMp/ED>A&H2fE1c JVc,%Ǻ0a[J9 .>H\{ RN*+nEys805Šɶ`(P)vd:6VRQ&YV`83#y^:hZ1NsXcj.ϔDқhT).k*̰i=*Щ(ؑ.|Ae[6eߧt]j#]I9pbꈁͬPОmv921V㛓re;1% z{qa1ZtH[ky8 HyjMMzH*I:e<W233FY1J>H ISN9;#sͧh!rӿPƫ[cre.D$ !4y>C" B&KYd9,z*es݌F7q>n7aI?5UGVgDޣ8MX8y)C2W6#򴆲8:aͧ¦BoUՁ> xV.{< j`1@| v E]Qf@JvKEڰw9"LH/ SuǐC\~MaoC55)՛D9w68ܑ̎| =\Љfc #Y!q(Y9;ʞ_~2YVh%D;e`i;uXZGّH3Xlw==۽89'mwwTQFktiE&z+F|+VjIRUNiڔu~xӊJܕ|4&`%j uf֞Zew=灒sU): y20׃L!p<{h5p8#.#!Ǯ gX՘ϩ_݃q;e'DOﰖw3Y.P![g;rGL dc`*.`AQ R}j֛'ÛD=8f-1Z[p;5{9c\ Ji옉o;#G(+aeo9H߉.`GR)19T hHO+rր/<$u#UСP |BȈ[}s'VuQ0D)jɁ3o^=}uSA.*^яyd"c漺CHDs| %VA4llؖ=‚R6oRCչj3*U82֙lScT) 2'uqINL]Hpka6n|-c’Fd-u0x2Mks`T]NVSiEڏ)y *Gv"ktKy6Ma)|ֱE*l&>' δ(@yN3 ;Q%[S#="7}M.sVT<yH6ō[GSzGGH ݏ, ,oM/cp_UNrÙg uC#MaupeQW:]FI4 >$m7+3c+{NVpN'{L0@ꩡy>]rmŬХ Y(zY,qǺ|9]*O&7G``3as6FNSrCv30RsnRVW6ţhK?Ȳ+esɂ3л@Hje3mAmin/,C .Э'=<./j3ba3ʾS-\J&܀wu6S 5b ECD}%oR^^j.WmmǴ{<>^ρ'.E/yNtZ@pS*t e Vgw%~YT_ I]QzFxؗJn,K=HuSoRevߝuϵ41Gũ* =߿U`'jĉ Rnjnx6ߙBj'3Y(1/ux?7HiF^nzr?^<G$'鼤~b5_|q10~+tDL]G}iE)%ۖBkϘ`*tetj2ɤ' |wÁ͟jU@0QL hOL%Ul(2,d8F=R&7p^#d+V|jd֩c/ev:S&M,TE_@*ѳt ]PJ_x-5T[{I}avXv`:RŖp=p+&&V䄚DQ {908osp}F+CHL^[ޘKz.C~܄a2:#G@:ső=tQvbo?~E >~߾GG'gA6J"0ܟ::s``k!60 T7??ؑQ1$q(^ϳaA8N#;mBM;XTr֓4+x(N[{{۹MZaE+L}f7b6+O1t-09EԿ 9^U/P ӽmaK0~&̒6kEBL?(4M;@S+ mzwxp+?_=}aDv?pA]3B4bvm¨YNuBR FxpX*1!-rZD29! B<a d&GG#Z_\(1PKL5PKT2 __MACOSX/darwin-perl-deps/IO/Uncompress/._Unzip.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTYy/ darwin-perl-deps/IO/Uncompress/AnyUncompress.pmUT LbM1cL1cux =ksȑ+&Q)E,K[ԉrn7 "V Ôd~c^n\jmGOwOg<[F}$y*$?őYA~D ?&_\fujzg~ϒX?;)Umʟ0w7O\2)Rz?8o bpyu=s[V=_:zi8@|+i#)~/?/Zk`d @}aqrUtp>:9p"n}q#o^dSxяⳋGIPur{7Yko#@ x,D><0d. }ɧb3?ϰ u1,~3d8VEe.V;Z^Ͻ %c&#|;OPqB,;H`hL%6̙77$k],fg.?mQ'cNxǓ omU?'tz<JY>~鷦c'󍛿7nXQr7Gȣ8 =/+F" "bv/H#"4ȼOF?f=wx>*'_--Vptz{[E<| %@D$+Je^-'-Gxnd޻SOHi_̅ۮq0D&GII?n wvGE 9p%7IHAK9(ɧ"H?oc#F6Mi",av{̿ <Q80rz  r Qjj}4diZ:`FM!Nvҕz[5*\%v*<|]N:j܏Xbj&;_bz,[;kd|O7nd\@$⯖L~ j^qÇd.A2s_}S@3xժ:w9Vg7L{ (r~fR޶aÊS6,K z)+L$7M,Y5 &p~y66QkK5--!H^ H OD~/-zw5 3\o˞ɇp 2D&/ӟ%3qY "x8u$M eHXhD\ৡ)+?(3WSu͊9tO!,! S <קOW~V2G;#QRM^|lǼ{!^B"Rx1 ` P :il92ʍ$Dcd/^5=D|7d$&E[d^*>c6;UVl[v@pF2_ 5`[ctkzA II$z/ M``װ2IpwW4XҺFu^i%S܄*khmKN!978>j6x#x=^aQ깈"_$bi*`4kCUsw)mVуL\,IۙJskۅq&3(lI#v,)R֎XD 4b(6 ' \ex"40xm/p6~^{\BIhE)Z- pln[c1I)b ݢ'ÎЦk[#dmH2|bBxyZ#܌6a"Axt&yPø+pi?m!`*d$g2=Ͱ aV# cRpWD@P5[fEgE$Iaacj y/c\\ ZDH#(<`ep2]Ƶ:ޢͱZR&b2F"?f"7nGXdlEaFl}y5L?U_t9~Chʜy>ł8\r o r5g^ <}T$Zr"qdl6.I{^i8{ivGB >a!U@+ͅ |- 5g9l*T($WNʪpY{Lm=#]Pr1?*T/2G|SdW]o.ٵN >^Dcc q2\Nu׳"CtU+aM| 2 ?ѵ!|C~k RMҊ,jquGԮqtY;8f})!Jl .Cu^-9,貟&1l|Sg[]=w~.:pK,cqR)ƱSt ]b$`(\<̯9=$Yvb9JG Hikg톓PZQYЎUK02-bXAB*4&5 Pen >LHH{p ' ;qA, ף9N@>Jcp zi±S$1yLe_S'&ED Y nwbG P-ŒRf ~J,[N׮-X oaBT{k[B3ꡀuI~K(l z*-By Zpj%Ig JC;n[娴SCwI}աʈLe=wTc3%ykS豦} :B<Ȏv5%g㕑aR(UPP.L<T LF T@sTA 4L+g5#cBѴ~ aL+J q|ܹ h"7j#'t֨Eޡ=W5Ԙo%&)@p;k|1M{6\y4~-)ԭ\5 TdzQ;'8! r$sa^6(a(;e뺪zӧR&&9CX0< *+PX>'aX{4b[sB 6zB¶ew] P˒$XÍESVԋ$WjIƎ^'U`L8יI@6EjLL r"5˽Z# U8QQX@MPR;f9x>,}pi^⽄Y\yN0)*ַV9;;z8d,̇tsj$!:F)qUw^}U!#ca6T_הLdD15U 7#OmoB W_hTRCMmղVMaѩFJlu0Sh5u}:})99SڛMre[_B8j Wہz{eut _2VYd{Lg/ô*D$M,ku)3gKPr[u.al"ss87.sb;n7 67nQeN-iFq~4Y:F WϾ{r,T16\(M0WsE4ĸ幫1X3hĸi{c|FsUgأ"I#=Al}kv][^ABޢ%kI?tQxҏ3SpNpM؆uਗ਼ #ti=#JI6f/n+]MYzt eL AQL3L)gZ(ڙ.ܻqVTMYVB۰BfI/>LfmALS_KIO L>M(_l VKbg`/b)G?.g:h'~ý6uI 蕷Ը#Τ0"=h\ +S1U{ÃeT24-yUhL@]`3MS:0}ˡ:EU Q^1 U]KƘ̮H* +f "eªh/u7Š#yTTF^L?Tt8TB]IH; +T Vq4i5*\2b9XR/J6{Q F*S@XDfhKkĻK_|$Nˬk8gh9 N`ۅ9uʹ( n$m9(Vad[^#RcosSu5?[ \'(!7{^T/D iGl:KbEH=~aJ#Ҍ]eEUaX_IK!z"2Sx%TorVkZ p~J4W־k1:!YK'9T"JDs͢ MlL&k p&Tmc\h[κhRڃJlR li24~{I9Ս$jG25hT6ڥ5 ZQi !M9{|j6bۨm% |q7=+d͏V\`p¢6>" Gpw(ڨ\!mc093}3ש띾 ݵT&H!_f K#f ǗKI_KrETz;9CbqVWm]~ ͼ1Ȭ!fHDHtՈz('kTg糣5ca)W Xc3N)ͧrYƧ0 ?~9Jқ6t>-g @Kˌ*"kD&DxԇZITHL՛lk5΋ /'U)BW(i0 l{My :dJnk@6_gTRN~Ӧ 5uv\M*uE 1K V)&&)Ht9EJ2:0srA1 RŖgϛUt8n$^D@/b-&GqlkE6S'8I N %lcZ2veD+N[0#Y *(ڔz% z9z\~9ɬ:Q'1eq\$s{D'`h i8hǶ7nQ<tH6ljQB|Us7kе9L&AHIuQ t)i4:Qτc'0H#STRXSF f 9(GQ/wedo1Yz}[Pm:K#9'B—|oY>i1 <7ŭ+^T5MaxN MCX_¡>f5w>9W0-SpYC’!ˏ?L+ " J&niy +xFs} 6 ''4A0wR`oYah$X`/}rM'.LzSB&R^ 6?/OxU$iϳýPŨ0g?g{>ǰfץ=#t _:Ӽ7{wf914Eqk >1O n[o¹y"g ˽.ŪN|+NjPJ/o|}mGRcaR`h#|}򟟖P7d'i0 ݶ|O"~]'ﯾ\o4FɩA߿Sܺ*6܆/r6˻YuHW%)0ie.~JwfV#^bŋ2,| 5ȚL?8Ɲu/<$_x>2EopJ${|AV:PWf9ǻ;PK%GYyPKT: __MACOSX/darwin-perl-deps/IO/Uncompress/._AnyUncompress.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U' darwin-perl-deps/IO/Uncompress/Adapter/UT 1cn1cL1cux PKq:U1 __MACOSX/darwin-perl-deps/IO/Uncompress/._AdapterUT 1cn1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT|, darwin-perl-deps/IO/Uncompress/RawInflate.pmUT LbM1cL1cux =kw֑+nh"SfVhkZQn6{t@RD loy^e퇭ωC13w3^#]$E*_ϥ8iW'nYAO0.> 5 B<=WSq_;襟I>Ob=U`2jXV]q<L4Rf_a*"Ia ,Srt68pze6[(z.`@ҧ:o6 F=z2X~.esOw?9oȗ<,#)ڀ|˭Z>>oUpmx~[ <=:8Pz@IjN) d,f^o]F4 %5 hb/GںVP\?ă0 &L{K9@@@0y0%V{V˖ce}4lAg)*{2;|jA*F2^r2]y_jHyn{O+IaJg£vh'25TkFy_?0jJ n $ܾYm~lYmDLS'Eu"upVAw@ƿR4v/O@<1Kg麝aӁ3=3dUjΠi0$XVZ#i2; nm6(n*pG`炔M~@u*UGW"C4x- dS I:eDn!t˵m`Lpfm a^~ǵs] ufjbg݈ʤ+I(S $:S,1jQ.d< OyK K(]țw&H^هuD[\m]~P}Ne¤UOKԵvˇ{5r^Ӵ1s_ SDv`{GHk'+_@C5d3XІk $v#`}1)+\^/ j׀0xVs $Zr0#@KL仵%~gB{~:U}XefsR[~ Q{( XI{5O߯LL15HD0$J@=|Ƽ _ؼjZA찲Wk(*? dDy'-emΐf!YYY(2ڍZW7DUg5v0 S Ū1P"8-Nژ:8+Pd0iTu4*PQkmfs3d -Qj8*WK >7#?˵. Zt& W9O̙_d:7 r.lV٪g̔ &Izi˸eyN^#v`0mgoW(yy =F>@x*wy?a]:~eu3fAXl%! mw pJmZUK(2_j2v3?D઀YW6L0jW?8CgDF2;iq5~ X93eR޶ E<z44CR/ߔ Q\٨qʌmv!9ENtϑΊ:A[c^Wbk7JO"@Omb%uQ9kl]OkeJd G4OǓ[Xx@g3xॐ4URW@RSѡfkHI+B6.l)Ҭc0" xQ/$OVRWLcBv'DlɗP-RUmUޮ%{{5Ud=Yex|ź$v~ Izoh~?|Uٵ7K^uP)ʏs?M;P:,#ꀲ  2qkƾ8?~;5M;aO:.,3|x1:1duΒN@fYnp @^\Ǖ ,'ISLL*Qlw_S?vĞogQnsթll]7t@30j<0"~S`IP2nx H7^"tR3?~% >KB A+h$1R^W`Oq^">ʶcKo'W`jH)?gn; ;|/#1U#j~a@W P\^+N6K򖰅j,N !.G+Ji{w2k 37G"{${ޮke^s@koj ړǍEȆÕT hxC̰,VWXg15+ _qxm}4AI*EP԰[6rpP?0ZH`22c3INHFB\yoAw0Gm<;Wuf ALLjW] `'WpUfv􃙐#N4_fzB!p`>"= o}YO.dHr!~pB g,w }Gp zqh֏tBTށњVڬ f%bI۽ h~^ϩ5w]+\_6O¨7U\UΠmee,BkB:}:&xtZݫej Go 0E| ReSzD#R0YQ?uw -u1&T5S8OrYR'PeZi)$z 2pȮ3Sħo>OZsGQpeUI-`d Vư}|qE(8,փ p,wq$I*ID6ͱ`D~4 qxaÉD$6:ps\Wa 4 #|@l|XY4ny"3g!UqЬDOyuQczo yPa c i ls!S욥oIm(hmGZCle݁C3 m7A =a‹'΁&&*#SXqF v eFtQvBC]J>Ƥ^љy;_CP&Ŧ x#5=]'j ?$5I15 GGTvp/*x.xRt4<*@%$(Enв"ȮDZ* q|ܹмUhjLshE5fDwS̲p%9~#0V5@g8H67V̝z,:r"n|.*0]bv0 '}+佄,C3\q'xvb}kT1ࣈ`dN~^!a]K7dCCWyvߩәb1~ n!ZE,Z-zVt]'+ATX.onBsWc?"*Ps jFixUӐrh)_;|H-\˪=?EhxNvwd.[n/yUj T]-EΘ#ѮEO׾GXܷ?ӱb1N+z:f1ړ.ǝd&:ljW0Z5dӼ^xe/`'+]Z`w׹岑rς{#yváRvb$TS\i ѡ%X4y~5gK4V́ l% #L{RU夣J9orҎ pA)p,A𑡸㢳dֵS9Qxxs'Xj~)"A"#Se n*7jH#5Ξ/1P X2$׏yTE#E̱DzPd ^lGs#" ="r#Iˍ r]-( ކ { 6~4e[m!>cmǣLGdݺ'I 7u1֘dx/p⺤1.6 ?p=G JW.K,&;&o_}ﮆ'o}P38w*'^|$̻N͍stErOA%ź"JO=]/7H|圎j%F uT)p86ا?? :I8vۀsyY)m:0"NphǾkઆ> BJΉS BV)i%Q#2ߦ+?C% fb7D4nNVnN7E2>Z=w{AΔ !G &%V-3^Rj$r 2_c[Lu+ڕL3ztv6jfBUS|x:4y_fy(oyxߐ7CJKgЦAUxu*DԮ }}6&,t]el?&TYSM0fm]:~u}<]mp0JXMJ/.;%`Ev )8ҫ^b/X|nӁ9:'7%R"&Yl3 p/ _d[vc0D]|mcRHr ) ƀ/`9 >¦Aёb4Lw,35Ol$VR>fK {Z\5̎t}NRwWחhpq|y|5cQ_s `0Qr$Zm5l"lFf9#t|FR3M/f)K,Z %d2BnG*^бzghfIfB|xRꞱ :f:t1U2\Yf6IEbN`~H(J̦DNTSS'wq|F1݌wcRۇ1*_;%pd4ɬ5sY^#x?oE /5IڕQkևc#7?c`6^0gG/Ols7 }0B&a`4&@Q3uɮ8ZR$#m -saI֚I(jø;M ۣ31m^_E_)I+pxNuRAI UjHUnp09HdslJW{μ(9qUf$cJr'K8Pʟf]Ww7Wu=t}:v)u^dAu, ~g,'j]"daOU};bn}kDtlH]Q'ls1[DI)mTǃ..;nAo3XIR$;Rqib,:Q$u,{T̮cnI6έł"!.uW?[HƉ$ञଯ/P!$ҧxyPK$_H\6  _aj B#Z5$abBԙ`ǽ$ٽX vO,ǿQOp /eF8~3znhÅ=}dgN-YŃ5_Nk|IP<~Ny?7w7ׯ%̛yFR?c8aZ3Y>i8+JG@h`.>_]yz姟/E?9S0Q1BE*:|J4I]]h nO\*$ޑ_:(Y.k2}=?ü''KVo-esz~a|\3r;fx_LցʞtWUG",k,K5Iq $:G R~^Z">'| vz;<={uvr??)RvhԜϗg|4;틻4tsw=^A2hN+xQ`E84^ X.cCN95r -+ls|w?PK+&"|PKT7 __MACOSX/darwin-perl-deps/IO/Uncompress/._RawInflate.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT d) darwin-perl-deps/IO/Uncompress/Bunzip2.pmUT LbM1cL1cux gl\j}pn,J-.dZ7,.4\Raʑ_#֒/U&??;".J-v9aq` {(?I.J0~Se.:v|:v7=dtzv>kW|>|;Gf"VJ"]54iWVTRSl%zX!X8<zo ,WW k"6{mCR8,:FoQa<ݸ_YIf٪ ލo!?L\F!^ yqڿzWWˏ |ӣ=/ @x;xsEmA@ 1oގN1#7 SՉ\s ܅ZlUșG,-)9rhvP}rc"0wQu?Vb硛y|ݰo5{j>ײ03Rf<7f"ie@$ xOfq'j(Kt& K2^l؎Wi|R%Z LDH M0I` m.)<6MJox+XFᣛQEdM* I?{vs0>j!EN0ۯ̈7/GÓ3Ȫl~*U>$3E,Nd 2S)E\MZgIh 5F/^]9FtEZ 3C D-nƹ=2"9T -pQ4ZL܌芣C.8ϯؙhKerW/T5Dk) DX+U*DPuu*uýCՏ${iZsx)U~K%(->s$/A3MbUo+\H O-sf > " b]b s+Y8v#Anݹ+Dnr)o%:( #=[@:[vIrFifUi& C|9(Ks5}>$HI!b ,Ϲ7nj rAO4~b%#10.dX'/N@g[5Gh"ZN* >Bܨ}oA)ۻDD̋*UN fq>UlE9ӽ63(mB ޺ `pm OBr)3,B8yв} +̭Hx$Ԋjqzɢ(3]c,&''[3sqvp^f^BZ Z OM'peҠi!&-rP[[[2s;bF4i4ڙ{<@@ F(rXt TZX[=C{f`m( b]5áf;7o-hi惬fFlouF0ߟQ~;xq8vC~X[(2nZYOpӤGBĂ:3!(#.#X)?l,Od{wK3NuX/fom?ES?Վ?oU!'$W5{YE& iTs7Uc]J8d 9S(\P41`fq)s{C[Sփm@k߱# V(vYJùN R 49m&p M3`뭾y7)J~" ej F&Sj gWw)U9JT֗0qHL  Y 0*bFmI_S~AaCs@&)@oc1Cl~z#4gDsЭ5Meڴh"*ѡ!HK2 qq54Ecd@vR dB*BݎA)&sJFTXAk գ*3i"ƠdR%H̻B|j@˂ந064n%J`9P6kL7'豩$cFaHlFoS@FDsݚ5/}k^35*,@VlʱV"Dsl_ 0X JKCV] _/LO[تYppFel!.6 ,!yN VkQjKYݫ:0%JKSXRǑ6 (lU)f*.%yJq6jܫ"cGd߆;tp.Am99`~ UO%#ehyabԊ9NRڄ&k9?⃼,Wcv4yT]P[ΥJ ,F:+ 6+u@`JJfC;=EH֡LoalrH߈&9QE0 dca?^qU&7O-l)O`~>Z [A)pyگBTܱl`]/?WU7wC:߃\#h }fOЂrgr1ە@?%Mc8x x ذYKLzor+,Ym}鑤X V,U'O-{>O`~5),d㸎 X EWAR\N䎠"& EC_B=mnBs?O+6OnյM#@_i- l=vElc"2<#1cMD)iHbA3@ ͓+>8`cEJѣRɮNgceR;1 -Q:BOX)q{Ved 2!lPTŠ(m6xBl` ~ܘx@ȭ?nZA-'/eX>!rA4r"g3s(3WlLQ9a\)e¥/kS6XWD}U I!{EV ~[; 泾;}M)&(XKb^#J[۰Y:5dї3L67:=H8^S?80&J;SR@P0rLeߐ|$)A=KCAP k/gcꓕKb-j{ԘE8&4ؤoʧ_hPcMG]ԕcvi ,B2lq7cCaC4PuY)UvR'OmmʔlV-(Un5}IrDa . $hycXpy?c zXC=ܖpat6Y'2JIJ5oؿ~w-5$Wr#]vP$!D{H4E"q|EЈJ, X,#JiaҘ.14Ļ]ξ"^bC7ajQQۿ>z9r7Dr톑Q w_J#YY$eh6՚'Qj]J+etCyg ugЖK"asG(ϛ׃;4(VyW`t@E|]1ezv5L A);0\{X 0YRs,$QLlda%({{lX k-? M4~>Q^/iMP{^I>-Xpa 00cv"Zچ_ m*hYOlx PM+| VjgZ^_tTJ<|{ht|||28N0q6î^P'clKU=rdQ bkeM=/x6/,B=_d(jiofa-xxfd/טo[\t6 Nb\HFPM /0(6*(ۏE:^w :nw 5 &X!҂_1Od:ޑ4)ה7TᷪrVTkdʨ -gX6ln4Gm k~϶ KԺ좟vؤGŌMb\ #]CjήۜK&x0m8-wkaI .+lZ蓬6SpO;"` 0#:o>̀0Tl_U="ߔN\-s*hJA_HRWo62jW :}W'_"A5 )v=v=< 4BOc3)7)Iθ˂{VfWPCT7Y7OGNx/?88 mMh,CLkLޢVܜbYmů8Ѥݦpld 5hCJl5yZ?u`mخߟ;7}_'5MLo8usu+{^~VlGk{Nmj ,h: "qvGoۈ pfJHx2bkpq`hxn@c_8RLߕȆ \6O NJ4wz09Kƣ!ό46bn(9m 9*ȃ1DĿj& 9vv "JV)XJ8-.Baȝ$"Wł?%U/}\6ʁjPL8ZD|`X2BRL1kBfyNs~ayJ5hbٵ9LPs^2Ec$ bc|+YD#`UuX(W@!fJg."7s<-Z*2t.#a _fU*o1 4p|%QMn =FL/~m@%#3ˆ`j+abv;c>>̨ąwyZqOE:}Ml}سM(ZR Nd ӯQF"FÉpCz[ΊR(kbU;tx٘J{k/c:0|\;5ZGc7'Ά]嗸988xuvb_P}sޫW0kW};Gѷ[̥!p{?:)T&7P^.b.rR쭖?hׂh  4 X`r^8b卵^&VX9Y،xHIAoyfoaV}g&/; 뿿Yƍ*oZ[h7jg['C ukzE~ 7ȧ d1Fӳ8~/JGb,S([2SSܶIjE#}-AwW1$vbli} m'1.o F'܁ʾ lt :F3htKzxtv|WWyr(Dg#@ʷdɓ*, )2?}slWj^ 96+=$ "$k2.nS_݋PKOGr dPKT4 __MACOSX/darwin-perl-deps/IO/Uncompress/._Bunzip2.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTn, darwin-perl-deps/IO/Uncompress/AnyInflate.pmUT LbM1cL1cux =iwȑ+:牚GQijZ(7d&88LKo}h{6{@uWuk8HTfI0gK$xU¼;""0_O0!H8թ蕟IHb!{UO3t)A7L4c;4it-^c\ߦ2]skQTR$ỤHEٟ+^'৫][|sz 4IAl\/j;=Ӑn_ZCаKq.mlp~qr3=]oN.o"{mᅷ,xAODNYyMHGϲbԪȓݩe#Gy^VLD,WZf -D!gR.e s?6kت׳-I kHAWL_ |^ͻ%,~D.y';5+0:fOyd<V#-mHvj*$m% vpyv{ {?'o6xTt0{b6xj<3&x1&j, "'$E펮n7(Rl9f>@==x˙I}=_iNu>{d^vDI&zf1a$g}ž]?47$<{dث Zϼv%`|z=na-`4yNA{Jc0*f~m2é3%l2n8BLQOa b]=J+E!<<0?⩟NyTnF0`OAxt&yuaܵ[4ZϮ~02 qɍ*3ڍ@]:!WDjpqGL2ΊT @I=8`T3!8/cx.-edh3viʀp0y .@HBmoslUi} ~xc&pgtSf$À5F0tX$._.eϮ;LPQT1)FAhD@jߡ$kaV9J{:Z[!*0O0QhI mvF6؜$m"7\ {Hr-;B:a Y+xB{(F3h'IE?ˁ]AvWP`|Rk$j D"wAqE TѠfy>~3śb20iQ?u5@$_[~(?I.3(i[QtZl=`yHNز+o>9-QG $|f?JZZEX 3n2x>@G7^$@y0H#Ę O2%>WaN 㶎ϠiH6y1'ޓ_0Ḃl/1ZUȓS,w@*@Q(9' ɶ̯pQTW7Q;|cffb  ~^2,o& LH1(qBmjuRRz*2C}աJLкtBE *6Ƅ^LEz9߀P*:]MAxed46t1f<%\聱Q*g@чsT}f`Q9%/r ڬ{WD{} 0mAuC4o.۹&j7h|qCtq)aB1 V[IwI3xJ3F|5O{Ӧ[cqVBMv)ςYɨMNrsa]#a({e뺧S#ǡa, 7D(,BLx;*p㔠"[s%;=v3}mPŁe/\P˒$FցwVoY,Ւ8NW2M*c<πl^Q32)I,* !9nMة*k q®0n%%c1\. r%KhU}ћ+cªF_հEбq$ca>A/Nr8W\U;B.pVE6n)dQ5+bi-[N'x+RV͔/OnyWz*Aa/7U׳Hg[ >~*$i@S͚jUS߸vJNT {d!ַɋ1Fa@>ګ.ONoXl9dK m oyl֚xBq+3:Ž[<`k&Klfo){HTqe'S-Į" Pu+bg%|7IX}ZŇ(j5gŬnKCZ< -rHVj}D)+*LxA:&23buCBDH$ޭx0:)n\);H8gK.ӱQ܏GfXvPAcBȶ~N*3'?|_ 1#\ϫ|O5< {YS-BpPf+!`J&(X-i8/uu̜§,3aXO)+m_o]k0Y>6ZJWN0;7V o#d6{2lN,+:=u؛X=+FrIS6K 0d0inM35$G2EhT3ƥyҚx]-<^ y &Y\vL]#'dgvQszhf[ѐF*[DRNlRXe[ڔ]nS'g@Ђ MM_f#=@Xm{p.P/uk~(Cz.)9YyES1a{AAC_s:6IB+٭ĮjSHаFU6@lۚ$Oچ9YA5I45ѵa@Q3wOGGT7o7My<&QQgw&+O~>D)1 bdDKR[1]3Oӊ9S6젺b8e (cgZڹb h ^ r{ 6RH+;IM9`q(}] _A'9C;Z^6i-,}e* Kɨ= ٵxt 41phΪY1H ÊT8b ǵ*vك# ][^6Rc jU,vHw%/?n::&>dBW+j hb@dmgk-H7Xr njR棳Il!%3R=̞eTND~'*܉;*Fc~ t])crJ|2ka]IeaK(N|H7ǣ` ز_{űReX QDpA(~ ݁MA Dy?pn2ۥ:DM G Soq2TV* ~~k:^j9nr/:ixyzp:>NOnF}q_`0kKm&\^(a^ZoܥrNژ +IȑEETP`YPBePc™E1R@|k˺Խ.*bcz:W);^UEWԆOS| g0_BA2RE*LcDvT%zSݧ)Hut} pӟp jL'۱ۅ׶T]K|Ijvdㆁb-/Nt$Z]ٶrI39֮9.ye5ەTm5F}nޟt BkzL402$$IpTe;js8p.1R"k"КÑx&Nx:tEMFQCƥ`5(ehOR'T *k.#[)H+|zjR `-(0BfuK5)I=szaXd k1br'4'u).1 k<uOiDJz x]}Th& hBVQFꅠpibS)zçkzb2 ?o8 t&d#jF=7SǘK%b} Zh9ՄW_LB>؂ q,8=^8ԑ'3#Ct)%8I1wN(w  p{xUh."sƨZ/.y̎b-d{Ѯc/2O{u:y/Xq/I Y#*|%lΰ}KH@\Giq(5~ uO48z';W::yzWacWaCDžm\d{߂7oI{Ǭì_|ҡGـ|'i0 |ӏ"~}vt1[+,, e>#~&^: pszN1ދoJFIAˀsze/߲燽E`bqs T:ҏEe0*8cunh yjÖ œkǬKIu Q#Ԁ)axuv |9(34Pd"lx><=ŏgVERX*3eNtt7L\ O|Hûy.:8o}p F2hwYO),_X-YB̻.U(@B8{)rh;Z?>y PK b~nPKT7 __MACOSX/darwin-perl-deps/IO/Uncompress/._AnyInflate.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT?& darwin-perl-deps/IO/Uncompress/Base.pmUT LbM1cL1cux =Sɱ/IA8B- mvu+政ugǮQWg؝m,mtty\"f)<qi2_2gWglpaNqpqy5sN~yn>l`S?}] ~bvz2ΡA@DgE%{wu:xG'qo..Mw_M9g)i;9|_g3(E9ЩLf'E<:sY_,){vȻh6[%v/׬GyyGc5`;E<z?ٲ"pk Н'"HIݹeq9i2aq}=axVhKHZ~>An{/[o Ւ`CtITԩGrT) vvC a<&+NWmVBiŁ5oR& pJ$Wfvd tGaIF7dmwܑي+|WmCG~ex=kD$ k֜ ̶Cq)ĕ *їx_vP#!j ;^Zفs:XGac%*T^U40/]_5`w_퉆d.},@8 A+'%ǻ6 x \|!`Q^^7+5Ka[OXd6]-k:Sv 8V/(e:X2oYb;Ku'韯5̀u,ˌm`,Ih4ʖii,T 塀Y+ c0mf6}17\ZOjfψ0'.6Di$5kӬ:<1Z}S`0ŗlV2`(gT6iec<)6ڲGe1ddLl5({t-Փ6hk`[n}m3mGO要W ݩбrzJ- STt uP@#6☶m/,E3k=d WC6W1?el9lmY88szYr3I8ϖhNHk*IɷHP`CF.s9.fCcܣ9<"?Lє%pI:ɸ{F:3x<ű-OR\5|:lRB[Q|) zqb_N$[k> `DsѺQ,rO!l~ 7qwYصcIB h"QjmGhNY6ۧ(i;j~AW$Ӈʮie z(t©*UA7<`}j[m6OO¿'2\‚,=Lt"7FJo[l # IzQ弛FY'R -oc֍ꑭ韥JfPL毓c Pۄj/ _}̅ДנokDch!]@ո6= bH}ad:dpI%MF 4sw lK` l12fk@Uv<H5q5&FO*$rP|wR$EdRm<=wCшm-w 2FvަEiyn[`/QT<;h8Ҫ&4Re` Z6@]Vd,&NƜd> aV0 CY\iMQ%4*7q#fyjhLAZ1kl*6Mj,  J.R&^jBZXo `_ec:%PbUKuI&uH oȴ$8j/3J|Q俵L,<Kq DIvo(G,}&JB[ O:$7â<W #ÿ\?BZ}v z}i- q wPt9IQ@]/_W6M>6n,@fev\ġlŊ+&%xI: ;B. DI/|~l(`GYJQQQ}È=0gdYλ2:d% {k2˅@Y#БuHklBB]k3#T["HQp?V`fNf[y>-I_ռ]=sĶ.ߨ[ݶ'~wFq@Xɹ\t}[@U Kgz,OHpϵxV(PQ%)yi\R O_4m<)3ѱV̗#S~Y?J`&Fvk4ךS4)M:D*J1Q*/Z; _`C;!9s Vv/kr|DP UY|@ @P!eAoG}z>fh᥼Y<3Isb QEW4TR`eT% 8*~(L CWVe0KC\bÖxK netECXjUխI)U_j:DD:5KRYJ]8[r /_6[$'mf}48 Q(& )G}-'="KNV'[fHk~b kjL)d +N\OYacMZ4fp F!4&Ӛ蘘3ܪpLtQ0:L1H*IVW<draZdr8#I`2{a::!0ܡ뒁*$ޑg, lWUSCiX#ߋwdCNz!5V^K{ʈUU tL [8]iGp:* rHg,2MhBM"zqGҺX%Ք I8h%Jq@zpM>_ jX +!& u)^<ۇ"i|Em6N.94a@sF $] +eI,pm; T<;5Vj m S^Ltcʱ g΄ٲzDp᥈ :\xEhDևQ$c{;HV3smjSDHZTPY$8nvr"y걨0r :[ >`\8t pKz 62eLY7 +ࠎꢖlo]b#0V4iKrdevNT+%N|Bm^o~J%15;M=^aPhʂJV qL*mJBlOȗX&EmCq&k>JD nu -_ʅ+Ay11ORZ @[Ԫj 1O:^UEdT"7T]l0 )6Bd=ZD̏dyĀIJ7Y2s;fvܭlJo(AN շ^J*8V^@S9yz-]0Zb E \%Mg)oQ4Fu웮oCZnZ* ۀf]Ӎ*tEc /t2?^ "稼vXІR>6Vx ЂL>;8pLމNH\iU ֑}}Ogz\^" H7nu|W$& ƶ(k %vWA9!lk@OZ%Eѿc#Zq'TdZVRk$xR^; (}uuLbxal Ϛ-{)aH VP+%HDE0 nH[d3<0'ñR&9|wLѾR! hOrc#Zc0#iGQᇊ-S×ˤhlKiq;4"YP !\3E^G" g1CqhL"uXkaӓ9(K:n zѯd,xhNiXıL [Gb<saq}Odyjjl_d3blBYG+LR5o gXy9,LQT6h4Xs‡x6 12`M׸䃈Z%}[.l7fWf?i!eR+MB 4/ͣdd>tt&Y&|g]N0,! =ek-'F`vn ,ل9TFS?2(nJ,$Üf6x,h]yRʸԭ򍀪k3flYk_q4ݸ ?L͑l[%vr`|W0FwrsǏ#u\d\'um`I٬$Vk v1+t`[ijkt}"QHVI-0aG9bԳGJ/_4 ]T}Aum(-C?-%@`;*pYRecd— di?'P 0dktDreɈw6ΚI~F^/Ryg<{am*/F5Ik o+!Eu:|m{è*0ߩcfZexE#]>*2%(nʠ(#S:ҴjwTʢ=!-^DSoþyHI㛨LN5IufiQ 7 IGpzNvre>xLXbEg\ps] ס"2;ݳ ˎ{la:= 2d3Z|u?ϖ7Sa1NlQaz \gwU+Wcr +O? {+0&-S٧ R~j跽жD /f^ >ჯyU+sx~J H#%!JLN1Rgu ~=O񶿁 7 EJK,"n 5=K D/g;{晓a,j-W3غU՛kxSfFAV6%> U*z:::Z&<ϫt<=;I,Oz$2n1Ua ̊$90ݞCKz$@b(+IJ?;P뚥,|s:E7רБ`]:j/'&"VCg W6UC{T4u\E5|Uv^(6r< AN+@ [hɳg~ 9yuCɪ[nu[2%}}g22/vdtn:^}ŁH˲%h;Jћ2m˻(ib\yvr1ĞY@3j@I:%T-LLz6Uw%EjG [[^]o1g>VA?>iYIu[O1 ?#mZ&]|-~. HށgAXF#7V>"(KxM276\{VE=BФkᚁ|OnGdnj&P[eP:Q:X} 2M"W7_O<CǑ E{ _yi5ֹ3hU_]u:ޔMMݶu [{ןOwn>?DgF"x5.ǫa-L}%~;HXNfrRYc۠9ѭƉ6ȁBDf.o}t!`RE|OANýrC[9TQ2M~@vAjBEUA Ԏf`m7ŠcwI<_$0fwAE%4ΖIf 5T>43j͑k;ev5^gN采!9~V.%ATQ|Bu4qQalz*!LBA<[4՟VUN;UvRBڐdzXY\7!WT}m;tMD>ٍ*'㏾[0{^ /WdLfg,n/%nY#YFO84ERWéns@cxx< \V:tlFrkyD7иY3=:%MJ8'm~\iPUU^2hp2^ϥ$շ-X- N.URgoNq>?#gG_~A>l_fT(={z>=NTQhK%|8;ܠkRnb|AC!nv7!Fh,ଉnbfIc fB=}v~v2?8ڭ0_s 5|qx6ZQ:˳yq)$g$G;趋Y2Yu,@ׁ}X iyڿA,v4>}8l4&_q#{ P & @YiY..wablUy{IQ#ZI۠ y;ZDn}\^|[̢i9DOA`H?Β#8_؅ށY5{L+C~C$I>GMFk@yk@_Q˧zezkE{¯׬G10 (*_.#({ȷ{\$*.W8M/d+ o/W"W~9[ [E/Ah9c77]'/pRl'8Pޞbߟ /?4XxN 7>'?\M|$[<ʹdQ=}{ec:6+ ؈,TrP(I @|%Z c5%`YL]Cܝ h9xJnPKm$?PKT1 __MACOSX/darwin-perl-deps/IO/Uncompress/._Base.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U darwin-perl-deps/IO/Socket/SSL/UT a1cn1cL1cux PKq:U) __MACOSX/darwin-perl-deps/IO/Socket/._SSLUT a1cn1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK)T ! darwin-perl-deps/IO/Socket/SSL.pmUT O۔bM1cL1cux k[H(~Eaɭc$8 0@2!G2h%%Cw]*=g?9{KUֽVQK$A*4~"k^akyuyUtZwx^$ #Fi0@ϢGQK8JD¡?O1aP;$RCs"[8  Iػ?$S%T~Ԉ'/]Ixa#oI;'IŸ\~#O_N.O0*$0vDz&rO$LS TO.cNiԇNFQ܏{A./bџb0G8͘7/[Ż00T]AvDwŶl66?ibߢgvl,Qg*XCIp nmv'*ܘU }knn.qoyY3KNpa\0ބѹ u=?zNw/-!V"_w)\~&r9haIJuEggGp#E|Iuhmi zp_T$QuU)[wK̒2ޅ{x:NaVivN~0MJηc X^29D VaIA#twz0ޱHCbqpπloKH$ȟyY!!q9F6^{^0V}+z4݃|BW$WA .ޥ7kkF8A>xkG'ݶlW>gC^@0trz|~kވ8Y·ݎxr4 q Ϭfh xKpv BwL0pl(|֏:{q{[`c"SL4H͂YU\fq:I /'@ S0B? d2 ^h$2kʅ0.=qv\,d3ҡ@dP2R-/`RĽZ9!Ҫ &fY wh'"e#ErHl@8Nt *qg6|ݣi#9}sXXC*jPDwcEdG⎰IR%X?t4v)| L>@|dr0cI5lFϞj"MǭIڐDaxnӸHGWa{\͍'- ":?a?Imiq@p >ďk!\ _Q$T&Ht^:MflS+s‹{l9 CZ0m6H?qMmܯ69Orej?jxpY#3mE,å@i&P N70~Vq:syn*WU͛ 豁L?yJ-Sl&U;^ zMgCIˋpnwpGVŪ5Y`hRn?LCzwL7|&CR{-x|ZfİLY ؠ%3l8M*oyb=ah@:PzS%*!KԌ6$Vxf :xX M*Dsrxp|cFVEO#R"j/&N(Qrڇ"xrTf UU#]e(a_,:t= N1:z%o|TEixCCI`b&d8ZD _xQ<%vZʆJCA"V{{b?G;On >+?J}TLl"d{^f-%e3|=(w2a/l@:)!2!pheq0zuqt铧w`@4jj M3[iÄL䅰TW\  b^/ؠ& p?a; /R PZa=UfACfHl0<3.l %$O lDr  N~L3mx*֬f ^L}JmN#2Tg ~O/Jy\ [KHnht?^}*xG0z9 h#BNY%I^F5A cZ`>N0Ξot:^&(UkX &EjiqbƓ|-pB~쾯@{k5̻Ic4nN?:e{򯧏?DG^/2;>}vլnZӨY >w$] fRwO^iO $klYè7qݤ"h7'*6SW.A'"Ie 6,/a BH b*$-UxH>x@yL۫" nV848!eo2› p>&$|;x޳ۻ_)(~,$S;F|)^0 .Pnw<{hR_,?ZQV @d[<`i"2?'ҴN[}>]UdRՅaEVn+Ų0A2z!'wJz bjpQ6ݓW03f"/ 8- 愰E{7IVEMnfJeRۛLVԜD0eyɝGԔpyޑw}e<+ O\м~KxvoKmI-kIO`}ckx#=Ѓ;|#m”݃133oLVvׯ i 6f_{C_ 'YLP.a{4VNjeFnPHLpLq땎%TJfӚ~jWE<j5Ab;n69`~=wX` v: .D * 1F^KG A,`奇6o &z"NzG'Us-Lcl}YdR)w=? gX O QFTgSyfFqf C@Ibۙ3[Qߢf~_Ɗ[C h "v&~2]UBg X/`@|*%3TO74`OhAND% ohKSqX d)H!70X2ۄ4ZܦOurmAe4CXZ<۪6%+̎`(Ygt{."EUOYxP廲z]=x8>$OܸJ0i"S4J|ך)=Im䓍'0=_{X`,A_.]-nElQӨD+Pl8h7X.IFvo` =O<{Htڿy#x*c\+L 5A$Ԧ ^e=a-Q6J;>)Z7dFZ S]CPOF535`8@bM\0X9E6.=L4ӟaxָP^˝o9:0y ."rǭRdsYs({4|(}ϷUOGW;R c\M:uDj9:z~|O~4Ӈ ̛_Jng eZ%v3Y0 UFK$B۪RIۍ,![JCkG>Q< A'6W>MK{q&qH}L`clZ%7.BC_2vE@)l2E€h"hҸ/* BѥjM'Ovq0ph,j *Ap #2L/z"ZRGQl7ʎ˫QxGj07QP ʃMOQY9,Ba_ ;Pqݚ6UB"Ꮴ^tyae$J~Y݀##SZ8p9P!fl(3 GT"Stp :o;ڶs浗o; @uV{rrx10gh*o`džb͵hD S"rȰaTyAW4m]AUCA! aK[?ltpb,+(bLl5J懶dJ](3$SY 16zݣwʗP'1L$hRxJ)LQQŃ */:= 72L Umu֬)uA=pq6 pV+{5hۅTl%/oWKmnj"ˬŕu?v(c$;\қaÙ觭0r(#e:C+io\1:0\p1հwgT 4@)YՄӺ/k‘=oC\+uGUXohnmQEsӝ,ς{ٔCϧJf{JG+~0E:fHvy+DBB/ 䚷L 9+>XK&NWkud3ۮe;^ErӤi$&#2S^]f"q>^O>k;^r6tf±-.<v X9*D Pv`syU(:id 4* "gd!t;fR+vFCY7ʫa1J Mg@a:SƓ?3TxvX#ASAXeU"LIR_noB&fCK8ԗY̼vppV~l Ŝ G_'*\N}5dmʚ~ޓ`M-ٍJL)F!yI3OY0+hhiUP ie[NY舎ԟU~&1.~Ϣ&<j/C5b6bg{[PdiD߁]KO~vI#eكLQ1&Cg j̟k%< L/eTe?5 _ƀ\iwWS6B*SW/UX]SPI6M9sakMմǝa@OS+nqhZNssJ];,n"a2E`|c+/Veȉx*Sǝg q3od|# {<)j^| lg#ڲĕ_UX5V4 *R - 2 [9Fb`1v 8|V, >J#y@ƾF쾻TNgY?zȨ2 Y_w{k/ӵϏw2[ ^ЇWO֟Y)~-6} U}aAWw9N;xOfJlX4xN̑M簚!hBԧOQG+F՝i1&BGTşk`X*FzHH 4Iw^xjʱ"D2/ g,D,yg[5 FNUBsS.-(؎Nb$a:FIMiݸYvH' d4dFVY,<N |W߂9-ӝ[輒ϴj\'Y-9mT-&%; +o9` rkQ5 96]Tz gWGccw2ɒ I`'0d$| gA[38 ջq&ss*caᵗ;nsLQ#0`v@>$- NR)#mŊ-]Y0MҶ}'0Uq{,z1 t$VRi)vN=ܠD%y4,OmQIFש[{/1`(j:2=i1b IJ`e_VJ#;Y(B< $@n]l+5RVIP`.VL`HJlz5yIpT T'8n 5M{\߰Ću0vUti'ϳ4E--)S,DZsb)? etFLT+:Y:fzS}[ihl!Wam8[Phg'U|h M"&W0PpHMl6Ȣl5-^=C*P%z&5%TDžS  J`iS)>&xLFsġ5!Ί`ZM{g "W&k ͺ鞯/^V<> ->R9C#ihҕGwf04=l ӝ͘.dttY횸Y&ƤLLr˯m5yxÏ[jIg1ȸ3mz̚Q_`b0ë +"xC"ʧj E5x-dB ;oMluBֳr:x*R p`6DP\}2)yk6 GDJxtuiY*[]{ixicprS&|.:\?fxRNDpK0U-wPl;ws>QrIx[t3&JbI_ U{l3um\:qXdaYKJvS# 0L"j%{ckӌ)]0!˫0 Ghm70vE4n4SǾ{U]N+>$r$*cXkY:WǴN37L!M0 ^Ì2T#C4G5Lm0QU80CJQc4 Yr=/Gr.$*u5`al䢭J%QeR0\s(%B̏9"M*=ǽElppcؾJC{?5b_e{f &0wofpQ}p;sx2,Ny;!Hi>p># *h/Q9RxS2,5dkK/ P;Zw>hP~_.~xd{2WD-uZ|lho 8NN@C$Ps&[23Ċ \yLu\ Ӗ"Rv[*4>Sժ3909)@N ً_0<0Ҩ]lgY,jXpsXu.PIjhl 2|dL#m/QJJ)~,AY?]?":2 kmV0u_+.J/Od,9ꂓjgRY!Zݛr%S}G݇;+ֱ9TG<$Ad!$g{2#$-ۧ n~^ЗZ&pG`/5LR8&j&bN78jZk ۝<=sTHդ $Δob%yߩ a< XeƋQR{BAsXJ}fgS/EiZao @Y7鬅@҇ҽVb 44J%,rtoXYKղ#|jlN7J.+:p=XUӛ. 'kjs)M]qK(MM$UșaWE;Wh V;_xL̀(aGB S,N-Pq228ỴdcTkmp*7V( τ`RZRZ4ta%2G(Apߘ:si4{U)&O$<zUm4xQO56^Ö˓xDi %`P0ǣIQ׵G=.q@x_B,jNq#{3\`rz_<΢͊m9fL|OeWiq(\b)30Aw;S6ͧN-䎝UER[j?~T߯A$gRU]WLR˪~.(>I#KMe>kc7gExved7p _vDڊq8lZ38Y[sV(OsS{@X,~öIVWqE}Tb~aur4l63L D.{ؑu\l K:fjsX-5ӑjWNk*QVn \w"Sc)J8 neUĜaP5PcisْX ^ĆНStx8rJ :|.HaR# 7{Ϗ |:O4:wNΑI`* 퉭#”&)my]i3)}-6oKf[zzOU:ݝo9u W)PFѣGV`n)mhPB_.sEF-OY?bT$^ޚ]daBZ-a89J+Q-!Tk|t+;q \~nd0=J6вS[LK1frߠ,/DLsY6dk3bF)ZX{7s1MM66A;BA<ŗA'ݦ6[xEU0C"\36Q@h,#8+?xNypdDQʻZs δGÇ$oC9+QT%ؒ@?R5Щl8Wk1"2 (D.KU$8 xjy[&c5hQ]29~?nܑ+FK*^v0-uEuMd%k;3 m!̦lȀGAO6D#$5- ((G(fXjFv}:m -^f#2ěVN%5{̄4y=pI=R^b č~p&oˬQ)ݶ,UPlA6w/)5J{8Œ. -x4:QƗor-tMvR$W]0cr1M1;ݟ2Gx,/h]{y0/=/4Px #ÝE6I$kjI8LٱRKKI|JVd~(֫WrX<Zt=P&(9;ʢ?PYlD& %y4q6d4P#R@EMǎTCV4'%QXKռ,d]+, !DCug0*8H;Hj#πZƻU'Х#~*BRVSzTs"U&gׯKۋr~#^.0JFŇoo3Z%Vj9lYJ+ir!B[Ŋ (7n3WKWfg)'rX&AOG5w2Vc|CY^q./zQ skYgy: +߱z~! 쫋sz0=BV݂yu ,!=L0܋-8+v[>"wDrѴHld짽 ?p2-"K JU-fE7T: &6JY~}zZ_{_3ޠg>[2g€MyHZF77tn\*l@k' @ Eut8>xktefԃcajѦk&C7c]xiDKW*t,0~8 .%UE,I;Ys) 8d:s3dr2(M%+JM=l>_cx=! ]]h͓mwM8˃h S1V&DcJY5Zw s{?#,H cϜÚ*3#̇C8p#ɬYsY[yU/ecXɠ}{2 CbP=-{2{aza*)p}}-.tdɌ36aSޘ7R,D.<<}T$Tdz'"ct{,>}BDQB_<b$_<},h,? xyS+Ѻc=})oǬoE' MxN3 %ʬnRJ`H8HƓ8{0t-IW!i@G>$8Կ0 8&kR"k+5amzj^< EiNHKF{"-G5Y"Kg0d:_R ϖ&j6QR۪K6 ɾC G0{y=,ZAtb9eXgY5})1CÃ$y%NOh`#žB+悔mO }O=7<,e±L~wJc;^\ݲ(*(*@Zr7(L]Ӿ6hm6>5*kU]"m#!84uK͒׭ -x1~ժ`piFVvbBRTouM%mt`boDmuD~|La-gc1_K?J mPʬqY9!N7g#?= 4t+yiI/ ;P^1^':mi0ˍ&7f٠;$DF W:aI|$~S%*S1WX-~ތ᠕}*A7֌G@*ScB]|>OV+0$1"3DBlx}\8oڍxr)6FHp'覜|S CatS2s4tHob GlD"״ r4?Lb^ZQ8LiӑE FHBӆu #P`Q_aR'^VaD$_4ϦIc|^BxԴ/^<_%O^<ݰ)!btXҽaa#%0$"(D_o}Q19_ n`4Ln?Gy\ /7O;PYA;4M`?@0#D"3)ifQDEfgQ9',m :wfTcR܎Z2CN7DrdkY0H֨k*"rxK~z*۫?K{1z%6_-(18y0QHt1 rӦ <yg12XN|S2`)Mh6 IYZ &ͅVI.|y**h[[?n 4@!ΤPJҨ결*2HؕZcWyR9{_|2f|eSqv k`K2_6o }_5$RMDDS`Jl`  ,,1, ݨ^djxfyʛ 'Zh%:vr;PW]A4)3u"*q .| t 'Cي/*i#9rwTkb@r1D^PAݦo]W+ J)~n͏{{vwj|E[]|6ׁj]Ɓ͠˼.2 WWәP\pNqA<勮!My} kn +EHA.GpŒjc z`SaD9=j*oPkhX{xSevt'<*| u-ƉWwA:YXYeW%*Հ49Ln{(Oy1K5T%ZTofP#SI~X܌goCva{Y1F˟\*{ sL<̖Ԭ=jyu Nd:(>^ | WݍsofFT|^ N^ ?g> 9W@F)< xnf_b3TH}oEwg>A{(\$[qCΐT RxJ,9a{0]^Pt8Y5.at}V:U:0u(LhɥF[< g+WtDy-.s`:e͓]ei|I=rkwoIU5Uu :>CZʗ2qg2T+X +rϘŚ2+hDe ]鳲8$N3HmTh}_p Pjd@tᝄjKTJ]$LXQs㳢nQksIcz¦=6ᥓqVg0Pϗ哜3 sƕ*ւ kE7G5SjX=%f=23C:;R$d3?U878KPRÝ.Sz4AqJ[Lht󇺜[>rAQX>rY0P~(l>riH.YdڻTL_aQFo $Sxq8-:_o`^N[ģ1g)'BycKyL}:2ԡR m ijC.,Kãqj@V0-_L-f;s)򻽃7=ZѻESZI ` ~dٶKc֔vdmUmuތL84I.L[~=5]WtPRO嚊amF<zKbNVYU:60q^/KI1MP€g궙m2ԙYX-b};< ئkO)2hPzgǝ;Gh\@_8WZ3z4.~gnOMT:YsN$c:@c:'6)*C.^K4Z.?mwsdSS inE合aifuu  :m[oꁢUTyuL`q$ :TJVԭ,5>ru.EyL,wύUR+SBGIc(fR6.Շ^t2d<=0צbdd&Yr4)kAŵ un2?LSxecW|IsWgߙ295l 4# QqG|yfj%Շ\jSCE cuCJ%?ͪ)`|y>ă\RI?8$'NxnoC7"8S?r~UYAԦԿ _-V00>RT$9O#(@^Ќ8aDB`E"R}L(Iu_xcA_t}!K;.?c}m26^ʿ; LΛO[LBNn('gb\Wmz\.*RD~x#otg9U u;:';Mp)*vx?Zbo rL&&S=C?׬'=5fM Mw2sX72yLpql6RV":lDq{;8Fp*ׇW-IR`CYs}6c?xɯ^v+6}F"E '!WuI8Ilͨ︼۷#1C 8<!Z\}ߜ]b]ff&nC/!ǵt P>wdIYuD.[^q1)gdȺsķ2 ܇v;kIz|HerCߎD3UW bTH[UkdLoT$J2*J LNK`E*XW]P/s9;jطN'4P`ltTPĔ{Jp SםѾ 4XjE{H-lQRZB_}`4Z+Y;G(Lje5w[I!f׊Q{8P!ȌP[R"Z2b:s?4aGQcD+35*xS,D1Asp$88:iWFlaG4'TI3.f2cޅ*bd6& beJuX%Eم WVYCUl [xdfiCZfx R+C,"qFL=xT=Ns$e~zaܜUa.m+j.3-~/]@j YF̪W1l~|cMdҢ$V] W3c;:oILn0;?3Qk r PI범!,aC$6 ZQyחn^!gsYQ#ٺ2*˜2DFr֌=a6pyGJ2|tQiR}ZܨOaUPޠD-_J>.Ыɾ"}ԡRfJi6l^Io~aҚ;;;?av>y.YXX'0<; ;SeQ8!0Z,L0up?T+imJ]-nj(I ͙"ߠqp6ԐMvȪD]Dz_UVޘzJq9L$jgv<@8JV/znL\Q^}:7>?*UIaod("n-/k4RH4+V5zen6P/_03VP00"PK#fuy]-}$2ƞPy0M;iY1bZſ&Ch< dbLa.0pƵ(^LAja* Ao^@gчN^]yb[?W_?վV)> x>57wʳYY6%d%u̸!bͯ_ˏQn$"WFci.º+ 598|u1=MNct^/c Tc2Z.tTD]90u~Sj4o97eecU,~*LXYF% VЛ!l2_;K9h PL-KyPl쨏6mTr(jU":҂*og3%X|~X{pL Dwb냖wGi%G؝5D,g;#,p+Z3B4 3ƃj׬Z!3{cx2H|!i$ ːH_` g1p@1/8O)xYpNJW1ጡ,Z4-N4a-" XŬEEf&+f oI-5gFfJpJZmnUe\Ag^r(5@\ fxT[^P2.kW>a߳L\CD^эiVU Y]6S/P67r"Z2 ?-*yD 'n+_ppVԈ=X2W1ԽΧ܃1f,|#MR!,).% ̾fNP!AGof&v.H}neeW@[#OFsay^l_wMJ[k3_܀(#ieC eoQi\zgUl'!ZlpcrdƆгc2%A5#2: +ZеH:%kaZbxe y%|YGA^c ayE/a|Ys@HVGꋘBRި#ҩ4Y|z]֪ـh"{9R"xC'T7GÁWu$}R$?crCkQ79f{2(z,XCvyׯ3MHAV8iYLR3V^\Q[~XƣRnxgDDtv>liQ<'9-Qu(Yc]F2Y|ˢ/m0j-Y,%A //vq{on6|@:ۢTyZj($ʤGuFRvw[$On^_R>J]g9e(FNjf-b/{2ՉMv'9;/‹%k(Z6(Dŭ߸_ΞUW5c.":w2::Oe),p%_gs&,*N[~^E;C^pC&%tFأ{jmBpɐ=lw`M3`S6bem#ryp'Ê 54bS&|!zZ0ή؛ih4RIEن;(̓N0*v>vW)ub+瞘auNj{~M'EXѱWJ759I p3d:9CW^)1wg̙e"}qKƈ_^-}qYigaDQ,%@oKWnQ f+3}y1vE}>3>:jBkzq3jdVPC))ǽ/:SlO420K/L$TyPP1,ŧ*UX0c }yEO Q91Ƭ6e%aJŖ AIORy> 8C5T@݉RRv;GΨv9)7 kIєB v=x-T;j<*oPodwGCץJVwv|]LFf??:t%.Rɶ⓰(@v6L/N ;uQWVYkm|)œ B<=x!A"XCjjTp4&ЍE]'x uj q"sCҕf?M0fH"sC ᜨMvAڝ0a #L1ע/q< 3pA$֔/UN[-c01z"$8ruSٲWȪNl:GU= ʕMƁ٭*B*Y&YPz![eS aV /R@hI7O>!G[vr[hrSq&9c"2RR*^̕wߣc(yn?wZzhH)3pq5α,/[z} {^Ux 0ߪ,#sMTfO8a4[ :f]Aj_g<6޵_hW.l$1P;nZ |1gί (;yn RK\X.l\S!TT CbEE#o~/f%Hb@.J'*-$'8 7X \f{' C 4~uC$Ӑpp8HnLEԿV'6Xؼ(]u f`̥-ء;X!! ¸Fj[d2NC'^qdZtzQ\{UB68>?oPvzU8NOBCF1qQ\1-43֫Q)ExB7gݜYYobBc`e/k`|Ťl0o1uY4\E##-ה}ދgGI'l8MR<@Il-[mebfy8,ڄ„pkt,~:%q٪l$f)mɄ J(R.aP7 6Qf@Ÿ(؁|^*#k?ۖ^5B n~OXQt(ŗaE.@ٟKjȄnyFmjv0V0I6d3RN/fJ`|N:\ջxzZ_(XH[&k@!'CfWoqpjfĝ+mq8tHV+x@Diuw'݃}vF-/O'A!FQC ( O:N_j2-`[AI؀2nt9bg@gՑy4@2-}!-ykeӄ1J9)~&i6Qj)GLg&;qO#:%SQ0CEX׵1#&ݪ&S1lC0J>Bjf'h}Z8ra:;.JۢDȈRvfN$p)chicDhN$6,XYqkB}䓆%ѡPM ss:YJ?DJuh4^ V Ղy YENXLUyT5LԬT啢GÃдcNǽjm6r[&ʽc#\ 6~dv0Nv^Zn\dPy35$ "ʴ-~]7k)GS6t,(fKlDΞmw+GطUq%|7o褻 G뒶o iY/\dK;eKu5R5txO2oDh+{Xv,\S6坏'$S.1Ox#VfvNWCwjþUv3wuX#;^4?& U76ȝ hUk+~ڨ0(3gU8Njdd]ȷ$LŔ17^1 ]5E> fꃗ,3#]9euXafar1t~\4ר)mϦo(5D7a4ANV?D,9}s"G/z{U7Lު] ]] Q 5s sB$/.>PGR&QLks+]+kq/6sw}\ H(LCL*'˳=====q5mb g-(FUҹ_Paxp2cf1|$EY@MK劺G0'Ya#wqFMg=#<(5Q"21ҵةbTإZoLWd;m=^&C)G**ܖgh^\Hr?L-$t$Ǒ4]먀Fe`iQ=q`reNÀmE.FVT^t'^P) ] ͥ# 9PdNUJqS,О^x/}[ -" bRsd4;wՅ3.)HT{PoxjU XW4ۂ+@JU.Y/h1it R.eU_J쉷Mio aUh9/˾SACiyn9}(-ϟvoU|Y?wnmB9)FL-ﻸqjRk,겞J7; CL-"S kjŁ_ܰ^OXm/Kȋd`Cȣz@—lTOO(m7-a˷!X !3Á էb+ZWjݲmAWP<}tѕpkG׋,ƪ:3D5V|5M{7ZǨU‰˨ qe()mH;muܬ(rm]_tf=6z>P mmgɻN7{bh䱝{cz҅{ "5zb;qJ'' #Ԫ0Qyӆ&oFr<6LGS5_:>igKn)'JI=iZ2|_ܳNt) GKw|{< p'܋d.]h|h4gϯ~@_w7yW~IưtR7nmyfAo3!^MW׋sWb װzD +y`_~S78Bb픫Gܛ)vָˇBڌzثܓ<;|."$(8-P* aWլ;d|8~ ,M@0q R6Hr]"-cVjx 88u_t^Y ^̓ D8j;TVIS2,Lfwnhcޏx~o.MoӋ[K,&-Y)T# @ ia!b L&%Z7P'ywYv D;Jh3vƤ!1-x|lI: $Ԧ65QEnj*a[XC;grr8 f|&xP}qDEXoǃnMD3U:*}l3 nP—=|A|0ߐUt jHC0gkWu 좴Hx|qVZQP3|'R+ +q8'y,i1ݶbiW5ˏR#r^O#!8N0bvcXA"V[Qd>i*4O ilK s"2 [=-B#W'1$WbcoF қrj z¹+zRKElAT[vhn9Oᒩ9[(0/liژ0x~B@ LwNe}oڜƢ%chξ0<`cyZD꠮1ʱm@w,e&v^d;ww7}bp۳l>״̶ϏN}Cn%٫z3J):Kol*O|7MV%M9oVE{ev]N_f>Ҭ\rW7m6|S"_f*/s`Mή =GZA|EZ 7<+Ӌf16s&jd˪n'i&+26J/V4By-mQ[kmZa04ImMaWUf)G 0MNy=h$ͪU:Q- +-p{<2Z%I.즠AP'eզ4d--̳|a=^nQf Z@vRW .ZZ,9bs`vi*| ZffHw5fqgndQ7]Mfe;l⧴o$Q+:fh|E(:ã& qIz-\`xOyV!MxdyzTUʉ.Fj{>dorќ^)pݧt.k12}M{-=5v.$!fU)neENT4#f>3.W>._*wɖ޷ŪA+Qjܦ)8d 敷s7yR>:e;zCQu698:Y#S=HcL[ͫnti)v[m)-\ x$nzCmxBtUN) RoW~ tJ&Y7xoA5#YvqX.ݢy7C%9~{[3T;&DjmGfmbk^m 6%_XZS%-mY]T 0HH&xt46^Xr.Pj+E[p[YY7+ vj;^`zQv/Cl]\^:kKaE.r^ķk:.mjaf-#Z|z9Et@,DVL6gZ]ּ3$k:ntkJG[9r-hͷQt隤"7>ش|Oh"mjpͪ?A}} ή6-wE0:[^ jXqoS1y&۫wN" Ƣ Hsa1wzzIKG~զPa?.ȎĞg':%M$S~[ To-vwrmpkՖ:Wg D_/hCީˬ1^vt>!]UM[fײ kpHxI݈z< ^XlNuEGw4^b]U } ;r`QiB| F+ =Xz2:b;-$Дٮ5Z CD$0d"^ /|lf؋"_ Jdȭ5#u L4櫬~v 9MNău,Cqs'v4'x pNA+KЩn;fAooOO"OM,޼s0US`V!\_]&*cưm`h"vDv{BW\9\D#fޖHկὁ慬&'rwdWv`:8oW"D mekӔ-o9y45,X1ݳd]V^^<,H[Ukj$Km"s x>ޫbe!XJ}Y*s5TPMdrm %;QI+ڪ͚zXjJ?/.pDX!}]9:S~q1b_oߩOu:e<悁_a}=I?;}γQ,n/yhԺP=(ai¨~Gv1kC6Wg 1 ͅDĒ+i7Jryv7W#.olF NȊo]g5IjHdb тtT+,pu-`v._@̃ΔX4&wW/߸Y~##ޞ-,2ŞoZ'2I[rd_̣+`B8o7f,Ŏ_1+g:n)xNS9xxK ;8~uK,vwE^QGBX"QFsUN^uǩ}yEiAN3'osͅ«4ڈZ\WEi/LW]dsѦ.&I!9n"iz4{#snQY.#}y3ype"&+YWtp2=KO=+Co(r#TOSSm" z0v bQ3gbe8F`[qa7"qgxdڷO} QSO\.1P';Mu՚ )#+kh h?=٦௞BA+cQDMUA:ks{ #i>'NV~tZ!k} E2_H*QR+$1c?h,Q{!Qb<̓?Nu D`PKyޤMM$-}x e^Z-$ؗUu/p\I33]nU]yV:^[j|[".ߌh::1- x0x3:``)DH MKt%; Q Mleq*8˪v*S56aүi 4qS1ER/E\5s\18 k+$Kh+mÒW9GQ:I~96ؼR>\ۀ<^;|y Sn2~u>(l^'6]qo&?Ro56j32%-E^n=S{o ȰyU_74q4hL'>Y/^:'Vmah!̫%گh8~5\)' Q=,(U-"ji4zY}$by3 i8@@MUF 3^Vu!9 ȜӪ?lBuM:CjӿXꖴaĭ9CvH|bV`0&M7t|INE¤.  'D{lk]δ(Y|:o.j#7m5ю]ݮqЉ3ViPZt<BWB|Y}{dcIyd:vSpXIVas~l 5Nk f皆FoLKsME3]7*W]S>en o\rQ#T3ē7ZT(: C) 7;7~lfnL%ºi?k˯}+C6簵˪ZpI {v{՝ q\t/kC9.Zw] ;Lw/*0gl&͢{#3WqmVEw^IYΥbA{~[ pW[ (A,lICB3@Y9RvvSqzP\*V[8'D_5.B@輛 j6حQ4<^y:5dU6ǃz7 3SL$8kBwy[ vf} BdlLэS;"|,pzd*5\G)$$@لfL.?-4,:ahXMe6 L~ysi1okD L8,1.oΒ l@nXNVlE^Cc$3={k, 掋!HȓТ- آ؃`48*ΩU~CB"E,jF \< o$#!ءN8gb \3{w¥uׇ`[ꍨ Fg~wͲX6OOBMT1#nt mRWZ5Eˀ-Iv%1ݏm, [WJxvGBo.)jp9`38{rbd4ͪ+T+RG I>qKbф%ޜ{64˵/7h"g 0ܭD}+[->}$FQGcRΝ8% - bE Ua5uX}/袆]39H}D#ʝwZ qR ט. @:=2%x< i$bxAM1WC2Syc$z#J򃷴gV[Z}B&Ҁ`K}n'lPxMX;Ixed6wti碀;NeMرӱ^uwi^ UqIhqޜHR^_FIx-Y挼ҤaӒ!ÙG2! aB <Nf݊56f :JT:OU`H?~鶵8M|7>8 bΤR.($}9KGiWc8Ի{WNCךJ&8.r%sSlJDs`>Y}٤* O)nCf2ܒxD M\7 "\ :Xs ,i#p0h8-0u"}i;:lJԙD]gr"D|z\4\>8I)BD *,$6\#~|5 M\fgw56A9r,g.$'٬'.:R;lWFQB*;S4QlC!OQ_SL͔b؃KbS14Zaj>4\tvPT^đTf0c`^,%Tz|2tUd̦ӱ J04-&"vZyqJxA>?'N#1,ֻoXйa4fϯjU]jh$CD@2i.{ |-/ ߂V_d_ n0)atÓsآ˙'ob˞YDhZ/138ςNYW+Q褅؜ (hqFN U6OQ~DKoPzC􄯪R?g.Šz5vkXqL;ڼhD8V 롩{Э;Ȉ_`iҘؗ#3fH8\T|~u2| ً;O),' K&v j7pǠXH_'ڏw׹ T^hkU`5ϒSXS%'ɚ)&c<\bϩT T3s?n9YO^Й@X]ɬke:fF":b4 (`fЅ$ S2c8jm=Z>58ꈪu4ltp-YVCy]D 3BXP\Kغ&[U1'i a\Lz ~/a_sf[j4!jwՅ E!v.8I_ІV`>xa5K5m-M&6ӔDf{E#&*I f*iKlu!*G|H@9VC mMc8EpEpBMTDdQwپ߳$9dQd;Mӿ´)~",낮TX2Ebiic)}U')[ +\G؃3ʼb$wLub*W\T|Z/ׅ AOc8HƨU2OB.8P8ctk{q %cM+H y* Zi\}ќ!#OIKXg;Q@: l:rOCWA h "IXpPĐ",9˨ 1_iW@oRïq7Bbi6 h5B W12pm[/}h] SB+=O>{JqxOO? Jj+lgz#o`H VNPUd&wmdnXECk u\VOsZ8EmA8/ b̻eU[/ H`He 7@q"lx&WӡlJNv;gc X%γ :xjLI M'ZjPsE(fXjZo<Ԩ o9X6"wnxheom-|9R{0AҡQ%'&q̺93am6OUd;\R-14#VzdXSlI+("jdg"=sJhbF;V1pQ$2MF}IpI5hCLA\sRj5pWFDLحluY=?KE$z2X~&uxP$b@-hv&l!;i !l_+_%/Ba Vaԋ}L22 6f K掦-2_hkgz:UBq(FA>LX?"8w3 ["Xƭu'e{fLVyy %7xςg#8HwJ Rs| ՚/Ѷ[& z5pbv, OG.2\%Y,$}N1ɟOb0?cNe9fVka450To[c0X$U,$ykrIh @er,6 ,(LH eVGBﺺ`2I a6Ҿps}ɴr\u2P~M gjxF^.[F N!2J$b2pӣ?̄-VעY.,Dlͳr#p"7;*[r[ Q;&$m;~S}!VZh}M1|>XO}236WlW;!)A! , xa d6WD,p?;+aλSxvRUf v=`%63s0뫉|lc AdsiDWxǽ/rEW[q]F1L+E Vբ.ql% cc; CܒAM!%1Jى_6v!i'>  s8 9"dzv׍q t-ԫ~V|2.~52WZv9~2q* ]2UKn]ܢHj W|qh6rU)RDb2&3}Phgf?YnHd0VՌ/W~qąq?2?w/c'|,=4Lw*'t|2 қIlݐ=Ù~|h=^$sl ó#-wmr ʒr((h"ߌI\ \cWNGOʲۏ'K:Y2c'QQX9D!6.jS#@"'f "gv%##րoNwwN~_ V85_QsXFA ADF5}/q=[`NG@L]#;\i^(KJGexY Id\h7P9 m>BL  'ZF{FO/_8p_S||Ոi L."jen lWm\ =/ןQ{jb&G|9rpIHCp31|3#mqȠAxĐoK&FM)ڹ(p{[ng]_Q?mg xӓMsǨcn-·#^rbd=$^_dM]fd Vבk $ srIYn"5>WĺWws d3sn2͸ɒT0)HI@XF۫jA?1={y|xUzGj*uf~T+F( jcX[~r澠sSGG=bў`eh%UM{Je.F{^AQ,Vit (`վ[F,t+ʅ!BuT/WPfoo%Z 68rsw6m%fγ,6I0̱j{vNˣCG4QVIٖ[dyx0"Η:=qjB]3_ALp ؁Cc9zsAKcQvrt+ aI|LNBpP?ZLbcD)T1|q <ʼnO3F ~Kj1hTGIb:纅)s8x]Zfs\ߙT] Csٸz%~pbg$Ji0SLx $XE^WI>~»{-W RpIWp E Jݏ۝:^NvlC[C;JeZɂC$yL'EEžǛx';@,tYN487q}76p0=Բ[_%zzM5 ZYGVr 6B>)k""ҫsNFh?vtje$9 AäUXeM-A6lO:v"JZO R-ahct#P`0NnGlA)(|˃[sAʏz;|dN6>QO*t&ː#%BѠm+^҈aca8S>ܬm+0 -ũ~aBA7MSOhS[+y0m|R ^G9٥QN@] Fc%7Z0܌E\g;Y8 $ )7гt:9I/&itӴdՙ5mg&8A F 2?'ʨrB<)H{Ee]jsq7f';r(M(w,??na2z1RVbS\|z*"$ߖ܁`°;> g KgW쬛꧃/рuy+Jկ~lq&.x:F} J{SMΊjf82$ 7tV4-X%kdRsk{ su8@n54BʠQ!c$fClta"kz/͓v3%3L N XEiC>_r2˱,KV]3ixf$RhľSl ISLZ}D3=:^1Xj&dhx&oN$~%Ƈu#Qfn/v`A_5=#`ht~٩aMHK_q$]əX*|ހF=šLDT@eߊvxoϑ rNw[p^:5L* : ]%;ӯҐvWqk>uIPs.za;Oç\M;K+M; 6#*&%y3R6[L:uez=нJ۝~O*v}ze H YA {sdu&Z ]3(π*K*JI#r:t%7;o8N 7k>ibIĤ&8q<3TgdRM娮'de 9_Q 3KpsFgTؐUuj@6[y}W| ҕQ",Kn9M`EhY^g?=O;D?;7EcOrNCjy|SrNG颠?:4ߏi{h JwZx:0_3|ÎXVn< #JwL&d`澂t2(# aRYbdOpH#5wg>?:w/ޝNi felWoX01zg*%[_h=":+5Oj]B ‘ELUn/VEhpVH>WU~b!nI؋SHݸgZagҩDkkꅋ\ _LK4 EI?-@Mzi]`ˉ2G:ȩQ#ǡV\\6" ɁnK  -q"-` ƕzuLRgf[ty*0BV>Ek]ySOfPZr":j`4?ټ; eK[:̲*  f '-F9=gMᩫ(ţ¸ʭO0@.Sx3z n/T-TK\si!  i/B$Ť*Ң"Ymp .Lq۷Yj52Mz!'K]tO\΃%՝zIb 3.w8ŝV6L#Ri!鬁9dJJJ\`m&%TRqn{2K=тXd!zp.Q>3!H67֊n'&_>(_ i]` a%`b Ge1oεLlz(uiqJ Քbt tAN(OLw]! PM4+q#AV&Y՚*ٰWǷ_Gv=+yVklGp8FnaNg]Ad4I_tŋSb=O+Zy;nhӾY(øL}Pu46v#PU*nYH8f]Od&VzhYKW+ U,}Bb-2_H/ti)jlsa"MK NLt^jYսL1,rttr Gґ" w,s#k%@8iZ+I@޼p|QuԡwsKvrH\8>@IgLw˄o$0IM=nf!\' kc/a"e0YRʜ $L@@mt›&έ]3w`f"Z@bp_mjrs=Aa,.BͿ_χxuiz(rي5/7YMIn)pqes'ۻN7:k2 6jO)) 1߀oOJHp},7UzzMH 8DT\D7T:4Źtd]b4'1p(]tג^Y-Haf" :cDBO€; }HiLN^?dRAh |S\/Q$ʆ-; USf[pҷX񸣐9VF5a0ߚXa]WW\ &)6 &!ԥ$c&;/g'<MUq6q9W.6CY7J;7^~V&C;sE.gQbL{O[$ ;(sGID$ѭu6BPc VVa!.Gu7!$4+ ٿ}9]"߲O qxgŽby-V\.Pf.Gq$'@t-]5{W4er'RDs{/ͳ\&B߭ޜ?s:<\z7 zD"Ԋ8 J<#? 0^ž 2OpLW/B EF%}&VYXp=hCַu&aרKovu@!W)4> ,_AKdpdUP) {㺲QUC\cʋ ~mysA < ٞgKLe0 kpqiW=vzJxgߧ;ӯM{ άĀIE\yh Kg35%령9GW5y"|!mà!+{0n-{Րšx)ctϿj$TO].嗯v@S^GSZS4"BE 7*[eCzrfN*7T1y)8o8v'rP*_l^eGI[-lI\iZZb>6(vdӁq޴)}#-Qu4ԟ(;+=a__Tw?$׌2O ![B_mE$X`r 2 npr·ז(;Y˛>a49՝8R:Y ̞8ak`<@Ԇ[! &3;% C\jU4'+%^vHD>ߒ X铟d ~B9o ?8آ`C$dB5l7*sNI1o> |AfI}q\gjL$ El>J\ dr{X,psf`́ =D\Q9ʃ 9]X".VXǬ́1dfJ#/ R>#ݟvot!On)2lh~vL4I|5WwW"ܓ[`6=k~o+@H|_⸘>p|.\Bs1ErWJ9Dm^lLًJjOeZ?eXa#H63v/f]tO5&H#G,K|,R-@*^QN~#p1CW#נ[Y4\̠do]U O MTgzىeG޽}ixǃ7gVˏώyVmZ1ZMEp D+$/D^mzˎ!+ˮ@P&8E%ϰ!NKi=tD!^VgR$D4a)+t-Ah0bA5n)a !fC !,> 8IKCׇS!ڑz9k, F(,H%N96< O8B>, Êrʠᄒ;ďe)`7$pJE00@ǮrQfFNk}u0bU]\HhF 5c!-2m?gztpH 9+ Ъ^OF +Ҏ,L0|򰵶.&rb01;HRxPI}K՚%zNmۭEK“v /pX& ,#)ޠ'oI%dQ2ʽ՚,Y vH,KS+rMx㓧7c)avps,@ i,~ep gʕ+=4.L2ՆR!Nͣ/s-Ƿ_=1CiڪsUk঎ۖvXʍ(Br_le>3TlRQL}a`VWPKńT"Бx·Ȍ>Uryē&0'BTp?|m2kpWVn'/el]l Ϋ 0U~9eґ,n`|ٚQ<*84Cпq .  qt?(edɚ-q5\B{. 9h~m\NN: xc4%ިA$Y.6 ,GZI $P@NV;![D%HTE$l/Ib.z.LE9헐H!vu BJan 3ZW5,$"wg%u<0 (!~:bq4* r[b4.& * )2> QF%O-D83nWJK~PBXk^@!XHdCn0#؛;x3ԫ~6m:ZTƃH44W؀vLz=JTiyaO)ʋZ1.. +r,?2ӳ(Pv[ O y z/$qGf0 R5PW|IfJPmrOB,KSWAAOYs 뚃ں{UA-s|ǵ"-X]R#Ra_!/$xGO5ʭ6Q'S ,AЊ<ڶ%{KN|h?\ѣM]HU9m--:jZ?^9@=>Nۙmeo%|'n:E|1*+"$=̂*t/%l37$'>J)\$&]$ssSFALcGkT_cΊnfY-2Írp(2j71* #|'b;CpרYj\A!%u\4j?ufy8O!j5ѝ[Tx϶tL)]")QՔOR/6\\j.F$?Hbڸxk.sfy~LH&źr#0(ֻsYdCp=t}g\.T[UZpvwKBslv͌QFA%[ߗ$P_Cwٝ*Xd+.V-6CڋB Mˏ5FU9DFT[FacVf>HMic^|W hѝ @mfKI0<讍99ԫ@O\l ?W?[ZgJz a%0]G10B`ѭlN[aYbZEEJ~gtJ.tgUL&13.,h K>iO2 GE@q5dl`ۍ@jY-$ bϮOM29NȢ$F7E]rwb]jqۓ7~~<=]~}:9}}%^: ;K;M4ߟI T)EjgBu&=9zCn8.B[smF*h5cфhbNU>s]f{{3\Kƛ')ttf7`i{@tB #I]H7dg8|5XObH077܊"a|[ʷkE4 ~ /vmҰfa^OUSn=f.+.ŜՕԔl-_7wHX~ɦ!qR|,/4_q1t3Dni/;ōƋ5x`9-GfP>?K^-h$JhTU9 ^yeg5xH|K˾ JzU>qEA&¿,oe{WOw UBB4L wm& k7a#ݫtpAn_8\bbFxVD9R.82o61Ux{<_߷9_T~ϣ/$jwA3@gH Oŝ5) q)yg=';}?&͛fZ36νa璭Pqf,Tī4([E6_m۬z3J䭭:X?7 Tjdz'DMҌ-ot֜["SѢHU%[|Hu柽4*^emE;}%"N@ ▢qIڀ!ڵ8D b.)zp;?S| Ajء2pAޚ r /RR5Ffi3ա轠mPq3>M0 XUo`xNi!A-YLoDMƊI˩A``ScK0XDA#$hhNȴdb*9֜60cQ>ݍZabkј^e-&ZlnXw*>l%,"SK;]&G?I}շO&3jS]Cn}m)*W[zR_fR$E>M9?=:J^ <7N&i fZ8hBNvA} p,>:2* d 2PA)b?{t 2}ZtH&~xJ70G )WuU/)WclWY}C{?Y:RaD3ZyZ߈C} \~unB &PKY*oSPK}'T- __MACOSX/darwin-perl-deps/IO/Socket/._SSL.podUT uRaM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKO@!. darwin-perl-deps/WWW/RobotRules/AnyDBM_File.pmUT  xP$4f.p"Q"ְ*J\FAދ,캇&kz 8A.q]=Q[{ R";vbq@5ZeGnZ*S 2iʥ|uHtR)CQ=]D _Se\0!H_vjkGó+TY T:B)o)g`̟ZBCevcӧrw0Jo 4T&ׁ]'1Z,LDBϤ_oIw ɗԬ \$ ZH g[L|k>8⥚1d:Q')pPdvg%:՝{ l"0ek1Xb5 ZLvռZuE:Ӳ'QujBaw0 |Kk*o]`MTR"uh#˘e-8fׯ-qY -b:Tby,sޚUމqVv`;E( |@kQaB58H,|GvɮյGmз )\ќ-h}; ;t_qH]_} G~W^K3nA즓0uB ҄q*vcPKׄV ~ H}tOfp /W+ JK#.ĊBmdf0?~FbWnE/`kܺ$n v0a4{Aϣ޽·opJ?Ω IA*ޜfBD,9a8O{1Roט?z:b rC"eȃ I;8p2LխXu0q<\?6ɼ%gS"KA$T_Ӎj慱_BgC#|D qkVB/,K\i 0{܎:4Z$\]V[0KHr}}yp8mTkE7hKLMPP|g4f甤`vzyޞ/!z:MJݥչ]]sI:nsg()0\hP`34Cمpg7[!=6GRua LOV!`x4CodoC{g%v1F/ ؈ք0WB)QVD\S=: yat%jyYAPI8?No0 pY4#,S)~Ra]ެO*x3r[N×?vZ9K9J位<,RؼΣ~CЇBG`Fْ9 W >VII=@E~,,(W ,*7%W%9$/ cOOv_!rjqxiݜadp` \JJ7 <v3PDto/!` a[H ,!ln9Ew ֢dXA.!XN^E)l2&]*O^5-e(m7O<2r\yLE`9\TA. x2gAa.$MicR(RFsGN s \ ~('ttۇĻ\jr9Qv]QPwY4gv @g) k\d1OqrV Ys. Q q"Y׮5x$+lj=U,Ʊ!IX&J= rHc2)#1 3Ibl־j^&RTNRUF8i y"VfѦζy6byeHP8V0~U&ݙ`ŗJչ:"1 >"?4Z%cġ#Gxsy:vswn( y^X y; T ߼eNx^jY9 ?+aCjq4GQSĈ%7R.[p-(:َƬ @t.)'4V\]H\S܊R&g:uj]P"WRK0yN\.n'fsѫ DAHZf:; m}JPu磓UFs`>Ize#Cm*NgN-6V9/hΒ~s15<+X8OswSsX962WbfV tL{{:g[cAϾb*4 5Ɨ8ЊI}ye5Ĩ[?CI>t8%VAPMV˯@_[J#6q+|;]#2V^dq7vfp!Sg$3 oZEV.#nħq_'ZPJ"r}ʔCG_Wfiv30Etߡ9pވ-oSt@2W4rpQrC>ej^~67-UW(L1XժKV6UWPZ̟2Al_l.m)▷K}k4J%p=/` %TW"ڈSɓ#0s&HάSn飭Di3 P۶Nlٲ*qތm^3< a7HZxro*$rNdvўyŮTx۴Y`UE!ϹR<[dY;m8rGlE+^4ZY,tb¸m.6SiY - po^YjtܠN>{bD|1_ӣ64 OsO:c< P@,j0|r+A uj@?a:é@\?W;(E%afv{Vڙ[R]n"O:Nm!ObneWAAtT|bzK(,M k* +QՏ\w޼K;s܍_T&~7e¥շ(ޒX լ'aZ_ZVccEEȳ aŮ״M4_EO ?Ā˨%#rF-1V})8Q%΀9w %=HMԑA5>?}a^O$V?97M>K'!w8į# OWV[W:ɯ}~Q$-抇cy4/PM/L5]KjdU3# ^Wmr =됦8y}vݺi]^HzQ7\&I;m]tL=v}V'7D IH/C_&E/z`?QҞ@{P# r@z+QW^sJ <}wGwnCy[M~rCoDfWĻ1"4pR'HYݧ]>fo7698'g᫒瘣?T=) vwU:j~ 4?4?jm\R$OqWJ o[EjS_jG qWLV9onY /W#Xv,KF(l@s.Fp+n e0T:w״ŏZe1H-TTQ:j:F!"COǝG Vd%> ]&u!k(T9` ̩Q?fɻݝ `C@/G P%dH -0z**㠁"My9 h&L2:<YpW/*A;*IXD*L_:rrJE&D*JIqw#YT"~T?o{h^*If,I|CAWͯhwghHH I**X}.3֏nTx:k^{I0:Uŋ}矩몓SH K1Y4 #EC1H'GdG`(\OdI|OsM8". ?@h(05cJ\ ;n6e&|N ?PKOLPKQ5D, __MACOSX/darwin-perl-deps/XML/SAX/._Expat.pmUT RM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK N9" darwin-perl-deps/XML/SAX/Intro.podUT ]M1cL1cux [moG|+z^Xڥ8O$ۈM84^ Ѽ {^(6 ,r⫭+_^^|yytmg՗sho6໭}ژWJhHh ۸=G9NW!h}#Ėb-״/kgY]DzG{ ו]9 7h+ [4U9ٰ~ή}Zw\ruҾ:ӹOh`J`]|wG=VY(6vǭ]Uf[UYVL6;Εc|@@.JG1pwn߅YS' [8_%n(evAk?: ELcpbb]T4: =TFN/h)i.!56ObR;j_=kx>qE';-hVP짳"BQ"mqľ,]뾶6Õj!5o݆.CmM[+[Ʈ>Z)Ǡ;rqfyEi-oXMC024rkwh^L6Wȏ]`+ЁJy@ l{Q,+֭cv\lu&Rߝ\B{RA뛢l 3 rK4vvŗ)#smSurhXABKcXB6p"2r6{Es,%L*jݐk,é ڜ>CH//]QFVM/53}"`!+ '`+ִ]Փ}u}V {o?o9zUtwbm<}u%̦ϔ{n #6TTK8N\q]Fd m $`ĭNOy f]3rv w 6# 1TŰoP߽vE\7X"";ov~̡hgvciTs"#=ǞEX/j_LڗҞ`Gq{Ʌ^]9f{Đ=\;҂mqO/pnTr;H> ᠡ$G)AKC@PbP jN!i_1%mA=Nu 他J&,iX|GSH1!|_#:AE _9KvzeGx6-qA{7t)9?öd3 M9`RSS|BEj_=쬘>3T <1ZvD=ADd5b&9i%9#\ w~.9X!0CA@6TYQK~Yc}uQ_+3xu+hcʐfU=D- ۻ7BA4 h,훰5yl zߛjK;7-kQ/#Cb9 Wn]u7t!KڨUEY0&V}SyDK( hn75Y]S jKri)ʱ&%Җ=+K(Z 76!o!j0!$L=ę=+6c +"ln+9D0K3]FW0h,,C?dT"Ih4g#]8┰y(9O*ga钋ۘjO3פI^HtH0r'H&\KQKڮ<,0LhEO2M#g~PYe"U]p~0lrANe_E(8nt{VEވbA<р^?O+w. ē}8%e u}k:kߌIH7f*Hq uYmU,1RoOYo@gcӷZcE[vm5fC^vTC`-Cs0lԭ2B9Y~;)ɥ~)oeRS( +:gNٍd&8$H@tL=41)w(\7) 'g#i{1 iplCP{߉`h`[=-F|auvMU f!њv<80}Tj-&Q*NPD!3v&Y 8$ԒUaұF$W63lx6AOn'ojoT4JC\.bPZvaq(TjZ)Py<~(Wu׮hc84Ji}PGl:O)&96RYi+NFQ m[t, =4lT6)C2쪹Vc˚Wjw_Y(_<¨C;350(,Ҕ&ic+V)5qdgO2ù B]9B ?Uu8EWKC\z׎.m@.YClh>\HB˥p l`7P%6V/Q=\m?VE%2[~GmĤ`3m` K:@PV҇F1yYh"I_ ߔu_):fQwywnLv$3tUIr˕>#DZf b [eaK Prr"xFKyj@~+4=iCÌNVȗ_O_I6tliۢ`z$X3 9~b"~A+5_x꽢b뽣t.0sY7aɪt|?iK_najNW祲i3'sj[ɟo;7=2|Jp)p߯//w ԞJ{Kb\SGbi%i5iKW6%tVwzY2Ĕa;Z,mA:Qs) ԓȅu tylx\h) ;?AJkUQ Yvմ8Ўx!H/?+xu]H0Sc`{*Er~:~ FK6z;t'ap @n# X&͵Y]R{e]miױ 4Q,NMO5DI FJN\{"Ed^i؅ $H;Z/N*jvȖ~i _}xԫU}`T`D/_,8`[L\}^6"%OđKifKuGW \(&/P>H, CZ*ί| /o@[# ˥5 T @iG@#^!jr\?)r;(m[g6b4\rhzL. {eenxk:jƻ|yScwPQT)q*5ufR3ty%Gve]}y߼tWi˵km`ʰXs|VӴLt}̷%4m?\X ixdNvFx};)Յ1Gw:rrnVhdE:9EΙs=;z:y{NwދE"5OC:>w̢4 AKV}kWpMb[E8{$;!VHD\Mq4Ṵ_'Trw$v~Z[,2Z٩hPjit$xݙbUri z9UIrkyZd@]h=ͳI;m~B2vүஸ=B-.&17nM*7;eX !l:} 2% W^k _u'6 dE h%;MآS)K|Unɖ넝&i=块2nn,GMJ4W_O;Ha0=#VPchQ\iR439Z!qy>0yXUz{ cw:m̮d0Ѕ滂 24AeK;$灞(Um);oo/-n/45ʮ0Q+os(w(X.t6 b%fmv:V }N5݋JNir o)?V0z7țO,jK3W^G-A,R!T6IQgQ~{Ǜ+b0z#+TU")ۺ8xPFCA)@}'K.?xJROmk\9$0CQnVdŏ@e4/~k ٵg'Z6'1_<ȅ3G͋ ç9&֙"~V I [/O1O_L+>_}ٟNmQKq.ڄ}uek<~1xRudG>6m4,݃<9g@U?q]\yL>@(qߎ!P:O7EԎSáW}&n<tD;޻.1t,tEWrZg҉&X@e ͜!u:yd;N&MXppA-8 NSDDS-a^ZMҘSkPkF5_xyvnj˲G~VU0k\#32yƮw՟1έU&oS8/spѤxɓ N:‹lhdS2EE5쥮] Q@7SXE565K-AkhM-Uq%?Ļ[rkECF~8s?PtHݸBnA1}\6TO;?PKu=9PK N- __MACOSX/darwin-perl-deps/XML/SAX/._Intro.podUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=NkP$ darwin-perl-deps/XML/SAX/PurePerl.pmUT &]M1cL1cux |RkǙÿPkD 萑jjH8}6 oxӔ:A.\Cb1.ZS ~$(1XKFfx=?{}tv(,=&9!oFJ>>t +XM:x9HWn (@[ *'eO0|:X99J=0~D4:ڥ O\.Zs/{$9n0p)cVk\6mzuxpp c lyp ۥ CY E-B55񵦫(HէPFt lHr a4z!tn_-Djt+K43F?D؋E:!s(&&i?iG`ƺOVB!Aƾ7#{uSdWNG r4+8(3J f`9j1GIГ+PΙJ+dWǀ ׄ,Ge5rFM}oR~4}&<} `&a(J=&y~=!UUGr YoաM\G Z-iȂN I,S*Y.Q 䦋tpn&"[S$8dMhBLA,7Ҝ>L0Km{m)4I8x!HM*GHHO$dcHHi",\Ddh3 U( tV aX$y Rա>Z[EHN,r,}Y{Eq0Xb{*?`R~Ldjj=AXvcjYaj*^G ]01pP%C%C(#)!j rkfu5BZr_dgxգjM܊*}@V(CTJ8"*"˧1*p*fw$K}ni⃁FΒ9 \lHtMF\{u$7S 7_DV'(̬'_nR1  λ#c>4* ǑI%CA[΂>ڟ!SFDk _Etv',s`)o jqwW5T7I.§'{yLگwjj;NxIHք poM7K|3X\ǃ%eSJftkޒB .0AQ:7|kJk3k\Q wPi|7̲]l%@#,Zep|G\% Q_H(sRK YIl4+HIbF^Kx4YrR+@( /1 3U'5-^"E45N֗xT<JeTyIVdzs3ˍvXrKݾ`YI;Pl_.Y7IHđ-׉/t XCRL^} UDۮd6 ƓW "U>]:3}|#Q=lBa6mYFiD7&oTor]Hp{uwnCT v~qv{֊he05=m 4bz!2cn#qI@7zEMe, o[-Tk](!P+i1iRS155ff*է NIGN HkH5Zٍc@bkf8| 1-Ij^ J폓wojjbT =Z?g麤QM 4 UGwO񟮱Rjei"z%ZLm`VY ŏ NӗB6)32.)r+lw HgŌ$G ~yjrcz4t ?WUmccqN` yZ 񰡜 `N@Tt%@%g,}z,y\ĎC'ۆ^+:v%H͜^膞fLuGO.]f5x CB9ոAxѦccb4w9ί:C,&H\ƱhL<&k.!t5ff !O@`Mxa\d U! ęmvhgD?sw"qh#"gЊ K7oRdICG*ZXۖm96c#k6g=g1T-R<\~<ж07ńt%-Blԑ% %-Hj YgâcxݝjVxQCU@ 2.I;AfҔ09ɷp.Y&E#?] GZmQesA0:`Pf:iWR3#^6vu~ "Q۠dsOyЌע󖊆QT$k&CB۱3=$!te,8cB 6a 6JyGGrw3Rɰr1;N!z^*TxopS]%ϴAP7_"?${+}jB>1i2? 9EK+lTW{S3P6,jCh!(dJsx2`ꨳaXzt'~6ꭆN}4҅ks)I`ǁ4h#z!JHjoZ-<24@-8ٓ9,CocSiN[ ᑖ'wJ 5Hȃpd<xk`[7 q(k'g!g}Uˮ kOO8/T ?K_їܺ&0syKڱZʫe#BbJV&}\޷ 9BFX7o|T v {]ݯ9,[KlFH;юhMܛPNZ[WFPP+1O_Y1:RR7$IUV̷)F#e#ź2YSdEyudS.6Kui5r+34{lU'MdIiiU}Fۭ;T!-V&г"q%Qb{N>!N.3ŐH^u;qW?Y!O[.x/))K,z% /a,0$?ĕ NЗE$Yv^6r}1nPu ́gy"[ݔHT‡ I֭4zʔ_IT'eCJfr:ӓ~_?oXu0sy}Cp -#W$MZw$kor#12x85gNPU#xHuԏXٻeۚn{nPWAt:QmruTJIW¿͍xj}i)C(dcɬp~u{(=;,w`SW, V-O}hr|>7* ?)T-,GJI]ݛ`=~eK{}U*b~A1,C(I Msh.,}1 U0Լ.G%W@8a6L=W^R.;zн{\u2b)c3:bqm3'B/RI5LCK.,l H@#G(mVBW 5 p@Ym˩HXX#Nj@?tν9[B ( J,c?vc;qXХ0YnyK͒s"oD (v"  {~yջ1àc$y̬570s@5l&`y aI V*/PKIWOkPPK=N/ __MACOSX/darwin-perl-deps/XML/SAX/._PurePerl.pmUT &]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U" darwin-perl-deps/XML/SAX/PurePerl/UT 1cp1cL1cux PKq:U, __MACOSX/darwin-perl-deps/XML/SAX/._PurePerlUT 1cp1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UB* darwin-perl-deps/XML/SAX/ParserDetails.iniUT 1cM1cL1cux  v (-J H-ʉ())ׯ/J/NOKM,%$&+*rqqPKԏCBPKq:U5 __MACOSX/darwin-perl-deps/XML/SAX/._ParserDetails.iniUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=N) darwin-perl-deps/XML/SAX/ParserFactory.pmUT &]M1cL1cux Xko>b"{ai#KqPx~Nl@#5rF=wIK>;qK;|w2VɃI`p#J- 11\26גkS&sh?=c{7o<2g2ˬDOD&Q9|s'[I* :NTRdt~<:;5䉛8<ɹ.䤷e:8vٻ^ki-WC?'hTv1goFU3dۯJ9m[N ZR'y߫9O?6ƽ 1oG;<5ײZ|[V4y{L"R1OJ0(\q'J@uL׮ !_JGt4Jn‘o``Ԇrfo\nLrOPwb iͥ;J-$ Vő&eEm@Yȟmz^~Hu3Uni'癶3LI[1A5 B gxQ$V%^>|^{1+KxF\[ޜޝVSUJ1+%5m,E5o5eRdY|Jn\c :|A̶? :41gs`Q_y%2Ys%XȵXݼ(T;ֆ6/Dנ~>] Bm0խI4' d ëFnNcdkhB(Dq:zlյjliJ9lZї7_^>FUB;$$Hw%8gt^p66|ٻIV#qO>Myf韥v5(#5Z2ooH:!OS1@s@~G4YC36bj̩ë!3ϣF3?jo~?Zuc/U0Fi&#/RB!ίF#RD-3?*1|W7w;2>76ϿȣT@JRU[]5]aoV-nIF2iJԡa#vGNm ߝo>bRt 7Qw&bVE&A-"K1xK@Xy!P>-1pGVd/|8B[&6$"A'. 5 ԩBQ2kGIeG T!5W|-Ĥ^اtOOڄuwp)Zi9erϫ> 6Y\Zhsz/,L}֋G]A&wu"7PAU0; ]@<_t39y:Kfٳ4Kѭ9%]FPih4Zw[D9"aVeD{~L"Cit)AQƝpE^,X 8ʁ7QS af,h*Z|KCZ 왓DS) alziMs']6Sp؀łtP0hXR>InOl',DTTf[R|Py.q&^Mo]!0K(SRՠ=#u2˓)`n,p\ 2 Y@f\K gtX/ݟSU=RpN#׏C\ :N T-H-[O]rmNܭ'8?|Ka La]1?W Oϯ= jjF˩ڿ KPƞ`M;Cg&;̻ cPKh= PK=N4 __MACOSX/darwin-perl-deps/XML/SAX/._ParserFactory.pmUT &]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN NB + darwin-perl-deps/XML/SAX/DocumentLocator.pmUT ]M1cL1cux VQo8~iY$`􊎣YKQV]tI$lE;vl%77Q_˰{/CKL0 J;K8Tw| K X~l -5p߅2TiE/J%fdi\.¼IRzM+n k4*wSaϺlu<aoQ#(#.Bb^RIGr0WhTY.yIFq2eEg+f2N+` TZݭ^s_[]qW:3Q8VA!O" O]s\k\Mw4jYY^pOi6m ə-'{><Q1*pGeAF{ЃKu>WI FAyt Ŋ-.-ED#K0i|}cd.]u[0jQ+#]G4{I{^CYFQ=:Fn:":/9 VGσd4bl%,(x6i\/DrAΐj\I xBʜ-0CJkZ/Ͳ᛬<:@ϝY. [+,)cI dZPL#D*(|q9!1!$D44aگt u]`hL,DF{1dY'˕vEo<w[(FSv)XL6XtʺrkyoTj%rvPxJR3iJeP|jE#6m̡8i#~8e3E2 HĢ6nh,ӥNn=抱PKQ B PKN N6 __MACOSX/darwin-perl-deps/XML/SAX/._DocumentLocator.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKXJ darwin-perl-deps/XML/SAX/Base.pmUT XM1cL1cux ]{sȑ)&D(vE^k-[ڵ.䲴M%)HIH y^_<" AWZ<L05{搒>~8==WƳ|{usM^9zezc15%ԇKޏ_o|7=˦s&g~~e;ͽ̽9)}Tp?b^(O7va LS/b![g]B?$S|}ɷC6yӛv0ͧow##kL ;6uMIwA%Gogָ~N{:>bM?2}⍬G?b>-ẇjCY83bSwļ72!Zdjs}s]`>!>O]~ ;|ҩY.Hx`6W@LO< 3t6C_fO9!#ߟz''0hE 9? c0ύ_/!.YD~77Cmɂa5 >Zg_?RG()FO^ƛNO@t83a_Ů ! /# Lt=znڋh ƀ{M/}Hsl 5FGұ3GC0+29\x7#B9*YϴQ4I[;ޫ8{rt5 4$tB"$1KkjBf9ƲxLZR0w7n/uN?^_!.=󯿒Br),}0:Bq4R{& [<{oS eRp&ΆCLN@ ƪz>{.oBe h9M>J}1l6%5iC^;,M6- ǮlJ>҃a{wQ 1GSqds1+\oSKF%he;}7@7›i#^A9UT“h=9hEŐBΥsi=eh1_qKv\Vص#LG`4* e{lʮ`wgi*߭f3wd4)h٢e5$xyTCLeEjbKYW{ʦreETR 9]wiTD䠣mI6eg {"n4 Ţ3W3w* 3zut*cC)Ԩ'kYp^ЅʩH߄EjĂU0m+Ϗ"Ѩښ Kי9J36R zS}!DjWM׶F #? ꔷ&+R"[ 侗Y1!{~AQ3qd(5R#=Wˤd`Ekh;|dԛ=pL0EҐF("^J^&vTJg}Z2/8r|&*oɳN9{VSSɢY'T"32o?2*?NyvY[79{s7oKg]ĘyMR2܈gk$5c֒eꦸyW[3LW0VdJm(#jSȻP7HGfdԚ|z&Z~}A3v_枯{ U7׾2jIͲ 5S¹w Dq:GUQ ShW\O/ᚾZGH|,7^繵8V 'U`/3zb᷺ȫ "3PY`ЕeP.Պi#^ g4]}gSūiA:ԚgAVF6AlN_LKX]d5AyL$۬=~/WF=:t}7ONbQCZG;W{ 9 8{iY*m"t]K$ZqO Bj]![UnbRC"\+7$CdC4ScC)<<^Lg*O^׍xG"ѱ'm XKP.-'D;>GyOvQ0Jnv æ:.PZeCU^N%K*@PƵd㍘lxV0M-ĥ=d. H*Ff"*/,^bլ!!m BvO-MɤZ+EwJY)YGV|;}i9ANDKJDȨBl;h^fUE9,H,bT 񳤤d((Z+>{;mW:qBNar֣||]=N)*w:)>G?{~O@W~c:vc0ZUW01I{ FK߾3Ny gN?JbHjʨ:A}f<7~RE=*%Bm@aCQƭ_P].Ʃd.$!LE㩦Y./G[D=}jaO%J_δ]q\Ir2թIv,YQ֚>d~ gkABHޢYE5ej&?Yh4>t+^̤.?T0>GyJvH jnh,P[`_nL:nL%"i/:UeHk?5=zzz6#WJ5]&^9bKo}H5^F&ރ9FeuԄ.q4ɗɸr"~NlsB  I %YNilz|679s!=+G^ n .Eڃ<5' (xN$߄06!r x΄Lϱ%2M20>Kx1 fufn>~}'xiN'>F@㨙ڍl}w񐶜|-urV vSBUwmDf` 7=ְŌQ|:͚Z2(=\;D{:3LF%4pxj@o:A"FbJ]&o$֥}4Z`{(&7&~s Y6wZ->DW o7?u\=l/p(v5A4XS &R_矏/%PSc#C'yKZS2.hb>.Orٖd'k9>.r% +2JY ˸_DCW|}=Ed(_Sav9,`K1"3 _xHm¿i䤌HZc$P~lKl5Fchg|X%Zc*2R$_5>ҋuF9[(ܑ[6sya RpG´wܥa[}NYi1ʡiɱSQHpXly#E>u"qgX %b!h|ݏ/oybE1X7,Z,=~ڇ[uK1gs#m* p;N׏g}BlЊ]McXF^m4å,Y%r^@kH9saB\הMs= ̂ĂX_tH~/>x%mfH=R;܀u9¼ @A@rq &]aXF(/˞@ zxaOxg6cGAH`6A~|F}H9V/IXb/&^+uLrF6Y61 <+y/P[̀+@f/}[iݭ6ہCڶ@{͵mvbwfE)s(ĸd# Cv&Q=b`<d[*1ߴˀbNM&2h=C|>ot=1O^>sXZȇVmJWtBbNy gF,6\/^o; *»sYl0VSpٔٺks:7{PU,)3AvY/Fܗ5Lx`^ pxODw%ڲ;\`4_A׷F]+dn)MY0)?brֿ1/kxh,0b-G(ťטkDm̩I'` -r>z#\G- Blv4yKp}D_hëD^>Pv;},hl0 tq!TM{S`IFpY%5dW&_bWS D5[FuA2 L"w5xC a*>9F "" $87v0MZ"]Dm-oN#zra)D<{y'`c"VYc]cؙF֏4r?~|zpssA( M;PZ2'`;vNI`$rńhHF1buPO@' T!q$ "gi}K' @Х6(R =x0~{sqRLM88J!d3w dp&hsp<'#+ܞZ>Frޘܥa)/# "z @Ľ/AHa2^%Z]>y'f~r2XށON,҇//Sk~OD!?,N\zzSqa$S0t#P[m^x=93!h3 b\殍ue!m6z t&%r Rx%%‰KP (XkE*5sBM[ylwk2%x Hx::]+{y0hM:caY7I|NT#Z]QÚ,ʓWw'6Һ9"ȡ3X&&=j{p],w1f@i a0a"]a9+ٟ+MOPM;4 P8SuO.c~MH'8j%Zjrk">ͺc&O$˄!D#ALx6)n;oɟ%+N耨n2m&zf<@q_ɰV̦|-G.?{D㉤nNFn!ZjnH1cd!(1_06yfK@ yD 8lx|Eތ̱%x0CÏ4K_{˒ {k2H' DH.4 L0VFm/80}CLP<]ǕpĹ h0#3x m, Kuࡏ7롓p)*ȗ F@0{ D+3P. IAxH*10"AB&H2Y.-]*;}{GV~V"Æ%5&Kg2O4FKgC"HMTH=Ńl 87#"Ⱦ\bFɲ3@xx/s)`%Fw1)Xї]"E&n[f˭2>_5K@nʘlx"`E21b#mg Aܙm3bCl3Ir՜jLx K$mJn6m[K[=Vf4<|0w3{UwB`8#@1 wEo0u ( l,[ j ^JsR!PTrg"1Ҭ",`Q[5I`\npq*PɊvL?N<~;q}W$e5Lj%˫ZiP%`RQ+8h=V5x*MT4/]F ĵ!U:I8+-!)_IEwjlqA"/E'ڎfbkVuq)I?$qW[`}a5ٳ%.I '`&fQOU6qUK\I%~cMFK\`y_~>hs%t.zA['Ӷ5,hb=#/r?#tn.nTmAy+xi 2DPC<d]|dPv-p ,=UTS3wo>_)y($Ը2ۡMpCAgUvN4_hY?;]pso376 9|C!lotgoɳȰcP$n tg59*4RwH1lLO|r&*Vܵ1X[0ᣲ::绽<ȤI. `)[X"ʼnhӍ4pdCN|&0K(d2b(c^6R 5paK_$9J8eY))AyY"/(DGHF5s@1I4Nl>!v0n'?eC>fQXO%5%5鈇lÌ"ѥ6!YgUȦV$JP40Z~#& Ƴ4GDЌi ,q@b8~%a|"XN ߉0(}NyhRz^b扟Y0`ܦYT^$nl[0cۡ=`yyln݈D"==emw8_Oo/(ŌwF'wnaD vLa4#>pn?7lo~OgHqمH&)M_Jg'J&.`Hy{@HMBs_B?omCl?f/G1k{=;M~P]\?|?0Wk(pQn6*ҺAM[:)S? )5ERUO14fhÉ-t4UP %tacDFC7X<3Ǥ@g\k&@"i,i Cvhm7=菂TG"&9#=k.=)OҁOu4;͟[+Հ @wWFx,>G N`z X*<$> `>3F!uRL:M>?fQۇE:]&"E+?ۣʪb=dj`EŐ-YX", ?ѡnmb./S-{T*"{P0_N_k,)(RXqZaܺEAR\2 xX/ldf')Ē| 0 t:N d~"S vßI4 :bsOAg1K4yJeΰ)(9@tpK0f6zQ `z^j,doNE-k;5ԛojYK:`5ٺ «p@zU oFJ5 8q$:A1jCBZ4aog{( _^0LE7K;P''Jl֯f": g)pn}fk#Y35k!YGث*umu+pP wg;#NymL !-fuЃ{&Hֲ*×0DS3zj|!\jbA55.^N{\dG%+\V5_#A VL/lZ}nt/vZq7]iꏸX%+*7_ǽWV[�;eJܤp &Jgj+uuЦ2|R!B0Z-a$_e #P4Xhb= OjH%ij }U2>O׀Y[1}2)|J#$~nx{EJPڌY;~\ $x. ~V-em5hW-l4kʱt!ՑKS-'ѱ3heb01=hk(b Z.8ԟ BਦЊiK{˖1Of;-f"@t.g ug@Tk&K㘱v&5O% 6|x0`р4:g~Mکxy 5h H ۴7dX\ap޺T&IS~RE~"7*)G Qh}%qJiǀ[u"E3#|NvLگ~5f FVzUjprL{tbH#u$Ёq{dc|{\ "/ p)1)ZU,"qA$xYa'&Y{o|A aWgZyQ=HKUGGkx1Ys̤wFnx .(LD7rLҌ=a&KvNaah!Ѓ"ATG{qrP&e84U܈0d+&q B>(xT6)V,pv־e4b0j4UޛFrC?m< ҼҬs''goն8wvޜκP.GpK˜L}-nQew DtB(aG܉Xed#.h|&e~8T/P[-\!,E9(T 1ctd}eX#uy/lw=}sk8MU1M#jOPa$&P]ņ|`a+z?_idҡ. u#׀7"X8]S6sזe2!it!t1a)1fn& .Ai>zG%#0 Gɵ- ` WH,<`$1eBbZ ϧ㯖hPPvpLy,ː J#h[#S4uFHu :5ht 7‘0<_>p%T#h FNA][hAc,BR R0KQ洌cdvxdK-<OM=uW)zRqꅅ2fCcLvMD*QV!Bi2r@a FI/p}F1`鐪.FEMic*KeJa6ԙ(q4hZн*U$Rz)!CHYX9wl8=fQDsJݏ8*Y8>vWɀsq1PS47F"j(eTO@ ]/ѐV`jQh$~lX.+%+ƃ-vC(,[:IYC#E}>2Jń ]tSMe(0%baKRFs8hl+j=.#+L/I|I)3; GV" {MA|AP(!+>j}  (qC3zt#oc_=;|bE#R:OIH֠ 1juVHgOŌ=QU K]IOH`ǰSe$tKĸвu.^B"sy&ȁNآMpI\;yN;peʼn> n3驭#{}7URZzT%3yZ@ c/̙ࡶlpQ%L>COZVn0XQm7s*?KUTj_/w9ʫ;kuݝw "ȅ0+L ,E(}\sxE_P'c}'"`niw|ܣW'?jIGS3T~Fx"vk4ݥ*md/Ĺ<Dg =U $sǓ:~3FWQCH N9! z=!X*TriJZ7*^"b%mQS+lR}c5PZEaMsԢH,W $UI\jOmTMHsl>eFCل\fÚV5ǪUZ`-2Ç2; )3S<+o,!1r Ɔ@関t(VౄS_IOʊV5\&_kU=ѐ)2* Bc0 rIOJc{Y}TZ7z_Xs5:@JsQ2k+F >S76wv *D*5ly w~2+01٪c(@#Ǖon`:O)DE(-/QjW0 4DM,(E肩VZ} /9Ԑ?NFX|j UEf2Y eƄWbUTyIp SV'ڼZm]4{ejyYMN܁0<&)[0l6hx.7!/o Ԯ wIdmMt:wtkG ]-=3-mL᪹qK0Wm{5e/lp%ʉkRo'Bܯ׮ZB=eϿt6`(,e^  o$isLpiW7#q F eiiw%I p>w&%#}+'copPhA I|Xoۀ:E]? 譫]4epM8鏢qk1"4qM^P`[ QI ?d7k}g'"/}|[[T7RszvZծdM .[*)\'/sL&YA \+7L?lWN5 /NF38Q6c!)KAԴ2%V5e&=kgTۜt&,yfEQfի7 m5y˅s$  [;#5~frh::%܆uS~s GҨ͏(cVW AHPUq+_~{Uf뼴H-ˆ֚ףPZ*YQ+:pPcnD=H>*П5QH1vEb(9!WNʶHjCS`!- -Q ϧ8vhF (a3kΎx! YzKMc-ӅZ15GU", )mzA D5Wu/F +!R>xCV$/eJ'\`#BN &@>ͦ&x\Ԃ0vV"6C8"N{deQSޔ8f0)u1O!( }_ڑ[ ˚ڹLr#R}{"J7FVU! YU:ѐdcEԬK@Iˈc.8Ӌ3ϺM|*EDZ&j}rQ6Ū +E/(tBHQH_1W(?iYyU8뾑 ?O?☉\Z"Q`ORfAbXG&m"rL0!s\lE#1l spxwE&cJܹ}Iy7Q}' ]a{@:C&Wʫ|-&\TG=x:Y06Y 8T2tSG޶Ɩhz~JQ%Uv@=`Bn&I8w%>ic<ƛ.6 C)`\@_E6MЮE Q4ɉE>Ў'"(fW/4Th)]^3* Ďw N8qb dnKZoFr-g+{PmWH S٠7 h5r*^i嚳e̤uEB.&rf(,cρL4yhtʣUֆњlR4Bl=}3{lv@*KGjJ&Մ/Vگ͒U=ojJ}iggX,oɶpV,ξ<٫vbۊkVMJ\7iL_|M_ǂłDuwY3|ά-K=?і@$mև.b}R$3'”Ǧ4Xcm d V6oWLW (~!$Q`i(pGU1ݢo6Z,x|~l iHLG$LMB4#b!L[ fZb¸싗#l0)-C8'Pl肟@9rxQbKda^F$C[ovGyp3~ֽuP\:# ,$/jf-OB=:{N*) g $aOoCf80D S[yAId$ xHJޠ/b±"+Y$$TnҢӼ!_B}~JN@.wF^CtѪrPVexZ?`+eVl祟S ,vU.q^[YV^nmJ i]x8$J5q`ڡ] :D'+oDpE; Ǻ0j]Tj- @cS CbK|1e7~2O-_Wq8mlf4hML*DDH7.EmZ6YrXe:5 TV:2̍jyH>rA`%`AUdDRbwxHu' {ͨo\6č4c|#C圔g4C*˥1%B9^J\ @Aq3y# hZhMZ5 $5نٴ(ؚ~%v(?G6W!@Q/$^.oƱ(@V=QeAry y%Vl>B)0~W\e8=3 CO,_5HN HEF8\H0VsmSDT l^_7ZIkI?S9aedBh6!q,ɱ$L*Ԡp\V,4hAϷȽ0K1cxeJ%7cFI$1dsGmU)5tV;ۥJ ]H.2 7f`*7RTX0I((|vyF DYҍʨpԺ Bݠ,OM̼XI8vВ|E"T0v^Zrҗ,+qe3zA Ƶ+˫tU'53Gd+mP'b &TdMwEdʠ5`#\z-N.J7~6+嬭V8"^L w";WBX⒪iLc1EdGgb]E}TiOEkֽx:F Ɓ&I})"Cl(En 玠w6QOiDC8%pXM dOt% nBл 9X雃sk]&|gOt7p bfurPϥV#FC+i'֤?{^ %'1aG}reiǙU $ ^P.V"p&i&K%Ɖ5biEؼo.!26l0f7fv%/y>iA6s*oCSEƭ"\F]Ѹq(|lL7e[b;v%ܑM\<8<opvRr(C&vx.9Ԃq"B=޵B 7/|wSy&. hz(mFf}g?sn6۵pLqJ~ qL7c!ɾi+orXEN㘗.qw\Wݠ ed UjȻk~{}t}!/K|N?ٳ}8ѫf ev齏O>O?|M/Ѳn^RnM 8Kl{ wX_v_ |ݬ(tEz soCb{8>`2١ ?Ĭ7W;^rF^J!"%d_oK kҀ{4GW+ R/bhYxP`蠢AAI=!C'9{nĤ^BßH31-mg1dZG1qHQDao 錸x!s5 )MѺQME:O?[[.U?.Tܗtx_]Oi"%MdnKXzWEbXtl˦{}/= ;0\6PqEǠ͗fzr"r/@b.NcB G;>8`Γ .BLVXd?F/vdۺ}Hm 9tzd'l(X]()Z Ft5ps$A6p9œ&|3&ZJSAr1"ox2:91E [nivzwT`xƳ'ɳ+CBR o8InC2.iZ ; 詭pciǑ!iQGgd]eayĬDOLG.Zm;;GF>v$R;Zo+UbNHs5v+%~iծ+(N|ItmOG~(!Ի!o RbM{sP1p^E֜!4'}w(ċ{6(W`zY/4#:KJbR\&UKE xR.峂Aq4$AcB 35v u `k8eԋ"PvFW聶[NIF0[}zn9t vchm^/s ]b1פD.ʢ!j-LVƇ)HzVqۆ;I. 4܎w@GEϋ6֮^p~1[5znJbK25`]u]rSO*.k̙}6d^,6>=%q!H]y-2dzjCwG;^vF;sREˣ 'u =|&+zٷYVESF3 5#{72a4U:7lާ~z[ϼ曫 nvfsJ0֯B'qsbYtү;i~)Ɲ%(n܊*_w62;F¸afQkb&+K-Ζȏ1/\}o4Kn}|Zj ǹMH1: [~*=@yܰ6(PV-妕ʑ!gz]EjxClCT~P*Y%4,IFC1i:88q뾒9\䠺0E'u}1ބyʢ2H޷L&:+N-%b;^iR殥MRm5X,U= BrL2Z0w4$WSvH`c)1In#@{EbD L4Ao` ~kx̜e]6@OHPĉ\}΅H5U>~슔|3t]1+x+Qq[o_F--P8J2nHeCn| {©0k|Q`J\9;:kDK ¿4uI|[)+ԓg?zQ%ǫNj=L4ZQC2R?}'eWt4KiV~g_/(ZǎtW!+9WCU) 0`b##ʳTH;z5쮨ZgAbdP/1e59ahֵ2+S {RLhob[PKʛ QPKM"rL. __MACOSX/darwin-perl-deps/XML/Simple/._FAQ.podUT ڭZM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U& darwin-perl-deps/XML/Entities/Data.podUT l1cM1cL1cux }SN1}WJT6rDԤRMֳYK^xn DY3s_6%~~{(ˉK&cB8bj;Vr:l1\ǷE.”a6c@r%k\`J؉(#)2׃qUl`K\t}H+r1@ ^AhA1=O+h7_GR(G:4q5Aޝc*3Pj aٹ_CKnװ쁻e]2X@^f7oDy>d7R|ڷ;}\[hVM"VG#;5v&6].b 7t8פf1ك:uڈm~XvG$Xtz䣒MB4mgY2[Ʉ) l=PKCUhPKq:U1 __MACOSX/darwin-perl-deps/XML/Entities/._Data.podUT l1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U% darwin-perl-deps/XML/Entities/Data.pmUT l1cM1cL1cux ksGW0v=vĜF @IօIXp4&b u)6(}sO"[VVVVfV2_d|/bU߇*{h;ͪ.ƫǏW;yѣydp庙ם:.距]yӬvۣ߿Wz3Ƴ|uSfy٩\Ch+q緝k߯i~ϛo~?kg<\vJ@)}L=H ݎ6FjU@-65$ :Gx*hgR^O+Ni ǙԐNɞi z:STtka'JC'eZk&RCW^* }#^r_^$r_ٴ gML{/3h !1>L{syM\s?}MF |ht|u]*L=VcA>zd(XѲQ$Xy$@`)tG)wOIbՌcG>">B9x_gŠ@O]_[[]b:T<dH.Ϗcc] >bO"t̰Y L"tk%@`,#+=Nitۗx_7re$<R I>NF|ҥŖixbsE鐧ciN= dYD=^2'ݾt @?$vE{ ^>s#gnu("d'0^?@n{ыy.ceE),#&E5+#Ĉuc`ws^l`f؋`0UF,WYD]"U#b25`!YE`z]&~U'5t̟ӥzU :B[o3PG>p3QGۨXMr{&B0$t:10=ɘF0~bfWbux?%. ű/= f#q:B`fO}915nxD] ]ܫ}d4ƙXt;p}bq =(~ VF%B`B K`6iN_aGΆ ͗mZY2sLY+E78i BZHU)֡}7LxdifոZ^I u]IɘL1 &x<œIUhO묔_e*x;omn"bWG8$+uo=cdZS@cy*r" Tgʥ .TP|.P`ZuEM/ƵpgGDzgcYO99tTD0M.@o/qy=VKM( PZ7;e^H)[Q`} 6᫄*6UBL}`} n35>/`P3 OUoˮLO_-%B *ZK!3n8a. MA+"Wf@|[hק7c]!,}4=.-`W] MTca% h|Eg-礅#c;q>kDY52"Lͪi NM4&D(\'ĤHܤX U]4ks@asnI-Į!v/_X|dB֮!Yk MXcH̥2T Fם-RdAfK(Rԕ'@3}KL׬ĭd-\>S܍U^%1+|cX7襏r t0)]rZ6#ݝ|\h ._㹢5KH:^oI#]I&|E,!!~Ҧ+b.`C+l*ywrO@(oqc59/WY6SY}ZVՔҍR&(M3l&KK%36s~3;FU[gsq:+=)]ZL}ᣠ!cbم r).u[M!k-d%ɸLB{Y`G&Z3<g2}뉯\.Pe Qa 41TZGvV]{g\  Zyݥ#`6 iI0`݈d+5tt'NKyg*Z)ʠϐ"w{U@+Yz獝wW+ /^1^cN5\6n)ƘЧeA+Z|A.ZI HLrbj1sȂUqS"-]/ZhN~>R"l??R6wa+݋m&0m/c 7 蟮l ֙p@z B=@VE;9M^#{D{5k.Ȧ2\>WwmrWVE4M-2DỸsYvzUhXPyk_ǻ^ tKh KQ[>R+gFqV~i/^ZWvivo^pfoz^]sNE ټ Z;L5##߲4<+J269 9ң,Bڦ*ϸvRm_f qZI8`g(8d h%6?#kdžNycGGhh̥{Z3)+Ih$LEXokp}EsSA(sCq/%ٸ>Ϫ vƒ "K.6R\T\y=fVtʱ6jeF' ZVYVjVۜu$ObP!%4J2<EeC/0NdVQB?HeQ'- >aˑ_5ier UbtR4mϘ^Uz|xOa}y&5ŵ&VIdKP|YLkHFcn;t:m1,CH2ak k.=EPѤֈIRJ ̣W٘3TGZgPiU#D4tWdWsكRj[&:o`iO^t!ZO}mlqg}&OW 4꛵V7nԪq苔\cԨ`-qO8WpWqb4*8Cl+u%%WZkn*G:[{x1<[ɮȥI8.fcTipWf8@1 rn3rK/'$e2HPn6Uķpwjcy,1&1e*_ DS_ Шyx쐵@\ =,e%Suy'T)08x(`ؑa#b1w"i2LOCבHJc߫p.XYӅ!vӅ8`Jn.Ӆ :nT%Hnxû5y{!K&r ꠞfww7SwUS֚Wy =iW*6n rLO{KwˌwL|{Rh}Ě1VQŖδ AmHZZ.s7ݍx {<pgE)$=EgD=.G u-k:=IZs7I/ sWsQPI(TROTwy!Ğ6!- ZZquS<% .< b_g&`3p(㞋Hi䗅:Q_uy2[k,NqQ\v 晊 U4vk̿ ::>ARLeЬ=ϝMwā_&0&JY-5A~k=_6|aw,{畞&(0TV 5ޭC&]`m\)]%5N 7B\4 k9?A;@>IdO6Dyc:LzA]c#26\OCmlf*ʳf%)}eܞsmܳe>ϵG$2l-'RfV'd÷ Cvq=;9#NHRl  EXy弮>K|9eS ja" 2 NsuHP cԔ?+Bըo :]@:o:0u%LXBC]9)8=S1G u 1W6BIo>]zJ R>A0]7F5_ɝD>sbJB4Jΰ@5/'*OKAdC 0eD'ȝkY"ө.B7{.k0QtN Tz}dD+TCDAt{>I钘 亄:%!r*8&j$gf%Ko̚TKpwӁh[p)t ̄z]@Ga Iw0- }vz+ΛzX6vՅlfM ﬎ߧz.,UPQ mDy:ԫLcKxo!gP¢r`BCzPԐX90ux m:j7AD}oyE7o/dO!7L 4}V䡕J<Yq:r+ϯ'[qz 4Kl fJJC{\Xi?U:3s{aleJCqͭ4ȯ44'VZnUkiOo| y[[+hpcAcyJ|97:4wg54Vwپ&Z|DZgkKkS|J#sgJ)cgJhg}F25 j`&cUXSTYP jʓaٞMl)po`zӠ *YPxuT׾nӀW@Yr !|tFgDZ^6r 4 '~T3> E@5M T@j7~&:R9|-TC//yyH4c/Ϗ*{'Fgxj}t?ݬ< c~~C|s/0:]/-j1?/}Q+?)gk/ Io/c~8 3c򐯕|^C6^|}򘟟<߱X<3z!__;=qg>ȡOՁ2_u>ՏW~"ṿ%/x %+]`4e#iR{D-Z]}{6$tl˓h{oq(NfV@ڕ8g|M^T1-1wxtu}']WgBq+?VJYLԢ>7L~l8חM$ͯY.a+3͒X4Khʱ^[RpOrǰ&Mr~7);9m/WFtEmgB/L$XX.K~5$q\>lFݥtwabKBg57w Gڶ}iq$ry!:>ңvC#:ݦV?*9*>ۇs( 7]Ÿg` 4}Cbo;_Sj$vS , #!ɧoY#Z Z{wrc[WΕwA Bbhy= ړC'L 0=u7L*ݴWG|i\W| >y"ZZDC!SZQaT^;٣Gq svsyC#ݾK%ǀRl>;8[V `<+YdVp_iuD'J FC"& Ǹ@ ߦy8`gLX!F2֒Tlܻ 5u&Z[Ĺ ؏UM (y(w-lw)djo[3`V~.=Q-}0Hk$Y Vlܝgm'rk١6o)i𭫵=8CN+bx}7^r/}~7.ܶ\uSMo,,VW7m_na?nlmd[O Vpۛuߔ_5gwkϳw~_ummlľľ>>ɞݒ/[k:\F2\ޙ#a~Sy y~L`~hDryfB@-3g&7hHYb4Xka>OQNjG:8b@*gXk@|赯zq;,y|cQ۟W94 W-dglpt}]ڧ-߀_6[?7ߵq?<4}D뒏#7!>U8o~hƣq4Ud"I_\:=ȼr6l r =5hԥcM LXHX &p/T3yh!sq<^U&tS訔_ڽUlc'oEHLpYeߘ8 lsȀB9\3y eG9 S~Z^ 9is<Ü"_ r\+)}P'9c!2@6fGhHrG#ۆ٘ ̟J& PMO:0M2 Lς0Ɓo,w ѐG'7(pbJfHu\1gP-L'ñ鍘`N:ހcBA:V[1ݣ9haQŸaYG >0>-#>~p8n~^m^o7Ϻm@St"Jefcp񙐐=s¢b f!0 A/X.#ÈF S `]3DmNNq`Q80^aqB(* !ȩKC#Z'Mt|/,ZB2Q/3hL<`֙ԛ&߶C LF&Q1h)ƀ2lW RE)VF,hs 1ZC~`t4)b⬢cjdkIRDĮq`T=\$՘z=ψMa8 K)qeשeȦrԆ2']@1}rn9 -9Dg,7'7ķ-"~4 ܐPl~_!(2OA3 |n <ciQtPܹ+ Dnځ?Q\Ȉ(,rH&M0;X:% ZecN['WW;;c3 qBi ZA\҄4WAdJk##-!57} {b --Ǥ+6Bz=*5l0 ꢘc`%ix`V?y#=R\H T#ͳʧp\i Q0N %M6[̶^߿./`o֝7 &s0֬P=.أ`O)}2Qb2+$;>x"778$?䫅3>oq.ֳud2_q~9Gܴue//Vhy7lrl$(qbO    qٛNf ?0ݭ; 3'z' Dz+\<Z<+0qaa Xب0N oq(sP{I}0 pG썊px#PGL(Ke#SPe>ܴ1w)h } w! 'kVUH>![`5 "dC8 peCw3=3ة>ـ2 eç]-[A>g,UHzH !%TŇYY(u {B5 GG1"ɧS7ӍtѼ!xn+viZ+$5Ict-!=& t& iܙ0!έ6)ӳ;_J;ҎuKH/FAo~:ثTTGӢ OĈhK}=NꤙN/k}W:\:P菆#i ).&pjCI,㌬Qѳ ~~[>mgok;gO/k?& ͊yH7P\Yi{n+kj}f\R+&5ˏģi|O$ihBŸvPUS pa$4b }0OYzݿUg (53JI`PbUAH`-MEΐWtT;c>]^ #*K~_ߤ1>AcpPJ9\M'hY+宛YLe媧 XZ~f8 -w[+nw"py-X+c|AlL7<0_&oq,78N0oαjAvxt}X"i~%{n#bv@&r8C7v*9ij`aw71cej{Hkj%AL02_6Jq!x ,CO0l׷w!ϾF.!CG]NA}h{-M~$DZ|<$_sA64 h_ L^*cΧ]eg?ٕUew=p0>5;i۹|0 |QhPWjC;#B pLϲ~=G]Y纗<7?^2 h= ;NMc8>FP?|ϴ,~x1Qm9*ryg罶a\^rRRAð MוWB|cV9u(0'&;`m> f9D[cNc @Ğ`Ɖ 89C jJr;/s9؇ƀ11=4 PK \%PK=*T: __MACOSX/darwin-perl-deps/Mac/PropertyList/._ReadBinary.pmUT bN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK=*T90 darwin-perl-deps/Mac/PropertyList/WriteBinary.pmUT bN1cL1cux [kvHvUl)KMٴdZumy$9IEQ)rf&,eV*N^Tbc vXE}TyaL'I%KtUd>X'u=Vo@|\9B%Xx/,<3ٯ1(OR9$/ 2H`@z+&zi(U HpVvE|/R xE'uڬIu̇JT8aG&NPTp*[2jXB& !LC5Rq>˔ladHa85+; je)ɉydSwepMV l>q o@PX䟾_o 1:*|M܄)GCn2|6!cer4I)!eۡGdd}`1Ro8Z!vܛhI:/mZ"G<$+ -;(#$09w,E, )! ([ڃﱼkjMS~"OEbK*>[}kAQa9h3 cX S6@'MC8 YG̒%(*^h%s\Qj24*D4*ip` 0N<+iE  K?gqw8b{5d Rkz+up(\с$R$f+F=8E$3g"ήi8) >P&7 +qFDEy `07 6pLB?j ̴#80B.Z \] 4YS._-lY^qH9Mkhb* 3o5")$z"j7[O AQN q=KR`Ksu01ʇLsaDAt)À e8 $R4ߴ }u@y;.62,yQ+[ZiV $ALd'g gyE\.ReHV6pJ]Hwv-'%|@pF D@%xM!xl-Z;l-8vFnf u͸`ƈSc)(x6r~z$侉bh\6CCE0,g(4t!)3%B7u} Fׂ#AuIA(ֹ Z^[k Fỗ(4l@]@""7V 6qH Aqbiz~`E ,[c+5,S1&" MjiiҪ 0anpz I \ul^)@ol`m$ϏR*'96?F }rjǬ>EllG&و/q[k`IOUx@ !fa!H,C?O']Gm||5~.q)n#YVFc%7X$J!d ׳-k%D as%_p6&bJ4L/pPE=aZ,2h*([%sZvE8̵ ڂYm.HZvEUڼ&ņ~B&P :C_.jݚPU<4UI=nN,&+oOZl;  tmq3ajIPݰniPnj$-K-?b;[ 5ZAI\H#(t`hmm ]<^u)u-IT/e4L&!)BS50y궂hHY5h4V_jfH ]HYcbY QP٭gaAVaj\Oө<ε$ZbO:#IdEIbΫ0D;-~`d.J4\zNʳI`,Cw5^Wq-\xe\1xDDcA E-+SЋ;R,Ϳ㟱߾yqW:o3KG"8+cb6K{@ J7oSEljNtl,8>#Dcɝ$@}LJkD@PN 16-mn [>ݭrקdNKA*+9bsՀa7|]A6=V"Cj6m`jcE, őN:QP,~Cw)vYA'"3:-H0{ʞu]'DߍAQ]5؏r݂JNq,kK4Xsa>p Y}gFwƵ:hQh_Rm]?CgtF&O ]$KOboޫw:7s)>ɾ['#oǧ*M#C~Cl~__n0yأZ44Z6W_+fy)MZVI`5S4\k#oqӎBGأzowoմ^r&ua'w/~kF%ɵmBؽ ?A!_nsB ^ - M7rSGX03m'9H 6l7ʿ.Uչ 56p]˲>ۀ=ڮhS; e@ y{O =wJ){Jmd/<6 %݋De^jo#nEϚ|ݔ1ԅ&^͠e"%JQ7G{(m ;cӏ|DJs"s\Je} {dAC.5^TXKTedtSf,}C PuU%( u"ժtX=zsqG+>u̩K}M\O= 'Y5N6-AiluXkW KV, ^7Kcg~` +ŗ_ %3${ `Z~G7 R)=\2/tm"L6ǽnۋ®х%rsJݔ*)\e,T\ 9˾C/e, vQmk`"D !N^x T e՜8꾍0_=|sX~c bc+$ƽg)U༱|[ ~m<};잚5tIͷNP~<}a@PB͇vP&<2SOx+njoqRR){K&dǒ{w ^~<;w¹_h2GG‹;I:qb}Ow=agW3"A#?d 2V;z##ፍߔ4M9X')GL%C~_/8v<r+:q)K4գ0CP|D8sOWq6|5" hƓ@P@tVIه%gYt<vv[g4_PK<9PK=*T; __MACOSX/darwin-perl-deps/Mac/PropertyList/._WriteBinary.pmUT bN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKo;S@ darwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable.pmUT CPaN1cL1cux Yks۸_q#+k#vf:RF+[~t;$)!AZ{.>d+Y#}>Db!:U~2&bɁ噤ߺL^q/2A{R<\;f<]]ޏ\_Lտ94:!)04zHTe:(GNױ8W"1:fam|LUFZ4xEIK)sGGJ>b2025:RtM JTܣO0,3-ES5 WI.t6VyJI>ByPJBFx"Y+h,Zm˸ԳGt6 VU:)gA̽'!԰ jMMÚ``Z,"GAO\|'"PTk;~J?>p1F~iLMAIP]fceAr'@0>O^Z Qo(*R6*\dy34 Hv-by1],-e*{:<_^1䡏a6dty7vFӽ~<;ߍJشA=jZ8[kR{3@5{f nuiS'@l7z-E0C <#[6$7czʵ|Bh!*D! ,RN^gtDdlӀ)BƼ֫m#bK:M-~Mը(KC X1PL *i7Ѡ:sa )5զMiR4KGj(VƆX%i̧1oۉ[`ػ:&W"IБI9M ]K :O!ĦkYBsnɶ[i;9'vs:~>KCy'[eU:$>iAqnKHvMRUP*^dDw~ $XQMK${"5"qb[u_gCg7t|Db)?l+89|s%**NA~~5f%E 6Ys ë(LMZ<'خ kI/֖sѠokԥnj{gj%g*X75 UHM- f"#xȤp W{s];} u]$y`Mm[x\bhTtnekfՉˌp4DƠn2{:zDHnXO.[~N&[_N @..6sAg#^l:tp;۬PQy,M[G'Qn`dJqЋk N3U"!;MFf悿RCa;UXb|3n kp7֖ nz4a?[^|ϧJ&L% ${hSZ`]mP /HXJFs@me42Qp:Onyt:U{0H,ՠu+h@ov1 2Bw %d ɥ@OqKPUh*!IƲ3;d%@g%C0ОSdŔq:hV(mqtPJPM#v88`-P#C{t-J-q V 7VX -%ҏ{(O.gf7f2h;>U vyK y4 i4=TdFJݚfY2ᘫh{-uum٦=G1=_lߚ0t*d԰am`dlo]Dsdw[gKXجq!cER l!݅Wdwc)ًF*f/<1u_B_yUCF,x"bU_i|vۊcE54Q7Wa 5b`Bx$X7*wh{+( 6HBKqp5PD71ԄL66YIytP| ٚ۰gj0N4Z# B׃""ny]$&۲~ /Gܖ85R$F 5 Y N\d>^\ R6ݣC cFGL@t˱C~3 '<|^6L/H$-zԮkS5p=2bz:fOφɭ-'1j9Tϖ8T3hXw4_%T05+۹1ȫm;[󢻟1{cF|n]}ǭ9:9^ñfC[2f? ?5baRVgbT -f-ty㩄 ׅ{3_؟]dԷKuiOܫg \+4tyя|/0١}Bbhx>w/,oMsPK::t PKo;SK __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/._ProcessTable.pmUT CPaN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKS ; darwin-perl-deps/darwin-thread-multi-2level/Proc/Killall.pmUT %aN1cL1cux V[s6~F$aK zv}5Fv,;s$Hi$ҹ|~3vW2 O*r 8Ig -B.YS{Dax~Sy)>Ɠ𦂞8^{H=(6Qr .{SL%;dORI\* 0r!ER#ePg:}B - @,\AX }}_38<xrjBCB JU(=]|mxcO̝ Y  Df6&p rȍp[ެL$|ccm:0FgSu`#ٜ!K`K$نf`0"9k9փ,ŃP6V؊DZ ?"L\Coc~I$FCô=ձ^{vپDWy07~o\o}WQA|@{cd0&VqalAz2dm<{ +e߰PK2 PKSF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/._Killall.pmUT %aN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U> darwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable/UT y1cl1cL1cux PKq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/._ProcessTableUT y1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKSH; darwin-perl-deps/darwin-thread-multi-2level/Proc/Killfam.pmUT %aN1cL1cux eT]o0}ƿ⪋B[ѭфҤ$, U]Us=&Mn?,[мMPo=;4Y% "d+7B11_sݽG-,𒩸t h2ƣgR;* ^,%y]]dmeaY \ :`[`ެ~2)gtK h[R;x萚V7 RZh=z$dųTU>![<7ɗBb~!'=VњBg%^vMiKM! Sqpѵw 'YfEFü nRQ+Ro:>9CWL-6d(C!X]S$5St^++g[“|/:T3 ~^q4|cB+F _"B.n4d)d\*,JX"Vv6}Յ>O{ҟ`<ÿK4IX XV9+3$ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._IOUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK!q:U8 darwin-perl-deps/darwin-thread-multi-2level/auto/Encode/UT _1cm1cL1cux PK!q:UB __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._EncodeUT _1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK/q:U6 darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/UT {1cm1cL1cux PK/q:U@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._HTMLUT {1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKXq:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/UT ɖ1cm1cL1cux PKXq:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._WWWUT ɖ1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/XML/UT 1cm1cL1cux PKq:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._XMLUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/UT ×1cm1cL1cux PKq:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._MacUT ×1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/UT 1cm1cL1cux PKq:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._SubUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U: darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/UT 1cm1cL1cux PKkq:UD __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ExtUtilsUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTq:U6 darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/UT 1cm1cL1cux PKTq:U@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._HTTPUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U6 darwin-perl-deps/darwin-thread-multi-2level/auto/List/UT i1cm1cL1cux PKq:U@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ListUT i1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U8 darwin-perl-deps/darwin-thread-multi-2level/auto/Switch/UT ŗ1cm1cL1cux PKq:UB __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._SwitchUT ŗ1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK'q:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/Try/UT k1cm1cL1cux PK'q:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._TryUT k1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U: darwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/UT 1cm1cL1cux PKq:UD __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._XSLoaderUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U6 darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UT k1cm1cL1cux PKq:U@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._DataUT k1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK,q:U5 darwin-perl-deps/darwin-thread-multi-2level/auto/URI/UT t1cm1cL1cux PK,q:U? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._URIUT t1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKƊ|T= darwin-perl-deps/darwin-thread-multi-2level/HTML/LinkExtor.pmUT AbN1cL1cux Wms9l.Lp8ν.$]9*Kv\~ČY +i943![ <șoG(JO6=!-ts)QXrM3@-{MYzGG\.B^.q'ӳ O(ZKVq5q:J-xNw^~5A`6 fB&Q25^EdY4Q4UJ6}Q7YQ c5s*MB҄;B"A0F: l}{n(K Fb5&K"i δɰ~.͜BG`Uӥhp>DhU2Xφ#=½?#*vO *t Lp#cǗe B$t\L#mVSU(IYnTuhhi17UHL5fyBjJRTqsYE*lqӝCP/PK+Q>Jx%dBQB#_I$w[4Ǥ y{5"$Sȩbo2CKS\>*wjا$ Xhc="єV/VbR෌]gK6#NCckLr(C(P:~q@5"SMaUlv% Ϙ%KnT<Œlo/W.穧g9}]m8oj1h88SZ-2/hIxi; Mo_D`qO(\\ =qq mZ{bݺ|W%.c?3a _\62kT=i֌wK)si舀.U)2hK3_}(e[;?dWJVtO`yÛİDN0xvU^o X&iicG c(F/Fw+Q*3v &I`qi0K=GΠͦEwʿͶ)ĕ?F|+b)ĶB8T]AaVI3h2[~f1(I[)场x.zr]^_W-caCi.YsGF/@elQ|pj,/&.r$Qh;M)RF% 8c ׼uhAb /(-ތ9 v>J_DICH4R!!ͽ{e#T7Ag!p(wT ,PėtK7+Q*?/GNB&ԓLh|]f{vپZ0}F\jf/2n4᫑g.#G`Mfi7$:t5F|.lJ3E ?}|on.?ʃ/N-vN#\wF"diZʲK j//ǃlC ^jXƻtyxp(xbUaYzHMte;߈,%lnVhf72 @W/zDl#hBG׵r}='ԾA{O:W/V߽onJO 6IGٍ)㡊W k]B"0zzqmIz/ّ+8O_(mny&D^? 1\S[@ƻe{>~r5JH޾=OAI)x &ZT+0A6KLԽ #S .ixigC4]gxGJ(>T'=_PKoQPKƊ|TH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._LinkExtor.pmUT AbN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKƊ|T<> darwin-perl-deps/darwin-thread-multi-2level/HTML/PullParser.pmUT AbN1cL1cux XoF;ũ$DVʎ.>EI8""W]. ]*;= 3̣W2 %>| ,P4Bš4bԯejj9/K#Nu>ã?O'Whmow$Jt \j?M(dQ0{;#á2BERa!bmM&e!ԝmm^l~V+T ~"RH\z2:TEXv} r")\?=rTWJs0$ ]y)Ah&yE-2ZX!e񑵺3Q]ԄW|s=ŞygF2o#TOsmцtEMr T¦K\L*v+y7^jo1{q %I$ CtvLSqoT,r1^?jsDIxxBfGd_uBι=QdUeyiϔ_eB:5)[&DW͌QrwX飊+]mP ]s6YcJ>\\Ŏb5g&W{ȜC*?퉖iq፲ɡ9ˍ@up-˞PqGҁ(ڟncm[#V聲C6`L˲@M]Km|SG%2ŠkMs=~=*lC]Pߧͷ^jL=Mej @$TPP mF6LJ]q9bzleNX>^6;Y>+vH˒bץVRURM4,7xW+?ׁeu=f## Ɨf x1Nqq,3Lq˥D mL\^]O'SrL lts(Zi]f؏EPid"RGZ~Z8tf D-4 n&~y҄)6z8zBm E`k@P~?ҢKe4_u ڦ& (m$H p#!\WML"Ť0Ɗ?yF0 E:LH7;+Қ "TEׅF&L]KuE)[AV's+ӜC"AK|G w)AuN1}m4@5 >V-PK 3vtgW\G.X2RU(272r#:Q,MƐTFg' V(74<\ES;m|B+#^'OO ,}s_ ^I#\;{=.nj( TC~n@Qɬd̡o*˂ @N6t[,J(uTy^NgG#|NȾM+cEd2u[/W Hd"I+YD9K^4=1/{}4Rw:z2jJ>NXcyFU)c|'*E,b?pc.3W1C=m[NsST#m_қ,N.j%ՕΗD4f`Rj\ 9oD.W'֧`DGoutq=[˽  7<.ե4*n k`rΒJ*Xɪw2L &P\YIr^!úЯ7A@Hvjg@3$l><a*wj6$|sں%J#7̀҈RKVSIäg.wAT-Zĵz7"Ҵ&MJFN `ϖ؉m/(F@bif*;$MImOۑm6L3QZk!I$${fΗJ)7\~<ӫ gzV]]<&Fz1ɏ?p'CZ`=ˢas#"QcFO\S1bJ.5F9Y¤2˂vLszPK_d% <PKƊ|TI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._PullParser.pmUT AbN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKƊ|TC!> darwin-perl-deps/darwin-thread-multi-2level/HTML/HeadParser.pmUT AbN1cL1cux kwFs+& f7ņrL6>&i9 HȘ}3${mlI3s'g9{$'m]/l\gMF3G!!`̍f钇24p9 F9]X^̺[ߛhًKmO;YgN2'~(Y%$/rfG6Kެel1)˩3Nj\'\IG6u3G0(8'z!(a][hSGi6 ͜ Ĺߑ/ZuIna .Q{TgE.wi58vn-fA'D(1 NH'Q Tϣ@؄ y: ġ)b/Ѝ bAHi:$`:^~Hn؃'J'$"DӖ0 Zo9y4@Esxt k/A(Q? "i}Dx1\X*\/ZŪ },)Бl ~P^pUA. d(5@TPn 1GQNS0@K 98۹YX xh[Ϊo } ˍ %+ZRȼ6"R.Hܿc@Wr9ogc OHt$N1)ް3i0HF o(pD>&c/WRQ|w-کRftfgNXpm@F@*R(WҼ 4uP:ϩ4TmV-@Bu {|6<)³`5ԝJ)D 9)'I["T1 3UuR,*Wy‹҄P}^Պku( v31gͤwbݼ;i_/՟[]=0=ZZ~ǖ,*5֕u]LFzQ"t쀓,T.҅V*CksȽ]4ʼnb݁Sa'+f΀K0HYr \ڣIhE -L]`Rz/S*(*,e1E"h9l]o#`/umiBϷZMZzh[^1Ś7^|z/eEcZ<>)fufs]qM6{_J>[=olhZ=n$2`YS/ԦNot9gdР4p0(B\ YLQz(i L\S/U> 8O|!RPW d2VqÅP5DP,_dƟYT ζ޴7ڐqvR'!BGLT:X W kB ׽ݟ۬Pftǰ°5 kϬ*LR/ >T_w: =b W'KXbϟgy @+ `o(гb7 Ux v33ȝ"LSl9;5n~j_rŖ\m FxՁC%vϞ<\HO} H <*TP(Byi5n-B EI-xR%"y) N[q 3aM` R:;;_e885BP4vꥌfoPy3QPH1QZa\'tĴ{x91pn"*TE5۷#՜͹lKڛ Ȼq,&@r3\g5]6ʦg4=WV[!˅818!Oo!yܠ[ç[D瞊x ^OZ٠a埶 NE==9욀wBŗ JҮP$}O4viЭ.LC䡂>|^QVh,QU "cV(2ieC .5/dRXu/OB;J8BY ,ٖmȒ+ -:/h{?<]紎-ٳg=xrϓ/4f]%QU餆?ug'?E|_&R=NᗳE<ӃO3zɵDrݞdqU",y{ ?h-g ũ&V o/> e2^FoQ_{0"#v+@r16'>yhTdH ?<IzDu"^&*%|-??Y@fȢ4i,IEΐ~gd פXue_}|3Ed/Q\(dZBE?<6&PNH[F~x_[տ2Oy >TF} gD)N&ݞ@7ݴo7Wh{pEo}IW@{ 、k ˸Ljsu$i1Y>0zOH}7p8OU e$򊙝˾OG86Ѭ,Ɉ_{.es,)[>2w͹7La(4ɫsЇ9%2px|"15ep&%p,<\ $IQI*)5U4=o:42`sh>X0= tL E]e|IQ g x\/^zźƟ Ei*xbUQÙ^XqY\Wi E1o@2+F eoqfV$m_XAZ2I1گlshhb vRBQ4Oh8̕ 43|~cL ]G urhiE{0LFS SI+P.K(NfBCh"aj% tIؠ F0,ׅ:˄dD.yءGEeQ#0`DϼWOՎ"TDWQa -& \ u&2;LE].VPԬ&T8-fu;gY)!8J4 x5缾֡_Hٙ D6&~DqV͢Áv  `AsT A8`r(sW@Ww%e{ k ],zQ?·v"߻T1FĢG,uZ%.tF!NP2%Kސ(`An[8kkcb蠉tX܁H9Ӌ41~DO/NmZrsA_4Zvlбۢ-Ptj,oĠ&-𘆅1#Sso|gY%2&*ѥp_MtYCͧ,z#n\>1u5$D\9 XР l/JTk N GQbHUa_w,t4lh! c1v;gh$osLrL&]qoYLaiU baZa $r eEd8"v*bI*r -+]zMpUBVGtA)5<ԕYEsE[O#;J9.I$qDg5!+CRv+_ c'[ɍ(h*x*6Ҏvظ%w%:=EI%.xD^Mly%c^PM?nYс}bX6X" +:7?bBOZCEZq+9zzx~l"t!4P|5x? &p)ad`[̈6#H8PƘabU` <͎"I\7'bo;i)ԁn^I-;n >H*]ȄdaWzgh&F=]_Tְ8Z9&PI0 y2t !(cks}JRBk5}\ >ҿ 1N%3O) In@WJ=+V.\B~2}Ιm~n#i =l?L+F ?mOuӘ]wp-O|(l; ?J֚4"A9"Kghoc)CGSxu::S!@>Ƨ eZ^h\8قIϷU"%b s*QGKDFE/ T/k ep$ m\O VϧqT~6Yb{g^E2E-i)kShM@mB8yIPQ1b S!fsȼXN;Ȉ '%ҥM'_ &)n!/OQC\pTDz9  9.@D٩Z9 7)Qy( ng #;Cl1p%OJ&%ʐ-!m gidn߃ϣGxʪy9yW+zqrv>zrGwG{kb[z=Q6s@VP=نYxVP3’PEZ2JK.kB&۸J%JԦ VIPN5v;uuɃ8+0 XL. (ϥo_(^*4tOy?>' /eXϕw."B~Z7|LUأ*%fWw$̀ax]yRrbbEmpށOwSe&kydSŵXQ?-gvPt `arŽ'*rhfNwN] A))2&R<2 'H]D+m :`$ m Dl ¨NR8Ԝ!ak'; 4;̱NIKB+kқޜ?N7^%*FŮ zB99SV%u|)+OZ(\ X$PX'=G!AN$%pe 3Vvҭط)#fҥ 7 `SWCbRH˽yZᾈȑ/t>+ߺQG4__A_36՘4@+՟$Y<}us9>in\a){䂱o {?F*ae(Z!ukl`FW-֠ڌ-И2QtHTe{,X[2I@G,!.Sb֦kJdxvL+M~=ZEy #W[ (l`*\Kk&Zt& @H?0IDMG #N%%:pj1K^XXfVG;\KғXcZhI`B_]rjw8Yئ򩨡T>,"A$+ ^迻 #:ZxݿO3*vzgܓRWl ;Qcvl{^F4ұ 1lٖTYAm$N)Kz9TH;Sl{([,{ckA =hRդe7`8pyp9K !2Nڒʅ\hҌX$hA.S]'7*Dh\5Bd&lUkhzЕ,ioK%Q(3Lʑ 0IDnˉSHGҁnc8TBpLU9=H;j6R&(ձd1,SQΚ sёJku%jM2a*kuЯ#uS6se1lc,-ސ0HG 4 ٢0ota 99 #y$0(s\8nޗ]Q"!.ih\ f ɟ&a\x&"pekd?[tK5m ݺT#|z[<&E "K+C[ (䣗v^5Zle0ʗ}.)15(5iϥH֮c5;賍weǔcޏq_8zPԓ*H钗ɆiXK8G+ dfr'\~Aj 2#C5<>L+@:lA=y p~n_~c1z|[`'0רE~liuqʼntlmu+”d$ܠi=쾴 ^a pq<WJk/2WP&jSxkLu̅4)lqr- [fsQG+]\i+#_{A˭"ۄ]0kH ^3ZGIO8*kF8P_t=Wؿ;k[4ZՍ]g$%\EdRѪ eNVR+emfl6*P 8lhZnR,!pCU%Ɵ5Mh-=kiW6B1%سKr]'n50ya}+>!? Hi[>iBvT=r+:oe`&s9iXVڔzy?PvO"W}8ͪC39v| kԖM˘ψ|F-H>;D2n[lOkᴞ0~uCPg[40oǫ oO`i`UK^_WnRj3R%Lip uHrڐfbu7(Y>1DTyO(RgІz᩽_qG-_'ö!9%ieĐDY4`7UI.jxsxte? +DUs39F?>~?g8fk9"%p#eQ}}j㒶yl!%MAqznh]:ĩA{Q }~-+^7G&qVMc2"FTqlyE,\f_:;z4[`zIn)v :7EKQI}թyupf\>*~ Cj &(M(Dzƌ0`L4^l.`;ftUkXTY,0%Ɂ:RIE^B͟r^Սl{i=,FZ`\<!!g,{3>kUOҫyMHucf]k>txvtr*18\Rj>Q2ۿiDpѼXS3x˂#|N$. 3*Wp敳)*U@zݾճFҪN41;mbL%_ͣ1@:#?N]H|ux~`刺Y(:b@=Cm~FB ]l^&׾C +.g֚jH/QZw\oM7벋0m~\unݻ;1rTJۮl}x>UO/ kxm7Hږ} ">}gr V3ۻo{]"~w<9zqxvvs\]F\d}E*\RD%R6\5dz =F\Q #}A$wH_prpl$__zq'uT ")͂&~(Jf#zx&WVPmw. A+]s|:aO ^ݙٺKK.١s"б3M)wzzOn u~Uo=le5i7V[7.ϵ^"(Vt׋a[. Nz&/5a||1&bPR0rc]f U/+ٖ(oȡAηt0o<9[ֵ}k,), 9|]Q|jb;뻎jo+IE)6 E4Kɂqs;iSv pc?J+ӛ7 3Mp)}͋:dCyE1wڎ;|1{ˢ֋g|$ϊV*i6XuѽG2rn \xh|ۙc{6oG;%EH O%%_06?Fṗv0M u+^Ds>e})1c}B6VOJrNVqNq>(O<@kqѶT,5k-X ,S'Ҝ.4\/vh# \gպ`4(Pr${ͻ|[ UbtMr㜢Ⱥ!Ĭu-,{h=4LcPepFT]270{9qb[aZc!fJW}57>OԜl]-y|p8u.y2%n"gz^>اOV$*N͓17>د둝; U':=;?9긆yZ;]O8W(=H4CEҺO[K Lx>jF*WxJ$bh 4nKKWR< ԓxnC#H;+M ~f4V+w]=^0fe`@Nm&/Ufd<oDur+}ΊdSe7)_wZ q#˴r]"!ƼzqSOKvۻS^)dzu7ڐ85ͤ7W 'SHmk*ʠyb3hތ ENM,Wv' &U `zy}w^U{+p^vPн','f0N1S%\3$^+M"FlA{&TSuSsںRI@|~z5(*dVK+m^x L@ w*a6Tv̓,*Wƿ8Kx$ `;+ӖøM<+@lZ(~٫-vә$#92ԙLj9;[Imdx]3 F $VL?P{5 :" gZq1MwPtZ-g^(AdFZm\d\{a+JvbwD6%EH]I+RN%r/EjqWOE}vjl\c7Sղ P:'L瘙h:[ГmF{~&RzQ٩1/$x,(Qz2qƺ/J0~iG|@Rx_ܤeN.~搱 #*i7lted8>c[w:rxxu~ p'M&ʕkŃMY{XXOzoGB("%(OWx&ϟ*ٜ|]UNdE/mXJh6 ( yaμ#'t!5\,aϊSI N'nIST aB慜gnhFr7 ryK|`aC4qB3#j&\٬}UJzw}]ۇMɔo-Uz ||cX]>]?|ri< ڇ&r@/Qn$U:u nI"% 8 ^V0x5y SZ =͛7F PKZf PKƊ|TE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._Filter.pmUT AbO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKƊ|Tm:< darwin-perl-deps/darwin-thread-multi-2level/HTML/Entities.pmUT AbO1cL1cux [[s7~ ,)JbJJEqXk[*KJ%'!H"["jyt2`ڇ8$EH׌x˗WASΒ㜱 d?PO EPsdJIJ$R\<>iaCF,eS!|o`!uyNݍ#鏹 |7]u;\F)q@wCc,Ν}L݆Y8|K2 =/|ĹVY< /U[41`Fbyԅ2PbY57!v0v\on XpĠ:r7+*% v83/A96Ȥ^יS[AlK'a,2o+F}Cg`)1K8`KK= 3B$nI,*by$:P) x[`_Q0X~̿.$Z?D1[ܿru-'jVsř T N!-4S3ZʓXn)ژf`H;`,X"zs0WwF>Y*Bxy+لT@*`2nș (j MkI'X- fGkBι|G,AXZcb=EcR i M .RD)j!EZa%XEvv{yzivaOTFEdzN 6xCcj`kCсp,) (^іNa>bLHZG2HQx.O,cc鹃ug~}8s8PG02I6>WNEFcp.-h]KF$@IИn55ivJ8Vwj]ZP AuqGAޔ5DRP/ cE-+a `H bO<:Y/%Evf1V!r2̒PE1gR y6/pUOHB%(gz ě uL~n5 V4Dȹ9-ah\ U-fgOWrog0-$GQAݝ$ZnK}_sZ_4FojJ8I ?1c1%;efva׈[B{[z;ٚҷ/|ՈC`g4%$ HJC`Fa(4.uZsI\DDTJ:HAĚ$.l+Ga"zMNѲ^.ǣQg2\ͮn˂8+rqWg j]"Km| &\ϒ _nr莽_bGz<e;nIH0G%v[ʽeaAO0c{;amhgC.]щ)z "Gru-M\Aqx ̻nc~Uļ+020BZ21*`mJ{1YX^Lc% cf1i0fTk[#mo6X.6tKV_Vw%!kq0Vvz%FmeNĶǻ߽%jdĽ@6&{ }nĽ_LcVlbC-~A-qwsvnmH=5uLhbwYkj]wdqci/QNQ-Tjf 73- \kȱt}55Xu/.2@rܱ\a.Z"0bb5"0Co87C'4m m[C~b54mw-Ьŭqh6شmECi/rɧbw Dh#WpԁR#D %BA333g\}fa?DL"ZŻe6bk,2x-_,SO1,8.l{]*%y#heY)D:{a~NN&1[Hyq/\/L_d*qQ"qln䤳x8c'eTz \/ vq0?{SF\ <l56[34qqPX|(,w Iu jW 󝸰n\w,?Jp-p~Q\XEnpvw=qN Rv qגoԹPsH'"gD; R^pY'&IIuiB]IJ*H=Ir R_$jBq#nF$]pSR^iQj|RjN8%}[j I3/IJ(឴9'$+R^I{aZ]e,,MH_iR _,i)BMؑo+H yи9hUhTH)4mB6S&̖p_vJO|%)eeI|IlmkL8  8 8+ YSy(VÁ7-ǡNs^Cq8Pz8(4r AIT._8(4PpH0WndZO/|M.k =`{3J뒞Du"˸՜.r 37 i67ԘM\t\'!nFܠ# ]'t1+m]~F:Q%tYW:^ cXwNpGsmY jO78"~v3@ Q |䘹[CcU4]V^{d*Z^혘.q-O.Q(}Z7^0HPm9eߒSߖ$/It 󂼡0„q=Fq S^86Q"u7Ƴf|vp5KAT|_֦γ)zY<o&À=m+h/ ϓHm1V`HWDt\& _| ;| eW^rw61[(]0TH>U/VO #k~mJ1[/C< ¯ T_ | darwin-perl-deps/darwin-thread-multi-2level/HTML/TokeParser.pmUT AbN1cL1cux Z[s~vfRE`Tv}QP-*.llqF-ףa.x{s232Ry }n߹8WZhJŁueY&P)c(ئ}:U]p\ݻQ!8· ]]-?:]7n3f=D@\,c>_ݑpVJӄ0niG&rGKfܕECI0Wg9cwh r;wGdE%޲Z%uY,8jU8~A#ʫ%>j*Hq͢ u|>nF1NW'gyXb9c$M)U*UjPk-mIyR݁ \#bkS-ydN3S6V&>m.Y rI\jI2L5gEgbfs]xɚ1L i8Ze1vYs̳$ɮM+]-teag`* r&CHFoܵT, RZHl+T$4 ]*LIp4RJ+{R{@b#bS43m*T ca샙ӪWz=2c;94]3)R`ByL*6u4T)B*yiIpSS`kTq<*mQ8N:MU:IC|&9~A74݄sUZоauq @T8VRO( qpˬNf2XXK4ԇJd'H&+wi WfSEhvj"0{}9/fjX]HtAs2|,-IO{ i S"? 䴮qߘ1ka n9W܎cT,3:gٓZӍtLI;їـڋa9OZf,H >WLre3VG+v*'.ވm+ :fFGyĥo&^_ISϺ \-!Tm]#AS17]~]@#Y7iv|=ѽ~)mwbMam9іN #֥& ǿd,&hAe.NQǔsC''VF#ZF Z,NkF'8ZozvfMV'D%&ռPyrȔ5lK:D@MlމFPX9tBZ7iQM %m5iĄO8$Rw]AkLl4H.(YvH>np݈MZd ֎M*`WÊ}~ ()PXwߥB\k^ަUi{8.e (SsW ,[M`\\t5R1جP⫁(,wp -ul@+Fg^( $r;<-aeQ`W+ 2a5sb0Cif['sTMۙ7)_`I]{u / me)Ly|~"E>*m l[$#RԼs/l[iˮ nEX6w:ÔTuhP%ubPA{<֧2%Ո=9nQrl3w|3;`FC!zcA/qu׎ -g8>,sLՎ.hbyVr7Vd' |o]dMrjA5IVN_3c`B`(Ӄyg)us@˻9 7?,p|vv:5)r]7|Jj*Ce7^4޽[_6YsjGpLj;?ϫ4L+*ߎ9qR+x֊x#*݌.,FߖYYd7t"$!t+P\$4Knu;b}vʦz.Bn֞;&ihT)xMj$ftWáfIh0I4aAF jȞs>wpě͖]xtjsh EERmg$dG[_Q`AѫKmGq7ڟskۧO{n?*/ʵMlM/h-dxR47q7Ɯ7 ێ_Bg~?GL LTb3Et^]#q3SiGQ-7_M0#%JJ gA-ɜb-+PK\qg'PKƊ|TI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._TokeParser.pmUT AbN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U7 darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/UT 1cm1cL1cux PKq:UA __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/._ParserUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK:8OIl9 darwin-perl-deps/darwin-thread-multi-2level/XML/Parser.pmUT ܧ]N1cL1cux =ksFWLh'e;{[YIZ lIgm "V d<ۭSU*0zjo"*JSG>Η"Wo;Ϟ|U~@?~8ͣx%mqKӿ'0~o2Bֳŏ=>\.4 5EYyUETҰԔj~ՏK}uTk;E>k$AFe9_Gua}֩gKYr#lLϗn^sNr3vq0;M7o Dv;@ѨO_w 84Uxok2ɢ%=q d15$3>6'exbysPw_wvk FpFicEaJSHMLw׳y[G~%nn@z~Hu5u{_ ү둞"Ut'f&\NMW7,/Lϙiߘu%#myN4*]d:-X$SӘvV tZ|mJĞA`gjAb:ʄ+ŪIEoM1qG8-hOdZQ8_,SSw ظaq: ={8]q#$ݒSEkCУU} /|_la<?;@o MZVbuRԼݸhM$A5MVezqjlo L \!W <OkwIWEKP>Tndu6pr-{ҳU/[s4%T;}L5vs p;Y%x=9ec(; Jʨ.t޴HVc1<rVuFyoj3vAb"b umnjmi#c!^5J( _DAZ:}K׏3"/=>L! =R8|p/u6xh:= )=Η&@ol d6:FqJ)~}+ &IȧMgC1Oy@%qR) yn<μr $ `$@1Lzl@9}3"Iu{փfUCdC~y[ g"$$[`v66B-> (PsɇnE0 6OО&AZmv!Z,=G% :+L!(:O%@xt8 9we?<߮t.Rg^€ڝ|+U0Nm@{vy_~?|u0޿ U*PkzG%VfCP8=cΆ9;;]"4f9ǶNduEXq{7;Vݟ<{d4Gfy4i"‹->@,ɓ!@Du{٧K搮e Ԥ=sAsQ ֟S zLw];%9> +=ۖnAwn"_paȃw<ߵLUVٓmkVYOIF;oyʳ} tss vtejON/ߌ.FgJ+B,djJkJ s&C=cJ,?,u>Sڹ{8>bWjnMdS̢*w&[ELX)&U0mNz83F /gKLT\s`n(it/@P~vx - ^8:AlqBjML4bC A/BDᅗQK`d5)h! Кh(zTaBzRߒX" 0@jBYj,Rt UKkzJ)uv/6N^.!xldrja@dI(Is}Pt<@XC5 #~|@8ãX.M3eĸPsߔ5~"&܁>߁?gCl|Jym*.k0ױAIƺ V)ROXi>(!RcѡO~toa%mTV1)K "mF(1ŭ g L/~&Աilbq T^+T@Pze|9ǰ*4x>;Lx+ה9)~x4t9JP_C&%;*iRƫP-;LdXnz DA}zJATT$t XXLa26}<FN[ ӲPp4}|V|lJaT3pe'Jar+ OުjeH9)E?)y6  40̓#V2_ˠw "HLDY\iLPġ9a>,2/7"f6D-zC|>@\w!*1ZWqӘDnl^.e6֙E@,ӒEX j^O|OAA9<ie%3:v >LL)qb\SiR¡G?=;>?E^ цγʊ\dNTĹ@K0E3}a͘ Ԑe" \- &Jf!)~HC*hm;L=RR5~pc9޼3vI*,!Hkp9TT'T[#^ KvKlըlhENC!:.ցֆwhH63<5 _ȩ8UDXP]{k@@ pljXRBM5e׻NxQ}JX39R> Os(lMj5瞀Qӵ&%#()PV:X(8˕(D0;Ceɗ*'9?De*"aw'B,μNX^}s|q~qEWoOCCq^ڤ*>T4SJĈ /Xco,H88)UGe$$c>df6ڇr8I9M:dHgK谬3 )Տ򛔎,qͺu/a2DTyr.*sˎ"cuCl5!YhmכRqC=zkV J\&Q/\Aupvlcѫϰ9r zm&>u'q\ax4xSy#.,i+H] w=$2P8dP !QMmQWKO$۱3 $XUmQ8o|d'kn8 CYki皍)5[[R;C}¥ƕ<0 Z) KcF|T9 [֢ $+Pl@$#HHhĠ(VGQ -wL\9jVV+)h?IVZ =*ȪyYplM2Z @y0֤">g 0"򖍗PpURх A0aXQIgF"]Yx(ڕt9ZGJvw YȚ6Ll#m?TE10ڰCR5^/^$UWQeXh0x&3)l#pjHVD@g2\sO U 2$4lh#C2"0t4cAm^-eL/ ⨿Q$-bkw/qtCTBX!ml,$m->v#n;%"R"Ss!m ]X_ZK,fl"oUi~]u]l0QьZ\$#,q f/D;#$Lr{y\(z&m JiROԋ"7 tN*,?0'B$%ci)@M*J OMlsȍҳd6!_:uȢL¸Yujj C0"0,cxőyC ed%*IUL Ʀ \dPۋJ+)&H :GBR6tҤ@@}2v@!6_H+UVv5# J~ )4dpRTa]7"dԒ.Ј}\M$v;bS%]DBRZ6#&SOwPO=D^d(EZ'tH/ 4ڼ%/?@#&RU` Ӳư,3BYeŘ0CF5$9zPE616jןNrkAqqB9r3NK֒9Ivh6" R3i>Qo_ӕ : x!<('Զ9.dg/᪣h-N"mH `^]ΫDgp'k疘3zZbZx b\$3 $v&r׊(r]5x1(pmŔ$#f[b|9htdU,qIR$Mn[+ZL 0x'7i-?CT~QpSD^U,(:]6$,n~>@ԭ[U7V }$mcEE5W!3ar.WƦo(! pS:#.cD!9Zau.iBV,ٳr1{1oFKB7Nm[HBG7ے{_SJfqo2$J̽ @+Yo@>0*%]clMcskdӿA~EzO5M0J˒wGょ6-W˫zes.T<뾮6dyW ۯjJoe 6Ro.Z؄f6wpDR;ă+" $6`-x){ޜћӓx5q׿r %ֹTtSJMIAm@aF(RHY.Kce͂\7P#101vRL,kU D@AjV壇JuݠUp5c?':%Vk[x-Qā+4nmBGr``}W)r ;%9anHtڢ3H.ٯ,nSeewM{uE˥j!xń+KL/EZ9 f'Jr~hW^ }1lɟC $?)1aʹZm۶ÇZ&k2/XH0n=*> <-k&Qt+0X'RGؠr$ktd|`zMM j &+C% ɨU gͤ?e3'?V}S)5WBOBdEٱڄ6FZ5stRPǥa@0wOLX,e 'gfEsŠql7+B)MynR^{lȉ 'JppΛ@T0V S}*mY4.=@ADϖY x @A?xOOI氨I6(/sPtUmIN..ǟS`-Rh'$P)b[bL%OyGɕAW~xgN#{7,o8``.<Ӝ+u'͎{o^E:h O4f` #=Sis?("+{vo@;pst G]B=et!k ѬeGjm?r#|sSd>Hwmn@.dM, ,luhuzBѺBwZ%7,kD.7g5[zF齽=˜yc^Suˀ5T@fas׳&ڴ8ڜXLa\Zf^+}\qSt%dOO\{)k ["&p ~+ΗVbkץM~LJnMW3;.\fS`lg -v_6*uQ2=lL=f렿^1dae@_EX]JéǺsj^/i:z.fMٞ- +z9l6{ګR1*%Ւ5ta{ZWFnnwzi?CqpUCI" %:uޟMetzװօnҷdRK͍[c2vV >)^[ TS.qlk"`lYs\6) lNڙ-Wܿ#+ . ڦdj wl/hԸg;t~IO?-ȳv'ˁSҨP{6bK6i& ;)+vKz5#?6[JTncR)EIi.27!3}k讶 ww~ _HՏW/RޫʋC}W`COO#?b-_d0V&/KK2yQ!Qv-8jv/X>0)(; =L0'oUP504#{'iyQ_9; B~VUPKX//#IlPK:8OD __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/._Parser.pmUT ܧ]N1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKU~U57 darwin-perl-deps/darwin-thread-multi-2level/Sub/Util.pmUT bO1cL1cux Xo#=+v$vu*bbhj+1^-u$W\?{ߐ\Z>#;i|f7|7{+Ǐ~'O|TJ]I_6~8FZi27a,4b0Rr F^<:\9.T_\{zUW4ܭp\%wҬ-ISbʲ3٣XJ>G!cJUK%#?H>}hxk/gW駻?=~-VlXz^qs97C^;s:?=;f~@[ 9EQ4cqsљiekIΟ 4[i?xs~v1v"?7W?OKA*e.xcPIZzM>}?E idI$us{71FZ(k5bOg8ddy+',~" -9 @ZSnkgZ8`|Rd/?01/)I-o8ʣ$t$"@b21ЉXF!-hS'dD@\&&AHn2ljG0˚jl?ySrtmY8cVLj"+u`Z,&KsPbŋ*a+T)T&ֲR9/qZnOotk&r+ZmWex+MWNv\4 M,ٜSP\T8^NJj[?Kazk4[ dpȥ|BR%ܥUUhB$>O o;:_.V'>璃Kǜt71G,aڇ/$]^p1~mfm ?AS̲oS)O^fp/b jICڍ-#l\g"P?%k]4e$HϺ!{6u{]%6:yF(DI3#ZOb`i[Hu0XcxeA/cB\ݔ$E|:YGlI1ٍ)]GntXf>oȂ:jL_J, @04^#?Vq\0a[k[G 2W`%|5SjJ5àj(E(sϻq+ec7%3n)&Iߓ:1:ؔ`(C$uш"6/l p"0Qd)ӊZ΢^U>ǐF͵^r HM-vFvuw?އAp>#zvTP`ث _ !^y ug{~T ^]fQqPKX5PKU~UB __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Sub/._Util.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U6 darwin-perl-deps/darwin-thread-multi-2level/List/Util/UT i1cm1cL1cux PKq:U@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/._UtilUT i1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKU~Uni8 darwin-perl-deps/darwin-thread-multi-2level/List/Util.pmUT bO1cL1cux ]yw7#kG҆%;:8m%F$9:Y= =&>$gߺF7$3},R$~uя"ǓBoF[zÿtmo?_gfbf2?<ozQ:t[3{ꎾĹg8vYtT\EZ$eE&M3?Khf@w3,&m6s;w&N o:{;`rLM 嵗f^DS")UT^T{|'|OeugV eOΏ;Я7[{ϟ]\>VWZIzgygqg “-$0[Q`[갌 ] "Nauy90(j>O^$~M?D@S|s9M)||B?5f03Ka ~se33qf -\ ֿ?>;?y)|S?tݽ{wp 45Cd{;͍ppE87xgGOy9 Y f >5iE!Bwŗ_~["- lz T4RNG4Ok3@Y%N,M ]=O<<]sݡo vFfG|nm=Xdl2&f”창ˤSr_N$舴h{bQE_Ֆݹų:t/Ϩ{BwG?=X# zŒX#؂0n BO-H K~>{~~rDȪ`F"OD%:nP+B:VNxɗַD~VMA8J㳓 OJ=ޯQJjx=A L̦&jfr x@B!}$AᙣQv4Qs/1ȼ&`MrR=l4ztH5 tD /\́;o{}(uF\:!>5#(@E=qcDB: Rpu'A_[̀6=Mk'tu ?q1ivpR\9 h0 ~3 r+(Ecj2PFF_i̪KW,OWj|x 4osjJeGϞ>U?栿IRՈ>vzޞW\L`ʞ8l:6iߐ€Ỳ;8IaFj !{ѣq)ȈP];!a&VS&oG&5! >IPݢCv413 *?}'"2JP>n-+J[G7APh[c{NzXtaV}|߽;ζxӪuh 'zNk > yc?^OiXz!얖)E*2b{qA˰j?y; Cc!冕c;p3i=M LLެk+ff.Ľ0|FiI&vd6 wtaqGck(/ȿxS@bLj(øl^Dܿ$3X,tb$Als4܀8@|sW2MIZ߼zϲa$7@qᛎ@-;AdrK?`=PM%(Rָ2% Դh3*$-N f`<ΉZ1ߩL-soΖ`hb2ǩ{OJx%/ pu3C1C͹YZJ/lSC]PXXdּ*'at.rT+đ}"Uĺ"!lkGbaڈuR#Dnm*u *zJTm2oZ4i|?y[@binn$0*8t@[% xNE]AD p &PVdܖ12~uZQ@B^֯76ĵ5V 8R#kxn _Wce kЮe@8|D 8g؎}YA 38$C@VVG;+ =Qa 8ΫPj*Ќ&5#!n6yٹ^!F3(LJH:y`%wZ4|)@~Wm^Ϲ *Di}5fH_Me\Q4_[ZM`u֮lJ~/2h'K to296qBSBSd%4V ~ݭ&09ոdqSHy..yA64Dͼc'45Bu@9%辸m` }Iq iv j`DM6L(AO=Cv (WH͆+Hhx[y2se#\oH,<ӆCR <)P?ű~~trFg;Ty"8D9v\ǹY~1|.>KJ_](# '[Jˏ&Ip5(&y\o^04qʧFg{qdTJɑw'("_cS?Ӹr̉tO.}"<5 $q a鳋>nH^'X[q'nHpL4R71uєLfuoGV Si:Ͳ!{ {H.-) NL mEr(['*5U< 6YQv+; &mrǮ tXb,#)D* *-OgM *'$(´^$XڮYEi w6*t0ŵh) 'ZJJ N57YGdMйLG_`A;|uErz{=lGodP\ a R5n޻a91C*odŸ Z~ŜYJs6&9⻷h -U(GˈEиWXs^Kd JMHSͤpa )P)xHOVYIIK gXTbxkiKb}pXyJI&]Y'z6Ҏۦo4ߞkD \}ɹD H QGEثT$tӯ4;/DF }׹w^5Mގ&vl )mG)ԁeBʭW%hNV"<2=D]xlp!EʳDm45! &D*Y7 j>"H@16Lw_nwvHP<\-e)JsLPN$u cq2,JtJѾ)0BAM.W`i@VA)H,X2(O ] 1 `K%Z2<%u$lJg`_[BN{\njLH&d݊/s59t&һ o;kx?rn3Q .ܨ*t_$m-opGXG$"7+ʉ uSWq#-l4IץmpB3x`np12\b޸ >)E&~$Ohѕ`ۖŌ[nku3[(&:@T-// J{|UsV=J䃍W:Z`FSGJKunƮ@)1NJfAJtDUƴCc _x_ riFBF5jXEN}d23Br6uoSYiWI9R ,#O̔Eg(+;h[JoKpՇT_,gwrHh>?]9#F4hLI2pr o#_˕wUܡXvqOjXϹ JT|n`-T,OJ)kRY0,w_fT\"8+0L PIcuX>aM*9l [{ DZP" i٤XNG8@_`hj1kvq]~GFϕ֦46[WY:6:d3]`{Ҏ?VtBdi*za &RJI8}쇧ы`IwPܜ;R@}e2*,ѳo¼P-)P[uw@՝C=2۽ރv_Z^7gF6*BTy7P)ji.+Yih^xӤBP4yAI?O~KGGo3@^;;tTX-9kjf|l{WT]bOf`UL+_WL>)wS*xZPޥg N|BᘧhԓNQ@C,J%U)zg kJH@64~B{AnSiAknVISG79w)m98.,<)*=& /?I r^h2S;Bۍ=u^>A )80fc`Z𔂧{GUV1\8ij7r: [ P> {rSmYDv<|x[z N~gnEW3Qp*rv"ʃ^6&`=ZfJa;x݂f@lb?O#IR ;`w 9IPT,I*B`VBeW7A=юzQNQNai89N9phfxָ@8}^m>Qj¡`_omZEuzt>Yris[_Dr2[!ʋ /M,pRrMU],з]rğ-{cm=Al7tƦQ@,m>]] l&CC6c*{4Kce,[{;ikzzu->|ZQviRp>ix#mDCx)˝^/r[6~q_t4|c6>6T"r\ϷϘZ똥xUt\,2g)㰴+]]K٤^ĭQ6z"1%(,][EZ,怢z-U8e"\ުIk-5LEMh Q(?Qh&YNZ~]=TR\$bw\I&v $=JNt _{%E:' rX=-F5Zq$ Sp( ok"UqexHM8 +W>ߕ}#^<0xUm&J*oz\6]Zoh~c=Gt*gV+s@%WWN<<*, gW AFB"ՋN;a}/3Oǜ[葥L6ZBGO:f;Ge%xC,t:z]΂ ͑@$kjF,s툪ّ6{d<@қ\4r9F_cCnm|ZJPi tDB%KrW{w@5l30dS)G21gAF6_%5U/Ϟ~u#G^R)1Jc YZѪ _.ך*ᤴ/$|qa]SFj3,=2gJ XHI-ϞWWt̔4*MPP"[)VxTmhJ_"$7s0@)9yqD> ,>[3Pt:A=|?w>|iR|ݬEs%w/->,zb6k<<>}zm\+VQӗ\'$_a0FEL>crkpW`Tt y?%FY%MRLn*k73` 1H$ں3a9g5ls"ߓKN~ܢsD)F9 W]3ҝa;%T»{qzq []|άq3G%cK>(lGVuG؛G&SaT;J#'F$9sKV(E~)h"ag+3ȮSdG$`]c85?T!A+*of8T;BWtv T/P!מN%LƢ*l:Bӧ+?$}Xf4YwCjé k+»<-WR>E" ,WI%afQW_pX\52IwU7\kwuY"ߪhTdlM/\Hl %CCuQo-ߙb($EpS7zg{upjpǭVsԄ'@\Y_Nc+щl &ɧnʝ(H@@y BԨJ`쾂S]:a\2Ë>>8~<9iN>K_ǁpp\մ 78@g.\An7 &'JPP;qtP[G/k` Gc}tz sj,ӲU ?|ͅRU/W~ȿ(lDG< PG`irJ ,`0Y'|PK'T niPKU~UC __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/._Util.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKeP8 darwin-perl-deps/darwin-thread-multi-2level/Data/UUID.pmUT >a^O1cL1cux Xko_1X7MۼnES@KLzI*R켊Gcf̙PKpn48J䱫^,h27Km4'ۑZ+-<4hzAgmHxp ܆eBN"t`2\CUf:!}Y3+1=}ͥH42-\(;?Hc4Jryc~]`+p:h<^ EsI ӠwX #AOZz/*kET[]oWvTa0oF׷ 3  A}p?|$(j<_C&j F(6ate,~fThAJx4+`LifG4A* t6~Jzl* F@&rM7 9y/;`N.1O]p>?"^?YJES:0Sҥ.Ui'* 2:jC@ҎaHd!z\Bg[H5'XwTH{֭#0.-ٍeL7¶K3ԟ|0z*MvH_|tRYD@qP2]S\=rYΪFZRíX+%cvFMIb odžZ5Cfy\xczhh`о c,"74Gc^Eb"[jۡE^<~.ZXELs"а=ɤ1'S0셠^OyǍWPKePC __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Data/._UUID.pmUT >a^O1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKU~U *: darwin-perl-deps/darwin-thread-multi-2level/Scalar/Util.pmUT bO1cL1cux Z{wI>EI#"I|ƐF$Mr :gs 4]L?_@@[ޒ]3_Fd!>}r2RS5Ufh>Ffi -u^Kl˩yd&8ZfܨHҤrBl8ah'Rގf<4t$)fTQ8[(?LO{2ÑwR^4 cyh{>[&s5V-#mm!Q ?I##-{&U6i$s$gmy'XH9 tHE,8Jkŏ/UBEXoXD\Wt6\SH5<K I t$D{‘Yj{jm[&Ύ3!V(R^e {^נ0N#]NLM2 ž eAC@s3OpOO_с]XU莗#iCY'Wc?AX'Or_4wgJ6Fʌ׮m^oȨzL<3MD3soA>N]g⧢95?3,9HN7~2JQ:9rYATa!RB$`'4 #H܎E{ً+!=yv'Dٗ=y =J&{) ̒%H B/b'?eNͯ8q +>%SErp[F$;ϵC:070^%|FaY8@ $UXJ`~ Zh'nLx8O>(l;",ҘbE6y6LB&L fl&yMGx ې҅gg CMC_\1!S\QqB2l |)=h= *%@ D8YP>"3MpwI\aoh89W DX!T3#jB:)V-8uۅFԴIdfqN/`!s/2&Җ8,BxZ4% gA53#>$B9#}8 2@TprQt˛tMl9nkϲ*@,B@3ҐB3*FAdzfHuBR(Mr:y{%ȓNzYxs DcH,3:v:ә*<_ )2 er\YדB"JU!mա|ʵEdVC2XA}qm~0BMSعcR*Zӊ(eUhڕHbk_`p ,LMY;Qnyt*ʍ)Z173WIoBєV7ZV`4RelqpGE.^9du&fȝTŢ䠎Na{.y([VLkjFО5~`YYq)F3ZbVYY6^T D'w\7dmrm3Os]ZDwwr-+Σl ah*GNFlR2[UW_u=|uMlStPFK4qCfg>GFGflouf\ ;ԜΜ9*Ye'!38Kɂ7R95ZK:Vrx'h8cHl܋cf49 j@.8KQ?ikbۡP;*kjB#Er:us2ƤhQg[ oY/+.E S$(]Dz/ q'[sj4PWH> >&` cB bi;"WiR^ȴȑ $Q\s*xp y#y!&4qXؙLqa  8Kyjm4AcDy{=ے.6TGA kXOj_-'(vRJ]SWp@β1,_~mVdԵZk=xrt{k|L]gQ>~3u+F JM o 0jg Q8ʢu(in)^"q@sT2%ýȄጲIdֽx|ZԊ97 VFP1MZ<]bHoi*h^)!3o v}cڲe%37` "x~xv~MF]"VG3Fkp;FJ`G?Cs5W~1˕ 2vErYyn2u>[J|)I>ePP;hwΤk3}6 EJAs 9{ =$Yr-Y#_ Z{g%_ Y-׭6m ("L"19ai[V4FIFY>!3c&*'.'5If+L/W(OE]!q|P!MT_Ѡog'w:E_ל !ǒH\p#H]+ow@fl(LEu&avK3qr6$ګQP%G\[˙օ35ֳ|aͧS.aʔ+ase8V߼w탹GbH1즃vhAJfeu)vido_l.Z9ۮRs{T<,;fG(oT̥#^NYE,)->m=|z,c;>o?9蕷Tz5k D^ l Ɇ)~*l_[sa.Ng!2G_;<#:q|ٍy9Hétʳ mce6֒rWq啉?@*Myw{n;.EZ7iCfYBQ@¤0V{g>]s( >ݻ,O_.O(IKfI^xԒZ(2HS^!R<2 |G~y{+a#ˑ5)>䑽T۷^K+Gbt"B]b.>߾v'~bˣ֮}w | {&D< ޜou /wIEw~)3{eדǯ=uӗ]֝ıG1`Br]qZdo}Ͱ4θm"RJm߀gKCOc4L?t2Ӡ>ռ4˴BSe&9ܫ u3 VEaJD0WJܩyaZ:U6.&sZԃ\| F/cUFR`'kNmBPV&"v_V9Vh~!`(r?x]/<<x "A,=ޠ󺏣,W̤Wڻ1(/Pꔖ(bqF̮.CtU7v{OY3Fot*.ޔǯm+y_ x폢0¤aCO: اhG⟻@sJ}a2nnlT:?PKxPK5%T9 __MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Constants.pmUT 0aP1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T/ darwin-perl-deps/ExtUtils/ParseXS/CountLines.pmUT 0aP1cL1cux uSo0D#_OAtEkiEhi,;FY}g횵ݻcFD`~W.:g0I 1nBG6& 8@|FvG9ZpF]jTYr˜%,KJ  zFhN(>* ;QH+v]3/hv)iFI yd5t|xV0rlSe<ЮE~[,'v-Ej#M.R(8& k_xV?IصqVUX'Tj8ofá(nPC M{QS% p;,eSw7?4xFϘ?CFaKz@sBd`b0Bf| ]oo/E{LW fl=Wej P!t- 9YZfmb {]w/ PK9}PK5%T: __MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._CountLines.pmUT 0aP1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%TC. darwin-perl-deps/ExtUtils/ParseXS/Utilities.pmUT 0aP1cL1cux ;is۶_NE:ZlQ%Ե=eCSĆ".}]9Ht^;MB7@| nʎbi⻛<>1gqN"w2| (x{zQ_W ?Nl?ajA;e!Ǎg~~.8> 3f3ħcclGc+y -/p[37qh;FOqa{ Axux+h⫎ ~؝$ˎ49\;s@8<G2Q-{轗F ;v2Y3|.h{pرCnM@S>q'q fr.`5T#vmXmb>  Ladj˫ 0trB[\炦R}WjRhLs=wZm3{ts3lx^b+ɛg~0-v<',0\>4FpOv8)RfpD|ImXx n8 7 `##]4.IM6ʖ6D,7x`c='U-\v"C>_Sdi4fo$W1fgFK>lG%BpgG$:5C {Nq=1#8EC"!-NG I!SaR$!4D kn{/q_>PxTp]fى^s5 廩|'gfmՎn] {?"-b^lj;44ʂ|QwȮsפUR(d0 <YmYd\9 {('Mjjeϒdnr ?Fw6Bh;^:V'̝$1w"۔+YaTT) i||Vbpmp@ 9ˀv\g&{dGfs繯aa\6P$ɂeHWYnIa3^V$*eMA;ET炭,snq mJc)x>唋xqtY[=!;h^VADsHad[ tl0G_*>RA=/9t6967eha*cWq{5 V>2\>{v `2d;q뫪[X+7Jd`cqϻgәǵ&u"!A=;a;8뙘hBX 1W8;} %7sN< &% URRd6ūdQ #$?8Ts?eU$ 7n-XF)=/&뉡q+oǺMRq̗N{U\e\ bZEsSK Ɣp?`Y$ӆrr`35\g55ȾmAu\`egx>(9E0=?DA^IQ'/R8=Da?-q$Wƍ$7U/+>W,caBS3=-YW.%” X?v9lp!g !;Ckf$aDڭdDd٪Vz>8 1xc?)t_P/Bmz>O6ޮQ(:]N@o%F7nQ5@f D}VCޜGSnW&3|82.kI\զۭ ;^H ?#]V_]pcjѰso Ѵ࿳:^2Ne 2׫v͆t(bn%˗l!ۥ,LML@V"9X=?B/{$ [ U<4xyƭԝagi;}?br#L9N&aw;`ϧфyE$RBQ(z&VSk{ _ I3(2x"|U69`Xed566v{9H-ء>EN>neIG[֛yg#j.Ɍc/ق!6rUFQj߱j4x=pM}x[WSP(0*Infkqd7h$`g792\Mi摎X];#yvAD (| ޭ"P!Äq;n7gzmIK}m2a=VGHe26MxH9iBryyCp#H`>@} @8ˮp;%ryҹp̈gԱ'8 _}&F Њ e"_G!FXߎXyh0yLN%0C8wʾȡsk# b=VIx$ēh24:_JV;1.[3]`yq.[DM*邶/Z)G&g X3{/pЫɺ<;5&V&H)R?2(.{ElM(<ŲdG&X hY܅]a+¹hz" t/)KsuDew\/MI[2՗QdeWZ\ٚk}y3슛2A~ç&JNtH6澸30KJlZM:TC&=3^eU:;&5lS~dh+.NчVLU +I&34iL]4~՘0E)evQ ^; SR(M{8n?`͏?q+dVeG΋ee w@Bnydqɖ"iたQɞB`/M-Z!"Wѵm> FNXC\$%uVݬeeWq{B0OBSK%1Wk s?9;"by }Թ4F{AXC,j(b½lߙq'Zn!ՕujK9Y'÷-@_ uf2 H4$d L5x1 Bj[>W0dW=+!udqT0K36pVdin\]tP:[3v̥~{%EUz%{.k)<\k,ǕQZ4 RW Ivz"p٢S}vS ^U+/fba*W]9?ڢ40 uţ ;ٟFT7T2:5TîJ{L([ U\1;|W'ZLPn8 qIX]4^<oOJ+ 8ln YEy$U{M݊O5 ZHI-SzX9˗/ Ċ" M[Ɲ3Ū'sB5FϻNw/NLq  e7hq ;Rw[/7}6N]~NjZ'Pg*׵]q;;(pm0}"%r9gj%̶rX9i"ܭNIt|[M b%'*xnT雀Q?ҥbG(. mW}0/TJZ (`pG f Bt(NJIU&,î3 P3N{9YC]`;=\ 8>f]PUpew,ވEߩXMO5_5*"&aR&BƑW3I$4U25Fv^tgmߥYx5F]nvobfşQZvT%(G67c"UsymRofARc weI|OPK@#^CPK5%T9 __MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Utilities.pmUT 0aP1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%TF ) darwin-perl-deps/ExtUtils/ParseXS/Eval.pmUT 0aO1cL1cux VMo@QK 4' ҔJH-8IۓkAQ{gwW꥗Jaw͛k3G}yhBb(,h%F1PZT%fK0m< Nw./O0~5g4;!GVP7qC5Td x'0&b8 \A Ȟ(UYIV:cAm=DLRd0ap`Z,x;q kk.B3̩K V`jXPɅQ09Ԓ-lXSMidBnuQN w;vOprAȓTCIWp@M!pHY|=9jFB- | dP)!)Ϙdj3-xڂ7_}NLuaN1mʥ(Cp,ՑL0i crSIEqgSκ7B^ c AoL3THj4!c'/ A>F'F=.Yoj —-MOmrjEMz}YwLغo>Fn{Zb1p74ϊߠW!,@Fd"5%D5"Z(QGSa9WhSdx +Vw{<;X2.@-PPKs7F PK5%T4 __MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Eval.pmUT 0aO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T%) darwin-perl-deps/ExtUtils/Typemaps/Cmd.pmUT 0aO1cL1cux WYsG~_!$*`SR0rT+Ί3UzfvAxl/;__wO"[AOTzYJ-/m{U.[RQ^7~&8PJŇB1OGpߪptsyq5qg"8g饾rRћ1D[aҫڐ t9M}eth2 )$7P%R~ѵ/X6ܔTS "jN;كfB!"=GHj4,xxq9U_nY߽$qԴVpz{ Eq)wٗ@fJҦzxVEc|r΋l1q$7믿뷿[1]sv;ب6kp*Սn=x4}}9?,`Od%#`:9_YQ]jLtә{fA(Ԯ2S59.o pZxod0>3xf7.T莢"ˀws<˺r~q9>1W͸O_Ë=jvCݳl{ҽڧUc5G2cl74|cAdMF 8q-4Ii#x qE&}=v3 z=N.' `2(E5y w=؊@(!J%"aGie8nD^KrixytqT"RK QSن4,ZG99{=AR摁5DXbuχ?z x7s'& =|2ª=$ }$6[ uK;A*!OMo"{ Di52te۞t 2PBxؤ]ּ&0ZҰGf/7]\ aU6ӳM`Ϭ?ZF|>q5y/IaܵbX_g!tm # J;9 Ȇ^uxnfs OU/i4T@[ET Pݖf|)TY[Ϭ9:|ձZ=9 Ws=\ PxlhώFtt:F (J?W9xqڈ$A˜iT aBVjf~:yㄾӓ|fX,z@[V7_0t|cT~ANxPȟ"xQ"ΌO߼%bùi9JPK@%PK5%T4 __MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._Cmd.pmUT 0aO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T%* darwin-perl-deps/ExtUtils/Typemaps/Type.pmUT 0aO1cL1cux }Um8_1WNm+]vZuUU8kpr];vBB{`݀e^+":%*+n8bo(UIvt`*#z-"sH ZN/^RK^Dm;߹XGBjgd%?8op<N鈄e4#Dh9-wܪ;ؽt=\!4uN.G3,ɞ;euSKvbhD]Ӱ zgYI Sǀ&S2w}ٲN6=ֶf.jݗmKX~}[~X0wz?'`Kl ;s^Q.UyC5EN _#(Q 4ז s>s=]up'.n>zj%eT&R0S5|sm0%,.n>`E\]Jo5K&j5F|χ? %VE+{w xmlN!'W{M2K F?d۪\3Qd"ZAri%Ωm7q㹽D%PK(T>%PK5%T5 __MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._Type.pmUT 0aO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%T. darwin-perl-deps/ExtUtils/Typemaps/InputMap.pmUT 0aO1cL1cux }Ums8_-}8d(se& &딖 ڲO/o%KҾyVzA~ō"?8:^s%hr(C Tx2HPI#ѬJ9D&j] R(,Zӓ ^P2ۅc2vؙX`p\0*k=UԻ?1#rp vf`G/'X eȔZun`nwp]t9o<,--w~bZBgv:gVZs’LRd`LA2ULK3:k+՛,sX|i5oЅsS*FÙ5\c(}E2]Az dђn|\so z8m$ SQ3jY,9 9>D;!%;`j|!*./r%+s0b\9Փj^6ڜ0F=H$ce{X\hNTi$m7F NxGJm.ceyVkI\4KU&xwgdaw3qJY S8Y{*^BE#7|8p?G.~zX.[?~ǵݲkۮ%L`^V8d8cl<*MK>6F |  g&YZ†#PKH9}PK5%T9 __MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._InputMap.pmUT 0aO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5%TL/ darwin-perl-deps/ExtUtils/Typemaps/OutputMap.pmUT 0aO1cL1cux WkSH_q0MV-x'TGaW#mmu˄!oso˒ LjRs3U3Mo҆g:V De=0ήuw*Odfz^Zix1:>;G7zw0*إӣPm0= ٹ嘌m&NIu*_OG##b{+a7TRV}`ON?m{? 4/w+MӜm>w+'p/l %V64f؏>$-Srks&Mq[*SS[y)c1Ӗ,h.rO*INzm[d z&:u|$8|~\' BDTc$ ckGMamit'y}=zxl˂~7FmqKl+x^t+U;>®?li\v;YE=ob@mMz @А:[As 'W;7M'&W7l i0i Im s\y$u֖XTf*8DZ!x"Rxz|@:J b+&Bӭ !QaKj -itt a1fUbWڰuW2$$en} o!h?8]~]rst/?M%GIXia=[0ٲKxm^~%X\6׿o_'+u.Թ; uycF) (R=24a.-2s཈ACUnQkK 1@gi`hYD%OZC0H<!d hcš0ȟk+ \`Vve,hU]}\ES iEä9ǫ2Ca9 @|=O5%PQwGc=G^t*[(j$yy vy/g+] F|FщINTyFpV*)q QRsm.Ma%ʰ.]F {Ru8vP-a̮,,+gB_'G t4:"J+ʨ28E-t2sj58ITn \Ӎcnvͮ!-4/ )VE=07Lx+w4:+}i7󺅹kͷe$I'wKҿ7q(pme}l/ʡMFqm~8].%* gr 4:;"iI+9(q@S!Bb#%G\wy%. >N31)ŠT8"JU pbқw#()8pQF2ѬM:w8>-rL8zYU?p,F4tR<:J PK5LPK5%T: __MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._OutputMap.pmUT 0aO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK])I") darwin-perl-deps/ExtUtils/Helpers/Unix.pmUT WO1cL1cux UkoH[ ȃGl+'PJ7ѦUh1Ό ,!}]->ι?# y4kϻ< -.O4}JrK‰5mMz%h5V< mkIeȳоR [w=k^Ɍ!#N!P@ITd }%ɬr7 KqDP!_R"s•W?WAtT߰^20nezN{OgY%ARAR|p2H|w<Ƚsmb$%6JW.V+4dj QcOOiŴz@/V*[\n9C͵ׂ; *2h[Þ+dtNQ+>:ÄPC>`p‘}s*Ep}-96X&E23Oug;0c!&eA(Y &4 73"2G/,jCC*n gߐr=E_u5*VïO~ܘu~NuO'w8Nd؏0Fh6K/WNwo_p!G~rE} G=z ŸMZt,/9kM|v5=;cw,`w8)i3?zf{(pxfG ntocOvp .OF)ԙ[H::I#d[ jY:*"if-kd;V= {gx pSG/&vw/[mwuEO4"Mte<$Sj0&"d]-F{8Oh#@?@1 WB^+LS +QZ-Bs# V |>S@|"XJ\( H5r5B\Lu:g쌉Hg0SH7ҤIC̔><|51{$;B6Gp'"F}ܠ,tLH"9dPWBQ&$(Γ|x9S\{}m"^^WxZoWR[y7#JgEŽºhGSXa'"]CkKU@h+FQU=Â"NdQpIX 'ubR9JÔFKsXXDs"Xail9:xַ(m髬IԌPQ%w({w.d(q|hXnG6fp2Fc?֠w=8Cmʖf1TH8rU&$kP+Eݱa*Lwk?'G,^)X8OyէI7/6{wɤv'Ywedm92cAQ׷ٗ~0{3l'8 1^-QS#dk;p_鵫ܣ"\̱n_,Em#h8턘BnuEC\MMA~di< ӈnț/P@ 6a8ʢX䎳DVu^i{7q΅N1?gZ,}̏ 9<_^}]~_/aL{FSZfk)fs ^CxXCuqrm:!d ?#.WiI@_: XSկ[ hA,@JFD0PKOq7. PK$T0 __MACOSX/darwin-perl-deps/HTTP/Headers/._Auth.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$T% darwin-perl-deps/HTTP/Headers/Util.pmUT bO1cL1cux X{SH}^%bl\F 1 u@s[5xYƛ}guKؚǯ_-߳;9gOg%ŽeeTUG_4ѝģ8K%xPw_9K)SSx|bAf0td 5ke&[~E4KfSBYr^m48%KSpEuh[ sOÛ=w=8_=xI w51FwgU5*K# c= # ]1[U) YsrpBݩyR 4ƯV )v{&,e N3f׭$s4&vvC+8nUz<Gh4jO;rM 4{fOiZuW!82^pȢo0=&4i$B0Zmo8[८5, L x6?6P7 C<;=QV ~ v#%"ަ>\H8 4Z% ^J75UqUEEћi$y^)9*;u2Y]XSr*//ʆ{$s1S4v@.PӯhI{D'ӛ= ,h8<ޝXSV)jDɖ3ԥbq *g X`g"6sqLӊeNh0b cwnߺ&RU YCkbEgyI#?!nP:䗾emXxMgStIbL̲W"d)*o`B]^]^Z6[{NžA %Sw͆cbHV ]lOӛFmhƏ"@ f|Yjΰ yx kx {D́d.,$Qs&⦫0]&8B$XHa$e4GhR.P|%sͅLX0fqn9܉G#w "R10+RA,"Έ"e+/8&h{j)#Rr`|>KM^jyK1f{6i_rĈ5ΰZHO@$|ũ?9me@ c*ZjF_P}㻄ɜtGn.N$Ea!djrݘjNCZ,Y)gE6wYK<3Y& \!'p>^Y/єv侘 ขq Y2rk<6n ՏfjZei}U֋B"s)Y*l~uZp"U\ ˙<5\zvO# ض>QűgOYu$>hFKƼi#[Gz@5f| liuza+u(nکWeQV/=9bkc@0PQ]@m~ vݪOIbJ?-Ħ(Nb=Xc=Ebqh31x!Ťڀ8Ib,c3^@#ޖ袺 4껣Z_ioF W ̼/44M٢N؅#+8Lm֙Rfym/K/31eOcb/ J▊C!) /ퟄDwǏkG.M;%o7?|qڿ!ZO}*wsB)J=k,dyr,"^QТ$lE:}!jEӅڹio)#]P,pr%)Ӆ:kWڇy$ْ_E4fFfӰV,[[/VRST_N69:]-+ XvJR)NYM]vi*9pTP,N;.ځ.kґ\խ y\-6}"iIe`&c&k9xV@S! 6K:.")5DH!CUuN4-=TV ǧMr)Y|a&9G6jT1lց{8ci4<I_3ֿd!3Ɲuܶ2Gp3J<ԌƖ`lmYc+h ZԪ8 }ta1AjtB°NJT% ܚ1<_7vcxucΝ/nfoN7zף&= q|η}vynU*J8:L}بBsGkDl5C|7ssIzSoO_Az΍|}Mle v;}σ/_W֊{$/Q?x !EAyv-sgDXA0eyߔy%Р5GUe~!'\c8dzarvqeYĮ?&L퐄=QPE8˃ OCrc/DF¼ #;N?~5?t*ĿLA#TFnP< ϵ䘮F Շ UV"T,ӅKQJb'RP10TPK U PK$T0 __MACOSX/darwin-perl-deps/HTTP/Headers/._ETag.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$Tg?' darwin-perl-deps/HTTP/Request/Common.pmUT bO1cL1cux [{{F[ p$ 6KHc?͉}8j!)@h~33{'m̰bЅ/iF*Zzh/#m.N+Ad& l%,S/,+Ɇ g }1xV3v0u=" F3V%X'GJE}fm."1{dW+~i ju x4z`4~34 $o6OgO<, 8ҥ|MeXe[[@;0ƀϊZBߞu{kK5HFY2LwECq}. jl'7@w"IXr^G>O0h}j( PnSXxDp.ECц"i^㴕D -+%شkh$V;nb9HݾN=#GfOJ#m\%vE293k=3ej.yy{ntG= h^Ԭ̧I:Co>Y?x<hHuޡl-'gO%+.kH$ 9f-YeT]焐?4L kskZEu 4hr-Nő- rq:eC/(;ʁR>a 决T`%/Y8]4$mTO'0dJmͲ݂ag2 V&i+ZD|B!u j~%GG6=5̐jIj=坞^6wvY Sv`Xq;Q, ٽ vfbHO^S4ysX-/KZ5ВZcSEygC$'')".JL|k `N ӓdKhAM)1 l4w, 1ո=$t벎)t_R%j\.+_Hњz߯p)}}c|hlF2к%skj2//_bLc/=?/g z?P8a0vM'9Wefxji[Zn;>طnkL\P?fa*vCh(^ M*R}hYG:ǏUm7^ٻ V鰀Ož}gS! 4qYhVȂlAGj1=^UH S3딟U%qt)M{[ʢy@yArA1}RR ]YÌs-K+É&a+Ŗ"}.T^l d7g)\OZ,DP1RgĹz O8w88l $~k=as!+):s0;|/F}@-+*DE掓XnYIxV1a1 p,K1] ՕuXlJT#HQa)QDTM #ijC0@HJɑO &La67J. <1H|amQKlʧ]Su*|K_FìHmUEnD{WG=eU6V ble@~k --S%A' -;uF:`J}:1!`^#a@կ@x LC'.yJޝ`-WZ)}{JB>]Xt2:]~0T+P]ɟۋ? 3s7: ac2Fv|Iɭ%йNY{SPcݢgrXxzig} -Ϥ[hp>I~:~}*b@i=(vZLN ="ų@=x~sd7\bn#~_J|RC0QgZfUM39R6v(wdZ3/UehS`zWkneu678JA) Ut^juH;bEbDJ q?Ȧ, Jr킛G Ӳ6~w4}Z{tX!gN ՍS'ٖ5>lKVq7_ND|8"Mz MSkjf4%OJUL© abr? Lsyśe☨X )ԁ JB0[6uP<tObdî0]0qN$LC $ C؊J'It)A4L{*$Mz ] 0hNrC*8~bցT}p/RArDeءs r6똽vtd܄_^gr - 3Qo6"=5+( n*H7uU=exol c+I|DF8sض0` o}e;4Y.1K#|́q(:r'kvH]5f SV4"o]-p`R|Z! ƒ@)eq[(!PRPCG O)[,2 wJd`RۃBG k)-xD{CPqۀCWQ]mtr5F'sqށPjFz/.T`婘Pʒ&#4PoNuMIM9ePR匌$Ē.D&X6K_%ЛyT@"b<eU!?[! L:`]/* m=HCRo*{A.]O-2ߛ)J]cSwÝRja}=?7e-ꢖ%U)-nU_Ҳ/m6 2ɠtT/S\],`²L:f{*: ڨh:kf_|t߽a'ǽ˾I8J\n_sQUI?/uj "X3.KTbpwiSd/B2;{НLɢ2#{Xp<6?W [`f0,OW^2PK4pg?PK$T2 __MACOSX/darwin-perl-deps/HTTP/Request/._Common.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKw$R#* darwin-perl-deps/HTTP/Cookies/Microsoft.pmUT _P1cL1cux iw6+&_H&xSrrZr}QR$$mU#Mvj}ֽ9ap4m4B! X#?vn{+hvPU5\9'^ǣ2'FrZrm8l8v\Vx.>nQ'xĊ>g踾?A;Ҋ |F ,A!ʱ8z)a&x0݈!aLpJǸ$.9*OX!@P%6π yb!r $V` AZ`0>̊|D _O %$06;u}"Q$IW0S u}^":urUjRfs50U2*T~ymJ_1VQH$~pmSz,̣`Dlq*=?u~汈"|l]uī VJknZs qpwsC)\\ \w۷V_2 \b2k5dnAϖ2+NX8Ĵ=sFpr'{]n. @E٠B9tfnL8^tN1ZSo)PV3=I# p<mjZaIXft*^$S n"WI؜[!Q8@EHB[Rd*c\b ;{ATu.}}뷮'5ӵQ uT}߽a1oIXj!vBDeyMk0~e }+U 63Bp1_Xbu?> vyC>Ro'j*+C= / ap<8h d^uYS.&.¯p`d):O ,V X8قjY!(" eLWs]qA)E;DƫD| uٷtco<,c>Qb8"}c O޶ݱ̦C1Rl$9MK7l暋!qALgMlӮ)lFJ-)X3@_ ɴ@֖ ;v< -p?E^ߠ aO^a+w4QG׍,ia7ϸK̍q'X<MiX݋;[ 2(Ic+j*hED8 {OZfSƪ cJ>$X9oenSn넡J̳:t}{ޡΟ"EܴuD6>jJ)464dH86j\ vU#ѵ8^,҄=1!1 EFL&pUN$7ZAh޳@v%5M^glҟ !n+o}#'[F+b]6d)N1al_elg,n5ޤ HV*{\[ͯ<>mosyW ÙrH(>N&7TG2Ω& ~-!So#Bq'7mBo*zRخ&鹦N @fPT2LJAH6N^+ ~ym_}߯}:IgPBc*Jl4sK>Eg0pҥHqnT6 qqIn4Hh/"EKZ'It'7ga0z.7ăS&((T6Ød 8z%"Kr;ޘo3LJz:ГJB# M)8J~0|KwխF])Kmιew{\b$(S|]wT v=E7mҔ=otj0Y>n'3rm (VGķT{AJhMPLT='Nʐ^{ST94wlaL(cuQH7Rajw'_9e3QܔBh!y]0PNϯO{y:: nnps"$m->'`.QV ة,h0}̩vH|6p̟A*n@mi(7 g6ҳ(5:.ڗ>cKV(i2׊cM>ѧ[fϥ4jxdS! [ޯT*- a4CF82$n}(7.3#%O6NJ'| *f=V4fb]PO=oGb·sdC-[|vt}myPhw&jR*$]gB|pRޡ0}#3P.. 3,-P a(C*u|p`GyAl0к:ns(cn}+T )h94}"ha]PZ¾=lFuMo*,J *(,pX(~o[~kjPK+'Z #PKw$R5 __MACOSX/darwin-perl-deps/HTTP/Cookies/._Microsoft.pmUT _P1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKw$RK ) darwin-perl-deps/HTTP/Cookies/Netscape.pmUT _O1cL1cux WS"9>E/rpZuWWj ^wT ef&A\KfR8$ם~/a)s:ZSʩVksC6㇞7לQ"4"犊[WNkuqſ̅zЙ5,GSe!ŒE޽G$Kǣ G"e78tsn~=&g[/ّHq3W)ZX,bŅpHC "9-8A:,4)fr.䌧Nq4P騴,G\LXvz6Nd2gys^nv\>q:thAς Y"5"11JsGf%kZ8\;؆ѧrF$/.tAi:ggV?[X8H*m.}M7roι1N/A1J!185)D2*IoTDd#0VC)Jq̤ i~7C#Jqʗ-mY,ܘBe-z_пn =im@d# "&{2x5e6BfoқV'k= VNrŁY*l9YrR~ nnZw\ɎLrgjw<< eul7 L8n((m# ;Q~q񼼟^_ֳONwC;Żs|f }n9]_!3%NJ%`EP)a9)uܡSJJ.`ZAT5.7(G-,Ok^]t<ʃaP\9ѣ#fЭ,*(AQY/㖷ސW1[ɣ ^$C'zTt$Zu jMݘ[a ZD8TdonHI2alGd Yأ rN DC,XRK#5usfHa2Dm"4TSB z݉䩸 @PѦRV=fArdkusyFt4p[h%N>5ڧtyl{}o\[PΖJ'L{{4\:Nuq#z+6 Mo[-  $FK;`/Jʳ[JiBXvv X}Y:۟=z O?px`j׿j4PK&K PKw$R4 __MACOSX/darwin-perl-deps/HTTP/Cookies/._Netscape.pmUT _O1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT! darwin-perl-deps/URI/file/Unix.pmUT hebO1cL1cux }S]k0} Mܨ-Ŧ]/tt/KkT[(R0>}z {t&pWU=e8}(JKگXr*$\C6)ⱇoUw~s#ic8R0v{gҕ* Skȋ!}|2T sU4npTТD~h,K)`[>}*DŽj%UZDCajh7V(vQ @jG& lm=v!>M HO9rO, p-fP:Ө}0D:0 gĚ]f;ܛ)=K̎IXzWUW(IVʓØçW" yAB-Q`BfLIZ@+ƔC:*e(KfnSwM9#TW0=bcAy ?CuPKn$PKT, __MACOSX/darwin-perl-deps/URI/file/._Unix.pmUT hebO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTQ darwin-perl-deps/URI/file/QNX.pmUT hebO1cL1cux e_K0).Е {I^&N&%Ƭ Kn&x=w(U#k i5珛AȄYS5Ew\v9%shV?te4. APZ4iƨ3rdp)t|-9{8~ZhPuytY䛐B_PK||QPKT+ __MACOSX/darwin-perl-deps/URI/file/._QNX.pmUT hebO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT" darwin-perl-deps/URI/file/Win32.pmUT hebO1cL1cux T[S@~ LH G;ѴӆȬ$,Tm޳ $`Ԗ}gA_t`4Rd>ͳYN[j BSey`8/2 =ኅGOGߟ$:¾17Xl>,Ilho198bRkaȦpFZGoE4㿙F۪.|zjdAjf1r )Eg{ZjrB:kEMnguH[ VS 1vlc;I\R$Q1w@2u׆ RU>exWbЦ>*{+|ŅJ9 4JX'cXncReP +mVYZ<Y;'jcxi-nBNGSX$d((=J1u)W5M%uL_p"sjk±."?|s<0 ̃Cd&sb"[rR᱀>N24<_`:F QWϐ*EJτ&NJ2ir5$DmL-'ݫhb{wlVÿPK[PKT- __MACOSX/darwin-perl-deps/URI/file/._Win32.pmUT hebO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT1 darwin-perl-deps/URI/file/OS2.pmUT hebO1cL1cux }MO1W+/!\ DR.4,-i jvfy[X%à',FHHQ|a쾧JpyhK nCl2U(nMꙿCSK 5Lc0Y=2(`9`%!Ds0chjVRqs GkJjmg+[AέI@4Ock=&U "߷ g"i+8S}r{SPxI"1MօyZ6;[Ma;†:ojwAX ;^!2pFC,Gֽ`|,*MГ:%B:nJ篫 4^ /[ !Y[ r߿\ +y2@"rGC^h(vqxc9ZՄA|*)m$Ezo Dmi)z|WG=R5rGu74-D]$ga2FпjV\(C1lKhm%59ԧʂ0}9z!up-m-gRu-w>i's<>b%x!i4ysC0/R]侳`H.ŗX)coGu$I=~T}Sd=u!o!qJML%- V7g0~sM}A%>:l 1Gp|UO8;5*~`xG︹!bHRQ[\JZM6,q78a{Ik6LG(vUF(]d@U_?:]\;)؉.dn\kʫ2ļ>L(HLY4w&f!t]J>Q? q5s+$ (ۡjLbl+rPt𲬎b fM cbbFᲨmZŷG9MY G "+YR)HU^ٙ8aPKe+XLPKT+ __MACOSX/darwin-perl-deps/URI/file/._FAT.pmUT hebO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT darwin-perl-deps/URI/urn/oid.pmUT hebO1cL1cux MAk@ϝ_P! hl=dQ҂RIU7n&A9 WEU֤i#{{yլ}hsdATkx4N&,8Fz_;sP#:GFsM؋{Cxuv[|/* Ǜxh3)ٺJ%q,Up&92ʇ`kR2K+L$4ճcή麙u/5}Jؖw:t7W;j䄫7~< !FA s939w2k&F~AI]#>\"q,y~&5TR8(z6մM?}p< m,>O_L8JTA.$\Y0x|2a/ K碤O.w֛$ (ƵTx\:1dW-HYl IexKjMhM3 Yέ44B /өw.nݧMQ]cֽUk\_7XZ<.U2k|"+sdH u-]Ckt"Q뷦e*\&e+\. HmG%̍}u`gxP,I9#{n,}*#`h+;\bS8el&[K-Vw CBi3x0F$W&\4)i+M*C1nlxtj`^XLt7)BbԚfDG :\{=x %||T?~܋^BR }1S֣vt81ï*OeVn4|fLI協X`V2Hضt{.8c._X VO{T/RE'sWX;@j"dvBH|߇$Ӝ][m! /n1x\͟lZݗ;1yQ2> Û} m='xxam??Xy:(*AP+OoK՜Wv -bW7;<]:;n0b1GG)r=Vŋ)_vr]|h b/: ɁKÌ+#7#{ rG*zKuIۘl:lDpĖ M͒k:i5.@lP 5 q'`R"74wnT꒪ZJ8+O# ʛ@Q6>!L fӍsW^KpR >_vqbTI&dN(ņ/ǥ=,GQl4"xCnw]' 9t@PK5\ PK5q:U: __MACOSX/darwin-perl-deps/Module/Build/Platform/._MacOS.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U. darwin-perl-deps/Module/Build/Platform/Unix.pmUT 1cM1cL1cux }UQs7~_=.1=![@.ߞ>0շ] Z4}_r`v0 Z+{f8ӫZE?)Ȕ#f JFagLIs`tq Vv4J`0ȗ1ɃPq!- h`u"5&sx򕿼SKKAmEcɂs*z龘4պ` NŅpD+7zKKT i!$ .nyfPbjI#_Gzq78LӺCrk[pf6-ot1%܆o4|GFR,Wf(s%|(Ihn)I̢XBs7"Z~2?|8)jllͨT_r|'(i9 lG2yq('R&Dm5|ʹgz ,AOzӧd3Uȝ z),A8VцN*g4ˤ{;MטYE 8)yVwpeDn3S4Ċf2'P #L] G 2,iEA[.)wĻ `_7Itri#U.F/k DnW ڢ"?Ԓqs- cH7ͧe;JC6ja\ܺzOn pYu;w9CvHF</R(6qf wwnh (IQBJVt,ZO\\;cq}+D?Ƶ|MΑ~) ϴt9nVmYdCIk{n^'܎?,텽'M^&;a: PKpIPK5q:U9 __MACOSX/darwin-perl-deps/Module/Build/Platform/._Unix.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U- darwin-perl-deps/Module/Build/Platform/VOS.pmUT 1cM1cL1cux }Pj@W̡BSb@jX{ K2M6~~7VB-7yGv \ʬyւT56?'J^Vx 7rׂXsI"+AΑF&SqKx߹ӥ+v"C qP]w}n"y3\h[#5OYjoPKِe=;PK5q:U8 __MACOSX/darwin-perl-deps/Module/Build/Platform/._VOS.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U/- darwin-perl-deps/Module/Build/Platform/VMS.pmUT 1cM1cL1cux Zms۸\ DVKj֖~c^Gܼl',EAkTҲU~}@wz=5Mw<"oq*Iǃ4*'y1 ~{}uyBEG,ɦ˫Bt^^]}#zyKy `c#%<$SLIO/@e ;hL9{=Ǵ_BiAf^_^{i=,QbΌEd-8Cec,D.ya,$U"PeqY&/ĻTFdd)ū6+gRLe& rǪoQE2e9ǤHxHJ9e8JK|=E|U2܏hPE(ע̅| SS,↧T5j|mjL/Lur0h!yu(,DpǮlGڳUQ1vw32ISXRV gL?| \Fx[ScDU{4_,D-21ǃ$S2SIt2X-ƚn/4m ֌ ET2Je覅\{Ƣ WLo|Yq"El>JU^!5ohZy;`5{O8\,"Awsǧ \gϣl0ZDET";>RTH v`̿Eg`'zw$K&+{gE ,0 ""J0_Ll˙P"1+?(!hzg2+JsL QxƖ4S8N N ,#?$L)zfN4.M4G~6!Vst.FzTr+zl&}Qe9 1ͧ!(W2&LXcV*\vc+zw9|y{G 1y9\~  nK[I\bղnS~ov3@{E1RŚ$ԎMFrdUDv ~>=ΣHEp[zC`G32O|@UH[ д{VBJAq.U:]юE;X-(x?')p=v> }ⵆY1/ˉ2}=Ώќ'- zXJuE(2llAm-}?wnۨ{ШxBHU:h4Xdwq0uZ0~y+JvG}⃿xĚ<|ppr7fSOs~f?&F&V&bLkM m0B?4sbQ6>܉u1n5e8Z+oV-v,:4i2u*;v6 ;P2j h#;+NiVЎ vL6/؅r7uwSL0uvy}~5f|ѱQy C%Twɛc%J@>zeA5Ϣ S l9~[xQ nJyn{ǐ{I˪lVnA9pۤr5`ܠiDy6Msʉ zR;mt~$Az7}i#Gl (YҨRҋ;څvXޜ ƚ#=Q8Q*ԮڪNvҵS}}Y![DUxC>AnvG(T|YHޟ?'ymN67|c6rXH% !B:gnk"?t}}")iyc76sU;7ߕ|?zkmrto$;.=+{l2h⺚M4R?CI7HjHt ЏX/eRVr_}vf;X5>qAØ3|-Ge7 lp3u{Tupn"0`BXNa>7d2ʬhI=5'YVsnUm*di۩ OeYNyKAWUFfu@& &W&RLپϴS3w[C>'[ _+h &07m\mAGso ́b`gZh獃Ze4̾Ѓfׁne=;[a({jMUcD @h:E+H$1`T^bC!+wBE~S y V݂c :cI7t.JKtCSۯ $I}!B, x &Оxc [5Ȩ"NY`gE+nsAW\uxPf7 Py V=$TI1\1oMu.~0\O[8Gbݺ09Wvۃ1tJHWtI2S inŢt쫣Z9WԖ]*tNol^A3݆[0yū!AIr{-oࢣ2m06OɮeA_^m}`ˉ{I}ʼnAccHAoX3r _.jה߰%+CKg^'Rqϖ3\E>T%\7Kxbz❣?5`%OQعCqbiq PKF~B PK5q:U< __MACOSX/darwin-perl-deps/Module/Build/Platform/._Default.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UZ0 darwin-perl-deps/Module/Build/Platform/cygwin.pmUT 1cM1cL1cux Sn@}߯)J\)\U_j-Vw5oMIxHbh.gΙyt7)zBSn3ϋRcA0V*Z 1= g?E0M;W_.{OI5-WREK6Gʸ躟 .b fRוRhmWk2͵Gd՟`]8;GN@\1q{,{.7]T׭\/,B5L1#Aթ=`+ֵyAcHLߘBpH)۾ dj2AF>V(F%vJ t{LJF1S M'kx$A}\DiD-mP)%t6CK=&0*,A@~a2Om. \Q)=PmAG`$OCX Ζ/sPF2ql93ƅ,p\^̑j~t0 $G%jzֵ[t-q*ی07PK7~PK5q:U8 __MACOSX/darwin-perl-deps/Module/Build/Platform/._os2.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U*- darwin-perl-deps/Module/Build/Platform/aix.pmUT 1cM1cL1cux }RMo0 W؀@,Nv[k ,X8v TȒ&qK9Yփ񑖋fl&ɷV2I$2z!wZʧ̴>Wt1[|r='$o~ZdT}E`]KBqAz=Qcc !%* 2'RM`XȪ4T jG5Q%c ued9O.&"LQibPhx'H ߑC /#.uh$١4$66⹟v$em>nc5rl3Vntg(7s1/V嚖Xsuf/K'ٜidD|"#d8/xSx ջL TFQόbp{aW]*?'$rcԁ&i1_mW֕ 4T09-).QcDP(8"`kiZUP=B ;2Va@>JS#iSP4h'H 5ߑG +=IztDXQGkTM;dl4fm>ncr9d3"Qf\ǼxXMkZ"cu۽NyDe# D5 ^iF O?ݼ}J z:%iELkY]~jnv{/7C˻KE0y*9?5yCChCy-PK6Q:PK5q:U; __MACOSX/darwin-perl-deps/Module/Build/Platform/._darwin.pmUT 1cM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:U=1 darwin-perl-deps/Module/Build/Platform/Windows.pmUT 1cM1cL1cux Xks~E[A`1xM_DI([͕ gQwϒ(`I3ߟ^ ^=Cj~=x*/ō k'2GcHo+3Q}7HEP(lyX_ z< B#Ih=%R?s]D>j7C (tG{T,xaYZy$V"7Fsc%&;O3}%ܦ}z7[D4;/2fVO.A/~O6(wEZH:TGsu5Dvzaknn#m^;IqG| (-ҭu6`s<Fd#c=1L#~CK39)p{)C)q(!RHRLi⤐1-|*9,YweiLrh<B$-=SA7)l] 9^-l넦|vP=>$G/v:.ץ5,Aj4J,䖹vTgyH{%d 끜)4߰nQ;XL&S8Mj5U dI#5nwޱJ_,Jr6].1B5oIxUC<><y,[h|(*%b\ O܊`Xͦ yjmK9L(Ghfw^ٚ3?PdČDe =l9vU$6{,.DM#!BŅ?g~ Pm%e+.^!$~:p&_V[P}vwQeI&T\Y=kSqTF_}1(+OXrã2&Ӑk&f7c]#Uп8{uC]w8@&@Oت+5 abq~Z'oDn83 K:az*0yem/u:EjM3z.|ځt-0j2? -# )e Ѐ( Z fl@Ic{b5J|ቇH)0Z\U1ah|#S/ /Qk~~ ??hZ+E/XX9Wr'0Al|L?~4q,"9\K3PQ !q"X._ f4t%թ P[imYIA1,۳6x]'INd5 -+Cq{qZVSLy4A]7e):XabR q&gƻ$ݖo=sˮvDьZ =njx}{i׊B~*T:Q2I -zX2 hK ]jQ]Ujݴ6Q , S>׉34K,iXp7ZL,W6̤b5UK̨H&MQ`JqHcV1d85GGBtܝa-«4VQǶghYxKc<`45V N$߰dO+TټAc]{=۞ZbЁ1@:Õ^lʠGtW +Ymn8Lhqm =r{.<ۘ5F5=؏tKN{ߥ6Tfm9gklڲR+CuFMWY43vi>I5Cui灝@GQ9-uVCSꦖnAh hĥ9f&i@;A24`X 7@ 4EK(ڂ RLB6ג˰)QQKu(==ڸRU,`4$9"&\\욽9t?gz2jƃH Ui͒;JX\:PaYo{nbbGVcÝFS[0[2G:"Z}ȏDzYgy黢aU39^91gb3\a`@Wej/_~lܻ꙱촻#¥zᴰ-?/b*ϭ8ă8 hmoxe0)ŝO_sf|%sD.<"1VTLınX&E ܭ4_֞rMޭ=7M&ysϫatsZg;8g_je9RT19P,延8RA"}5`J'?ۑn9,BfcɧRsXˢכG[>P˗o/j5Ǒ?Sբx<R?ilr,ˇ "_Lj<~2&Zxe~pzJ׃klT`{Iryy_0I0MxHa8ç$KaU^-O3ղï-dl9<|sOc{ntD=C5S6Թn>+5TPj:u9rcI[ #Ӻ]êHs'J""Qf>T5y:rwuV,kZZ3uHQ f$;*UZ[(hwºFX̐{zh׺T9H5Q2T$-o5: 7Qxh<#OSh~ѡ=(;R=_ݘdsC(Bl^aGXũФKX/ >P7H؈Loֿ8ֲn' 08-'s@b`裘Y4/*DS؂l}}EGMG7[f5&f6He1qlCTvE-/L!A gLdڙ^:LICV.G woŐ]}v"l>pl%~f)KhGc%:puI'[ke+߻Ja\&ʨa#CgO7{MˑkouG/oOj\;v<0ZDẬέ`~@/[f1bT3+,six28PK0|+PKT9 __MACOSX/darwin-perl-deps/IO/Compress/Gzip/._Constants.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT/ darwin-perl-deps/IO/Compress/Adapter/Deflate.pmUT LbM1cL1cux WoP_Z]D}hJ7NpkӦ!ϖ>s}amd[sZuHA0 "YV+^H wWK C;ZLØz|5T-H 0reD-Fl}N4-E95Ol`I"`vdgBH6rҼ w.:KZ0`RJ+[11ŊXmin3W<aoVaGV Y|n9R<߻E?cH4s>PD'I*2d1f'+儷aip&7] ͼ8zBAHY)`xd|<$aR6ЍS> "2*[Ac'3rȥmn "%*=²ҮHl;/uJO3~j=׳QRj,hdie 70uwWT"Jh*YΡ?"=,Jq72nsAD_?(T)}?Lg֨MG$~!vI8If[VPKllƣ PKT8 __MACOSX/darwin-perl-deps/IO/Compress/Adapter/._Bzip2.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT0 darwin-perl-deps/IO/Compress/Adapter/Identity.pmUT LbM1cL1cux TQo0~8$V>R!LT!' 1mVe3!H}w1;~?fN־AI&Aͤڿp%чh7kTk477~ pфek0_.(f=L.|鳥]~ڰtP` zĆS$[*JJD80uk;ot--xρe͔ʔ{EBԗ'ޖEz$aq"1ADWW Pn̶u8jyPq}-nzZQ{.h(I)M-( l'f-&cznYح ΅wAX\o/X7@sF{Nw/}^x"ޱ,&3\YnS0iqSK9mD3_BuctoMc^d s_)d0 S?PKLPKT; __MACOSX/darwin-perl-deps/IO/Compress/Adapter/._Identity.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT* darwin-perl-deps/IO/Compress/Zlib/Extra.pmUT LbM1cL1cux XmoHίJ }&ZH.M"ȝr!k.~VOgE{ggy3)[/rŨZ9nz#Bo(R|\͚0۴np7xA`ؿiq{﷝a7(Y8R֬7J8]؞ Br1g&=Vx)^z>x-pCYRV_eNG#bs8\-Z.G=ɅLE\r< 6fŊo[H(Q|`s4,}׃yXN*wtppQ{B5,|tﭵK{]5^˂N[M g$#f}9"˧2k_br}öet-RwZ/d퀄jF'RzDG<׎XFJ\k!Z.Mж2%c8sԢKjg |/fvʕP՛QXm;j@_,YTF?6Fߣg:faoN1ҙy^S{x7{Ty33pFY ]$emo#@O?Ё;!@f;ƫ۰s\nD»]u /PKJ!elqPKT5 __MACOSX/darwin-perl-deps/IO/Compress/Zlib/._Extra.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTy. darwin-perl-deps/IO/Compress/Zlib/Constants.pmUT LbM1cL1cux SN0&`b̆6f?d`52oo7ֱAK=m3@V˚q5 '8 Jbhk*',&|~GM~5FQ@Ŝ%Ax\8S#ɿh 5Q)O,)l^ F6?"ܱGF IlT!;v0/I.¶飮̑6Po+zD֓ԶgK,_PFd+<6U?dVž;xm9g፲;Ŗq79 nr-4f9j-3DOPui)56>1VnTRJUbjJ9,;ֲt^b1k"S6kQK(M.U*ϋw#2s 2{ݗ2PPK yPKT9 __MACOSX/darwin-perl-deps/IO/Compress/Zlib/._Constants.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTB- darwin-perl-deps/IO/Compress/Zip/Constants.pmUT LbM1cL1cux ms8)4ioBf24moNłlmr7Ԅvm&xxѮ~+V˹%ҌrfQ\[mI^dUA>(7evqvi<SH-|˱/O-\ .oK Gpfaǿkt(X0|>]Xj1j0xJ vUt9jug^,*^ΈN }kl5i@klS+^^AzPotcݲ-Ӊϴ&V$Xm=&ϓ!ywnpFjn?nֱ_AY?t=CԞ鄉@ S9&2Cr 5c~@gnmcGܶv?&*VwIo!;)29^Χ5a R*؍T΄b>!lNiXl))¦J۴?YO:(f?u{o_w(wߎ|}-~ }=~?wxtbgm,dI)0a19Fb݌3`58 . M"LrV(fij^|Jj52t^ą| GdaUNӌpA|}$ IҤ1SS&L -YB ,9Xa s9Q8F&JC*n2ފV9:(L F&oHtA:|dV(A \4?g~ \>&kZ L8@TAWYfAUaz6zCchZKHW@5|)b!¦9 TG!$ɒAƟbe~D#b>bk#/|k<_o;o`z$O0#MҘu=Wzow>fEl3+}\k)T@ # )?B(J hgF/Yx1 5#tD,f7: 볨M\v>u@V>~nHj$~h,>2 IBCF dt[;vvlH-}"V?%-bR ICFUZ6ef2a^lӭƪ)4ygG<$_{5 =m[X[PUi, ٩Rkgq0+p qWj#V; a/ 6n `/#-J%tAhXVB5nr.([ *̑&6L/JuP{ݮ( w]q,ף Z|D_B≖19O[\+|,9MA s0?̛Ɲ%Yd"sӹjSJ9Sm YS|@IR4 T)*-{z ijtfd`pY6gqsp;$=&!m*9sMD01=XhOaQVbj9d&r9IUG,((+{- d.;W֝R-Hn-x[7XYѢݱƞ)! qR+Njx LQvA [#pK_%1#+R&*Nlbä5 Mݎ(c4˄?GF'cٝ 2R$:d Ua":V%Bdb%:/Ԝ*xԓ#)'[5Mg]_ q=-hVki*à M뒸 &WUZ|l+٘|Q\ cX)(k\:("&u-piH=P)ĽKy$T_rq;3\CrT{nfs>y=UOGpc#ȹ*Y,&HlJ\< !d#zҜA54R9d}{[E -or!f{KxL2]6Z0r`B dQ6\Oa=ШTZQѤ m(MJzi;am0u4mqӷA5*il.?dKlNGm""LF"ƀ@gdK,e>}WkU\A_فQڈE. ,/Ԃ KYwdMGePmL& Q0b*-?[DW7 ZH ^cf6ZGrC+!hVNґIѧ)T9$8&U3d|9lK7O+HB`H& Vd<vɢ_AK{00\c:fKTΉkf7]̱`VToG(Xw9xpTf4P͛Bc:֤l{V;B̷kGk U^'37V98YUaȥ̫ة,ܥ3c[<+]Vpũf/G/9!TWf3w댨 Te WG!J~=(qoITk^[ uhAnI ?3E o0.[ ^90VcC8yWVn8Y &oz4v/h ?efdZ,ksȧ8}#n;a8%i\ɾԦλ$%әh)DS˚_ }o9{s>$y;`euɥv-n@ٍ8d ڋV'yt?Gpتx;wȧ΢os]OBK18#)ٰNKֱY@;] /zį!5`)uH\PC0/!::N"Ŕx=R&@vP`Av2JqL^&ksϿPmcn]{TPjڨ\WM?[."Q{kbR;J|2c!}|6>>/vIg_C~䞜>ƛN>1iĊ:n,aDYfXroVONw."{\F|277funż6{nٹp+ ꬈rd\T#Ddj99_ /Rk.ކ\ ՊoobT}#F<}Mfb!MdXt/ 7!~]鸜ɼ(;''|ԔóV9u&##u5).)IGE RV8=/9 Al2`xX~ otFw, PV8, lxT<@Ȑ '1bMJgα F6R-6^^0U18f;46@l5A0S#?Nҩx ~%biV[yGO\s=171d[f0bkA)>$QԠ2]!zZ!y A|Al/\*s$]>~^<;R򻁼>&G C~>ZXR5:@sN͔la\rӫSٮbX"REp+!-,]v2"eԗ:z3x.ǶkPSa?ar\A&'-^o.~1x WIf] sl'Ro䛮Q-,hS_+%|o1 !ߗq2-*aXO=c&KͳllZCOcf:*̓|Xݝןkx3d1ޥ/w=߆R ;607`E`[sL 3HNa>%jXqFu;:r3iMXPLy'^&:[fƽ:|0zugalvJ /h:;0A& SQӱ(X *W3Sߗ').X[='f qv[ \_C5J>o毉sX1guZOsjiu{D3?/,^(0h5̿ps>f|&5*@'5?8hzfmEhv\`7 WQk'A'RD鈒O (#C%ť?1:O#=/_u~5QR_K(C.hxb(x['>ӄyA9~vGb׳9d^d{ײ }Iw >īP2XzH+ 3"b&1_e"hU$Oq9,6MVZKYNʹl_ ȩg@ÿ" UZErY$0>aD>%kq-wfk|fT`ڢm7-reY9vtj_0Afi޺v8|Iu`)PG thx_`8 8Xla~荠aX%WX튶Nl[zF(H/$YE4/uwg> z%=zU^yjߝMXR+ P.Ze^~W(; Nً]p "gkI.3b4J" c(ΚS"f iPK>qXXPKT6 __MACOSX/darwin-perl-deps/IO/Compress/Base/._Common.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT 1 darwin-perl-deps/IO/Uncompress/Adapter/Inflate.pmUT LbM1cL1cux Wn@}WLCT $}[T$*/1 w-{eL KU?wwΙ3Ghb3Gu1[SK"K8%7^C@hDI8Y?y*W..0ф%0i/ùb{Nۛ]C۞ݙ;z49ͽ덦#բ$vF1^ ֙dGՀ='8c{oWlz2y̖C+(6au11Ƞ Rg>*s0fnUH' ]'߆Qbza968]ѦR"͢.މO$r ewFxJygWhc0@AQ\(1AVhfi9+Ivl޵@t gdIXuU,yҥE fqzU$Y!2,|v_%Q+ewq@4uZmU^xiL̝&% TZC8opg AAF"G;+,s}9J_/f/zVT+ Ai9tHުjNYeXPNsZTuE8bS dג<6uQVj.j}9vJ2Eb9 UH=BvSRBB:QÀ'aԖ:EKfE8-#q'V>Z"[oHsB'D'}4@q ϝ|!_ta^{dҙr&KY.w t!%oPKEb PKT< __MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Inflate.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT1 darwin-perl-deps/IO/Uncompress/Adapter/Bunzip2.pmUT LbM1cL1cux UM0WLjP.PUKM7q_q>H'2~͘뽸sZa/QjYÍeX(`iZBPFKpi3DJsKb /v f.KhS>"sD0~Lt>3qjcf>s(M׿ǴD{⃻_ڽ/"l_]e\iY=Xk1U`  F771p8fcT xbYoiH&q?>~:oph\sZ@^*޾[3U܄ p_ i!:ۄع;(@NrYy> fF0/s;o(wTVr%5XT i@f$Vt\]&}Er{ ;quA7钶bz{9\lgX%oV) c 4G"~#2=Dg%Q- ІpC #1|q]R6#^r֠*xG[s.{ڽM(1P>%;F,(xtDLB JtXPK%wږPKT< __MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Bunzip2.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT2 darwin-perl-deps/IO/Uncompress/Adapter/Identity.pmUT LbM1cL1cux X[oH~8TDaViva<1<4kawwKzAh{aH|Z7Q0qBy2wHrV ?"T ~zD5zw%[m- qj1&ۃLvVgy ̓=ԉ8<64fQ^Gpy{:*f0>p}HYTU]|#P % BRf[#%_4sE"BL'kNP!K#ÇD}f41:}ظI`f`X(=-V '|gPq)q_h5@'q[7{-]{GX8(n4Sz, TaCTX4!Sq[ɪ Yy ̪fт#onT#555YD i̷M<*KI@\ŸT?O>ChQe@TM)Z3e8?xm,kCOT$/F<)uYZ<2i)x!!a,n+3ٲL2f&룮W G}ȫlf9am%l_IlH.4qgXm #߃t2v1_c&O" koJMT2.꧔PU|*J9̽ dQInR ^i|F`3G "xɏ L2 #rPf go!8+uD WQd@_4Rfvg3?PK'nPKT= __MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Identity.pmUT LbM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKzNPs,+ darwin-perl-deps/IO/Socket/SSL/Intercept.pmUT QF^M1cL1cux Zms,DD 2tZfȜZGHrL_8GHHfdٽ;@RqڙN=}}vJwrMߩ o*cNZ+2Yi>ۙ,W . yw`FḫJOKBG×_T@S[EgRsYuNNbh2U)ѣU /Mg/^4C11{~dfɬ':yWx{${*v-kFh鉢mgV|Z3[_${J.1ux;䲫?!۽-Xs.Ѷu/m|?GRf}(?`|' jROm6 F8 > oLYbI3 흍o>ɷhDNmv2IzJ#bߏ VqV脨 0^ c~of_xb 6? z f#mOgiLߧRD9Ki.3FbBWbZWLҫ\E `&F4|{j"[;9/Պq%}6α/"^k7N-jy>+N㘢>iW߫y4nSUq:2{Ra!U{aE#-B`Ĩg3"%պVH,r(uTdsmb !B_TDΔ~IΕ&z!S1lN@qcy;ʯ |S9#cKd%- 33yK.ٌem5؏`Y${UTaK bqDAZ=: t34m>Oڝl[rpins~R1yӛTb{wQ Yl&bGqz2ƝՐ+-5)` oVPKx?pݖʀy;UT~Qr:~C=ieϝ[v5jk"Dqni*ff4Uh[7:~eJ:6 R[OЊBb^L! 9[FLIǏwA'Z[T0iz^uQ.k5j}uyw)4nMS/RlE>MM&7I^(A͎ FLDS{2jB-L$Cxqyus~c,ǻ6G31|MWhmӱL%t<- ͫԒ{!Us!RP_o].4IJ8F@!릇>JȘzh53.l;\q稉~47E\)UzA`g:[OE̜$*g%_D=1g6 6U ;YkcB&/Dԫy)UN!1{ft%;طT9hPkǽחՆAT G1MUTlK%zO6Sֹr +o= >Ϯϯn//vj4}I DCqZʾN{u>*Dg6Gm\E ywhreL/:1 1SBzhخRB}PK's,PKzNP6 __MACOSX/darwin-perl-deps/IO/Socket/SSL/._Intercept.pmUT QF^M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK&SC. darwin-perl-deps/IO/Socket/SSL/PublicSuffix.pmUT 0V6aM1cL1cux Ľ{6/wS鱝.LtZtO>gI %K~$͹U&cxZVfv0>_/L~؊˷h^x;GZ6ٸ- -(to?~.UjKIXJZj*;z-AЖw褽@_R_elkN2E!UUۊ6Ì2漲&\7o !Òjg\ Q;;p+Se6SHwG\O'=:Z2#}f. |('oȠp\BgPWHhExAv\/Ax2|Yh(zb7o}o㛿}Xu;薸;f-\*1:< Iʨ4%Zel]^n_}A,4ؙ 0F E fN_!zx镥 _.8[*5W#Uz¢t5LBE!PD!v#Ť95Ȝ0~U ay>Zai:{H%#mg!PW7TZTLKf_3~T%˗(#@ `[fї/%a/}]J|MSA [(Ogt]$ C;/m+[fСreS|7^!\r&ýs_0Ͻ0t gzinEEctN'>WwU˗aȇS)>\}|ϛ]9lzuL QRv \|shdEe|}0B80"#Le,ɴ7s9.L?γ_08{ h)[`P7HlJf}=}}tѪQѕAv#6?v$k_Pw.JGW,I!BՇ$1 `Iǰ!\W9Oe4Ċ G%3R+Z oeC߷ۺ0hQ98 F Qz*3C"~a`4##%cP^gLa2Tu C~ z')1,SS&2._?cs4hm'W4WVذg@v8v5Ԍ 2s5g/{^|7.wիe?Qd/C=ީtK=B4)؃OD/)( }aQ!/wKW,Y4>|M6 ?F3>pHWC%U(+`A/ӗ -^ф&+i ŤXF?i-C*[b+hV1C+ړqaֻ?'Iϡq*M ^<s6i0D;f|t9tSCVv&ܔɯa8Yj쟳nxw龜Ѯ3G8si2snyM_~dooׯ|΂u@(<$G<3yqn;% g0 K9khgߓ4Q'I?Eq8% %0WjVS>4.Zmi6Y3w/_JU'#-T^@>Ħ}=.Y{WS;N<$kˏ)+ZDwOP}Pe\:a$⥗ν'K>8ڇןԣy-2Log&,Roťpd -3/LM~vVд'$[|j=t^u-L[_4Hh_5ڒ}GSk_qw0Hm\='iyS-g&|C HU_\go0hz{;PX*}:R+ЪFzkEĐƂ}Z_TDWzJdَ` s@W$FiJ.E4C7)0 #h?E#|6R5TIK;guNE.M3l鞊)b F>_6A# |8}x?}JF{ը,7RkQ,d9S:TDA-/H\_I^IbH+edߣm*V TM~襀^Rm]@ԩH">ВK+F7z4k A|/?_ āA;U#w[\!`ɢsO ґ8XW0b=ꨙ@Nb &D ^%FEayY:Z]Pk4Z9GHbJO^PRsBA;AE--vZmg:ޔکVBv|M4r.KSL%q>g&=JiUr*•:0=UTVdfbĽlԗv(;^($a-Kir.zU\ OUд1WӘsIgl`DEF5? ^c8UnGڃ`k==HBz-@T-H34ުVlZBdEϴ ".agRD%Vࢀb6;wPZ;1͡џaz *c91r7q:wo`7`M9@q@r4S=*zcA YɮyY^R^攪3)U+0ЁD*ND*R;'|R R+Pr ^QGmc.K^SxDMۅh9Ŗ r[XZΦlZΦ F:dxlݷ_o5h^*h9ӍO:N;N__0j a0.7z!PajO]|Rdy? m@e }Tzpwb B.Z6P9;;tJ:L-Ȇkp0[q Cǧ T'kj! V@3D &PR ?^KzwX`d!Y~F ޣJC14J {Hdt*%iy>EiwEL ߾fː*{xAlvO-1f>aap>bdW20@j A# həftPO3%[|#" [lĠK3EFu>dyw8C)/c}O? X7hG7”y ?{O7ok!I).8r'>?r=r>r>w\l1q d!ofX@l{黩jhT12r r r.t/%=;t(3ɹR.9/PyI 2`򞗋OA/# 5cͧf9ϵ@ WDa230pxer D[h- $r|(!G |4hLJ>F|;|q >nO/)>>UN}A #yYjڮ9AuA*k V u%0sE68l.PG\~?ʑWCb{?K Э,nXlzC踞$ўq`yNNN\p7pfkNWs\՜fIENR@-N{یТbhOt aN.;yҊĎHHE6Ejq@8?L✿y`KL&pMPBᬙ$-Tf#7}9Ndq6h0b l40J ChǒjW/XAuGo@aExq7R^ YOT`cީaHﺗ;i_iZfY5d,D^Svȩ 9¯z ;B l"{vr Mm"x<!&1+#-,pѯ `N9LbXah1OT]`&Q\@󳿔kv,;;TYжP1[r5;ċ ;ZP]2Fm"~=Ue};U>&G7UEWZ^b$} \Хo)^ňjqw)O}ɗWW'ғctuتg&̾~nΥsv.0ǭ 5H^7b؈uS2UVe+ Y،$f١vb4㰊 |wk Џ(J??qXv $WRìhO{F=K^?5 9 /XaGlEqjnA-ء,{K,$#ʱp599?O @D5lVxRkj4h#9~WfJ_W/8 7[ehх!ְr"9,F 5.NCǒ"=v9Nx0#@=]@-βp-7eF9/,` I <;H{-X* }p^AH# f;NYjO.R=m3ui/|w~)yhKyɨsx 6H n; =XӠ[ ܥ)ٿnNXM?. :4ف>c*d{0Nk^R sBܺq)LX\Mo 5|q~;肭|tYjV  ]5q"wX-zz_28&r:J&G2C 9/,估jCΓBià ˶VxoՀA^ ώ=?li9sħ <)my'&o*tmy1tH?Ku(p׭K(E +6P}Ez7A=m?bvI`Q\QCCբyqļY9Ϻ f݅Jʬ [x r0I'J:9D 'S.NEi .~"-ƙ2?pn Ju%ǃvs0 =-74j{twHQp_pCZ-p;sWt0e0%Hӷ=~(h?EW ^ (x/H7 pGuA+E驉x 5 ^C(x *dOgD)}#^ TcjV57=>(Hw=szJzRf5SܐCq7%RSk)/f Nx8#!uC)T vG ɟ*4Z$8)̒G,ƦpP^ѥvrKSLA P#ҡtpЎK$Vdz{I 11dA{izg~pk }[ 9xPDP?1_`Y l|Rlx] _e - )}\fK~U<޿=^c4o,o,?_[qgْ,ؒ,.B)]`%B k)g r^ʃ҃ՃšO2a\v*9 TpڡDaB<*A琐5 $mC;zk_dUOʢъd9Dx]Q^D]n%Ce!Ilh 䲉vKY G-JJJ^.ydR^OAI3`K^.Y5 Kօ%+Ap,LJV%+x*q:zj[YC;us?=S____nѱGa,Ydq,~^mշn?0~D|^-$pYD1:v ɇs%ߕ|~BB%Jo„8o^hT"xr&=$YSt[CK.2(tڢCE{$:浬g!*bOc f. $TҞMA(ktoF0Gc$ YrXH^#yE 8j*陼DF@DXBO Oԁt}IA}{SӲöq1b }:ʺ;N3+& 3sBq@wӟ{xze{pk^߾Z,'3{w̟ :g 4gSF\/*PjuKuOAGo7`P OpPZpH  `rY``Zng͚ͣǗ5:ktYH`Yc:aڬl NFmN{Nc_.F4TkQy;+ u~^ݹ3oӛkΚֆkC*`%:!{Hי;ٯIdYZNgV ˵V2G1D )k$$tC0/:zQT|(#:P[baNţRO}DR&С x}Qj/6X^ܪ UKg_W}̅G+VUpfkqyUy.tLZGxu*^@x95#xqAgʸ gaܯyrv[h\K,m-/TB28mDA}]ƼWo_,o/tw:LǶOCT\pG*/8^=Fp5$#_5*MebK®ڢzۮju\?^ń'9ÎQW4J^ϡ*^ڪxi,tFA(Yj/uUhŦyuh_TT]mYۖ~ZT̋>TS &Qn,c~`~`~਒`Qbg?ɶؙ' DUBoͳ5ؽ(>9GO߈X܈aR &u-j֛u~5tLo_]MfXVY֬kV{K5+:1om{̓տw,iǖWh$ѥGͪ6n Êv O{;8[tiսv3^pEz9M=\@91 [BQ֬H1P21zMIm8mH~.jM=V#8Bf 5pFХ3I-%A95m JR}uJ&ĉ28P,(B(6~ 5>kٌWH+Pl+6U9•Hlfծf)2p5:tN7 ]bm1ŶJG,]Кkj:ʝvCO%(Gǃm S??K}5$ڸ %HW|] `})MwadNY(V%8SFdl;ʙ*88Ult*֫wqJ\X~wnj)%V*g4o (WdA ^u?b4=P\\\==2;PwPAZSVΝ#E" QSi[j& |f_WW8KY<]>_(kUתGr k&Zb"t}\ gf] =?GӰi $UqBr3TQ쬨I=28GU[}:Y} P|QuG>+Q:̴'sIQ-Hu$9gK˱) NKbg ժnY+BH@}'0]N+Q3mu\rƐjbqz$n,[%Ndw=9cǥ)k3+%EG3Zk :dK;Af&: /1O"'<K MAK$s@xQ#cLUuTiurJNk龜rWƹx'3#ϣFogP_9N)^K3RU+ Y1Si$0.:ʥ Xy.`9\Ai2ɖD{Wr$;X a +C8o\įnG"/z~GZ#.~蓼Dϯ Ia>Z~f` #[/Bzi;~J>lvNaV(f3ӆUC%nG~ ,Aaz D #:6G.:C E.UٲV at } Չ:0>=y1{Bڬz{ip+Y7芟Amî#g: ?sN\Ityکm4 {v,=[jmIOqI30n0e W-O?An\-mAdyJ)hM}o9"RmiߒB⼍F|I*B3 BPy25 OL:q₂s 0XX7c=b2Vɉ4paw%sd0VQͣcN;@'F$oK=Oq6 ܥ&l` ȠM L:[-ӌq*ρx?y*ƒ|2Og<ݎ^mq^U8䓝mUwcZ 8s/lwTu'pק6tqml׆6ɡ\tɑOtvW?9QCņ7|$7|iUyg7|VF }`=(_-mWnf;~0 mgQՂ!a+ V&xV+mO ๞S-(EF'%(ordɃg=6<B"*{jPSZ7P%1[4s2'/lЪ=jD_hWf@ nspNIvRDz=JWx/y(At v s!&y,®\0`<`yI=N8 ٠3 I=et'>?@ 7nwDb"'i7Q=vg5?~\Od1x1gs7}sr`?n&qT>)׻'w'7sfOs޾-'O?lco>yƽy2\MLZ;>yNd?UP!'3<ΔK1dk(Soe@=~q:T&d.Ugg"/}:k|v{q@%*ovtA iy; @Ztmt%@@7c /~Ѝ]=_ wH\6Ls%aPC6ã%ա^CxOPvl'ha!mBUiFw Z"QŻ!փGxʤ,#0z4Q0\(&ʢz*kT[ f`+SulA=<[vt-L{mȊ0rx G!,foq Yx`uB7".sţYIRFD/V;"-ET5 '恂'L`څ݇L@q +tB*_ΘZ`4D t1710f{i&ѩF). rlOa %5.Z:5~z`IhzOV""BrP@5F>0IgzsҽeP`[0b'ODh <d 1PQZQV$VF3C3"b܄l7V0P]I,[PFt&!2,€Ռ1b! #ryj&lH[q1Hl="Q8`4 \Ц41,;iN¸c0Rv![= sn @Hq YktD #OEj02&oa74VcmGQ%@ˤ8"fHB$l%^jfa\_htd',4 Ifr&=cFbÁik+}էb'YQq\KV W/IX9Cmbn')u~!=gFWD۩z {T!"f + ca銑KEG؟T8"UR9\- MssnLֱbg@J cCcnLi e"z0Fm8b0k8i tLXA0U]G1#e'f bHbDxkP [% px ^(^ 4Q@J $1jawR'R"%A$U+SvL i<ٝzT4bO'@ZJ@gĨCI"OIIkӲTS vgS 8ؐ;ǒ%>D{\ A" > e2jlEӒfLsЮ`%|O[0y#qKa"P5$.i=(M&U$-Eh_Zj^Nyc1 dQ&)TCfЁ&܍'11P^g@Oə![O``4~ ^/'D6cHA ZP ͢$_ :̈,ҹ:il}t#; @؜`Tf%Q'\mU ѩX՜:3} 1MԢ 0ɇxai IORh2t?9 =LAd /N="ϪAc ´3A=͠. o]>C4&-'LG| s8ߩҾ= |I`tژ=ث'C-ΤB;hP(hѰmithCi+0M2On'‹ӑ)c|H#.mV|& gCz?Mu&jR~t>@τS!+vF== ct}y4Sx$b`%]Er@a_yʙJ3qc<-!+@O<@'sEh^~ 4!ԋbt#pg"6x&>iZp tZ3q6;Ӵ"i#׍]/@mR|L Hir4r2y!F\b >P#TNX ڨ2F,ZIQfyӡCD[h}af+u:A&#"pҝ@w g-x5{ h[@σr & 7FƤ"  |%N{$S)Z <玱v&N1R03y:pg6i: ̬6kަQ)@z9uhHڒ m(1faqF8Ƶ* s38OqO3Bnkyɤ#dj 5vg͌*)!MGfR:~sz@h<Rh'>f2wsF % s`5:4oD`G#Hُ1L0ڏp>(uL7WwK+"4|DN :0vuU {$\9f!2]aC,0 RE(W݈J nT:A>`;ѽnxC8@za?;7=0wƉJWxvWc ѶJFC!=D2ӄ!'i@'<4 m7U&u'P|+JC |MSXGߨIu20Tthk ew"1/WCA,ޢ0@ٚCꊁWgd$@w̭ž=Mʹ+VA{;e7vbKRsl W:ffz|dB( Lt^Uz `VDTyB/ BR:AS8/#ܛhl \q "O〿sN̟wn͕A1 =:403pkD'kN C0g|#BӦvVH$lZ@Z١ *bּSѨ4뒐:wC{e#@E<sD)?J8uEH E,@YA5Zt-F' N#OSp4 y #-hŠ { :IfP/BnP . N6qS"O@c4l- |D%y sQ$q^Ú1Š"$.L?s&"~ j$ !p}6 i$ q|(@8I(,AOAx|3+ ﳈh2H OH({g1Jb J/q4LaxKУ:{":I. ./:jYј^!LM tL7I1!밠Acc6Oal쓈1x*Jb(Zx#m N 6F||>yC&!tl*gH5u w *PSig֐' צlt!8C?5.骛< %U{t=VHWif3^t]3QKs&DW[71Hӏ â0#FiÓ(Q)oA{GT vJLJqxͣ{<ѵsl Z!*)}!5F&E Fw fD\1ܧ^`h}أQ1x+zi>hzLT|"@D_(O`EA(+.F9\\Osq>ӗff0 ^^鄜h9Ɠt.$&i"CV!@T>gR(Đ$烯U c~.VЬ-2þ6CuHڨp&W^W5O <";k\ȍL^X(v6Eu薮=4FN7sEnNB4&ӊrbG2LD@m0ZMzy%* pnI6+p,(E_xLTKm2z2=Mgg :!7ڙ>uʈJni&ǐ"w&- tDYX֓p_wƳ 6x1: Ma 5ۋt"Bp+MR 1>:!6 &gPZ*`Gsrj%ǥ>X:MKdq~$(Ġa"@W _:i-,dy2WA%GedF12 2`, !ct .D;ʷ&NzuA/P#VI"6p(cOB'23#6~=~Yq& xNgtC)>E35AcF Czpb=!υͫs:ƫ9sAf9]8C\4 }3Ż%2f+DV/ h0W(H& Թq*Dh'DT qJp]i$LfCh4*YE{NNjz^P:NE;biY]G[Ee#e ׊.9&u>yC>\؉i睴Qp_E?E#2 ]N/Lx%4$@K06cpd>7f-~@cno1;W&4iu¥?SČ\u30'=r}3=]bz=nqn{I26:p6@:>+S{{ UʘE-O'-fqb3u ZUGC# ( BL8& LcIQ+l5鸥À+ '<=^UWyZ_I7NP3Q:lyXuns*H"ZW)<2V.C+ J!C7g~lLcN(=I86B@QNY_@do"5?8 OV`cwI'T hfv U%&F.$VMm$쩺f@OMxzp ec#FHW1rI8:* :'A&!Z\G_Z)ByY2>I+Bs8k C>P^!gƠ;fhX8).꟦5)J :zV6^m6 dI y t JKJ ^1gDi w/HEx<=ƴ9Ad}y0&LO?q6CQx?A+sK'/ET8M]aӭhNFLM xH 1P.E'/t$iq@LQmz;;cLa|z ݥ(›DP&s62Fz xV/mM%ػ Foó?.ސ"w=QRʿw?(T/7īDt ݡ#JTZǩvۡ`]#˜,r1UR #`f":ēb3\(TqҝKB`UTZ!n}}@uxRq~X@ʸС֔ WPWSpxZZ #3ݷ ze&l5z ̠V !|]e8L\h <vOݽ|y}hہ:0y<+sm'Ky䬎Ƒs<27G#3u$6ZlCsb*_#Sx0fO(zp)pp&AnA! ?}yx5R&9339ss9\\sVi n2!,\p^Hr,)8uAj`6gX6 eVm,%ڇ}7c1F.چi@ fEi 0Ƭ{%:04VfNNaM^dKw 3h3E1̮ᢰnjmvlHJ+p yY*%lVZ:e6,yxm=@Ub`Jsf[@ ?&V# f9L=V|vm$lqwώ #*IA_KwaulI6-gje}ٲ.gbpz@[b@~.PlHLћڬVr5nYVޭ͋O_oC +U8 !$ =UqZ]ZtZ$cceЕ\,eɼJԎ)bel"2 f"{<SO>[t<࠹ @e*2/(MxB\\Gh.ߜ7 {lMGU؀Icm ojc5ٱ X[v^;Tkz_u 69 D]۶MmN8P-s2?-[C̶z;(:WgL:%v<.Dt@g  :LQ5 1h.f5ԜTK'``P48ɜ7CDYԯP[SiIw+ Lb:[pם:ۻoHyy2˵XXWWW71;4[۵l}Wnz<ΓnQJ#'1r#e$67䴭;_c"#FFt6*(غrBʢz"+9R&V@mhゖ'm.& ` *xOLmfiM)=}/1jc Z^Ws2ѧnrmE-$SB &Q0p^J> AMHDJd<F'1+[bU@B%;ŋfrCʈVRA| ީ\bR{oeTMB ^h@t@ u(E]Xѹm)J|Ih賗t<t,TJV1|90 ާ (Pg pg@_ U/w(!nO߀!9(['d۱˽ ^f} fFkOHE<0iSz }I@Pi@-6gY(BYIOVatu֡ =ފvʐ2zBPɀ!!/kY@,p*VT: xh{SEbр%z4/TH?J S-ngZ)Zοnu11}`dX`+tkLeq,a 9jЭuQa^fDW#i'a:(rOAn;;r%]^*ta`~-`H6),gmT.%;B='U]<,C SHL=~!RzPI q-u`!Cg.A~5!#wW@ $!ƾjPKb=z٫%~KC21mJNM&(. i$^[:ҏ?0e5x58*Xy] PXR[uTwn0w!T puMRps%CP9S0.M/b *8U]_Yc{@#/èAjEu=κrZ|}\B '^ĎQ(s"[7B5?Eo| Aj 5 4AI5JxrBw(5Z|E=@,P( sY(r;!. >4*i@> Dv%Ut@}j"dY CvfBUO +Imav"P LmA\vm6:+u|Mľ\x޷`C`5~_:e@2mfZ#ѿк ĸfBQiPƬg!eSpVhOv֒N>M@vFw 4~ݪ辶` D* ʳu-6ʷefO +-Ѱkڅ`-ˬ+ )mj.sEϮfKuwQ+dEgK_"pg].$1Mou1*˓\AOC} .D_ć̼gHh u&KtEW, bQ𽋂/c|ӢTPc;֥T2Ѯܡ(8TOpE,1&Z-7g@Fx 16K]1 <,sw1J>\*)6,V6:3Σ&O,]iËj{&B^dUPp9yNr\<'\ǘK<,8D@0}tSHpPN +.p84)A.b}8iPp8֔N76&+ǭf*nHc ?*tGK>e N?HPB,|36Hǭ>(3 )keFT5KYfʌLt۠C۟0eq#YǷ!_xҐq? ]^.5.QsiWq~j)uK,p^!1@ %Y$! od\xd_(jtʌϴܡU))g'\DS.F/.zI"V{3ZL %Z26:-`:_(-(Tj ,qL9QQey;_);/ڛɚ6)4<>I> <``s%U.e"Oe萈94CmʁFyf kx(iێ8<~D2zTgkl P= x2‡&ځ#CTtC?eI 2h ޯãJ to?".zL.g:R0q,xa²NgiU %od )Ux 6"/g ˍWF>ua3) nS 8ю>RUȌvl`7].Z|âjsnB,O]tӎDt3ɤ ӹ.!+OwnlNJsCGe+2xJjA)턭>3`?ԓ0{lhQsx<*-ڊ8S "^7=ެq&W0zy !!e; fVl$f0>/r++ͪ[[HEWxF}NiU5þ+>8Œ&pΈ6 䗙^FSdə}32i9^AxGăr7qfufx@@;\ `W;I.;bhÜBcD5.J5^pT]=]8}!y="|CMn4h|c6@]i0P 7\/K%b%ؗӉShܺI0Dʛ@>8,`"ղ[}5ݬB0`àhH',,ӔwAFT糌h9Jf+~v[&,_e}T8=aLLr-/yt`k}^&j68! %@ xJ|fSr髃 ٹ$:i{<#G(0Z CXcUr 'rۀ@KxB@e*Ć^nl19m+!^eH'g i҉arwN "਀ seh+Z|B9F?jN*фB=k Jsߒз'jhEx' \>.=N\kSNar cro>S XFH*qRFδ[cB#s8Pde7n≐/K4,Q h'Vz \um"2q{fM3hK3R?!q(GUy/W ?29e N K](a QX  '3+zŬUaR(ڥ϶@\DuL^ՄC5Ynj ؔb~ڦ0N <zP,OO~hy`wf:qz S04WQ Ӡ q.fix1!Y"/X 0#xǛR帘q/)g 휊SBU" xii P DEng[V5aqQVN> )_zz^30(qh]F@foVԾy.dE\NSNΆuM^sp\ f{%qY#p\!QbS"(}sM! ht6 vӆUhT9;*:?+zڏ?ц!;>gM1kkx6´JɳkRu5t h@& dR7RYt^!CPkHsE_%:Qm;bo-%QizX..$5StqM ȂSEDnya͉qkοԙhzXצ]kk2N9  K.f3z oq` R=m)]hc@T8m'!,Z (AY T[.:Nn:99?*3j QͼnykLJLm# uC55M BMIݳ58%䰶|@ Mt4TK55570$P5kf]ܬ}$[64`i[7`a[vfqVz }V˥9,C2ʄTIגpb5ߢ%QWՄnfC<;wiڑB .̩zj]U5K̈́n#<*{R.~7'zsce|ɍZ /U%Ek_vHF%k`1\jt.1T,?jUIH (.Sfoл/uPk:aU5Oww = DVC;&W*Xbe=| t'3Uèi-IٶiɆK]E~l|вl| rH jԖ N/ ZY[c̨/[BBF#yX_IϖSoz;|5[&jx"$߫JFN%~mwQ:n5>2EOm|6AUbu+&ZQ⑊?1R@`WBW|cX?~P 751`7ƣ#=QC;6_C4Bsbb;ߕ撱W~kn;T5r|ԽzFV)pJzttN5p/;V C^~U3.ی+:"Έpf 00NpFF6EbQ+6]3U Yů#Tl -)٩ر@xW9>Kgv;wf+6]-c5ﻑLF m(BIU2X #>t3?F EїV0. (RkVJjph\p%[oyn5 P.\|6ĚfP҈QaF\ rOC[T;bzߢ]Ta`.yOpB籇Coym*ELM2X= dl|v%k*q7ʅ֨P]:%8&GhM &́ >YSvJ64$M I"#'$e&*07%GŚ;Fb3WƹZZ@a=ˠsY 6Yc3NL^9SMXi'ⅆ",ty-tSKEI]pO0úkRot*}݀D0+a/sUQn[hF5Ӣ\@ y;lvmYܥ^n 1+Lm8a _*.3ݕQI%׸^>ELh!M-ϰ!nܰgibމɍ+Ѹwr*I |L)v!+@#ɎMdqxfYC36_ H|1U@7)q6<6U5P136{Ͻ(1Ͽ O O O OʍV '` pi%~no/G T&K;p50iX׈\*}=Z+txa8PXtΩ:d]/юxQ:mh/djz.5YiPI4hX4hxox*7lXEwn!b mt}XWְѰ<&,b;FnYl%B}p3m'xg~k%,ߘRZoIL#`gTb2. dTXoN0dAiBA[VA{I%3oAK\ }5TGC(NJ5e)MKi6osGJ9. f~]/ů(ZvڭƉh,d45b† ^xY!AgN9f ,MûttE5ZVjhZ.WU'_8U+8,䪒Uxu5˸de| z@|]L$l: Nv1cL m/@+4e(ε"Md ʍB8LmEjɗ{_}6ǔN>}1ՓO;ԧz\P `#j_z*GL ƫ Z4B{%%yg' | _T=n|*/>4 _§\F'1ȕ;xݵ. J _ =-@Zf}pWK:KÙ|s+o}cwuۀ^Y㓓x{9#&xnSD8. vm6ɏ{#c6:#v('7k']|W/ I,K ͛Wg40#9AD2cqɝv<ȴXCO#i♺Sţ <<݀'sxahcʜ;{zr/\Kpe.\+| _tJ6zS8y\6Ukr1+u[{u鰖>ƥr%γ7r﫽zgq $ h3k[@D0MAs^hOĩ/SЗLTLV[.||>&. ^[)+}zLe{_}K%55+_վ֗4Lsk}wrIz/IySm֢S%"}몡kA_~ѷǟnCkLi_?}猆DCuQs'}%"REO"4">.EJ 5ѯtF5;Jiw*NvgMpAdv tg"!d kjo! ;d- YHo? ;4 ݃#ev4ggt^TY0*R$Lk-hշU,QNNA%Te-CdXv n~ tZVV-k%y|f2~lS=pz5 fԲ0Z1%Y%e_>~Q,C7\]^+-uf;OTr![.$9X emWzviZ0tnns'Y +>+YuQ5o\>T_fD}2T8T>r`tSa%\*z5=&m4D<)G9E~s2BP 6chl?י*q'gjwI?ʔL"2QfTqN*ި35a&YI-JbViNP_!ZSެ*) ꇛcF߲yGݨK'ʹQ{q IAS Rg}t2yw{ o&)·})N+ 3P^c} aܠ!;c~:Wuk!kzw,kU:#%Yzqva9KKLNAn/ީʥz:!l_u\(m^.G}Ip8l;b<9;?Vdy\g7f?ea`] j݋}0O^-:Gb*w?<.VΒzwh́^}{ W܏/ŽzEdOh2]ظ#fӑƷg4:@ScþV\/_MW:Ȫ@ZUq!6La$fz*D:^2P4d- Wھ=PaCd6|eTbP 5/! +m++IX[O vVd|f_)t|fEp6m}G9VA=}w ?u.wz~r$n$ J=rk-BٿP/4c4[,؜u\^f}ĺLk_h7bw{X6E3 ^ֳ7 D5/ԏWtJ.ElX3j.nCk#+3f IۉfH{7{oʯ5^gtUs9x=eh}Vd %͢obMy /;}xP̌c>M(qQ/ep14L,D{8a_ıمP&}p4$*B "!~k ! *5>;Qq_b zqy9]$< ɴDW F \´[Hojk4Cۃ9x0e ";!/yԇ Qߩ*\bjݓ~^E-2k*@;x_-a$x7a$ f)&Նq~վʠv*'qU뷮8.'F/ cur8,f{:__RK*yjZmިY/՛a-{lMtk ~o~3O%Ko+XbTSxrmN@lW8nOk2{ഗA*a-y<ڛ]'D'IGi(:70'SmE귬MۼW/MogEU_UيhYaíd({Mh,u)I?ob{~9oT6݋oN lvQx8@HI-q?b0tB1ڝ"b8XX\]gBlSn 6Ś7ּC-5oy+n{pk7&Qh!6iv75κe.l]/bOޠCjÇ7|^F/ڀٰ G'%&̯h,pm«0)xm JAT,c[bֆom&نg7 _Tۭ۬vyiXl=]=7ц^lņlɆoC(#`\CdҾ% <|.`(zkY={x:9.س3tx?{;{u__X,fWS]} o"XО(]W *jw0>x(J5g%chhu_/!ZVUMx3~}WkòF;?C҄"F}9&0t` ys51pk M_2r@Ề}̖z^ՙ ҏ#~ I>%kR_Xv ^̀ F'}5HjPaZ #V]9}7QV{a)sikvU:3*I=֦\+fY=iap Bbӈuj{ rUM'?)HonE@4YUjO/K&0DRcF6ZW^ AΧYȐ^ h?x{ ԀpEE2y;FMOϥN6sb?dx &ceAh$1hʽ3Re!A[Pd(=Xbr bğ ἣ̝\",BZP< gmh1Z3u70>*/Y0C  h6̣ #I%hПNζ΀Qž(~+kX9l`5"L9>;A͞\D!arӟs|u! wߗPXYDH@meMW|BԪ;.`ӡpH c5}.6L~nzDn}9-~,iFI3g,s^t5YJO/}oQ!w-+Op }z{~rlB /f6q"KSfl`ت(`<2!p g␙MȪ q{\cU'},ͩ Q3CSX7">NgX!u{abJ]9(AAq.8?%JT'{ ToM~\Z57Gw.!Ic /QE EH@|f:F`8ՙxA73pA DThI HS+/ë糿0:xzy{x}v=044J Ld񒜣9&2gz,b &2$  Nxz>>@Q6y7sKINX'CޖrUcXAsS "uƒNu}C ZVCEՍI;'DV'g0~׭؎蛜Mt1q =H,V&B;H!@C}D8`-L A8&AoExZgZQ:Y+/&- jgMNs ˧x8i0܁YhXz I0:.Q&@0han | }mįZVjF&Ʊ.mB3 s"e f +.D_èaҺǜgcFװ]xPI䦃Mק"h\8׆+38LR‰Q%h]LjHT{BޫD G"xLGB=:Bu@ D_wmNj# :&[-MGG4^iͰ/>:*1d'lL 70K|퍺mB@ YOAd^Lj_+|tQG,I CzxIeY :ֹv/VݵBVnJBn geV(Z0[ c$9ٙhYCB`YǓtdKsHB&EQ")?f'}%ǩ[knA@ Œ?P}dv 2cOnonoO?9:B k'Y/PLGi^AcQjک[*B@n͏sBwhjحt:+Yc/':џpA/%a6ļA6yƢێQ57q㄂ koãJ3q>4uh~ .@'+---KZҍYwV2rIRBJi*u?2Sqr\Tݲ瀛#{L}sȉ PAJ_ZcUZ%>8hĶUYg<at}Ǘu#ɺZS b7N3y; N^JzkʡLCO!^ڂ ߃/2;)=wd9yr||8LTt}!0NoA\\]rzx~ U!O8bٸ'~Z.6u4=9PO=ωMX%F"kTs@pӇ=> U lǡҊsePɫ:Uee3c~7NOUno3dMQ,+x$[GRwJ=RVs\_fixIJ;rʎOM %ߖٚB0\_ ͇ZM˯[-D1"dL(oQ8 jΆ[w`2:=4Q# <} g*D:Oh <:vnj|U`MD(_-ebBI>H\5r8^}Z۳cYA:^'jh5_#mYCCJ>O9,N"WYDp:O5%(YN#P(~t`eXa:p:lwNm_aZXĈ > !roʡIFP7X0}9=rkevr 1w^Etⷿ&jkUbn8'fLBԽ ':^la]CtuF\: {hؤa F|u$ ^>*0\-z[ϒ5ɧBL~C>(D_aaX6=AzZW/Q %d;% ]&8p6TI5ٖy#gmV_(k:mma; Zɧ nR= O2K.B0Ɓ6^_Ry]m to]D?}W3m{k1J`9)L6&0AC<pA+cݟfl {M]Ns߲9 wwO m.nn/۫kT1kn>6y8_3bY၉%E[U7< "xNF zo"i ^p˪A9B箢m9ִ|kfvȁ;&^Ef5Pd4kHX&U (J-sx{۬/(`3'1z2 GH@ktxOPGӒ` 2S)PRFy%(<~o> A@ "02Ln: qTl*Cu(lNm!.9 >⺝MgN@>ݧW@`IJ >Q%f_ꬔt3"0#W-B^C21 -DӸx];4$ܨ9RLGfCd:[vlv,ij|aNm>^N('O1"$A}J}*%B T Gc5joFv2$ ,̗;|\]o_-i QOԿ!'ũ.Ur\t3KHE򾓳O&b;;кK&}]swO@DHNQd5 nmPoL!`B~>֠3 N~G]k9tI7G$H0`oQX\Ppğu0&H9Fpr$ bwx+dv{L>7:[>L@ɯUz0F&<k[)UxXMcP|Zd5]:}SAFTRn Mbo'R1|{z$1%pe-0Z'46Q".>NcC-W%(# 7V'OBAY}}a+}؝=>7XϸЧ*l}10@HAɞbO^ee28/X9&X򁢝PB@޻?L+:<ͫyT&Kp͠}”u8Gꏙ8A"[ħ^p,`t#%:wRt60u׻+r:.:N{ 2ֹ 7hEk.uN蓆 zpD ';ocf}fjޥ #GtpGZrI~S_b`Xpi,q%ϻ{?qauȠ[<wGAQR(U=N˞ь-Sg&HҊ3WZ^"#*jIplw"n&52zM$yۃ8ýSt<Ź6MgOMJgΦSKY6@aPg Q<)MԻf*M>A Z2}N  .Y>ttA J*C7nh8{OֆP Y&QJK{V?]v$iO7ޫSl)x"̆Ɗ>賂&Xa)R9.:xdI*<*p}-ҁ:H'p;OlcIfK$ 4\p d0=+Fyv64 _E].=>  ž LIaϋp ^gp/5Q-owUx7(\0I GG.Gi<?R\V[+/o G,H, ;*Ƌ@R>!m7BXOAxFLTGd"%^8}sYJ"Yibc,աme٬r.Nϣ˟CcSswX}(L{ݵ C2Róe0 z 7Ni]pb)=>g62*DC{4CzDj#9> $l'E NLafK_=S莼3c(w-\PV0dS\I=UM,E5OYJt  ,,M3lpO"G#?b>w 8'r:w>:hˇ)86.ޟC{VfL$z³t-N,1ʧ|'6:tPuw6" m0 YPAk{ݱ[5'h60WGN?nx[1X7kә-?q ȸym^- X$AQw9rDPp'+вIhxಱ3Z dN$Šhpy_~ :L`o:LA!ޓsԨ,ܮ(d -Z 4?(p WBck鞑%ěQ~"f-BxP֮@JxK{N7 :8Afe{Kr/ve&Bd/<=ʦ::iZPl=Tq g9п!TLļ3&d̝&O۟sG; ehwjv I:x|ot0;ી5PM7Ju(oaYY7?/F\`:ͷ\g/[1%m=/hPÝ{Ba.-4/g^) K)zoI#H چ*,gPBӲƯnXxbxF7t/k!!o|_nJ % ]Jbzp§:<-Zz`R3ĄA[+צaC!1L?Dբ!\J%WT&;@3@tL`ɿtOi,3e ᕖ9e$yH~7,@C3Q0q Fh.ܞi5p?xl`Ⱃ`|nY-GZgnء ^ Mɪ<`UtI?<@C=Tq؍*~?(:B ZhZG0ߑ/4FCYlFGNik:LzP00ozTuU;R<_7? 3bEKko=G`wwN͢!%~b[:1^n"fI#A&T60 2ݫ|&zs_5:/P%LN.!x(ٟ>$tؾ%e18@,OAV't ty^FV}嬱9$=Lv:N5Ν+*yW1& rP![rࠗEewYn?o1H zC˅ݸ}wDse.۶QaȵsCg$5#F<"rt8;ޡ=șĎ@wXv6r/^-$xr6G fe~N%(qM0Z03)('D{+/0y/#d*{dXvpq͞Ip_04LdK{  &##}Y}YLr78 l;EH$Bkg%C0>"vDK.`puHщғ xȄmuޥ9Iׯ(3t&G7ǰAD0("3*G 3uYe:ɴ?DWfeddF>q趜 cW28QN^dsxr1-2a =E[է8|n|r6=^>r *0~6 t Wgu;AJ&< |CQIWll u~>nk|"&fH+#́|j8;Umȍ<^=.cS{B3j`D$MI7Av@ EڠAxE3@Ɍp2}Ȉ64:2WAȞE۱֕0k%58r{Ef!|[D]i? ن<3h$lj;jC|i`4!t  Fڿ:?s +j'0V ò+8`Zݹ}܊wrU*Q{D]glk3ʡmYR0ѧw&3vF%ϭ{ |F8Kܒ+Uqd|~rz9 A/l0d@_:w;=4@Xu#GA7xʎo8u!fXg0q>rZ a(x]C iwx 0Ug[0lb%z2ul5b7Pf ]CQ'nRb1xsr~sx3T݄ꐉEѡ6:B!Sts 6R< ȼ^[4v 1u[Q]Kp>7ysa9 ۘS78L&]|x@7>RŘnZѻn$Nςqij^<*B_ZF]Uxt ώ|Ms f0`n\|=O77m k{GzW'볷 a׊-,%]~%vc >=DEm>[;B0uLì-X+@ {V[Kc B52G`B۔aK|=TľŢg_,\\DD[ӧ"opʾUɫwc^J! iU^ +D@`hx Ȁa`6s 걼Mmg?QbduxK:T" }=Sk4vin ྱ Joy(͠l (6 U_a dҋ \17*WpRT$eK ҆Ws9Ю&HƩIla\D4ZF diУ$wHϯ`ޜ}8{{}rn|rbW./κHmPߑF|ФpZthuy-Wh7PC/_ 8ADeyZ X,GlTpA!i ݝu cd0'\;~\G,`"(W< R0 <뱲$m DѠ^>[7Ɉ / Io3Pk:龭˽6:]89~)2 %¹ {o/ޜ:;8>|vlyKYtNZm KFQ`q X.I$7z~'Xjvp䴁 6ͷnC?: )r$^fw]Kqdf*\ӸfP~҉!a#4~bFSZ(m}:4W]^u0m  b4͎Zez0#>ba V~{+H{#0x`aVM}_0h1f(!{g*d[guS+lcAb*<⭂qY/V 9"eٕI#N3H== !lb{3YG*@!ws]l14Bq~WA6yj) ^Z(G֙Emũ],?gK1ŭ-C35AIyW&4IԀ益e {#޲%-@;-ſ oۯ(ɨR >#ĎVaʿO0 .gRc`0`!E\72wdYgigZ!Vs"u yzpZIov1U)a AH5۷*۵ZMkNenП?--6{*8ټ5TW=a`UGI~xA‚{֔螻7me*"GީZ ^t ~*%E]6[E ΐ>]3:yxd] ّz0U7=ʈ&e1XITc<)̖vullV329,Ā ώAΠv ל F-қԢ+kWFIWFQTD'PD Gi>/PO_н[p"u15%99!L3wr^C{? p!CVx2>prq}~ -HNDŲ*HmSۧTYJǩ lVSwa`3mG 21$g=kSk7.#g|n^S3_Y@4T@4.4E !j /'Hmzk׿a §Q@K6ֶ38{3[* O(5|L-Vmճ6?y NsԷ ANgk'Hb:Z }g .Oosw1>2H* }nO^L~kدDL.l8EhfϜFeB+@&'W8k^~Z vc `0tE0LsL!%a|T99s:OFd74n 8d.OƧg>|p WNޞ݌'EqT1H-MQLT"1e.VC?af¶*,hܧwNzrqmQJ\ n@-6ϰ .o@d R]? cێC^a,8= \=7e)B(3a ҭ9~!֡tˏER7ne$^vcN"oeч_h?8VY?A8íZmE>z(;zEfxh\CUlfH 0*^4t^,ed oE4",oT ݙ1y2?2 cEHp&^ <'-Iy%_M7#@"$!0^@&Aﰬ<&-\uZgd7wHM Ebvz5Eӝnek*uyT)K }7dK\AS'|ݑ= <" ߾q! "ƀH{}(mǹ3Rb)v^ު@TՏyښ*@^7;}5wc,zJsLGH̏#}dA@C†ߢ[ZRhݣCw#Zw U#@Fv޳!ME=rǔ=6:1*ΓSnE4i'll#b; Y99/Ƨ7#,q,7 cU*e0݋iwseh[/# ۈ̝z`݁陴% :7 f)$X{uw&|l^ݣ1t&0$X@>6`x=dQވR؂:7;WR_hxa-=%XbcA<?=9duh:ZD+Q~mOH'tȈܜS[u_HEP!E)K7'vp̂W1ǔ9Jv}AŵjA=y+L7U+ŔZ&A( [08s\m:#hѪN"N:8`ɂi"w\8ݏF FF3<_^] .L'FbZ+۲̺bK Q߀u%Г!"dE@[@@twY{1@]y}?[R xYj hpԢ…Ƕy%)T GgG$xk >>IQ䉽}a/T!gcû*B/yy2߈M3neo#T)8 j[R1 XpcR`®EK\D$z:|K 9J5 oPAuw+t~s[Ӵpͫ ?(Ht{CKWKޮM# ΉQՕ Ek^`;2]zX-&j 越}`2'@+cp d$u9=3eWƀ;6xaZbJ;},"r ioq~&nfy`'0d +!Twr4IQzcoYvjg,'41-I @TChYSs:뒞-V :H m$]aX8a|=ȲMԞTWێ~!AxT@ p٥ӛ+16d{Fo(/`׎ʵNU13rIX2AjD %OFg`J x2B-ѕ~Fvngt)wO«Q^ʢ+>ְ6v8 uc!;Aa k:.ޮ1G @mP f7o6 Ѡ*Zo qZc]iC LO(bt_px\AN~6f {3}.^_|~vzt57ǯ+ٌTk6㵰<3Hck1,*9uk6;? =%2\: ӌ?cǰ.\.,A: f윟!uNL d1j|\yo ɒH1B.qmc c%0^LW..N`^?]_V@}/?jRBy* !3]V-ᕬ6?|LY&cXjtZv<__˵[[iCS`ֽK1[j4@ESӤ c=3mP3ߴ*cdLCh})Qȃ0NV!ipUWĽә)- 2($gҘ tohVD- +j@OB!V0EXmɠR.aVf:xͰʹl'GZE^Ejњ@ dС$N,P|118騦TB'_W FSĆdgIf' y荌bzȄc^J|ti}s䭎pBp"@voLM kTࣜ:Xph_B! ꐺ6/K6W%P_5pz|&Hd1t6FT0Q6 BS/OUBwQMQ=#oTUmmk辙a j:ݭzcM@OuU 0#f{+4q{Xnj6 RM_ gsY`耛tR$|G G/6le v'ݿ:|cb3&y=`ĪQWǴizOG947u(ڴw,9=pvC!1 bJI/ޝRjvE|I~s <㪴E?. }נZhN; @E⧡ 8 *`-^[/ӞׯA?!qݧt/IU׳ !TGGɓCЄ3E{~ih_ʩi%G/@=uZO_4;>J_xyzl!=;1,ў=8"̫aJ2Ӎׅ#.ʻHD*l=`7}πg9F<nj\ %ow8 {t%YO8c?|I}ѲG?=Sϟ"]DzgaEe4sżXT{{e~}]]W7Xڮ ՝2+'"KW=MZf|qR`}*V- 8c|Nxiښ*EFNO?A&_ gȮ@5˴"lX-`g!hwF̍_OēO{/T4,U2>J#ag7<]U@t fl<]t_b:^I%߽v]X/lGcP 3/,gI$饡VcϢUu/$=ǽ^| )ny|݉nˬXF{j~Г>B|~ף~S"5Y%2دGA"I>'L_b4Xd)^ͳ×ߧrHV yyC?i=.bɋzՙGse-$6|'3_/6kZ ƫəE%@gϕ5< ]#|3TFUpсx!w /)<H02|Eup.|{ 5J@%'aȣ8h_n~V ړB/ϕ_~Iaʶy*.Ơd\L.Bf|-e\2OSyyw98b~DQ0xt dgr;] VOg L4?zEw$ H]8t >9>TD(sQg Ur-$,W=+Aȷ"lX4ICOAjXٳ1a<]_V䔮^d9ah\<ޝ/ٕ- o.N}HR> 2޷cw%_m-G!x_9uFC Ų%}X#QY|vC]-|IۯMow7`/̈b)d0~oQ]?;3FA1g7d*纭 `V9yIrH__ngNR_m3hx%ܛF⹂勎܃a=^LgNwQk@ k^2peZwC3ㆅϞLK߼_ #Z{YcSn8*6Gh[EQx~.fP;ܭ{Q}Hs`W=ž U-w]2k) lߜ? . 9~dBTe (M;4VzӠ|* o|6FQ_ӓˏ'sH3Yޞ_?nKGdeh; ڏTW)iyLѴ?#?yGg(gt2A-ڋX-RJʸjS!x"*_+UM<::ǩ=:$MeRP^2,g|s9!ȵ"SV2CoO _G&FGmY{ctsS)ƄL Z7MOiYȗNW%u9ߏT}\bZf;_uU|[gb3F8Nw3t<,0t(L8T6iwR׆oƿMN^Wz|bicBp~rm954d*lR)?p4HiLV@F/$Lj"Vfy~Rb{ӥrީF붅q@qy<_:1u[{|s xa#]M؍z*(M.a)~TڏIW@ J2["&|hW @Wu6Ai ʪO,NŲyɛn4.Fm=o{%EQA# ?2.&&fl],Q2a^ L6lh`eWK Q䁊#܃Dqz tc@!^roa&a@=9o[aOD>*ؑw:=-EtnrH!\`z35Oe#,HWA"?ey=-T| CSՔj);P°ϭvX3 ac, Nӭ_ 9,s"N1DaR-6Oo?Q[,HqZoUnCzw:N#DuvGQQ:73}G EgH /dӯNx Cx~w(Q,8a2`.ݖzGɔf҇@QKM&3uwgmyI,bzd9>`VIbQ$QiS[Q6eZsK (H @+y 9xT\'4ZaV l;Q)eY8է9Z"kҮ'x җ%m06 G6,*lU+ʬMloot|uu9 ⤘sөKp4ߢb ML714~}P|c52ԯ7Qhۥ̃b1WїIV{*tUIˢid-~6GZbjFJ眡vHslAlfx}҇*:)V0S;@Ѩ,DB!սܗF8TЭ:0?*)E,35a%ޠB/x|o VkMn524ZQ,AyE9ޤMutwZǣ[iЪ{Xb:0 -2*"W#IISJ]i@DV +};Iv?EdRCDƹ0W~B1tCB4)Tt6yu4E&ch΢GThTW٤A>!X%U)Gi /N ؀/!%w~ؕhi7 696 B6(  hP<"GDfEiJSt+ _zwdD7] B^h B fydb'γpE0XӍ`c%Q`tjP`g,ϋGr%Vb-ZvO)\o4 砫 : tXJ 2I˷|T@ 3#q|tu<Ȧc{mk %do4mWRhEX$QOyc2 =0u@ (bhv8HwJϾ*tWm;]7]6UgRuj9f]L`^WOO 'i`z)XשE[?Pwv{bYjؤ3f8; J[T`3O0.1 ]鲴. 2xq̺ gyqmoP (ݴSF/v).TܥFQ( ?φC۩z-S:a"D<6nU𧖣Ƀ$&e-ܖsiŰ5F Ԛ^gGb_;zi`1Z_ &mtF'ߟV2kB^D=bj-ъ >;T@ScęܹUp" _P_^_.Hf/~2lbpZ >GzɧyCP%̴!^ꛫ2Dbh.5se#]k8[ƾWdC\9߷O aquIDF_= , 1fG Qlyg*˾$Hiѫ)vZ3 !r  RtTSV6GS$2NBfTwgNᴛ{@ GKR'C(zA=òkEr`.=Z6JvfpST.o|ܹ 8ͤ> p0u !I:|Al˦2C3\}trLmkݷ*cnAӢd0%*n]}WIgPFP󓹙#ngJn&Z7K>y$q&if\,x*x0HN&bycms;"تmL?2aD..8ƭ !00/^>7}*o[ f\lڦvADL՞2(6ezrwp%6D!Wvu0Go97e'B#}-*)6b˜b6={m/*[ bqIdNKQ$Pn ?X&@C<9T"#j){bnnqkX񈴡i}&$xp0 V^oR„A!V6^/jfx)]w> ߁}䑨!YKJY c8RNV^tϞ.sþAB/nDU -W9p(&OI]g*C:C]%M@{Fh~I"d {Um6HHaȇZ Խ YHpjA}p]ʧ4TW(eR ܗ2㷙`pxDŽY&R:1dybѫ"nl:dײn9n'薌D3J O 8L,=Frd(":nd'druprvTdɴj=}ϐXIe I c#G5z=Z˙-X~F2iV,5EᭌZzZW+ MpP]T("W>ؤX_ZbL67r&ǎ'n9Q,jXwO"F"Jl  34-lhHfZrGmB*m}0@/x3[w*Ɯni_nZDOG&maqڰYmFՄj=D#8HE;q|"axx2DE)/Eg\9˖Na ,$W4T+*w38,yw\7)l}u3@nXd^Ǧ+HI+hLvwTc0ɶ )`J'f(`14\'׻ lu1t8z@wC+Qd3C88䘰ׂ籒h^mO(7_m#G# yJfU/̥SN)3Ѡ%/KRͿ//`a}0!2N>j=|<ǜXuGVpz8*әJ!HQc)ZLl}_$w: )Ͳƫ^'J= X-[*خj?6 Ь :]Bgt G8g)Y.A Sෞ H4ℙnCȨDB+vE̷55bW` ƞ[Dz1!oCm>pf<5n#8XIiCQ :N]04k9p>J"zͺDƟHqB100)Eg!V+:#J] ]Qc sO'-)$C:?5Z%8 Sx <޿Ǐa| ؔȵba2]x۰06erqE :&:*!i: W@4g>*94sHx"6:V}rgB**iWVM!_sv+\ioD#*"DzGgT#F /VӝFDV0 %* =!C)/:LӅO!M^Z)N} Nu;SR,gÕr8?!FpksKNp+L璈 L/8 xU19&a;0M"xnR,jGa DM&hz H2-u20ɪЛ .3sd%cZfX >INXvaB΄^ɉg QEM b}-  Fֈa8)&c8vsmq:bÔq? Z7'l#K44!MGp +n R u3LM1L͑N܂cEImw(Vo0|9l6]d;Su,R[(H GS 3UN;*ػ'lS<9AJʲVp^$Y{yCI1ԥPb%2k`?r@`̵bRZfpT xĕh<-ѱ}CٔU"I\R$S̵xF|("R Y _.WZ/UUXt'm'МcK Njf؄~h'׸T{Aj8.Z m3F;n4fuyHnDUpӎA/aU(@߆&EZME71JiUM:IƻOxꉩ2@pC4wS`h~BuMD*R2)]3K!\f=5,JמumlN 4, v-P/Lq8Sf]a=")(1$usg-w2Kar[5^;vQ7o*䊮ݙ |( 1,5J3tp}OAOezɨQ-3b3x>1`xsXdtZཫ |[® 0p.]H8>M4m'| .NPcrlH- IQf0:F78ўJBX6KjM8H}e„AK[yfOj&(cXю%EDD]2x'] " J&`"UO(a4i^WBy[HHH:܋&H]gFeXlFtM/+grg|Z}ѐIhZ^!W2#Jz e4I7~`U>0+`єo)-D˼蛘T쁡{;h|)j2 Plbt+p۫XvdRKcp*q ߵ%*dE)f}\vd*h":W`AZ>gDk|c¬ S:GQaAV,E˰?Ll+ǿ%Y(0^GɗJs\{aJkP YIٱLE,r+*%|dQýRnhIɨ )\/ձvuiJqjjQ?FNuiWhP U5~&y.kGU73s0:<@'>LŚ-*/(dxW㕨Vl"Ic*QzfkJ?+bgy.ӋBcGҤ*N1u2<Ɲ̻Crd0ei$ͲM 1-ˆӷH54xY>ZTOg=@?20ϧ`1̟v?0zC"U[zQ13##vşI~Vz/g9 KLQ(x$=q!`NQG;# `n\H҆bB .Tօm(q%+B?tٲrʆ.+ERPUN*Q.+:s$[P8w_;p6躵pm-ܐ`e֖t}a~[ծ?k}jZW 5iPsgޯPFraIim³da[zgkYfKs&u焷w*7fhUB$lIrt'Y7@Nӝ^9߽|v*~l|:SHǣfb kAd aoDDz A5. s#4J? ۨ7ߡ־nj4'-:/عqPJ(*dɜ q3hWL) CM3g:UKK81JU#_gg1CrZ7 ̀rr=,7tT8eG&*alz)o1j R6$DW{%t܃X=RXm wͥ$zj&427A'[Pޟgw3DEWڼZ`[@6vcX&LІpZK . ,44  Lp Gϰ<'*kk3%DGG7[Y l#I'| 1]-GYF9S$VoiK407W&%r7Nd(AT兀0ay=#b? wJ*m೎ށ1$@,lK:H{HnɶE(]`|^Co,UW4 b??I6cp$`B$JTihγuPIHF* Zy(q~׺ݤ6P+*y ôR0Zjdz'uS7ϊ,^*&3=s##X_٫k|GSzօӕިP3籌&C"$ 00ɓ;yfXǣ'8{^,8q.5})(hwLxEm, (B&}#BQ:.UM;C|-7(m4FJ [U o<ƟuΑ;<\åo+&R]B޷M@AlSo DWO@T/PeY{<(Ytơ ˷asjeqZXҫ%"hQF,nV!h~*LX- 9ꎴBe ]9)Ps,b5XtZk(b96fkOy?`EۀqIZ3~mwQԥu#eB,&_)'7K¢c>}o1 Pd>eʹQW( r| oC|ĊmNh2xv 16 &>s09h+̱ {X-Tj0{4vEodP=w)SPؽ.|3m톝O.ǯOnNƯ>AG\Ek7Vc]313E(r]xoMF.<dN :`5 2pfH+7:иq rQ A;77ND툣PCdT/ÇS)ʹAKT-C˷D &˷nѽ.Us0E'jb=I\LuZ&; n"*B` z)1d {^BKAG[㾐C][Chx#F8j9`:L.#,8 :vfB=Nӓ[ٻdn1pfmqhcO2\ne2݈Eeejugl EiD/EO& XS:1$j[7ƂU;A#)鹃—ƫ&s)*c|pbg˘YWY4 hԁ,3QKU=L[XX0‌tY= k ҞiI,kS3,ȇ>$كS/Ḯgh Ӱ9d73:4uҼqln0ѫZ :|!W_u ,wQja%ez7u% 6~؇r;mxkB3~J iu)jN"85Tnv<~l&}Pnh`ވJ2FIVJB;^K -2 J ]_4pyZ$K̚o aѵxC-t_3qN;r% g8?v-ޘ"#@16@&3$81O2,˝~{uVUB6ƀhG+h}drK2^\=I$+Qٵѳ Y acDFF?m$.dfD66h,,Ic`|$ia:ķ٪AG}SPYS I"~#lCػ`fXtЎG>QJܔ6N%I9AB\DQpb6^JYS5'?@,,Ұqv! s/I5j` Daco2@ryrHp!y,/=B8vt~1"KWՏЉ8KL19+=+}h͇LQCOeNR b*=7“;b In%U&ݥhY9ȀR݌mG6xr1t>XOCvN(>~w@BT:s3RCB&{hKmc(CP gC qv:^e9mk]3ZJ\l`d]Y֍1zKA09v^s<'DnQxAclMML0t" lф & 6ALLtGQ00?p%7 tv4&8)(]q'u'b{^4"P.  [0F "!Y>LT6nH#b:8It7QP{dx-7A6|"tRtl)*֐lg]c~FϬk"ʺdmzђ+[Vx*>uBnjSfq}2pQ k:2n v6*H<90.\tf=7@k/&ji<=F#FU@'|FPݲ(k66o c~]61ْGc>1|Svo IBt[J,h^@ z8/0o<W- hQiU:5:9.>U~<ky/-1u5HRy+Tp@3XG8-5q&"tqR`.&!s͸J g&dl765pV#Z5<:8,c@7ٓj)kfX.❴&lLeg<Vc\WƩ6Q>%*9Ib΄lȗ0! #flcȫ48΄k*7j,nn9`:P %*aRa􅾶cw'Y1hDƺ0%)ikGyz.bm֭طe"[HW1iriioz(RsmϢ #E]h!& dȾ5ojgV:1t9|ZSUqX ߧ"[En҄Ъ}m!5`@:[+0N4Ә"? L 2M}nGz ]Nϴ؝gvGr88OẃHHE $+g`_e^`./U$HBgo$" Tf |"PA(nzޏ@&ChR>}Jgn,1]N,IlTP"˄W~H]/M(5: d8.̿> `Ow><3{'k-Hp%A4$մ+tD[&8}麌? ;Uϗ밗UlVh48y輚-Oݗ9GR8oYaVY-`gju>Aan7Fδ |nHs?!ً9kk:0J2uI050cF| MĉRfU09<] =6hҥzߔ|Z^ 59P8ı>GA^ZQ=m*Rꦄ%a@=^UIwlkFĺ?53i¿l[ b囔:HefACzacS]NȴdGq35fyg*l\`9bW:>/?r^v+%2Ћ;x-c+<ۜ^ն|m9֛<[d$P%p2*I1q6p ѡ0ᗻwOXhE&mbTy0Aځ%|%&Ҩ4Y>/U{exc`={uD49S- <=O\ vZnyP1\vw7Nb'˻?שpEH6JјXD\6IJ+:fW$?6@U#:^jDe ۝, X-":..6XcGQsVJezr lu|Q/wcSUh.\kE.k= vqoXYn!~j~;?g#UCFúyއu"w,$g P - M /z*Ie`v d6. Dnh xdiWij UdBVj\i(<mkH>v^wiP 5T1~_1ΰ,pRM7Qt3Ŷl}UkM嶕￐v~4}ENGӳy~^MRE|.'.8U6,:p]`f>$;ɭr!,]˟S1Mܹ:;e[d ItӫJ]_ txĸ@E2*B\00jq9ހML3n#"M-uyUEҐwu%0bH'%T(Maz|O2SSUq%'Q7IE^v;C*~DpĂ4]j:̀9=$QF ن';9-M_zLMaqeo6?J a@{M/"=ղ5nk;j#rmVn]%{=0^$.Ad >JMדڀNrgV0*vQRBE+=Pz塥]j{ŀPR?F&_D:jxR?Po}k"UFFK9x"6ZW XD !d˩ ew@nxE**|buJ[t +j@A7%;ҒoO oQ ~ygO XnUjaԬ=4_Te娅چM*t*u :nyTVL~+bM5).LN x |&JәMCG @Qj҂-xm![$*V)I[@"@ ]ա0pŖ `\n_#z= z܂#8pt.Y5<жz!uZĻWE~D/a=(t0\s&FJa~%RRшCӫ2(K^J* 0Ψ|/VH$~MlhSO *FؐOlel)lv@nultmMy|$viElҴ/CRc"w5o e^3J*E3E tԱS.̻dKe^w md/̑"$l:Lm{'8qf[7Ymz-6?8/'դ0&e튃ٗʍtN6KBUB(W3b= ;JmftsBJ옛($A/0  c8~L˟Xo@x؂Y` h4S+3ϭӠK%ثUC'bkΤ $pxl$CZ8}Oimtl.\2>+Uځl%j57xtt I9 ]DOl~u2Deb/<7͌ͣ9/#+,rj|>ahݳ.s6HW 5X+C-'TطsGr8l%ʻruejԬ}C紐 7 @lt ̊)ÅmG3j 1ՠ$#% ͌b:-toD|eU"Oښ\>l!3|^\펙IU`Mhʸ;+V$ T8?W,@ܨ/hAu>A,CŸ X\x,/ n.VM6W|v:j3XᘗsnN, 0Ԫ?4Uڬ7j+#}#îHT ylCӗĊra.ɮ7m{ 32pG3( 4-$ uUS>R"pT9Ɯ@D9Cv8k?djLKnpC9hsυnJxvl[z_=K4ܛ~7 m5iﱸ\>x" N\!IC0J8?rDUdHzĂ Fe<IǦ0+6iDCuVa?-6d7dh'`5}Л2nj7ɎJ*\n0j>~ݜEq{r}1X7IǤ吴|ksm3oiR`8,@DHO/$NO/7Vgm+i9,e`#F};n&xئ  a`R/ RԖZE3;7c$syͻD|\HM=U}4?dU!c}ɗF~ j3hi0۲Y>k6HpeC!Xa{{R-煦;nˡ4|xu;%q>RoBL)nHʆˡ47b@@Mt[o›i\ e8ml0$ʈgiVh8WEN8odWbL#6jPcs't<I ĤankJ,3@|,@ڨt' 3H['eC5ׯhϠw=ǟ8n,69"F`g}vUTP~osT'LtL&8Cziqsf-mp󟫟2vRIoRo.{Pp= J93Xb@`E@9gts;)Gi?'U7yPg3b_w{}MOVW>Ruq\&o ND{<f%12&`꘧'p8DͧSXWeSHN.g!Ywu Rx~U~9kd0'?9wb*] sXL*>YV0T:3džgtW02&rd\U=SG-Lt+ΘODoOӋGN7o~PKY~7CPK&S9 __MACOSX/darwin-perl-deps/IO/Socket/SSL/._PublicSuffix.pmUT 0V6aM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK&SX' darwin-perl-deps/IO/Socket/SSL/Utils.pmUT 0V6aM1cL1cux +ƜMeyex- ˎ``ۗ@6Vߖl L̲=hg)nLڠC .&i2χC=`,,m PIA\ZUC &D[ztم2FF5nFYOg_37?I㔱+Cyl>٪)qpɹW$&U&,U`_I[UPl|uGv$+/U"@"gAf6V88w'SghwǢ%~yh~!z!U+w(G{k !s,!lӨt ПW#zYS̓#~5@.AJROcF(d~x?r(nIc3v/"էa6( (ޏ cD73$|@(e ~{3>k^ErJ~f#_AǓ"`/dL1cpL,rlGM)$̕`+ߩduV>)`yl+2n4}maŒe)L1P eEA=8e2n!J#[5Rhoo-]O}= _04-*w$5Wx*+P,GAf/=Rkv,8a!gjA 8?% UPY҅t3Iq*S'Q^a,W;AP+Ծd6 e^Ѥ a$ᄄ2C$ Bn ս*3K‰ /ұK,h­֫<w ֑a\5"JdPK?B Dë`Aaޠ@;Jd4i%8C TXakmkyF?mmnGwjsg)Fʪx_CpgA#;'o&JXDimW]ԟh+7noNΙ5ζ`'ha!ۿs.(5iF棭% @k 8HAI4^"=ExVC>=*u A2-5#s=ib劌 ;ĥŒJkwwX/ ihy:@l{v$xBE0zRĄ.3]|:?-Bva Y  U+7Z4 7]mA{$B%Db -]I:ÚKH"m={UT:!Dp~^[QJ)uzIt[!+hAB '{'bj^d$#HT>W/aw&9;/ZMT~(`]# }I겝-j XTH'ޅ.RZ@4!N@뫼ElT T*Xl0_da}l_eMXT p f2qc*xq wAF~0IhϜuj2cO&AwA@!w:cW$,p>7^0̅SVk X*OOBQfrS]-hU{gt  F'U4@`X5N0Fgd9i@6f*ϰC9LL6ncLĥ9[vcL9t`uI5!TPd,"ӧIH Mq YQIH*mQW$[2pf&L׾o[nh.Zq4B\A'[w@.dQ0X)FGyN%e3A;EMO$|S]3h,ZmWqaXML:}1(Yzbǚq'O_Uqkm $,Ec]G2"=wp2*Wt;Pv'G{Uĕx #'q>YuR%+*32`V&%eC}j5HJTRRQ 6\3-afxA%DRA N l +)$z{I5i~F[OJWdAo O-EK12?NL h we;xa|a]xh `؆8nQtE,%jHcfrтOWI5b{J> 2tٳޣN}sOWASNM؎Κ]ɱ]sZ.F؊Bq",TV[\"XZBClB{:޺ODa"H+EX[9JRBMJ\z>?X -SE4ө# ĐU}eJ4)ǽ 7m#7yy2MLL|}Hnğ4rJ.Ul&!QW.ZJs;-] QtJui-nƔ+ET.HP}30gXx螄|`F dp;+- 1d;*(EX׬PX/f7ߘ] ir=du%LT4OgTc)ݯ[쀔73XPkr7f u~!I% %w9ng >LmlJHĊ|e9%CYKX (;1B CE oeYAdtKǻ1 Lxn`eo?g~(<Mb>ߊPAx%: 83Z R؏D!Ɂh6ͷ\|M6juU:et+W{WIʭWI;`~JgRC3hh u๲ <)?23pB$5OjwJ\J -J,ٷ۸FN Ę&D㬍QaEo?Ty1ٿ*R2DB#uk߁fd켾j-iشZTuGRFsM&rV9D[=&R,5[6mpyWjb`HAw쌥?l ,;N^%&?ņ'b@EYL#)tiSǿm[7v*Z!4 ꫵvّɭ9 xm:U1- 'a޴8򸞨6Ki1dx{"~*:m9KoEgc~I&2JyY/وW bO&sέ a]FɺUS\!šZ貋&;œ CyM΃o1 ƷW\uKpbiN r:w=;<;w1ؕi4*¢_q1 C}:\G%j-c]I<4r*_5c:d7V=^xr-Iu]dN6aS0<鵔2WaH`9h"s=YukJ3钃5$>ѸRI7^t)PmM{-MÝ70Ho[xgB=w.Ҭj6/%('tf\.:ZDTHNK$h: Scܦz%qX @rv.YAlҷG"ECww6b'9f01Rr2.>Nl7M] `ICOU8AW8=֓^YC޲E'PZ"cѠ;Vf[ko@]Mb}h@tqIuۊC7ȶ!C3=Rj'd.|8Ŗ`!p !`[] H8$sjZ&-䉦EÀihI L4*Q >$)Eq H8BJ'ܟ:0S'j̮ qYJ9Ebl4|'`n}y|;_]/<,Oxx tL{W?YЬ&Vi,mY &X7M[9tXCPSHX,Ȕ u,fA=@rJ`Qa28usf L,/vc9$7Oj V|c ۶)d0X׾2$T`BOvjTbF tFېQj1L2o]8ǍaSʒ1vY2)+]tր|״נ?`)j~5还7>{`/FhDWAz&P!{縻\_ޑOf%o_~eeui_`AҖIY PA #aðkyzY{h_<0Q@*΄?E:^S Ce-zԓ.v 8YӤsE2!tٳ=%3XQRHC9mrvEItB"eʼn3:`B1a΁cX+y&.*ZT@=_s,3:1dɡ;+8pSr6l)va~1RdA§yp֬wΌ%Fl~|yV2}O v+o6Qf[4]{ ZG0SZse!`) ЪY&N=ՒQ3:FB I<|m0ff)@PC<1!ٌH-dtٓgAӹN̡Aw0YG<}ҏ:\>G?pJъ5?1e{C>x6W1> V#- .lLmN8UcBY{}ծo.zThbBǕh%6DQnB`Lvǘ]Q%U Zt%R9 \J1o #Ī;xꐃ1Uϱ"q+^=w>J#'A*i}E `Z@ /$IKV.7]\y%ꅮq損Kn!ʺu!j4%,X}Ta>3 .%0{ vi:k5(v5VB.ӳe_ZPm ϬtP(_TCbyuv l꿖3XO!U ZDۈخs3|R]˫aσS= e/  "A,NAc1ĭ=Wt!Q>FŔ'SʂYX~Y@G5Lz(>N&q0; PKZ=XPK&S2 __MACOSX/darwin-perl-deps/IO/Socket/SSL/._Utils.pmUT 0V6aM1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U) darwin-perl-deps/XML/SAX/PurePerl/Reader/UT 1cp1cL1cux PKq:U3 __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._ReaderUT 1cp1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN N. darwin-perl-deps/XML/SAX/PurePerl/Exception.pmUT ]M1cL1cux UN0}W !+Q1U Ub/HVnk] 7qkU<3d4;9; WgQt*ƥc*y?t^\;RQPdqa/$ہ<w,} eo.ILQ\a%}o2־,QjyZ))IB~}$-J)`j`:q|4РR$46%EF LS4[[[伜r6uz7z'gLЍ`q9,>M΍j’'UٛheTۆCln!DoU]Ku+:~oљEy>< 16C<>mS^W7: y##*7.$dFͼ^3;mRe+]qu N[6;Ϸ"5$YJIE!s3 c*etZ-j SPK&PKN N9 __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._Exception.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN Nt1 darwin-perl-deps/XML/SAX/PurePerl/NoUnicodeExt.pmUT ]M1cL1cux _k0笠2Z!UjA|(|p"Int[ɹs6~%V(Zϳ(JDeRb/8~y;W a) :A 0OIg(,!ƚ$^Yi6V펒1wpd#_ \s/Em_=މ =^]T]PKa3tPKN N< __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._NoUnicodeExt.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN N`B- darwin-perl-deps/XML/SAX/PurePerl/DTDDecls.pmUT ]M1cL1cux [ms۸ DrB6>籔67VNCK1E*$ص IIȑ;Q/.vpGkk3gxbAw.õyQ0>D+ Fa~~ׯ\g'l aOCk#썷z28_;l*<h_[NoLoxxN/ѝ;|1@-Ny[,(@:sAh:ʆ!gq Z&"L1Mށdӊ!ǡ0ce4d-ix8cPD.c1s\=kO ` M$5;`=f[o vj fak/O_EFscq½ǣAWNŧCEhxC܀wT\2 v;{uc蘳$H=GD 8jqLTQK"oar?a8O6 eNӻݏ6YwZ)˶%$$'{F 4Sqk^W| t3 1F$/gεxppl" tւbA_5,dmXg72C~,<bA Yt&N̙Ͱb}0ϴM=n#T[5e7tv+oXTZQ n$ؽrnmDYxj4Qq˗4P>_W+:s‘;?0|ƣ4bHBsl Ox(`}l,&zTd0<ՖDş]YZ[\w:H/swQdELl :2lCTֻ}P4% e1;X0ڤn@AST,"nز(~VsS5@an? F0?Džje-TcY!J\IT1ӕ*$ԐٮtЇ>:θ$%/RiWBtYD5˂*kb (HxɲȲ'ƗFe-#Ly~/Bq^%p+Ia D)mGb?I]6C/dZ@_sxwxI&%%uQ0^{w /g**W,&gJRJ1 i{n7W۷TBϯO{UoWc m Mz^Ԕ +fuPu/m%*)mpx|b{?FSOI+[DWi/RsߕԘWH0@S&Nb}-Ycޥ.7Z.a;~ lz"k@c/ ì  SܣLh솘v]7ҁ%K9W)`%'@!r&߉•嵐so#ҏT-cukrto% zC1V[HkGg`;{'6pVgJ[ۯn~j}:YV[WoE/Iua6 !S62;AL5*$WBLt.{eq5!@iWT|NaѣQ" (inT+Ͱg!jB#JKE2UWBM.uFDS6v૶ߍPb+TR[ aivf1QzL/kG@{1D8 傈6x w+U{\GU9RZW2)PV牉*zUANpCK%tXj.smʹw"kIuyPkIN=;M+|nM:$/D4LxZ^D2Y;]S%/|؇QԧSZEdm_mpǧl!>qOaИ:2Btt$J% ].Ozp=P="Eqߨݓܜӳ%`Y&Ԙ_^$-V"#%*K#oCfe+1oLYBcr²tg.VYK5Kn3xw$q_ʭ9cɟ8)Vm3i7\}H'zkJEZIΜjR1kQBɊߏ!G:%IBTҔm}eWR'ʟ%>?_@(HzٝxPz TL0t)9./PK6:oZ `BPKN N8 __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._DTDDecls.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN N= , darwin-perl-deps/XML/SAX/PurePerl/XMLDecl.pmUT ]M1cL1cux mo0SY&uh0@ $1&u $ \lg[9ۺeFښ=ڄ ۧv[}J8bcj&=BrS Ԁ_a2l/E(CxoiiGL3_l`/̭IxB|C!zD&J^a)`74&Sa9fq,|4=7oxҿ:5*AYAe8;قj94ոV~, e2+L2H $^h9r]*BØi a VXD3PNKJ!ӂGZOwE5Yy2TN&BjB]^/u:eo/jm[EYi# AOQrߌ M q/Ngu*;Zرp~wWa.DžiwY&s/-wN ^ z^rl4W]VjVo)V*BPkFj oϡUlVio`+IcLHXuO큽Xod9_aPKNg= PKN N7 __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._XMLDecl.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN ND 3 darwin-perl-deps/XML/SAX/PurePerl/EncodingDetect.pmUT ]M1cL1cux Vo@MIYIk1[&ݚtMΜtdqt6Kh:gu${=rUP(Ʀ7Ӽޘey؁*|!yD EIDEI1"cg)SfPSOʑ>:2IEcN~ 0Ƹx ʫ}&}`<%||OOp P**Xks?q4 Ѳ # 9zQ<ʟ\q>К Cߋ JCD0 ˙cӍFs76-2u ve+c jPZ, !Q) NcirXک"e\P5,"ANPmFMz1Ms-Ug*<%yy;_?ySz윢Kѻ{+o%{wuTPl8?7ϱ^̔ ?j눍CSOsK0y_Kgu( :PK.D PKN N> __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._EncodingDetect.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN NW1 darwin-perl-deps/XML/SAX/PurePerl/DebugHandler.pmUT ]M1cL1cux N0VZLnS jmEsZsvPwIFrr|8J)+w#/Z1apDObGic>4hw1=9E{+CP#Lsj Q~}Op|NlDW>#tMNI? t[b'$ns(??[Ҟ̲1`$ĪdNoC "E6Nw,nl%"v+(kf@۽Rb\W>XM% 6*7ߕ+M7q^AtM++Ir\$}a,Vd>ʼn <ŃpFl:vVĊ(i,=2H19Wˉejq>,>^XršZŋ.2! 5I'g {.w # lڼr ~hu5ZU%> q01 @opv?vgب=$͒Q/HUlǻO#?{i>YQY:FV_*Y0r#[7rGU3(RɯJ3ѕ teA@<ϤFq0f+W\loOR]=COu^Res+O\< /yBur PbaKޖӊ0|P<$#1 p$Y>уI%Z~;u nxq:ELF8'Aj\f792tP?~$ )sqA:ǑB3D&"5]?y(lQƬW_W5aF Ő\Jpu~OjaEBn۵DO]Adhw> I`!1]1 5Y`+'$"|vDzSB bV"i==O 4zXkqv?~^ť 4&U~s}X`8noSJ\crOf2_ Rq3>@wXgo`Y"LHDN/9hw=Qx61t!mȖoaAኯ5%rd}x|YG\PA耻")Aqi<"ϡ)N ߽%8HmF%ˉȹJDe5d{?ajV7?ZB<:-3S* (lOa(zc'S/9,NrU $LD˂#G5ċbGD&c*R FU^fe/ Dϕ7|3۴:O=7qY~Χ^o$z2>}h ɮ:AX5ڈDE>\@K^j 9ì7ÝI-xډ2iV<>?Cajoy'r']zn Q詙q%a _GT^e)_]Q*B ܖ]% .lJFP ̠d'86;TXssso]>l, xJn:F[̦٣Qv1m42gϳ񛳻2?U?=9 _'wewכ%H(CoՇۣLދ$X i G)1U_ΎO;gg!]v0dO(ۇ1.Ugz=y/?کeoe~xvׅɧ8`77~5aa64DU@=>6EivmlhH\B[UՆRR{t.r~-ryn r_ 8x|}sOvW ߟ$~U7Gocl'K0>Cb>O㧧ϣU<Ïq~ןF-W1Q1sGׅ9>! PD(lyQT5/uu#*j XO"[ ` (,Al@T^cX1[p-F=F5 +MbVǁAhK h#@un@s]_PXC^ m-$! "Q{#'s=#j*X4(i] "PC%ݚ@ ;¶ļ:FV5O-go0TPU⪪6j%檧8F@\|QHJa2ʔh[H0U#Kxˆ #:0Eeet t%$P s ꉊ:fHXb莄fuoav+x`jS3ڤ1P B 4`kĝ1) Ɛ0d!3 !U-Q1o,iP%0B&= (WQj(@Η3|)&9鈊g8,4 29,#ikf3"-Bc'Y"4HˤHt%Gԋ 袃.:K]tt#G<|)#<ʧik,9/h;lo^HxMͺK` Fsz,7Qy{\kCҬ.Km/6ŋ?v* 2ZzE)@xM  HfwE Su#:zaz= OdbKt{=vzŀ-/Yz%k!(PDX%$cK %.!BtCcRM-ر (0 qKq< J;9)1/99pJRݱ;ΐU>y\ WUQi%ρؽS|@V-+rTs5Z1o[10ohR@9ZF-6ڙ"Q38~Wf *:2xξ:qOuPmڹ`SELrw2(8v9k5ۻZ٦VH& ';$=TG-m0CogtBR2߯+ɫ§}^y&.{NJh@>*Ə]W `V9n iD•7?i?Eary췃jIm* -*`I6qE+YZVSu$%]䳦M% M1X0v܁HͶQϹiaj Zb6BJFwg- j^ҒH\y L8*)frc 3ʘm50D6UBE v~ڞt^ ULYܡI:~nE|I-V9[A3Q\˼632>0ExN7-%1}錮G2ohuye-5F*VW#Ҧˌxآ.^je% ڋ{]kwf5r܃wt_U,1PY11jG Eܩ->a+JK26Kб-:;LJGG.NFc6-{3roy ƭfUdai"T>gs*ܖvyKG-m:"h $|nXe"gF,9ғ:%`o0a`ڸc'X q7̍TUw_u 0"?dG e݃6>(ykreX҃5LDc]Ύ+Vض%|4nV,*YC}E %xh!1DhjK.^07̰j+g'ô߳ŁbvT%S{*fb2 [ԣ]!/& x|;ۧ7}tgPKuPK-SS __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable/._Process.pmUT Y?aN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKT*A darwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/Bzip2.pmUT LbN1cL1cux ZmsXSzIi) MQ6'T$hD4`gM۽gҿ#%Zd)k9_G˵do dDH<ʔx^;<{4͌,GKfS΍"4ΟNrO.^w=\fgϰF"^ǵã'^IVqeƣ-0v[şQ-L*(/XeZ$r4E eL Ijb EfFHNes1J@dJ4FɠU:Ly!sR4Ƒ/dê#う*#Z O/.AzqXeYcm !ץ,wr(tO"I{P?_}X )>v%UpO6 iyyuߋ8rALۺn?omuk߼nsѾ\^ \kR$7n*S1})}=]J,NG'P]^lqe(J45n̝խq"2&z=Q3ļu?ZQHݙ0h䚜>s42y K'Ff?sCbyvg\< Ȼy{ c#qټh{Ɣ/lީXt2}4 hlXeȰl'^Y͆KSj+rksrZՇ*KR3}{] ݝ(=50x8ժBYGuquď?nl;ٲ/6wD,;W!&憘f(f ҳXa`&)a[P`:aNYfLxx4fiM0 DMa!B4G ICEr/Lo fiW2 ֧$ r$=PPђԑ"% cq%3RxoU1푁#S=v Iѽ::<,`'Ck^U !S9,} y'E&\qL$NԷsH<:4氂!g{HDh`)CڳjF{~Zoh*3ȴcX!HXRfScIbm^(J7 BY@'hSeͤ1.*\xhLe,G]GadF_.յx>#ل.4Ǫ df&JFBƣ4Ҡ!/A7j1Gf<,[7[l,&s cx&zI{"|z4d Xz \>jj]SdsSܷF4O8A0ˇGP\VE~!͋8ʆYq$ )ؙ L(ȇ b[RBYD&9kQHq ott%3ф,ƕC)v^; Ex.2"ڕsQ&#beA3f3xgP{H?~~X8sCHK  d:[V_"Ckph-mГ!g+%qjWohu[ۋA!WEj%2)rn.@Rbd9R݂6EjA8ګy+6M|I9ߖbLziԶ[ki15-$X]_m2@MD;Q<{_q{I|o@lףlrG쎋8=AVk $2sQrYsagL~d]uFeш|Iܫ,*+z`T jxq䏉I Xׂ%g-RYA*[- ux@uw#(2D&mU~ KB%Xb`ؕ`l81X2yN MƇGXVZWETȵFTΚc8.C蠌s;)a,PZmd.@̪:Pϱ2zFN ~GT[o/JN1H/(A*馱JPr;+ϵ+\dlSl$>F #p&^ϊ]BRRِ6͜W,%Bۥ=Գ-hwWώ}GNSTD(V$xj25s蜌Na]+6#Y~L$1öolN&H5ASj\\œVXQfn+ăĆ䳥8QO]_W_,i,(7W#Z6+[LOLn7W{X@BJ_ ݭAre=3,K[}P>a 6.&PP!+kdOeRKt r^IKԗ7J7ۢ<,]p' וW`^ 8Ldyn)*bv^{MlŷuDndIJ7[+ߨ}#ne7MaT3*~e|mG-oyӝGRvqukfMd/@ف>V_x%X<΂}6Yg Dmv6{$ 6K?:T̙f?('|4& @[g$3m-{Tt $0܆& qx/'"+t?꽂#LxOӱ(Cn ف1A=gY[ o˛koζggmP"7ת)rtȻ{(_;g?. [t'vi[:dT)^~/Fq姚3z`r;v'iZ۝Wy(F{F[g#ylk(h$q,VȀ$vX/NOQdwZ' yz&/[K5XF؄w+PÜtM:㟞Q%qCX<b[=b_ϹVfo^1Np8I>{&eJ`=(uR}϶3C;pd>zBQqC<#ZdN?MN tĽfDon=`m̿({$M*p+|*>u j>mu9.Icq:VFdB%i0>)>QR{v#% hH{` @#}$A{l{7pYH +ǀz.+А.GE0I됴`=GV~xA e.Xs2oY6X<#_}^f@FOo`A|0# /c2S:[8@2a T5$r)?%鯲z; L%b| aMrjhݍj6|@Z_W% ƏΏJ4ذAwz?n` xe-~a*GGAxeW<>hb H'dz]܆[}t}uDw_9aU"D=0_$ki@ͷ){76(o͵dĽ8i_l1 M>~`[ذn__CWj|"_vKҰH|GlҧO dKCfBž2D8˝߷5‚Wkڲz8as$g୊mB+NW |þb?S cTXI1lhTKV"gk{;mߏh \ʆٗ_v} 㼴WU5"A VàYpRgeL]䁴ZXW̷֋OLg [I>9%-/Cn @R\TH%ޖE=|vQeebFVU)ېzCWp~0#%iÁ9l6i6:/>$Qό~ 0CqʨʛCI+1-dF*XR#cg4͆ۏyMꚯ8&{a8B~2UT6q 6\~4t}"ōM FmHOX,Yǧǽ 1˶׏M{a_)ӵv>aX[?]|z_w͹.܄D )W+~ccQW",Nt`pwD- M`\=Zz6WW\[ Da͸:+㿤Da\"Q'bu* 喼ٜ͂hpAD v8؎<:foS1ي({|^Rط;+t=ɬ)R+V&(GY6By~ A|$wr=FG9F1mtR速,[nlnp |LzzTgr+nU9>LW,p4`u_ EZIي&0<eAÑ[Dfg1rU]97)tOsh5 3[}d;4[Uvfb‚sSV]4`w1]m2şw5TsG;OSt UY;LhE2W`~Gh3l߮9=vqNn0zPxNLuq)p]}Z-45U594ښ5URФ&K,:SYhem\],(!]rO%=ãw?uQ^0ʽCaŖ[S\_sȿ$ |~"ѿLCP"n-DbrssUyKԇĴjJNLVʧIO"Qc~jG h+ >9zXiVg/?y7&XQP )QhCGwz0Hx~Q.⿽Wf1?I*%S]Hd#:TSR i<6sߨq.x׊Ո;̳vhe2OKO^tt+sM~B=4[UTZ(eX2^G8ar]nAu׹皣i*)~Z'at% pEaϋ{Ŧb]]$޵p6fKEg  !Z*]r4.;o>ky;o8qp]÷@V4bk G xgjN[#S $UjRRU^^\^bjKtl5+Ct)jpݘmȼK, '] (jzAVq; puoQP|NmY>8g=̟xNӑ}d]I<=U W/!BWJ9_o_-YD}Sos~ CC'C7h| jLxYzټѦШ | !Vs?{5,Ҝzn݅`'`tSr v#p6L\ _)i,|hTEӸBB:Wm {8`Cl 6IfI&x2H&X%cFQ{#ȆW!QInwZ-<\4h|d~8zxG8Hhp 9xy&ς هI36}7 kP1 ܆tpѠL*#ÔDS*ʺ$>]ߦtkLda)yF##Tφ1؆ު`h?"B2N1tG /Ǟ_40?4MMAgܛ!YE? ' YcaQ&oKMH7j~ 2DmpyH$'4mHC~G\࠰D95^D}q(8 h<_ǃńĿ8ļ`@Q*:Ǧ c?95x:k4Έ B?y(%b<$R^ hpL0eKZ5`̒Ek]B'R02VA2 @Հšִ:S_jFWlxBOk 37%DU mDogˆ]aC'jg*a=ѻpVu .hpi:ޘ$*#F?p4$ n:m:Ukՠ${Gx@ -rԬ(B)9'79ֵM{Kv׫z+ak`<#0#bOr)dHu;LJiԐRI 4wxA1b~¾N,'?r o#R :hBĴ,bs0C9 Lg<:Hb$z^HMb4S#AK N@#5 51耞ȉIqUlapUb8%ݳJP "a*x{QN@i<] L "x8OܑSI#н2{WF~^٨C(M0w75TA|NĽ8`A5}|1Љ} ;QgĨtgd)8m K\" zq; O%d7h(gAq7(kM0oqdA ›uiMy"EݭeL!XĈQ挺UӞ J4(CR= 2"0)W/ ЅGܴҼ.)ƈ$xnIykP<'1wHKƪb,T@Y+ܻ$ݛ!rĔC@xG)1_NPnfp{4RJ$=ƻP( B Ph "I4Yx*TiXBgBPw\ÉBH<`StfXTB\J&4XT;5ҋl,#7ʭ) GA$\4sa,] ^@S8y.'Yi B’r$2P?O΄_(<]E\`kt]1_Qwf6W(=֨Z5G_ukB!Kդl_۰X.Q`3/-ex/Ѳ+_# D,|eX/M1h*GIȍRneMl!b*J.~ŜbT.4uBQqp7W(˜o1h:FcE{,p0,fݷ5SJp{_>dJfL)BEWP()-1.XAr!7BdZfsX(?~,?D+sV5Ǫ Pb?9/O{7wK̗F瓂SCڍ35d82 ZV,6Sx~Axg>oc'x,h!'ybTMMd@S{npYӕ {YFs F)*=I U7\E0Y`m޵ss"F|s^#ƕfrIsT]HGxF*D[.^! rōgii..m0"RuK+P3 -9,E E$_J{= Z4 ADX HP2.M)E Q;nWS Ou0jE!eyReF*\2|zߠ^*|z)mыx) UU^%|U_fykZ|RȸBhi퐌lUU=*^ LeMaBԘa"$V]VR^sb/xѐ]uD҈QeCK#-VEVЬ,PgCQ-)(th)$g9-nSpJ|c)8=0AΌDԸAz!cs):vR%c:T'a #3<.vPdSLa -y`{DEv(57H-a= A |>=gss?jώs%4j]ߋh_g>s/epkHs?|=9.?+֞//>PՉ?y/KCJ|%ΣL55i QNصUhȻSy+ x|4 )cnl3iiՊpƉD´{\ho8qOrmQ9%cew9},ga2A[|ff1ǼsZ_SΐpODf 5$+{ A4{^i.] LrhE'U.%^ .[eX]En򴟄3’ч9)_C:U94 79X8 $<)r6*=駽okl;{ʃ Nd$ֺ)JvR؟R5ֶ,ޛjN-ҷ_U’tZEDLR7(dXBr0e5t-=eX^2:2ܧ l^dabYU((_$j8sT]? p%p,@4wR~\z)jV4.?W(:w9}Adh<&Al FJ٤N25:d_=#nQuׯRń/)fkf UP"`-*&Q!A u$VB}BJ8u!O{bQTLه+ I敡QwXY$'-,*;@ $[:UgC%%Z$lsgAdiFhx[ZR8f/1(7$wTLI(X.0TTƙqME;SMVwW()|Quxb1^>Lv a@y D-NGD_[o=L8]o*EW ̰y% nZyGFF"[~z^-UF yܪ~X&˿U c$1j](HI I" Wb4@bk}Ȇ*C h@ OY:cW"Y`A0c|҅mT13[ ܾFk0 ,ʅJ1[)dfXEr53}`&A$RguCMg#./)djQ;$dN_V2Y7䫷\ꃢHq WAFUG;ґqwƯ J+fbF d~Kt"Ҷx+YkOnKRa܎ڗL$3YDMR ڨ1XzʉS^EP3hqm7OF͓IĈl]c%X~%8 JڻM2ƘT.WŁPŇ( 90v30 ' yhiƶ@ `'c5éRJmՖFke!m-ؽ_d,:.4ү9GsW/0mrLԋ]J˚xSS}NgXFcq_e ˰JªN|k ɉguGƢ&6 RQ 'wA$SWco6N^uvL4f!*+5pB;hܾ7ax*T7Q܋ٜ6[ͻsonk1 /`'Ȅ>>u ~٨"\UT&Ln?؆ancl.2Ke:QBM隌`;@L !.WqO^Pjq9>07.l.8e(3 ObظSZ/}z'W<Y2RVk?iRĂ0l"m۵\Ѧ6rO@{LJ| S%Ncm[4msk5ZXv([ 0+_Vh <ˈyu A$K6Ww$)SYұ<<4BV@Gf'lՠT`&45_g" HPvx3w:M4soCbYOVߙO«!a'Z uM]_Z3oϿ%;#Bˬ'Ɗ>Y\qܘW#v3?hx41럾s`|_/;k&VU4Cʨ&l, t darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/UT 1cl1cL1cux PKq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/._RawUT 1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Mozilla/CA/UT 21cl1cL1cux PKq:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mozilla/._CAUT 21cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK(q:U@ darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/MediaTypes/UT m1cl1cL1cux PK(q:UJ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._MediaTypesUT m1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U> darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/UT 1cl1cL1cux PKq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._ProtocolUT 1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U{> darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/.packlistUT 1cԘ1cL1cux MO0 ;i[ل8lM̴ђ8v萺ć^>ʇXuI~Ddl ;1 58$l+hBڽc#j-!bVPU*[ ^OYn%FkQa@A򒳔 93~a#[ RZM@t*vyDk5@yVWq#mҶ\JQj'{<:r:ko5TBv:jjIߞy vH4Iv>Z-Nk9&l5Yv6 ?N^O! {iZ=w/CmǗvN{ PKRC{PKq:UI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKUq:U: darwin-perl-deps/darwin-thread-multi-2level/auto/Net/HTTP/UT –1cl1cL1cux PKUq:UD __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._HTTPUT –1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/UT 1cl1cL1cux PKq:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._SSLeayUT 1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U8 darwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/UT 1cm1cL1cux PKq:UB __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._IPUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U; darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/UT 1cm1cL1cux PKq:UE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._WarnUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKUq:UG darwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/UT Ö1cm1cL1cux PKUq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._RequiresInternetUT Ö1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK*q:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/UT p1cm1cL1cux PK*q:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._NeedsUT p1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK(q:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/UT l1cm1cL1cux PK(q:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._FatalUT l1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK$q:U> darwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/UT e1cm1cL1cux PK$q:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/File/._ListingUT e1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPq:U> darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/UT 1cm1cL1cux PKPq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/._BuildUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK"q:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/UT a1cm1cL1cux PK"q:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Date/._ParseUT a1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U< darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/UT —1cm1cL1cux PKq:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/._EDIDUT —1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U= darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Compress/UT 1cm1cL1cux PKq:UG __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._CompressUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK&q:U9 darwin-perl-deps/darwin-thread-multi-2level/auto/IO/HTML/UT h1cm1cL1cux PK&q:UC __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._HTMLUT h1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U; darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/UT a1cm1cL1cux PKq:UE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._SocketUT a1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK!q:U? darwin-perl-deps/darwin-thread-multi-2level/auto/Encode/Locale/UT _1cm1cL1cux PK!q:UI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Encode/._LocaleUT _1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK%q:U= darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Tagset/UT f1cm1cL1cux PK%q:UG __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/._TagsetUT f1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK/q:U= darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Parser/UT {1cm1cL1cux PK/q:UG __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/._ParserUT {1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKXq:U@ darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/RobotRules/UT ɖ1cm1cL1cux PKXq:UJ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/._RobotRulesUT ɖ1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U9 darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/UT 1cm1cL1cux PKq:UC __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._SAXUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U< darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/UT 1cm1cL1cux PKq:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._ParserUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U< darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/UT 1cm1cL1cux PKq:UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._SimpleUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:UF darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/UT 1cm1cL1cux PKkq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._NamespaceSupportUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U> darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/UT o1cm1cL1cux PKq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._EntitiesUT o1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UB darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/UT q1cm1cL1cux PKq:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/._PropertyListUT q1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U@ darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/UT ×1cm1cL1cux PKq:UJ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/._SysProfileUT ×1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U= darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/UT 1cm1cL1cux PKq:UG __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/._UplevelUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:UB darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/UT 1cm1cL1cux PKkq:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._ParseXSUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK4q:UA darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/UT 1cm1cL1cux PK4q:UK __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._ConfigUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UG darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/UT 1cm1cL1cux PK5q:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._InstallPathsUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK4q:UB darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/UT 1cm1cL1cux PK4q:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._HelpersUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTq:U@ darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/UT 1cm1cL1cux PKTq:UJ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._NegotiateUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK#q:U; darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/UT b1cm1cL1cux PK#q:UE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._DateUT b1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK-q:U> darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/UT v1cm1cL1cux PK-q:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._MessageUT v1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKSq:U= darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/UT 1cm1cL1cux PKSq:UG __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._DaemonUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK0q:U> darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/UT }1cm1cL1cux PK0q:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._CookiesUT }1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U; darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/UT i1cm1cL1cux PKq:UE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/._UtilUT i1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBA darwin-perl-deps/darwin-thread-multi-2level/auto/Switch/.packlistUT ŗ1cԘ1cL1cux L*J,H-736.,I+/-.ON/H,JMacc"PKbb:BPKq:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Switch/._.packlistUT ŗ1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK'q:U: darwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/UT k1cm1cL1cux PK'q:UD __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Try/._TinyUT k1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UaC darwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/.packlistUT 1cԘ1cL1cux E; ޻3oAabc&,`?je1EIo<ك2y٣O̓+Y-58BJH˾PKˠX UaPKq:UN __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U; darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/UT k1cm1cL1cux PKq:UE __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/._UUIDUT k1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKmq:U> darwin-perl-deps/darwin-thread-multi-2level/auto/URI/.packlistUT 1cԘ1cL1cux N0E|L]!@Q@TeWfQڋ'G-{4ܨI1U| /QwrtL9|Ū3/5HP|^PjAyO U)a{*F)Uw?+1Uk,adtpJP5NԠ<"VKJyԨmL)הrvd fr5-1S[MMpHhQ5[{(;ͩh8<C(AQ(H h05> _O1*@!8*GV;FI 3gSˮH0/C2!ݗ. f2>/}PKNkPKmq:UI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/URI/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UA darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/UT 1cm1cL1cux PKq:UK __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._EncodingsUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK:8OP? darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Expat.pmUT ܧ]N1cL1cux }wƱ+6)E~mOd+V${Jrɥk`P/䴽>FZ׮c|o^ᅪRO:MUY yEdW:/*۬4{<~;5 7b|v^ؕz9\TK6UZT_Ö}ja[ ̄Bjs_8fwUuOd`*v7,IÎכS1-^U?BOU%)*}5E:o:1ܙ6{͞Ŧ;psDfSoOul#6e1.&tQZ*^TqQ8T￁8JJg # m}q苍 088gب1΀7*ɳp|3fưf4 J_}Ze6{EIkKc]= AQV%퉞Ӽq=dFL 45)pC^%?[rY|Vԅ!j}Ҥu|Ϫ۵Q:҂Ml B@Q:F(Jf2}#"ޙqYqzrr`>:]@蹲TH>pl<>z~Y?UK04^rlA?Q7*xS¹qG]jQ-3F>l[l=z|2m̈́;eb8+6 |\h ;?hǼgyjT`r;-R'Z@xsðTU}]w}uu `Wm2b#;n=qosW_}`o9`TtέVਵ.b.#o W}ļqQ:4Va]tu#",>ZU^Y{|γnEm}uiXb6-ݙxZ1Pfe~Y4pY8,K81 i^,p7`a `)n'0/ 32+aQ*9C@о\pG]as/RUy~e>%Y 'oSe+fi pLJB%'l2YT5}Ӄ}i+KAy 9ɢqU__ٹ}տɨk`х(z9NIτΝ驪L#q,eG}[?7gQwd[7"XU!}&L5N92]SO@a4Dq`RY~% \6?˹}A&/=.gLSuhlaG"f[9&_P<øLRip S\˜/]8h(b424`Xˉ:TO@/ ģ٬ UKzP'gsfp!:_3:w w},~rL隓XšON(kտNmA-C$ˑ#2Cu˭ߵP #;*&|clvz*]-3octpll$ObA'eqK6D_~^EE6_\è<7?V8_4N{3] r.anWI-dȎ1i'|wfA[%%t/-ejaEzېFmd/Eant~U0a2$G0W^ >@oyrC}gT#6V580sˆL إ1_wLtl=dMgr zVOOhf6 ӗ l࠿xe$VV6ERvRFkNj]?9+X`_ y3_lC9OR+_4p^L Uz.d`@ J-+تLh~v2vFuOݷCN1aYq% ؘI\UVNJ8 ʀ=ڎ kw虣Ԥʞh+o۰ȷ1 (dπsH4m=]2Cb/2]LUP>Q`Ҫ}{> ] \ bvUjن4Q|;&y#͔0w{f$l0ޣwaw槚\{UJG0˪VDx}NqdPj3/bsRoj}w>R^K8Uwg5 5V3S1 M  r5Թuau{au[aESok`jr럻s"A7 #f{kKf ΤsaN]![P4yq/?& *IbSC`m ۴TSZ&gܳ`'=ثB W*lTq9[E~UP~ Xz~WYԋ{a b..Av}8S* tUZG2檌81bp:aw h uЅuZ9x꺈=S_iTf5.LYv[4Aψٝ15Qn*!M,^p5f~ ֵ.R9d*iN0> 1  }ŧF2&_wl&*R΋OA`O ,I6۷DiC`CBmYݱm "mQgD 0S&4M X2H쎖Sj?kB-Ҫ֙ڔzEy>:k8 `^h/1V:/VZjQ,V"_G.F +mʪ7{5h֦?I/b y|ьcSLqq@rƻr|q]ZS5=0 OCL+^z$ѝXmfE(mvEsOV m!Y,RY+UI$Zv%})E{ʐ h7Eʫzm3epLz t] |Y , z^aD[T/߀"kq77<4Po5<%dxi'qem+ }ſFe~fIj`nBxC?X }'dE/<%%PԮzߤZ*U6,~{9>;K8E~ 2XՏb vL=`6DY @ Ҵ R3g2x$-esVB@,6Db'IoE,=ᵘQ*F+$} }?[\z*`;}ꕠ )Ȕ}𫤄ՀUTK@upF !P5',0V݈7N@=TzUWXY6!ŷos_$P1["F0yW]+hnbtdMR+ɷ#}U@jU [j&p5 7nE4iZu?~O?"G0:#ArV1Ʒ(R_oޖs8O̼ 6]:+CDնVD޺ WZ4tu%[Q H#H?bX hIWO9j Ppkvdh8 P n_dA[6g0Cڎv qL[D)NJй\_j;/6OdU@úުI_, ߔf^?>pxX} /84=ڱX^'Nj:`@ymx(85iI^2X;J:겳EcKȗ?4)oEO.Oo3[*؇Eg2L! :~ZwKOTzh3zS))8fVL@xtzzt~Z>ʑ#祭 iV$d$oyk H=-ybB"=FI"&a:Ȧ5#J(7魸/T^þ,mQ$|E <+u8Pic 9g⊅acb%}6:~X:^ k!9FZޖ~޴74Q}Y`#GD#DpykeYSAIFv9fʩEQ.XKH#md ƺo:̷Oۨ"G{9;?-޲d M|c J|t_g2LFA(]i e\@IP ]\E>,I z8-6cO~L2DdAY^[m{Jm1զx)) 5cuӨ3ʫapvQ==;'΂t1,?xHd wZMϊ\JbQ^HG۬ tq,qfU>q*c9rs*kJOPٸp="h%uU^ب3T srUK?+>vGFѬ!YȄPX2_CL@ pgR}%ՏA!PG!$MRj}159\#nV-uFlTv[bF+kGȖ\  nx6>gϪq6 9au/^gf&<$`SH N1=:V501EC >T|')=1;\,=:/?\R d^aiqv~v Uda egȷ|bB iG!WBFʏ=N{ A}MAY!{>Y8C"s9aJ1D9@^:OGy7>tQc?"d(~SV hL$9 \>3q@YWG_,n$Ir?c;pЬȆE8v^lwNmçnGs;ST)Utqrb%Q 0<0RGT2?/rP\l잵Ps"27@ˆ3H[vI[c&qgue >SWcj&`1L/$ 8Y5eh$#ˮ뼰; /r_ E' =`!.a-fzDzZhak["Nq8q0u';X1 tzf{vT[AFذ+"QYRڒ*Gڱ<L=.hLkzT2*Lо)pibեM)sԅe<ˉ!ƃUz4,#^AdIy/- R trbR{(ϼ=F_!@1`]t Z Cm3WC-6)NCԞ`€Sj7Ƒ]#Rl@k$J%\l$,*a[$^o%\O 7IRcQ{@L l° Q˓ȸy`~ DRc6W$Q_hc<(Ao²/sJC⿬d#G(P#QQ'L8pyoa"<#8<=eo(4J>H,fv">&ټ|ozXԓݺE fs gĕ[#R#$mu[j3Zu\U~0X<4(9@ɑ}9$&$~5Xgl$+DI% 7-貋f rO>c$z`@90͜QMitG~C2q/`PPR0\lM ,>j,mՈv g1s9S"=[2Ԝ{)?ApٶiL%fd\RӔ S̪6P2H5x k 6`P\"ʏaTy'wJ>3\uq0sO}Σ3)WT\AM:4:WAo&mbey\g!?v|1Ț'؂ vvTg 5 /~8}{0m08 -(&]#H5mFvLi.ek2e0?(ZOŕ+/R0ΞdV9Rc3KrN.8Li,&!%TEvYMnU,fE8^᭵x?tf,;7q+J[kys6U4^ ߣ xaL!P8F#`OiÒ%|Ae x궛b7j5Y)i]id0._ҺN@qa,OdO] r)fK ϝpJr,Bʎ[iӚƪ=MA8j&zӓ5_ e / "67Tmb|zvΡˉ,6@;V-xfdl'o$mWx"?@88꽘gĶ@P(wP^OG}0fNU3rPxW:|klS(\(]Kޗkg [TUQHGXh= Zvʾn?0Q[%բc9Ҍ[ p-F3PY@6 ǟ㶎e78ׇLp\ϥ&g`k>smI8t'UA K=VסwPk 3.Pm?Y*xpPUWoLe;X)[ΒbIcl|gsitU\L*2%R^鎿ciDXBDA&hM)Pe. 5h1h.oG8RA.|3>|n(ʕ4&TT^_xBSVΜGqOix@%)aṔ xLhzo!f i9i(:v[c2v6U:VtfPT~ԓ؂$e'`Nb9S0C֡W:ogK1Gãwyîq?D"u,W` 7bosF/D[ 3`zٱ0N31i4E~o|nu,vXb tj@V}A(Zg “0ܻ3T"JV]E & ;2+t]U%*{{ֿ z(j>lWw{_MZ _CI0I^pЙs˟{Zx1c ||%ļLmHhh1wpGyˡוjly< dzK•sаHbW_{fmAruJp5B&ћF䎹Fq [(:pB<ّ5238& Jc7Jge 8!?~\zzU(+vVnji1ggggJ {MӢ%JAp`ѡrCj頵fcEZYDp[a1(R:o:xAaƔW%Z5%ZEv'I+kAbq),dIe ^,>ߋ jO#{C$nč'BHAMx,E*6XۥelT2װԧ6FC6D7 JX#K*Ձb`Z/N}K 7le$.Amۜsw @A:m0^ p9<3|A(>SڰVY&}8X -u&Q^4[uTjpaA 0m-Blqr ~H #X^yt`Ι kܲ-9Bbd56^x E2%b҃az?:e-$>B{ ϰ91 \\w.'P7ph'O~:o?إ N=r WX>K;+]ЏwzPӇ0okڣ?2I4K~PKT.PKZ*8OQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._LWPExternEnt.plUT ]N1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKU~U; darwin-perl-deps/darwin-thread-multi-2level/List/Util/XS.pmUT bO1cL1cux eMo@+FiDHb5!4EJIbk5;YC wy]^!?U{dޯ5\!z Nl pk8M:N'} 9@-be:~Ա<8ID3ީWTb k9hоh2ITh7x0?~F]C+,S, ,}MJeJG:A)pY."Wk+uSSHi!鱾~> IjQEQW:3&1kЦIhQ /t^ Ntz5É롶kv6+nb%7J[2GXÛE/\Z[gn~֞:-GFcgbV.w30h_d4&s]&j)_+t2]Ԇ+AGz sV[dmF( `e _sIǑ&ۄPjHy] 0R'Hh"YPKAPKU~UF __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/Util/._XS.pmUT bO1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN NK8 darwin-perl-deps/XML/SAX/PurePerl/Reader/NoUnicodeExt.pmUT ]M1cL1cux ݒJ@F)>\$Ц(jb*aM&b n%z833&c_DF,o8_/6M+w$kjBmMX<&iFIb7[cj*iX%~g;NO済~jrDW1UF ma>Ւßat[;,֗aEZJ`arTV ,'Q5~h4x'fniz~dshpnʄd}h/ PK GKPKN NC __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._NoUnicodeExt.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKN N 2 darwin-perl-deps/XML/SAX/PurePerl/Reader/Stream.pmUT ]M1cL1cux Umo0_qHִi6UVn Br)QlӬ߾}v{v?-kw-Y5:n./PV]+mYK HB6@H9Gѱ[H[Z@;秫^{igAlNgWlp2|1v/GrB\$As85i)1Q[hJn 9reB)* z9<կ5>3m?m99Kbpu!Q"|in w1N=W=] :QكGƜF-P-)CqGc19VTmQ˸rxP(/c)glj FIL9nR{3N%`%f~h~IapOA-"V\LSmM]@Ni9'"FñH' g~SJ_wŠ(ho6"`o̱ utӄDs{H+,&\ЯD3 -PJc`*4^ժ`WV&p[TN/0iAY/Ϫ1+v*^Pi]&GkHї;ȼ*D>P^4}ȥ= .)钐^GӃt<*(1tpl[NC7EgbmoG?4яL=p;s[*L!- <ӀOG!V62nJ4Жb)nUZy&P* N4(G7=cP?`)mNXłNYbYD#h5,ʙ@C2UD5rbQ"? ú19xm)Cm$ ZXs8>M4KB['mK嵗oc ~]D&pN-/OM_-`|;_PK'8PKN N= __MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._String.pmUT ]M1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKtq:U? darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/UT 1cl1cL1cux PKtq:UI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/._FileUT 1cl1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UpF darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/Daemon/.packlistUT җ1cԘ1cL1cux L*J,H-736(OwIL+'"?KH?'?91G8#(U?71*JPKd >QjH 2N0XaLH239Ç#i+[{j>޽kL VѶW"z(F1fZ{3s${^{{{0zB$ !8 FH0DS_ 6"x<mfַo";|QY'E/t!,/\_~F F4[cJ$\}m\'yy,ǂO Fߎ x#jTOYv9^Z8*>dX֋kz,8ss됫+x=kr4T3F;8lP}' WG%\tqތvTfU5otp4Kz`-ZKx]`:{Hb'C%2u\G=G%~Y dl| U]k?*P̌&ϱ$/ud>ׅc4\fCYhdVs`-QR~cy4񣬿8_ @ @p8m4B$9U~\'&9OV xK#!KoueGu勚r- VrsM9Y/;]+]wW?ȣ#3=Sp:NqT鶫.=9fqT;-Kt8vN>Rn}P,CwGR|˝SXS˭ŭ~6[cz'n\@@8j]dSϽg>~wr_;~Z@6}\~Ttzeí>S jbOHh᡾/i_y1 ݉P Ƒdt:LRT͗S{B?\ǁs$~ ͺևaR{ ǭ~Ĕvjn X}R9NU?]~,GE?R .-ͨ,UG[Bs였-ҝ:?tnڗ| x2rvi-dK [" pg&9Ewr/z^ciY|dYp 9=R\;Ԕ}lEjO\;-$MOT)6іu4]KSH#tHvDe4&;$_ i$w'iv$]H{`N;/`Cx@e#qu8a朎oEf`ư.Uq0h*#]mZȂ. g.5Sbݻm)\o墬${I{*u5!CZ١(&pS#uiJ> A(Zy)W=<  ЦU(Qapvz~;'j _DS&{1u&?}RX(aЀ_k k +Y5yNlxeLz]Fq >mbKPw#3KԥQizIXpIwiDJSH/X7]6zY:>j:{۞g+s8*_o--x3i-z^spڷ嫔WNbl&;>/_M@fX8JĻդla9z@6njɮnzNby2Ƴ baW5sZhiӜ@H۟vta$.y"V owVָqytA8OQ>Ea86fnz^!C.+JdRVoC1#{1#UG޵<Mo'ɩi5Eeum5DNUԨ7vTQV-V>O'㽉ddq2Th;.F_|tC1d|!ύ(b 0L4<#tEOe??S OVyc8mDP1wr[}ϝziʻe^>untEFevQ]+n;Nk7fc(ӡ{)c0%jl$-wl׵9sAn]W{NmXZivI3mء;]BesxЫ£NcA#G s'%OVP ̃F4bş ㎁L={'ZGm*~XUtc׾CgFO5_Kx/:ݖp@<sT 8;Ț@c,8j.Kӧj/7-wAsM?9vw|yvlc3 :.[;vvO$^nvtcQXٯ=Bۃxct9at<3ܪ#^Q|y `FSeE)#1-]ĿDYoсeֹe@S V~I`k3k|2"6EȨ!?6)gn1>/NuH8kz_iM?&jݾ ؊;DZ*>Նo%%<r5z7%Fr_29L hq+Tu~=+`zW&7 m͒m )tkWڟnXm1UY V,~4n`ˬ5^[j_b浳XqVjg{yBWwY1tWO.C1*X)fߠYyZ훁ŨTчt[RyKrg%ZKf]ZzKJ"9ɕ"?ɭ\EL[EWvs^| XR"eFҍ`HߨK{sa|F>k?12i/ xZC~#-o 5 kxc.AҺU7N_TgE{ھוUeEՕ\Gmw>'QДjWL^:' vىj;߳ȖUtU6Xjs!`G_[k޽K ;]q敿ѕ?3Խ%M_էpR:vevǎ6bcǎVccpƵ2EcF[@r'%m~*OP.}4,vBTxK͊aˬJ.-{5̂Jiח#a>KRK~yVp>rwz.F7h۳zd:53ogK|MTX,/:Xܖ&WZEOӾ/3*Ő a=W e7o8iےKZ΢ugrs)iaw'v}YCCMQZe.x>9z5n[bVlc؎=ӗR{ށÃգ&NB|&<:3|jG$G~3X_B6O-ePƗ//ƴl(iC+xʷ=AOJُB2WvZ\F ]gibfHU5y*~Iw@)AC?/oe.ErŋR&2mL및?YHH];I_~²Y8%ji$ 촅 l&9ËXtT4#=iM?lcw}>?W-il5yDQ47" ZHا1$-l%Ic f&$f? mBar_e]̋S3#!t/QHWq*[~ک Hy zQ@u]$zLaXሱG6+SQ^A*ʯ3wX 7ڋwK *V^\1on[ J K E 8zYOB%BI;` :Q58"~X禀优wUU\A(kPhg=2߰EVOtGJ\5WWH6;vVM @e$rg0@IiN8紀S;#8-t$Es:S%t c9xN'p5NK9ӉNt2S88urz9Wpz%eNtWq:jNZN9its9u:[ WPBÜ> @ @ @ @ @ @ @_z?#9-tG x0Fr:a> x$y|"M\ xs{g fwFl8mi+M$nCPPoVrJ7G=w+:UѦ^ZZBA-hY mAW0@З-YҘ([~cA` pa4эf,fXol 4 :hՂE-m6Y@4^Oɖ@f5QiYK6҅љMވn,պPHÁla7mnsi3?3j_20>7}&>mG[r2_n[L&g7V?cM1<~?aw=m0#Q@0p ~űB^(Ʃ0"%- 7$~":!LĄ U*u!Jgl(JHu:$¼r},BUi̘&GZYnhg~ȵ޸ rԹbUb^oz&S:xVcSoPK <PKq:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_http.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U>I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx.alUT 1cN1cL1cux m0D{ň4$d]!Kbc[wB;Q$+fvv^IQkckZY7{ ;S࣒$Z]iWd `*@y4mJLDFWtG'/߲$"MK a/0A Gm"׹ ROF̷9z ǃ8a<3)`C6(. PK +9>PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U/H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx2.alUT 1cN1cL1cux mQ[k0~6Ce$Nmae-iIR Һy]IϤHt,f^}'d0|%)jAKR҄uXSR-Lg\c!3UC"<:4F/ 8#9uL[g?rQ8DGo֖63 ~YnGW) e2%762WsV`]=LMO_f bJ(ĎVZ3s`ZMLYr8FQx)"?2=>艮WseV!Ef)0p.v"`[vQ$ǿma~PKWUK/PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_httpx2.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx.alUT 1cN1cL1cux m1o0w'2jUDb@tHwtتcGSZUMʐ N:wޗZHܙVvAeMs昕+mT$xjhH14wq@}&t dܘ.qrt>N5c(޴"16Y'QfI]tgJv0iu<x3PᤜbPK?PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_httpx.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UAI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http3.alUT 1cN1cL1cux mAk@+PEY(zM3&%-ݍC{} ;5 \[#*ϺSȄ :e v4%yԲ TnJkm}"VʣiPJe 6sʒ86K2r-&\*7Oos~Q=5/؜'d >f+vPK APKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UNE darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcpcat.alUT 1cN1cL1cux }T]o@|bd#$+򂕴U"yDΰQ;BP= $i3{3Lqs{tHZ)ܽ7dMT"o^DFؓ&yQ`C($!*LYxa'rDݵmK>cZx޴%sA0`Vg6-Sa#QTts"43Cce?uS^ASY4#h3R6ϡAgdlbH?rX&=bK|N/wʝh:dv.P$R&ԓTII͕|vl%ZH+ >!dF#lv8{]H(zJ[aԁ +d*;' >s| qMuX<&Ð\;FrgX6%E/9N׷Ztyy?x'Gg x pCvA,BZUyԶ5Q rpc]nbbD*}6-6Z=ps9Ijysf_L\d=Y ][NFjFᠸa9 sauzԡiȭdtotx^FDJx>嶋wmcoz7SYQeto?cMm8J;[xPK1-NPKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcpcat.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx3.alUT 1cN1cL1cux m1o0w'%Q2*jTJC.UǶbP{Z):pݻ8;J4ȕa4ݓGXZQjj 7r2VqVIvP tJMъ˧}Mk%5!YςE{3"6?ۯE$T8c1j[ x`{.`)c%kPK,?PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UH darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/randomize.alUT 1cN1cL1cux }n@٧8`+jzRQAEE#Z1^[kJ=J EB93{XxO0#v"EV.wϣ2 _7ҬB.S†,aƊ~Cr[UU Un9ʸS.(\xdN2ۏ0 SWvNJM#Á<Sk TENh Ya-xX.+DxO&$Sguބ/IC)el-=qu cոs8lź12ϒ*{c׶.fx<!>D_VqXV̄+Pfν&RN=h`4qȋ9eubIN-]>#Kk0X60|Ek2de͗2E 7~?hV r;t8BϯxS! )g6:#j]ڑ_x>1Fy}yS쓶`|`YdP/PKKPKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._randomize.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UeH darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https4.alUT 1cN1cL1cux m1k0w#^vL32&[HwbʒJiꡃq}׷-džu"`;TZUY|{YYH\ҾKYV:! - A[qn@o]r(4Bx]yt^{Q08!%ZB~]0P>ͤ=n 1*$|"F4:,jGů.$Q# OrkFH,/7PKA\ePKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http3.alUT 1cN1cL1cux mAk@+PPdR]&] ٍ&zH= ͛%n̅΍PXSd9fyU*ir%TXa}jv6P[aJ2OXwn޻5>dtERޛVB$8|LG-.GfRGcH&" ?P~-z<>8ov _o^{ʰ.uT4l0IYՆ r* )AjSIו6;)*`Åj"X5is_m`EQ)f̗BOcxg*}NlX--s&r1Sp) v =a2wɅ$7A6b]]\tSd„ [և!{o% $us)iLa0{[N糤.̓ʠDPKW[7?PKq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._make_headers.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U/I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/initialize.alUT 1cN1cL1cux uRKk1>[kP5Si{ޗYkv-"ilC{gvb+A%xxsk418q?p^ns*}OG8kQ3lH={PC0 BKƏ[f|x;!vC-C#Fϸ[V û~ѻ4dCFE1nl3yMQܐ(Kܟόgd! SO=Yh@n4K<>qFb4B6Ms@yD9ʭHJ(+m&]S$2 M m614;Nʼ~v} KdƷ8iF)7oF{EAֿ_ҕDbr4_lp^^uqŁLYτVLV5}RmW E)'bGͮL:_ի:g\/,m?PKOXn/PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._initialize.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UX darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/open_proxy_tcp_connection.alUT 1cN1cL1cux T]o0}&DZ[Ua [h#7mvd;*vAs=넘-ob|")ZV_9'3Z,nnmؐƎ-)B͋+B!A%V˂p Uƅ^ڮ.ܪg,Y6(LI蜖Qad}?ŽdI"-|ڧ&+L AR YaB.3hDTV5U3Va+LVx53nn6&8@TJez4ERyp*Ϊ{t[ k%̚@_GhqH:$2etu"NI=t|uLc0Ƹna `G5jxq\ȵ~p^]?(p#qJ-az./wlG,,pܔbGj;~΁:1ć_W[AǪL?09v-^gnE,z 8kk O-9hqiqRJ^t=7&wDM}cR MqcЉNSa'~fUr}KW7c0IPKm<PKq:Uc __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._open_proxy_tcp_connection.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UG darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https.alUT 1cN1cL1cux MkA ϝ_zPB])Toa֍|,;؊z@HHI}UbI.8ԳlkYUꧭ/ZE84u58jPa"CJY]9U\=Mlfv*BO?a.]Q<9;km*;xqS =c4ia:NNФ@S:q3s3$mm:=pGshU)f,PR/&`:j<{}tƧ+j6afӏ XophI01(PK-<PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_read.alUT 1cN1cL1cux m1o0wDQ(VQbld*/ep{]⍝qVe:O!-ԒiأѲcJk m}ز ^IhH9]08>?u1I۴"0v+6`*16ɄcF"ܷUuq8 M[\B"ۋPKV]5PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_read.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UK darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_all.alUT 1cN1cL1cux mR]o0|br륍JH{`dRZwpC-aٙ]/+2LU"U2M'ѭr-PE)2BAJTeڂ4D*[+ -L@.c"s4c-?ENFQ4v{RIMmo?b-f].{|q:1$D(*\xI1GCUͱqd? cъDWo2ƆoVܰ LC nz1- a+_sl>`/I;'̜|ZD3E]h,~0Xge8~=-&x'|ͅJ ,~8iM>9x+ bq'e}6m EB;aL0Q] {AE|7PK ?7PKq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_all.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UT darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/dump_peer_certificate.alUT 1cN1cL1cux RKk@>{T2H %Z BQ=Ե4^>j&ڍvf손[Ժm`-z QQkOfkCEڊZ$`aW'ʝ_Q (1 HC;F%>j=vߪn؄r[Ky^W/av~A?bKXxq?3.~EɠՆOkVh! &R 6kT LTLN++־CoTb@cjX!ލFpr8j^Tw!yMZ97(yX잴,\b $[QV+ -|T:ϔCO:8@D<%UK:/wIlmV=-Bbt8wPAÇ#2Ap-e.èղb/p:Nd IGـЅ |SBX 63p\P]q_^) ˕*>x.P'{u 3(ƣ9G,PN9TlM=;x^Z,pfGJgJ`*$~vVy pK^`80x/@ hz, 2KrWQDzPZZ R<6B=BmQ@adLQzƍNSroV*oq||; L'0|? GKQ'nX>TÒ'_֑#3ڣԹϴBެc,@S҅F'W+R OaH-zŒ(H /ϙ' &82/#ŤGFSl  t/ cg 簇Ү! W0mO ƕCfל'rpD7X#mUOK[.~@Uƒrm!Bypm4gw e<5nFlF6s.4o$'HvuÇRFpxd5^2:\4F_QW_Q~ܨh\"PK#H PKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_read_until.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U<O darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/set_cert_and_key.alUT 1cN1cL1cux Qk0+bCFXSDDDe[%0oOI}D1B(Jž,$–8IC4޸ZI`!{MO|c-PuQ+ ŵQ?rSG>/\2?y"T:8K` BM:!QVXf%I>cIe24!k.(eNR w@-;[ъkASٺ\m~䍣| rJ*f_n2_-a7Ya7|2ߤt~k`Rs. ^e'KK'VFT;[{oiq7z2˞?z4GPK6G<PKq:UZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._set_cert_and_key.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https4.alUT 1cN1cL1cux mj0D$Pl olYܴ{`z+J[@j%a<'&a1v0y4$JkH>ZNvP etNm{"*B_iX!d,MZL#OnSׅE"I#[G,$ZI*8U!ZoUC:4m'B>s>Z?qߴ`,PRf/OϘgtԢ!6*<*0J/ 3?+^e.`c:ίi6[?PKċ?PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_http3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_https.alUT 1cN1cL1cux mA0{Q%ⲢˢzԎm0MJnۺ=xޛ7#5UR*S Q2 ْ / yXBgdQSEhRHX&' Q;cK%EUB&1wc)g"yJjB5b^v #wȝ+/hl%7_&M9poI0>4 PKZ?PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_https.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UJ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx4.alUT 1cN1cL1cux m_K0)J81{I׻6&%IC>{sD?=oslWqCdoO>+3;"PK{PKq:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_httpx4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UfL darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_write_all.alUT 1cN1cL1cux X[oF~ʼn,Tdda%MP |iv 9S$KE~gfx815lX9fΧW!yt'CZq4?s//Ϥ9R$7%-e.i1%ih J,Ek,܈(aK)%f"7h84FsG>~[mhITZ âg}zEYaz[Rn5['IIFF uB_2QO Kr-X³ qPRft<z1p12Hvl05T՘c\^ P.k!YYF#kɧ@$KO{X*XI#Q':L+2%\S&a4).H53Q e(&rˌ PkJNp C?(q(oy"V~ڸ|jrȂ;',Qn1aigiBW">uA7 ttuvO HA*ᠦ$u&r0?0IHio39 9"eQ uDA醨ur&ki `Z݉8 ˜—|ռTgH/42$ 9=]LN_^c”$Uv>8Bg *]2FP2kIE#_AXNj)tB 4 KɒÀ.(]5n-ؠ(0԰X!̤/WN*Z}.|wagb[M|q\ڭfFa3qb8 xL])iޡO_)+r"qA nQ 1uavyò=5F1Iw v±.Kߎ[`9<[<\ +6;OW :3xy8.EXˑs' +0%[6 7z0*M_Yw:O^u3} G?:l:W̍!|4m+o>3S>?Mʉo|4)-hϔ/&M<'FJ!cA@j5Ƶ[ź9uqz8l.{9>=E _Mo@-JAA6ptܓ#+d՚uu{n1)'QQA]';l%Cg]'8m2Ҽ||8JDqϤNpY 0e@O.Gڒ})X ؛ۂ:uX-g#{//ŝ4{l?zC:'O3ӵۢ{T/m:`L7h+.d#uFZɷrţ!A~eIO1:1###]u|O-Gݭ.ԅ5q:uḥ0S梺!rfq`,ŖY`` NnXѲla@}$r7uZ|IF<|gLȭa3r;s¼΁ ?+PnBypǽ9u4 ޮ{}?УDsrUϖpL]|}-+Z)\9pxPKa&fPKq:UW __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_write_all.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx3.alUT 1cN1cL1cux m@{4@Ɯh-7,p#O. [a8n8T+HJ#R2 ٓ pG<2SELȨ$ܤRX[FrJ:HTHݤC",k7lB/"%EyJjp2NvEnm;e/ԠlՀ'b[ͱ8 yI0I6ˆSPKǹ?PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UDJ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_https3.alUT 1cN1cL1cux mj0D!$lLzhRZJRPA7, KnBrz9,,3;;/zx^PCo;TZU8k $Ϲr᭕!NքzQi8d `*@yC̘DxG'߲!"eZB}L?'\6Գ CDk#X=e752a) IK PKEDPKq:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_https3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U<H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx.alUT 1cN1cL1cux m @{4IF9Q 6EbrrDASX,,3;;nqJqLD$lgK. {P̅Ȣ)!pJ!!(c9i[* -2!uhܸuKq<qi0) h;aF;W=f_ x 5}诣=0a~ВNaN]4οQ6PK W<PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http.alUT 1cN1cL1cux mAk@+PB)+J ={wcvqRߛX< ͛%|l+n'+_p;T$xJH147q@m&4m'd\ΙܼwkdtER7̈́Hq#FY0Ƚ>4d$B["ʟz|;&0NtR^b:PK\?PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_http.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U>H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http.alUT 1cN1cL1cux mAk@+PCE-w٘1Y.Mm)(< ͛%oԪO*qjmB"gK!wꚔ%TȒPSK(Q dwZ(B%ӂ޽~tx!q~k3he%1 ƃ?rn3u.z2b+p^NXbaK= 8Y>gPKe)>PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https.alUT 1cN1cL1cux mA0{Q..HDQvP=Kj6&IWE*h,Woe8TDd$%/Khː*ɡpJ!%(eCE5-˴2yYςib}"zr[ulCp_\لB"}ӏ8eq[&SÞS:Γ,/PKJ_dAPKq:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/debug_read.alUT 1cN1cL1cux Qk0_qM@Y:$v{YK"7,Y{8%SBpt#]x[dĞ lI%| V߉⦎/W%yAz!%2ԭE_n),D ӹBɅN٩A=:6<@i:R(GAtQVIAYW "r1 F*!V:3;Ye8[(0ȃ"(5,i=S} 5< ܍ w*䎙4FI$v3==!Eם)ݫptQGuK첒*m14dW˜t lثݣjҨ(Y61Vߵ`vŲ;IY2f^+3Pl:9&`鉑T A5dfߣnZ<:8 q*x2f6޽{X@~9r沄 )5IN@TGrѶSOVUBOX9/[K l:{ڦTu2V'2e+ξ~ r+&ϓniXm=37|% #.3>>ʐSX~X_j? yo Fw duPK{ \-PKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_write_CRLF.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UEJ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_https3.alUT 1cN1cL1cux mj0D!$PlL(&CI=%*KƒC p8%vܛV8EmM]LsXT W޵5Вbhc-j!فCgM Qhȸ)]1c;>vN c,i%Dfc%f`'=-4:.f" 5W(?v5;lN |(`)I^+PKEPKq:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_https3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_https4.alUT 1cN1cL1cux mAk@+P!!^Jz0QMKzü7oqN9O*PvAds"e;mB"F:]*uפ!zglAc:#f;}l&*Pi˘&ě5V_hgfQ_FK\kP`lcրfZ-=='.~dL|xPKӵBPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_https4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U.H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/httpx_cat.alUT 1cN1cL1cux QK0ǟͧaB@Qd>v5,Mkruw7i` ]w$,_%7Za $$˞HM5ܗnȣR+BI '3v%Yk 6VgD ,f;bB#)N3!F[Z0:bgg'%s,I>¨ [OޛK f 5e b씳HNX6zʎ&k ٩=O G^;?@q+ϐt+1OPKR(.PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._httpx_cat.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UAI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_https.alUT 1cN1cL1cux mj0D!$Pl\r( ) mo.( %7 ^9=؇(oԫ/qmJ* A.e ^[idMh'\֨KKr;G?DʌiA]t?:y<ˆ8k0hez,XZLn3mΧR& ߨ}>.?K^+Db25ifPKx~;wAPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_https.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UL darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_write_all.alUT 1cN1cL1cux TMo@=_Vl$@rH5($r<Fu\Tw^cSET$ޙ}_;>|TN1V*b&ޓ?Hwsgۍkʱ1aCP&i!rrCYK$*xa-ivωpչV;|ka4uAHdϵHzwTHH -lXh)Z Ry0J >//իu(nGUL!$Y*Mx81k^`515Z%]].GWbZk\;=ȃ7Rhv*[\wk_޷Q!dVJF/!;~Zg:;~}TmlkéwBDxmyS}Bhoo9=MꙣiBqN6|\a"``6BB.X' *,fu*(Ko9*6Q -K!PJq 1綀z46?8NAuDgX e͆d{ͷxg&$tގo;'/F^ax3:PK,pHPKq:UW __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_write_all.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBH darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/new_x_ctx.alUT 1cN1cL1cux UQ@~AI >=FU'fh9M&h"3;|߷Ӈt<r sCF ?l=pRBkDH1G0aҰIQ-Tg0evGT#[3MWfhTO ϙ@ _ s5EhylCx/v@sT1C 0pqbRx zWJ[/-W\Y ^+clQ`^_19#f( B3͍lN0Udu/ 3KLLj[]c8rsRsr+ڽ>u4W%x9\#+m&Vg/QICa'+xNk v͋VR%f: tR\cB9[Lh=s6jyɵ8˥<}8V7rza.Nz9ꇥC8o׵or̛P,td^  PK` BPKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._new_x_ctx.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UO darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_X509_lookup.alUT 1cN1cL1cux mP1n@n@ #E:^'w:E{"ffwfvR[v+v(*qv,xed}%)6-=:-;Yi[6A(7!eu{8QFyJT+X>,0? W&F__dXH&J2oU-3xwȒqk8 q2zQLAPZFBJQb_pJJh:dB6jrJ~PKhPKq:UZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_X509_lookup.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_https.alUT 1cN1cL1cux mj0D!$Pl\J( - M {XGKT%'-^;=؇`xJl5V8FiM WԩHUPbhnWc-J!فCcM h^ȸ!]0cݻ>6tI״"1LJ%f`>iqяȃ>4:]DJm Ov C?HD7|zþPK_SPKq:Ua __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._set_server_cert_and_key.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U8I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_write.alUT 1cN1cL1cux mn@DnRq^|gݝc!Ŀ&]Pl3;;/z8_.Qyע0Rd\8fytK6U 5T2AA0.D [P]DHG&S:gqt}~jX^Ĉe;^`(ēk9%Y5ܟ:4R 1-%sJmPK*8PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_write.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U| E darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/sslcat.alUT 1cN1cL1cux Vo6~m:K;Fun=ɰt (DBeR8^}ߑ-;N&HKw)FiQ3I4_ 5E&i%MQTf%* KEMRoHIoqzç'Eө4e$kꟶedȞu ;e _D]d俍/+jI)օ#(ʴYjkC+k:vYG4 e_Ǝi5^4aʟOrK/_En1T?-E $4wbR n 1ÿKN 7Ves *&6T+%S[hخث36FQ cĖ~QwSr1+ gQqx Q"%]VFmKls#qNߕIS(LN&OENCkD*߼ e77 [3[JW^$ Qx"ҔRzT (G4'QL w iu?ШaXD;rh +$]>x9l `tfc"TIufOj B VӈGSaP8N)/Ai790FZg[ۿ9OÞɳgT^Ro?$77XqBw a4VLΑa+Ͻgaz4 iQR'ec{>?2S~%sa?}X,Ś\"QŋYXɏ4IzbGq =TNQih*$d4 q 9 qP]ڍE<%; r;T,#{{×}X Ĥah5V>?YfOA^Kʄo9QBak 0wmzvqx=2mjDѓZzvj%jprK] uvR <*+@s h5S`2[Oh:HzLoT,eޔh¸ʽ1Ap;Wx>usLΦEMCHW}#%_5M8ty+lunzO:p4l ƸeЁ#[p̓C7z!S]|<.#,0$F+ 6Lcw8Yv |~C#6zPKkv| PKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._sslcat.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UAJ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx3.alUT 1cN1cL1cux mj0D!$KPhIH{+NA"$,iI: Bi* o$saIӒG/BGᢴFM\:2ci<1 TfJ "l+&ɏl GӚL+CXV%f``'=-\:v!2z1c~}/xzw&R:Γ,[PKeEAPKq:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UG darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/http_cat.alUT 1cN1cL1cux Tn@|_1 Vj+,Ҩ/U~Z Xg~};1WY.8e< lq0( CPi3ݻs~~ C\Jl1GԽ;p]QX̒y!B]sv@l>BL*vuO28wR5kS5B0FVmN)=J?.$T$y̻=,Z&Bnr|Nw =AzFj˻hU-M䗚g9d#rZ.?,{?{<ى(p"uH)Li7ȥBaK@[kk2N<o B}EЪD(HK],#S)˜QjrueSUh0RGL' a"MN9B; GWW"bB1(Ac dX\y uecB5--#g:&ߕf [#EQX8l2.PŅϻ&E|05ȫA c~R)f{ Ǩb i[ VKlD$?)Y(Z|`hHOO*J ˿1llf琩 sL밶kHr*>8$OZ?cD P5*hc]e/ķo ڵ#(Yq(U]S%wB#DO9bҘt9Xmِ:"$VBAt.:I ᄛy@8r [ 9gg4I!^Do`qBwGn1^E( ΨJ.uA ?YP{sIݑs,3,f=8wChkُ~lUԻkzTjEa3t[s'b,7L[B~G=-uD{ʧc;]n;ȳ|/Y6x2C63_cEƒ̀rq0'1ɦz#4Jg6G=3<|y*u(.W{ ^my t" 6%[P~Q-n$ثjҨ(^;mlf%xk|Ų;I$w~7zʹr)Wfq9 ['F0qj(]?nZ!ytqOG2#/5ЗBv,AqČ nrsEq~zPKAsgPKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_write_CRLF.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UL darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_CRLF.alUT 1cN1cL1cux mOJ0+ZUOݓzZVDJmi"⿛Tp{aXG3P{ryYeXmUK=o$DMu:RAX-*K"{ |Qo ި(6ER(Y,\NAWxSm_vOٱ<*'d qvGp4K~'k)fךTc1Yް_PKKlXqPKq:UW __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_CRLF.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_http4.alUT 1cN1cL1cux m 0y^Ux=ԻvmiRwU<,,3;;nXR!/T QPϖ\w?|a E&bBJ*BDP:\S36WAZe%$B:a^a?x *4fSRa,h7Z3?Zo C\>괘-#|%ؼ۠^.f0Ԥf1{PK)~9?PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_http4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx4.alUT 1cN1cL1cux m @{4$r(*6Eb6.. Ia|cMR49"%= w$~*:%\ĄJM*ue!*gl(ZHM:$²v|,"RB]iʘ& '1zYhgZF)S\qB zVZ x"6t t8ol8eoPK+?PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBJ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx3.alUT 1cN1cL1cux mAk@+梗AV ={H2qnn7i C{}N/Gw 7qN|bz&\ )q7֢bX">D%3v[ǖ.T3")Bd8|Zb? IyԓB3}[dg (O6[f5R:2 X>sE `t:sm785Cw=y)H6 <*!i`g^)^QVt'?dz.faxڭ.|ad1eF_0֦Id[KA,^^}~ths΃⳿_+ 2ZgG U@ïcɔ}PKz vi\PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._make_form.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U H darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx4.alUT 1cN1cL1cux mPMO0 =/ jjZMr[*$JҎi*d>z{1*[,`D yU摋9(MߐnCYdό5jiP!lʪ!eU(5kZr7"“gtEV({QUr=  7dgQ!}*p`Gz ' x \]RiiT- `0-Ar(Nkg?}Yzdq~8Ȳd<Zy/4g,PRf/OςE{sGml;$*0Icox|".ac:oi6?PKXc?PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_http4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UBI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https3.alUT 1cN1cL1cux mAk@+zIhD eCKK[H ։.]ww-%=jza޼y_qDZF^15r%x8$~#[G,Ħ$ZB'BNPytigM zHgDxlpǏV|}qߴf,TR,XZ7ncSui$2`1i 3.?< yikL98,YPKųmBPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_https3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/SSLeay.bundleUT 1cN1cL1cux y| ?UB8ľ-N8ARkkJ")--UUTQ(iB$Aj3iKu͜9I<̜\3sus3+`08 ϛf0$*w2 8WyN׀Cc"mL[?6vצq] q&FF on6[ރkˇ7Ѷr ղMx#'7^wX7-Q|-Iv 2(r]\u Ɏ1bg+&K҉oGh|NbE؃gĂނll KL;5Zںy>b/xtS¥HPqvY 6>le[U;o|;IDށ{8Pڔ[ 9mꩱKm;uZ%H?Dœ8u4`ƻ\SkФ͛2>hePUƿs.w|*X/oʅ&҈Nl%-&gp]/#/!.0;]o禞k75V9;wԙ"jzqD TT2aӜ%mlyh[DŽb7uxދl3hŧb[1Ons +IR1ndx;tPo/l.,m/=S@* _CV-r;(koCdsAAo6hnvY:FZSomM ٌ˾~z8ʣuu[7Ku ȫ9o ˒Csf'GM=5)nj{6(Ol)j-N&?{JĆd,[Kk5ۯmL67_,Ek~Y$^ 'Z5+7'3`OߠOFD5ìm/rse{cS%ly{wNwX#ӊ[epPa uyc+tةNZJC65en.`;v3w ZrF+SBrd3נ܎a 9M_ \i֍asƐ&Kg<+)(%L&m)!H1P#.G,==LyuSTCd=DaZ"E,1CH5ZX<ZGo3{ w־5nMgԲ,iXa- *%$u(Jvbq 뫘 74`Ē){,LS~J\OVʳ%d{E>>bKɺ$~.i6Z'Orlݟ! Wlyc.(EY"j$m]EV!Q͂-if*O]gX|?nJl я~A:r3_m*^#ϯXr>2Cy~$!'ʹvwYĩtkڷ.gN\̺o+vd1[yU_VCf{ĎfkXOš|l (?P% QU\xg!aRkcJǾY( |@Q,REq{~b,y¼jҊ:g {UȈ磦TLjZٞiؔjncVbzM#RO/k~GJ}P^Q5X93՛XN ![VDJ0> a;x ;e1|b v d(¥9Ҝ^bdM}r? T6A٣LhUydhX:!P1 ,2PyXV*V'}1* eM-m8O6<9R[~C3ۢYh{n-RȁPAd{MwbĿv2&@&j{juݛr|RZbiGlo5R{(ʙFASp 17`=*H4wh{c;'͖y5EÞ5HG2j>LlӲk 7KcB ҭ;!.R2椿3!|]IKHș䑐c>'!-!5U>{ȑ f>!OWBB2>| h+k _Kn 'dS,R Ǡ:M_B}Bmm/'aGr]BK HHj)8nP[ 4偒Udh'6))6 nRS~$(Uٜ=򞣵wdƄd~,zR>;Jg^y7)<Ӕ쟫D5P{S $Mߠ|ƄƧ-EoZA'Qh`wE/'򿁚tI]i%h_?-7<&p]ֱ|U:a43;fעS@knTl^U_O T~O *%٥*a "=UW^SkʸZMՔm5l}}M*؆70ZSjJ5"*"-jS58Pa\y ƕ͈|H~"5ePo){rcM1YZz6YX"fJcuE F]ڊ9NlNPN^E6Jvw\ %+I^~I:fL?Ns]&]u8rٶZW˶je(M+k}+jPV  KVjI^Ց phֱ?Gl6kJ9:He~:Z׭c|e~1,,L92jm)e)3j;T @/D>"2ˑ|Ad:*GOrD"*ǁWR[B֘,a&KPS6D . {__ɬ('kaGC*dФ'0*pM-n*}*N4 EgcEwMXK1t5Z<;} 6\o+%‹RwȽ}+E\Kײk͖ N+,E;nD \q|1N-֟,:!bb>rJlgE#,ضRUo?W &KΗ/W"Eq~BR{"5:3?njM|kjƴ|J[Z{c!T %->=U0Re*wK#vt;[-FˇK吝kP]gk~Cu9wƒ_ ja>P1 1Z۠^-UNI5"N!ֶ^ƽW=&vƣ!Taڪ "Z!^Z9>#M\UV-NfˍW_^+c_p3Yy*jή!=p4C-S=Zg:UթOl­vMTC=PE3. 8k9@ӲAw|CYWY&AgX,[282Ut"hD~Dh-G_<Z֘Xzl lV ]?'Q'Ϡ>y_UC¯C|[,?3䖐k ]]_f&':x;mK=`d9ZƠ26 QYdK۝sUmwʏVU{{uqh[U^眍 ENnQx^8S_}pa˽pXwvE\'妉RYG'ĔX2#wdd [&$!'iy㜷:d ш/El&MⓋ$6paZF{`@yP?.S :۪n|_EmlbywZK|{c"K!o[UqmҨmэXӍjnL!۬49^-z7<@2j`աnYQ7ln|Z;ene|8<QYn(Wu=E~Vܼz ULXA^1kM㯒L+FR7[%Jͬ,E7YR;#-:x>!rYRW=؂uWRv}x-GzUEkUtNYT/JQL%JH[i^4\"4%Y=+S+b%>vcYuqQ9fD/7fZ3wqk{E7<-8)[unr{wQb 4n\?-Èg8 Y_. N2m l,od3Y[(u4wbaőh>6>B[1Kĭ":Y1PPT0ʺɬr UX5%=~~HPb O0-0GQL+io_N*$+]pmP9Y0:tq ZbI9jrp-m=m}4^))VPPP )ԻZ'ePig⥗.+k18+Km{CƄwuwV1vw#<7ή(";nW!c S?GR '>~i|Q(]A`uU%+60,[11Rwмl<9׉8mSxyg1 OuED؉N+&:Q|Pi46\aKY]jMי&Xؽ_Oͮb%4-PmsË͗i[Xt-P,[\8Aa܆]~ڵG4ࣞ.SƊ;^X/Mw-os%t|.4/զ>ʅMOQi $qGrȖ7|:g^y1OX[-@ ܛ;8dG1PPNG^vlH'%qڔԓWTr҈\΋>U[JP`KTrR)a PlE_HkUHPETJkqD;g8\XmVL].+ ܞ%kY77Dq )9A o9maN9>_]PND<ҏ2("Wh R&@FCs&?{i%uC.vC%qyҡw/،{\ٝwQonbXI#OZ V8XL;VgfFAnX z6մs4]dǸQuFu*/[~IYh]NK3)v7̎'m|*..NN❗rsY}q\6[P -iYQ\u_*bxf1/۸਺\Z1w*跣?V/WEƖ*7]Fԭ V♻AQEN:6H6(55ě k{,_xW9?~DF\4-:8E?& 3SpTu+3֏~,MDAx6/N9+<~mݝ0K=| r7o[R]/:==zt*j{ku2͝z0M{?[7m7eW4=:MZх͸49ѫ%55嫵%hџ]ԼUľ6:4#nhFWY90&p4G Ds%ϮA3ADzl֣3%6nǢMגGF_}W,GMifKV& })c UVNB5BqB5P]P])&> W:(Z(L+Ue+բeZN8J -5T%>-Mz 7݃lJ)%N5\v$bGF$ȗd<=玕yY<#QtZEӜY]Lj+ JQQB\5x63s7,POT}Z^ (j@QI=e6{fͰtd |M` |l2 lPsWMLsEdSqhrhhh1hc&kJc[D]X]qrAvY-[? FYb vll̪ 6nw)-*9bwJgGKЌ|򲞁~@ iP[~ k/E3]R(a!a|/RHncj;啲_hV1f"3]5C2?#sV5o9O2wd;[O`j*H^8^~^ɬڭ^P- ^SXthk|lxW~g*0Mm̪4t)] g/a*[QQUakCF,1[(5bgDS+aw!w㞳pQRR>49_ڙrc7cx󵫤Ӯ{jȑnZ_yOxOoXmEEURy>2-> *6#JqQP[ckpozPk%k{} ݼݼ*/6Yp!BofVnut1. {ŐfϻM|c-$[]e#n`g}N[iMB^CS~őtZVl(7 M)f86@mcݱG)v\| ا#k45ߤ\U6oiCm9n!w9Ɋ4969Ir]~[%f?cuYgc6ɓ'rɺ(7EaQ /5&~T4SJo164cݏjO_%%&fdM8 ;\,*J#Ԓ/-} Κm˄Gbscvrdsc쭱Vb7c@cu>NزPعFؿxBiE=ϺG[YUN/v?l>bQ*7YDwRX.#\zFzlifnv|Hw9CX 0%&x b%:M5R~$=%yD<.?Eku磼M3S3u{B92kSB}'nvGY-=ګUDUa}LuWд+;%1tǂc}ti0鹏TbS}[ 5_@ T>#tK[h9hJ<Ɗ ;}Ru}mRSԒ^qʼGjL䦻啻Pinp%6}T&_ojtmT".ěwYkУje:pC7dl;sxg!;tMϥaīCaW.%IjPK7T~>Uy EOw="}&28[K7C-yeZT>[tyϗ>Ponb\OC"D rΑmfruuCHy6*hT9gK=h';t?nu1UjץJ=:*oI4|ព*kkuCR+[/i-Rad{>Y~nOKddJRq/hy{y%K}z.kH)uȄא iD69߈C|'UǁIVc Qeƿp.y^kd׉Y$$늛-l0jҵAV$٢x^Bq2^yF3妰3x=ֽ]Ŀ\sI.Q}]IK|Փ5K>f8?!tGuCv|=qS7&}՗gzCy%f2Ȋ5 G=K}!N)Ƥbm]]g;a?\,&S'cR^f<`[a јdvqf>vqI,i:#9%"]K34\gz Oc+ۊnNuo7ϵNhuONR mq8r+Ygӏ%=`h| It]ӿH^=L-gZ׋h]ǘPg 9 djqv~0O*8 *+(+:NL؛47;Jbb&+ONl\̔s&O`89zVevFY緰d]ZYdEst7L>\3% MsJpsbە娿gt[ktw8&HF3i +*Ѣ+qesi۳=cQa Ƅ5,bnroqd~%B}r9r;̙*->+;kf[ݖb(lS %h٫1 6/cOXޔg;UFעIO>lw 准m)SJ3Et#ςe ՘_̴n≺ҟ˔wⴾ;|,]oU@&mb?PsrZH?*"\:#,wz]: PAi4̒umuA]fc\~pS{v9`GMhۄ\o QR8bm֛X_0Wchk `cI`7֌͋`o v'q0  Tm{z;r1$Ay$& !l/QxTS^&]zh) `o d&vlXa`ҦTID'3֎v2Kjj[/m``Mh] 0G/`Q`J,Ĭ``Il0!`̗X+bmƀE&JR`#/ؽs4.Xo =M#lb}Kl-X}nK$Cl X9K%!`N.XmbuU,j.}%g&X&_$o`I`m`mVVc K|/5.-Abň6}IJπݻ*XN% Eb} ̰Mv5{Hڴ;USe  T ] :7isN"XI6{%vIR`I#M`(gTvcw'gcuݚ"'^`+V?Ub ے&m`R3h`?*;pLbK- )Ր1ƁqRb!:*;Ğ{`XKRMkk  6]u-$Zt(+]? v2$;`&J7$ؗ`-ޔvc,`.ܖu fH* V%"%+$\nmY ?-/h͇RfHb{ kv3$vR'o`_Hl$`.tyw8n%Ak(bcVܞXl$VXE`r%8 }~ێ} 6M*8bFwXob}* 5VSڅB VM!L׎+g1Kϣ#WA?Lt hyl /ikgf|f[Db sK6J)`ˡUrvߋdې=k2&O>ݰTXi+[ 쇲NZLut_An(/ $UE'C,`RGGl2_%v؟`U:bU&iĦ ;P]b=}6lhM'/Gm ls]=v`ԓb՗bbKڃ-m(ƂkĂuHbUDb9{ZZ`ͤD:A$X :-h?V DK$ 6j%+H&`wR%E`Av/N5m/$b`I`%Jw7`sM*c[ڴ# z|'iU[Vlkz a:]9%藠HyQ`J;bߟo߳nR9X,BXO0 RzCN, Jص2-;YNIt`!`J,P`eI5`;Ni+O2NiQA@3J=v7S`I C`E*KV =c'g1' y/\:t,/Wk(-|HHo ˔2ʸ;৩"R.: Bxe}h hFTaRJ/O(pٖd;;kTbe:R׬Ԛt8:нGK5X&eط`?U#$b1`ʏXWb%XMbN5y=={LC8K<@WJl;G` &Id.y`> b`H+mI5Xm1R'V)J呂WM_}{B haе3tZ븄2>8̒f q`6ϖX`Y`AsH&ؙ{L vl<3;6v(>YOtYЎ O'vE"s׊鏠{.6:`})1gb`&إ?>"_IWb|} rrFl":k 9`k%C,X Vj<#;XiRĖ!+V<#.ZQyGXu];A SZ#Ǥ8J#S'$=]<)Xb3]Kb= io <ĮqH3`^^byYbK-; %$GCB;)6h'V@o~]JJm=Hwwh*诠R[7Zˉ] [Zy `˩J,Xg;6UٱJnqXZibg`JV` s~Nl.X؊@lXؚWҶ5'l4X7+J8H[ouy蝛W7~u@A1gG, l X1g[f%swQƀsp)8.Ѿ9dF)pQšA;ƿ)zniĚLd'R徒vb`]jXgbavlY]?Ʃ/*.h' zĎծ"~3&E%6#XV$+Y_/I1dPW6Ir%z_!X[-%n`Rj}AlXo;F,4X{F\H,vFvؓ`ϒ=Tb;VN[OlX f@vT  VV7q]Zh}P#+ ְXQ[~]#!%?)$O&'?>bsXbnTb͈ObĊ2@W^omgЫD,6؋p-'XPEOIIJ3yåB8J_o︈(&v,lm!l?X8}Nl.n@lNI9` Ċ+R>m^6]UϴtWЫˈ-[J }`I5t`/bk΀ mb4`6H+F#`E6JjخMs& O sYblV%lXFl*c}v̚n =.]]u0Q#,{LU`ӒX P?$W`]H3b)QH13XmJXi $Gw;+.%b^@&Cb?la!f v Q ؽ?%VX 3`>%/?!Tbi`i`2%ط`V$b1`XWb{j 9s[rVb]`$N`_Uw*@zzE'6Ў,fZ%=GbĊ&U`lu jzޔVł%Hb&#B`h۲hՉ -]+<[NlX(صJ,‰ |*|<ӵE_hqB vC}:ȬGKRZw2`Ƽ<|X$Q_IܙXa6}4?b~pr;- EvyIl+`ֺKl.y`k{Hlpo<]l-J(H7B+$"V,lQa[t|OƀzyK6.'\"ЁRF.ac "/si%V;X2R&COb UVMڅ߂$XEեhV,} bRRđFZGھvĂjU~wQt)hOoKYp+@7nboMu_[ ҍ%IlsCM$F+#$VXM;`W[H,w5.=o%.(Ym$LO%6|3`c$NlJK5`_H$`GwR*K*tb~$5ľ[ kdbS+Eڅ} V.#kG:d?_\ö<9pOig~"3X:$@l؇}$֟@`;J``$M?ؽ~U+_Q^h?`Rb_+6D:c{9T`PgШRr*,*Q{,{\bHq ~lf vxizv gR4bMF 'R xuu2Jw0o@R?Zj!m^}x [ 6gZkf X1b%>s!53i`qR٤Kcm5o"Kl`;gK+KXMb+1'b.`[$vKEaT ;y[ ?QbC +6 k Hb{-{ Z/ 0k>Rb,l ]}'d{VjKZ %o|B&Xf^ [4U`ӱ0m.O d:Vޱ]YGz=aUFl:XؔͺkA EڧjVnn1g]`۷IK`T BWwHJ,lܝ. !6 +5I @D{$V`~؃`V 6,e2Ҟ%l*M!6 l,XJ6̔* &ԍX`KYvu`=jo5:&hOOHl$``OJЎX0`/]nƕ ] 2y_cP YL#fzN-`/8^X )`O_؇ĺe\6`7#1bn`6]/J4%o`ޔb ;'$9!P5 5/Jd"6"ߕYcDM&v?$5X:$6X$ ݙڙ t69ҞT V /%bFF` b'}`pU+'mI}նCƿH: OWR2>Ѫ[ܤhmwws.,Xm_΁}ZPbbV` I+LlX X"vr u{K6IJ`_z%5(% n7`7"NRV0?`h#Vl(X:FG ,JR#C+Kl`}VEbӈMvz%Cuݡm [A^+B|k?KqnSKJ΃5-mVbZͪ+Uι5]_[i؇Х46&``J̋X_bY"sH{D,1$J`]H,`9Mm %8fR*ECł`cO@68AW 6s*XeӁf~L'|?h5V܉yMۍG>{#hˤ;5^8?'=^T6jĚk 6l~pT;I{A^Y* `a&{$`tg`~*t;vCu$ ,|UkCb/gB`R$vi0X>Ҟn& }+EMs.`7I`^XSb> $1#`>0Db).'q0@" lH, l0(urՈN6Zn>b-Rl# XWIB̚?X'?bC("'h V eݛIҀM*H !`4}Kl-@C!6e9Cڶuo Δ&VlS\E--q4 siv l2XRM;ipb#Z%֖X;^ΗXb=M\ 3lX;J<}dľ'<}kDbf۸TwZ/QXm`gVHv" .Nl앗`VIl``IuʩZ Sǿ[Vb͈sļVvIJbi7W` G\&l5X&Ef 5-N&W`[%; Km;O}.I_Вt韠&4X2Һ?%l {$քX3앎Yb`_؝`Yw?]H&vl!X[Ik;$UZb``Ҟv&VUzDbo7AI`J,`cVbP>ǿ}J  zRb- 攮iqQkxHnnDM1@wQ8Et7h-PeAlX57AlXwt->Eo-I. E8`2Ҽv?^0'\zSB/уk_V,iin\iM:71a!ٰ9|Y|%4^H_8͐'2&Q=1wMĿIygZܕx:oF>E1|mZ1VEm,=lmRT()j1%~dcogoqaT:DsK|9hX6N)> /fwJ%T)%E|W0 bѶ>W=~_Z`L 3_ol5Z;U-f[~#Z(Ǽ^bl2kTa^AA* fk݃fЌTe}_TG9’hnWDY&j2?7sqirdmah^*'Ӹ+98EdUB!,wH&׶f6{)7].}tT_~'}PPʎ(7CVeNxm%RιPS>AC3!}+҄KƄK~Еy6CW(^j(?ЗAKggof%2j(O'^13 ]Pٯp`?oj֐0ːC"[up1XO[|+2@)>kFXeH$dnGNt>6e{zU?Mϳz|De]N+˃tzpV#/ަ azI FD6YȔdpk )my Dy45Y2͖1)/@HZ>ҷqnUSk+Y%*91QyYVb­%p9=*ԉEϋ[MQв}x?~3Vai.Mo?|u*>v,mHy֎oA-j {57?7WYcug"3r3%ӡHۨ],CSn6~p<VIa+Ǧ&h7Du\SLSk5.ݭSu~:BJSKZt65ݳا){}7tWv ˎ;ݏ5E+)y)=[OOS9^JSMǓMstyr~t}X-?O|ӽd[N/haSc)O|t7[wy[1y|=}s]ѥRO/'LDH~伨1ҩ!9?aZB*%>ϟD<7Y{d*uyJ6wL%{ Jhdyld-J]dcίd}&dk+ٜIdMI%rR~%;c]ɞM%~+Jܨ|KvnJ$d'Ye'ג}eWJdGK%{$*}5쪨XQe_Ql(E%gl|K%{=R+sylr-Ցv% RWFJ%_N?V"cV쳉%{kb~%{t]VI%'lN(ٹg_KDmSPLN]f5lі=waLw҆ImgM2^ێVlc1SgcvbsemqDsy *R&C9CjQd{:b>)Bȣ/|O_'Ɗu)S!щ%_rov9T\'\q{E)ׂyO] Sb?>bѧ/\%7<6޶Db Jx*y\`yw|fK/t%>1+_DfW8H^R:'\d`  K#xۭf8~>lZSPk?_UWTm=-/6{c0>{: =C={?gO2:3.{YY;4٣QywXBgloT^Y؟Ek)ihbz Э;4~UG[bv*1b32{ xqHJL3*FO.?ښږjkH[m=2 }d}^jm]}RbT/S?G7Bׁq0= *x} j;ɡ` @?"QWw y\y⺪uLC);vO׭TuމӾUuq(M{(_СiPw;wx> 135OՎ#?Whu0н*T*FU˪a?.!{dw0vGy}R3-gda]j[Ffߧ Kȉ 0CrO%܌ kǧOSGwÚLe$+ .XxAka9\]>T_X'5ăhh^'--`6Wp~=6uѥy^ZXek?>)_"gdgj:r%آ_}9CP쓄!gVE)P] 콋koE۵ڻkoZ{]{ł UI& gs{LI&}ZYSA7Qwu#Gg"ON3= 8 ؽ~JI?嶜q 3pS},R=Xxc4;XH~M{[BpGOe51q栕TJ4G#pڧ5*"nj2v;rF$㤤ߙƤƄm[v;S2G/٦xX oP/^oX() I~žMzLz mm2ExOҫpk-NH\*fe6$5VWHX mk]${{(:ü=C=Ԏwt{+pSN 0 k?ƅ\I&NN UZ֍ށXYK>Wt(~vD6QzWM+cy6GgVB8_`8tUՕcߣ# ͺpuEpp=Ug8D\וkX+i]UX\_]x˖!߱ڂ(-̦ZQ[WDЗj%D`Y'WlEKX2UE;.YL%)M$Vgȗ/Cr3!_qu!?$8ط8M at@ pw& [gn"W5VΝ8kΔwmŠ-5eY'A<2)UOJzӲ#I3~҈Nż&p MVQb?b82+ؒ+N+ N:6(0 h&OX7tTE~iGO(ܑ/lƈ|/Q$:x"9B7-,'-%P^etV/g}DjN$>C$ޡCN$y{VoIF`L/|q퉸mϵ:7o_WNuWhs}uLjw;,ʾFȾՎo_WxkvUxoGۢw_5?ާ :{z[xÞGΒ=b5n˺nA,\zBZWJ/̔c`SKAJ7ǡ2rRuR!{45'mxm1m̏w6nFxoosj?x :5J wx7E|S;wI41ւC}( Ey kk5W5?gZGa+QT+=Ayz8lTq/ѥG-h!ُBWjf?FMIK*d?6UZُ-shג~e?1!])Q'1_ZDZZ!B`;nyÞ+-۶n ʶXSCP$5(`?)|qj5ajל'ch)1!8 |A (^Z9WrmQ}s}5R34SCm:F!x"ǩێ`t3I Af=6!P`f,܌Cg:J"=yEȲz_K)V TYKjS^Sfա4/R`U-!TY-G:"VcL zQ-՘l@jiI1R94&7"19ޟ1&`cr5EUK>—Ǖ JX_Z MIB q#~u?ء@iF^@D!ȯ 1@?nXˑb8k6j>tY*J 0.I^Q3DCkz"饵13GA0{tOZnS0!`XdZ\7!na"wBbhUY/uWTs3TYUG󕦡ʅ?zD- ;XGJ]?c- ӥ5⋌NI O嶛 ?U]}Uy'z_p!5Q&8j rڐqC&n dOhl*V_ [D/LܭY E0 \~(~ Or(P bU5g_B(jH[QAf 5]Aʁߠ,o&o(,ʧ# *P'O[>8;UwbΆ߾R(`IĄ^.SO|+)oeB#AIKwtuB7Dw_ͷs}=U"M?ڈuMc)dn[IJ?jueY9f}m!˾2[̲eGkXvCȲYaِZ9`Y`-˺y,cٰ-,[]Yeʄe*,[aaYʄe*,w,' :TfX0 lLi9 [oqE2]{Bj/Wck/.TSj/4iw5"Y2T®Tb.sc4wj|ZM4U9Wi|h^稟K:,=(`.Y:bBYQeicGAZQAQd~( =Wg(@tc u=H;A:k6(LU@q3BA~tb"}1 ݖ"'dOw=ESҊqtzt\\Q۔bOߢТtkQkqEE:u=:d{q:nnJqqWD+^DJE:YaV]/,q 0lb2bi5v" տPbP- $K>0w*SL:iT@{=XS֒q~0%,/FfV~xXF9T#g0g0<`|Χ*+t5?i|,0QĀ;Y` dP|,y̫fO^!0ɻz10O!`>1c^|`jL"`<<`ّfe WL#Jcÿ00GLrj_JakRZ :5Oaϕ)w3C#R*/II+R.%X)l%wb|7,寏"|],T)/bŗ:HʏZŖ<)ߛNIJevRR{[r<"]r{KV-,)kXwfP}O0#-IHXRB o#)eH+ —ۈjкDR*3&76i%?&~b$5I04A q(LM=lBڄoB У>&ge{[h|hkq7;ޡCZ9x z:/ޠ1n8`O.KO7uImA'|/;4+?DQf7pꗁDjA@Q? 7@9U?yh7@C dv 5#Vnvŭ6@obճ-`ah zoq2i|Ayʩ0Set@?@T(g`-]~LLC?{Y(A; }AN2)rwwZ(g<@90C?9.2(PكlV5T(~B  (#Pj |,8邅o jkBS@eIn`'J{؊/fj%O8+JH+Ez^s:NBw\.Nzt-u+\j`N|565 ߍxy컈.}5hP=L!O"=`U{'Jc pr6C ϡd4= 2I ex| :lʇ96H_<{x`PHʁ}_U^#hE7x ;>xF6>1W? Z'|60g)@Ag`lf{b4f1)>%ǧ(2ĵi-]{>V_y;a|&sFOΩbFQODL%E0BBĽ>瑯K $G҄8DF޴K, %c,`G,0꣎YG,P磞YbrI^NK^T9qOB0c<<*T>3|qKjthܸxܪP-Ã~l  o-{ ī}MX~j-)+=wJCqK@Zv=u# ~  //o!ۈ{^(oyC\b~~NH#1ͮ_pQC;>`R&s6n*wm:AdeĤOj\ؑs5͖OA:9N3q'OG tLӴ*=igt5.N |D9Sitz);ny*NoBC?)3޿q!||)S.tOt@w :s ݺ' t P{K'Skt^OC,cЕH@C1][("A􊙏 zs^}XkZѝxS3ѕ߆#,Gpxë05 Y MO; ԕ~Č`D]Jcxď1~$1bL71 ӎT)a̠=K#v SL!dj]d ڛJ̿LqϿlݿ S k8Ts)b«YU)xuԸ֋.qO&+]k9v \f]럗DKksq&ߠ}k/v%/sɼ/itI/RWO_Ey'4HE/rlh1]4lYG"/ E}|j_] =Э nE^A{ @WD tE/yR.9.75tg?/.a uEН:Ƈn4~#ᐃa}g !kAO(uC3hB3DH4i^4 8qZmͷo>m^ &S-ؓVC@ z+DO4?MLDt;0zJ 4OgqxSj$))wcT9Uy1U*7cz)ըwEȺ.v)|*Z(bT>(IŨV79rRTMcTKfj} 'awt!|QK%[&bԇ c?P> M>WO0_v>z;NtA79֛L nQf(9 ? N%ܼv"K?GRs?&cRD#E{址 \XaB*Ò1I $TAB(A M!9m?%E2Q x& ›!8WSaqV> Wk #bAе/ͷ}GF#|oGX:":S[.z۲O}:-&ЛE^},zr鯜Cc$wnXAr&!$EI77\X$7|AkFrNwdB$_D#$n$HErFH(@FHC{9A($. yvI' K6FrІ"`$X<!RW$O"}y$MH]ɦyHYJAz ^K5HZ'Ddet#n]E:u ˗`$댐\XdIukH>[kkHn\IkyH }-dkVd6K&Hn^"d k$.HzwBHZ(Drhd5jkHXcɯH>XɃyH^_H\Arj ɔ$"YVA2nAjHڭ!WH^^%Br* 1}: $ ,"yt$\E콊dUX%@aǕ<$.PW2H]I?.?" 9tn$W"+Y$ +EHA0CHgңpl_-/-([8[vBɖu@ɖ5KOyΖ5oP3NVɖ=Z#[vx -=O͖-]AQmZAq<&[J%[y &̎U9'ӟPoYf>Q ZntrA0%dS$Ic +J4}s|%c˹ZgX2=Wm:}h\mmӲe`XHE-~%ce9\2V|+R]? 89[X>T/RrND ._ʕٴ/ae ZC//b9(ݚHeW-!ut%bp*6ЌKb:KDe(pHq ͡Bs,!nC0h^YGbh_,Bsb=h\Cs, M,eShEbq6hբ S]hn^4.bHfE40A-[f 8Yp">@B[AsBgRhXȢb!ԢY}a6hEzN4- /`\@4L͑gͬ90 T(k-BvX.@2גڟݕO27L]qW]_ω4Ŧa|4E`w\>ov5Wd:c{ckCA\0Vkn#4zfwFo994z+a^9"7c6c6Pe)B(-{c(V<:0[ez̓2d e,)Z( |7@/^?3sexʐxU(c&c(6R^X_R￳6Y1EŪŹw'1 9f^?,0KBRyЪ=I]=Nm:qJ p)h,r$N}=\ũ,b IxrK3&ʘ_:.'9+űVX8s&Cf1x9D9ww 0o=L>aԞy94u@|ctJ4f4" iff! J3)h6'II1e<3Q!YdN;=`o+W <41u&= 4TB--+VIRɪgRMO*p U#QƿGI3"?Cy4-2>-"i0)P|RLco3XB4AEk ,6CD~N[#d5D>7p;C&UO çpRN է&錌'x8 ĝiK8HIewZݔO2Wͦ`0d'o90ļ6/Kq눸=vߙ0Y5N|<ՠ/ `z}N5N~'M,>qu;x;vD6ۿ=  Pu AO;!-OCrCT6dBC L@lzT-[4mVJv|>S~&)EsE02-A¡2pϔhA2`]] RhK4u'5ufCSGȷ#d"&s#,9A;ί,/)p8-:vE 4UJCňQZIq1lT#pQ_ 7^KXS5<խy|f29~</T[*{?q˶έµOx~8B+(I𧌂Z8Zke.qflȞVYLL0eog(yye8挟TjO%j4,ir>QÄcEKg5mHC1+j! _ X䛎UEo,_]NJEEˊ1ˆ1?:F$1<_:XNcScx)(CT1+ѩ&HaD99Y;Z$Gofh̖C߿2͕̞5tw#GQ_xQg i=kϨ5TwY)>F)*O=`<>#FH2I##u>#/hFHшQGlGȜ!ѣ#G4E GLѱ#Ȉ##fD+FtH͈!3I(YTy"("'E2%`bYo(2vQnv|uJӌ)͎o4bEs=76}[KXO&J;qc_i0tlc[MWƝH}Nhߒn^CQ]@ "QWJ_zr?Op߾O'820O'F $;I>[A[+ S>JlS5n)+~[Q<+7ry(LN2dy%n$urJ>q#9+ i0Ly*rWס oX?*^I{Ql I$/:+ UTFHGH;{p}p rf+CdvEȏHP<{dUmss@O7p{lФ!(Ķ^ɓ7BPB(yr!*bT1ʂ۬ ce1jRTpˣփ Ԟc/*Sk0OLɴ6x/CC#&Zj!zsr 4ŝ,$@~Lm8,Ҁe)]-n8 ?5|( 3U9lYoy+OJ0EK{l7,ԓ GhAz(g.鎨ZmJUAYl#y;@n̦???Y00Ko@؝'uڥ~j탰^x 3RTq__ p HGNFr/# FXH gf6nj!&D#E)XcG8g=^>H:-oýl+Փ$}{ݑVy_'a9U"( _dwР[ڟ?]=LC_Qt1nc :q _@;1 ,IIޙ@ ,جZȻ7\ pD!}`~2x|`uGVZ~4O?e\i"{*.:$%E #ճAWl-C!d^4IT-]ȳDdل 9b&0\]?+75 '2n,iWZȒQ1K*wWYR;%`ɓn<\Kw8,КbIn,KvX5Òztĵ5͒*KwղSkĒw0KnuK6v)KjXUcW%[axfʒ.|<%tdCX2aĖK,օbɘ Kt˖4KִTYr%>-Kζ,9g,SDtְag!K*tfX2fIR%c 50KvRYrǂ$b#,DYp ]jNmWvrQBbXU\/E~NJ IT^z#VUsk̳ GѨ>{gZ]i|U|dT< 9\9fSOx Rޑ@|ށ+0؁]({l^ڐE tC3OK^H}p"A)ae7vЊM ^;]@pC .}h L5Gl4cpl{:vF{c۫=;ScWvl}65C{c]Nx;h'Us۔ X][<N (#41 ږW>.Җ  M` c(HT~t)Uef[<פ6M4:|n1Z^7.QeؖO*VES:Z(d`+TA  m ~wFy؉mtOjC<2NC{6"FqS=ϵQia#Gt i.M +F46[Z Ofa8<f/1'íI#K(}wBO#8?€jG~6FQX;fa«\ MIcD$uۣZOM S"Ƨ NzwT_HKL۪M(c.X %_)1GZ_is(ckW+x\Yİ!Trkw܈U2X Qkl_ 1^ª!Q5`kzX^5֥^4;)OgiczؼzԘ^G^35^7^+I0K^;ԫ\e mp`T;"-+`,Z5j'QP I-K̋g{9aVB.q@=U"кؓ!D?.qcO8?H{RBctoMcO F%~s )CD{DT@.42wFu|T:qv#S[7P-%wiXu7/Z!ohm>tq/&Vvl{{vX|?+c\P20>TqhP/~#R,xϊxϊ '%2W]MAG1FD \6 Y4!#GtGQ¾p.:)Ftj@ w@Z`m}vUJS9ꀴUtM@ 0Vy/T?\LS}}TLwO~B=JLztiSu[\pz:˅Be]=U7, !e&<^X;G`Ua=?@hm[S r1Wl A|:ECUʧ;]GM_mc 44CM+PnuqdfPtcGCRH@ڬ6b=dO% D|UVI=2 @TK.k8PxZuQGi Īt-R1~YCë6?fԶ6CxQtDB4=_KZS_Kc&JZztU{ej)4%IV*`QJ V>!$WE~ƨXVXc}h{LdY(5,luMQJM%P+Be[]X t'?j^ĚԱeS`M^3Տjf"'5Wг<uSoYNzE-hlDn4͠uuRZC% \U.窳CEw %.[btҥyu>]TAYXW啷.Et筇.ytZI@o]Z[ӛGc,t]%Z\-'tYVj" F KH9g!]tRMKj|䭦.ϽXRڅK.DtCn^ܩL<]{D@m_eޑ3TI0lF?݌ K AJD?זYX7MevR^`[YЪ27:0y;̧z̧yStk>|COO *SŜOsb>O*̧hOgϊ -9W'My?iH JI ]:(L*xdl*peOz[[g3"ɿѶgʫ--M.U.2rC]Tƌ)3H>ng, {y(]M EyA :&slJ9Sqeʣo!WSIIT rJ[We7\xݩnnVNKT5W[5GgE*YriV(4-˽,6(]p,ASS/,/#-'r8#O5fUgL5aOh\D--R} RJ!qPr(TFifI?,lmr4:/eg[yܾj'GzJͭ q,#<] h(>)uNIpiuQ? .*c4; (Mt3 LECi=['$A;-.'=LUm,e^Lmr6 Vr$QRIr)zPOp;FU OTJKY/evRW2z'k%K6/qN𓾔v9h?{SIvX\7O+%0 VhDo GtG4J*QǒOuR%!jg`<[R=D,‰e%xUSSF #A:-jPNu.A"SJOux֯\sh oʶX* {?` :Qՠr)(?>)g㇠bsV*^P%'Yɬ`:-V1 1z^:a+]cI| _ZGJ;/=Ӗ\zuOj^.#]_\?g5dڏ˕Fb5ƣBz!BSHXVSV׭1?DpeT!jv'y / VdQތB GFq6(PMiK{‘4k Z}SwV{T)͛jo6r -=ɇh;Wk<4Z5{|LBc|+Qe_;6fpd 7a-N'H$5N;7fqM)F}7کcFƮ sɛDnEoB `%ih,^Q->m.)G>}b#+n[l}_kXg dpaV>-fk Vl#uo.稦Vd=$@m&'},}Fr RL$klVfjVBU9V% dFA*ZP*i\PJ<p% j1  ر!DbhbGAE"*Vopnvg}>{okJ y2%) zL:G) LTG)ǔ4s䙒))阛).ϔ⚒ eJbMIP!)aL_!=U!)ZH)VgJJ͔(˔,-ה -(0%ry0%)D'bJ`M"SmJR)MoF)YJLwՔ*7% X1%q) 2%=H>%Ř'K2&.K.^KR.4Kb4(},ZX%k/$ӖdgbI^–d'KKB.|$Rx{oO%阺8nGQӎd.Y؉wL]/]pz`.>L]0=SF=0L:5u1ʘVFvꢞQ4uQ(N] &tt)%֠%  נ. T=,˨mPT5(XjvjT骝YFK}7V.ymK_v.ymEy;3x%)sG! *mp>/*j¹ۆ_dcx6"< 8Т(Y9\K1p7A+U_}@ڏQ7HЀ'+ uі%_X'ƖK' )|dJ_&HSe x^4<ʄFL“ߍ Oϖ<9Z]d6[QZH3j(I\5jȡIFX3^wlzIt t`rz~c0Έ ixp|W^bx+;-r0\Uدz0p[_) KaEcxã_}a0|`8 E%Y>FG/B7n_;v_w2>o\?I<@'5ClMnl&-S8)hjM<3V h.g|)KY(0w? (|i.ḓb'c (~22=?ɂPd (&}P̪g,afvj^fkeÀl0l8l6qU2al0K6:hÀ:t8P=,nG :KAuW€Y++ Da@,%e^0 8ːt!]J^'tTr6O:2;˸L.'tХE.3G]JtQDeG][.C>.>.?t ˃4]\_=8MHW]~P.>oX@eaCtq ˻zr=.e{]{e{],R CKyKyK;.Dt9A"t%s!]Bc]FS.Kw,]s.otyVDz-.'tVD4tiG^,RKy˝7y˞7,]ּe.>DHSK7*]~~l\ވb%'> '66ez䤚fpZI9fJzmdrRW^9C Im=,DZrk>>u5_XzMa9W,aJ^L7D%A ףzPa$ oC4opӼx랲ް/#p\ZgHiOO ]*Ot/} .1%'Xl~)QGAz ~]X[X߅fjbwek#MDeO!cm #jDbَ)_?1߯ul<-Χ?2 |dVK$[qA;0?2sAD qȘ%U>^SxۢER;y;2nPF|F5w`7u"%vnҖ*4ɹIR<*wȎ*Ŝs+/{ {"6qZBzLJF556jyj1SS$N rT#YTyddwh`A<0oqq̣Ie'$PT< "#wZG9@|ڤry.=O5/0<"CMrQzK ,2I:49r%>B^{1{3:%rd}3G ? 93潤ra}͵ozEyFCz朆 n(ن5ưV<&U LFUɈ>tkt5)}0}ZLIht$Jקcyv)pieihmL^!nWhɥ-:_,Y{OE.)Ri`N"%UH MBnچZ* ۾מ - 7boQ=8_ ^ ~M7AOcʔ$({Fe&98i\DJ 7b$ԣ( 7ЛC!,6xHW¡Y{{ Ӕ2u\f׌J١ׅCOCxrWzr=w}&ߥC?]u[vZܥ_ZPn^%Dސ9(-)tNGE.q_6f$*Dv$jiȵnRD=U-0fk^܊j9y 2vh5x5叺ёWCkUm&'y b$k&0$1򊚬ixJLO=zf~:YS3A) HִO pIִBҧ+1}. 5%8x[qm~fmɚaY{ݦ\͗dMۂdMۢdm=ɚGd5Y&kvI̦zP5c,5eo*ËO|ޒ5y}M$%k"nYӥ|.̹%.nK[,]jݢ2>-]ljr7N]r#JDtACxteAg]^ ]dM]VޤI2./G WzT}?B1B8d5!<##ăX+!!(#Kx!~6B4>BE Qq 3BTDF%:lN]|Cνώ#?y6Av A~(?캞,T-éjl~6߅&?ۏBN ͯ瞟-s]O~5N~he~ve%?v5_[~kl~5Q~wc7tA8&5._Uë1)檎1iUάJfLrU0&*<**cR hLz|EϘt3& FF+cJƤ߯eL{^IW1Gʘ=s^HB[ ]]Vr2.k/Ke.C.St9pe]~,Kz&G*]Ljr4F]]G*t7ԉ ]Fty-K\4M]-t{¤l׿D\;ŒxG\iM0sj]2>Z¤Gqa.E\gTG¬GYwaVl]_4.k黑@Ÿ0f>piʻx>Hs#Y'D_0v)Z_X洑Sp92G]uXp9;g璨%H崿1Orěx'̦Gz޵ox_0zRÍكdtn_:'B"m~gJH E›kgLDW!^&X짞~p)­!=-ZEmCc gN0aolCF0w,I6 Qk4p] ($v"ޕ5}3/g1%>iN9.$-.ORu/P~!pw]8.#^ xpKa |(L/ A8#Q 1L'Nvh 漆).a4#.:QKj*2N;cԞSP]ϋRs ݷxa2{N (1Я9x,R=&38BB gUe`q(tQ9>&0ܕ]J|lm T[+u<@n)˨xK̦&[9`~<7/(w'm=LC|BkazvMK(}o) 9 lR$T&-P=vMrq͔"8<$͐m̞pKwP"`Ӣ996`3,) Ms`"DN@S3>ȜZyBkq4剁28hԔX~o7]rBvcت1YǍ~:ҤoJ8'*᜗ l`UW:tܨLn8n=έ2[ |Džř]8<އ5=.; _cּx3^Ɨ뎱{c F!a!l݈iRX@~GO'@sל(.rKjE0(j2czեLo.7;)-Zb+)dCoXjJnrٳkWc2ۥ f.1o‡MOC i.5Ll_e-Vs;)r31pKUc N ^zP=́rG[*#Zn*wRnԶ֡Lx9P7 8B+$4rS R?*uaR]JHQ·yJ=j?U ֡!R:QJQ굇K+\!Jm{HevRJt0W>sPR:(T;8J ϔkNguz>?txYW@:i[N7i9qtzth޺t8r6Qm|._:7r("z 8Xg`T(mTw//==YnxFiYte*oW%[W:m8P8j  sh)7_S~#ޔkL/TBo2s+NOr$;ͻ&8iM^QXoq[b+|L`T4e̯H%R]t%(;נ0 bDG|:C< nZŗ7܇rQXq2;yD| =ڹK,u"9 }\usGXX]?ᓓL0YS~a:tTA9KK23ShiSht ĵsg8{)NoWoyV`ѻs(4jI4n#j= tp;:tGtONe]=tc6j˷G*tw[nХ̢[nnt{fa@wps$z>t#w+ͅ.%.ЭŃ>9n.(@qUj.UIAwk' ]Ntd@p8Z>p_ NfIRnRZyvE9m흂; sVjiZC9߭UAA&܁ u, ת=ݤ;,Sxm&Ai p$"ݣBF#mh6$OH}j$OyeJ[FThZ*1bG<&V39&nd9Lx3av5o?֠ .k'tmI`0K+NM kK%Z=+nճ(~ "D_Pe cW@01W7L'xǶEA_ /G$(k*k!y(c©x WË/N9~X8s|Mx yp7シ m6^iK/Ӱ׶2 [y< jV#?@ v#Pv>WJw+1sZgGn̎@\nT|b4EFd ?ȹ-ԃ:$xqi%^@'+C4ج 57sz⡾ _n 6(WC=|r2ԇlb(VhC=֫}Mh.<bWjoKjs8`xm42[:$l ,@l}n&nzȐTgiJ#GF$0Sx6esD4h>&2cRt Np໠rY$T74W:.GA=GtPфeҦBp2RPy6x5@e֬SF ih # )FzzsY+2@ 䙀S5O== nk8!mOf.5(Җq ~C!{Gx.9# #%Z({{s6iFxhcS٫O ۹s.peM Hgù< fFwzӵ`q>#S&45Lw~ɻ'YJ ;PkpC'xFswY8G.D2mP)I`AӢB;-H5·IAZ9mfڶ4mv jmL.LϺb°h/l/g;"L΁ϙ ٵڕP9^>y(~u۲YÊ>MV+ X9({XҜi( ݭBX/Yd F}Ik13h,B zL@yr{MjM{!jf}R} ANhh8QV#>j P}>6*} d}BZۇL J>kS^RGCm >P}} q{GM`>bkmj{>(}Wqi2hmG>R}}|(1HӇc ݇}<Kct>PcfwOkvMDZp9>d&-j٦?i#m~lӂQ삖mJ#yl4/1U^5o jyzL6zIo/ĤWM=i(,T֟(k^lrLzA>ber'HJc{;ejϧpLT!>}LhGIKQ[G'##SdS8&ǥZ<>U41TdI?5cXLhhaP5c{}|C;sPr')}1S}L͢\c$m7Ghnα0'M'asrU6-۔ mexE7e":6Irɖm6ffLS~&Ee*A7a73P[-/{Ac *<&*nZD󬙪Xb3y5RIօ嵙JE݀DLʞ}3nL\%oAӜ,Т`“ZXsS0@o*؆W)׻c~ ĉ#aً)5%`+L6uTF}!Sf詎89oy?fUFM2 U5nIh0"' fz28C24MRurʨ]qei:[5u2j{W]^SU,[NcYmrXfLl:Ve2Eӧg Nz)mbm':Sס3^d#ɲW3dC1zmJf'ryU Lc8` [Lf1;C &0|0I'&05Jp a8tu 1l8IaI ;l'1vE0, cHY-(l >ktUGja sƒz`|σq$ϬMTIf5?f?kV}Ef?gbV6p..EG*&N5;;Nm#5NbDpઍkFpDp1dEp%#Jk3/ŷ6}5Kd)'˳Scv"cuDpSz"~j7n,k4?mf8;1zvV"1"8Fp'"G8[5nBcR&yrt] y+ctLb Q.|3kʲYSvyBlՔ= Zo@ӥ=-gUgò„F*ev YJv-X&&`ne>Z5wJ@p7h}e3Zd3ٵ2W=n 7%"ۃ^)kIkM}}q_8qʆ:/5F:?XeO+}@DaHH#n_xŔRg1EHѳxUEp0=DZmf/Fzs7)e$  TL߈jF1xх@##۹c\̧TǯWslWs Il;9~i}v4GX͕:By}j5|r`KGPӟ\F#)pbgݥ1#-8QeFGVZcѧ"^OpƏX'<$; zsћ7!3:~6JW=$c*"s=$1cX^I0a<0F/Y΢5YR¥ݰ>LY =k m)0:_c>CY w(bJ<+ePv G ƹfƤ-A[m]c_b#!? e 7UҊ![a~!jxp)[b ) w݂a!,m6G–Y$Fwk!SFYZ}Ledn((y:@j`%t{";[ަ&Yi0g,t>`h9?>1S9X>D|\ qU,{vdKˡ5؛,k ̊~ĀIccI ǹ~}qJoA4r+X*~<;rlyj/W9׃ADAK?qoz H ~6(#wWgEbТ ? 8M-rYRJ2@ɐC =M(J$C$xH>CebU( C YP A=PCr^((7Bt( yXEP3P&w'PN|MU([CY()ɟz<'{T(BO ݴPS?(ʲX(A֏x7JB(c(gS׏e~(N K~'t?!rzߗSW9C ?+;ܽU%_JMvA}qa:t(_"jRor ˒2LJgHֿNpelz9Py ~oȌjq ;;ԓ/MN`Wl!4P?ct@ӝs*`,i4É? }]-΢>2O.k1t}鵘;S4GjR%{Q3魝a/nռtm8J^bA}Hg"C#uݥƭZ84=>!\3݄dE5}mQ;#ElCo^ٿބ>Xz[ӧ/?> VrKzs\iw͊rFޛFK-z 3j&r5OǩO[9AڍšzdlOO>(݈^(Cg n;TnMY,w^+ۡuy?):佳'O5왋!=9QwnX{@[Kcyw Lwa衈tV]z0.oM˳(UMwUk˦G^]qtt̀ś@$o~}.wW~ݹw }w=wJ7^ ?r+*M?Kk{:drЯܫG {n:&tbM཮<]l/ tG\:&^(n])JǢF`lbQGL=߬LM`f-&T gSkL^mG& MO6ggEgWdeEr=E{RFu3 埉+<~JV 9wa-ACeξ{Y{sݳ!YGg{֢3- Y= Qz2{;s$bϊNz3= R)7@T{uⰧj[=}qia!_+I o_geSWĞo> {JsGY|(aǺ9Gll\MP5Φ3ՍgzGZq6KxcgsgG-ԝ/5U};*#Wu;ZwyC1xO;yف#n܁/ V;/ڕx+uy-Loݛ'oy읋{k/ )n;ҋ/^yuo%W$/u4a7M mTӊYtO+K[2x,m܀biV\YK+e-E,RKt+-YVlIt+Z`2Kҝ-\1 -Xj!`iH16-tc&f)bıi:vs[♖ڲcw97lhgar=./4ޜќCkTVoN;-ѡp`aΦQ1ݓ'Ulb&}L3fj*\j f?`N`N}#_? ØC8L c41mY c*5c˜(IƼo* czVØkMs c4K3)ƌk* cz6e cf=#Fՠ>lJ&j!ūMTw43҄a:ɰR([Q3ݚR+C#+\GEohI_4V1S` "aݘ m,Ϡxskz:?ӷ.YZTz`'%=80Cr#|uHB,0LoR1 9zmL,^CotוMkdAkRH%SP=| ɧ[߲lQT3:dO3L;#V/7_}_[Ut)bxqrטX"h͊h8Wq3po+yp}8PUU"8-NEYRtAZ>FP| S&<Ȧ*H>ESˋ7'} [c/M=r<\MVO |M|Lzωbi䟊 l{z\_ճ8&% ^7}崷D* I&Qz \qId[O( хuh<VHtDa]^!D D-# GDeItB" ~8XuDܨ:4~1=HTA_G.WGE1 yڶ 1xRf?kYWtS[NU@5[eS1l/ôec XP5G7i`m=Wa'u%|4\vC+m@ЈV6?vjSGQa(8<}4V?6ŵ2jYߦar-Ӭ(.N?D+iXHW,s2DaϐbF2.m$c-Ooe} 1L}/:T'/U/P)IKkbL7JF9o~8nҙJ+*q&M'oޣI֗[QyxȠpΛO(!ԠYD*t"_WKbA!E4 Ӡ%( Se*RЯ6ng\3 se;/:HhZ*?EZۜg4UZRv2͐P3(QAN[Ij60Da <J.outyC<%4򬇢NU*(:]>/le˳I]z[JJIcn[4 ٢V2uQ}>(%0`J)A{ j:(p Ao5/Gf-vM'Ie/;aYpgp0RQJCP4_gc;[N9(98 8BGʃx<ᶀ>zOҍ䟆{uä@ٛſ+A)L@&1ލ,RM@P;0?832>_/`cqˑW;_&׳7zeQ-=#9׵)j7U p7rbL|K~rhϗ)N^47[]ԪX#,.G\T)^K~ykBM C4 9*cβ1gzQ!FLp%XOb-* 1F5İ/k9/!F3bv= 1zc>#>'Ί֙Y_>YHwғG<þVT>$G|grI;ql:m%[M*B5cns_T_hal,oJa[aTzR=}vq%:H!.Ru|PAa)_8/| 鎿 = ˊȄٛVșOgV90?lG3'){d0hLkuEy:2GhKĜm3A8hh8Q sA)8y Ep/Iyp.1pUӽ~8# pZxlgNB8/8 p/Kp-Y`$,_8p>wyAxpYs~8=gqNδ -8;^pjNL>ߞϷ1?盟_%̾8t N>"L>ٿ8\ /c<Y𮽂u{.'^4{x Ƴ=3g9{"Gs ?<Iv27KxE:uܙǎų-|<{SnhpϽFxyx'oxV1x}x;ͳh+xa 20HGx&_h`fi9|QͽK4 x)jSuys[Q-.bٚm=mT&A+c W `6ٷ>\x[L&oOaMnkn嗢+[HJza3X-:nDZh~/Ԣ D2CMբ+{V{_xm0t56on9Cyl%-IXn]5ep61 S%䎘 "s[r;aǺzp$mR&1~|SY`t)pN,|m(:%:G065iSp1b#z<x8GX*݇0~ >lj>o`^+,wv$KšxA=ey48/$[Ú0RS"Mm,F/DQݥ_zj_ k=rɿ$}V;šLyA3fsz=nnwOn F2kHz>1 9 )6p h +p7po^! `@0 D6gm:=nhn +AYP{%ϊ?6VN* 5'}0n#yyEsfKI%Q]ڀ, pwH@z6xɪ{%|YYӁzq3 45 5 o-A˴d[^; h8Z 5=o%o_ '.*5Ʊ^uq$|t955Nj ypWP "0@meKˍT,_*)\ၾ]Bc9( Z厗j9x mkimuL*FEC^äчX)~Z)rSmLۦCe Me ͿmN6rmV6֧)b5SaQ852 خ8iK[}L.zd#¯*_C _xy'^ >:a0r&,qtʿWH@)gfF* ?YIH:D+ELw? h4 U"oıgFjA{4*`TQ<:P)R9ʊg *{ *S޳ /nŨmqF2FJ;.*)ﬣrﬡ2ns-*!*U]A4*,QyVʣ,*qoeTYTҠKwhTNDcTFUP𖋊[T+@>TrM.||Ee+KJ{A J72*rEF% @eƨOQQr9ʑ ,2)C*34O|}J4*[Z,*;_˨#W*,QQYObQq5򯭣WPY|Ee+4*1,~Ae4*YJJW,*ίdT:bQ͢FC NEE`NTp%/80d2,~/ G lK5V95Cc9!*'JbAP;@W9}I5󏪑R=tKtH">\M*JDS퓪"zJڋ\%zE^$:+q/D"UIKP/`HWoӬJz#iDR4ݒ&'D*ѾiyOiD+$jHW2h*X}%Z8 KHĕ&ɪDgHDHD?H$ǪDkKJz%z9+ѫE="JX %z_~ΕshDH3D=R%zY }.|Jt3De$h$D=IF*৹JtӼHSV$Z)#сDVzW(RgDR$ZWJCFR-wG#cE=v_蒇JtüHׇD<I!#Q DneDJr(S7ZTFsR)^_HӓTJUR"7)DSSDLa$Z6K, B8%HtJ WSJ-hJS5-"h{DӓsHtc2+"'3E$8Da&+̕SU|HJ5ni$zH7UyD=ȋD}h_Dh@WI,i7{K4"\oUk35ߧ$S#1ExGhJHs+I"&1zH4hXD IR$:7+QIV%HY%ѹMIU*ф{y{DWIt=F7on/%p](D[S$=DK߳*̻Dߥ$ Dc$z"^趻JtݼH]V$]Fv-%:H$R")KE$ns̨,8Qmmkzr5$e%i_Z!Ѡgkjk ܍57)YZ]Mjū_XttX<#~xгmՕw W;rv ij"U:"+Be',ښhUE3ttEP,ʼobѡ]̲hmEY_ְm+,Y4¢ڷ[|Yt9eѩx63,zCXdZY-dў}E}Uu糨i-=,uǢhEoƢeth-D,jwaQ[,5,*yK-jq~3ű,OâQE],:)d¢q* Y])bёzXrǢ=F̍E>7uM~dYdsaXEM"5,gE+,Ec"XE?ŊXT"aѰKEWbzwaOzӌ4!mCfi7&HnW^74" o Ɠ-dFh<ٜlwNﹹ8fK E`zjq]ֻ S#n`g.g":n'H~zQd$^"u$/\ $tQAr5n($_  ^ F2j{ErU2H޺@odbI6d r,{:YWH&_с+<$o)H iB!Ar:?ɖWt#YJL"{Y "H߂xYAre.]d$K\ցdF B$0Hkcd 1lG$KưH!2AAV8E0/.|rbb.1F%OkKP$wNNdr&qv9}>e"J(II̐=2JFd%{ds=vN/=ϽϽz7SS. pNdŰL\1Լn;-m1dz='6Ba|O2s&'iЁ;GЕ8I@A tN0۲W C%0 ݡD :$t'Jos.:A[p ]-D;ǵg;n|AAylVfqbVqL dk"nYAe{MJR\@=D1%ե_&qJ$fn}1_&1XenjI4.@yĠ\6I o _&QiDr1C% :Qdw$2 NplMѵ;f\A]=#SȐ{G%/kJ$UŨu*GTq2l'vQ> [R(Iӣ 4]4J뽈*(l/6i}St`p:8s+l;GoާaݣqW eR 4`" L#A4;\E_/p!;;B]Kt# tP;}0t0{GhЁ;G9!kyn. t0MaC]>lqtf@w(ſ D%AN`f_Aq(X; Y!*7 !f!i;3a ?ث0jVeXP]$y"w Hd%"(.r9Q*tu:g sSm ~}A9H[.Ar\AFa`!äק}g3*_tƮK 5o^0J_R-*H{P^Vʳh*oU*Oʶ?WY$#j?Kem(6$K+oVYN\l#u-:Ka<mc#Tv\]D>ǭ6O52n5Oȕ辩r`c\{9O17b^bk/YxR{G^\v4ۇ^-;Rln2k3w{t/_kcҼFT%<^gJx{5Xc^1op`Og 6n:fa{(f ?d&&s!(HVCEda$f yj7kwӐLۤ @7M${f"YDFSdH~ߕO$vHb!j䇍Ʌ 9HnKA.*mwF.vr yc' O$$ܴC L$H[ 9p'7Mv?;H$`!ymd c 3#{_Cuv};X^H9w5$;"OreNmꋬޮg/rd1㎭0v;ٵN/d웫ngQ'oHF w"KR0|YxS)9xE,"~)9BJ`+HaT4(BlOیi[2j{qa_1n{2xA#uۦjPmt CL4({+eniУ5%mKfm ϭ Ԡ6[ Ԡk4Tx z$kн-kK5hR4B6F;jжUpKޢ mJTOΣ&|XA,6$AԽ'/Um0M8/ 3Y1؅8&>Y`/RDLFwJJьN;A'F0, G5&6nr:Gn 0;)KP'6iZ!X^Vee*X'ta ? (]9v 5k{B֐ %(=ְ=W:,"$fbW+ @x b;C(_k m ޘ$bq$^˨05YzDB԰jӲ~K4L#ʢwpZb4"Y+dK祃[|"DvI5++F~( } TTxx1J&!DIyBIĮb?71pPWjG?(g,7xCFBj<U~*I<-i0KFbw6&m =Cz[a+^xJ9ݱ*4^!vZJN\%tlsRk+ ~ bp#tH՟x1wo+7 J8r_i?fp?fFB_MBZT,WV,VMMW+bXPѶZ[p c#5.o(:섧 C2o,prQؿ%?]h1 q&Ϥ9hl, x94"Ϳ(+ šXfxDDU`'Nvw8F>5!q+j섌Df֎'ҬXTW4{19;{g~H֏c,J^ڸ8KsA, fX,YưXficvRڰ/m泴q>Yڸ8U;(m 3X1'WE9ԟ*j[)j%,#ٺІ[c8̊ n];S]ZC{g/~"FҒ1<%G#lXZ?/y GZ?1> i}.%Ð;@(A,Jf9i.5kxIİ\zp-=c)Nlӓ eI0Y (&#DŖГ)hM=->D/W$MGKMw ejaH Qp.á簴cCðWeZX`[V E1ptE Fka|T>pxXZ&iL(#(?Vfӡ<ʭYP.4(P&l;t PƇ(P~2+2P.$dAI@1Aie̜B7S<#Z=Z-ɎLbT|Q4w7Y9L8d3]%",j&Hx)mB AIM2<%UNfaEߘJYp(NA@y lwZ"T<° `8mMc#fA80L_zkXLk:Eu`fr`gv`'16i&f2|w(3 89/6Z;g*͑TUyNm8ʯ:Bg(p )̢ < $'gO 3`f "X`䝀iō,kecCE^ǴL;_Cɦzj' v / {7WN?(O|Q<5ЃT1 v%wЕtDeèJ3ð^P҃38t ;GOA(hiCIJZm!%;ݰV)餒Og(˾P+J~Rm~H.9]tL7MgPJSOp3ԘC9 ?VП9YPtŶ}߄}BUs!o76h.auBSp$smBR}o 3),^.ZˇJvI ({HYDђfגg"4a9x_{dj'$Mc4wМ=Ohq/4qNDiTe/ g*C1MP4Ÿ;>b,0EH0j$aT3Ĩx:eL < z*]2~?f~T'ʏMQ)h11l!7?#)L]4XmKԝ"'jCa6{+REJU{,N;NePG3|3&:i][MVXZiLikј71/m7K[OhVoR[}&:p"k5vm#kk?ںß,mq87G!m{#҅(SvG)*~n.9`v 41R 2uhҩ8ڥ}`đj4`,oNP9ݴ7v ͳ]zx<_Z1 gK7:pڥ/'yxO748 ?chbh& 34c24~|^1# _/4沯CSvlh6)64Ni24| C3~824[@ u`Xpw\G 3, BqL sMXL8XJXPdy s,=,H 7.0:"m=VVtmuˡUDzt,>C֟C0m=2&/m]5K[PuR[{!R[C4Z}m]8L֯>z'ښCjzl0v;?CgOA6{*?fhMcO'ƞs&nh=hCg=,Uo4Ay'I MSCg3pLCo &՛Eko<<y6b_[D7T<E'ϙQY?Ex3bޟ9G_ 2+U_8G_̯3Z!_1_;=52_3ꃠ\SBiڛnl MJ9|0E;`ãuS1J =!jdyb =1{kF5{a7e&;aQ>G5Z`5uQҞT<˶Gc juIOsxnMTxn5AAW܃ =5=Ānlà Ala6à=n t͠["AW]lw:t_*нH Ck MH9@N1u@Wk Ta4ŠKq'[΀.)};ݥne t荀9MQ#Xi4qTw5:x*E7;@hW*X#Mm4D'#DѮZh6f'3+F@O)U]Q#~eH䮔0I5<wײĖ/2[Є^^mg)yOrf}? {RSx_X3ttv  ~$ȭAgcW#\@ڡpx[ot@u W4&?amjaw`"E(Fo.Y dצmO8w)غЋ8y_%ko92/%-v_Ty C;H[!$b/HC}EvEپmJwNp3wr֭-psHg4>wV97qIq3Q qvN}fqZoN~ElCg gup6Klg%gg{gGփ-ߋY/g[ԃzq~yY{'f:.JG7Te=hxOtԣ'+ؓ'UmtG2}s͝ttnNtԹJG QG6(]d&u (owW؝P.΂2;=ӠuPlҝjw Z(3,@y?ۻn$XPF@rhMG7oPtC)7xF2 7>nwPtcBI܍'r+ e+ 9w A(v`BU+J+W(veA+ҠArYWJ}W ʫPʄR@ЕJˮE]XPu! nM!e蕇3`Ew¸aI-ٙ;Z8ƨgC/"ub'ʉ^DQDJqbxHxIob8UDjQD*\+"մQH\#F6"Gvɥ=v |HJ0iH92H*ܦ#QD/*"GtmY Z>@5[  ټ M#]ǁ0ؖzj N F5d`d`W33;{b'^Yg'`o >15:Ot~N t;Q{0t:2ݑ4#u$A: 螷Ut CgY= {t-нlнm-eZ'{-~p>={>bkͤwoAqò BXwAy\ kaeyq0múyvp P>Jv`9=ێwHc;̱3@zOȆ?rc?vǎc=O[fc˳-Mo4ؓ`+u-z>e0\Vsf؃Q- ֣~l>\z=CmG-ܜue{ZQڳ(JGujϿup*jO Q£vj Gu-CMiUiFѣʐvQev};r>U6"6yEm8]6^lF lȨ26fC*zͱ{occ ,gU6/_*7eDƥ UKDfMQT&%Щr$J*U|STi/*4nLۼ-UfPe]c*#ےTʪZj˦J6|T)lr ImmTa݆F*gP(!UK[\AL:V׆U6T Bk|U[LAk7O6nw|*9i"X]% :VdЮ5UZw+ Az+ n72pe* fbo(;Aм(kA[у8O9-YAݖO[姫-XDh}Z#G'"Bc[Эֿq /ӂmNEa\Js?G f7Uwsoi.?ݻysm3>_H뿽2?aAʳ23H5SjQk ajƨaa);sTlM0Yc=aLf0~(Ya6\SaX5OM5*6%ҁZQ #3BWqM袚RtNJbצT 7XI\)MkV?k^&J&+)$Ψi,$[$Ӯ$jpOsՠ ~aP$kB  73ye #Q0H$ C3d% Wg ަ(HX J4 98*%Wx*% FJuR(JIFe0ҹ:V))=Y)yېRՐV)yZ lhH;b(I 9*%j˕|J +%-LW^fFz XU܊ ch(;k@5}ڊv"2 0 dM}4R|ya؊6@O .P7 m<m=e __0Y{COZZI7 D;nXtpGOy9X' Zw&SL ヱ4X FS@GxAvQ= ף\ȯ ϕuI*K`P<. +z)<'5) ׬y%=]iܬAX  xgwH SbFJo1^FA$ϪM$vn.B]"< ?v+(+{3ݧՕ\eluۂTgt\|syꊰyJ<|H/'Pz^LC" 퀑Α&;IŲ}dA 1u[azoa5դ,Vw wʲߌQVFV2!NJ*9PTe~+Btr,[ɩ m Њkrl`,2BP =l VвU epybUV֑{ jGW%GTe8V5GʠkPV[9кVUۏ*Tav úma«ЬsM1fv\*Ř_1K+ŘP,o+Ӌ1+3[3(F~ʊV{Re^!V9]2M5*!s8佱E'J*JtyO,*ֱl%u]:ެȲycBEukYyYcӊfAZǢ i;Zh cuY:Ϊoسi+c ujcG=3JеHm[ k mSC[ӴܹF[-V.ϡ,)ZKC\kk%C[=Dtyx8R8KzҰ-r4y;ls!م/A~&zPZmafa"0/A`l 3u+cK:_cJsX,kWG)MӱfU\Ա0hXf)%Wtlu)~T*:ֱcJt̲cc E儂DP^+BUΒPFdA_ʮ%iPzTW|I P`BYL?- e  J*P1EP<P eJ3 t(s@a΂r9a4(WPlNBri-M̙PV43^|B ,(g 2,1=h FGK(AclP8a%{R\ll@(g-+N'oX)*g'i/M],(P;8w`u_< 9 ]?-wy*@b2ڴSpmbx1⊹1J\-ƱѴM1Vr^Or(-9/ÒEs%FӇhzrbFdn>(-J4]Qym97/S?7;7W7aE_TW<!t.Ǧ<5p$|:*|թ3 d& =+k&tjӘ3sljrSLhacP[tLIc&MHu:"HH {_,vtNeio6:cKX =Fyt!N4t݌X,maF4v4[ HqVXZ yTPX:nxY::dicUĿ,uY[ "XdiO:jnv4p>LwKչY.~lsGG+= @禭r6^xwX`չ[gss X&Nܔ!q|9s9@kPnywMw߆]7Coq/kW!(A(V!'3FOȥ!.!% ? : COl#wϤhaFgDF`hzU'%:Ikh'] >)O.;D 4{)g9sl)PNm6ÚM>7ҋ _h-'^::]:jӤP-taDvlܖT k >GӏYv|\@ o`̜zH.2Y]&+W=)L>`|#̿L\}{ ucD ^fsQP{'[rra̸Ӑ1Vuf!tM ~J?|hQ>[{ O|wZΑۼ#; /93U_5o9a&TEoIu;2!x^o uftgBjU|KOְɾ7~C9oo0Rka&;a70ԽİI$f~M`°Fׇt y`5 cX5Cɦaax(pk6 c֕1HpH! gsb88İX6W yE`!pzat _.`) cv80,!saK/1 >`x%F2o.i)/91\1t~Ib%C ac# &A c"2P/?A"N ,X|c\g. Xf@R;sE9uE6sa& \<{OE)xe"ox#f.\S΁өuhb V Eԅ 1u1uqhpM]=~";9=#yxyP'/<㈼7?Dޙ;y=Mmm=#&E3  DޅE5S2>y< ƧD28UBIgÈ1#qJgSTzbS}Bc̷>ɋ1˟p0f cod1ojS 1Ƹ!1c>d d xL0 Ę[ c_3& bL*c<31c^=b1#lyDc̩똸GqxDa̰*cj<"SZƀHʘ cCY1G@LzH2!1@t|H0fcPxΘnctU|y@g̽I}b̪< ~@c̢k>ȋ1p0 c\S>ɘG1Կe Ƙ(g#7|cd}c j'` 3yFj ܡ׷9 ,rEݦu0k1v^6vbl/6it%ra (3ko0xa ފEoNh" ċCaxf_w'TK7yd7y^xw̕c)ySdzƫD/Sg 7yM;OO=eй3r?Fs7?:+{GB-α(Y ˮ+nsuձm1tCt6CN81 9WG;3?R@iT="e-@CDŅ!q%g>3ן ~ҾS15Wz~tHg!OI?oCmz,k4qAB8yJ|X>S<4 /tm@mv:G'pˤOh~ 8Zն!qJH.{A#^Ծ}bM(R$6;mkMw>ZyV4sM@'d֭|\/~u#~Kd v2or|rJ~o?Ew"Ou)nV'rqMq _}j2nҖU§BqZ[^5*ONk괫 xUtjֿU!~\! ëM^«V:(xc)`Sto3"̜+*aB 3 a쮰S a^)Lw/Eˆ20g2ULL2FݙZtl08a*\6@Sv$̙K$a^bFHKaO"TLyNa_R 0/q%a>_!ŋ4¼:{żsa^&J$a\~BK I ^^0@ |y&I9ٳACa!afzDTT@';"̉y0cqLKA˜I=g0KfO$90133 90 D0+[`sV ѳR+[tyQZz5Q9l;GgY 裚Vͳt:z\m>c; gw>g ,5m9#guh5)gt9KFI F3נ,%xp3A{ХEcoMc-#șEQb^wQVi2Yr2MxHd%2 3=Mئ_f]#B [,ٔP_bE]r^Ćbzu'@WH;Gf  Gt:[N+eW':o T r ೷O){Heˤiڹ̕lڧuʸcaT- ǝgspd2<9aNsd:"SxXcʞuv}j^d\3I0+av@󏙄UY h cqT0̤bd`E{'1 9T_f_B!PRNP;#ޫ$qC%KUVIcr0(ơz뀾ttS^$U1-ÕrH˭r( py'8}&EpHN'>q?,U'/"sㆸ8'.O8Nrq,Cq LG~:A W0tq̣c q` CpÙ '0<_acpFHUk|xŎqW'w'\-x!@ۿ7&CoH< `W4Gi;Ge%^ x G EC xݏr7f QG]{Na/Tf(g1EuJheA1Lgw.qtCM)cdwѩirH=HN u[Gt0ƈ?ݭyᤡV'Z)1vQ|n!EE)Gtxh7j1x#*@8`[e?Xgwfqn,N,kF.F ~ߦ18 ND77O,sganznEf?$O-tsS$}ٵnn07Xf>sb؂j}yO{9ŽsY37ϓf^QgH7l^^>s =yan,907Uy7 2ffsG-ֆkGakD|318"ofUXs7X[n3V[&NHM쪔VVKajiD`\7zrt&ƒw LGfA DPV Mas X> m+dmYbU&UkY^ȪuېQ`'o#ŠGR6Z]AjIZůU7l}Ĥrۨle }jͭ4A~^# |Lh!Rcz% JR8 yCB Y(A\)W$:`nQ؊i BV 0)v&4ŏK{9ˊU0}SŌ4笓ETH\ܐ^F_J7q \H܀UCkI+-[t=S!Ͻ] IKf#=OYO!ufFSa((H@{gv)S^MX[|UB8խwCMPI4u^組=[[u;6ꖸ֐5nHC:%S3khlAu-jM^泆G:խ"E}[Zu{7ۺդůf[dnWꖹ[TLu6 mkWkK.މj}mVp}U]o"|xUx(|n#y'yCa#?9Z?tO*J.l_$x|$D|$#kZ] lUKR\7g[C/.]wviZ KkJE!q(&[@P4#=J_I V^ Wo ! ,x//M_U | "T Mܫx~EW⥒H$NJ! V?YA4̌ Q cQP05$Q+r;Ӂ-g8)9XU؄kؚ1@ .χhȁH4n#v vV"Łq`. 4ρNTe:XiĬSr`8(l|6Fq`k,Of,?'jÁخPbC`}PTJ1Z%=fBM[HBݼO*&bPN,q|)p _iy% K7nV_tYw/jݼKuĻy7Kv7G_߰K(yv_XB #o:.WRm6xŲ2ws/u9}ŋ1G.rqNr_A#4c~x| 6ֿ^D6.b4 ZXxɚ T)KN`"./kX/bDx"Ώ񴈳$BXl%rJ. %sM1Є#1 >g'7؄kOT114q7̖f'܍˳ &\lYG+oFɕ>UQ }6fYYU+NaU8*LXug!UjBRgCVՏ07/d*ydH?3 UZr!%\l;'k ѫ͡ieMFAdbnΧc ovr>5 fX1D9Ƅ|5+94x2#᪽{ch17{5nY i14;~t aD7weӡ @׍QC`ac@wftѠwG@0.-\]y JY3<5 MBw1P)tF/}0hf{Fmc4Ͷf\lN^=o\^<ٽ6af lPf|ezf,=^Oӑ;t(=C{UT3BzGKaeYscOH3czsXt*pS z ͂xDyA, Nj^|+J}_BKdH"k 4xVJOKKNߣ7EQrQKÔl2{92aʗ50rCPǦ'4zu'DVfӫ^9YՁy"iՁ Ӱ Nd^ՁH@B$ՁH:9ÝSHvuj0vU# TTT8J,Fu H): RK0* ǁY*Uz̢S,ŢA;\;#J\U|#(TR5J*ZT`Sd?4@fQ;$?AtwIP%3Q%Rd掜_㙪>(? g9s< ;6Y-G.cR8|'Y>󗏍Y>FǛˆ@ǼY#”=t c0U9 0g@0Gg949L J]PN_&PcTۺਸ਼I]m}N8.>(5濦+ө|cIAqSGNģ^JvtGv&FL.̛=hcs!ļGvO, =Q_=1z}N=18zP"Aу41F>Bh4~G =^HTkW/FF{:Lc<>妱bShbS @|{q-|3pg5tgpcG0s?WaLAI< i*}_JT -æ7 ,;S6j?1$!h<n\У"}=f(uFveQ$EYN;Iwc և{=$bh0QCZ)=@*Ka7M8v U+N)9= |͓=-ur^0Ֆ k fX`K<$fI?-͓QXV0MH u͓qj0x ۀ bAPl<w "hܔqT^mO6ɜsZ8YGlF>Q67 L%{"# %c6熬pj:Pz2=Ȇ21ơN%]d{y@cԼ`l bJ{Hg$HvNJHk8~wR/P咚k;o ~1蜗8*VPSM  |`< P@/ ?`t`Q; |T݇AG$ U0Gkh-`˳&Qx41i4:cΓ`m XMW"0Ohb~3Ʋ<`LH#[Yω*'Rh8V[X$X/|:?C 05`vkwF.;_-skh+}ӟx**B|oJ3{>2 Q'(z>GH똌^GO ݎl+\N+o(30c#,zezzA 1xcbfC*bȧZ6Dbya*pzrՇ^vvFߎs%k|.ϧTٳP~Yz'Ǔ/b<-v'Ǽ_oiuȋѕ`mˍŁ瑑|ic Ź:ǬbZ^=%?9ԁ];NJvƁe9=COKǔ5C"XO )&%@* XrriY\k2ᅯ@##G:#cZuR|;lzKgX3J(kIѬT%`At5—aUjAf;}亝`K ~|r<2boFvqyc/Eh-JNrJ~a_ %s`/v6NѠ\ 1T'oa<*Cd`85|rDz>Ddǀ>&EO z6h8GV){OB:Y=i?EK[)cďs ZȎVZe̸~{qoz7!]{5/o呫MythQJхQlE6b5&"VP(2FC#dR9Z)>DQH Ț4EV=@-,g<<2?C]Fꈶο#i4=L:NPU`wD뵃7BTaP #G`ꮑ,JqD="?EJTbI!jHW@DyQ%ePN^D[{HK4 ([e0G(=d2|Qz @^OQx*W0٣]b1l!D(x? 2_3$׌Ռ1]dɭa9݆̚R~ipk57Jx}QxՇl B`!7h!0!~OPPqC {*AAA|Qɠ h0+(L7 |`_/&Z"8V,>O8/{pfxbp¹֓%,Kpc %S:LK 7e9W'~w=H6RP53M(G3?Ϝ 8Ւ∷xlE#~=BuG="4F<)†6UF}+qkGhֹGSbij.x1߯8'6I-bG?qG6UUF62oOcp Ikʄ|ۈ1a_a2!PUω7SFMdexOtNj.|zyCe5)]ωt l(je`^h0p4Ao>Èt6zv$WTb"'&_j!mik)Q6f`h,-Y%EܑĶ",,U=2"q=p3saSmB]򫃑֪;JoS +" Vmax Um p1"RRF%Ы#w] uRFaAsYFuh^Bm]?bP;.w=3TJqa\:?cof ^d&z.BFi/1^H_X{YyQl|j{&jf=di=#'iҞXlglOklϱ={BrDZɊ:a96D>$+!6'D5?e lԪcKM/H둽cM36} K`e)^0Xn@T^q`Qe e Z/b.|;#5DOJDABO:zJl@ϛ -\=ۃs =} =A6'U 󃿄1ۀJZ)o zPCONz[| =kaz~n xtl' Tmz49ѳ9͵39#ވl!S ~L ='ق?' =4˅ه{7CޭqbylƁ`3<+cmx57')ȦZkʁgJ=rdPj]MFh"auӳx5<,D_cք3=5Lˣzc=)RWu@O|C=ێߌ ynw818ojkGGlm$gu#uLodz6BOFf#5זǩcmhz6TAϻZy̬@Oyǥz|oFϲzTW#5=ǻ#uSGuW8hw:6w:j -Ww:^Smae)E:/DmiT[es*^ÈmɆ|}m!][cK`xi 9-Vm dZI-[ Zj@5ie^K@&8Yo y) dZyyrKo6jrhM-١&g הGy Cφrn)\SBcMuEQuQu^* `k7Ikrxr a nVNPgcY5g0J\θlvwYUܩ:6Õ4cI˯bе(1GdQQ3_GWo ):Yܡ\Y R)&ߖi[˾RgA˞QFeϔgE}Ze_Fp٫+ed.{egatV=f뮉c^e$-OmZW+2ŗ:6U-1k.bZRrUpW`lw)0)`,V1VR0+a,Z[as!Mx[R_(.%mOI5Ea̽00vSczj`삛1'O9)0&},&`{_1v%0g c]4?Cu.!a,:|KpI_B coۂ30"K\/5M+%N5sVŹoq>o"oQ+ ?۩ۙzpBs%Wu;Ն/.pղ3\m3]\L4t/zj+ѰK۲.5/p򮹠~˻]\ln=tnehlɦVSTT]|ZVPt6TM-w*vxATl6b} Mvh9b= r|e dTsR*6@^إN#K)bH&aCߢER|VW](vUYUuםVNg -qAucT-GuvT,So嬡2N;祺Ny.m:[ᤡӷĩ'T]Lu>ڔ[;Ikm' kZkGϯeZ֮ͧ֫gZ$"[kW׉km|Z1 ,Kkm|k{Z[(_kSZρ_k78hWvֱv kj9;A`t`w0Om0ؙjZ{=g˴w`da$>/c*3~ia^eCΎ3ؕߡ7S]ꪻyϴU7NUuCV][; 5Aunvj8TWButUPFV2Յx5ie6uAٝbZ]u$KuT7#GQMDn:oF "STݠ CgIu;u#yEj[} @TWLu[_"[u?kngT7ﳚ娺9,S Յ~P]*KuV] 2՝ī.㓆ꞜgCW/Pu32겟n=$'U[u>i QMurTݞs}TQ]I1/Յ|[uG^u?j6?pkUn?S]gsѮ=cէ5)="?g26Lo{q )>^DYz^^'R{I*Yx~Y:,Qm"G|^RLNbg۠ZYmb~VS̒2f̖)fSbgk(@lb=޼~9NS1މz9)f84Cp>ŃMW}jH뻯=?zfH2Րs2W,n P֖p>"y:pF'ea8%տ|q U}QmO|s}ώoD}f;sRf+S"3xNT@5һe*R_*~~6%XZ'n7e4Uƚ?5p#2wz-!xn$d<3u=@ZNǽѕ?YI?RLLx(֩p"Xxy|)󟯄ԓ[K<d/ni'rz<2S;4$G !C'ĘBɍ)2ic^Y)q͗7SL+ڤ c m1u_PN/,~u #ʙJ@hiTn)Gy ~/t~ݗA m9L eq аL]ZRZ\{-$؞kϹDf{ҟٞ;r۳Xd(1y3ly;mk.%MKI/%Ͼq)9_Jv>ZJ?㖒p)755(j3I5M?5s_xM.OI}&'I]Qg&ӧZU$xyj2&k?SkɇOxM^|"d{JMxɥEMxb&{?FM<5Y鉖& <4.j*ɞw45YjH]Y,J.,γy꽲}OEY5T]涠4U{YT{ZxOj=^2Uod{|]MUWϔ.wEUwV6wTwj6U.i Ah:j-UPwwxU#t6gyޞ|[˩ob'S.frVUڱY mҲ,pzx-w} }>" Cռڷ9tnN+} %n~PZQ۠ެڑRģx9ԫ:^δz3=T-{9S[ifv´UƸx´_֚U|6ң+A_Hov_QMo/h¤ow1KG]yE"3WxM%#S=oJԄt%MNÒ_1|NޯTSseweNa9.=c_j1=7s7b2n%I?Oϰ ߉:EI %MR7$e8-t=5-8qQ%,>݆Od<;pҒvGgE"pB/-N5i2Q9"Er;pj;8p"?'5U1#֤TUoyqzhC3:%[| c:*U[6^T{x?58NYW$e2"wx}A6-A4w?:NWtK VuX~BCvd p^v 7?oTOYa w\Fm[_[6wӛ>7wI R9cuQbV,rR~'l~ eN@LEXj;cJٙkٽyfOUlfz^y@PoC@pH5( #Eii@fZ9{"9h87Z9!"dqB;:!uB81!aB>6!f'Ds*9nBMGsO"T'dz'U'\:!nfbY Fd̡ +>չt0p*5yo޵V3~gBoUw6RK\=o_)4OSAK%pK# 飖ܘѧA(u;kR֑ Ilץk5]W`X?%5ÚڻI>q߂Yıdw)qĤZQ_\!6 8nS e54kph>!.{Rx(;cٰgsu≸'ĄFfXGjR F“Nҩlk+' 7&~nذWhUasSU,#yƑyG{F$|q58h{H"OqA5esYcPrG>'8Lhvr>LY@~rs&z Kw-)cJt0) g~}2.s5 ’&T˔':!>S唈 1g0;u'ĿDŽ0p<-m +4-ʆ%C%c)qM7?FqFG/1}y;>WQ}%7zE!Ux#cr̰W9(箚PvSU9=xuGUo nM&78|uhW7;8)~Y<﷝M18҇18dmSw>"naa=K*v˪;R>gij+uIbx< mZ0T-ieoQlMtD zt.X;]J;0cX7M6aOęw_ĜÄ`0'e,.jΤ ]p;ґ>W+H{Ps+Z^ÑϚڥgogQ]?!؀ed WӔ(<=yQDi"󨏣c\ǃ*adz *C1f9:ZрG-Iv+!9.xT^ҹè%Dw1I(sz6 }*M;Cn!?[&h̼aHR< Ds,ѵ#ҩ(o>.gNWdPΆ c}rBM' bBԻ7~ SԷg퓶^UI7~u+mj,B"^@g (X*e;?ǥpg;?CtGl~`R^zc`ٿY'lxo\݌2Y'ζ|3D߈)a7ooQ ݃Ge[ўVG-v V+/M/rvU TN-[N5ѴwKo1*cKiѥ]2cT~fFR5F+7*ѹƨٮQ]y&3q]J0Fv3P8cxuc>ш4KS7FijiZ-cx1r 3Fv2FGu݉KީfF씌Qrc^4F(l=۩iJe$6S"#ES7FӘ1ڻC4FP5F wf0F]vb|vu5#64j4Ǡev䶴ݮ}ީw]fsZZk|֌ٮ6X{<XӯG;Y:&_K 1[6Pz:o&mSqzEkq'*K0~3!רd\ ڠۤ6u6V_*ӅןJUC{*II֯dkVMXfg9/&=lq6?{Ul! +8{VW6ooqglQ))Yhq حg2_m3[X xb>%w;4_OpmJZzZ`+ŵ_ܼ@=[Eu8(gOMZ\@ N3:k<_M4A!a.p@wZoXo;)]ӠE7ǢM$Af{tҢl,6^J%?&k&5 yF4nyCPe;1+İ2n%@}F2u: MMȴt, #o-Zt%L{ 6ZoJikoxK?p,$837MKjlݫ,+h"w3`'sTo%'7EkLdy[־ud,lsVɂ9Oi5ڏõqt-_ Kv Ww3.~\QNdn>F&i&~nJ5-=,Ma&>mbIifi 7J&Mشd/Gt/G0﫡s94A}9 tiH @/6oEpgH''^r@ ~ug5 *ٲoY+ME%ptHct7{ |;re)cJz0)қNoý+Lџr M'>B)R6VzsaoM^eL~HuA\TKzQ(U2_]^+A䗻St}P$ O[4@8quU]/wLn.i,9:~ƜY'9(m7<.!K`lF,;Ҵ#N,yZ4_ϹjzCs(׋䙋ЏGYr2Fq 5AJ51~`X\v5 xOUŷgqH֒㙤wfBQNt/PTO,)Ȧ8zJ1#>/ =)-IJjCŒ_'‹1+oi(H]Òaؗf9\\3|2>&{&Ňwq{9Ғtw,Gs`S[!߇q a:I{ fWAf*U(BM Wa$O1r}!J[ PY\ݞG+ی *m*&UviFbessW6P'o7l }?B}΃ɮ1f)TSezCD*e=( QTɻDwN⮹Tw_Hl|b^1nzq+kpJ 1j)=_ŀ6#`Aɜ"~].\1XG[.eb<. #Gˏ鼏/Bo~OΑ&X>@1Te:.tge9+XafIZl3Bj R,Wh"2leBoY~#I2Y"\6d%F\τ E][+MTJ=u쯡]!!Pq,`ϋV 2H(zT Rr~A\[f,2 [%/A2RYoTvdܗAJ2Kt6 G26LK[]i4MDqP 8 #ؑjKzymA*'(.Y_9X2ȿ/^,t_3 d`a4P"=ӋEd2l2xd'O&])fƄǣyt"`BB}"qJ(c A" :Y$Jd39|d@? $P ta 4{@f=mPe7gɞkle\]W\!G#۲oQt $ƚ2mB"o⹢q3`̫:] QyÈ0͗&Hoj0M׋ ] άĶHlkqHdȪ2܋e.<]g?b^(lBuuZh#.Yхj8+8] xY YJ-Z/8Yi_Y8ݓpVlY06ߡ gK86_g2 /YF*`YhG}S),)yPf/lvl*ZZ6γr[<dc*XxtS~ϨmD-/*`]*.ӺvnkVSmڳld9{0b Xa>/>*:!Sӟq9\9j-s\9049:(SU'Ӛ*7eO U]1f&ɧ,H].#S[蚧ҵK{ *U#uړixW'Wݢg Aywgw{l!|َ]MU۲Pd d񃙙x= z'faO3sƻѳ,S0a SvG<Yܶй]>Rk`++mY@+8$6[)ĉG?'͌I1C vlȹ7+L(B4i]t@KVQ(%ԛ $]l@O~Gc⋰zs]~.ZkcHͮ3}obv!}3mە1А|v9wB >Nb"%RNl~T73N?}Q[o*_~כРaF8+#W+*8}&jܗ>: SX Ŷkk@ $fOo |'YJP>Nd0H"Hô%4 Kd=X=kY]LdI(Ow_{3D:@M=O!ukO*`bvCUh뷎Zm%SH&2Y0!ƽ';[>;SC[sD(/Om] l]EYQnI.#zv%m$u۳MOo6Np E$7@Iɿ1dC( mh %fO_I7]ћ_Mn;ø{D_l\^ > Л:zA#d(-Ok+ЃFebN ^]yK17vvFC8n B_+P"c[N$ecJ?0Ľ~Hf_3i:@"87|I iS8uh,9ci[\F@$/O:d*U`WD[6]HU) v-*R0/J:F2@j< * ]wQqӡ :Hwzd3b9'Hu-Ez]Q4mb!*MtaƍLٵraݘDH;PAAtWlhI[S$1{~oK&t}l;XG]Xɿ֍Յ"bj1% @{9kȿ1qG=7S,lduCcHt+)f!<+smXQ|DzPkEf԰t^T t_HZuuJ90@e wƝk~)]uR4TI@Zܻgɿ;!„%h ؗ]D{U b31)l}OSsYٔ8OneS㤟IH3tT$ThBt|g愎DHx`gB%fO[ MޖIRJ%,&L"&ē)mO3:73G˔CDH<5I0k?]X&l* 9 yRTO5DG셱#Yt??>'/nwEN{Pl/4$6$,nnz cjNg,NiK0?ӛܜ{,Xάě^L]v}3)ԛu-* U q!3pt@HU܍I; Ҫx$Dkk&mRil7{2!k@H5tbBϝPHs$,'DgY?>W@Nurv{ov*'Tjls­BJ"Hg2#a.D[Qve#jG/Sx O ^ZM}WKS x"Ol0(M%!jPHU*Tj4PaT=.Pe_~ ЛDђti\wFa< ~? gi{}kHP aGMz ҃_101.7_a;275"0Iȶ$#X[K 4\Amܚf2q~B޵ :DؠHm=Ǩ7Aj h/N?~eogjgyW~c8~6\ qЯ#҉zU B+p wùTۻ!t`}4a~0WfL|v٫V+КBEM0dN1nQkZ $t+ea]L[K@ő>CG:ܙ>!<#HHωHh`*{_l "%h/YԥHCqbQv@ITi*9x8BɂK"`zaɹ(n,"Л|Ka:B݊Ay9nzZYA6sqyZ7`fd`QQ].#ȈѽQ?֍rOeN9ɨBX?cR0݌skh-V⃣A2z~ :P)XOEzM> TDHuqFUDʏT |ZTwF2 H5ƅ`LTC! sl&qobiƒ0[BN4n1;W "H*֟I"6HGo~S y0ꬠ/1b }k̾y֡ `ś\њ,Bo%2191 A~@+L`5&p0ܸض.Mc ?2=H*n|xa`-w7(ڹeu(#e9 5[ >k/2JBڏTݐ9P}ϨTRj&R GH􌪩HTYAjPYpmcg& XDZ.gg):1$:E`bZ$3b@!}H+VmQX \ A㍕t[[Ja#`{1QE0FȨ ӛz@b0 rR L"r2*HuF"UgTn"_H\*QT)HU3b_e{c+80,=!H5):Do̔o>Z r Tl6T]*JtAYCV0y!Su!2M&_%ӡ12SNr#Ӵ9SzZI`g7ljXwv%p|$HYIz/ʡv 1|4컦q|O~ b[R &=2.bL|+nA~Mnnh#eAR1s:?k)y'VvfyLo[*c{eabCoa l/7!8Qo-R67vt6g,@Ӑ~.GojB)ؽн*|.'1h~?ҸЍ7,~ ">@Oj*f-TRLXFqZlϺ9x(a,u4C B?BFJbGs(BAt@oǚB 6i=""cBrE1AdNOǐVxrZtLl(yATS3h7F"#aYy({LOtWTh9@_5YYP,{ܜ?͙l1t=Ұ0M]N#,gJ8_Ӑwq =c-h[GwjRg^ynرX39kL4Cn3I4;"z~w:mjHfB {3}{5Unmv@3战;R!rևr!AG^-eC8B*GK{|)*SMҸ?H{RAA}(Kf4%{K#(R`R ֤?kϷ2pL JHW~ :.+[v]+i50OD?G2ȿVzAX:b$'= G*EGr(L>@Ja"?`j-RZ1\O j^Aghw~U!UZgAoGoE?MנzJ8yO N`@Lǐ'`:"_RNO\'|l{8m uٓ2 ԁ1ljM!te+_TQZK}yQYx+.4t Nm~?z)kf=κ dTOJ &/O2I=7Y;ҏd'L}E}&.F1'俔L0l¯+|t.ߘhIY)"qo!\qe%oQt]/~jD.%L)` m0t7iDƕvu2PB^#_J0a<4*&S*TO;E.ṙpN)nҔ *#e S$X] tL stnHW EF`!o!+C~rMΕde>a ZgqE$zz+J![UVH?tuΊ.nM%!L|%z|WERRޣVʊ߱t$TRv>PzTYZKQE\GLkG0-#fo)ҭ̐ȵSCⲼ :7zۊY^\/菃?5p5t&OWVRHhe&*XReT[Zu lv8t>e)LP0 AY ޥXzPQHO|<CpRyތRBQ:K8Q)% tEtQW~DOhRqeǤC/Lsi1tc *+!S\d5V2]Řs1VEy2MPx>H)y9et Ο~,_S2edL!/S1Ei4~ߓڣ"j1 &M/TF\&B[y(J`C{-D&i]9G8WSxZ[Fv;:* V}0)Q]F8 w>p@>ϐ?9ؘ}:2O9}Bi"м=ijW}o"ZKʻmOppMk8Rd^1iHu?|RNaVDvb&0l ݒz6|nґH:'ݫ2tGjD|2< P2_)(by(]^˟j `yWDId%>e\+(4j'!6+ `}Sl_@AduGuGDFh ܮ!n?IɁ\9I%QP:߳7xNl~ ;F҉/0zL$RHBcrH&jۡ(l5 n$]\$Bwtiq);OӺ8 dJԝgzR19A-`*Lvv"n@v%A0'v+JcAD5MAܾ#~ϥM UZ2<]A%]Y =m+7oݶ J:_\tf%Ttftu)LHI%7BPMY޳Rut)F Ph"z^mk!J(S/ߕL VJ37sL>ȴ^n;<3%EpZN< `L\T*įw 1)Ju+UW*]JCRW4-wHGc"byBXH~ g2[vut -2C0GD ÇA}1 2jz{|ӑ5T*򍆷ъWDPJkB8D@[oW G bȶbO\X"4q*ۋ['7Qpޔ;6hlK7<dB;s\퓑:–8ʼn2&z3rKrK \%CaEmXLWJP,!$:*Kbjn {Lm) D:(EbiQ^dn+EF-7wiW{oTq]DDJh""."Ml,&&1.USZkUjAk-ZćZj-Z* U?VEK~9sov|~̙;w3sy ajiqLE(c ,zOũW੿q/֭Rņk:i($Y8 )|S1jk9cx߯xַ)Qz?ҿ J͉ѧegaܹ*-a{?"30SOr`\igϞP J#t}YrB`s#cC9ߋ|ۘ1DkO vc-:~ZrW<1nqx[5=bL+0uu1 { ;/O22H S8ҳdv`3q^xv(X#7xlG±Ŏx%emx0?ca] 6;qeǍ3i;12;zG30N;;.@"vyfS5QYy=xq*;pm]gGEv[kv|=ʎi@v[ %<.d6bo_y?ԓuēdl/7s9sXV?ͷ\RKZ&%l~+Z$2 ph2JsWw`Յ>u+gό"0Tϗ]참x" W|iϟ0p"~5O# g-q7 qz^Qjg٫-w&FY5BW_Le]xeh5ލt_Łt1/Y⮬x z{L3x)]Я9XWw"˥bPΨͥo+]V9K<} w?tcN9V[\w"tɮ.Z[DGh_gGX엳p5_ϲ#;av,@A՟ώq;ްJ忁q}RиW*{R oT*+:J@of耛*[7>\Pە׀TwK t5K@|R>ПR9( tП!̗Tkt` 3=.H3wx8V*}_OwLaJ1R~ `fvob+x߇ L1J"}܏Jm'iJe>PO4{9~H CY/~_xO+C|!_^Ú ~ XHC :~h:j^:5ׄsiߌ+f9-oT*7o1WiNaf%oe M>ankouT^sGN)㟯T~^Ⱦ ſm1I3W*Cw+[.e[@0Ћ@?Qt>!Z%[+8{\ܸYF7҄*n<&<^W} О%6k ~pCw'/4ak<;:'ށ6E'ᖴ$~Rc, 3/}R@GnA #&sNWp+7ЫmA 5?m5m} /]pKzP~GcIh|͟ t5sp/+B{%MZ(yr?#Hku_ܓ- p-g5PE{5'C' |RsS@ ?/]5Z p^&GJ"& -WwνBݣ*h+N4?IG_pп%^6^0SE>8x>)iqeضwD{_|TweUW͆pRR_hP<jtં뭣(2"-ɷrMN%&G:N] <[\&ļߥ'%d2c &6oSM?xpcýG~4nyXmܶϭ{qS߃y;}6Lzםj <>eq=z]\}cER=^et ܷAS:vg80^{};yqԱ[zUIj6ޝDJUX:ɓc0ӓDR]}ZRߟ$x%Λy?2Be~=F;Xv(eUlRF/x@FWmWƿy ?UԶ\F9 g0~Ge{ˇu}y{`m_S[?#5~t<]{,cD{}&dM=w=j:nоfw:<+AڭAVp:0 ^[RO_:<}{V:Q\ԏI}?c'Zumt:'OT1sVҍ{&I:?ג?ژ܃Te0Zu>''u룫071Z&MtxXZD~e/BmPg2=- (qA8u/?=RàU__~v~ r2yAugx@| fʣ.,0 qw֋WMmx{?$W^C^O|$K|C'>$LHG?qħF|:gEx9O|ӈN|f^-ۈ/& $&!#r+El+wO&KY9EeGR_GJWo"~3[J|#ۉANw=%~?@A⛈?LLq[o%g?K|?O|;H%/wM|񷉿K=KCL|?qo?xO"~8ď$~񣉻G| iħA|&Y7C|?o&%BbAa1K/'Y&x'n!%#^ ^$^&>@|y'~!/&~)ˉ#~%_K|@F7-o% ~'M M&Go&8-ķ3ğ%sğ' _$񗉿B|׈N ;&%%!}?&:z#&>XB|<'?dG?]ď#>4Ӊ >, ě!>| Ft⋈7o!F|1 0ė_A,g_Ixx7^/// >H<Zį%o ~#LHvw]&~{G~&7[?EF9N/_!k_'wCm>O\;?GC|,q!>DⓈN|2#Eh.B|gI|MG|>O#~:Eě{o#xxxxxRˉ ~񳉯$I$LHG?qħF|:gEx9O|ӈN|f^-ۈ/& $&!#r+El+wO&KY9EeG|_Kb:W7 o$~BVNw!~/ODafB|+DeA5N⻉!6wG}{H|'IL|$K|C'>$ E*0glf88q㻌g<-f0r?.S@9]e̿[ "g>Fy\^ V^Q̟,0߯Eo-/s9?ֱ^JNosv?JF9JFy~.ߵ쿑Aq]&of_^ӝ%p%r>"F\"Tpzs<_b7aq/,WX_Vr6r)Xq~s{J=k2QFYnesy]Z$SwHYnEf.Ǎ׋X*|\cuq_ ._魕WC"_".E|.y|],_ɨywpN-r!˓gcOy^wϜFٞOڱuw_#rgHD|&h"7C m Eá n z}ބ'HDp(W1;jlߜ)G !n7_M'noT,g[q9h ki 67Q," +Q#?rnbpCw i%Xba9Dp#qÅE!?\ +tʝJӥDf+^E ~ EC- !?*K.[DDi]>7-K# B~^S]U M ' |;x1%lq%O(*?YC'bᗼXn O u(и@< t@_d -:IseH{Le=9(\ʗHgtJȰDJEZȠ óD!]Ez@#%EQ@Cgt෮r ^_v15lQ/艠 )U3X4HEj4vmC$z7k5tDl6I|1՗.~\gr8)t(s%fl fnܡWD$$Z!ZK\hy>5H7/_y$+ 6%vPAw{AmA"nHu~6&qy)$M>o(۝_>t:(ħ؆G닐(`;+0w9spM֠\dH[fX- oOXh}rޥuwDActD޹]Owe'H6YtXKsӹ4~]WN1Kb$9jV2eAnŞd.#$]E\g3]k>MI]߇źimnEZ?sA,( Q90A!⋆4e}D2/H\rU. L_uC* &o$iY4xX}%n Gk#HmD@HrVx!=7ހ9\D%$ Y7"mE>BF= mT-lVc|ҒRoq DP0J%s(6)'M_,Eԅ#Qc) S&B- ;Hx1n|? Xq_#4cМG 2ip} xFG$d%BN %xmD<3wHk?R'-V'1t8 ˉl)Sr܆|Kff+MOJ,͗k_<>|c@+XQO8ЦK_i]F 9Hj㽘+G%mfg D5i0V--T G/C#C}H_RkD4fFT{0_R :8IS*K[J0Rʕc| :OL'Ʌ'VtOd3Fuq"wf<[ԑPtiO: y*=u"ju !-'&yD2}>r\mY7L!ݗj:Az9-s8jn6V2acֻ ic5}Nx#uQg6\lj5|{!>(Majh ,rN[糅W"Hf3))-VҼlZꎜ{%2R?.!^Rh 'X({%JG%^Ői>ꯡ~l(Է_u^E#"=|3ʥartGLP)>鵗v)|WgNxTFRUiza{tZþNQdZ5Cl6⪵S*%#-' Uhlg_`T&X$=oi?V:u<Ł"Rb{Q6YGt[0I/.rJ`8N]En+QD֪JESBr7̞CT\z0Uήq53$UH)_Za^yW6Wu|ӓΥj%K{3W&ȃ'Zc [lӱ¶0^fJ=|H?,RQ@_ 9aӇfF$6_*:PpoPC0}#uWjh\'9|ф I*)LCVZe˃qsM9]f5rxX^3XLZVN8 S-/CfdX2 2ᜋ~"1iH/IJL9.n3gUs ﷩>|AU0Td/V˩dѥ,Л,%l.͔Sq$5$zq۫&[+3BkvF}3 h-a  5b:Z:R>Ji8aa}OzHEvhS51Slhh) #G} Q$h0]~ {) CJt565I%?-CKz29-tX[ވ˦UCvؘ,iCbT/;BНt*(B75z f@æfQsf$T֡ *uZE-"͇Lq B/R9J3*De#ƚίKZA !_$=z)zdr)%^$L N 4tZBy`52Uisy^sԞB#!/i*Lidcpk*R]ݐeL`p$Yh4hr!_u 5 Ap>ԼxXʃep]}vD":}_")S樃9 S<pu1Jz唡9}X@z| S82=ɧcpP ;:0.w*⠉^lGwAyP4N [SyZ99yfg푧:D\.:{C ǶʾPpcu'0׭ d.ISMZj%hrӨj0CNeM=8AqI+nWc@L8a0lu9=rS*dQ(~XAjen 1K sl2 JwU 3tz#fW1fYs]jSPsl Wq(C9>0YLjWJBN-8L<N0 #7yn}S p"_bIF/]<5xM6 FX&"۽ss?8Y|γm4ٽ"^J~Fm"4VTI\2j#al34 qG)WKU }+b%KV 64݆SFJHf+JY2"s8L_7p֚.%XP5MEFߢ $ynIDdS2Pʯ62Pv{L}H2vV*]5,bDVIB'IBVx[٤ha1#c> ]Nh_BX-xT2x26}"g}3;alړBmƈپ]-F:MUEƗԔdYۼ60C+}Chjue \rcLN*PYw^iqpY浗Wy9wz auNXEy%Ngq5*qU+Niߡp|MX ցYj)^KԱ8ݱЄx]-U ծ0--bViˆjHί9f[b4&A!["CHrlwjsKU%6mivTrU֓UV)%R-SqC[<[)%4KIItJ 6 F ToEz~MC( o:b;I/RFNI/|ݶVWJS?ٲRԇOuT),Hpj H66?q5)"-AD"d;_,2HsB>U7ĂRo\Yԟ"J&^RiRVP,VA;f N/oMdv-B_^T)U,`'1$ٙwyxlZ JI=Ȱ\A=0p} 7{<`C"83(sM !ڽ6ZS3~Y:! o 2뷺S_GMڒə_1 mOuZmW;\,.˃=qbBwݡ4qZ a29()| '˚怎/ 7X:zb 5E,5Qou6RWF) +[dkHǷ ()/j/mߡÚtS`ݘKuؙpU.u{e^Z&AWt|PNly}*:j Ad5 _YF6_g yn2K["Vɪ.$Υ3I5;ϱds%H)g~|` 1aT6g_rFok sI#@G!4(!խ~aa {Y7 P\X j7[`U*xB]Ҝ;]GKZg %[mfkz.3vۅ:`(6O|rLF$Mb,@eA_؅ SM|s%k 1x^ఈq*aDcGaXYӃ|FGW:u\=-mcSSǻ4`jr .MWpwwRJRJԝ% mǁ9J/n"C6\?b4F9p= Ƌ}Ak==ȽS/@?NQZĶALEˀчlJIרVdNr;>(&pN0\-\U%"0ě8D)gɍ*GQL9˛RJdu0eYKv_K=}nEncDMUٝHw_XhPO{D9fq-pByR%#ݭ}D%#nH:`_9e )u]w\I 7pѽ<ڜQm>0{Qևo AUT=,Tugoz?S ;k ƇezRmhy;#2̫ȭKb-?߀onvQ^JdQu Q)~͸CqA IFg I. uR[ 4ޙUnM HUG^:H)d^2WHˎZt;P@Ӊ kqZn{wn9.[ -0n{#nqeX6:jCu/m̀p] sA7O [nRlcQP"`i5vM| :=K.].V;Ģ$eDKk2 {ԄZ[hq;B[EZ o4 .Y]pG(Nꡰka,@K-K)ZKT+U;;qCeB',1ZV T&ۑ.,OspU/d)}[r}j@3[-ۑOS\*JENU/kgU<;u{a'{ySw :?%  l4 qQyX]w ^R{;l"xGV-,scKTְ)gS¯"GeF:eܮL_VZoS3y<%^S &98}6_/Us6h1nu*5݆l2y;̷GtZ a먀?j*4m}֩@8]OeAMTu + N"*nmeʼVL1oS[l7 *m:I&f+f9vb Ȭ[7=jhLgAԬQ~ &u7os,ĥmnDgzκٝQģٔf>lv@X(y[@nèusC-]7{Fg3 >(f81op~M5q˼f$*uٰbޠ [W}>Em7 *jiRmƽNA6j nq܄ռ3+jގw|=a 0>KFM[TkMȐJԴC!봩;&&'DPk[v[ֿi`,#|'˜Ga]oOJƴ1z7Bl͜X_Ѳ5nƞ׫w⏪BϦmm\ ]ܲZ0ltmjx{lsLamŲ7w2mbMW{ _KUE4ljwACSEceAU'u7cW+a wnwyy=M,дAӴ-E7:7č~A3sw$N -FzOa0#͋&=4 PJ7xK"0 92ܩaSK-?W)`yDqt-VDN#v.6}c"71eERuhxJ}>6?];W/>|8,UIlc%ҧoķ4DjP1@]$9/!͍eSkK໾bj! RϏtj qvo;iXOU0)\S&W1 `n}N_AUmz."I1w3ш'4yn<*ژ`$;H KJ =F?z5/ۼ́<#ex8] ݪ|X.xj{"h%Fm[[L@JɇuG b|n%#izyh(ōzxNm%ɬJTFT6ƒTWr =K00·.Do=yS5x֎P61[-o,SDq}~v~xs,^M=bN%o 5%p "O'MsڊNi"Nހ9\νXy)gk{H/22%o4-Ng,f6$ѳt ]#6~\6㪩CsV{'@x`To\R 4*8 sK\]q5?#p &4BEf)]1 .|(i2e&3[G~~-aܚ/zi#Q/Ωea-o)DzRgCq>]IBaW e 60:GM y|Wus3gQ~I0_u"v*C`נ''-~˙S/ xgs0n]!LG@J&lƷQmaHaIH %\KA#V4}^@E#nOLfu}v,fw#DB8kK!hຠ O@Ԓ[&8>jYiOԜ8w?8fSgw^yqrdžBӼ=P8b1eˏ8l IЊpZ6wd] I͚>QgijջMz:fk7c y=X(_aU,s&Ls"Y8 -7 `JȮ-VzDf({JyG6An`E LaIlُټuzTH߶fo!b,M~熼4f߄qkuW| "XqPU=SݷTڭjI.OwhMm햳Q/Mժk4K!j\AQ->9Q}Rx,!`joi=I>CT PU_QVU+f ٴi>SlM0}_x|Nu%ی  ]7" MV@[6G<hь_$ i{C4Gp->K'-V?N]bL!#wK&a1&0GlRa{~lȆ4ٚKzgͦv` U?dž֐&dᔦVyeڵ-dMC7z|04Zkj==  'fϟ pgo B#GWTʃH3] (( qU'BRPf" }Э'\c^cs/B] ^:5ZW._]弋#[QUօI9kl ]L-Ϲ._"$B$ܤ&E@ 4fbJ t%n:y|ttwH8 %ՙ^>)W(R$B st Y*^i׽(| *x/ R΋L`MePhbqjqaɧia]SV;34m ]_µx]=E<%?fpO|a¾LWo~uWSprO''5O~e([8)&LjP  @ZPLn^tݕ'J6 A^6p۞Az3\#bϞ/w-&B#/QA;p{TP|e5|aΤSK?+^1WU/ ӶCo'u$$ , T/A']\(싉Κ5K&-!"FӠ M f1݅SSc|3Ai/bQhFPFqb IzR_IT64-_A}I,T'SNf#\>ISb1(ʗKkUt^05+ LsP.F3EL*by (|*z9#MB'NzPT`YVlt@Ir%Ţ埴#덵֚%TM~%t6qG9Acօ}X))%#$`x%lQҧľSXo`UD\x].DUT+$V*qϺ ?%byJ`$Dz1vf0*/f J,RN(.na%9e\~+> 4 Dߗϥ]P˫.ݮ5!*rD.DR:5ZMv&3R?Ld2M&COjPvLگV9B.XgH9$՘~B)hȰi-/^Dq 2c`=๩ FQK2BK\.LNTB#A$,$).j;% Rn_-ZX7Usr9\SK&mJE-_`[C NN h'_kϼI6fΉe\A@H:n8Q 6zd՗Rkt'h0\0N(w^cQSazjSdT/wW̾R0tv)A qru>A2KlCqv%s~7 6̹PB\q(@')E՛,avq +qhz{K8!4CMaqb<]iZ>v/t]ϹC$:Usѷ2˽Ԟg63BTe#jAX%4@i(brV,M jOIN+fˠ8V+S(@3q n Su#\3ū:LS%9F3FmRuzRw!r\H>(}I/)JcJk^,yn؟_SQWWxN9ߩSOQw #3Ywq#uHeMpܰodcGm=vFկ=arј:E=Ưcg8qh08 q3x(x ?80`Y#?xfߌb|猏0Q_2nf|q_1na|q+㓌O1> e 62>;ϸ/0E?1gƗ _w0_g;o2dŸ-=`|w=2^1~o}1~Fa@X8q$(ь0a0a㣌d㌿bV'b|_3>me|w3q;_`#㋌b|ό/3ƿ2`|5ƿ1w7dɸq7[{6;2{d|ƽbߌ?b?+Zwc=ƑG38@Ʊ1c<C3N`I1xd29ƣ?x41.ccƩ8x'0dcx.cXfg`\8ȸ<Ư0xㅌ_e\xŌ0^xW0c\x%UW3^x-70^x=o`㍌d[73~0xF2=;x'b!݌?"vԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎOwjGvԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎQ;jGvԎڡ(. g}ArO"c$dS#(P%9@+zhquJ}Ph@/t@Yzh7дJJـeuf3Rojԝt-)7GA@Ez.h#Ѓ@[v:n4(.@@7= cyc"@?FyRhv@{7:-@9Z4t#@/<@Q>:`~>P h@yR?( ( t!Ѝ@=hФC@-@+h;Ї@P@h7Ф J@(+@&*g]草Jπ:vg |; 40 Ti] t?k@|(tM@m4~P|; 4ڀnz}@T  h+л@?i-q79J?(4t=&+t/@{&  t1=@/)@9- wF5-t@[\Jv*uR@7mzhqt-#@t@htS!,P^>1M^@Ե] ({@3+u@>v<@7=t p] hi'(u@tLHt@fmM@ۀ-Z 'Az@e@nPEJ]b&&Fm@7[<;6 6д9Jszms(t9Ѓ@Meh@cOV-Zn#ý:ZG^:P/@=hHh 4T8PR {@N2] t?K@Zt5Ѓ@M< У@;>v |[^N>jpN 2 h&-@ (t@ہF{!},@ۀ}J]3@ہv:B{4hh##NoSb@e@ہhn#C Th;D? ( t)&ׁ5ezvh -@E @4.: h?МR Ng3&ǁ>QY@㢐>P7]@o{.|wL{OT@J MzC2!#$LhbAAl(; *Q b+XW;|Z}~d8@5j1V1jL9iTK>j~MUzoTP=I;Ցg|#݆Rj,Ϩ;uT/Q5FKVQ FzjUl7.TeTWR=H[HEՅ*Mu3TP5:Ɵj(ՅTRD;%TYۨVRNuz=$VRNզޟjՏTnjM U%lTv+iKu1MT+#?MMh$-oWp+hGSD"}kߨ%CuI?пw%#ޢڔՁF}Sͣz6QFhT$רH$a@ ߽wD6>"EP{PwĘ]{S[C;ޫ8^Z(Xܵ}M#s--QLd{ ZVBC2ߪۑ8?2֤H%%lެc>l2[&*KFrKy3x&r]}dj l[PŽv]TE%e$+T6d*ɅHiu*t 2*R7DyIm%3K+%x"NsCk޻OҪ%_*SiV#C5 ٱYz+j W}; ީY/7x}P_5|=М>6XA0$,uKe4ΆZG'qhr۷OUJt+Kfs訓 mhL'ΫE톫E q:u6 &Lqu*pm-yjlɖdk31Ў23--vcnHR!V`6QYZ2h}j7$齃%orLjTmePu߼6SjT$Mm[ވ/aԷW|ǞH.P5 q7eLstr4GOwPް&:6nz.u>ɿw-榝NZ,4ox"͇tZۥ{bnȷm%liE)/:L: pdJZJ݁ve%3Z(]]6b$fnZfⵙV ,IeKLL0lUM3rtp> ƊѮQEk h*IMMIz4L46lfh`;M`2Uo0X)hHTc(e0etcftݶZ.Cr}f,o!SRȌ˸%W]nJZ¯P \1m524>1Yat"kH}MMݦ:MnZ}kZҹ"Hk@%UfT3uFkR-?T,SNXh3YHde|cEIz$H´㲮76||FpM 5D- uS&*o}ӞsЗ?[7}\cЯЭCA_ Yn>7J =d4r0tLz#Q1w ;I|Vv sgtn)pmu#f'栯SÇ +͙6ڃ./a{]ŇeI'!ѝ/gL8i<6v߹SetJ;cNT3qGuF*RI-L` @B{3z>҉j:\Cp":L# `,<=W֤hWg3ەf[׿(s^Y+x[ /|M;PY?=MX&3x։H(:zMIŒD5&S՞餭*KR/Wdh#&3S^6oq5մ%z^@e,G6MobVߦM3.;>LS"U5 xgӵvSźmv)*煢zT%˓3%Կ*P<`@>R7RgDgq}%A2akJF/`i >kӭu6a:54nVRZJ~{OW֎8!_E.t6&szլz~ALrh[}F`>sCZ-&P ՍgA:Y-^} uJv3M%FVg%\ VB^zb7T/p7fTC=G1՞P]k`oO]TS}dC>0O`,MyNB3j~=rD|'3;ztKG$%߂c iU39:V޴;^waKw߃lhV=۷TnWY 5oLnvUds t(2le&Gᅔ`61j?v#߂25Nܒ 6ل̹-ԤvmIw̻te%g^ ;~Hg\k~:{60/%ң-O;̾wmՈܮ+~Z1XG+urY_A} ۗH| l4bM>[72Tٷ s|[euښPsbWBϔ5ק7wrfoz!2Y:gzӖߙG3i>+!!Q'2d#Z8$HBn㉪d7Ͱ L;%Ro_%L;[26CV'tS/ubؓ`YZO"T?ˇ[2rTMn'mޖ~YIW#=" %#ЮZ;pj~zusYs\{Lx:ۡ<堭#>d*Т? 9:1辔s̟+qi:'AyAcе6Ҡ]:nI>Nz^mI%Y,@'8f/R'wۋxC6᭥Ѷ:4OumS]6zqDZ̷ҊQ(ץKg#(^E/vSedm5^ÿi76m;ªIX>.!>w| kq}pK@奕>}qhrZd4]Sh\Chf;GJո^e3%Z:r_U6lE'љD;̤r- -4ƃ H99A<8҂Hd=) y>O,m0"\/Q%eKRx9 c8?Y^>- (6:Z⏹ejӣȭleƽEdQX% "CW!ZeFGV6pzMu +Q2.qX֫ "ȻH$Z|}msbAMm6rYA4(/Iosүր޵V;[uy <ǽ"QI 4ά^4m{QamV4鮓˂TF~F#'h;@|ImS[w0*ٱoצJ=\Gn"=K-%gDrT'ȢhdmM$ }({1Jo 7 cwֹiz!|/}EȶOD/tצє_܊H]_٢{zr~ֽUOvp[;ywGam/Aܴ)wk9?n^4rF/c?li0pzE~ ouk]-hyъVo`- [WQA5 ^kFł z@~E-X[R6pVіbWNz>VX/bb)ZM)oϲ˜-G?cDĖF7SLtsSzղβǣkga슢+ݖE_, ~>7ćb3bGipC#)ͱi 5{/zE+,7Ww,_V8py!Fˣw>{?@h(S[ omњFИ, ^5/hޛ[B6L*pӽw}§ .pcYsgrE4y,vc^kvy яn.Xq햲7|R7wgulul~-7)FΙTpl}0Wmx37?G$/{b F5NI4ͤ)5)Q7ZZE*.tS"0.ͭg>\{5i.ẹڶow~-XuØM\hrU.*?hX{6IC1Y@sqZhFWVҫS]pR\h/n96`tC_1>M ~ތ~&y?`]EqI[?X0pems(5?[kc>f8y*G#~b~V\x27N3g./y 8# f^ ^X} V\t2s2|\p'ہ&kݚ1#N03s[prWRۻ1Ow߃y=_7{2~z?F혯ޟy?ۀ: p#/_ Z0Xݎc~< gn~2L;/n܉yb3az0 >b?A̓/|/8=y=x̿Węw= We ec3O?7:9𳣘?_\Ёj0'<2gf 0ap̯'0o_r!s] |%g{Mb>2࿧`|[b|T?\üW'/13y|`x&g3Igoa> 2_s'y.8s'rw3 >la{,fACb>o s#>| Ǚ?}O2G0^|,x}_?<~w{Ӌ̑a>|K]5S^u7&o3׍y%3!s׏)Cv3o%s̽b>2_ ~;;63? ~O3~bgL/x_Oy0m̵`^򿘗:xV+Ngs;(Pp2_%ˊ_ֈ'3gm<^3;1? ~kguveZ7z17݃ p=O/fľ̷ϼ }B{c;G2(JG3_^ >y#xXA'2ӇyK1?9R7vb^<+}tɽǀ|=xPw5Gwŗ̌ c>YeX+{d~`_calGcnxsÑWg`Xcc>xb6'2O>yS7ǵg4 ,Nb '] BEoߛa >̇[c os [ECW;cxuρﺞyw*gn?'pۘ߹=~G2`>|] nytbz?i0A G3炟\|'`^ f%f>ʳG l0/y yE1_~?o9<07<|Q̳ͼ ܩ%{Tk< <g>|kNm'2O:^pv/iϼܩ̍U[wfnۅ9 ާ=w:W= 3f>ܧ/s1~q_/W b~07x7b; cne~s8yqa%72~#nyxb%؟T3wϪa7L3Oo7Qp7h4sB#O_^-x=_/d><~l?0yy%̋_= |؞C2o?7`>|JO3<7xj,3 ̋al?FQob N WO=χ̇OG>%)_a^ c.fV/ؾ~o~g t5s=އ;x }3߾y 2/Q3/y ֱ{$\7W┗12=f,hGr+vT%Ο؊y |a"a_Ο.4 Ɵaikc _ug./,y ¾ΝV[ ŌΝ iO7sw }Ν_Վ1#9_Οu+:wÝ/,~qa׹ucn6}aw7׹dn_7:w~>%h;/Dύ}ߏy?;?>y|a6ӯss&Gſ6ug3 _X=uJ]Ǿs7N|3׹b팯`9 +ӹU3/,j{eo/,fѹƬ:w̏Y~:w~ ߅/,A׹_oa|ǟ=L &1/,9fMfn_XH׹D׹3 Ν/CTj7o5\?q|a_Η-n/:w\_Η96 _Η?~/Ν/׋v5΃ /9׹z}Ν/ׯT:w\r9|as1 :w\O|a_Ηo>/,~{ѹz |/\s8|a_ΗN/,ZrX0sF o:w\4|ar=&7Ν/?5ɾǘ׹z_esUgh3|cM/:w\׹z |;_ oѹz&?tpŷ;_Wk_X|r}[/njsp}yp·/,fru}Ν/ _r=3}ӯsor}Ν/Fg/,~~;_G׹ŷϸޱ'|aK#G:w\Oy1|aC+_Xk_r}>_ΗA}a<8ѓ 篸l¾׹K |;_gou|u |au|^v3|asľ׹zvſAyݡ}Ν//u|>&>_Η뉗u?p:w\o:w\f}׹z o_:w\?_Η o:w\=׹z[ |;_~yp3|;_/_Xf:w\- _ΗO/,\3:w\>f:w\?oѹz[ Ν/߯/,fr:w\|ar?ne_<ul0w/,=r8|aΝ/3_X|r}OΗ%,/,_Ηt/u|J-|asWf:wܯi>_Η|_r?\}Ν/9׹~3}Ν/ _r? |;_srޅ/,=_Η ]_7u|l>_Η-/,~Kr7 u|/ŷG/?i;p2wǯ/þo|a<8~Lr?yŷo?orMŷ?ԹR/,Ν/:{;__OΗ]:wc|;_u3|as:u%+_1+~/,f:ϸמw Ν/; ČΝ/'sn/:k2/7/5sv}a΃#v|ar}Ν/{4jp: >_Η}_X|9;_W Ìsv}a`~xBru|^|auɜs&_l|bu|*ۿr ̌Ν/,\s/,r_Η_X:w_C o??yȏ/,d3|;__~6|a7_ApL/,yp uF3a_^}asڏ/u|/t|ŷO??~ |a|rؗ_X|{Ν/-a_XW¾Ν/o_Xfu|9ſ:pIşa>r Ν/_X?6}aşg_Η _ط|ŷ' Wt}Ν/+x ou:w<aG-?;_oCvs/,G 6/6|amWΗK_X|x~/u|y~EW>_Η]/,[Ηc̅/,[Ηi _X|;_ |as:{}a{/[tl?xp¾WΗ\ _X|g;_7r7|asI;_g׹'=ξ׹y)'MΝ/W)/[t?rak;G}y~˽ŷ_Η_<=`_X|{΃'h] ΃/WS_ط|+ oϿuy8 o/:w_/,y󂮄/,| |;_Gvs6t|yQe ;_t|a4΃'`'|as΅/,7׹yM o?ӹNO9y0qes}aӹyS-;_OU _X_g}yUI_M/u|y^֝}΃<_iwt< |;_d9>_A:]¾<,_X{'hCΗ_Xfu|y^R>_7[__Ηѽ_ |wSXw_7׹yz}Ν/߻׹y} |;_׹y_:x~`]Ν/l_X.s π/u|yD>_Η _ė os/u|yO/u|y~cW>_Η=V?u|y>ŷ?:wy}΃':yp./u|y^şi΃|as`XžSx~lg/20yL& _Η _ط |;_3|a׹f_طu|yo;΃_7|;_; s _~׹GΗ7}a|ŷѹy _Η'O/~;_`߂/,_sn<[þΝ//|asO/:w<_: _7|;_G=oyp/Ν/ϻ~ou|y>6¾_Ηu/_xM}Ν/_ _X|ӹ?t|y}Ν/'E}Ν/3?o׹ u? |/<_z¾s/u |;_׹a_طu|y|¾_oۅy6|asӍ >_o d?/[~:wy@e?:G_t{3/;O_*>_}s5y>|auW:w/_~};| ^2?u}~_oA?m0/΃y |aӹ<yplfΝ?!}Νw ;G/,>μ sY|4|auϖ3/, ¹:wI+' _o4}OίyI>_Ax׹_WswZ˼F}Νxs¹g| X}׹3/,=yd~/;?6k}΃w/[ue }׹}5|a:w~t'?b/u?aouG>c?_2_طSb__wb_dn_X3׹9_Xu_#|d_k|;o}Νam¹LΝi!vo/,Jېp¹n ~l;}Ν?x{a}Ν8/,Ν̷Ν[U}_G}Ν?sG? :wܝ{}aGO| |ayp+ŷ_||a:{amfuf~[s矿/O_n? |;??şaΝ@l}ۏΝ}ۯΝ}΃_?P o:οg=Νё- ?;Q ;M }sga_<8~d^ _X:Oh7fo:mz6<ϛ`|auS:woI4>`_Xu/;}'? |;I ot2?_wtg:wp o n /?p>_o/}~:w_/u3_طҹWa>#}׹8y|as8y2|a'tf~u?g6qw ;A s~sU||asY\ __?o4}ΝX~<8_X|; o?ypw!}Νb>_ o:w/,΃˘/uc.g׹3}Ν_x5}Νe*s'?t^|.|as珝< y]$|aW_l:?3̰ f3 _X:w73/u,ۘ/,~]!s/,8e:w~ `_X׹/5|a7_ίy|a0Ν}̗u`s z?n|;?_uۗ0%¾yp}s`¾y}y,|a:w'Y_X_Ο3O<迯oB}e_ :龎/,~Fa_eŷ?;W3ů0ӯs'pY}ΝF? |ud~<Ig3:  <"ו0 >CG2;T ܼ'pp2,xֹWļbl?[_wۃ1+Gukk$27 5n'epó c /~&Eann@m f^?|gk^KoVEEa>3I;mxR5'n^K ?cÿ6 6p_å3| 4O hxF?1;`8ib7c!ë o4n>p{ N5~* lۇC lN5|ᙆo6<=^ax7 jx o8̻> {no1jod/; w0iWgI a&M[lLI _cv^mMÛ exצa>p! _fx d3?o¼c jᡆ7<͆2 o2a1;gl5'M~0 711| 4\nx+ dO^o#?.){>Ɇ{f8eS 3 `'E;1|S w5<(ã _j÷ ~F>lx]| 2\ew^jUNyig^hyßN{>p 75?5w4| 7=|ox᥆bx=|ᎆ6|Y3 o1^a>𩆇ozÏh ÿq000ã O1| hCÿa0a݆W~wc kp%5|i~[6m 60|ᙆ4w a7M 5p _cx᥆_5 7?̇>p/ O1| /76&ynoAG4poe'" jxᢃ2pGq O5|' ?gÛ 7>8̇hps ?`) kxᆇyOlxцjjxC|ᾆi8mbb/~ 3ۯ w2p9s||W5ᭆ} m>+ _lxᅆW~O oK `w82>Y gx fx] 6PiS e1~OC jxjÓ _oxg mxmwiapW7<_2G0Ý 1\ix /3 axc¼ֆ.1xó ?lxᭆ s ý 31T}Q@5j`34 :jpTPP**JPSh)9jU%UU<4U*KUK5j &TSMB.Hu եT&S]F5r+jM{,RMNuT7P͠I5j6MT7SBu+mM{/sRͣj>՝TwQM{6qϐ]ETP=؄/j TP=JTOP-ZF$rTOQzgV5ӦϩjWT_S}C-wTSmҔ;#OT[~WߨQN՟TQݔcq;*RŨ R5ڎjfP5jF՜jGvڅjWݨvڃjOnۗj?POuՁTQLuաTQNuՑT:T4jE՚8P:DN:UfӨ:PuDՙ UWnTݩzPތG؋7UTS H5j0TCl7Q=@`3b%TS=B(cTS-zj9 VR=M ճTV7m>OՋTkRD2:TPJ5ש6RAf3TP/Ool>MO_?SO_?OP-mx[vU&H&$*xx25zT"jMTWgx|qlIltI4Q/KW<ҽy֚Zj-OL6ūųD El&]W$*kxvU_ [uNW≯J zEuM"Tb2ԞqITkJ21Ы3L&YY:ĽNU5l(O'6cXWY=e嵩d*i@+HdAKܛTiҒW$S՞*3ғdhj2⥕D&rDI(R{22t"[ o T{?7G{'tztB*[q /HӜKT%K^-fqlqؿ{ ?­RAP{Pwa[6fw-Mm=-lեQL {]42Ғiy ml{ [nLFf+m3vΏL5d*hxLO}^FZҕhN%S#ܭ+5-.~-/NJURgʼ'@nÿeU*&q$A6[V=&-cɬXo;uqrRueYBɔZ(_+c_m$ּ3tGrrW1| zPI헺׽Lraݒ/6H֍ns +rhﶛ[ɃJO۟͏oLRk?o4T=zuۻʷÇw?O9];x6C ~9 e- W@b6"Yia0yݭWr Oq'Nc%LJz{~s ZqXtV6֭J8sHgm;dg6[auM %e!қ(Qg ix0Ϊٍy1F/%%UZQSi(F}Q^!Nmct. V-D0G8/=F ,t@]|9ƽBF|!`0dSCo_Pg.]C*E`Ȑ='ÈraH;VMgz:3寚ܿ_A5 t.oloO''%6CXiT084޻Xk0p(~x!  NF1 /`|to3j$} f*$ͤBfՌ=J?&H֟oZ&/4uIR$6Bˮ$Sٕ7zר Z2^@Y.mG/~ҶK^p9\tDԵf[7KIΙ$QZeku%U׺?gEܴj.>oE+r4`o4fEKz+ H50a^kwhKBNI Db v(|ksk om'"{* Bs(BP1Ha]SH5f6%pMbu.f*1 CqwlUDRh_DɌeU|$w-ZB^6E*:lD׵S^jNkc]؍msp9GE&hvW-k4rٙccXIR͞.=l Ì-*YܛmV V@=l/pH uDZ9^4 v.p#كOhQMN+)J{$Sg0wW)1є, Oj{=״Ob.KǽLTEA=IEs) vnpcFFsbGWIA;I)pq'O 3ǜԷZ8aPSK'ؙڨ4˖%\/l;#7|6;IՕ?hV뀖kT$Sb=K\]{'>r4I$[(w1-Q`g+Kз,K5Ll(sq2J4BC'G̿09"f#^WCw"kߣ|TQ$[>I;;B8-@+R2 }dH~?ny/>[$ς['ǖ.ty{ 5Q6DU3mI*C$WסVzxnvފI Um UL6_,3 R޷$`E-f-بSb+YZ-cTXCZz LQvd(ނ<fFE`6,kvf&g,)Q (b{fȡRKI5h&&mj,Rm'Ѿ2ecOzXpA&sn.yI4kFqUɸ k69zI_5D5~r}D妺aBqf^W/4{5{mJ߫O0vf6J%tux%RF1^߀6@m m/q^`U;eJDS /u~X |R} gI6[D|/?$VSj(`@i=<ۧ]P6ҳR<_><=f Qao:/Ƿ['zd=Qb.} JCWZc0ٝc{n:Ǹ;4>`04gIA@:$Y KF߅"#֠؂Hht|8( )<10  珿-qAHFb,.hJP ShA}ĸxȍ[xrP #,| [BEߨ o\m%PAY/;UiV(z-Ȏ]zYKX)cQyx/ݱ|Mu{ -fgFg5n%D#[g:lF!I"1$SET0[jaLnZTBӮ4EB%3l kG?+jH*5۰}vpIRVϩmE͘[_HX!` S;Ɗ)6YsǹmbݲIxD¼Zrp({k7ٌG7V` Ԗ"%b׆Ѯ8 Ġ#&5 v7sQm[pk (׵>1kTLHnXdeN^|o|El8t _8x|mC 9V9@wPd,D z&>Cܢ !1N~#38,lpP!  %F |gc9udf)'s ][C:-$(s1ư4k}d"5=)rhJq2.(?J4JϾnUDC<%xS1c"O+"˜wAKY`ꟚKa8s[!bf^0%̋)̌k ӝ7egO M Lׄ -/;@̒/c7 z00{•<HX/ 2^J![T dj wĊ$`G%5RC+ Cq V)ѐո>J7=˞{3%3ʭ4[dm&Fp6,l8U"8M@)8M|aGЅ-6E\XY\MX؍-t9AlXIbL0("Q .)#d¼.~_cj1Qw~p~\! OExtT IXI/Hx$w4K;FGYrya'"ċ+L_L LљHhqh #?\Hf G2XRGHMb3 %G&3O 9YѧУ,椗˜0Cx_I=%1D]$&6j'QOD5.rǕ׹I)p}*q.Pn@w#C%198S $^1G7d~ FudҐ (w4{Q`N2}8| (C@Ex%m D{4W\nY4qantKT⍰/a`\EGe OңM2=z$YqґD)hqYXk)+3˭\zAx݌T9<#$Sj$ K4fE8K8IyN;L {*\RjҢY )Тȝ#9SLKnc4Pv@61ݖh3\_΂ 2fދ;5#}h?~LMJ%L6>jîZȨ'9A?!HođRrH{e/"up]@'XıTSWOZaL!e!YjWRTy}> Acʂ$y6}Ddb`_,,lQd)6נ416F8OL4Թ =k;DZ~-Y#/JXM[,*e䝮L(i w= wdd&#!SV%#e?XʥD(7"6,;M/tEKC̎B#lz BOM?'P $[!| J@)3'M.WW+R0I|*,jGk G XpAEf&aؓ;:AМFb] s܏pojj#)ϓwF?^@. 1wEq;"*C1qV!] uyb^ nYnL?[9'zr]ޑo12.1!Pqp`&UΜj>Q`v|yc,"<1 8Vp#%qؘc<%Y-8IǨqI B"MbKxPz0^ P7{rId齾B #BNh(,gB"#= 8[֣kc= ])shSQpIHɼ'Ľ#og -wmޙ`c dH|.PJX93x0!p7Ufa`ٕS}S"#ˊ·'G, _j+=u2!*}I/ :>~NT4a0aGQFQy)f*߅'P2zqu8"O-EP ,毑wc9c-W˜QW\db^[':;FMӫj#1{{A}mf2M+@\4 & |Od) a0\獇7Evz7 t@V( :v9Dz"=HA |cA HAGsioxA 49tA s0s5~3.<Dz"=Hˤ9Q s9Dz"-P s9Dz"=HSD:p 4Θsi HAaA r.s HA HsicA=2HӉg"=13D s9tV!sd9DZD si5HADz"^3α9tNHA͜94esBsAPK  PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._SSLeay.bundleUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UH darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https2.alUT 1cN1cL1cux mKk0C|I 8uZB uA6,=Uʡ ]fwg/=9J{gGZVM!q,r 1 IJkm}a VEzLnp&MO^DOࠪJ,ʫ%fw,W9g+iwC_B/f-~%#Yt4-(ۺcC莈F.dIx q8Clƨ4qEËON.7ԌQ NU:PKk"#PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https2.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UF darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcpxcat.alUT 1cN1cL1cux N0 )~m;4$$ 8v-MJ2&wa"%vx{IL| e5rki,{%4D TiZX`}dl+r-X0ZUgDxleF&PJ q {؟[⽷S.BDdbz(&1,&ЇEewC`?@"̫@#lzi2@e\ /SL?l~PK0. PKq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcpxcat.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UAI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http4.alUT 1cN1cL1cux mj0D!$P 2-)mo%)( %7 ^99؇`}pS±-Jl LOԵ)KHSG++BC᬴FI2}i<> TfH "FW {SX!䫧Y0`GAf.r2z1c/1jg9ڊ_~HL=N8,/PKAPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U1E darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/.packlistUT ŗ1cԘ1cL1cux رn0b3!^ hlmX)RXWTmcCPvvMzZoTcUjfeɻ8]zyى&s}.ܝV=Φ.ǭ M8鑣6F.u/Abo`%͗ImQmQA HjZ) bȈ@S Itb@YLur|fF&k:sbQe %YO+M x0^t:L!!F0PJsZД"Cۊ%^,2%3̕5s]\U3 5s=`M3h|:9LK'Rˆ /U7/?w_A8j' yhixT\d%YV.V Y5hLGQq1l|үOڅp}}HGHcvzgjCT.SCkL_6m)u{S^ PKM[C1PKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._.packlistUT ŗ1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UH darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https3.alUT 1cN1cL1cux mn0y)6QVmo;$Kbձ#@Qw *c|;)6o^و==^ija51,IғbѳaR[C 䝶0HbsPGj>c8'IJ,^(޹Ѯ2Ib}߈ O|yJ)QsWnqbt7] r \ϰ,S)^Q-d ;oBKG#Մlbѡnc Vm +BI^&PK5"PKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https3.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U?I darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx4.alUT 1cN1cL1cux m0D{ň4$B"uRFY Ƕb8w@J+ؙ }qlT YMB>JoV! ..ȡ9pJ!#(<.%igu KDXnڹϏVϢ EJj4gςE{#w6?ۿPɈ&C7潌0%ÜpY6PK?PKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UZI darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http4.alUT 1cN1cL1cux mOj0G$PZZC%cMKWJ{{^{ɱ^ıw-j"͞BQU$Yg%lCE=ᬍAM0Y!8=!6]WDFJű'bפ5cі|.ORlpcOv EBT*f1c~1rtp{aXM w'+ޜlfPK}DZPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_http4.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UeK darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_nothing.alUT 1cN1cL1cux mON@+Fq4\PpQ P(Lwo9bwv^./O<OѣuֹTMYTΆ :ቱX2\Lp&Ls> dnfEo#]i`d#J}}QߘZ([blJr*$zg1KCU<] JŖۺOr߹zSQPKzePKq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_nothing.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UK darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_all.alUT 1cN1cL1cux Sak0kc YuЭ #'/L=IF{OR;eݽ{Os<{36،ͳ@=^~"; YDh aKQu*^h(Ț°W0dmNJm )M< p{{AGDulNX)Hdi81^z@Pl}C·db'c@-8*f'mC3PJRĊ`@G5`rҸ͖UC8ۧ͗OB`"z?yvGs ;cVIZcH`/y6np9rON͵30C^OG#MY],i$lwzf >̗?ZY3-r<u-4Lh&%;GUy-0))w?PKQPKq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_read_all.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UM darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_until.alUT 1cN1cL1cux mS0=xHD/UCnO{`HCĪ㤱;NHQb{#_"ZR]]HLf]׿IU1Fx̅Ƞ)!J!!Xs-M4ȄԎ&G.f,EFJj/eo_agv[54nj*T{Ip7㔔,&_Hg6ď9YC ck3 i 8^2dŤ"<) wwΔ8X ]qb#JK6zŒW"5\)awe]َ,3MSm_8kVpqaT3O}.!^[Ko`997y:<\ K>}^ #moB/AJI`OiqرŖcGg{z:e 7 ly"IWi~!8j ޑox(wח$nPKSPKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_until.alUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UoA darwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/.packlistUT 1cԘ1cL1cux L*J,H-736K- +/-.ONO,H/+.ILB,H,JMacyVV@&PKx(QoPKq:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UID darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/.packlistUT 1cԘ1cL1cux L*J,H-736I-.O,+/-.ON/H,JMac2++:cBPKsMAIPKq:UO __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKUq:UaP darwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/.packlistUT Ö1cԘ1cL1cux L*J,H-736I-.J-,,J-+I-K-+/-.ON/H,JMac++ =@MPK,MaPKUq:U[ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/._.packlistUT Ö1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UKE darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/.packlistUT |1cԘ1cL1cux L*J,H-736I-.KMM)+/-.ON/H,JMac:++BcJPKEBKPKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/._.packlistUT |1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK(q:UKE darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/.packlistUT l1cԘ1cL1cux L*J,H-736I-.wK,I+/-.ON/H,JMac:++BcJPKxpBKPK(q:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/._.packlistUT l1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UOG darwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/.packlistUT d1cԘ1cL1cux L*J,H-736wI,.K+/-.ON/H,JMacJ++RcZPKNrDOPKq:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/._.packlistUT d1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPq:UC darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/UT 1cm1cL1cux PKPq:UM __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/._TinyUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKOq:UG darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/.packlistUT 1cԘ1cL1cux N0w&T,H (#Njձ#'V$NTʝO;u؋*3+1޳ %K";v;ž礳)Ӡ)=Fhlѝm;0ewԪ'3r0̷td EW0ֵ,5xɡz{'F}}Nk'>SaOo] P2$D"@(a;|hV*êi˿eͯ8Z0\͟mhvvHD%U9D.ȇDr!!fhTWD|"C쨤X4ŋ"q7+&GPKF]APKOq:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK"q:UE darwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/.packlistUT a1cԘ1cL1cux Oo0 0d !MgHhCik"M*7O18㼼f!J7KVkS`3ZRU價B,rFCeA*):A,LG5ĉ0icrRh `҉-u*`fƳ؋͔y oupx~PKIJPK"q:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/._.packlistUT a1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UKE darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/.packlistUT —1cԘ1cL1cux L*J,H-736H,*Nwut+/-.ON/H,JMac:++BcJPK BKPKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/._.packlistUT —1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UF darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Compress/.packlistUT 1cԘ1cL1cux MO0 @1qmVU z]Q ʯF}6:m,K e*v,oCS+cebvl,UM{ʶcU ?G UB{['ğlzKLSaiaDu+$wfR3筀;\> Vh' j 5-dO0x9&4m9LצF9GF gb~k?֮~3/ԗMk/?:{g3GFש6^)>Ɗa)=v^nZ\=#b-@ 6۝aokb]Wuu]]W˵@R>oo^M鰫kL]g]M[ SnU>H 15q1 1yȹq[wilö^,ޕMs H}Ư7Cpr)8ZǧgЕzLUPy0.RG,Gw\d>Z]Rm|M,K,aNG$@%Or~;] aH&p ! @, ,H۔o$sخ֎z=p!),UP6c+ؕ_aY6F MRdtOQM!liT4 MEYT4"s 2MEyo*ʇB-%51{ Rl** Dz%&bCKA>OKmMM PPD@TToϣdnHKS"ȁI;Ua_P1@*hd[4ʽ{,r-y)滟G_@-#߃AIJdJ-^{̏gw@|kr@c?UĮ۰+m ^(EYmOJ6N^Hi}*pJ@NP.A-,_uv΅n߆Cu\j$@vUn.iK'i@[]騔#3q-N  vk/86[bM6y[1)lS36lS3qH$T]okƏP/"4";֗EdG np2T -+&5۟''+-*Fƒ@H( XR='2s?LFC2ې%=F-$Yrڕ k}fWcչO$ZۗH͗vN6_mYoZ0;> '٪4Lnj"ihҺ^yF9#m܋Jxa Bn= n#˷ݷ7Z#3a>1wL#D.@>EWs,eV`҄ dښDmZi/{f{H!, )0\ rI]JcdxGHꐶ^&z$=x">c p=dmyP"9hwJЕק ~>u刼HXrO(*j>GXAkWͬ{(\e>+{*qw[1t7u.U#8 &({?tlE4O y(t#'pA4 !yʮO=|`8/f*|j]5OH%nm-g@M/z0 +BȕP1'mT`GE*+K7Ig Pg7xrd}e͍P @Dx Z }j",4n ea&}~_ڴ`fe$ O+W$uAx 90aJ <=cɁ̋)n]N|sJdmbm͒D:}^Ǭt|>|jIbD,0(-?f ]WzUPz"&Q,^UѮ߆y4ԍ +fk`2 ; @ϗv`A,-9[`{rBG=SA;v0i hJ͒eEPԙ hW;_} IX`[S(-`b#p. nO_dȍƞ4)oؔ˖~}%imCy{ElXb`(r؀MEvչgRu.X~;[K+IPxlȠ;rbP n!,Ȼ s,0[@AFDZV` $}O"os%rs,4McoFJK(yeÚX3;&U$w~&>!41sOYڇP >ŶQ\ ~2]c ) ) gǙVfue Ν#h5駙YCFmX#B#vb`13U{6uCzx=N4 zgTJ#>Z͒h=B2̷0͋6۷7-OR03#eI-AYmCT1h/jyF8 t`Ljq B1mQQg; #U9Wfk\E[B Ќд h~&ZTگAznք*1nޘPt"-j=fE촨," h! 4ҟgS.)oٔv0F ۥc]vWbYBSxI9 O1݃t(Ƚ; Umջ E'e$jeXw%C?TmЮ֦P(VzH1lez*6.0"Be~bc1jP@g:fmbuwam Pa7?цHXe d꣧.wKc&g$vmuy\x}m;Om̻|:_7hYfRlL֥Z1k7!,O%rƎ mC r7whA"1"6pYH2A%P^hmRtGNX{6Lv/n V_D:\6'P0J6ް$$cGe6Ju06F1AY40#|7`y1 6eI!ti[x-FKPtA %|@XM<<m(Xl wFV{vF,n C0W쪄lm;ԧc{aq_sߊ& O_x[1G866&Eڙ&ΔP$ 'd%'aNL =/x ?ͭ nLfRt+Ch2ArmLeQ瀟⧞}lH,`L|-~/~j5ƤJiĴ]8(=y_?A|:F#4L ${. <$<$_*LTbp(kMbCB@*,`ThON "3P= gc },D%BFaFI<"&9}M:~ }W gZ@Nv x׃ B;w' FB6@]m<$6fDN~)+3 |a|3pQi΢(h(4,Hp$|M,m2Cofy Rȡ2G{FH4y4^ h+*]В ?y=?Y\ˊU_G;20r 2gbl$B[kqf!'~Qw(0'XϽ1~솫~,I&P.БQGn,ʒ4Lf@|.=( l 9p&_3uYL<[:%)\/Ր8Yؾ$bАT=Ax,_άM.ֹ,T˼xp*eٲc3] i?q}?LҐN˂Ljy;?/ǔSy| yO8fSڒx $f_Od9>P7RYZYbl=m^'Vpv xIJ !2j<ې-H)af8FX;PxHi6ʙxD I,cπ=#ydI3FTV-M<{f过0P>3@|lnlwF#mAgM#_o:c}bk`| 1 2in,60OWz)?v 椇08 C1 >E 6bO=ݷ;ucvˣSqF;h%K~WT?M0 YKy4èl*,atD SydY1GSK+ly*?HuoCZOF3`*~M9:BŸMeSQ5L]=~jVm^MWEZ'e37f8 (2$B!HҖƁ{Qr& )Msx+a>X@ @ Sſz''h3e]Y=W&RqG:ͣ N^Fi00Umh=3#' =;lZp֑vj"928WiAQvA n6[b l 1l'@LI$Zl \OM@Lw 1l5 ݒ*>Sq A̐HEԼ$/oiPnoO9Sfi:%$=ZvvS@))a OFd,A8F %\8m,$OI <HgON фH ҥPz~j1Dd.3ǚjbb]Q`ߘueL@*F =擔=;$fc6nKV̥9 d;+Ĩ5Za"¯'562 OH?6iHG'Ф.hRy1]0{Y1}YRJ)[)妘ICJ3eU#ձPK5z? ΍Vx80"Px'bsӞظ a $S\Ck Y3e6yWRxWl1 j^@CrXzttU!YN墠nlDm7t)R^Njaz`^G1B\0Qqw.4L/GxL@s7A嘸 Cޫ&C!d@fGzE=H.dk_LEΛh D`X=zznҷf3%VK( ~,87D-dԃȆItr%)M7b-i<*w~oҔ54ߜph:*ÖZl`ԄKp\va@μ0-#I]xL30O;u{lD.E:=A zESk>!.'PUL;bRB·u' I_t6ƈzLʿθ0*4P0&]/iX!%oI-ZڸXLNGuxP83.eq=/ŽKàS7Wz|+5%VqCZh[]'6+nX1vE0#V'Ot>^ LPg5oqow~t? S`qi kA- }7l W/r#N }fs$Jmꬅ,n̠fꉻzGk!m"a J8 C_08B߇>"t `BCLߖ@%ˊV.ˊʂo4U&0G" 1>TwfwupXtDӜWni*"=o_) wg,VFŻ{3b~G˯Sݟ;t"]e g't?gW_*V'+#h!h,< YqIӱmm?:!!?1u{Z0 ʍU.Nva6 a}ݿ cCC9oQg7>CO#X72bWó r_hϡWy;JE=3U29xd8aZ7@FJ$#H*d+1J¼FX%᠍8zTdlZ;Ib$:1\wZ @L8`8zk(.T|F:/L|q@šc`?cY[G,M!n3$5^A|"^p&oY z&JF̨1J*dw>!"߁GxM{מRl)>ex q+Eq(CmT0 lؘ zRo MXct4B. إP&;Ѹ!MNPڕ$5h{]yǞ ~t8ytI9 ;F"iX`{zHSC+1 Ұ>y~IpJ1ҭT@x꯱bܣuR~^)rM-;0:" RidI:X94DUX`h(.Cjd*}a {@8h>AsZ_g!rg(Ƒf2PC]Cbo }(р 4rl7@1i&<|}'bF ؚV.FSmlN^qD'Ij`!Qqg R%yxϭɳ7כ0 fn8Cbi42XHDk8i:G# ٘TN1+L<ԮTL #+g:ڕ@>= :pX3˓+<\i {#f|D){!wL2<ʴx]l9ʞV!f[}pfuu>xU7 3Li$v:zP16u{;=`ɛF.' :@PR`>Lcn [v$$!Û? \:;*tyoCP*W}Uo+="2_/h"qm] {L4O/6Lc mMZ)$)@O$H2.jL3M_qf_ $QB;?"?ja/_hU=%ܓtC)B*W4"ګ"LWRUmj9 s39#b:p M*)|u+?\'W\`MTm-v5Q/{4Bk^d~ߩ0jR>]SMk)km1}ֆ{>L}oDet5xiE+.L%W q0&7 % :hncy𭿗Nlm7ӇMx!{2lem%M|◎ WRǔMvTTj*XX pDzy^ki't8OY`y] j\Մ]Ckmæ?nm?/3`0^ 3 Ţ7!bBOw{ c[xp CNԍrow9"~oF^xJμȌ i!4ц𬣳Rkz@1ې2"m=m=uk %Ƅ#yEɶuwcg?wѭnB7)}*eC0iyGq) T90h9-s9_EՖjW^f5U$6%k\90똷#B3#Bt|]U^{ s'i$ƌn" /lfxJŦê[<6_.r C #,oC,>-}7'SNy[#PXq+-5e@I huRn`j 7mKE?ִ@O_ѦU6.y?&mvC=}v  L2hb`S CHY-+j@6AFYYaWU{ LSRWܴ0raWK뽒8᪔W2\;s$uښAhOSʿ(-iчͰ@ꍳn#wZ\}PG˹|g RY;hϻ$|`MOފ#-ۺA}=g]^~TQxr`7ȿ ܶ}I5p A.ri7B:vKF2:ZBݤ]w9a7$OCi4FlЂG.FF p/CCᐝKWO/&KkVKdtnop'V"Lg+;@X $zju(@#N pBTRiSEX e-RU2~}%+>za]n'%Y$!mSw!Jo͓Byu{ 'gmṯ]z<_~5:[`NuwFėu&mw'( 8%qxzR^FbflK _Gfxhxi2J^k(DSʇ<۔GmJ jK`vD{= D/ǃ.\ٝ{{EveWRsҔ#_;tX-6/<w/R.Eނ1 {)-ԣz_F:x@]ٻ"~@(>YqPrs;vx~[rk0īP' h?V90LB8m6KD$I >,t_3 ǑB枒?=lb05cl#vaYSᇠˡ:ENU:P!|\ܪ?ey MDkaٝ7 ncߺ׮*l.H! `S bJCt'PxS`*JC{_ Kʇ83nd/ݨ;2HQp0qA^F -pRnĖi-ׯN= "ݞ}KtZf}/OKIP߄y} g9e :> ͒a4t ;~=D2|Fk Q:69W&,Ґ`bpN_^Nj٥ nтr<(JH׀ڧ 'p =TK {6|;ZmF2;$m+d&XSX7)i`cN:tȥX|lg7$cr}-(-3*'`m iVM9қnU'UYZg6PT@eǹ_Q=?f= rً‡0r$}$>5_!A44@: ) tK՚ ECNx>8' ը!.ԸI@%O|H[XЛ( ̂aP bA;1?{LKI~Nr)$R>(RFG q]:uXp3yTRjrʋ8a8?*i0OqRE .mӓ'}sbH/x)eXOЇx@=/ ds-ʑ =)xc2<47 .Z6fL02MNcRS kIV 0];FI ǶGA)3Atͷk3L.ηCVqƫ3=S!ͷKAH,bIK;)>sJZ-lݼh>!2Zqddѽ7ޗ>tL!tfJLFQtMtϦ{'}{ݧн^Ht/LKtMw;н}>B?H辄K龌t{Wнt2Wӽ}7KH龉MtO} L辕{Ite 'gO&fߙ'H)SXܔ)e55unLvׅ9*u!e*u֖U8+tQW>qyYvֺ՝"kյKkʪkbu5XU/-u8W9kRl[`Uk/jriy*Ŀ~VQ[ʩSUY[zzʼU3U57 .b]];zGv.qֹZ+c[.g}XUV[QtPk tORıNbKmzWݲe5kKʫ<+;%Z0V4Z:oAI{u Ue.2Yt9:rUe*HU.ecͬdj\YCRd}kveseumN0k}jgsfbf*[T0솁+=.'&[\&G 1^iXU/TWN\2])|+¾?}q+p4s]S¼`qy555eee˝5UZ3%BF:ٰ_N6kk\uv߸̉Pn{0|Ĉ#ARZwGVU.h\ ]dcr,K+= c@S# յ5LWyE\&;c =X̫,TUKWVDunR].W 5յNϪZFB@֬5#ݛj411ք̭&'Z̐3`UaF QYeF'SDaE'hBvjt%[p]0 7B &,^oeA1td!*`4lSߵgீ{vo(Y0X Eˇ˅U;UBA0 I#9^o~2Sn7q;{p'Ӹߋ/r?}ߗߟ?7q??7sr㾙ù+Gp?#o(gq4p,q?㹟\ODOd;|OTps.r/~1ܟYܗol};ܟxs%B2GaGDG(?'>?~;/ײp B ?օ.\ ]xw7 u1qDwWski=Egpopk6wpAqn7p;Uﺺ꺺꺺꺺꺺꺺꺺꺺꺺꺺꺺꺺꺺꺺꺺K`oS{qm|ߜ}z>=U4# -W{ܿ5c (s' *m Apg 4 SUp3% ')L)Bhp[ ; Δ*tL7#~ Ep 5=>g2 {.p'%u඀k)=pK5fpw K3*5en7AY[`J,+˖QLzyL\*]\KϘ?BUSZZ>TzGJ\^k1>tjW.^ʩR ae55rU]E|{V֕ױOŇ6@e˵+]NgNJgҲ B^èZ]Z^,sŁuVaĸFrUF \^_zAP<jk/S][ w_s| )zu ~v2P^&CAnyU·+\NStʄشZ%Qgb `>! }T]ZS'(`&XS=5]e=ʊo՞j XSD0rny,?s*[ u(dR^&1d< lR׃HtU sⷝ+oݲU_ɬTaD¯ )e5'& ^G'oOmO9[ S6=Z᤽SS톃ͤfcó}~kb7Ca,|3[Amо{";8̾{"vg9w!o*rxsqE>#4p9<7 wԍrx_*ѣ|Odfq}@FkyUrrxX!3>bnt3' BD\c r89|8q U (`+Fr ?;c<~hxR ώ-_5c"~|< o9keD8~k?1%?>>;oԝooֵ_Q_5ug=_5|8~OMďώ'8k%ώgɗ78kt'9C&`ogɻQ_5ώ9kC34~D8+q| '7?>50` AW~|ީ_:}5G):nD`ަwVO|QK:xK߫W:8wS:slH_X%:\:XO!-Q?3?Kp[DgL~#0y;pptgp\<v LOQepckn/} !pßs|Mp| Nß9C= {=p/~=plWu껓frGirGuuuuj6Lh")DCwExitf?)Ss:j:%INڏ"~2Iޏ\'whH$%XWYv9M mT_4ꮠadVR"3z V3N5+fPZb?r1~ {|eY\leyk*ccC5Tjc6ǯI:zJwQTPK؜{LPK.q:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Parser/._Parser.bundleUT x1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK/q:UGF darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Parser/.packlistUT {1cԘ1cL1cux 0 E *N@%~KD2IR! ^seT+(wIitb{!ѱUɎB esVYESz7<~PlI"s]LCq&6xW4ft?|^i6&6'dz<+_|vzFCzA&LPKOxGPK/q:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Parser/._.packlistUT {1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKXq:UI darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/RobotRules/.packlistUT ɖ1cԘ1cL1cux L*J,H-736O/ *I-+'H17-3'H?'?91G8#(U?71AL7&E= PKMxG]PKXq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/RobotRules/._.packlistUT ɖ1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U? darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Expat/UT 1cm1cL1cux PKq:UI __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/._ExpatUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UB darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/.packlistUT 1cԘ1cL1cux Mk 1B[]WW`4L6f!<=z$OMvf׿ Nbz#f /W4!Iʺ.ks'²@D/KE|9A`?vPGu8F darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/UT ~1cm1cL1cux PKq:UH __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/._BaseUT ~1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UB darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/UT 1cm1cL1cux PKq:UL __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/._ExpatUT 1cm1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U E darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/.packlistUT 1cԘ1cL1cux o0KpD.ff.nK /X,~h2y}%Е#݀4)͙>ENI$ ~Wtô5Մޘ\0C^e -],)Ey2 \FKg34$9Ѷ{%t1DE:>18 e&?0h旉v&[ʆ´ @+vJtcn$k!Zav7/(z]O,NUۆٻVU:HmQ]w] :;ikI8z5x9[i~T.aBTZ1?aK1_IrGNL||r cPKfk PKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UE darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/.packlistUT 1cԘ1cL1cux L*J,H-736Џ-I+ǧ@1P ?KH?'?91G8#(U?71A#F`rPK%.iWPKq:UP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U_O darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/.packlistUT 1cԘ1cL1cux L*J,H-736ЏKM-.HLN .-(/*+/-.ON/H,JMac++ -@=PKL_PKkq:UZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U'G darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/.packlistUT ė1cԘ1cL1cux L*J,H-736Џw+,L-+ǯD%$xu)\E9ɉ9Iy)y9)pKsg$&恰!Vz85ae1ȥĩ;PKQN.v'PKq:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/._.packlistUT ė1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U5K darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/.packlistUT q1cԘ1cL1cux λ 0Dޏ&B^u@|b Br²xTJhimggBTR=C4n9#Gm$00Zt<>1ٻ6PK߁i5PKq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/._.packlistUT q1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:USI darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/.packlistUT ×1cԘ1cL1cux L*J,H-736ML,(OI+/-.ON/H,JMacZ++$@PK;bFSPKq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/._.packlistUT ×1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UMF darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/.packlistUT 1cԘ1cL1cux L*J,H-736.M-I-K+/-.ON/H,JMacB++JcRPKHOICMPKq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKkq:U@K darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/.packlistUT 1cԘ1cL1cux  0@w?R\Bł 6` ICMvQz3pNpE;BíCV A w^;;dzq%>:А9(UGfBC'q. 8 VBG/R,W0o$s֚U]IM[K7ZP;7PK9C &@PKkq:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK4q:UUJ darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/.packlistUT 1cԘ1cL1cux L*J,H-736w( -)wKL+/-.ON/H,JMacb++jcrPK!GUPK4q:UU __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK5q:UaP darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/.packlistUT 1cԘ1cL1cux L*J,H-736w( -)+.I H,(+/-.ON/H,JMac++=@MPKEc2MaPK5q:U[ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK4q:UK darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/.packlistUT 1cԘ1cL1cux L*J,H-736w( -)H)H-*+'L?4/Xa* K/H?'?91G8#(U?71Ậ`6&M$ydM0/4PKsϷpPK4q:UV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKTq:USI darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/.packlistUT 1cԘ1cL1cux L*J,H-736 KM/L,I+/-.ON/H,JMacZ++bcjPKT?FSPKTq:UT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK#q:UID darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/.packlistUT b1cԘ1cL1cux L*J,H-736 wI,I+/-.ON/H,JMac2++:cBPKAbAIPK#q:UO __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/._.packlistUT b1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK-q:UDG darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/.packlistUT v1cԘ1cL1cux ѿ 0݇ %AA>g[ȟK^p} ѿD^æд v> A1oQ%\àsHQ|0ټY~x oӫTjХAU*(H].R!ŒJbfvZ3Փ%x9PKR~PDPK-q:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/._.packlistUT v1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKSq:UMF darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/.packlistUT 1cԘ1cL1cux L*J,H-736 wIL+/-.ON/H,JMacB++JcRPK#CMPKSq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK0q:UG darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/.packlistUT }1cԘ1cL1cux L*J,H-736 wL-+ǯD73(8?~%ɉ`E9ɉ9Ey l bes1j!I] ]PKhPK0q:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/._.packlistUT }1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UX,F darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/Util.bundleUT f1cN1cL1cux {|SU0|{EZA JHCS8) 7K -TzMJQ6!3<Υ(sGXA/裒/N-ͷ$''yyٿsk%YWOA0A0 -A<sW?a¥+ = ]uH2}y`Mp% Z^Ssal7z;++j"ԗ/-iʫqUVDy~^ޖѰ1+6V-,(즼cX_ae0o%4O:=BUjR+cU9*;xuΝr1vNf h/U8SLlt$*n[0?jS2W_/eM t-;{tj L# B* >X1+и ³݄Y %qּ毿oQ5s %'tHuBº֦%bIIek/T*.8gM|WrRخ,c...........................=L?dYnYfYDj4U/ؽmɛ<^vo^ٟtBn$g_Scw5j==5v f߷y|*?; L8Yʄ<)ݤeL$p'< )6m/.;cSeDJݤ0j<^ٗ&c%?iwuSS_>KX't-obYպb}Eo,Ee/ktX3,&.̢ϢG\Y}+,,ʵ߳XXE7}t9Eo+E/`uI,z3\O,.BXJzֳz78u9DVyB$_%^²54K]I\@^ iГU %*R$epdGoT#R E>&5zeeVK@+VK2NJ%ya4ەqjnlYl=VIr}UlgG227I| Z_ 7u1Exs1]gIqNL .,F,m3.wAhp_Ӥq% IJ}M9jӀNfīrKĬ'-vٽC hw3ʧ$u`y{іu1@[:}EOtʫv{PWoWA!LwMC;EO?|BjZ;Ms9I|zi{;U~ -(֌$Bb`X❠UEJ-)vZGF*zJBM <.)zdM4yj54y7 )yIBPLbYo~?xd_񞓈?h|@n'7Ħa؞7 8Be?a#Rwmdx!+)\\=XC$DTphb&&gOB;v2{A]&D [kfl;p4 w' X@ g ƛ'0l4}(0j.)y) &^Xƺt( * 7fx>+#v2Dkx'Zlᡢ!^VV1xM].*8M[G.`P5`6*Po @[e[y"P^WU;MYS5[W e P,}:T7=xJj-Ѱo/@{;XYÀ9!:c9v px9#ߗsM*^dKe24e4ZC˛m^s73r'-Q0c@쟍7Dnr=bӋ$6  p8jEG^1YȲ*IVPKơCۈ`f䃒|h&MO DQC@A(I^D\z_VX^QmMfscd ^Csy$d4FF#")NueZ{lD=;OXb&n ]2r ʭUZsRv˧׋R~;þ5{F 5pt2^|Ci]:˕,!K?-ej9Gm+QG"Q+H1}1(6C /P)miHj38pF6>Ү =,a@l \!V`mXƮ.~%!5gi775dl {vn(AswIYR}KFp %4 l Di6JFb;?2VLkiFR$ҩ4҉NH +M|E$v.G׳y|=0YœmVٴ{ f?4mV * .<ڀiJ F#ݓoN v&>B=V'fo|˄IL6Jb CڕfX6$eY? 1@_ x$Ɏ6RvlL0aYc֜S48Dw<ɻ AͻM`#MJ^{F27@~)o2ASfs -M~}SRl[!hdp7RW{o,X'yPi^Z&Iq'vm ZLI^")v3cb ]M )áTjfx76]/hmg ߋ /#!ؔH< ui[;{ӸbLʑB !5ѬЉUx c~Lv6ŕ1<2Tj]_bdl9F0$t+z%b0qC.;̾ٶFAhw`&'5a>GI_trWpH#@es`z"ীv־,z^'.Z)[w 4agnAܣ@+O)d)E-s3Rq07l܊YRI]y0lJZC&?]'[`ݞb7B}a4D]-N{'1j6*cQnX!4zھCl'Iw&q-/fym%FHn%yu5@B60IXNeԶ늸:=DGv[Xi;P:كjd/9r>=%@=,(o=Q_,g7"V=.9I ݛa~X2`˜+sc+Smec̐(cRV?I*ɄT- &I HpgT#WRz+sdRPO+8h3~A|6fTk 3c6eG%!LmS ՞C[Xځ5~`*͒$L (ma /UpEU)ncӈ_K#r!Vzdj&5hh+"t|L_ Pt\9kL%g-XHH[XLABA@9B+[V#srsF񞕐8\~ZOmyU8 0WEiAAr(H @! >q`26rI.H!fp#slIقC[6kS$s6yHPWYfG4pD6ַ7C󐡭NAa;` ^>iSzV Gj&C,)ߖݻl&fޤVgh'f5&:}`|E;>x UoL+c@d6ߛЅ&\t(_tx+ W]7ݖd5#5hO[-vٽ ĭMiUlR{M慻ARDq Ufn>hvMZ0JH3+2~xhߜß3b+C#!6ghDĄ -QEYAbBln0hv3PϷ*nPGw1ZI-t8?32<#(G[ 2͈T.4ی b)"aq<ެN8S'&v!/N2՘[=炻f յ Sip#"9W9V,?E|a2C5Ln%T{"qE@Ł/M\$%0-JT@SߝMj$82q*X'1eWꀄ@M,LHh* ɕ/1XP[3HxY ( g\_&l)S1 /3y"","NE'qsmCeiRd2aӦZHYBfaԈ# L\A`!YHhMY[SLn3иj$' 2~A3R&ְ7:X;K &"$BD[U_DsO 2'2%2uTTlzZ67=I6NgV <ܭ)cJ/7hM;oDO'o0녛X #Q hQ\#AԺ2H֞&b#!c R*lA> 7K[QvK[:K[ ]-.~%B @ 8NDZ+t- Cgt+wf0[ʄҌt= zUFI0 |fSXG`/iZb!b4C4i$E!!ĴX$Ebi tT`Aɐ8'2 Hk/\ 2Mb痷qnc]f"t>A 43;ecLS<[@@fHx vn XVݙ]M:q#/`ztܔ JYscȄ5ɒ7&S <侷T^ճ`=/^֫-}lBzZ dC|Mj6%WBZÔ./D+"^VȔ)"Q:;Df >L|5jHhbǿԐ: C[EL韛gtjdT_2AՁL4"O|*5fTT[PY9ÕЍPϺʅ# ($nN!a30>M34 a*VH`rEͭuJ ̮ $^3ڶGͅQ6-8F3qȮKj%}ߤ~#]IA=VCB\J4~PR Ha8*pt vډ3_A} E;\7\$.kτ#MW@C>]RBvDZDwڅ'#?*퀢3LE re%Ӧ-*vFrr}2 TShVLn )h)̴a\w|~AnY;:.~kG/tޒuBo.(fh,,ku5S %g.%sR&9j퀝Aɛ@jOql쏀s e)JH\z|uߠMwlLvZCk=eLy 6:q[J^*cdnzptڨ1MCcq&QN͂h!?`v/Oh~Ww#L35Ð5@q@.G ^ik!by^{T>KKF@etDxd(eCgwڬs$ٹ@p6D󉍖9ol|[{hcSͻ;YO%߯F-`F9ZNBƸFWR*G67R;ۆȇ=uۡiNN]N$0!JNZ{'p?ņD{NB{[=x?f3B9{_g{.n@?Y(" ~l(e& VoI}Dϕ4\(nG R %.}bH4A]]J`I QX";Q7+(7TЉyPN`[ƱBR ।F ❕a`)suy˷Wd#$ 0a37v6 cCnhR>dP FSw1,kbYʝ`\n8L3VѻQxc߃ (77 ZC6q%>OE >#"ٙ#?Lk[ _d  YCd}r> o3w91b-/E݈\Լ ̒^7ԕBB׏#A+^Zpfcޚ;:&lMۚw7pN߼0O't7\Xj-3iL ݸ;uNL|{/ԑFLwX)W[?#|I.dPeN=+R%Jnx5ĺ%j\c~qu ;g*[z#?1Ccȇ "oځ &1~7L*56C^}< x \!Mr87Ӛt ytJ-ýK'ە{q1jđӮLh!K=p{Z=ZWo!q-MmߎNS5S-!zpO`!651ԻzM!ooo p+DYںںFٺxhy]ܶYHԉjzbn * 'չSP^Pc!\a̗]#lGfCyJ͈ؕᕚڕᕚ3$ 68ꏛDOA"ñ?1A[p3-|b_ BLJ|8aܮb#>#pgDvLȽ]q͎]ޮaK6̤eD-|.3FM/,$WwZofΪC&tdW9<@~AcWI锲N\jIɖS03|/r ˣ!W†bC!{6o@ HA8zmVȆ[)OȆm2km?|gQ?zxVw?zzR7hIP z3Jmc碖hS\7pA IXoFcZc|ȕi8:4iA:P_ 04r 5J絫J_F*]Ͻ38bk;7#}Q|psY3FŁ9xߡV3i&'Ym}tn>XBE,4w/ ljmna͜XCDGͦZaIWE>NII򷱪jC/)AUDU&|Uhe5ݜ:sw?NjW:.'tT⺛W{>>[^C cpLjIQmZOOml+;alSp-E=ZBu\؜u3{p'el*+%6i]G0kyR*k}bRY=F408iµvFdxc;eXT iKHz UcpP\OqTU=QߝJˬ;wLJ^M`\cmL_St[@M(w1MЦi)BxA ڟL rn6Sk΄5^cD}8rw'YvO^ƈ؞i8tOD]>{Ŧ$WzNap&~ ŷ-M2I=:ѩj9'Zف{WȬj.bUuFfE|dR ҆6ܕ!;p*:kpx;PY;%3V݋Cq ל^Ck1;I]LyՒ)iiÒlhNh5Rrۈ_N@'=Pw-E~w+|9(S.}7 uI(yve%N2&/K`w Z]}դ`3:wܚ]<;hKKq+IaI녨㢞ȸSL" / ;){U$LBw'ѬeJ麰Ý-vOHjAeU,O$Y5e\~~葞X-Ns.W\8n>zRIcj^uPl ÙʵƋ 6ұ9'ąMA %MOk0Cdb2B[vl0k1%9Hv><)^V2l INt=mN_i|( Lw ~j龵M{%D#f׌;/2:f%ldZ"9Z?a!#wpyIP`Py@Q)#ngvh,kAöo -fףWgnHx JqU֬S-h'x"'ֳؗ8<%~;z4f(۟7!LzP{NwmT7kI{ gvgGyjl cGHRƫTcE:hb Gܸ32š5U<5br@*K8=О/X>qJu*&;xx#&㲰YiUd^so{5c[צOmx2DJ8X)'{aU -57ha7>()xUY36{3p=IqNoox_Ļ,障 O\ȟ{O`\pGwf@%m {NnaAqŎ{8$LP޸h9#n4Ǖf JQԃ!{~eocʘz$M b#iVyZՍIz[c$w4Tufa/ҟJf0\^ٲ^by==nu |c]dy AܣF ¢a (<_<h EdOC]R2nش^r ϑoiTH6:qUy0|nkJw|~snML[܎:mӎWP|Е.\{&^uwK+@ կ$ /BtaP~CP[0lο Y3m<1;wwQwۄO[@R'E6@ѡM8vMtWQ&|==s0+lUI("ѳķ9f|FUn~s4_5cFY`U>:]vzU# ΢J Jdٔ|fHX3hMƐsq'z*иP utt-] |mIf^47&i c>!hE|v\`:͌j ^ Y:~NuD9-al)H-tҗë~-ho2rA>(E(eb qz_@HVB]@`.5:'|xNx9qer#`ҨRb3X—->tp~pc:y)]jKkȨHGiVQҒ 03%oMDv@Ն5SmL)^tڿсw{E}u~Aw;Ui{]ئ7*L^Zf7kvp6,E,鋡Pxe Uco_kweڕve]?j7S[A܀OHwMhzFЛ%1dpOEߘ;*gH %ilm_j"6GUm0q7BeEݘY5#k0eNWQ+I4\p-!Jŧ+Â:.P5\[##VK$h!WEƮbC |vhK5,-#"oXQ(}7oGyT,9^H\sb/k>wp`N';hHj4 #`( [2#qܳX(Kҁ1og= ^ϿmXka׆WqX!3'RM Dq[Mylgj8 mݓ!G$VJ5O`X=;b5HıQ[?yMmh_G8 ôk͇䩜ՊÐq0Ma=y' 7E *4!B9DO/{SA67A bXaů O`2 oWU&Z LlԐK*c7yUk4Ѧ4qB<ЃV"| >`A~Sj"ݝ{Til"b0Lo;xg-"h=uK _ %v -RcM:]=Xq]WО<<?HNlL L 쀷Wt5WR_&&sK}lyΜ%-z訒(Ɖ)fQWi M`U{do$Y=ҙFe ?2jʉlg}j9]goH}!(5\K8i gᣮ9faBP)gU7R\>5LR~xP#r;Evij+GTI,j>ÐT{ eHFO<\3&vjZEs  hZ:"l5y`ρUGtxg lwan( )5}@tLf'P`#gOIeWź 9}S`@25xInv1U,Wak`Xf T5 fHNiڠͧѣ,c`7_;eP8uY~%&/O~yCM?#v|+ع±\G#h90][8džљγbQY]vu[vJl+/;ZӃLCP͛헭gLߢɛ2 ToJ޿ {G>,4D634Yo>fQ.IIotKI7%}8VwslW6b͈4~ivJf2WteRN&)|rH5Z|k:*8D5#6B O_H#AcQwew 7U6yʾ|l P%Q/j|1ZB,y arZKfVFѠYtCZ =3€H2o W:WZ&ӌKxnS2d4D2 aP%Q bYNuo$f\9%ۓeku`-;j`Wc.j١Ԧ`Lof/ɋʕ+#ָfQ5cߎ?ׇZgֱxm忔{ΰTht+OqH sAdwL`=6PU P;݇vxftA7ϟA+fFZQޛf ghPл.vs`TrB{FNMx^c_zXmܖ{{]hs|%w<*cT@c]ِ"*yf[p$ =&n@@.I18{"iA:_Tғ/;䳝ǘz+9U4#Y3\fF$9hΆZpLSЄCr.N@ K1L2(Er%HMNep̞aѓo9t=i~p둞̆MM.2KN)*>k542XZOrS_dk<>~qm(`E fRzGlWQ4m hnp0AR DCaw鈰/5}vs Yal^bwz~I{@J|g'X\{\sdYlY@:űE%oM =,c^.+yرۖuU#TZYK+N `'r̮2 "ʋՌJӥ)d>oOaFy>0obM5l{N\ښdl`7[ PݫW.S3 (tt{( tڿ|1L j3/ɀ+q+NW&E?Zm7IviWwu@|do&cQN hLy=ro{I9TDe4E2y~M+Aԙee\R/.YijϓtIiؒ,zb8EGg DIkNE4'ŸtL#l\@jWA,O;`؁ 0 JʢtqC8d 0&dLaڒovfLz"w&>'܁#CAaz5"d1ŝ&bjj5϶]|g?FMˍ& 0LpUmZ鼳2HxO0*t]4b ͑U{:02ObyCX=D}K秢+q DAm͠?yqsZQ7_J_?r19qۆq%%J,2"V3ٮ!UV (F6C5lVznvz|s'=FszW =[=SM?|{=s=_zzNϣ5‚JWzQ:T]vVV+ zYZ.H[#@#(e>Z**7VqEeE5BMŬZ)\Cetaڵ G%ejһۙYEܘ7}Z"ݲxG?4+Dg)tM| 9׃I'w%/3>o>7ā/| ?eVO?^H2"pzS*+* 5¢uB'^Cj eEU\6#`Fո*9HW+-/WC;5*acQu TWm9++\ŨЪʪWsCT`] 4h]uPa5J+EkL+,(uVUx]p}W-ZpͦB0'Hhj+"!д1pMej8tRmqa2ثXxyQ_ʍj’p.'j;OTo\z)HY\#PZ*ڒ>:h]666̭)~Œµ%%eQa<ҊJVUVK@|QXƨM5Hە0/]hbGb: Z{͚ʲcVwi*bTc芬,rC˫b*6~HHR1>tE%Q16| &L_ZB*TXZVc?T tGN+ZW]VmrΘm,Ow@]<$r]$/YHPF86rm kp*,˽{7ލG3~rD_0lښio}<ف-'MM'{wÆύ+W.~l|p]IB_&~3- d .8\.~؅/P}~9z[`cOOdPbϹdp1{ ;cOxy8(Os !fO%׿893@gïwr_3'a)'0rxd/w ?=8 /r rI?:0]VŴ[|(@(  dJv'^vђWgh`ǻ t5a ϯj3 5_Y+_FCt~mD|Wa5 ]5㹝Wa5z]5c_k'jE'ϯjtO/6C_OQ< {k'j4_ 5nϯjIk'jm< ;:6~6*Wt~mD }Wa5uk1ʯ󫰚?S~m<x~V?˯UyS_+uc~U~WKc~U޿ߣG_忠ߡ˯*ß6/7'_WyuR_k1U*W_Uiϯj:_tc~U?{Wa5MWm/(ECD_tct$ltj\u6sޫ_:8 :xvu:Y{uunOgtE< guUߨ u:^o't~|Ttp/S4r|c?|?9/%s5 No]Ķ !!(V& v{77> WU ~6  C30>4G ~ω_ ~,W~ |. q|_wcGHW$+d|E{HȐB1]Xl*](!](] .~L~*HW7iW| ?ML "O7;z}݅UboL@b"Ooń9D/pDHp׸bb!(7b$_8~+6N1.]Zt˹ tFre!hPA ,M ,u)&-)TRN}O*]ZvkH.WcjƟ:gTvjƹFkĹS\PKdh NX,PKq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/._Util.bundleUT f1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UD darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/.packlistUT i1cԘ1cL1cux  R3d(HY)6k쒩? #2XGgvhE(8{9ɧ i|p 3ZөĒ]fbJ( Ҍ `N6^-T7]ow}PKj:KPKq:UO __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/._.packlistUT i1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PK'q:UGC darwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/.packlistUT k1cԘ1cL1cux L*J,H-736B2* rKss3Rs@ PK.y?GPK'q:UN __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/._.packlistUT k1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UF darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/UUID.bundleUT k1cN1cL1cux | tSeIh mBRmX&r"iJQcHM S,՞ƪ#^dfrJAł ޫ*Gqpܻf^{}'80 %0ZT^ô02O)n_a^ EiWc *&7}8rtخiv?\忡H] DztR{}sIWDisc{SN#K(-3w੯{8)!u؎ٴd/($QJhXW7Kɣ%#jhGB l8[$W1tE"<ž͓vlU`,;*jGlk6\OTx-10) } ?Q("[ ;2'?sS;u duCAƜ hf)ob LƮF3~Z*Wqf#PDo{*H^AdAdAdAXivSiE2[(g:XC rr~#TՏCeɿ֗E,םK.pX%k&<$a#vld .,ȥrq2ܜL,?530ò͓#B_`}ͱS"5%*Ց#2u Я#Q,%ET-k$rU<#IqH`"BL<*um S/Q#smDӨī" C=2n4Of6Uvb̠Mo2P2Mcljۧo&E"=j؄&E%eBlg."B`p:[Hs#i>N ͓Is/@-\[k;tio/8 ܨd62R* [:t-C ~3)4cز>q,O[D5"mD?W(h/i'kW7b I"dbQD;j=K'.OMw2mu~6V+VyԽ iA-_h%+lH;o>Y }4@C(6rmΩ_ [ۓ/* vlgB‾2MU{_QqM~?J 6.;=ߊgv ÈơrK2ω{l4hPKϡN܋;Yr܍rzs}hx楆.ތ do~wqyN2wdM=*[RB+KFuL_ 282Ӝʹt۠6 =O^8q$z4Eb;| +*,(,G&۱хiv=0EwXXqk(˹-"&v\8I9[+-]m^ xyl<ҟ1z&_Th>s48*ȀX8C]56 ֱc!cdHcK!dWhu[h_糣oق,x3CJPz=[do0 3:n:e3+8%*8TmD!<4n}l|( #rYK=Yɺ=Ǔn*ά[^V'i꬀Y%slebm~ -̙o6Ο:7`_Tw"Ȇvܝ$BF9M&xUtxZe?7Zfo ?9F kCU't)_eD:B _6f hn.(Q]6lE^Z3.fI ʌdwבJbefF4qt!?2#ऍHo^죋FaM$r q/aK5dseܷ6\$H٧aon>[t)힉Q ӕ./8e@?EM5mkHIKS4>B(<2ߌP&2ґ"(xl\M@k߁iˏ(xQ!Wd(b (DQ4L!]~GqTݶaaRJUiEm++4]lb1_1ͻ]+mHB$4 u Fm`j3qiޝ!ffݒ lm cC% D(s~r k5M$|U{}`JnwG˩@,% ?83[ʸ|~fd  g0Y({OGzwx/Id(OG(7 UB%t%q7Qkل=D#5Jqñ8]8p$G!=~pDŽwBoȵKx< ȤtJ,%գȫn8 c<ÑgwC.`Jw: ұDKv-vN E _E(XDg~# z^w4 P4lNO;=cs&b3vcax}ׇEVt$†r8Jd*EiâGi"[h׌ 9$A) 8^ltAtZ p&IBM`h55(u_١j05ٸ|xQd]Qϒ1㦢(o(; ; r7ҷ<ѡ8i)k`W|K Kvzڼ]gÐ46w78B0= j1+LInXOn]SDkN6[{֞XN CgVw`8enwoarGÝ+ OsTN4]m]igTMg#֑me'vZ鸐tV=hj]f]@zmks(:=X Gڋ_ wR*˾ u4>;@{g59FsS]XD1\>PG>EUccLb l5ڊЂZHTz YՊB Z#Gb,T}C}>ːTZ'ߟ*86cC^L˵'(}w-ݟs HmKj{Ƨ{@po!eKKeDDFHZBʫ}hO}O?8c>!QgkJSqrf>\NpÆGðΥ; JJS ^u%RRuA-;-֝ݞQnцn6RT݆S_ j /Ml7V!k+xU,ӭB%jmsKCKhuȧt[5-ؖ㺭?6>2W Yr~i(nڥ5T[9փ( ={h{e(/T<;߼ؽast2(,MԦtkloObvU5[ݢ-BX8LMZ zrL%Om{عF, ρhRn/I64 `M ka-:WAnKoSfUGN5I OiI픞Pu#:Q݈x7G:lMWA= {7 r!n(b^h1ئ~ Dݣ }V9~!{z&"[Z NQ#q$FVw1[G=,Hcx4WJ <$,iƒsz_]Q7i%yD4G?w>t}$od ?%kCqyUY0:d!5qeD~sEhC5 ΈwS-=M8ܟEyjX$ 9|Rw2߭ا^%^4Q&[4d#\EjMxaFO_Oj2eVR$trL<:{8 e08]-ڽ—&u[l4A~Na?*4~hf5Y%IxT$Y>♍ًlM!Us#T農|qߓk4m׵_]Wuzx=ic D^*+blVMہ!Ii{? n5J寐BZOmZ?&8qn) 'rkP8#v(CoEU}/nV^4_ eYk煼2xvk58Vͬ3U [AdɄHE"E(nCpD|}I+4\=+a&43 Mct}vK~26|4v|]<~]?_t=-5k<u!^ixaZXv7wrk:aqۘ+gTgt2^ZTl{Vv3na6:|dq[U<-k6mPOW~翃ţ`1Y<[pHS*40؁EnzG)"{Y}ءz+~&}5S/;Գ[o(!Nj5覊诛pxDa߀:[speqوM r+.e+.p.|Or;.w|r'.˗p\嫸|qq'\e. ݸ\ˣq\I\GXdv᜛Λ("ARkIC&iÆ9*#h=va9&OzӴ33 f7UUVɬ/431Ƃ9p̛ͫwm>#ò3;.S>oQH㍆ ? 4@o];}:{o 7ŷKmRby"8ʪVXr Ôܚ`wi3 n.QUm" F¼pנskOUR.~C7d&ByhFђ00W2 LBPOM Z'ZIkմ:ZZ'z:)NzZz:#h=֣hALZu:ci=ZZOusi=֓i=Si}z:gH뙴Σu> h=ֳi]AdAdAdAdAdAdAdAdAdAdAdAdAdAdAdA}aKkz8כ&It {2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2eS 3jME Y! l|@0 2>(ˀ#@Q<,.3Tb ` x;` G<x0G(<.'^Lyڗu:o}р}k#<|vDk5u{1mۃ~je}.=Pv_Ӱ2uqy7PfkCiEyʪQN%Lݵ(^r=B mA߱%ݠ@~ +1Ը|Xo] ]nu r#%]OwuQ__XWmry}vusvxjc9l.i^?XE+YFnXzmWHdz5Syw~e>@ 6O%"ѷ,ᡉ+)J)GDk.4K(J7)8?JM^#z1$YB/ڭT0kw F('hԎ*JKڍ"%hA?[/n7e/ЂQ/n7hAX}qQ俟Q}/n7{/ЂE(/ЂFQ<@ IEWJZ]~v(^BZE]KZ_+(@ %v(4S}HFQy ?D~v(?-gJOn峗'= ?I:-wQZwPZw)--wDB .B+VRZw QC҉p"3 O3%IBе~ .#_%I }AB/*bz^(+$* (C KBЧٱ3&&c%$ ms$t6K6 }Ja XBz=/ߐI% AB+%t= nlDsxCf3?cHz `3V >8{?|p)%|Y_|!]<'a^ ̠|SoMD퓔hxdƒvo]7= PR[EE4[*W,/\;Zi6U.0E xyࡪOo#g `AS_j3Bu9LtbjMLV % 5z/z$;8xFTk@`Slƒ|dlzta U~?pzਟ*詭zZƂ93 g24:X' ?!PK?F!PKq:UQ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/._UUID.bundleUT k1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UD darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/.packlistUT k1cԘ1cL1cux 10YE: MO.6'bYhbKO-fWf*OQ,0\#cAA] LT3M?u7PKVmPKq:UO __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/._.packlistUT k1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0Q darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1252.encUT ]1cL1cux ҅RQ`]k'*vwbw``;vwww`www#νnĄ)5j NҒd #L 'M (LR $(MRT"L"J5IJ5EmPzԧ iDcДf4-iEkЖvDgЕntQC_џ dP1D3Qf 1e@,qLdT1xf0Yfs|_ -%0@.\[8䜁9z>479q @lYB.R(l Ybe,g+Yjְugfmlg;n}9apc;'9ips$p \Uq1>x#<9/x+^󆷼='>|;?I"H PK_0PKZ*8O\ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1252.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0K darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/ibm866.encUT ]1cL1cux ErUQQd\$%h 4h HcLРXjk{Ϸϟ_vuv_oЗЏ ` 241b4c83Lb2La*h`&,f3c> X",c9+XIVjְugldVd^9Qq9Yq \\ WunMnqnp{ycg</ykVn_~/E_~/E_~/E_~/E_~/E_~/EWWl)."A_`[xaΝswTVU*.*)+-(2|p}Ԣ6uK=Ӏ41MhJ3ӂ"ִ-hO:҉t+t;=I/zӇ?(` 52 c8#(F3c<$&3Lc:3,f3c> X",c9+X*Vc=&6`'bJR!s2R1sߚ1t\{8y>&H1yF*ތ3363,3Yw13d%Έ^9U#8.uy9^*unp[v_SsߪEy>}5^)P?R#Ǐ;Iܤ#x7zƬ~FVAgggR3z/9{IfS^T_ZPK* 0PKZ*8O\ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1250.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0Q darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1251.encUT ]1cL1cux rQௗ(ۊނ=z޻(Q[w ܁e8{p#g̞]ijnimO/zӇЗ~g`0a3d f cx&0ILf S)42`&2,,b1=[XRZYrVUf kYz6M-leNv=쥝}9apc'9ipsU:unp.m]qx#9fP 3Y+bZ{||[߫69.}>oU^cy+nj/?}ǎb?o;Go7wK517sJuGFo0~7~7M5[FoFojFoFoFoFoFoPK\^0PKZ*8O\ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1251.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0Q darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1255.encUT ]1cL1cux eOPQ`@W@E [AE? l/a&<۳sww㏫9 23rSRScoG1(AIJQ2@<DePjT5EmPzԧ IiBSќI mI"ў}w#H#t+Nzҋ/2 a(F2ьa,&2La*Ә f2d0c> X"LX2 VVc=&ǟo٬GzwŜT&-὎#Gt2r"w!z ץVݚd]~pCG9qNpSӜ,8 |A>ȇ| \23p&9>x ySy[ߍ PKIm 0PKZ*8O\ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1255.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OU darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-euc-jp-unicode.encUT ]1cL1cux uxZEtRUww[ ] '@x3uN}6u;˾wsٿ}w~yѕdwVj><|{m ʴsn-BBb)nB &4Jh$iB -Z&Jh&mB :&tJ%kB =z&+wB ' H0(ap0$ah° #F&J0&al¸ &&LJaj´ 3f&J0'an¼ 8I@<@IHM& i fBz+I& }D I4A OP$(T ꄌMBVBv6AOI0$L K5[8['s_߮^{{t;׵h*vDx>@4se[" a^~a_i@8'|K_Js`QjװFY"տzĿ.AWo/b>+A_ }c7&BV ߨ7exZhlFPB7A᫅ƣo4Q %hLGѤs-4 MGB ưfkzN>VШƧoBc7ZgjP-4gB_>k!BW =hۭZhDŽnt-4xX-4CZh(jqB#ij-4B7:3kt+ ^7_y Ŀ=| wtvߺWb_.>MAHܯa"j{%$]#eŋ4X]Kb?]c]}ѽE-4T8jᭅo$M_F_IsU ٩9иB/Bc7z5Zh8kq}jaէf[}jaշf[}kaկf[jaկf[kaտf[ka5f[ja5f[ka5p7lkP-̶lkp-̶lkp-̶Zm0R !0R 0Z 0V a 1mwͶ|N.@=>h46Mf@shmv@{t]n@w$=@`0!P`0F1X`0L&)T`0f9\`0X@yq~\Eqq\eqy\WUqu<#ijqm\s↸1n㖸5n㎸3xnJ i` ` > @ 9 P@&l@ =#`̀68'܀/@> @(@$uMNqXV㓁{IWXVDXhۣE"a]z3{ңC=oo'tl6Mf`s28 x̉wwK%%5d`}=%$`1$^7N׋7~UWݔ)SNN9(eaʦ)RvJ*L 'EZMn8979/ٙJ}I.$#yYVu'sdY@D@@$04 , r@."P J@)(T*P fA-`h 4 @; t0`,` ,%Rp#\W5Zpn7-/Vpw_=^p<#Qx<O3Yx^/+Uxo;]x|>'S|_7[O1B,$%(1F,%ˉJbXC\H\D\B\J\Fq9q?_m čMğ[wwww%!%' $"&!% $"&!%HHIHIHI]H]IHI=HIdROR/RoRR_R?R@ }c@P0pJIEMCKGO@HDLBJFNAIEMCKGOZ@Hp R'IJ)mR H!exB 1yJ)Sz K2.e^J)}RFLJN URڥ{}nQE+Q{ 23ҷewE\co(Ifa^W!sR_G/ 9͹Һ۵6ٲ¾ϯ8ZFeޛhTãC]})xyNmgvʧQ^4#08m}P˜"US8|R}$:E_&o}#Ft>SnԮ+;1P/( k\jͬw>_m2m2&Y N'2:Ӥ4m >.dy;d図m{}UU`.RD]&Ĝ8$ipF8jx/Rқela1+[2Y <5ɥwp7 ,= Cn~1xܕ-'zuE8w/&m.3)"I+\ֹ,cI~4B_ațq%Rr]NTU([{D=U sI;mYFw@",Ǥ sRWzl-MlLCdPSWu3|-Bӡ6cwβ14wo\/ 2H]uC˰΃!+B2aأϔrZ?CFQʸҰ %\>w7'>+%市NV3k;'YdNvYrB;c5eEO);깝rYF#cϊzkGL9_jQŲC\LkvJ[3$h{MYom[<^xkNԁYS(vs\W](+TԒZqe:&w5s=o狂_K;U[C*cyzOL2{(j1ۂx'{@1H/D9n 'FFEWcѬ&Gm1W;υEڨR޺:X&v/UgU8˝29?EBO A+*voh :Uw}e.+x\8*zT\* lĴ{F,W#aUqZ uHG:U`56^#$7(u1 3߳rX.V9vƝϋ.M+%I짔Cuy9 $mK]K ˲Nop!g?w,| h 3s&~)Y]PZr8ߓ.ޫod!v6t6<7qrD_ũ>5]БmʹZ\s-S.(%BR_Rii ddeSU1(^:asgEYvVN?Rޢ"h ;R"yA%rXciˠ-woaP,LG+777~)3|DQqF)Ւ\4X¬XcwD(-;ZC@vϊY]~QU_E)139B0똶)fu"9e-EE<ackʽk8a.`agʯ/` w $(c)ǧiw~gxmD#~br=sݜ2&/) +3U]ªHws0kFDGw>`c|^<_$qC^$EVod#XVǀԫ)cI ?xߔC { -S lϜaL&? ̋("FgSEf )Y|kB~ޑ!:\Af֠x%|Y_mRGW >UT-}IFJɢ芪kM#YyгX!vC) ݱx|1e&eHj{;m:2WJ4W!m̐jeYzX skz 0-~4=Ú |ʹyg]I''_m3@>c崥uq Ng0!,źBNbܠgDApx?³8j1[5`S;8&ndqtGU+_d'VsF~ǟ3z1$ЯQe18-U;_,|(wT5g C%E{5.Y;A ;s"}kdS9u(d:e?Pp ckddh Qƾ%/~x+"Pᛲ39u3dc c9m#rfk~KbqWJiڳc9y:7%:|›u2hm4KB6}-*^ wI7K?ėC;<,I 12@ӏ(rj3&Ŧɳi?0Y]Y%5gX:~-F{#q&m`xFgFb45N}F 9+;DS'+,R\RRC?#mUW>{Z*f10W3uQu5q4 -=+$ [-ֻ+mfK.#7%[DtB K+פ $G-Z rdI:t7-Yڲ]{.axz bi\b Bk9NlY,x܆m:,42F~a8cYu/@ȬQ!{_+0j&@ְ(ck+*`tjKfqosG}`0j)kĵ" 2vE 6Wvp"2(צ#rd@OX_rsP IgvizO{DNDFsYynP+|)Zz\5^)pUƒL(Z\2C3n~S?6GNG Y?^*)gx]RIЦ(,KY}x$mH钵0ypxXX O<k-8:ʙ {f1O=Ve3|}/bCiSX$q{YZkx/gvݚ7/| UVK@r)8sΊVʠ~gG"T֜nB!Hh<4 B4 yrln jZ-C-)$t:~nBϠ[{!0N,X{\ `)G`5 G| _W3} 郴A!)H] IB"o %R 4$Q 9)G K8 *z܄q'?z| *z%?Ɵd@x Hr_rW2D M$Bl'nrK>L^LJ^F^M>@>B^N^EG^JMIL~@~HiNiCJ~N~FDKCLSSQT 22N)(~J DRJ)Ք3EYAɣ,\ܢ\ܧ\HmCyڎ53c*dJ:2uhTy up"UjO.L-N .K]%usԝ{SI=z*lR~q*ڐڀژڔښځڎrڅڋ:: QQ'Sar6ZD]HD]J]I]OO=D@=G=OkDDGkLHJВh<q$g+nSn3,Dnno\$xpTtnWϥq4UsL.ŹZn7s˹~n{{{{{{f>~ƹ__x!) 3/׏7 1xg9y>W+Eyx.^17Yi^wHpwwwwwW;o{{ͯo{'a~:~Rn!=Q9;A;pA=AkA/HaWA{AAsXDP$X&X! v   v. ^ 9 n V ^ ^ > Waaa]žQ‘yT!E@HB0G ap~!^ 95m+FHD~gFF`tK."-2D.WDnQJWMtT[St@UtItUt[4IPDR轸wlxxxxxxx%bX 3+fL/{Ŀ_7o?o?o?UJIfJJ&KHJ &I ]—%6I$$Y#)TI*$.Z6IgBvisI*%HIH.K$wM$'%$$#$o{Gm ii?i'iOi K\JZ*it.\)K.uHeҍҵ3_{祻Ǥ7;?I#҅Jit4.o$(}-}$+ &}&k#}*k$k%+)k-.k"Frdd<]&͖%²B[XDm/!/'*$[-);+%[)*]Y^7쓼]ywh(uYi9rDN 9[Ε r.w]yD^-_*_)_%_'( $ES~H~\~^~KEnEEkEEg )d @Qp(*VD(T)*n(*6(v++)^((~Wv.PTWNPVvTPSR6QEJ2MiPҕAeңjjYyXPUyHws@J5HQQUU=UrUN@]5M5V~PU]UUNJUy.:FEUHLOUn1_zzzz:WmTjZfߨjڬzZޤ^^^ަ>^C}A}YJ\}-aFco3:3ftfLf32 3eX5cSڌ[3nd\l5KfLa&%ӛ)eLTd2?g3K2g-s[sG3/dʼG?3d~̌kjZh:khjh@P8x$dL< Mj&OSjk~llМҜ|ԼGgj%]V׬YfdM̂Y,Y$+#+'Ke2fڔu*kG֞Yϳnf/ήN=4{l6%{R6;=%-g˲u쟲eξ*vGOg~*C{-IK666ննvЎN.23iZVkZ6GjZ֧uj*2>&~]ڭڝ ړcs+{ڛoڸ}}}kkkK%~ ׁqYٺ:x:N:.Ct9:ήs鼺|]Ptͺm}Ks;Gs>I)^QY4D/3BMoA}>_֯ooߩߥߡ??MU]O\%IN+C~93r999@ΒsV9s(x΅9;s#Q՜9o -   6(`4 ~C᧚yMm톣G? w M= v8D(4#85Қ*c`ƘXjW nj'WW7wwό/MuLMLLLLML#L}L#Mh"f&)$6e2M Te*5՘ LrS2LM{M'LMML7LO-mLM3`onmzczononjzgimgneo`of&ad3bf9,4+Z6/51/62/2/7o2o4o05o32143_63_7߭g~a~m~k~gdgcbikidagdjdaiɲZ ",o), KbTX[ZX~첬N,\lX[.[nX[nZ>[^[XZY{ZCݭ ֙VuuuuuuuUlMZYV5jʬRj,Zk5l-[֠Zimkao[`l Qldƶql&؜\b[Vn[b[ghf[kbۚi;h;d;fh`c{h{b{cXz^N7www''g1;͞fgyv=ˮguvb\^a/נaj5 U%GC +GgG_GO`Ǽhccw/L!t;cıԱv9V8;~vvlurqslwutu\q\vq\urvr[wkS)W7uص]uԝV{n-wqN==v#<6IU^!%"O;~iii{hٞ)u<<ݳD<~rSTz'999y(unc7ϧzɹrI J.9+-]"wen~n wKr]{!f?ro^}*^^< 9e^ü ϛ7*o\^J^߼Nys>W[[ѷڷηѷݷooooOO3W~wEGU~m]{M&;o>Gت^'ɟ??·3|E:?;ߒo e偱)Iف((^@ ΀/ `8`Vv66>> 4*_мiAudAveAfAV`_ \*8QpxO n+llXv v vN Y9A$8;H ` ?H ꂚ9=Aw0?#`YpepQpup}PpCpw`HxZ^Ksi[QnmUcuK{sIWhXh\hLhFhjhbh~hNhf QC/ BВКк/C/yạOpppppЇ0Fh 7 O iaVXVuaMa{Cu wy"u""#C#`dn$5B#ˆ4D#38*.2sdsd{dOdohxLRVNZKȻnxam [ 3  gN*WVF + On+IQOEӋu,J.TԳhlшqE"NHUZhuњmE~+z\rEg/Tܦu1~qG'-RO/fsyŬbYabmRVl.;m%ΒIqIdaJ֔,Qdw1%'KN\,Przɝ%wI>AѩQ8:/2hzE5QE Z-Ƣ+?E7D7FG7GDFEOEGFODǚF/F?Hzֱfvbb`lLlBlblzlflvljlN1QLc1C31c,7 ±؏%MͱC#g5pV]MJGPT:tBRt^T]QY]Ut]-J*}RXְUYeIe]˺P֣l@٠ e˦)Q+C˰eXYiٲ5ekv*Vvrٲge^.\P޼nG(Z>|ZrJrF9]+ ʥrY;.?[~B[w?,QyW?WԫPѩ{ErEϊ}*VT1bhipł UdWU*"ъXEMŠ+TVqtيs*VܯPqrlW/+VlXٺIe*U*UvL2U9rfʴJNRWSʗU T>"VիWիj]UϪUӫVR5jb̪UU*AZTѫ4UUU*cUyҪUTQj{աUTPYՋ՝;WwV-Վjou~u:R]UzEkbէOWP}fW~[}_ԯimMR̀5skr ]éֈj5YFS)YH,=g eu.9 ls `]kuVW_ϯ8[v`%X ,MjG%z>2'Uf5q q-q1LpA |{>BI@ z&aB#B3(p8#t"#"tH|.ndBIp8E8M } # c3yp @8K@2FH%ExU pFP22"H.` X&p% B]pPАxDhLh<O  '9<^ go' &% "%L$'L'&^o;-%,$Pt 6AH3AI@$ Y5AJLNJD_8AO03T"Au&P+;A!M@ӡY ALI ) i!d (u6h?t ]nCwc z }AqDnpGx<(x <O³9d8l`3a=`#lvn`?p.b8p5\o;.x7 Gq|> ÷K5 ! $>i4CZ H3tC D"Ðdd 2D"A *BG!|DD2Ld@\EH !a)B(RT"H Y,FV"6d; كG ) r\F#7[]>ytsq>.܊<܋"/ëER|% _o7?[.|~? &~?$!&w"'{낱a0ZtCaR\=E)VнpW9% 7.! )%#zz(z == =]@FAG/B/Fcx4MFS44F[6F{at !4+U#cs%eu ?Пп1 1M00-101m0m10]100c1Ř $dL)f*ff: 333331T C00l #H0281.1qL0yL sssssssssssss  ̀@[# z}~@`00Fcq@)0 3y|,p Ā2@(t0F b@H }=777 7W+Up8#(8D8 NS8΀3 .pq\WmmmmmU.{{{{{{oooooo/Ǐ+h<G0>O<___߀ߊ߆ߎ߉߃߇ߏǟW/oo_??:z 'INKG$`d &HF`&X6& aB`B !%l l$l&l%l#&# &!'\ \#\' $"'!#| $ v&{GG8"H$҉ "%"$zh$'F1G,&"#n# $#&%^&!^'&#'~ %5"$# %#' $&#JISIH3IHhb4D!QI4$I"#Ifd#9H^`R'I@ZJZMZOBACK:F:E:KH! $'=$=#}!}%!7&$#w w$w!"& "!g1d,@&d.OdYL9L^N^A^I^C^G@JN>H>D"$#%א//kɷwɏ/((()M((])=(=)}(})()(C)(#((()(irJe>eER*AaR8 ENQRT-EO1Q%DP,%GYNYMYOYA@LBJC9N9E\\\\\ܥ1=#7/} }0}(^J^FAIG_D_L:N3"&zGQ*v.n>!z8^KFENO@Aɨhhhhhh(fg0&33b1f0f2020*K(A`l!bJe&ag8eqFa+G'Ռ%UF-6>9%=?GWfSf3ff;fff7/?`H(f199Y\D1L$1)L*d0ELS40MLÌ0Lb3,01fban`ngdbV13O3021k̇GgW̷̏߬&f֬N"V/V_`hDdV)UZĪdXa XzecX~ĊRk)o*&6vV(uUúȺʺƺzzͮnnnnnn.baecg`faec`bfe'3s؋ Ʊ l"ʦl[6lְl;lfg;.W7w؇GsU?{oƜVޜ)rNggAsH6Gs5q0'90'IqssssssS9͹̹ιɹyyyy̭vvNNspq\+J2zkڹN&)n.]]]=^^^^^>>>~~~555uuM+-<cX<6<)OƓ<³B~[;{{G''3s |4'|ϗ|3w|A>%=3 + _?ǿȿʯ_??444tt  F S3s+ @  $0  )@Rr߂5 M-=Ccӂsk[  ^ > ~  [ [  {   G Sss B'$BP$BP+ B-}˜0.L S¬ "&!<*<)eDUJHReVYP.U.S\\\\\ܤܬܪܦܩܫܯRV+O+)/*(o(o)QUS>T>U>WPQ~P~S~WPV5RSuRuVVQW T V QTWJUSTSUTe ,"U PUM%QT:^ePU&YeSTQUqUZU-WPPSUNΩjTTUUTUTUOT/UUoTT_u ԍM-ԭ՝]==E~?ԃcc?%9i2 uzzƩ)jjZVmj:jDURrU5u#sUM}cSK[;'WMM#M3M+M;MMGMgMWM7MM_ pH8MfDSKSYY`4!k(aj8FjFkLƩ jB&Ih2fffffff沦VsSsWsOs_PX\RVNAE]PHTRJVSGWO;\;B;J[-Vhgiih+D-YKҴ -Sb^kmL.ymABFAQEUM]_{P[=֞֞h/khk״hikhkkk~~~~5ҵеuzz ׍֍&JuSu3t庙9:#::Π3̺.u.eutktkuuu[u;t{tuGuutպ3 k[;utu/ttt_t?M-mE>QqbD }B?K?Oc8=QOST=K"J՛V]һ~}@Ճ>_[A]SW_@RZN_GTLBRNA]S0000000000Pjjfn0,0 T6 | 1 4 aCĐ7,54l0l6l1l342370450Tnn1<5<77|0|4|1|5|30253760626567026v5v76a`dfmkgo,1N441%Fo$FlFgFQnFm#Ƙ1o\j\ebemgo<`272VO/k׍7wό/MMMMLMMMmMLML=ME~!ѦɦR4tSiiii 0LxD2L$5iMzd1Lv2M^S4L)aJriiiiiii鼩tt\雹yyyyyyyyy\a^`^d4c3L7,1+Zl329eΘsee22Rfa,TZXdYea[Dd1[,%` Y"$,IKֲ̲ܲʲβѲrRe9l9fX.XܳZdemo`faeg-NX'Z'[XYgXVmYeVfZ֬5o]e]m]ock^^^Z[oX[_Y_[Z[~~~շ5uuuzچFيmmm <[ Qm4Ƶl"ĦlQ油m[ؖl-o[ndfao;k;f;a;c]ڮݱݵ==}}}}ױ׷wwwOg3s ;N3Ȯ&n~{c=eR25uM-m}C*IE{_CSs+'gO/GG]GcGG3GsQ(u(spT8;8;pHZaqXvv#;Rqd9*jZ!GcㇳcsYprqw.t.vV:1N;Nd99NST8NS4:MN儜3;W98:97;:w89:9;:O9WOϝoo]cߜߝ?]\]]-\\m\=\E~?\]C\C]#]c]\]S]3] ]\]%. "H.⢺h.$.K2L.r.+ ".ؕr\RrJj.nA!W묫Ƶuuuu뷻==={{={ҽčqn&nfn[薸Un[ֻCnНpwֽ̽ʽڽƽѽսݽýӽ۽ǽ]>>>>u_wrvwusp4444ttyzyxyyFxFzF{xJ<==)i2Og!yhxdqxx' z$=)Oړ,Y9T{N{xj~~5uuuuu J|}S||}3}} }>|DG1|')|*g}&E}1_܇ooooooo絛www﷿????_/OO%~cD?Oʯk:oC?O M]Ccji%UwaQymG(+,0<0*0!09W,0#P , 96 - @( @6K)`EpvpnpapqpI !H ₌ 3r(!h`  BA8"lpEpop_DdtlBZ6x3x' 42&6>19%+;T7T?4.9= B8d Cΐ7 EC`(ʇ U ͡mݡáSЙPMRj6t=t30($26t .>!3\7 0(<6!);'7/< <0<:<6<>2!212-2=R,,TFDPt!EV$YYYYY9999999܏/04:.1)=+Z/ $"%=:(:8:2:$:,:<:6:.:!:5Z%DIQzDQiTE]Qo4 Fh4MFSt...nnnVGkף77w/oo:`!lۀN`g ?`?p 8GNK2. L@%A?Ac`Lyp \n7-Vp*(x <^-.|>/Wk |~P.j5CMfP ju@=P??4FBP14*&B)4/ U@sh!B8 *DXBz=^BW;׃-p# >px < p< /Õ0`,0fa, VJX al ^!8`*x w8|> Og9<| ߆+?cucb bMbMc-cbccbcb#b#cccbccbbScXylVlNl^ ň1Jcĸ1AL$1YLsq]wƽ`<s|____?WO///ǯoo'z&}$$%F'&&$L$&&&'J T-!N(1aNX=H8H$2\XXXXؔ؜؞ؗ8Lږxxxll,KI.H.L@' IF'IER$ICҔ$I_2L$t2' Mɭmɝ]=ɽ}CɪdMbRjzFfNn~TTTTTTTTTQw_j@jhjDjdjTjLjl8GjJjF"5'8UZ¤.OS+NSԦԖԎԞԾTUhD:u. ԣԓOz&Nn^1qtIzbzRzrzZzzzf"=+=? JcӸ4!MLӔ45sBzUzKzkz[zgzoz_`*},}:}%}5}3}+};}7$<"26!153+S/S? <"&6)S)ΌL,,Π2 ).!)9-#3+7?s(S999d.f.gj323dnggfede^fg|||F uzH}i4E#-H+ tE#=d(2C H 2)Ef!sy B@ a ,p>"@# Dh-C,q".čxGH Q$dGV!d نF ! 9B"rA!'s|A"ߐlllllllllllQo_v@v`vPvpvHvt8;>;![-ȖgggddfedQYL%dIYredyY~dYqVgUYM֐}}kk+ʍ̍ʍɍ͍MMΕJsr9%9Tc9V9iN 9cΜs9wΟ 9(D.K66vrrrsgrWsk[{G'g׹rrmm]==!o[#̻|8' X",c9+X*Vc=H`'/pPuCq^AfBcw99INqZ/f guq.kq \L璾\*׸ nRȭd6w=Yyy/ygCSɳ^9 ̽5oxK1%=|3_ox־S~OTPK d80PKZ*8OZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-3.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OOQ darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-cp932.encUT ]1cL1cux uti&|'VNJfeI333[`Yh ,3S:܁N;Nݹ3wnfQS\e^{N?X%c Ɛ.$ԃԇ44444444ttttttttA! !>~AzPKBH(hX8xD$dT4t L,l\<|B !(`!8H!@b BP T B0 L †p \‡ B"H R "( J h Z F bX V /99 PBA? PBA? PBA? PBA?h!₸!H AAB0$Bb8S`$IBR4TAjH?39iTaQ/9S?m5_{9`%bi5#6xWܜ)ɺu__bg2%#{_2( 8y_5\5? 8=˽Ol:.[,xFF? 2xF?XMF 2xF ?L 2sG%?-i?Ѫ}kƵh6h_q3~<d4_3:o.tSSu-+tCPF_27~33ZdGur^N9 s4i4YN]G9mri!cN9];nJ @6 P@1( P @5ԃ@3hо @7K `)#`q`LìU`kr陓+wNAN9ڥ΀{`Π@P 6_`XU9)9Ip2 dj ~ _{lN g=;Գkn`Ch'$4&@ShZMf9s~#-vsyGgJΦ{傏@xs`cg>+8]p\ l-R`o@X^$/ {y.{ί ;O?2`y{}d}$}={[`-lv;`/7Xp 8 8 #(p48 4p:8 gs

\AQ ĀXx_ L3,`60  @H p@(HTX\ DR@TZ@`LV\%~ A a DK2`9X Vk:`=l6[6`; v{>`?p8G18p8 Ng9< p\.W߀5:p nwtGc x<^/Wk x>')7ˍV&rtnen&*7[[(wqesW]?9wKmsw3wW={s={0Pܣr9$%5 -=#3 +;', + 3 FFPQѰ1q Iɰ)iYٰ9y08 r 4-hYбmAׂA FL(S[ТMA /_г`hA c ffffVVVy94;&s/V8@WMUj;/6>J^,NL(y>c8_dZ.7"M0/8Db E!=W!Z * L^f ̥sr]r[WG%QSf+%Q3ȹ{`XMWiDgۄyS/r: 5T.I5 %ssEi"̢ޠcR3d}ڇ(++wJU%Ky`ɹXsȋQ/1w'LjFL΍X(O H\V%0geL=APhj&,]C2^@zM π "t#-ћ`)ۏf^n<~ "\E'/JcR"ݠ*RFu]cI"/˗%e3՛4tM<3(k{uUF娊xEbIHI9Z]@^m{^$q(*Mu1 \U_KMjD:JPR3q8y=G4* :& hl9$1ǒC:BgR+g&H *'U12?D㔋4QljR9kTr6r}_,FMZ\ԇwτ@œŽ!mpP ț(&V\ָVdk"lalum4m}(IzpCWOzΆxc^L+QȃmLO1:PqFt)2;ވ>!sX)c8T5@gv;X|T\~Yhc[:|V8 ~w|)Ect C1Vq\khbY`I[Dy%g Rn[s6>y h/%;H"b kT[)^ȱ>HʌfV[20>1߱Jrj^f1WKK;.FXqM˜U֣cj0[&ZiiDV}LwjH8k.%^ )oki}c83yE_̧|\Koĉ C4N*J k+!u,+E#pj$|Œ؈lkл1V8?_B$ )LyDyBHS]JOt4c3ɼZϭ˝}ϓIi1M2@"f5õ^8|RBl77;s [cv . ~jb ׊e NW^͎Gk1 2?aZ.|x켢o)Q]^}Q5C!״}_\+br᧊^لt>>,W843 A 1'q)2cKqZ <5U$P{HhBbDJPnP} Nn%2h6i% m-l--eOit,|rfi,*M~,YdgjpF0YAʎqX|ꔦ)iuT7tK:ZQ)We8 = 94$$! uiѻpȜ} "jae}?n x<8*Ke($ OeaNIO('i.ٛ bd֢h }"%s1oÊORfwR'twf |0Q@Lu8!*[E֘߰B Z%sca$y6%deuㅳ;WFBȰ8q +@O m'' "w]ic7XAۀ۔;YK=#{%>i#)A1AGӜS u k]S+JX{u]z&U]ƭU1!;Js3|1wW$ܡQYxϢafk9ǩ;^\x3yHCEEB'^9}-99jn^ĒS*5=7E׾o~[`Q 8%I"olCLYmˋZ'9וhkiT`e:Xݢu6΅_CLIKu)}ٛm#'%3%xdd\a6L-׭lFgXϊ4xψ>E+\ 8lboXqsE (*w7A&  wIKOˌFMOssPN$٘nw,2Ś쳜gϔovGp1nc9o3\s]ؽwLēɮ IFq3a'RQe黽%y3u(Cɘů6e_ipg$'2$yMk-K-~ޒ`p3H&Yͼ$^"{t(#;zR ;bVD:Q_V~#!sXK8Ep=)I^ʴƲ>~t"N*z@8AYMс޺Gxօt{cg123tRC6~6G|K3c5n |0-)Mǝ{#~Z"ػ/>'n|p#j4'=꠵hoYKxdR%Z3N7ήvu2OٻXe.U }k'7$TBL[Rs#ҙP̯&.Ļc &x!#ierqAv|=$#5jBoR%փdngc(B&فǡ6ѫ5ŏ}F^6uoi /b3Pz؟&%_aMI Mt@Y$ؖ/XZj҄NѲ ;cboU%/cĜ,o\A?sIgP*z{AJT"U2q t)9(L蚘^+:a)Z6zhm5u&!0K$:0qJA&_&le,cJR|%S!L*ZcQx dV i+V$H9t4;|9q}?Nr=△Cw|. 'hn 1wyvaq.)K~M~EOM07xI]&_í[Mx[EV.Uˊbd?:vv9ׅ "*fɳq* bpl L2a{ ogEJ9D,o 8VV&Ua Qq*^Ef {O@<(^>XoT7`0v@O7 3TA^G:*`lhHLĭt=׈<%Mw#74)wD-6Z͵wcߕ1BIIfn^Kth.ڷ-4j8_5K {3ǛM8}ISNC vUc4Y( %x<1F]ZtEx n(>9MZN1+FR$f@~ ""ȟ2b;A7ÓS-fbuU>Ľ)'*i"ݡ(3n9~Gi^q3̨h8]6&$>JXQ!\P"l`Jtl 2RW4}}gzZk<톳i8hdJHCԋ̱DfMbC9VB7 PgH/9iCWC;M) \TGtr9%% OK5j:a$m"F!JQ?7Svӻ&8/F$~J|H6N0+DjtRϾԓby]~ /eۊRO`\"P2_M/uV9:npKWB$ u4_-ʾᩪ琇/ȑZIК[G''ç gkZ3x^ //oo h(F#f#"H!LB"dDqqqqqqq !3-rYxlEHd1)Fvd%҃܆܂<<܊<||||UUB(J(;YtDQaTGUe%ը5ͨ-M}c%83 5Ow4 ==]Fgh,ZVhچZUuCзЏS/w??ccj`aZbZ`a:czaba 1c0S0030s1 QW0T#%vĘ0:,¬,ll1N\~Uļ<żb`'b`ac'``Gaca0V aiXVccX֎b{{3vv-0vv?v/*1-%{77- q3qE8;E#F /E"v"q^(ZTT^.Z^hGѶE{):Xsѹ E~+zYSaF&f6>1x8~<~ }xކEe5M#K+&Nn%!$'E hD!"vnv6..~#\#\%<"$<$!">[W Éc8"' D&NDQOt*b-q)q 8)&xxGqō;O)-Y.4<,B:>ΦO":џ]J'Iz^JGIKDF{MG?NNXhǨO@ȡ2ry/7fٌI~yɌ Ai C 0bfAcPf$^:F9`Dkg'?303v3N njZ{a6d6b6c6eevavg100pf!s*Τ2YL3L'ϴ2c83t1˙1/003Aqe̛3S $)% /.!O5ݕ`%X!e-eY~V k;K,k? 8$"(={> {ǖl8gg/gf{'{WهoOwد8oٵ7NGNWN=NoN/@Hh(|NY!p GsWipr~\\)/<w$ww+˝ʥr)\6si\&Wuq}usS,w$w?w/(w' :.w215OG^ ^{^w^^d(Th,Gy,yyfV  6 ^  [  { g QBp)$ 91|aDX&\$t  %{G;[넷wkׅ ꕴ֊ZgzƈFkoƦ^f抐"+"h"H/2l"-rD)QZLFVQEYUhs;+/n(n#n+"-%qbX(vĕb8#b8&߈/oo_.[(%((#$))4$q [R,1HBP|6l<!-9#y*(9&\<*]R:X*v*4$i/H:P.N¥t)]#MIOJ^nn^* KKKkdSe H?I&KʆI_ɆK&H?JdF^e2IN&9efAEee\VRb2.qٯ?deWeod/e7MdV:.2O,yZoooߑA5E#7EWE'GS\S@Q+Š/ BJNbbş PLREO9X9H (++'('+(g)+ JҪt*J2L((W*w)((+*)/*+*)?+?"[:ګF TTp *JҨL*gV9A#Kmu=L]Ʃ'ijzjZ֪Ruz444ӴӴt L,Ր44iDFjJ4^Z5NMR,,lll֜՜\\<|@B:ךZ[;mm3m#mm_mOm6_[;B hkgkhgiZejZViZVjZ֮ui}RmHƵimvvvvv/:@GE7Z7F7[WD::.+EutպM]}=tu7ut/u_M }= 3!Z_7+ARvFqie~^1)'oֆVNA)o 8`4 CְfaaaaaW{ƆfƎNƞqqqqqokdFAM(7Ϙ4VSƄqg&4035'g獿/o__Z MMLM#MLLH3-451-04iL3M $5eM)STe4bbJNΘΛn[ۚss;Gss3s/s_sh@Dt3֌0O1#369fYcv#e%U- ]}cWZK}K]KWK;KcL|pdH,Rd[EjAXXo!Y%cm`Yjn9agYkhYbhiil\ܲ<ܶ|ֳܳ6Y[[Y{XYX󭳬\xHXthkj%Z*&`Y}V5hY#ָܚkmmmmm nCP6 k#h6ox6i+l>۪mY[mmmmmmmgvvvsꦽfobomhdjϳOϳϲ{fgv]i۵vbǞ}cc~11Ɂq_ qpjsvӱQXX9ՎM}Îݎ kwwO/:κzfΖ΁1B'IpRN N:E!NS;2g̹Y\|||u]/ۮΛFka).kkktqո^ ̮.KZV޻۸ιs]WM\\ \w]o}1/n{{v"zt ܳ܃2=}trp׸Ϻqrw_q/A{OOG OO;O[WCL-ye' xVy$rO>ڧY|}Jӗ||i_oooﳿooo/O/wT?KB̯Vqʿؿڿ¿οѿſۿ)hhh( L 9 ̀' @e`ihlpzy] ޔ | (mZڠs^iҖJ{&ז)X:_RxҢRRiqV*.K-`i4V/MK+Ss 2 2>h :'C9bv  n n n<|| ~)+k\֠EY56emڗ$e2U,]vleˮ)Qvew} 5 5*CBC-C=BB#C@hDh^hvhnhA"!zh@…!er!O* BP4TJքօ66~=} } =}7 w w w 7 LJdžg'ga| aff5Ïÿ_EzHHH^Y{}IodTdddlSAFPtydndR(BP#,M(#Έ%#?lll܏|j9|F9^, cr]\n-w*ފ@EyE"UE*VV[bWSG*Vrŕ*UO%%$&%$ ]&( ZP&ĉD*QH&$V&6'$6%%v$v&v%%N'N&&n&%~M|N’ m͓-퓝@rlrbrRrFrVrNrZrn'In%ICғ4'Ic$Y '#ɪɛ5[䟩1ީԬ"5?%JR"NRkRSS;RGSGRSRӹFtttt42=?J Ҹt2J/OOoHMIHJ_M_HHLIMIS٢^~eʁ+gVNR9+'U*V*Jf%])U +Wn[y|K+oWީ_q/+WX%S?19#) L 2 3 *CȨ3+$2LMfQfUf[`TfWx|BbA~ar^ո̛vUmUjZUaUU!U] zWUUWͪTU\EUiUOzmmX<ݘ푝mmdYvEfYe֟ffeYc2,:%{4{('3;{<{>{8{-{))8"*su՚jCQ.VǪ+իwV^dT>W}7oWߪ[i_zC_ViPPSMA5jՠk5Z QíՈk5efaDfn*րk|N羉8)96~EE!bQ8GYH9ry5FeQQۡ+709%&قU[ `WcA\ Ɵm- Մ-&D DYeݤ"APU?)})Vi e'eZmGvN{mV ba`ɦs87ێ;ۈ;۝ۛ\7]=5ܟyu3km)}!  g UBx,.%0W"$$$%$o%_cdi_O]#_h)ȊYٵߕUk۫t}+?}CL_]i*m6]QA7 QzX۩!c`|RT]2BdYdbEfvwq1]6 6CAgSm<_ߟցC`e`Nm~C)||_ֺL[+twmA]'.7z=[vEeaQ~eql\lJlB #P1^leLǞ~]R7knR R/=ƻq||YxvSs*boOdɅIDĥ)Nځ龵Օk732lʳ՝/{u޲]Ζ\6ݹ?PKT)<OPKZ*8O\ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-cp932.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0O darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-2.encUT ]1cL1cux Gk``gڣ[[{wA/^ADE(HЋlo.yCjg_Ȝ~>zًI9/^PK/10PKZ*8OZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-2.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OGS darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-unicode.encUT ]1cL1cux ty.|'ViLbee ,vN;0cpRfw绻swsfttTT^Og "zV&d9܂yZ@B !0H=H}HHCH#HcHHSH3HsH HKH+HkHH[H;H{HHGH'HgHHWH7HwHH' ooG   C! !# #! !c c! ! ! !S S! !3 3! !s s! ! !p h xB 2d9 A aAoWC!DC$)DC%DQC4-DC #1C,+tmj`A PBA? PBA? PBA? PC'qC</C $ C"2H! H9$ TBR4$B 9H5$_(P\M-R){ ~nQ uuf8=@:nRX0%]?vǧ:(tV-uwNK_q3U}F}g4h/8 ߟhg4n/8M\ߟt g4u\ƿIG-^~FuߟJ 2Fߟі 2.F-?S3:.ߝ%ްU4oЌ[oa4ևۆdjBmshm M)-4׎ZB0A9 |P A(%rP*A5ԁzAh-AtnzA5#`c`L`+3`s`5kZhbMEФ\ M?@r>@P 6`X[)+I=p2~_[PEAJQEu@;p<8$T!h 4̀@ % lRܺ`SY|v+f]żb~qRhXV`)X,냍Wrləc%GK,*Rdoɞ@===@J7,nR+-X|ϋŅCFQ^7(fE,PXPX@H@)@(t08|@ $r@(4z`,v8<~ "@b@H@X ,ˀ `% X `# lۀO`'  p8 ǀ_ $p 8 "p  \׀ &p :K;]px<'SOx^7[/?> ŠTa0S-*V k k ..\ZpyᏅ+ W?TpKm *QpW={ \@ÅG +8%5 -=#3 +;V V   ߿"`l(ll8ll$   m     [[szIAIݒ%-K:-Z2䇒%J(iSҥCI%JƗ/)*Rҷdtn%@IIɘij\d~fv_һxGjB2VJ<<׏IBb#3gZY}(69HnK TKƈR{j{@n0yN!UrE$wΔ7G~,vuS0A0F[22UeXaYTEZHQ8;g. A]V OxY9926޶z,杰h\#菢y6''#xr]3ԲuDnCQэїяqU9CFSьL6s?'>'1Xlv7,>t]z*-syn܁ HIr5kS~ s;ކQE dD%0h M:zsCkg7+HE̤>fgfwJCCn1+EPMPJ; c<ŭ%)wCH݃K͗PT=ӿp|ps5w`PU As )B:(@Z#oe^≚FqykT%a{;T(8atChyGm4:>Lt-񈂢agLdZcV+C%`SPI 5wM}Yt""[f0A?a΢{ZgboJxr4Y-4ٺͷ|C C0/59s툝=AՃOeS q$ǚ4Vd`J!r,7ǠٸzhXo*aWQ?UV= Mp8;M265tL-f L-"=oѡЧG6ZH+zL^D`c=.:׶W0ssJ#ŌZ QTSjpjBDN/CXQsQt-z' s $KHV2L%ǨiVEޑf.`Y+yuyyoRAOAZxRB eCdy0 1MֳܶvҬ MN3F.%/ m0KBf.ǣ5؆X#f'j>zUN}H},jԆ!d2E@V !עDi7y#]Z^,(V*c*QʍZXT!#bV´T8aȱڜPaÜIL3Z"֙b:B[wA]Usx{A~ng(9\|>eN\ʰ;r-aȶ/"!q׸{kħ$,ե nBp7prb͒ƹN%κ7TxHyXzTX#& PH29]7MSvR[5IW{p81"V#A-ӧrY)48y#(kE z ̷*[Wγuw5Ge)0ǭVʌݢ'2߱jd'8>FaQL,Hz@>HDC'ۦNq:BAv@4ֺ6]9Ӕԛ:oaƓigx`VPG5! Ih@L'Y%SeMl[r7"g9#6ؒ#ڔOL%3Dt5 WsA7k[ꝸ6G=DwcM%xWdiۭ**)'T Lf6Oc,P|ty>3C n,;úƎA<&X"!)# Ɉ Jjc_n[YVX:RKwnx†ffbY9/i蘪Ng T ! "0p|tjVmb{vU"P73a3qJ̆u]-?.21q נ|~ gn<+pN}#:yϵ::4.&KH7@?)M)Pؑ;-5f&X7 KpJ+%#!=(ddTLC:Lm@r%e+S2\a'L7c"W RyCPѣwINFVKd׃eT*m5>25h- %C'it ;v1:s7IƑe;Qa {9g+dr֦\MsWPs01 RJ]J{ VolFAqLi9E WZ'Mv:Uά-B>Bk10wpIDrtccaSndn>}~S>OtLI-Yk&z$=ρ#ex4Nwj8yIc(,P`p3^Uú Y")u#?z1+m$C_M~\V}#!x#%܇b􎌬Xfza^m8;L蓸x)CM;:t wapy& C.swn1RL(a9TUzG?>fM࿒<MWQEou#!^5 u&EkONsGV%nr 8: ~]2oٛJ}n6ANPJO%jasdZ3TPU1]>9ۺ5N+"{@@UlĽV:IAj#59UnJ:{zF=`doXofFgw$%.6<9wZ[%.L¾,-=+2Ť~--liFDfȊn围@3 mII$RrnOԙݷ"m_ %qմ =HFkdkT)j-N p-X"D WRQÌ=J R0]GpKL.)_e<׌5-J4a{aXdVE0ޢSJTT^FFmJKi\vo1=pr/vf2=M"Vl?C"&)AW|$1WoǸ=b<=ٷz]H)v \26i@)| VHfgzɤ2(so'Yʆ)EeT z1)uJK@@h3͌11 EIvϪrt}x%Sv&,AMkKAwB@8Ʀώ+)EL<VK˽>$H5|8+v13xi?z: W?lXkkEL2qƼӖ'^zYġ<%-s'qwH~Q|4 ptm4l|k/Fy+ɼ._Q֞ΕH$s-5 [ C!lP<ӬC!bX@[@?BBf7$i'J|DxsV+sߪ*G=/5Èu6iL!mUfRߘ+)kG]e fQ~`"qvkJN8C/xF+̻64> >>> .7"\Qx ~~~~~;&= *!"0#"#|#" 2*W}dgd_d[dd +'r >r:r6C"sH>}}0 }#>v %3ff(f8f f ff&f.f!bd3FqaRE11111,SW0x_1110uSݰpl Ft*X3ցa=8և=]݁]]={ { {77- Qp3qx77Geq\W3l gqp~JU-au}E|[{|{7W|G<TÏAK"~9~=~;~+ ~~?9Q!OD'D/q'xxxx; 2:>#3 +.1%GR i iii i< GBR"1H|$$HNRAC!-%m&%=&]'(mUڵQi)ҹ#KGJEU{J,=X^K^*Tܔ܄ܞUBUSuT?CuQPԵԽ8'qiy%5Sk_&δNV.QѴ)48@4CMt4Svv WY%= U5]cڟW7oBz#:N7Oϡ/C(:NLnnzг }}%}}3>c dd0@щђяќ1хю1ћт1Qʘ1 :ccc!͘01$ 1p2nF1R4fa`f\`ldeelc\f.dcgcg02>1 =͙͘}}󘓙#Ә3jIdL1SÔ3L%Τ21L-3L1̵ f3L003O1O033abebo + ՐՈՌՔՖՅ՝Փ՟5,",r,dXYnVw9nY:ʹuuuuucg7e=gbae7d`F'r;vװu;ȮeocA-dc?agecggcvt9rTrUg*<g72 瑫6k-w -5ۑە[www$w4wwv>wqr\Uq \qsZOCܣSk+;W|1u!x3xsySy4y)xn^y^]]M=={oo̟ş͟ŧ||#0Gb+O}M ]sNQ#Q````-- ZALNP! rh`@#&X$%l!(؄u' ނ;¦ӂG߄0{Gm a_aaga/aOQQRXڄ2XF8QHB& BppW }3C„pZX)*)|,+"ōDD݅DmOEEEDDmD3DME*(A4[D<Q(.*-yDKDKEi_n!AZM9-jUzO1Ѻⱙb$Ɗb)6b!2qF\)/oooo$#>*>) %STFkIJHJH~$8 K"$e*S$ZR.KK^I.HJ~ܐl\\!X(% (#$).m-m*eKRTjQi+(k'k,&=&}(!=*SzSzJXz^zDIzEz_s L6XIeddbNPC6]6N edcd.jYFv\lll7YL\vPV+*oX SAM>YZ>TB>LvJ>IF^SdT[DyT[K;G__?_S4R4RRQStQtk=bb`+r+Zz-I T\Q6R|UvUvRr8e@S xDS~Vzʕʵߕ;Ǖg*)R~Q~Tf.A*@5L5^5A5Y5E5K5_ETiT6KTU媔jjjj=zzD=I W#j. jZV jڬ6QoQQVW?P?W,5%aqf!ij(FakDƦ kj4+4'4g5կ4544O455/5440mvvvvvv- -_+JNmHԺ*m^\T{PE{HMWCGI{Z{B{^{E{O{SM B/:ڗO7&fF>"]O]:::N3,:έ º.K겺*FVN.Ai%yM#!z}w}~~~T/Ћd=WoF}T'5{{Z{ 3 Q3X UaaaaaaO#UW[cckc+c'@#H0ҍFc4Ɛ1o\Q;߸ڸ޸ŸӸxO=SCS3SGS'Sajodmn"暘&IX7)LF0M)eZeŴMMGLM?ݦcӦLLWLWM7LwLwMML/u-̍͝#}ͣH 3/471/04k\7+J,3s\m2昙jΚOOϚoXZYښXKK{KK3;K/KKKhDt ւL -D ±-\Ģ-q2:bJf&zN^~Aeyux k[;'k}k]kWk;kcL|`0dH,ڊ­**"lk1՚.nM.n^Z7Z/[oX[oZ?[_[zzZۆzٚ؊mlSUվ/;;;[{}||/ Bg+#3Gcdhx ~_'~~Qo_???hhh?hhh( L - ΀-PmUH@Y`Y`c` ,48&8==X\diA^EAyPmAw0 LpqpUGPPPPPPIhThjBf,!iHb!WZZJ~ UNބ`~Umvn}fZiAsN}eC(<<&;< <)7<5 s09\aIXքaG8p* WEEF&GDDdaE$CqEo$)D#K$YYY%r r?r/r55) VVqYeZDN-k_/)eβl}eΖ]-TvZɲ?ʞ*W%0ڨ vvNyѹQdtNDQvEUQKGQO4 ED".nn=}kkkkk[1 X1vƖ6~]=ݍ{>>[{ƛŻǛGG>qdGǛ'qbq]je\wŭqgŃX|e|C|S|[n>kNZnuSbXHK;M*NĒĚĆĶĮāįK[;k/ʻ'ە*g-),\>Y^]*OKϖ,IEddqsWr\rdr|d$-IYܘ\\HL^J||<5K~E状m* +TU1bdEϊqS+3* VBTޯBQWX+J+, gU UVT*3Y\TrE=+wV>%}2}=~m~+"43&CgftfbfVgEFdԙՙ MÙC'lllllll٢,2;?ʢ l:.Ϯˮ^^Ξ>>Ͼʾ~~Sբ^nUUfVMR5&UVU*VS%WUmSlչ UnVݪ[uaՋUϫVz_9W?19#W+ M!r s*Girɜ;ȥr\mnQnenknDnghl\|^n~bNܫvmUnZ]auհ]KY TϮV=zRui5_6T?eQa|a~w~CWG~F]u~j~r~R~V~N9yT'U`ޟ_Mך5]jhk5gM&\)Ik׬Qf]YsLٚ_k.\Ysv̓5ۚw5k>|RAmCOj{T;]ekZ^-VR+תjuյC$ u]_PK#8GPKZ*8O^ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-unicode.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0O darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-7.encUT ]1cL1cux Paje۶N>um۶mvMɶ]7zt}3Ϭ=޳~k)iiMSdߓLBV$C^)BQQ)CYQ TBUQԤIuG}АFҘєf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qgd0iLg3l0yg Ybe,g+Yjְugfmlg;n}9apc'9iX;R>ّsunz%.sj&>Cǽdnq;uO菤?GLC?C?C菳zBC菤*CsC菤y@j 8r8INq38OED3UZh׹MhtE7]zG/}s<`!g 3s^Wf71[|dO|f)Wfwfo ?%///K߶////////////////ҟ//e/C PKM0PKZ*8OZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-5.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0O darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-4.encUT ]1cL1cux EoUQзRxJšPt@!(4! 3nϽwrU[W]\V rc3YQ4iBSќiC[ўtBWѝC_џ dP1#(F3ҩ x1Lb2S43b6sYLFgo|=墎.O!K٧PK(^R0PKZ*8OZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-4.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OG darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/READMEUT ]N1cL1cux TMo8=bnR{ bl5=DY%R )dG! ᛙc=ک,Xw̚ j#qV&6+e㩰yUO}" :tJf x}noNyOF鱞2`Q2LV́8^cuhME9Rxs x<Dely[)9qAԩK*k 3`rPtrHi< u2 3 Z0orHeῆc{WFIhSUs$yG_\8?? M.]NNJ2ܴ"CC"r|˻Igxnk.nK. n!KY7(OndZ!Kl "jѦpn%̲T*u>)T t2C<@us9Q!f %A\J ڶ2UH2\w!?6c$Ľһo`"鴚?}{`M…yl|Z$ɺyݾNG| ZI5"Ex~_N؏ZQ\:Ix7&(2.Ķ_ /c^nN/..h'k nV/2~VE$Dv @\)z ir-Զۃ T2^mŞ|*7REٟ0Ea!NDȘKHets-lz^FG9ہ q#1}=g[HAl0#ObЏh/iVK3&USjs˫ dekVF։YL/t'qC"_oh~PKlFLPKZ*8OR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._READMEUT ]N1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0O darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-9.encUT ]1cL1cux nAP.9xw";Wwww-5Hp(7=|ߟĄp$";9I.r#?(H! S8%(I)JS<H%*ST:5&MR4 LCј&4͉-D+Zӆ=H':Ӆt;Ozҋ$Ї# ` 2`$2L`"2`&2,`!XD2XNJwXJRIcYZֱ ldVd^9Qq9Yq \I95s6w=̆#<9/x+^ |pNС|3_7dv%d//PK0q0PKZ*8OZ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-9.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0O darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-8.encUT ]1cL1cux gSp1#{l+OV*@w_w»w?[dErp(%EgЕNzҋDӇЏ ` 2 8F(M"Ia,&2L!T1$Yڦ\1,$E,&%,edIYJ!Uf ֲl lb3[g+lc;`' 8LG(((8'8)J)4,;8p=ePU^sia6w.>*!*1OTRTrTߨ~QD 58jHШaQ@TJԨQqQQD5>jBĨIQDM5=jF̨YQD͍5?jA(|E"FQP%EQ(f+*-ʼnF(~ J%BQQQ(,J%G)2Q(u&JGQ(s%*+q_9t-G⪍[\S7ϻϧhХ [q%S=4ս[RF#rCRMuo4ވkUsuo4ֽ|~-CT-uo]F8VF7N{]zh{Q[F}uot2׽y|=4~սeW]uot]ouotVƾ:6zO93g^-{#~H=4ԽČ7 ˺7VԽ,{or=4ֽoi7$CakĮ{cpzhܭ{cHECuo Zuomύj;Cjuo ս1m=4.ֽ1Wh|cZClc7q8YƄܺ7&Ϊ{cRzh{c)NmϷ bpFƸ&8\3\s\ \K\+\k\\[\;\{\\G\'\g\\W\7\w\\O\/\o\<.K%E"A!a8KōčƍōÍMMMMMMMM--q #H82QpT Gp@aU|b{[wA-7>Ԓp;jZJ-aŷMP[;4ՎaFjG׎:k֎mkNk'Nqk-SkֵkgµH=\ZVmZ-;K|=@#1Ƒfq+3$oN>߷qF''/N^/y 'EF&GO5v^Z|Zn-/<w)[GWg(M&J$%jZ~VX+J8 q`މR/^J84qd∾SN;o\B 8PL%%DoudB$h[[iOIMͨ^KLJN=80՗zD61#)/ԯɎdgrvrN+97ٝK.L.H&'{'$H#$04Er]~,Y,O&$3yɏ$?K~LVEDFEG:D:F:E:GD&px H?A L% t HI@2DgDI$FD"ɑ~A!a ILLL̈̌̊̎̉̍̋̏,,#`!FHrP"-BFL (8$4& ǔŔTTTT,Y4fYbVĬY)fs̖1b+fw̞1b9s(Hјc1cNĜ9(qJ)q)RHi*u}&mJ)R:tJ%kJ)=RzJ'%)%9oJ)jx'0>?wD!QB|H‘*S,I|9)~~ ~&~g SH1_S'p?X$0L25+5v/YǴOiOS%ӜYXǷŷx7>/KKG'gGӉS(QJ1bԘԄԔT}Ht"%!&$3s7x<„XmYIq,yttA"^8L+ w >Mx "1HHJ` rrrrV2kUN.x?___??'$ =ĵğ_fEr#rcrgrO<\2%2{Sg;+KWOg;pX jXˤ0 i/^=g7dǰUl3 3 !#BBPt0:%簶Xl 6MRnPew5]4554&E3\Ztwtu j|/|o< OƧGq`Wl ۂ`s\l,I, n$u&%#"u"-%7%' r&Z@͠6P9 ZBMjG}HOGK!apW<gz [`Le91[V֜[H+i&B}}FЉ4)I$&0`\Q0bxBQi?*(ǺckakgKYmy|!s(Y.{{g &W A @68d ǀA @<8 4p . '.$jۉ;Hɤ$@R*jZrzBC^$/AP*4u@xh 4 (S_S?PRͣiShCM&46WEJ^ A^x93b2L&&M݂c=XNopt&,#_kFBH!Z$"Čd!D!r$ȐR .XxGQ%DRQ6:rQ2J%i+r ,3b~Ly11Ċ0 ĔX\+J0PhfEW"J<< jkiFkh'CFb ڊmUVn;c}G /?x -k O*|}}}|G%KsgÃC)x*^WkkA9X* b`@'5LM`}`4!"H!uD-QOGKOCMGHCIHSII{$2D&dYG֓  @AHB6lrAfeBZ C$! THEst Z:G43 φ3`»%8|> 2|a |fY 3+e V7X5݅ݍ݉ݑݝݖgCJv);q+̹yʉp[s;pqGr;qr;rݑNHGd22 XSY(r9B.#w5*r9D!{-rنF6!7 89/$\!+% j/j!j,j(j%‰Z:-GKLU:4BCUV4B-GQ3*%}$" *b%ۄŞa[}~l/[]î`;.>b=#v[bױTQ(Rxe!19JT<"ߑoo(,)\#'|,J ŋzRDIh~D7vt}GЭmG?zY!qJ\m˒Xo씴ttt4YB"%\KK'J'IGIc_ccC#k[k;˔R+WʇGӪ=ͪs-n!P@׬,,,,.m֭====k5j;[[ffvv..F1bkXZYp8KKuzkkckikken{fm;b;j;k{dc;oo{jgHtp8988;cϜ qˎK+.2nI=盛'[]T.Pl-{{????8W CH(=t&69 2|',XVZZ } B'BcBoB7B;B[G@~$$w!`-a!h&.#.'.!#%'!QI,DbVr zIiCi@ A(_+-^C)(MִZ,0* =n `:`eta`ftg0}Ɍ8EgndnangnegncbdŲ, zzzր%{{{ {{'S p\>B.KJ\97[-pK^n7F>">??OOq|" ?!ppLxHxL4M4WHh#Y ##%&NJ!qg1Q<"&'gۋJ<<Œ i-͕zN K4O*2ji+H PZ8x84((**(\8;Ck} IӰ4 ٯ99٬٢٧٫٥9٩nԞ֞Ӟ ^}?}OX_7P 1P lCf`^^nn-ScS[s%oItttttr%cCƶ.ζɶF/ƶf?7ccccs䄜c\H'LqwNwA.kص̵u-uUnv-nw5x{ ^.Zxݏ}~KRg X? Az~\|e͊Y#B`f!AK( AM@Bk % tttt܆ܚܕ<<<|D2AQfPe:e%B eE@CJaQSTT ֔֜G{@oDoFoL{H{JEoHIN cc*c.C`LaL` ccS<<<<<<Ίc5e5aqY,VZZiҺuJKLk6 CZ״~iǰGS٣;;9#994IH8!N,,Trܥ<"JVsX{{{{{{{tGW  9_Gaj~&?W%l___/64!UHB#t!E +µ 3³4C$E"[t.7VVIBo;G.qD\%^)/;$%%J`ҽ[Gҳҧ_F3 Kҟҝүc˲nm7/ǥGo?32)*+'*-J*WHLnUT?T5=4FA4 OsUsMMsZsN[Al~xSSw`S_SWS/Ps9d.̲LdZZZ&XXKeeee%:Zm-^ͳͲw$GCHh(XgvKA>g,v99uNt9W( AvQ6q&)7]v׸Aw;?8Ixxz{{s *ZJj@T`wn>6^xkC}^^3**6 bWƇ FjMzyB!PFl !L(Gqď$%IMҐIIHw rb)J%LqP*))%\J>IBYOLlSPR6Q(y52ZK0@z=_0c3"FcSd^fe^a^d5c5g-H#H====>>>>ʙrVqVsVr/qq7sszp:r?ps܏Vo8/{c}eE#u[;G@"!" BpH&R"H. ,NT+ў_k_/?ŗşOg[Ko%>%.LL%A^{l(6 ,&#d 2T6O/Ku1etY*Ɇq鲞I33>15QML@\c^na[bdYEdA, mjfkn#r;do'YIv]h|y,K6-Cv Y_'1٭cw8:[;n{S3/z(gg0=,8(:{[{[;۽; <9 .TpN߅? *C#)1Q8m.u(Xԧ(WQˢ6EMږJK~iqiQia, -+XTǂGǃ'Bg͍M/¯ïŸo֗>R}AXGFLB8FOXKAC@8At$ 9)1 y% 9<. )=68=M'tA>I08888؜&g/`ا'980g-g=5o73;')[[țkk$ I^!ւQN΂BLX#( D"((EhLzIz];KCt ݑ>/].Ig t~:S2[\-m]meUc岰lll,(]mg™陂̹h&+e.f3ge3qJjjjjZf)jL5K8m'G/MDEY{_@It"[t:L ub{/oԇaW7b`4X }nxccoc/cqIg:hd&ԼɼżRl1XgaZetkUi]e]i]f6-۞iWv]fW%`7EFَl]lM([=7ffOggKg.>in\;anLnfn}}}}}}}}92GQzT'ݣzg'ӓz̃y gGEowX/ |.Ui;_\aƷ??OOC ~xB???5.92SEhEc&M)T,_$("([hfآEp0, OO!uHnnnnnnRk˶m*ZUUMx ;3u[m5%Gy+"BLr:J-GNLK@mL|v6|uukYt'9t / 'IpxxxŸθx03_0113_232Z\6gS46ľ¾iƙQpvf&tJ{פoM~.}]ҏ/̕,RZy{$y|<>֗Ed)1>Aar|썼{fIfY%ӓY,RU3T@Wgj&VӶ6ikiuUWW >Cq1Ÿڸ޴Tj7iL!S34嚲ͻ-{,-}EӖ͖Mݖ%mu˖Vmcrr4qtpr>} xٕgwf̾ޛ})tsssGvɥ2SY),{՞垕')fx ^%IAYAi__;_G_{R?O|?g]@]/EʢE@ҕJ./], V+gC9TS֨EY\١ ˟WLV[5kc8oWObCbSb.)& HfPxXpd*Ҩj(0*@k-Jz*?lll|||%` ӪJoﱟrp29;8xZʓx>y [ ykyezd ] Ղ/(X.( V k債2FEEkD[E2dN WF 3h(mF[ A,Or\$.TΔ2y(W.&˹rNfMM+Te j:KmX$m_m6Q[ݭ}+꼺._FL[Z_MW888888޸޴δtԴtttȴt|rrrrRmediXu ^i/9s&t~38gHN9}rr:dIΎ4us\Q>W rLwZ^&yuk99)ll\l.⽘Q`i6=  [(]Pثpoo/ٟ~_C)@^ ?,:VhG뢵EOm)[tDчͥJ7bCCMBq!n ƒ=[ʚ/kW֥^Ųew.]+\v|G*fV̨UȫWU1իW!;;m{ S%T5*T1UHͤʩj'`'sSjř V-Ujt/o/ Yݦ[润S;GWkYcYMg3+.`l`h}gob_e_ih;y9pΜqNz9Ҝv3&:wIn70ox^rޠyx{~y|yz^xyj7|||JRoK”  Vkjޯ@Qq|ũÊ*-VܦoqBq]KWWWZچ:ZڇZ!VH pRYeʺ%u+{[cVTuSշU7T{I_TO͡T <`d&1,q޴iv%}Sü3pd!tng2J23dTfXg,$%;6#+5;2e>|6ṀʑY*J^ިGR;K;M@ZEZQVBN^]KE°H30714՚[oe ͚5+ktY&fd̚5"kl֜YYgX?[2mJ&G/q̜~NvNVNeN $gCNENn ={)wKkr={&o|ިyc&o9k~f=cxz'{U_޿?+ /S877777o[~ 5gcbE1*=]zlM^E+Ye#E*WX]j| V߫S3f>1~~9{ > j߅;DwѾ[2fؓ3p D/٠S4*)*ZgYCSi+4X_K527򌈑kL.T6lbвUT4+ +NW[q`*[c`b*u9>1kU=xq/vEwEoEE7EOEGEeceK%]DUF>iMƥhyMF1<<<<<<%K%2dgeXsT]֝9rι4YF?sky+?7gM  BXA>ol /~T|Aw_/~\|f/Kxavf,[ީkEˊ/*WܩʫU)2PuqVJvV^St-9/bP WQVhkhld/ʗs% Z s 3%]Jb> e2bA@+[VUVéc,,VSCX*z[KY@]B}]}Ub&dֽή!n>Dww^F/_˷/8 %CKRKF+S2dPИP$e˧O*PU+T&WmZujguU5Q J@O=I=M=Ŵ]M"$I3 OATU6SG+bakزlP T@#`*0 f`.0,x d(t`i\ B@H2 R@ (4z`,@`lpN \@.x~ b` X,V+Uj` X6Mf` lv;]n`Cap8N'Si p8.Ke p\n7[mpGc x<_/Wk_ x>Og !clNcv=Glؤؾb;(vpءbؔᱩ#bGcGŎ;6v\ c'N;5vZ3cgΎ;7v^ c`7$I$Q$NJOR'iI$}!ɘdJ2'Y,Wr7?_@KQ[sCS0#1`Vd,A9MjAA^@K;Øvf6k {#ux>'S,fffֳ6VֲjXKYXKXY+XU؝]99>$qp8}3n_nWpnX;یۙMq{ :d+r ُF#dYlDv ' W DvߢQsQKQ#_Q[Q7bh!ZjQF]h6F P/jDkZ:Q jG-$Kl,}'VaUlہ]c#q- öb aR;6b? +"#"GQp)EPP+ uM)]eUmY%2b:?%E*=Kd$Wn~~~~u njz۬1lmKm;mlE5rGQXXvvlut,vrv,sqlw,q)\r%R}}g|W||}|7[[cs1 <W-p. ii. 0y"L2r -Aˡ gKhmAǡE -CJ>VM-yi!ZVB |2rZ9n G}W!\ 2W.nβnΰ۬SӬ+ i? Dvv<;]^^iʡr\ܱ\䲹3dl\.;;&qgp\WLC#-͑V_'5; Ttj(Qhh(Q*$')!+F۠OIt7z݃@o1_)݆Co; z݅G_8=Gw_)4z}8$ْ뒛X< /!"- ,m'mݖJc]ݤm8iOX_@E:Z#m-"m"6&Jm;5MŊmUʩʹyJLP2iSK'YaI1.v6Vտ#㪝37wٚ9Z.Fkk{{oooooooff.m,%l4l3-1V5`-5uݴ=]]=ݲݵ]]ݰ=G -G㧳q>w*·06?c4<,qQa<G4[DDۡŽsũbPI"!)$"&ƋgG{ۉ;lja!搸%%O%/%O$%/dQʗ ZiK)OZ$KT*R%eKQ)W*f)Gꐆäbi4KjfK;IR"H+K{3ֱNJˊscۊGizySSjU8/e򷪁j&Ap454{4G5545)]O]w]]{];]][]G]W]7]~>Q?R?L_?T?HOԧ Xd 51<4356573ycks7MmLF֦fV8S;s9`fceiikiebdiomigimiaeYyVkM2AkmmhHv:8g8:d'99Y/;;::'8:;9aΙNsss"VWUu\.WܕZ*s-vp®BW*qOwpK֭tܙn[vj;K˼K m; ^*}7E|?o['g;B '7A0 dx6K JBT0:f8t'[+wݟp|ݹvP"%a%K) !H  mwr.߹󼈾9簦Ƴ,-+u>[]0[}%bN[6GY,v!{({?;].;uv@===݇===+Vn&s?ȭ*FWns_>}(e=nܟOur>}˭˭ Wؼ"77WcyRB^OM xټ<>o:xo/M5|%_vڂV:.FN±m]-­Ce_AS`S <,^px悛; N/8TpxX*Kv^qZ^̈cb\ QqXo)qx&^&%Δ$F.1!UT&e dy¢r)y\) _ p|||\/ɷCr FF^"WrZ^&12In'+*))+EHTžo+ު+~V|xgK Nj+[|x_[ŷo,>YUŗ+>Q|}_W?(ޣnznnqhƩmmmmmj?kj?*j*hkjjk?j%zs塯???o0Ec?c@` c(tSiiiiiè4 ȼD,a4`kkkGkg k kOk[k/kk?@pk+k'[ٖڇ؇ۇGڧ{{'اgGٻ;Ψ3dDIv%KL*jjjjjձaA#K,չUֺu厺n;^q5n^cMn{uopIdz߳<==zxv{6y{vyzl9bިwww7%oܻқޘww7ॼ8V]c}}|}#yAXAs5~_;kۄ ?  _  ?#89xI|$CxA|!'-)ePhVaY~R`,%gX$fg]i0gYJ6^^^6r)bogK${W({1ϭ-.%{'tnnnk 8Pn_pnno"F^YxKxig-Eyxx0NjڮN!:޺^rdӵk劉 O7wW Qiajflcbikemc|i*0ILRSؤ6&IeLrTh֙fYedelcbIX[ZgZGY'[[g[Z[)%mmkb{c/yb{]a϶Ϸ,{}ssS989;d+a.vsMsqqt=vv}q}u}+R:tLR{}n~~ 7puwp?p+oOϺ?O5;pCCy//Í݇/ݯ݇?WߞkǞ۞[g ^{ϻwww V{bq,n`7}s}s|#| |}>oo/7ݗ%݁}M]A8XĂׂgǂW炗׃ǃWG7; 'S3?}ƒjDoJO'Q#-HT UʄD!Q@V$k]d++YCV _d5 ٍD!;-dUY FpZ(~V.+);XvPٻ1UL_z6=uuuuu/k7k3kשׂٖlS5>ľ>>>>ɾ>>~;>Ǿ̾Ͼ>~>þ>ۄÕs%y9\ R.;+檹?yxyxy66vNvv+ky `@* HP(x+'+)#%<"<-<*<%c/^)~yya.G/$ $$5%$C_2H2I^TB2B2LQIRGU_]2A2DORKJ2^EMR[DZW򗤞ҋ2, 2'K"2SQ@Á@!SLr A@*  `2`@Fa@0@? VLULQLRLTLWLP*~(~*)(*iqeHy@QRʈrrrʽi N& 9>!-5eBI*qePLX_Uy^yRSnP.UOSWg@]֨MjP-ROTsՓԳ*u)}d5O3O4&#33tu3utٺ,]nno7덀[PPYE[SM@CYJIː0l76cccqq 5%MS&1-6MfSTb*3Y6sn6[ZZXZZY[Z:Z[Z[XZXҖVUb-꬀UcZVUeYMVUlbfh={#v[nGn'N)w.tp.wtt*%q< ]\BUC5%*m[:tr҉Sw8`3΂ρ0^`-,@Bx< [I O{ó~D\x6 CG X;p/+aZ|\|BxКhEg.Z{{{{{{{{{C0=b->o+>st>K`t`V`f@dO Ay@ A26_e]u|YA~I}Ec'T1T!T5T=T#T)T;W1D.QhH4#zd6ٟIAn/9J ydYDBPRD|RLH 9!gr`4MEQ,ʈXٲeʾ}icƘ)׏׍׋KlLlIlJlOOW'/c%USMsmCEK[YײK]ϲ_Yiʩiɩiéi̩i˩Ÿ6nz..%8-zVn^=]=}ǻ{ɻûͻ{ʻ7叐 O,("p xMN!W@#& *<+%,.RIPQoQwPiE٢FPT"҉,"H*%E"Ga^^9D I D+KddT"IfIr$)'Y(QHHT+]$[,[$U-R N@ X@@X 6^`p 9`+@k@Ā0p,*f*(f)ҊbT SB5PK j)_A[BZ7k4(_@աz$34j CuvP /51uQCjڣvcɚMLPI9,l]NS:HWWWaC3C CCSCCC-CFfDFFiiiiiaZkJ֙fo.3G3ef̴ttz)JX2kV܊Xٰ5a]f-cm_ii?h_j_c~~ۏOO7w3 NNyt.0v+6c2x1wg:xok$>3Jx0 7«+pWK&Ah';@ǣ}v_hK5: N@ǢS@'6BG!D+ vF[ц/'wޟ޷ޗ-2X{>|e1y\ \ 5J?x/^Wë*zD' сH'_DkBh3%HIr!א'WIr-i&c\J&qKH;%>Ct(dH?٧,]O,1G+Ƭ189cgcgL"8ؕؓ؝8؛8ܜ||BOKO}Jdɪ՟5ZVugYuXjeps&rfsp&pfrfprgD%), $% I$ Y*H͒ HRttlllllll#X6_;!ox 6O` 1 ^5*` X vf,rRŊVPYX u H(aP*Aă *ؐʆXP.(HUDCEPʁ9($Y[մzz:^ޮfi2buJRU$\mVhZVi R[CuΧ\:yu6Y_C_]0t13451t22t76 !mAcȈ3=sӦ KCæyy9e^b6VN)>:YF.Ivqi)MsU=Gewcg;[k]ιɹDRRZʸҮk+ን6+WS]*[tFF! HRGj!ݐ6ԁ?"=HS DgH37iE*vgd~?ooH Dy CbT{Q>P bDY\4J4P+G "X VkZbհfXCV[-ÖbK9Q߾ K˾=}#kCݾ끱9PQnziFvIpQ0\x' 7[xK+ o7[6xsUwsEUCSYyXVpQXA#z=@+ї@#\D)%yy<@^'ww]J&OoȃS$y&ϐ yXvyEEF7D7-+[Rv1V5V#V)Ƌbx;;oooߒhhhhh888888ܚ||||GO'EV2@i-%ԯԟ:S!-Te鋙Ymg5j0N{h92Spcnܽ܃G-[; 6 V V 6 6V  6 rL  GĈVDGDDGENvhoQ@rUrEr^rNrBWIInJ>HKIRtlllltQ'p0(gE@P`1h`䁣q% ! Ѡlp8`++85c ,:-A@g: Ih Aks~oh tZ 6B[M#WO/OϩQUP0ʴEڅZVuN]RHёn000000ؘ߰42Ɣ6.1.5FytttttyeeeeovfNme# S7%s}- 5]llWmm9;8;:8;98:Z9::j;;9:88:;'9N|SҳGBf .vZ&:6NJRv)4 S2ADLE$d!12#jd.D)B "C|D,=RC)D -CEѥ(QeP)4bX;+źaX덵%>>n~>^> |,>O1?>6akN "C $BT7UjOUSj85jMuQTUmL9Ӂi4az0mLGӒi=i4!>}9}%=(3&kVY:dȡ8N7)89.%9}]]}V;{NB!/hG;7gRDCzC?0.p9i)\. @RW_X: >B-z ݁CS=;S{C[}VBnn.[[۬[ۨooo 3 όۍk[;;C߸͸ٸ\\\żּʒg[8egg9`VVVVVVVVVVV111(>1111111119t:vGޮ=îӮ#c\J<č !d%E!~d)bE!I$! bBr)Ct =nBס?z=FwItݏE[! l46ecðzl#{}+} 3CUmG}#Su] 5c* P !|.>Yl|ZhRh| ;DXBD XD-FJBqiRyA,*Bl T.Ŧy2RVJD )1UDPscC#ѝe6u%ccX:..''ggħ'%$z%z'z&%&%$$'≥J/oω_߉}_tOz:WiWЋ2C/Ae1Lg0IXf3IX:ޔ>阙Y5 OV_N8II,PGyX]=]=V|VVF7e7d7e#.p/x< w;c6pB8GU ji*i*i utuv ːc5 + { /Mu̍M5 ̍ ,6>.<q\G#ߑ(p:r۝[__K riΗ mQr9lE#{cad?r 9G <>>Aћ 9~@[Ez }.C׽яS6a f{;G;GG&D ~++yx!^\K"p.|~hjhZhzhѝI"Jb#N(ICaJ PijTPAj3EP[e*jZ_bBֲe7]+[[[[+wؒؕص8+ώlL2yL3Yfrlf>p^Ow3322]22=3=233YC˲l\Ј???NpH/!.m +)#'wew'ix<o9 xGQش/UGU'UUsUgUUOMM-MuM%MUr 2Rb)N!}3C񝹭uy21773oYAѶ޶QC09TrX!wrtN/rTT*F^ Wu\E^"5.\@"7侷[~VCzkB\La\L-NlO9Y~??џ L @2X-X=X3.&>/MqC١м+F'u:HݠSߨi:zL.Qe0u:@zGoDo݋uu-؎؝x^|A\ύKLOLKLJHLJ6MvIMvNNvLvHvKvJKI6Ikӵztz~AGߡҏ[}~Iߢӏ=cd\/fJaL3 F0eL)1fɠ<I韙> 9N&7}"8*8&|-| _7isi3iSic]SC|>hU?0`Dp8Hx( McM*]k6513265317w1w2w3w7w6(}ҲRlbanifb{:Ĺ^ZT^ x:"<ߞ֞ gOOMOUO䗷&d.싿~_ phA C/$&vb 5R;ҘiB44tԥ>E*P_"#""H-3Ri/z77/+'+;^/ĂĬDNr`rpr@wgrhGorxOXd(݀nD7LNՠ_SSSRRSMR5 `1 C2q&,b"LYĘLY¬bRf?)cV0+Ӊ4Nggf0#,Y#FddzcC}iSsw_֊JOEe𫢂jjjjjjj֡on}lm9ux~tq)iiii;+L)~&8B?$ )ĮȸȨHȘHȈHȰHȀؐؽ$~"~4~ Mp#cS#C?9.ynJ7[tvWmMwS{Gs/f'9Ɯd1#!f9bv3ff=sʜa-TEuUuEUf@fnFdȹ8G9G8I;HJ;*j+j(j.b8\Uf֩j(671o,j[-϶Ʒlmsu)Ux{xyz{zz{{{z{z`jl?waG`S>Y\˟WXraiii셢⤊i:jK.۠2^dhBHxh(Xo@o_ ̀0-~lC'RaG܈0v8v$^!I.7JLIJS RSs y|e2{k1yg^2SU`|}CZMfxfXfhfRf^ygUF89gs}ddU*J*t=2^674ﰁ+-LGQYҥ)uJnn)FIfJھx@X8:W'bڸ.~:!JMJd94<3g6*R)@RNMg"9ӠO*Rt[2̌LPKE&jkPKZ*8OT __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._big5.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OGT darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-jisx0221.encUT ]1cL1cux ty.|'ViLbee ,vN;0cpRfw绻swsfttTT^Og "z 6\}ǽ:B RR    R )qQBAC@BAC@J LLLLLLLL̀̄̂̆́̅̃̇,,!!!BBȐ*C&aC8.C!DC$)DC%DQC4-DC #1C,+tmj`A PBA? PBA? PBA? PC'qC</C $ C"2H! H9$ TBR4$B 9H5$_(P\M-R){ ~nQ uuf8=@:nRX0%]?vǧ:(tV-uwNK_q3U}F}g4h/8 ߟhg4n/8M\ߟt g4u\ƿIG-^~FuߟJ 2Fߟі 2.F-?S3:.ߝ%ްU4oЌ[oa4ևۆdjBmshm M)-4׎ZB0A9 |P A(%rP*A5ԁzAh-AtnzA5#`c`L`+3`s`5kZhbMEФ\ M?@r>@P 6`X[)+I=p2~_[PEAJQEu@;p<8$T!h 4̀@ % lRܺ`SY|v+f]żb~qRhXV`)X,냍Wrləc%GK,*Rdoɞ@===@J7,nR+-X|ϋŅCFQ^7(fE,PXPX@H@)@(t08|@ $r@(4z`,v8<~ "@b@H@X ,ˀ `% X `# lۀO`'  p8 ǀ_ $p 8 "p  \׀ &p :K;]px<'SOx^7[/?> ŠTa0S-*V k k ..\ZpyᏅ+ W?TpKm *QpW={ \@ÅG +8%5 -=#3 +;V V   ߿"`l(ll8ll$   m     [[szIAIݒ%-K:-Z2䇒%J(iSҥCI%JƗ/)*Rҷdtn%@IIɘij\d~fv_һxGjB2VJ<<׏IBb#3gZY}(69HnK TKƈR{j{@n0yN!UrE$wΔ7G~,vuS0A0F[22UeXaYTEZHQ8;g. A]V OxY9926޶z,杰h\#菢y6''#xr]3ԲuDnCQэїяqU9CFSьL6s?'>'1Xlv7,>t]z*-syn܁ HIr5kS~ s;ކQE dD%0h M:zsCkg7+HE̤>fgfwJCCn1+EPMPJ; c<ŭ%)wCH݃K͗PT=ӿp|ps5w`PU As )B:(@Z#oe^≚FqykT%a{;T(8atChyGm4:>Lt-񈂢agLdZcV+C%`SPI 5wM}Yt""[f0A?a΢{ZgboJxr4Y-4ٺͷ|C C0/59s툝=AՃOeS q$ǚ4Vd`J!r,7ǠٸzhXo*aWQ?UV= Mp8;M265tL-f L-"=oѡЧG6ZH+zL^D`c=.:׶W0ssJ#ŌZ QTSjpjBDN/CXQsQt-z' s $KHV2L%ǨiVEޑf.`Y+yuyyoRAOAZxRB eCdy0 1MֳܶvҬ MN3F.%/ m0KBf.ǣ5؆X#f'j>zUN}H},jԆ!d2E@V !עDi7y#]Z^,(V*c*QʍZXT!#bV´T8aȱڜPaÜIL3Z"֙b:B[wA]Usx{A~ng(9\|>eN\ʰ;r-aȶ/"!q׸{kħ$,ե nBp7prb͒ƹN%κ7TxHyXzTX#& PH29]7MSvR[5IW{p81"V#A-ӧrY)48y#(kE z ̷*[Wγuw5Ge)0ǭVʌݢ'2߱jd'8>FaQL,Hz@>HDC'ۦNq:BAv@4ֺ6]9Ӕԛ:oaƓigx`VPG5! Ih@L'Y%SeMl[r7"g9#6ؒ#ڔOL%3Dt5 WsA7k[ꝸ6G=DwcM%xWdiۭ**)'T Lf6Oc,P|ty>3C n,;úƎA<&X"!)# Ɉ Jjc_n[YVX:RKwnx†ffbY9/i蘪Ng T ! "0p|tjVmb{vU"P73a3qJ̆u]-?.21q נ|~ gn<+pN}#:yϵ::4.&KH7@?)M)Pؑ;-5f&X7 KpJ+%#!=(ddTLC:Lm@r%e+S2\a'L7c"W RyCPѣwINFVKd׃eT*m5>25h- %C'it ;v1:s7IƑe;Qa {9g+dr֦\MsWPs01 RJ]J{ VolFAqLi9E WZ'Mv:Uά-B>Bk10wpIDrtccaSndn>}~S>OtLI-Yk&z$=ρ#ex4Nwj8yIc(,P`p3^Uú Y")u#?z1+m$C_M~\V}#!x#%܇b􎌬Xfza^m8;L蓸x)CM;:t wapy& C.swn1RL(a9TUzG?>fM࿒<MWQEou#!^5 u&EkONsGV%nr 8: ~]2oٛJ}n6ANPJO%jasdZ3TPU1]>9ۺ5N+"{@@UlĽV:IAj#59UnJ:{zF=`doXofFgw$%.6<9wZ[%.L¾,-=+2Ť~--liFDfȊn围@3 mII$RrnOԙݷ"m_ %qմ =HFkdkT)j-N p-X"D WRQÌ=J R0]GpKL.)_e<׌5-J4a{aXdVE0ޢSJTT^FFmJKi\vo1=pr/vf2=M"Vl?C"&)AW|$1WoǸ=b<=ٷz]H)v \26i@)| VHfgzɤ2(so'Yʆ)EeT z1)uJK@@h3͌11 EIvϪrt}x%Sv&,AMkKAwB@8Ʀώ+)EL<VK˽>$H5|8+v13xi?z: W?lXkkEL2qƼӖ'^zYġ<%-s'qwH~Q|4 ptm4l|k/Fy+ɼ._Q֞ΕH$s-5 [ C!lP<ӬC!bX@[@?BBf7$i'J|DxsV+sߪ*G=/5Èu6iL!mUfRߘ+)kG]e fQ~`"qvkJN8C/xF+̻64> >>> .7"\Qx ~~~~~;&= *!"0#"#|#" 2*W}dgd_d[dd +'r >r:r6C"sH>}}0 }#>v %3ff(f8f f ff&f.f!bd3FqaRE11111,SW0x_1110uSݰpl Ft*X3ցa=8և=]݁]]={ { {77- Qp3qx77Geq\W3l gqp~JU-au}E|[{|{7W|G<TÏAK"~9~=~;~+ ~~?9Q!OD'D/q'xxxx; 2:>#3 +.1%GR i iii i< GBR"1H|$$HNRAC!-%m&%=&]'(mUڵQi)ҹ#KGJEU{J,=X^K^*Tܔ܄ܞUBUSuT?CuQPԵԽ8'qiy%5Sk_&δNV.QѴ)48@4CMt4Svv WY%= U5]cڟW7oBz#:N7Oϡ/C(:NLnnzг }}%}}3>c dd0@щђяќ1хю1ћт1Qʘ1 :ccc!͘01$ 1p2nF1R4fa`f\`ldeelc\f.dcgcg02>1 =͙͘}}󘓙#Ә3jIdL1SÔ3L%Τ21L-3L1̵ f3L003O1O033abebo + ՐՈՌՔՖՅ՝Փ՟5,",r,dXYnVw9nY:ʹuuuuucg7e=gbae7d`F'r;vװu;ȮeocA-dc?agecggcvt9rTrUg*<g72 瑫6k-w -5ۑە[www$w4wwv>wqr\Uq \qsZOCܣSk+;W|1u!x3xsySy4y)xn^y^]]M=={oo̟ş͟ŧ||#0Gb+O}M ]sNQ#Q````-- ZALNP! rh`@#&X$%l!(؄u' ނ;¦ӂG߄0{Gm a_aaga/aOQQRXڄ2XF8QHB& BppW }3C„pZX)*)|,+"ōDD݅DmOEEEDDmD3DME*(A4[D<Q(.*-yDKDKEi_n!AZM9-jUzO1Ѻⱙb$Ɗb)6b!2qF\)/oooo$#>*>) %STFkIJHJH~$8 K"$e*S$ZR.KK^I.HJ~ܐl\\!X(% (#$).m-m*eKRTjQi+(k'k,&=&}(!=*SzSzJXz^zDIzEz_s L6XIeddbNPC6]6N edcd.jYFv\lll7YL\vPV+*oX SAM>YZ>TB>LvJ>IF^SdT[DyT[K;G__?_S4R4RRQStQtk=bb`+r+Zz-I T\Q6R|UvUvRr8e@S xDS~Vzʕʵߕ;Ǖg*)R~Q~Tf.A*@5L5^5A5Y5E5K5_ETiT6KTU媔jjjj=zzD=I W#j. jZV jڬ6QoQQVW?P?W,5%aqf!ij(FakDƦ kj4+4'4g5կ4544O455/5440mvvvvvv- -_+JNmHԺ*m^\T{PE{HMWCGI{Z{B{^{E{O{SM B/:ڗO7&fF>"]O]:::N3,:έ º.K겺*FVN.Ai%yM#!z}w}~~~T/Ћd=WoF}T'5{{Z{ 3 Q3X UaaaaaaO#UW[cckc+c'@#H0ҍFc4Ɛ1o\Q;߸ڸ޸ŸӸxO=SCS3SGS'Sajodmn"暘&IX7)LF0M)eZeŴMMGLM?ݦcӦLLWLWM7LwLwMML/u-̍͝#}ͣH 3/471/04k\7+J,3s\m2昙jΚOOϚoXZYښXKK{KK3;K/KKKhDt ւL -D ±-\Ģ-q2:bJf&zN^~Aeyux k[;'k}k]kWk;kcL|`0dH,ڊ­**"lk1՚.nM.n^Z7Z/[oX[oZ?[_[zzZۆzٚ؊mlSUվ/;;;[{}||/ Bg+#3Gcdhx ~_'~~Qo_???hhh?hhh( L - ΀-PmUH@Y`Y`c` ,48&8==X\diA^EAyPmAw0 LpqpUGPPPPPPIhThjBf,!iHb!WZZJ~ UNބ`~Umvn}fZiAsN}eC(<<&;< <)7<5 s09\aIXքaG8p* WEEF&GDDdaE$CqEo$)D#K$YYY%r r?r/r55) VVqYeZDN-k_/)eβl}eΖ]-TvZɲ?ʞ*W%0ڨ vvNyѹQdtNDQvEUQKGQO4 ED".nn=}kkkkk[1 X1vƖ6~]=ݍ{>>[{ƛŻǛGG>qdGǛ'qbq]je\wŭqgŃX|e|C|S|[n>kNZnuSbXHK;M*NĒĚĆĶĮāįK[;k/ʻ'ە*g-),\>Y^]*OKϖ,IEddqsWr\rdr|d$-IYܘ\\HL^J||<5K~E状m* +TU1bdEϊqS+3* VBTޯBQWX+J+, gU UVT*3Y\TrE=+wV>%}2}=~m~+"43&CgftfbfVgEFdԙՙ MÙC'lllllll٢,2;?ʢ l:.Ϯˮ^^Ξ>>Ͼʾ~~Sբ^nUUfVMR5&UVU*VS%WUmSlչ UnVݪ[uaՋUϫVz_9W?19#W+ M!r s*Girɜ;ȥr\mnQnenknDnghl\|^n~bNܫvmUnZ]auհ]KY TϮV=zRui5_6T?eQa|a~w~CWG~F]u~j~r~R~V~N9yT'U`ޟ_Mך5]jhk5gM&\)Ik׬Qf]YsLٚ_k.\Ysv̓5ۚw5k>|RAmCOj{T;]ekZ^-VR+תjuյC$ u]_PKRx08GPKZ*8O_ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-jisx0221.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OW darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/Japanese_Encodings.msgUT ]N1cL1cux XR#G}/֭F+3bGCeE$]HdU$\UY'f.L'kZHZ9}LQ0]"x`t&uliBcUl݄))v>=YwmWw+:x|+sr_Osi¥$eָ*FQ햎|-g{|."VE/]R2ܰ#XEF\၄(zOyߐ̕Ւ`@vgǫ.mxV>2҃zvY6(gy MS=k%nμNl.P\Fvɽ7xg+Mn&]৑EWc+⮳Il!r$D%0Χ"J!RoFz:{B^V1 Aaȗ qUr͜uj s$Tb'm*08cCo̦CS/{8foX `.r^;-k0R2GFe-Fdk\}Wg kSDK 8]0OMl@L,R__-Dzen*)N.CVB4|hmlOš:D2`՛ѱG;D FID70r8@Wġ-U!EPX.\,˝6J7(1ω3`rq>O#.TRc "-&,9H]5 ս^JEr5"ZqY $KG[fngֳ%CnrcnIsW5t]R:}q94c/ݝY C%M3͙p0QD.:VtDQ{q*=0VapґÁ0j#m#6 ڂ}Cw+k{Ew˨3M+=zGD&Wme:aMC9&2=rx2uQߦt0{DN׹6:tDeD@|Y^^G}@WlO]d jXZtwrÂݠ5׬+8j7* Sıq(yЏ_j6S%? mYϮVOz^Ӄ L^g %ݛ>[3\=L,`B^'~oB!)bU=OH3f5 8tYj8/@+tKQ96}=es~}u6WHUMo|W`.Ѯ1͎{Ցy:'BX S,E0~i37j{$#%oWyY)oٻQد}2`ߒWcZT  /·q1){q >f-sO%ㆻ:и "'6Bye5><&˃woT^_?ӛ>/np?bpucwSe0ԞckI=mo݂CK/B~)a ʿn9RZ?j :'?w,"q1qwz磓!k;i/F(kOe2YSv|H?L PK:\PKZ*8Ob __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._Japanese_Encodings.msgUT ]N1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OK darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/euc-kr.encUT ]1cL1cux w="zYkvE zAADo\:W   !=s綿qܟs^sv:׼w:2ދӵw,GN$5I$yK^I $)PI$)$ŒOR"I$NR&I$咔OR!I$TNR%IZ$I& & %LR-I$5LR+I$uMR/ $$+I$I$ 4L(I$M4M,I$-L*I$mM.I$tL)I:'钤knI'鑤gJ$(I$OqI&$ I24ɰ$ÓH22ɨ$I26ɸ$LH21ɤ$LI25ɴ$ӓH23ɬ$I27ɼ$,H0ɧI%YdI/X6o?}~$'o%m\ށ㯜;r9wι#5rܑwrjǝ;;sG9wr('Bs(\8.Qd[E~w8sG 9wsGQrU:Q:8Ԝ;,ɹl;}ǿ&Imr{s\ɱP?rK$?mV!']⼜=uZN+u$x9s ˙cI V?u>%fX8r6+n/'쯹9wTsG;p͹#9^9wT+;͹F;j{XQ;p$r ;.̹^wxs@sGVxd=|[7^{xwxǿw4x뽋p,}9w4|?8zF߁.18NѤ;poM;ǡ;?8sG^Gxh8Ǔ;Zo}v wxh{9X7rhp?8^v;p9w{p?8/x볓pϹCw8sGǷ[;G W w %x/?P P0P(P8P$P4~XxDdTtLl\|BbRrJ -T @fZzFfVvNn^YH~AaQqIiYyEeUuMm]}CcSD"9%5-=#3aWwO@@@ǁAOCC##ccSS33ss  FsGSyyEEeUьhh(͊Fohhhhhhhhhhhhhhh.nў}}EGDFEGDFEGGDGFGEGGDFEG'D'F'E'GDFgDgFgGDGF?....~]]&=#3;?z z0z(z8z$z< F(ŢxQ*JGJTXԌZQ'Fh) |_Pn(J@y|PT* C%RPi T**@U@iP:UPʄAաPMTՅAYPj5@͠-P+-}uB=^Po} B!h$4 &@h*4̈́fA9\hZ}-Aˡ* h5Z C&h35 mC;з.h7 C!0t: CQ 0(8dH4Hb Y 9 y 4t: CKe t]n@@7[mt z=~A'S z^As8fwp^8?\.Ebpq\.erpy\Wip:W͖!8Wk5Zp]#p!n 7pk=w]npw}~pcx<x$< $x2< O3,x6< σ OEbx ^/W+Ujx ^7Vx w=^x>#wQ| 0(8L$L4<,,*:l1؄]؇Oç,|>_/—*3|-[w/M| ߃c ~?_/Wk8FR#yH>=$?R)F EbHqR )A"H2RICґ *DBH&R Dj!:H] a$ HCi4E!͑HKiE!NHg+|Bz# d2 GF #Qhd 2G& Idd 2LGf 3Yld2G d) Y@V"/d- لlFF [mNd9D!#1A0BhE8GDDBdDATDCtD\C|$@N"uw9C#%'2r\C#7_[mWrG ߳!'S yDF^!@s4̓Eh(Z -BKehe h&Z Dkuкh=@hAMfhsmEۡЎh'3vC=Оho@t(:DG1Xt:ND')Tt:Dg9\t].FK t% ]~G7_-Vt݁Dw=^t=D#Qz 0(8J$J4ʼʢʣ** CMBmA]C $z =Af˟Cϣ?Ћ% 3z @Ao]z}>D'S}FX˅RX>,?V+bcŰX 4V+U*bX,bA,ebհX &V b0 cYXk5a&XSkZcmX;=u>:c]X7;}zc}X??6 cCpl6`c Dl6MŦaӱLl6` Ebl [-Vb/5ZKl &l3ۊmvbbl?v;}Ŏc a0bc$Fat<񘀉ɘ阁008v;`?`gsy"v]n`;]w{^<χ Bxa^/erxy^ Wt<Wë5x-6^o7Mx39o[mx;=w?;]x7;{}| >G#18|> Og3|.>_/?%2|% __o7|+ ߎw|?~?G18fC8#8c88S838s8 K+k;)4~?_¯Wku~w{o}?ƟOgsO/DE&RT"GG' BDaQ(F'J%RDi Q(OT **D:AT%D$5D.Q0EDDCјhB4%͉DKњhC%DGљBt%݉DO7чK# b01J FcK#db 1FL'f3Ylb1G' OEbb X-XA$V5ZKb@|El$6-Vb A$%v{>b?q8D&Gcq$ &%0'"#xB DB"dB%4B'bIXCGD8A$N39<#qH\"Wku&qC%߉)xNE ^D d J!d Y,L!d 4Y,G'+*dNfULYC%Ydl@6$MȦd39قlI"ےD~@v&=Ȟd/7هK#ȁ r9I"Gcȱ8r<9![~"9LN! r&9M!r!)\L.!?# r%\M!ג_+r#L~Mn!or'-M!Cay 0I ɒ)21$-&%=y%?ɿKoLP*JRVP+Ujj ZG6P_QMfkj F}CmvP;j:@SG﨣1  pHhXxJDJdJTJtʠbIYM9KyOũI{u:CQ Eu9[wW5:uIݢnSRw=7>zH=SO39"[%7zM%t JtA].BߧtI].C tE]Bt]!:Fפkut΢#t}ݐnD7-t+5݆nK;Ntg ݕN{ҽtݟ@џЃ!Pz8=Icz"=LO3Yz.=O/ҋ%Rz^AW_Ы5Zz=Bwһz>@ч#1aQqi9Z%ZZ};ZuڠcI۴K{OI{}>C@ EwG_? &}MJߡC~B??K5IaRf0Af(3dF3c8f<3La13,f63g0 Ebf Y,g>gV0+Ujf Yl`b62f+`v22̞7c2 s9a2ǘL!1[^bdFc d,fe<&Μ`N2,s9\`.2+u sf2!y}>bOgKoMp.q\AW+qŹ\I4W+˕s\%2WKҹ *B\&Wjr\.W0E\!׈k5Zp-V\מu:q]n\OCכpA`n7 Fp#1n"7Mᦾ7psn!)[->r˸jn [ǭ6p_qM򛹯-Vn vq=^n;q#1 P(8N$NN4NbYù\;Nq3Yw]~.sW5:wnsrw=7>{=sO?39'{ɽ^s >Oy|{|~_/%|)4_/Ǘ+|>A>g|M6_>g߄oʷ[m|;#߅w{ov~ ?(~4?ˏd~ ?Oϖg9\~?_/?%gR~_W5Z~o7-V~ w=^~?G18$O //*:M= $? E_/MCw?KZ%B!O(  %rBy!MH2BP])j uzBٝPh$4 ̈́B Jh+t: ]BK-> €l a0T& F#Qha0V'&Ida0U&Lf3Yla0W' OEbaTX&,V aAJ(l6 [o·.aG/ 1@`(8$ATAt!&%؂#' pFA8'.KepUY&\n7[mWpW'&߅Gc\Kx!^ s1X@,( EĢb1XB,%ˈerbyXQ6+U41]!1S&Vk5ZbXOİ%FbHl,6ɖo*6-Ėb+Vl';Nb]!{>Gb__(?Cġ0q8B)Ljcq8I,N q8K-qH\,.JqN\/n7_[m7Nq[#!xDN<*Q!QqIi9Q%QQ5Q 1&%ڢ#'b\=)T@*(JŤR7R)TF*+KR.eHU2jRuTS%ՖHuz ,)"՗H FRcTj&5ZH-VRkVj'u:I.RWSP%HOi4B)HcDi4Y"MfHs.GePdXFeLeB&eJl2+s2/ (K,+*k.)[-;+{ |J>-|I,_7_-|G+ߓ#DC~*?/+PJ.%*yJ>=%R@)R +EJ1RB)RJ+eJ9RATR*+U4%]P*A%d*ՔJ RKQ*@ +YJD4P*JLiTZ)6J[^tT:)(.JW]T>Tz+}J?2@ z;e2D WF(#Qhe2VLT&))Te2]Tf)9\e2?[~PTY,V()KerseRY|V(k/uzeI٬lQ*۔eK٭Q+;rL9@ ` 0 p H芡ĕIrZ9U)畋rMPn);]r_yWTR_/jB˥RZ__ ih!Pm6BҲkcqxm6QMզk3lm6Wh g2mB[hk/uzmQۤm־ֶh[mvm[ۣiavT;  0 (8M$MM4M -ٚZ\;ԾNi3Yv^Q].iW5vS~hwcT{^iKϭz=O/ԋEbzq^F/+z=MO3z^Mkuz=z֛@o7Mz3Bo[mz;Qwֻ]nzlzOC[@}>XՇH}>Z'}>]gs}X_/՗J}Z_ WF}YZߢoշN[}[ߣA~X?Տ눎꘎NN..몮n1-= ~J?E~Y_o7[m~OM?'3Bҳ0F.#byF>#Q(h2 EF1Q(i2JeF9yQѨdT6iFaT5BFQͨn0j:F]6hh42MF3hm1Flt1݌Fm1>2c1l 1Ìc1k7&c1͘n0fs }[[[[[[[[[":&6>UlSls؎خ؞ؾ؁ءؑwch A18cԛcJLi1=ⱓӱ3s KbcWbWccnng{{{{{3WE쥙L1SfY,b5fIY,c7+*fnfULYìi2a3lh66fKlgv0;fn0{~fcs9d1Hs9c5Ǚ Ds9Ŝf0gs\h.2K̥2s\i2ט_ WFsjn3;̝.sk3w15A2a3q4)6yS0ES2eS3 4-65=ěݙ'Siy2g?10 LX+JZVU*b޷YŭViUު`U*Y*VU YV5UӪeնXuzVUjh5XMfVKjk:XNVg` Y!Pk5iF[cxk5ɚlMZӬ k5ǚkͷX %gRkZk}i6XkeX#wQu܂,B--Ң,b,,ޒ,-ÊYeYYqu:m~Zu+UguݺaݴnY;]uz`=~Y'Svfh^YNy|v~].lv].oW+Ut;îjL]ݮa״kumβ#v}nd7vKnkv'a?{ٽ>v_`ٟ؃!P{=aG٣1X{=ޞ`O'ٓ)T{=Ӟmϱ"{^fna WF{boN[{oڇ}>nGmІlFll&lҦlfllޖlVlgfv6mvl}>ioOgsE}پb_7};o?ڿۏ~a_ 'Iq99NArtZ(-3Je3M+V1P( B@aPx(@3eQ9~IJJ6uFZơ3rg;p$YfsB椬%YKG1=ݙpf:9\g3Y,t9%gRgYtV9k:g![Mfkgpuv;{>gs9r;G1u@ʖA!ʡaɑѝc:9wN8'yGR"W"w"%ȓțȗx/?Q Q0Q(Q8Q$Q4~XxDdTtLl\|BbRrJ"-HTMDfZzFfVvNn^HYH~AaQqIiYVEeUuMm]}CcSDDDDDDDć^މ>}'$&%>I Np8Wk sչu9yp^:NvS7sy|n[}-wKn[ޭVt+*nfUݠʖtݚn-[ǭs7fm6rMܦn3mr[mܶn;‘pppppppppppppppppppp.ný½}?  ^^4(8$YxixYxy5/Nngt{>n_tCHw;uǻ%Nt')Tw;ݝtg9\w;].t?uKܥ2w]-]q׺_+w~nqwq{=I>=}FYM[#GJ>&}ll#ecʦ)_lIٚ-囔);Rv|+ewʞ)RL9r8Hw)Gm)X B)T ¤)\ ")R)zK1S;qsn]ȅ]E]]%]ʥ]e]]ɕ]\Ͷ:rMrmq]sO߻ܳ9{ѽ^vWku{ӽfwܻ=}>rOܧ3}r_ /r{)^{BPPڡ`~y(W(%T4T"T!T&T5 5 u ꅪZ*P(86TT.T:T*T$T8T9T%ejj¡PPPPPPPPPPPPPΡ.^AW+yŽ^)W+*xJ^eU^yսojy:^]xa/ˋx^Ck5yͽ^Kkgw:z.^Wz{}^?7} züo7y DoRdKdkd[z7#r r0r(r8=#3mdWdwdOdod_dčl|Y#G"E"x*BG,4,r&GOӛMzӼ o7˛z ާ"o[-{{+*lxk/uzomx[m7vox{}~@Aw;}yǽz{z{GzG{y'x'yxygc2\YIZj1WkL.DְY#Ff5&klָY&fMʚ5%kjִY3ffʚ5'knּY   <<<1x!x1x)SrJj/[_wÂÃ##ccSbzB@JI!^3=˳=s=w;}N{g9w]~.{Wٺٻ]nx7[ޯ]w{=~y'S{Ζ~ST? "~Q_/Ke~9_W~0p+W﹪ ju?s \ 56W\Yrgdfʛ/뽬Y f*U$hYŲg*U*tVYgU~<<<<<.x4x,x< A( ĂxY9yOKf-I[,my~k:~=?go7~w;]~wǛ=^~o?Cp?$?şOgdgs<_/K2_Wk:o7m@;=t>:]@7; |z}@??10 >C0`80 Fc8`<0L&S4`:0 fs<`>X| ,Kπ2`99X Vk:`= l6_[6?Ol8E_e_U_um= ?b%'ſ_7-ǿ#?/+`8#wQp 0(8@$@4,< " 2*:`1,< $=p 8 ~"p \?׀ &p ߀!;x <~"玧SyyEE%%eUiovOgīCxxxxxxx8dzxxxxxxxxxxlV6vN]]=={{?~j%RKJ͕Z:LjrS+VLZ9JjZjzjFj`j(53Zj5SkNZ7^G*NJOm+ajƩMR6Km"ej֩mRۦKm!cjR;vI-{jԞ1q )iY9O3oVoKmSLAJ I]g_:ZkR HJRT H2L 9@.(b(*J4P 3Yp \ 4@#\-ZV@@ .0& X+ (8@$@7-6p ~}Zox</Wk x|>W;Capp8ǂp"8N3,p68 .%2p9\ WFpnNpAx>>^ZV^[oo勺P=\ߨYYWo`0a\ʆU k5oްaWÞ 7i`5| 1 I i Y †mA`n4Xoyۆw ((*(G+)')g)g+*+(+*+JItl݀nB.t =@@O ^B? }h+ ~A`x(< #ã7x,<O')Tx:< ςgs;^/K2x9^tS+$e2W,P*˕JeVyFyVyNyYyEyMP) JRlT6)JGiTU +%||SPRVSMPMTMSMWTRV-P-T-R-UTWmPmRmVmQVQWVTlIQThU*^JQeU9~? 5?a ?/d2 Fh4@M&Tk5IdM&M54g4g55 Mƨh46 5Pۚǚg5j׸qYFvc#ѳѫѧ(jLjjnxQܨkli4Dƻ5>ne74Mj4ifӬM4-mZִiMڦM0d8b@F"oXd2LD&!)Td2Df!9uC## "d1Y,C#+*d5ـlD6![mvd/ Ar9E! {qBN"qA\.x"ވ#H ԴiOӾM5o:jrl55y4y6y5i:trզkM&UIdk& iO>+~u\puuuiĆ@Ug/7_i֬hknlnj6/_5mG/@pvvvvvvvvvvvvvvvvvvunZOV ҆hôxmVmjZ[kڴ>>>׾Ծ~o!iyݺ:\t;].BKХ2].H'ItѺx].]ty|BWSuz]CgYtVM Ct}m2Ůer--[vm9rXˉFCcS ok[[R[Z[2[r[.\i֢hQ[-֖Kˍ- t5]n@7t+ ݉F z=E;2P&B٨=:NI.+EPwDPo4Ah0ah8Q Fh ơM@4MG3L49hn!cZǶo:u^[7nlܺu{֝[j=zjulzZZs[Z/*Z[[;[{Z-p+nK?@?Ho________߬߭ߣߧ߯????git}>Gןҗ<4-@bZhZF=CϣѿKe z{wGP%F5h#ڄ^GmCQڍFԄ^Ԇ(B("xP%Q Bow{}}>EK}G?(~W+ggJJ7z}Sߣ#zBCGAQIEmHжm#ƵMj[ضmw#mXm666a[R[r[Z[f[V[vMVVVVVVvM٦mۈmwڞm}@Ǵk>}vog;;;s=۽}ow †`ð6b Dl26Mf`39X\-cK l[c&l+ۅ`{}AvwŎaDZcb,c#愝Ĝ1悹b\ayaޘ1 1va{@{h{X{D].mOjOkmk/hW_nۑvjQ'/;vu1cfǬ;t8`w8uPv;l@܁ws{'vw; ;OuwaWC0|8>Gc8|<>O'Sǧ |&> B|_/ŗJ|_ F|Sꮵ]wbu8]].QWPWh+KڕؕܕՕ%*:Uub.EW]WcWSWsNݮ]wzM׻O]_o]߻tu={bӺgu/^Խ{Yna;;;;;[ڝ֝՝}f~U_zz,Yٳߌo|' ߃!0~?Ï'pY8sĝ3]pW{>8~@\x ŸģX< x2x\</x!^%x)^x%~«{lsǷ#{$=1=I=zz==o{|qqqqqqqqqqqqqqqat0:Fft7zF1f0cQjL23q8D&Gc`H8' g•n;Axބ鋉6015ۙG''טך4o0o2o70675703lhv24;9f,4f9o̩4s9Ӝe6f|\j.3+gg:h֛Nl1[63h7w͏/-,-C,v/! BD!D(FD$ED!%D"H&RT"9yD>Q@ED1q(!J2 *DQM,q8O\ "Z2qJ\#DQO4JBE H4׉fBKmD;At&z#a"̖q񖉖ɖ)YٖyUՖ͖ݖÖ#GK%"D[b-IdK%ݒaɴXr-ySjKEoiX,r:::::::::ͺҺʲVeV5ޚeͶZrki5X{fk#z> @"#p H"nw{}xDC<%/W~ow{J|#?/r9J##ȑ(r49KN_BN%Lr69K''r)\N W5Zr'@n$7[mVJZoZoYXZX>>~zzG;wRe{Oz{yn^^ioZoy BH/{fޗM7o~ߞ}G8}.}n}}}1}U}>qӾѶ1qIYٶmKlKml+m6۶ض;ȝ.rG'ȣqA2IiO:'Ig҅t%NzW?wޤKI)$@RDdNF2"2#I)@&d2L#3L2&edOdYLdYNVi!ϐ"yB^m9ڜl6i lB[Mb+UتlglmWll [dfYm =v`40LfR`%/  S@ PT% zπ[ @߀ NBp)\ n ud=@H5!&:LjROdI.4fJ}$HB$L$F$I o;]y|HM>"O %|C##ߓOg I_oO5D Rè5IFScߨ8j5r@z(@00t0`!x ,πg"@|>_/G3@hdC,hZ VCkfr8Bat(: ]Pz=Aow{#UzxNMPSLj65Kͧ~P Ebj ZIAPkuԟFjj+AvQ=^ju:HRǨ A1){ʁr\).ţ(~MRʏRT DS!TNEP**D*JR4*ʠ2)#0 v9',PX R8_/ na [aF` a߅+ ~A kzd3ٍA!qBx ^!HA"ˈQ! iAH'r|A#qJt]nGw=aGQTUHQ)*ʨJj3Yoo&hBBϠPBգh'څZP+ڇ }Eߡ/l 6`aIl6c2l%یma۱~I$, LbXV.cWkXֈi1=փ1 f`{^aow ~{xG1x<')xy) nagK- vhb1Jl'vq$p!x''?HbBBDDNdYD6!'.J@M6qxL#ߒj5OMSyRjZE6P~ubQlʑ:I9Sʅ(OS"*SJl*STuf`Fh3o%ONp5p 25 <3ݞr;uHsVlA 9xx#-hyfHNK?1^fN~/!eQcbON N ()f:U >>*=.Qv3\v|o?$`L4&QRUp}ʾaO!YthwI=crwm{V^Q"I$#4BJMvL^'gfU}ϬQw&^BCK.FfDq)ŗJrxMԡw7{iPE 7nz\Zt #wksrXcbI ;/T=>Ͼ(\h\ nsu^W|^ t&ge-=. WHHcd>llQlUu4:gzsq.CXsXa{!9^Q"AUAXN\+(܌EIz@Z49iWAd7W~rrluas}x={J૒`o 2;]=;u ;_?k7$#Q O% N:\OʏԷ醬Y?J~7j':',ݝ[g_aB)^UsHH<knOz->qܧ\*Es^K Fz[mvzE{}!~@rG}>,Gx18}fLE]IH;'i4vm=q2#u#c :S4$O@R`SWoHee+GJrG'Z|q9a07$(D'y/-}Ov̜ZDƓgGY.Kxcx*}FhfjKe5͞kp6py1qN$qxA(7lN5׵|"#(6q`hK~aB~Мx>J$COQ:/KnĚS#h܃x!ɝ)=1en.aȸ#s.\F'gl"/yA3CoFܓz *I ;gfc eҁl6ok򍬹~S¿C2Snc<Τd7alU0>>^4%D,ٛ?:u콓o 3fy%uޕ5e5i)0*tv̊ﲽ^r! ŽB^,/(>nj>ht%O !aM1,`hٺ!_k$ѹ13!552scߒ%b(3)=?tiwtonW[$" Ut4<< =<ABFnNؔ>'{sc|cОбbOK ?JnӃj {xNJ3Ѥ=v=]y~CXx|K~ Qxr0q*-;^M΂ ҿO[g$WKW9L~V6%zel_ܼ"_qh} iǚV=wyUY'\ /o_!+B}jVOV0@6Y:k#bg]} .WVzrwEhb"留f_.f`[Vѩ!Qҗe5M싎cKk#; SueW}Jaֳﻘwx9F@pp/QS YT$|%=X}%0QT NK}H/"xkĊ Kom( Yp0eN܎%^57Xsg"#3d%IoJ#\+y;ݎy[.=xԈ̜ >y|5{^uJ2g匳wsp|lFtkNŗ$LlLO+xQJW:m+ݢ!W#G~ŬLY/Pƾ0W*|}zk+eRCQ޻;:A0/ǿ*+(t59)eE&lFlyT_j13Q}ǧ/$x_$[ҭY>(XVx4>)L8+`d. }K^~9.Zr}ISoI,"[Y8eK'/eL-l wp#+\ /Xu֎15-qݣs[zPdc[b^.g>g- 84>86DX"y֝9I̱,a[qoLLArLIó3 lX5o%#o ﭏ vN"aEAߋЪ17t!\V \ ^E #QKA7-ߕ1NLٝRzE68L?y-gwJgYa0e'K/ q{ҙ)\C[ڏoVt|¾jc2arK{K};/T 7HFO.!bnħJ&]Lޙܕ_挬g2](pz{m'"~n&!.tr[D]\|WhSr #qA023Ys4ۜ.ޮ/_yC޻#W>}Ɖ*DTc{.* OHdX2ٹwu+T&r0)W@RWVU][~1;"|<56}ZV fĞtɩݼegܻ< ^;#Tx\{e8NfZ%=%<<\2WI|sӻ_{:y$O 7_S'ゥR21Jx&});{?.L*(/wDbJo%8%^NM֤lɘR&{$.*Y[eACֆ= -.VG.u7^'-*kMJ7T̑lJt9J/e*J+3pNtn(# q S=깗R8?$!0;hCG?q'Jݝ!G-),S>{tC"p%nbLa3ޘΘఞu8(5ԝ0F> < mՂ~~"fE5јv* . dNXWcKyaiqhS'gdC8y\vR .3]g2#Qjyt0sldtXe-ls(nQ2.tdFJaQzS4Qa;.=Җz5glvRcn<[~χ^} ^T8رQ560O +;m]q#ݛeS?9>^xXԘՋ;ݦxA y) eҼ}J #xfÃ}e'M֤XKKH鐔'i!iO(fMpsyO X F I11P:.QFg痢9ŅR:b|}1j*N֊C{%X8k<a#dd_S_O6D]bg0.t"D')tjȍN7LSHRΨFgYt6/Z|#F0Ρs%brBG/a55))(WIkfH;B_pWknZ0Z!'m'VatK׋HK,#n)d *>L˦nsx(x/ R~7c}= Hs" -X>q9ie;tǛ:سyO |D!P(La'ʹ]ZW;wL?"hk51?rn䌑AZ2924 /)*{5IhL#\iYA>W+ˤ_$OKvJ=^Gx[$WlQ@Dk.SDn@" n[YO4g*R['ns;MN-I ΰ_b_ېp(=i@r(ݕ&;9g܅'U{% '^Tb":vܵ^{Kr{KJV&EnN,>U|a3٬HrC{n&-΍(aRr҉ .!KK>'=kxB`X"NMw+-)[k0Yi{CCϻvv{.A%8B g Fe+3 :$ؽĻO0UT<#frI[V!i*YmϔOkKZG#]r|9|I[dZ쉸'v&OYۛ0ߣ$>f,KOp8.<;mk;Dv!0xddw<.'.ΔP .YphWQqV~+w-c?{wyKolo\4^9T_^6t~=Fǒ8vVvsimHAOa@vhwPgгsBFGlFgǎƷKSͭ)\UxFVrr$@`ી-R?B&= _.5dky%eB2ӿe\9:*AJUOP 狊l_*p~͡u⨡a<'ec宵ֹ;X3$!>2}jEc*3ƚtC7TT_Cq$ϴˮPJiVkWٴrWّ?XoOpV oJeٖS< ChReM`eբ~DKE+xޢ^ӥ}ߐY2Z\{=_ڹ gm_+φi~v ^BmLcnŒΉHv0naq䴺Hv׬=SC[y gc ljl]$^g:r$7)#mRѿ&a}nMpC[?=Z%z8op`-i V22r:u]W"6+!ӏ)UaW<) uJ\Y-ic/~Uk¾*&+U Wg!}9Z3nZZ]"z=4a,[%j~5U=/P|Lg'eKWG+}&䘳ݓLz9EH89;U 1bt"/4$L-v"Dc|RZgZmgm/5GGwp88cCU{qv,fjp_]Yeu| xm# ze9 AtMp ܲ|I2d}ړڇ|j=~.hB y[+[L^(yO!24dj]qYxm#I\t/Э.۠FBXYZwwA#DZ1y$j :-ru/ƹ']ҍ^T*ZqngU'a>^DQNfdy{ehfob?҉+t՛dx L-ә\FpBktV/T*_+hap>N?|nMPKPKZ*8OV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._euc-kr.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0P darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-15.encUT ]1cL1cux eoV`pZ0(ppwww[m`l{ɹ_|yZ<,8x|A$C\$$?$$%IAJR4% d$BV$C^$B!?h% %R e)Gy*PJT UFujNMjQ:%zԧ4iBSќLKZњ6@G:љ_¯tAOzћ>@1! eHF11eD&1)LeәLf19eYB%,eYJV9l8\֊٬c=7-leb<OnOA~pCa/pc'9E9Yq \U׹Mnÿ?yC'<yK^7@4gPK̿Ž0PKZ*8O[ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-15.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OV darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-euc-jp-jisx0221.encUT ]1cL1cux u|ZENnK!@ kB !H}:]gީ\9ss{^7]IdAWŷ?> I>h2h\6߬ScT'DJT/~RI'5Ij,yRIZ'Ij.}RI:'uI-{RI)I~HJM'oRI& J4$ L]4iBĤII$q4=iF̤YI$M4?iA$( NB$, O"'QҒI$zRz#Jb'qI$~ I$J'II$y"IJR'e&e%irI$}Rn!ɘdJ2'YI_ߒ~?c sbu- ʿ]y^_s4se[" a^&a>ai@<'|[?Js`qZװY7bε{]܃86Ew ~-48=kao_ ZhF}J-46AZhkq ϠB7ͬo4&#m] hҹZh#kQT Whwcxm'wZhTB7Zj-BCS h5Zhsj/W5ڐjoV s-4sh7ZhF{ѡY-48}kW 4jݍz]:lo< ?^>]pV?֞vߺwb﷋.1MIH>ibjlt/Z7ȵ-jo_ _-4}Zhi?7X^j[ aD-4 kP-4|wZhHjq}~wѷf[}kaշf[jaկf[kaտf[ka5f[ja5f[ka5f[ja5f[~cp-̶lkp-̶lkH-̶l X 0Z 0V a0V 0Ӈl뿽G$  @jc h4Z-V@k h:N@g tz= }~@`0  0 F#Qh` 0&Id` 0Lf3Yl`0 /O„(!NH҄,!O(ʄ*Nd&Dv"'MDn0&L s’&l {‘p&\ w“Kx?H'D(NDDa(Q(IDi,QHT&Չ-x*@@:@<! Ā2@(%@&hl :@3`  7/@@@@NI9)9=A+J`Kb "1)q?1 ~jmzH^$LKv f=R{tѱG]  6`#6`) l[&6]S8.n)qJl1 X,MM=z]7DөGR.N]9uS]=ƃz,[k5AJ㔼o3ŕ?}Rkzy1H!o=RjR'~ 7KS:LL22e@uߞzսe=z lϧHHLJNIMKOtHto3!C##cc&%'f$f&f%f'$&%'$&@hK rHKP=NLp8BaQq R4 @:2@&@6 P@1( P @5 f0ԃ4& Z@+ht. z< @? X0`!X.KerG'p\׀kuzpn?[_mvp{}~x<Gcqx<πgsyx^Wkuxw{}|>O??gs|߀ow(XD,&c8XF,'V+Ujb qq1q)qq9GOĕ|777&n%BFNAIEMCxxxxxxxԂԒԊԚԆԖD #'u u$u"u&u!u%u#u' $z~ z? $ % # ' $QѤ1q Iɤ)iY٤9y$uRH&KRGNH%SN>WSH7utԮ`jjiP%]:16ۙߗ.ֺ*]U[/Ip1/QA?g*}kYTx5_~dNɑxp275}4b:ِsۜ)j-C k3 -k-/|:JĈJM}/ J$28י_9gwݡf-}3(Ƌe?o3'i-r|QN@!ɻz:U?W*E97JiӠhd~ .kߥle,Q I1FF/;jJG8_N3&jC MͣJz_U&3&u){9yN!3M*ܥHצB}KI_G%;߶ϟV5YAbEeBIܭ Ox.Ggox;9L'‹ll"!y>V]9W\)*_؜)o(01N0y]$u+ lJ\~A^K ];й;[poPYK ~-w'>'%丂NQ3s6h;'Yliyje{ir\́w1ZRT-Y/uvƐ0e^[\iql_iRr) &,Je>ѐqa5aY'ㄿ KNH,P~H^a s|cn8!@:ZzYȎXP^Ĩ iiٶρ]5Ed"e,2sէG<$R̈́-1u֜T!*(g::SK'7HXw2gff9Rc(Web>Sޚ)Akrg@k۲Щ]\=XKtOG] \꽱2T$*0 %nC"!j`|O洺'YxoiY?E&{pn\Šob_:icRJy\t:^ofؽUUlw7tC i? >1X}xc3Ui-yP[ptH5T M9ICAbN'Y('=,G# 6둎H;t.j7OnInFSQAfd03gg\r/]$/#.z+VJzJ Rys;eh_o ;.̷\9fN.R,nYY['7]W |l{#Sےs|zx\PJ h{9QsQ=XF{%8bT#1J uƣϊ:(MEX? ?#k1@>Fcw26ŒlULKƞ6A) Y@ ߾pX&#6Yp1:-֟6No!ohF[R fbI6⿌nS%hY4ьۼwuGAsHezu0!Rgfq | ;Qqm/S+wGsZ׈VKExlהiiOЏ U5+p)\/-|"&E왆}%:7XD`yHFdʇ'( 2>q iI9sٛ؇;~wH1ljLfdtAhC~PGh<~4O;KXY mF1|leMH&KqЌ[s.M9̰p2ͺvk#"v8Z at&>]k&jͷ*t*24kV ɇ_ǙE5.e 0{OZWQ7Km[Z}uMEEWUX[-mzl%~ #Jი{?O((C%=?313[2;ܬ;gyA^T_D4H[%Kde#>UC-kBV,a ;,c1ewg/&=0!@d[e"kqXej5AT4eROFN2RXc8\qrf6woDHJ}[LTzf%NQm/%9߅Ox>CD%ϥ\+pv}w2q߹޳ʿ*0.:\aD's 4 JSjLi(/ "ҞQwQ䵤h뮛h/}_@QDk0B^l'kp8c\h^hh\S (b J.w.tO9:v7yy$%#ǔ3,("?gE tchW_%ׂ5*&6@cqZZ=wDH)kό/L,;NJiiGؓkE1]vt!dwEFGɦrv,l:e?PH SckT]hQƾ- ~x'Pᛲ;3bc g9m#rk~KqWJisc^]O}iʇ!>UVV>M3yb<~UO0Pff}3-:94t0z8KZڪHL{Qroe9xsyjaD~QqRI.7jb9aۗVwFlqVuYc9N_oh Ռ7j˟E*+{){g HYe:9 $@ Xg 睿-|{V9̶J wPS }@q]"*9x:^HTiFz;G,\|T\,I+Fn+Y3M a_ߟݞGQlhX=f2*]eoY:^ vNЦlv#Agb?0gϴ}ܟTrOKSjfXw/F¿b MgߩD>E.1Nnӊ^#:)dSKEJ˨bdNJ6IƊKsYo97 ΋Xxk*C,:5}}7YEY|Vr-r௅0rҁx{ΤlЈ"#b<⁶]a4Iz'}\~TzEqTK*VUb G>~]<@:|^kUV TvOkř7ao<9cGz@RJOaTqmdv}ai[ !tW˟q^A`˯gwֽlw}ꞋyX.x5sZqFһhGEOSp7`!y i7u8!b < Q?v?Xβpqk*2=*{v] FEbCZclgm_ݐΓ^Q6Vm*5{ߑ3("Yq|¥̱}Qy;|B {bTe DNR97֏ܜ)C9r\{3ѓ{\v~x i_9UUPKϕ cy5VJx( AkPO$㹰LP_kb~TG31mirYgs;ǖVRkr82ːR磿`3vpdo2Lp^(%.ި:^(cK3qs#^Ys͓,ojHijمLp0lKTq6I^j+e陝`zGN"۞_4,pDAG}9PTZ" HʚwPMP[?4M&CӠ49!OPMT @%h3: Bo-tz7af0 `Ka,3(߆OW9|~?D:!}6H$ w!=~@iC#D $ICH.bGلC#eyG#І(CۢmNhOt:G'SP ]Q*Ee δ+ha4%h ].AWft# ݀F< }DBa$1kcX f` #c2,b٘ `X1Vea>,^ [va?cSo->v{}>1xSow{Cp| >τseKqn:|?`n}z?ǟOdy"y y yyy0y+"Zr&gLr!Dud79B#!/!o#/'!$% &'/#!"_!?$?4!%?'?#"ߣL) ()LLJJCNɠQbX)j:⢬x)+((())7((Pާ||ML!YFJ6&M&HHiҊi֥mMے?mWھi{ӎN;v!i@ZJ6666vvB)T*\QQ7SQWQ7PPS/RS/Q/S:Һ44m>-S& 4m;vvvv* !6#3 +Gz*} }}} }&:. )O+K[76ݐf[۱ǰ!6NcSt6dglɶl;eR" Z.eg+Mfvӓt4 t 4srd=͙ǙYssiGΡscSqs*81NSϹƹù~9sۖ[ pr>qܞϜWܦfIܾ>y ܁܉ilKҹ\97 Y\67s2ns˹n{{{{{{{f>~&__x!) 3'?o0 MA<c8< s<+Wċ.\bos3"($8o?w߄߇_߀O/t?ķWu0ϯ̗=cwvzւނQ®@- aAH\R\\->,~,t̒L, @͒/KlIXVR,TH\uϒEUJ6\H{KJHNI.JK.IGI[II$;ҾN^ҞRT/eJsr)Yjc9҉Rr,i!I7IIJ^f<ޔ$,JI+%-[':҄tY#Y+>Y/Yk YF6J+-2ll,Eܲ%x^{N~6f-9m*5yd*ʻGnǖ>ϖOϕ#r,grW RTUU[5IK%W PT UUUTUBU5FTR~Q]PVWTmR]T]RUUU5ꖙ T>'^^N'[ޫFuڡjZvj:EeUK?Wԯ3f6VlIl9:'kf`ah&?,0s}527g˼y"fլ_dufQ|Y,^ւ,EV8s;$kE߲֚g:u,b;Yf=+KǬff ӌLLL49ƩqhBMLDff=<}v.f/;5{R6 W_ɦf˲%ٙٹlS1h;f?~}+gINuNja9r(9s99iNf?G˱TsZ#"k5f Y+1q6ȆPFll&Imb[i˳l>۪mUrRz&v:V۶,!aq%E]#Szv}}}}vgس{]g7-vmϳ{"{}-_?_ߴ__v4rtvsr q̏;f9&9pjrBȑp9|p:9JKlGccg6n^~1)9UQ5mc'g7'YYY9999IwҜt')p)wvf9\Y,tv8w:8:;o;;:8?\DgG-W= WCUHW;0PXj]\5%+.gWKZV޺[pv}u]W܍]\]w\M)1zn{'vrZtKݳj=}sowq_urt_susv_v/t'o==<==m=m_i>G|٧9}q_o̷W[շwwwwww_O77OwgG9~_~_VERbJ5M_{77o@@@@@@j`T`js23,D?K^  \o_?Sn~{? R~ |(n~Z>#?=_Ws-`~(0(?__\Hܠ1 ` X `)kpmpUpwpSpsp]pkhp_A~ZkSsnA  ZO)hW .Pdd8 )QpZ傓 N^G_B B ni!04"4/4;47 !A(!]H2!orCPQ(*Vք66N>} 7 w w ww7  O O / CajaA2\^^^%|-0|/{E~iiiii#H`fI-ŠH"."8##b"H8">1s^oNzNUctX΋EiQ~TFh~uFDWGGWEn^ގލ^~}W-(lS8maBV!pfBA’Ʌ XaQaEaz텿>-j^hFࢎE)Ez+Y4Y)2Ҋ6)Z[T\roEO]):PtlѢŝ.&/nQ-XְUYe=˺u+Ge&M+[6 )_ae (eҲek֕*]vfٕseʞ*{]C9yyݲ{.Y>|JIrj9W.,Kw-?S~B[/To_/\QCE)*R+TWѿbpŐa3*W + VSQT᪈V*5*VTl[qb{3*WܯWbq+^Ul[٦ae&*TlTI\ٹ2ʞ`a*'UWr*ŕǕVjXՠ*bUUW^5mUU&UͪSQŪTUHJSVRWʫUTuj_ΪmU;W_uBՇGUϪ^T}Tݹ[PmvTՅ%+U^V>]}lշoVߩ~XEw?VR~M/5mkz T3!k5nF\k45ʚE!#zUVJ#:W׹^`%~7 V+u=Se=> J$qu6?]x!$'" n &!I$R]R=R}RRCR#RcRR3R9KFIdFh$:) 1I,8LhHz' KJ\!`?E{Z/ }C cSs M߀}^ PpH! pЈ 8N ߵ !Ѓp 8 N@B`B_(XDxtlLp8\.L&C`p  L!o넫K&!# DiPx''4$4O'΄ք] ݓܓ <^ g !#$&#L"L !^o;-<%,"Pt d6AH3AIH" 5AJBAFL_AO03T"Au&P+;  CC  MB3 CLI )i!d vt]@w{ z}A DnpGx0<hx,<Os|xd8 l``= `#lvnCp.b8p5\o;]nxGc $| >ow{K5 '! $>i4CZ H3tCR>`D!Ñd*2 B! A *BG!|DD2,d<@\CH #)BRT"H Y,AV! vdً@"Gi,r\An 7=y /tsq>.܊p/Cx^Ub| _7[_m|7?K5&~ ?[;{낱a0ZtCaR\=E)VнpWj!(6(JR,(ʁr(*QqTEPPPQkQPQP[QQ{QPQU3}sK'/ott]tCttSt tKt+tGPt1zf!!ca`F`d9Fqb\/& b4&aff5f f-f=ff#f+f;f74 ,"<&6!1 )3P4-@G ``0 R` 0(f@%@X@ dP*@=` Ā$2@y,j` jpwc x>/O[xmm-ǎ`bgcacbaX eb9X.V5b-X+ֆ`X֏ bC6av)vv9vv-v+v8({[} !9={:'?nn$nn,77W-p GQp4'p©q:gpA\$[[ۈۄیۂێۍۇ;;;;Ɲ]_ _/Wgx2g9x^ x3>a|gy| _??_??ǿ$!%4!t&#t%t'$!AN000PI.ALLl'M„($!AXCXK@HLJFMG8@8L8B8O@FNAIEOxCxG@IlAL,""# &%# "!qDI>G>K!_"_&_%גo_PQQSPZQRzPzRPRQSQRQFPFQQS&QJ)S)(3( |" (T ¤p((Zb)>J$(YJrrRM9M9KHDLBJKy@1%=3 ?u8u,:ZAEMG]LEQ1TJҨjZva*Hqj˩++k[[Gǩ3ԳUj-&]Gԏ/ԟzƴf6vNδ"Z_P(hZ1m>>^IG1tO3>/+f|JzfVA!~$4_˿ƿͿ)'/h$h,h*h-h#h+,.(    & f  *V@P@ H*I`.AR 傿kk[{{<<||666v ' '   +(!NHH(*jV.[1a\YaAEMCxTxRx^xAxQxIxYxUxMxKx[x_DLBRZ^A@XLJZV^M4@4P4H&YDD,G$IEF]"H%DIQJNAC[WtPT%:.Ո.+z$z&z#z+ $!#n .''gųijs ŋŕ%b$1YL3\Bl!1,NW77ćGħ3 +kWwOIII3I IKI'II7Iw`H(Xx$dpBbId$x IB$t W"$fCx%IPD%$ IFR,lllTKHnIJJIJ>JJ~H~JHJIK[J;K{KIGJI'HKeY9ҹR-%IR%JRT-5KmR-I҄4)MI zVn%UiH[6T6\6R6J6Zl\6SV!#+[$2(#˨2L'\2,(d"[*[.,"&.']]ݔݒݖ}ב777ww)/O%/ɗr/'r!r\"5r 7-r'rX77ɷwɏOOk7?ȿɿ))(*++Z*)+(*}cŊIREbbRQ`$YAQPlGSBX!QNaTX6CRaET+⊤"*bbbbbbbbbb⠢JqBqRqZqVqNqAqYqEqMqSqG@?c3GgW7wOoee]eece3e[e7ewe `P0pH(herL9C9SY\TJd+9JR)JR*mJҭ(}ʈ22L+3ʬ\\[JFVN^IYUMSW_YVVS^T^QPR|||||jj*QTYEJ"(*Jt*ʠ2L*ʦr*H⪴*ZZڡڧRVQWTSը.n^^ިީ[[۩۫;;{{ǨǪKՓserl\5ZSSL5K-RLT.uPRՈ:Ω ++իԫkG'ԧg5wO:FfVvΚnAqbxMT3E\3S3G3_@PSh QCP4T ]p4|P#5 Rט4VSԄ41M\d4rj:&fVN!1i%eM滶vvvX;A[.VjZiZkZ֬k#ژ6]iڂvvvvvvvvvJ{J[==^^jij>>>׾kkk++Mҕfu3ustsu uu(VGuO'u:Agԙu]P`]L%t)6vNugttWuttwtwuu^^~[;}C#?%r}~~qzzEz^7zޥw>1}^T~~~~~FIaaaaaaaaaa000PaX`@mAbi†4$ !oXjXi`lbfiego8`8h8j8a61\5\3\742cxjxnxo`hbjfaekgol`ldljlnlalelmjnm8888888XbhicD+K8#H0$#H32#(2Rܨ3&1F1c޸ԸʸŸ˸۸ϸxXeWtE\+ʹ 宕ծ]ݮ=C*Q)YWk?'owwwCwKw+ww[w;wwWwww{{{ODdw{/Lw{X7MrS47p3<-qjƭwܠ;N3{{{{{{{{{{{{}}}}}}]iiiiiiii) x&z&{J=S<OD='IzR'Y۳ڳѳɳճsS9xj=<7=<=c>OST>3L>/be}RJN.nU_?'WOoCck[;G?_/+ K?~g9~_u~7-~w? ҟk'3K+Zu=K[G'@@@@@@QWY`x`T`B`r@Y`F<030+PX@prm@0[pP l ( KS *ABAfyAQPTACt=@0p0D`mfNAieMm}csKWwn~i]s{⅄!q!o(P<BKCBCBCB;CC{CCC'B'CBա3ХPmzfaQIem@]}CgnAaQymCSwOo_x@x`xtxlx|xBpI4<-<=<7r1r9r%R_aiu]cS{W^AIEK{tPtptdtHtXtxtlt\tBtj,:#:/J(;ʉ Ҩ2h h<(]]]]=======FGoDoFoGDEE/G?E_DDF?DEu`Cl ;`,{}~@p08 ǁ ` 8 e`8 \.AH JPAh t~0 82pn7[6p; UQx^7[]!|>_- ~?:P]j5B͠Puz@=~Ph4FAcbh<'TM&CSi_P4@Bh1p"AT ąx@RH! t2B&y!BP$ RhZ Cm.hBUat:NBj,t:@+P-t݄nCw{}?z ^Cow7\7[mpG.{}@x0<  x<^/+a4 Xa&̂90"XKa&[al!8CpN+Ux= k#q|>gsy | ߅'W3ĚĚZZZ:::zFFF&ŦJceج؜ؼ:c-ƈqc(&Ib<0j㺸9{x(x!,*6>!#+/~0^?____ߌߊ߉ߍߋߏ??NL%&'H H KNMLH(ILLLN&'*&$ ZBP& cœ$l {‘p&| 0HdD!"2*6)9=/q&q-q#q+q'q7q/,&.-Y/Y?04-=3'7/9(9:969=Y\\D'$6O$'O:Ij)iIZdďAH 9$BV#k d+ ٍA#CHr9T#5E:rC!O |E!?:zٶN.ٮn٢lllqv|vB4;=[-....ɢ,6KȒ,%,1+r4+Ϫ!8>95~[;;{{yCޘyGޙw=p>OSy$ϯȯooooo̟WkO/o_ M m m  ] }  C C # c  %ɅBYaF0PQXR@0- - )H * B-+$ BwaPKWƑgPKZ*8Oa __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-euc-jp-jisx0221.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O0K darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/koi8-r.encUT ]1cL1cux E`pw .0n ,X `ˎ\ |N@'_:tWֻ]Օnt''Mҏ ` 2`$2L`"Letf0Y092yg YbedYZֱ ldVd^9Qq9Yq \Uu:MnmlyC'<yK^t_z-]JgEɻdZr׼-x>I}ϪwC 5+/ߗ_ɯ K%ÒaɰdX2, K%ÒaɰdX2KK%ǒcɱXcC<5;=bCPl( ņbCQ(v;&c/bۉ=ŶbS=n(6DqOQPFqCMPPPAdMFq7qqKq;qOq[i PKTe0PKZ*8OV __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._koi8-r.encUT ]1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OGR darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-jdk117.encUT ]1cL1cux ty&|'ViLbee ,vN;0cpR_̷ݳw3s~>:*z$^Og "z#:ttaZGu u!>!1 )9%5 -=#3 +;R  󷣄 aQ      YYC$AC0,C")!B! ‚!ƒ!"!"! !!b!buۿXPBA? PBA? PBA? PBA? vℸ n ~H aHRBb8$)$!JH d YH$!5w/ _W_iS_ y0{RԮ%آt-jRzu,TԵlځ  F@c h4Z-V` ~{[1 v/=EÊ,%Kz`!Xl ]w%gKΔ+9ZdQɖ%{KZ,Waqb_U._ާoڞ{^,.(.d/պnqbf1XT,.\<[P,K^-V`k l;Nz`/ p 8 p(8 Gp,8_ p&8 p! DhbA $ L3,`60  @H p DdP@`lpb@H Pj@h 0fX`pnx@a Q āP$`) XV`-Xl6`+ v`/(p 8N,+p8\.߁*p ntCx<ρKx+0QX^,(,L 3ª\auapQ¥ XpeeM n-V; w.Sp_υ *<\xh_ ZZZ::::úºz`=aŰ^`%ް>~A!; †FFPQѰ1q Iɰ)iYٰ9y08 O/)([ҴeIǒ%]KP2dBI’%mJt(U2d@%E%CJ.\ҭ())S2 ^k_ZKz/h]MHjY 1 I]Rs_}[+˺/e~"i؍xic2>Gſ&&],CiĸlT)viZu㐧yMJr- xlI|i+\=5&}˼>uJRԢgl_q־7v0#SL IYo|GL۹z<f^O'S݈lSv2@Wxo0i? Y z Ϥkt'G?딅*7 u(ZCo䭴wU췒mQe[%IzK:M|GR-A}$ &qu'QqVu~ 79LY,I(e>s@bIOC(gB`ß#p5zEv9_.^ ٢ˌL~&57̭wp_B"+ctw_qJEҎw>p}Oɶ?IGLӚlSq߹w='Et >" j9dZ@:F飧b2w&H+$W?T l*О}"[[#!_[s!/qv!30'cm%\'JIT{ Ф377v|TdnLcymv'Y44Fy㏹RJZDy5D`1=1vSZr>>1dH=$|A3 g=WC/<>y' f UA.,Fm%LK'[ _ O z6̙o1!Jny,*MzYy$]:.$~ፐASe ʇ^ #lKZq"bŽyF|J:I:NHBZ]n!d ww/1?/f,iik<``dX|Lh!aGENe0b $ȟsux=e'%U4{ MÝx*b5d"L0}~ 1ICK12v_r|u)L<[wWsTc xj8Q/-z".F@cĂ/Kk>8zm-M)TkXdDck3X9MJxά&foJkM\] (}5O\AYJ}މkL}Ct7^wE֙zޮ}n}@\!i1z+ B@afc> w HJ'QSZPZQ:<6]b(cwp J7O臘pF|saNj0ҌÝ\Ckbčt.t!QKDۙ2 5IRsIlaY رR2B3-a">-MLvL4T!W_R2u-vrtH|{8&x{@-7u= }tdaNjx=xkA{1[VO]s/_ТP2t2-QFIܠ~j7m:3w9-?cZhYhlY[)Vs2A&yhm?~53 /ԥ`flΔv_Sp{d7^ͳt\]\c?d3e q}D;瑏QB ^ιrd}}hcڨoeI[3| B#R"#s sPM$)L7=6fOfAiG=iWy;xPDܲV;nG8R׉Ktתȳ43Y0^8Ԡgc 9{..X%;9=k )}L$)98~ԙ_pH/YH!.5%{/COhIDB2Y#xGv Skk{>恉̂G E 7eY5 %P1o1G?0OF9GghՇ9">:^}(KȊugݎ$x>9۴Cǐ?zg0oM2[q-ь^-OLQwSYm^+c8OduPVw="uPP'qa_4'-}$]L|n[&qqsׅ~]/)gV?@ato$ȡZZB6}MVi;Ku[c[Xd "'T6NoC==RC\EF`DXؿ 6HƨkvnatFM|GbPrmssy]9.kNβس(QLG϶kdOn؉&YI >ؖđDi-A/YO}+,65Pb^MЃaFFւ 4ג%Ir%5ê +{tK/ҜB^6sX3rɪDWjEfE[ -*:tAU@eioئĺiw[,)Rn`&-jQ6l/>3NP(b>y\OGsq˓D"6XXy3ҜR7n MBVv cBFVꞄ P&[ƞ`F9># >Q\297YGzrMCmT)Y2/%UCfΟci2[V.%w4 #Jgٵuٵ7Cr./R-prK,D6#|,-xAPVrT_#?_GnDN~b)e柕YJ('wC^o^=P#yAeӘe,YDgJ@+XfD'x仟ڃ3ssV3%$p3-65$|8qT)̴μ`O "}ï7M-ͬ,#k 7.(9ݬ[oH/[O5q{&jbR&˚Fhx SXm̻_92 #ZyV|OzZEN򺚻FA@E[#ߓ}_{}Ϫa%܈hYEh/nȧP+ijF{A L*S2v"UlYyXIuM@\=L(RGɬD 6s >_,dJ+Gǎk[X2egܴvI4x'tqShlޘ;2"[ԙ::aDC"HTǬcb ?ICpu(PƉ뱶i[$j[/>m~EJKS^R^PRMl>ww'7G0MOSϟ֡ygVKbdOGZIHLšUpUnX\.D"?RðE0Jf_3J3.樂kd}{{%b ``ً0ҩt"-T,3G??~%I=prXr6REsE,1rZa/ؕ5؃e}=؇دgOػ)86nn018*.s`7BZgep58 ΍[Vn.>x~~~~ x~^}x>_[{/?$AЈАЄЌІБwЕЛ00''L! B~B$ ABpppppؘpp؄؉؍"$ ~"8h$z;5]ě# s߉W׉/__IuII-I]?JHIHHcHLI8'$A$$!@rb i)i3(1:ttGiҮJ;N)-Y:U***SdҽJ/}XR&aG'gQdL&sB&knl";@&HA>D>F>NH|||RҀҐҌ҆RD)L̢) +) ΢(FJTr5ݔ=(G(((W(O(_)(Ϩ&vT  -ڙډڑ©Ʃ?QPSOS/PS/QQR_S5uuu͠MMiFhljE_h.nЮҮӞ}}ѩt =}} }*}}NBGtDgҥt5]Ow]t;=Dt?g+{7[ 'N~挡.vތqRTg lt1!a$Qxp3Fb0c6c+%c/(c2s!>=YxllΜ͜Üǜ̜ȜƜT3L",ee*t&ajYfgeV0!fyyy (s<|ȼ||__XFf.,555gXl` XdX$+źr*Xαvβ@QE/Sc8)9.!/6=ӕ`Qc/eAv-{[ l!{ {?(8<0=g> 7g/ϑst8?,8{8W99G889998\89wXk98/98o99܎ܮz##csx.KҸTkຸprp^^xy|5o$oo+˛ʣ<<Os(/2<o'8oo0o*6o2! %/{~ ~{~w~o~`d(Th,>l>+?/[woowS pl l^` bu A^E;6".a A!l(,,6\<&%l- ~> n ^ ; { { B"4B& 5‰B24!U녿 ^!? &JVMcQ]Q!(n,(|-|$'$.|&j+|*j,j-: %j#!j*RF "$ƈEqQh#Z"Z*J:vv֊nΉnV}} ]<O#$1VLLAlG3Jqxxxxxxx'QI-7 XOPFVE򃤗&IX%)TI&HԒrI\rXJrAWddddiB(Di'HpikiS)[rR$J+^GY;Yc61CQқS#O+ߤHdN2.$%tq2(&#sV2㲟dd{edeeeb岃ZTy+ٟoɲaSI6r$7ȝr\.'ȥr"'ʣ'"_*_,_&)?*_-%M\([U+6(^)*v((+n)N*n⊲⫲)J\+%ʘңTTUܩܧ<<_ooߣ߫߭??]U]O\Pdoi4b2D K  G '  { G ' [[;Fn,5h7y-Ɲ]ߌ::L=Px$ht44LڼIa2)m4eL)*/ hn:b:l963065f`bjackzhzfziknanlonhdnikeFMfyyyYk5fYaV%f9oΘkejs9l.7Ts||||ּ||°XXژߘ[:XYzYX[zXF[X&ZX[ei!ZoZ$m[YYXX[VZX6[6Y[vZZ[XZ.[[[[^X^[ZY>Y[ZZYZ[[Y'[GZgYVnUYVae[֠lY֜uuuuuumuuuֺzzzzzV6VleFڦFmmo6d+m"fmno6kln ؂%m-j٪c3 p;ҎX;N3η.~{^aU a7ECuG}1111ˁv8C98|#H:PqZ5 aU%g# +gg?g/T99ɉq_Jup˹Y\\;U΍m}ν΃]s+_W\u\u]\ \]\-]]\\c\]S\$Eu.X.K.ಹ\5ZnZ=-y['w]nnFg;;*jw{;厺VE{}}}S)rwH==G{ydG{ggOgWQ%boOymme{9ީ^] xސwWxjkƽǽg;z>^~55~~:dB8·}|җ-}vaQF@/EMߟ {oo/>[>G'GK ?o/?/$?K~%a1Qn k@@37;@s@@@@qg`h`T`lO`|`F`Z hV@pl6` l @:PX?6..n>^a6`` #H 򂜠4( ʃ>h `( f?77w^ ^> ~ڇZJBBSC:4+4'd IC+ BP"$'>*>2>6!#8:<>7>)㴸 .R+㪸+n;x(+wYsu@b^ & nBP'Tp"p%$$6$V'%&v%'$'N&~M\JJI\K|IxW=-XޮU9P>|n9|NyeTy-N+ƴ7mI;Ӧ/Ntuze/gkӭ_12=33328#(2ʌ&άlll<<fe[gf;f{fegefg'f'eefgfYT]eLvyv]v}vOVZFr\YyUusCUUw:U ]5jZՔ X5 W\EWU*aJTjc՞UgU]XuVݪ{U^T=z^UϹι\\IOo_npnHnXnFnz[P9bNKܹD.Kjsr+s[ss'r;sGsgsrsrwsssw^^^Vn[ݨMu [W7UR]RCujzvYՓKj]Q/ =3Ss<-ɣ<)H^ųbXP YI0 q}Фv t+gĸr›܃!,CgЁӺCDz1lq]UAD*ΧjÐzU&Ga_[n,O˥e4ˏߦBt.i&aІ~5yyt "s`$#pi\f[BWiv6yߦ ڟ_K!ce ͣrH0̚êsL/ď3[C}{JhKę5EՇ\ǐuᄕиOH!P:G>RT,v6 5RB!7FԂ6XFy %S0'6V3ttQ 7 +rG71[#½*MLYL2CDQdvw $\~27UKJʫ1%O8i=b;yHEe!M5EZlޝ-?z\kk2V莧?H/ʴdL54N (-HHbFKk-0ǚkXD1k k]wi Sx H cӁ!L]#?R< ʲg8_0w7a*Cae3BZ4I%!".rX8T,F=hک'fw-al+j #Sthۣ5L zXڀ(cYt>;/;aHsMSX3d D4Wm/|yK.zlUG- :`߂1ʓcfЊR:ʪ1<:^eR>(U8PBvOjgyq뚼ڄi$UTIdA882cgvJgfZn$ [EfPK_QPKZ*8OO __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Subs.pmUT ]P1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8O-F darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Stream.pmUT ]O1cL1cux W[S6~ׯ8htK؝4,Yd)rb[I~7808FFj  h|KW ~e4Qəy[V <֧M~򎕚%l |K|kksD(Ƅz Ӓkx$?F+Yvh=TT-qg[j tLTK8ox O!a)/YҳSvx6˺lz"L> u>ZƬ/}Ƒxy[@$w+O! BDZoKiPI^;g|R&&0g$_ebQTH0YIΤjqÅ_z'}9DQ 56&EFy]/F0"~e ۗ[)dƔU:gӷRm}yyIV1V?~7E2r)cG }Vuݾf'?Nv;p;ld\_.e&C|5!Ktkg|:7PY ˃q{t Wͼ^%+)BDEѳ'8EӞ8Z*ҎP҂  ILg\=oNYMW*ֺoZٺB~8$ԭnƚO7B!u<7!o.(zJ~ʚ>]3H?F7jJeLh(#t*Nng(+hGG-],7rXn焬ˆWE=4!yLdvQR!ҧa"/nq¨YB=llRyPKyPKZ*8OP __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Debug.pmUT ]O1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKZ*8OJG darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Objects.pmUT ]O1cL1cux UkA` hK!\$JCKލ%wݽD;=Cdg{ Fgl V>۟fJ U +UB8_ý獩(Ke-؊etm3WgX`K Qa@[{p{?r^=gPK$JPKZ*8OR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Objects.pmUT ]O1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKtq:URH darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/.packlistUT 1cԘ1cL1cux L*J,H-736(OtwI+/-.ON/H,JMacR++Z++bcjPK FIRPKtq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UhW darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/ProcessTable/Process/autosplit.ixUT r1cN1cL1cux SVKIPH.JM,IMQHTp,-.,QH/RHLဢd0Z\ r)+FZfNBbrIBbBIfnjqIbn&5PKЯj\hPKq:Ub __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/ProcessTable/Process/._autosplit.ixUT r1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:Up=N darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/Zlib.bundleUT 1cN1cL1cux } tSvnii)E)-ҤܫI@,>'9 pʛOO-mA2 "P25 --b~Zkw;s>l>}!^Fdi4. ]FSX82r\Q+,?\dDk2=Z.N33p[򹝋GTN?&E*4,ufF]idS_C,/okvJxjcO=TSn&yY'{<_}Y. r gɻV`JQb~6*>ߧQ8?,Q_"cf5Oc 5^%x^Ӥ2+*4qTq)jSVTa6-C>H'y'[V9Kz(g'Ir>I6{ J1E Q)~1SP+ E:KVcQ)qgdV̪cw4.ѹN0J-/cѝh;ךCI%CU\t;EKш>_ FȨ2-~Ψ^Zo$mϨuZTꗌ`Թ*QO2Qe:Q|>ҁQڑQoȨ3:-(td2Cׄ8feκeZq e0v ~Ĩ3QΨ/3b*QfT:nd{;F]ٓQsF՘FF5Eܛ^ϨoaTQ2ތ[kF}Qgƨku6ndwu eè14FɨcTzrC5Q17Ĩ<aM9zMFp~Ϩ3 +~Ũ26F]ΨuMΨ|FUZ]`T0vƨډQΨbԕz fԄJFͨ#G2j<:{xQ2jսQ_gԫG1zF]ɨmgu; zQèNF5 gH>O2uzbͨj~QF}Q_~Q{`Tߟ5QcԾO0j+Q'ϨQ1DmxQ?gAj3یz`u8QoUff1Evɡhq+> Q.gy|8\$]),ײ%%p-$dUM'Xr N!E|w8NeEa4ǻLIU>5:G;|ץ+ΣbI $IJATT{wK545IpNTD% ʖ*Ql\.GWA. jЫWaEE+:=gEg};~n{=Lz O³8V7K*ճnpȝxFo sb齅C%y:qKw a诉yaynq+ lx\+XҬP / .CzAMj<Ľru<]T=ÕCnTK /P~u^[Xowh_ʕBiatS9ʻb HD>M/]:! \< @@N, Jweh^B]V"ioBɷ_Ѩ@T\m~ǸF/6l;MwUʋ`AޝyCDS7xDc.l OUe7[ 4` g-z.?迩&D' ⟁F!PY>/ >7>'NO >ç=APS ;y >O,y:Uߓ{jRTWֱYwΑ*fT^q fJ2[;J2$*w*2W^e~^+eMϪElfVd(Wcvv骳8kkq^$.jhX ln>=nU I%1u A;Q>}8v7'Kn2" vdXd'+!)Bqd!{Iuu=|ޔ2emD_h/ XZ3<Anb6ޡ}`w475\N3wwQZ)hH KќRP%ʛ|GTc}&_dl1^+iGS%IACȌ5-̌hrHz VBgfwfd:f&]+:Jm, [n#;iI̓ԻC"FXtبgEE07hEy4dL<ȑZ@v$V913dњ<*|5tIqG3DZ0ssX. Z hcA%K+|P U!*ups6p{a..6AW8NWXr6RPi8a~LLG{;cZ5Ix[$yT9 CZvZMKF|:5 )ԥV&L㱄64\,=6=ֱDgCE9.30j+fO"2m:@OJCɪ% %k^ x vzH%q]|6|Ή4da_B& {F=­4Bg> Һ_#i}SUZ+S)[)S%4).S2;ev)r"ksfawUjU}&Isz/a)reQ XearҨdWddi-'[P<%[Jr2OTe,'Wd=m30ML#"1Ze&Ny+ Z!i^PjYl~pǎIF$y 02AfRP*ȋyRAу bXb:xȫh\r22Ģ-w[SsA+PI]xB0#9CM`.aRL4F6e][iAR\4Mf4ٕilǦɧpJY+ )aTM[;4B.$b q!8`Tɻ}Eh2 Bε\d~ͧ!U/.&f6?I }Q_k7{11'CT탾qa ~JHdnZ])Ξ!3󒯎p5xt:5Aq_1#Mco tLGAAv :Xi>;_Jd^$%+Rl+41|օ0,1NSǔ$e**QNrW[#+-jde;MX1s:rz Jʙ~]Êz'y"JcEcE D+rݣS4]LT+w+-!+"ȎLW m64M+4"3m0-YAd$ɕ;p Yv킂ljSq+!h{q/A-#2i6j<"IX*1+w8D|WH!;P?+e8܏n. ݉q1MhA88.f|+L0ӣGbv6 ~+ ϯ?ޒ?C4o DT0)Lhf haf'rjQASCTTFc4DEW9"Eey:fbFy^ Vg{oO3X8ճ9(.8dpݧG3\t-!fcP=~|y"4Sר3۹j}ZzjTјDc2D@J rkty hl 71Z,ހ :R-*So M̤4@pzۆR*_3|=U@܂ mԦL!ŲVBHF.$.uTv,~ H(DYTAR4˓@p.%Ŵ6v Y>n`DúruH'k}$&0ke$0 ĪQ&r/"=X%R'žDJ~X5I=NVuʤ3AwV]'Zn d6bZUDcr7_zЬ](cCw/^-6+byWoѺYsB1KQ%1ESUD?,ES+V*c](E͚T7Q9X.c|~aCd˅.HIZ ]:'y!1欷юdO0@t 6 Q{쉾_h-P!V}R:[nJ$HX*?T\NU )Mʖ̇ܩS-[Œvϭ`-sxܾs{FuZ 37N+unڔSTg[4&N~f)$w!'}DXB=i'sjȆ<@SK>x`뿑=D~)'-׍m_BlN\4՞h-oomClWugUbzKރua{Us؞ul9=o0lJ5Q*kmd(TP6Bkp6ר8w'%+ ^c=8;v yx= Z6%yxQ -z!C[! !ldD?+tGK3#<=yDtu{ K((6tтjHX; +~Rq>Kc xRs% '.!3?hfows@kp#f6 VA~~]J ޒ ~= Kg6##ky39ϯܓ};kGoɓ!ݍa-K"E gZ\;|s;ّ͚pJom& ϯ?BC-4uc8?Z:*O{,?n@VM #PVQ!r3 `UT{O]YU5rG$u0_ LTk ( ڃ=,%y7fTl7fJnHxbcY' ΩJ).=Z={K*-y 2fܠ[MMǓx1Whj`ؔn;7-&%hM!Ky_ާ\`_Bsk'y):g@uM"ox'^{hk1- _|_@`3:)q<̳awbX#*&a WiY4Q" FB({T#2JXUQ-<@'O)E ROloBEV,ɴs$W{==~Gur u隙Vi엩|G gn(9myujWtƥ1VevL5¤3 j;wþm-F=ٍRu]aWڇ}>ȨKr1_};CsqoiR6F2G ;=}p;#m(?iKIސN /( ӊ{NNC'Jqp%4yцs.ZhdX +:T;zK} qE<|CaUHse,܎ޒW>Y>sǷ_47 ŹlP6Wiǯ%ߡmǭa? -%w}XK+ސLFCɰxn+pבӝ(7i[U7>O]=fHʂ²ݸuG-ZWVrтg)htVqX9'MkL$:MugjeX.R @^oVC̗U2DvJ:;vzumlYM1>:Lo+S&bMоȦg$0lj}}W6T'l`KzKƃ/ a?N1_]D.N|?sZy'ޒwA8|E38/Z7;r6 Wr,s^y ryl.!}6^4u:  *ȏӡ>GdzKFG + tagU^B*/hȮւ|]ٽ2hپ$IieO **.a"誊Vo{)?o3u۞7۞a=Ur+%zE_Y pQsċuzM 5uԞ?[r' gNk5Q{ EgP;%A$ ǔ:/'~b.o>Bnu_G[^l ƽeГ)]=g+l1p[LF_*mT*?eJ;CV4`N]ۇ̂8 bw86|ICB) -D\~GP|L6Vhk 2P+u!a7n, k:?V}1-9gQ#SU5|,ŪL52U5,uk /lqx@["x[U+.v|'Uޙk}JXLޒ=C<Ƴog;B<*l/U޻sVy缭dOV#vV5i|,s1)l;M]MtܭȪTyZJ n[ݘ?ƉV93ՌjQܖt[-ʖO2 `51h}Aܡ4r2dYF{Uf&:~P HܽyZɇc,^Ȼo KPF\B rXC؄3Մz 6 IԄoΒPĒ}{eppTB8>KsIE|q%99/ s}¹ͧ0O.!y^4c gO'K>QqEpMR7>& ǭ99~8pu%1pqn "ѐ7<;8aC\[=J_u֙ޒ_;B/A;Kړ{Ѭl~ N5ȷtGcw>S)(myXiYMw4רvd"ר^F㪨t{QQ5ҸTb ;ptƯVea05`l(ŝ(F\ۼE/Wfl6 eq!x"b! ?1g0ۍcm5WI-2!Wx[YQz[cM3{;<(J|1ID{l 'S`pp1z^QfF(%QxFJ6{("n<97'x A otc$8oo ڛ8DtGKz5ތy׊3:v dcM5/>^|CQ3 4 bq8ZǠ 5~Y Tm6ye&Cu8-r0NXuq16BEjT>BMP#6jRPy(0XR~qV94ǪX3v !9Gb^9 l4INO rWΗh0+7"6LӅiaZ\ô0-1Lk%iaZm:SA$CԆluźM1 cRAvD`uYK^C#*HU"ti.o)#Rǝvh" 3g"Bu;~[:=f5\5\6 w\INTfkV x{V@cN>Ac42Y4*HcO 6]qO_JNZN*7Uķxv9ZOIauYUM*%yH Ir<|]{)_V?h*§COBɮ1Tksht0d^'&~]jͿoy,N:3oY+Z7Owԕ4ԟ%F@k jFgJ$Dڳ@aJ>e5yE. EV;khh)G|nD)FtڭR4K$#Ni.b630.QSV{OSNJ2 sXM[ bs:83yB,nUQ?<g6H<4g铒k=I4SM+-R["cY] v|\4UF)n_IYÒyBK}?s\Czz)!S#48ȉ)rMeLڋyAkE/m̷r(؎\|0$g ?+X6,-XH䖠[]-~I>-m9l_aa]9Z lJ4/Jdyڐ/ Dn\gay&&5RqtQyg 'ĠEqTKmJn6@0so( R,6 SSbep@ӿVpO5A=?}N/#y3+$' q"93r e]P^پ-ہZ@uyz>[Wf3XpzIʹʽ*ףQ [z<$̶ldpAvsF~у^~K #ѬZ$uE&䨂nѲ :osGDM2ADQLAJpc9 ?!3]mY>{1rKK9zd8˔;]Kʴ"Aq5g")>tXP u6:*zqcmh 6_]XzT/aNO IYXs8Ȧ(GМIgn 0 .O1{m'˂MLTnFDU%a7 f{qda~r <.Uc:NT rF2ʶfF!I1HDl8g{QgW*}WtjDl ̈o오US8' kle߬WRu OAg[LGimvb7>*(ٕBFy~"Scp'|/,Xe\FSmDPe=gD&11burSG4dTsdx][~<4OOMZ5HJs“8*%8FP>1b`nO2{@b" 2@;)}gڈZTq/IeJT[(lAPLilSWΣ;rߏl%t» ۰Y2Xdwy8e8rj7ݡt̔_L )IF3z=mwʈS&VT'?mfM22Jcpͪ9ԣVMo 4zH)JF뤬r+?FB<\#i?au6j܁5"9`sE%'SWa-yXGwS6~7hyܵQԎV堅/DcsڵhLPr6(s QW䌤t @6ryó׊,Wy ;UOF}zfY x=aշF2ʝgz8M;x&:5N". dM{ mS\OwIqQ(e_5Ly<))CD7FZkVA7e5g}/C]Im궚^8x#(na[[9IH&AJw z1g9qk-y.aht3pHe>Ց{H1xNgNZvb||qGumBtwb!nxB$+J1aEZNwp5ld@0xV&&PiÁG!vcʻ/N~_C2ͅ)N"{]X-wx$ *$ӷŏY&`-lC/: ~ƺa1:RԕThSJ&OYmZǩ@?+ǵxĞkӚ5 ׬0 cÍV*`8QS):/k4%GFҧt/[*,z/G8r&^?J;0W|, {+[NwRO1k7?-Bf;N0Tku֬ӓSýn}vyAc]I'@30SSY=f@޲y>8MŨEư_cC w'VS;ʘ./̗]Yg&_޸gY?nŸx.ie2 QBH*H:컈Ye#(SmiiML[L+؊l]aͳw=]SHXu)mVQjeE%HC-JoEEQ3#P>l&'Fg6N딈M{:al|u-il^ZkfF[iRxgv?4I:8$Z`\Ai.܋3 脾jP3}6(6.QBǗkRL8@aG@v`1ݤ%96CGЉ)T!Mg3MnϸʇL|d w0=>"<ZڷT/̀ :eDg,n:F+D'" G2*S(Aqlim 7:%tX84@H5_?moUb;쏠6vk*L߂@pzrȾ]B##\wȀ_*4DLZa\)d--ê)˻?N%4ޏ74TF"vuf~Y݄ k>R8?hf/ 2(6|?Bgߪ w6W;]8e/EnGIl9?j8qiJeF.\O"hw V7D_7 UhVYIbAfXԆ: 9uqCVc/ RrY-ZPk1dl!CZ }!5⟥.Eh$2gT37^_jsڪߪbWsl=x /hSq)-z^=S1~%f\.țy F8mCGL/fyJkԼ5dԯ=.*ԈVS%8߿9-a6~A4A{WRմYl/yEwo7jHg@\+Y#:.[Mn_V◨LHG$1X6vb9I fOtO5țO8;AA/*vi+yvu;)q'D֢Xhx(ږ*S2!y28-k?hkNzE;*qS%.7 Ӆ4)#7ݡY3F6jș2^TNx(CŬ-\Pzٶ8G뽧J~n}:e囬QqVz>}ARotg]u\{ʲ'f3 rX/x$-5:nX(GihO֤FMɻl%̉ Qo%i<\GZ!JQ )l$YGSwc6g[0CQ 2-915cd|#R5|RD$8狿0`~޹5khhTx9/x)H,we@*L)S$;EUbOrm`Dt[l_'E/qq V˨ |z2.*M. 8+c bRv嵾[y5hS(OT!("ΊD}ovKz_m6kn?[d7&nkqdݽl,.qV'~fbβUA-+XkTDf+Xp|9`6Pj$Ì `3 YT.0r"> aQAPja̗t!ޝ7%vݘ]- G]΢aAGxiop$y>SDZh\Ff(ڊ1tVT)9!FԆjUif#b@)G4TKZISV}jrOJ MJj67'M k8Z5qoNXLGU8vŎ {;]tL7:8 C]~Gcm*zrQ$zv.PG2;:1CO^á;& Nemm٤WSB/hLZGrlNqf!+r42ǃ"Gw^\XB9R#`LT6)t`.Cene*],5_ʤdyp=j$8: xcni-rJtߙ;I׈c̙I3sTbwN[܂Y̗8]j.ߙXmN_wh]yX|?û^W,9x׋x:J UrD-BNO44uL%?IЌܺ  ~n \y'7 n`ATm7{z!.Й= Ag e&!kE2ev0fGyuhIAڃVl_m֊&oCmEm{8s[%֋m;aJv/);V]!xF8I\ѝG.c32Ġ-W3IށG:g~#3x #arg6Z2E糢.v,lO(drNfEv,eS¶Vy(Vdgc~&O ]sci|-RʌLrB0b~@NYyJXaǮc@^,(˖Uha>\:/E8,fE-Uog*Pt ,{t/e{ imOknˁj9# Mퟹ?^vDpP-Cfm8v2,oq::ʴ%Q,Xʎxa7E/K4n֋MgRWCe] |+h* 1p-ӣIM{xe*[xQ_Mh8 $' XGU'^JkU^l a{ʜGq?YwLϙ RjJjIY9^63:xC\]D`B 5alZw^nmV*y[LSy+I<{f~p9ϙs^}:6:bt H/z4ntrepMηɶwm!Ad\BWv]$?D4b ^6.}&x;9ֵjҴݪ )G1NƸ[p3($cV$4$ǥ&g(h?JfSy웑 WG=GS C%rdz'j4XG-EpЩ=[akNICw„dX&9q.T:(QwNd9ّnp Ð#+[9ЖChrPd2&R!b1l*9'iΤ# ~d,x(v(s(6iȩp(nu$d ͳH "yMDiiB6[&!iū Ab%am +DqD[D*|@}dx}.}?+>A;۷daԹ rECbK̛X~Qp"?(|Tݔ'u. A c oe&d8| J }M̗2{_0^ 78AK kh( źE7sIe.AvD$pmdI" 0=I_*Jʀ@ROBA!|}Y@Sato;ClR0Ud'_:NMjJ j:C(;/aQ(M|cJRIiw i-#Ѱ_Efizw[)HvI۷0OR{#oR/CN|=.9 5MX} 82%var~Drk݃,32 Ì>`+QtoR)("hu6hwOς9đI^֊Fl1'J'+nrUsIri}qW -&$V~'O 9y(r|:i#!7֑RiOT³¯hە)ԻY^䩳HE$#Cb,%}]e(?rKթ]|$'ѱcx~(?RCDRCc;? ItTKM P!^!^0^u1:DOH}ww'l򕔜Ӿ`K>!u7H2 h]Fr 5hFoxJ-B[k0+7h]V4bXαE2~ =h'75˃̀\QTNшc^Ԇ0Ai~feex\`Ϯ>#<4xWNi˺' 7 6 ʦ{Ipp!38j@1T04`v$7;8jJb/)Qc^g]H~E%GDŽQ#6V6*2MLrLib2-QH&iIܹ& ܸG#夏 ] ~%[0r}3{ )qs&*{^b3E~T}tUI=ց*"l1*皤RFU3CϞ1*8~Lq4]ୣ-gyCu~wF8o~nb+bP8b(@"|<玓.O e,kK?ʕ{K"l#-UW@R|ij;I7NW/`GPk!HT88x?& $td=pqO5/MV ;~ &]-G%$hǿC`#mC7>1!C) "H,PH}ERO>({+ "s$8Q +&*#/Q~(y+ KB1fLf9815@Tb wYʾdTۛTDžSPkz1C%Uǡ7 -XZ OwU@'XTc q)-A-xx:a NRd?:2zG y6lUmI]A"&u:laF8S};YN2F_ѣݦogEyg>Z_#;r% d!rΝZKͪ<~D\*3~vLl/慁~#p6~ZYKa/HQjH@^P .aqnjNy6qD>'n[ j 5P j@۾,zru=géȧ!r]; irŊ4bGѓqUs].hQ|J(ZP|ģ?n(`o]H-˸؍ 3v%6OI Lb.!,׷ J1EUP퍹truɑs),,v"#IK1$L"el$KwwĔZzt6Gs\>0.+ѭ3b܀KUEBR-ވeOMsa r*h%ڣ iM /%WBy46!~jխѲ ]uƹQX1,3K-& 79q#U7=PA&ȓp8b(ǒ s$`, !O $kPJ&\s'I?Y;t p*$, )NpF7p$ېdH~y̅%"KEN@K=$[i$YZ[zޤHcm &Y mi>p/.d?! 38lI $ BBI~ >h)GDU@'T(k)%p*lƺ{$lgnKrR}gc?@Idw g߃KgICHEJ:to i%B:7r9tYBh)Z,˂ke4dIJ==/Celh'E0l_E˔J5R}cbO@' V 2 /EW/H߃溁z2]3trRz7ᤳNtZ鱵3ȴR >S×JyiJaVZV("[^IG{Bq247ɤ&ɇꞺ/DG^ deR醚`| 9g@rBl!)HdWG^:FD+EwP-.we_c<RY0 MS^!ep1FI܌u}XdVӍ>XlS+ ~Ƃr1*&>=0>w j¥]0V[_ӁAsILQ,ҋ1pSῼ^w$.Ȉ(n^D eNB2bBk-Mje=nxE EYPl;G>4W(@ ]SֈevYOB?YQOȢ ʏ#0nYn C]-&V2T r g#Z2nRY|PQރ1%qBOK9Ⰾ_@&DB d9:]"&Ԃa~4b>Jٮ%@Jř y'hCj.dIF*8 <+" qt RӨTOgS dȝ^!Rcz;n4gm=:4I/r»vQ #"9s=2 KK"ط)ՐvĆ|* +YDSkUߋb*_%&JP{;!~ yjqMR(7JC'b\be+=Ԅ|s.|7Xj8@t,O*vĿZN=Y zА׼># 3x=1vj,w1ݐr llpNF/6x3F͛`d4R TZMM9"֗I FN Y U9PN 3@p3*£> WPЍO @ ʓfԔZܧ'jն?M޿HQ\QCg#qU "3rOq/$L]=.kvbcP< u Kn`P;Ay3h(;OO>5W UN$vUuœmjαQ|vZ5)=dI-Ӄ]['$EQQ9V~9]xZ\*I8FQ~t##Q{P@ݣ·}ݣIDv>N\x}Kv7q@=*8JYBa6y#lWM {-au7' +8R"bHJ]BfߛcS]'w˻W/|k+6 __%m9*]Ir(<E٭Aov"Ѿ;ę=@J(DϟH>Ƨ2L:3:t"a I $ՔH^p}}LHhfv(igw#0oqւuтH I.&4n7:EL@(OGN13axUk2ʫu7z$H48K7Hrsum@|$TiRx̗ԄeWqco@J46 w'IK@S:" ~$['}~māքBG=2 A=c,[Q1>Tg2|i`UU_DTYYu"Ёӯ#RhQORUODg5XCIs]!(z_@G$=M U'J ($Lhi=&i9 nW'i 2Tzꐶ_-;!@a_B"HJ5y~wQkHEߍSJofoXbA/S4{CH^wehD9_or<$Ϟ4)rZxuG9f la"z }wοhQx]J28Anc ̇~ƒ[C\QDӯDFWqBzkU~pV> \IzfPGm~VU5tS|~_2vJgz(7;=AXѦ+͂\kƼ6a=Iz٤zaz#![hANx<Bp+A.TA9\1סIE2nv,m#d| wa  k{m7*O؆X-xy^oBhaBxOwbFgOD+d7ptC: "ukКˇ썡*T WU.-qxfH\h TXԓt(+ dNDYC ,{9UGh\T4GUX{yb|#s*zXffgEid6TƢf;f ֝zMD, GCu4˸ʊlD|Ecyq+VJVFtYIP]iF NGՐ%v')w11+l)נyB@1F7ҿL+Mj;**sZ|`>Ԕ{uPS[n@O^wP㿺~TP'| .u^o] ?z_|^|mR[L7PrK$k"9LJm2=O,L|/樢^̞~#3G\XNi~0h z-"DF=}:&<9hu< okйH/@ HqڔQ  '¦hq.Xq~rt''? aP@ܟX cp#ë%9Q1A=*8#짛b<(a u:%֓0(DW=ʚdqL98`oR$ =cnRm>c裢|]E5o#j KrV$s")Md#dl+9 9@[Q:#0{bG) C'Ѩܰղe]Yzq̺p\c|.8 x jc <DKZ}B eeĠqd$goWGG;.r-q]F벰xGm"M>>M^977i%%W9X (K#q+q ʃfЌl]gxt?\Ƞ3 C[Io #J^%9V}U{KYd.[q}_q#rHOA>SΗIxE E#J 'ržظ% =K434/m}!Hkhf9:[I:idR5_mVY _ģ)u\ިʻ>[muɻld@ 4q'iLl _*hU%Y_@GؾdS&Kស "xYwdq_F6cQ,ٸr@7tl9S^rƳYD9ZidM{Y[ZMH_Tl\ 1 m$NEeˈcgI$b'(nkcKXv Dl,Eb\L Mpn2Ty%&8Z{蕋&jSDƂB^#v\C˔TLrHGh1ּcQVR Yp!_k9 *l>1D7Œ>G }7,.YxKϹC3ij&4Ux)~XitXu3TGB|Qdwθ/ ?8Ԋǀ@J?eK]ęeGP< t)| mgO%DW%ĉ4:/: sCC@ M I Eɔ<ÆS_ļbvv..|i!a*٥.̤gX "#nZyG_&%{whg9NK\ޥ]StFݏYn*6!xU:V{qERmTۨVQoo\{Lxte UcZeߝ˜;9wR|G)7\\tGb95}vw:ikQ5$=SzooQ~꽝$dc5J2:D31E4JϊQd}"%ٿKN2&jv<.9ƁiaD+&V|x>Kƣ 2>EmJ[IČ'YWۅv1ZMʤ$/)&r< Gv_enrT!I>^)y[hYN ˉB򑆴ZHi=XFqgOn #ߠ{%^E߈緬 -40B(^/,U&K_kCֿqy23h ,FތT9hh8 )J  iߵFxx+fEMeXcDU{iHd5Tx;ںezĔX?Б^֨ &R%xCQ T[ 0>,K*Ĕ#[̋r {z1sCcOKa+M/fǒLl/璗 $b뽒cKqa;%٨,*c"u8q/l|w]Q/ [zJjrz$PaPG$*bۙĊ'LRPq쟫݉(9zn--! k>^3 P!^ۢ!Ď Jo\qPlv>͚T4}]r#>%*݈(&@K d}QE!Ĉї]E77i $CX4.ЇKvvSh[e\`=DnH }*lL09 ٛA4aPFxtBq;%gsT=ceT@%M@v##(M4 ]bJRwNKNaOxKDEGM(מ$J_ R"@{*JhWH\ިWfca/mb+^eX:xP{Ψ;6KiiTUN~c(Od`GPő +@{0!>/%HEK_epߡRZ-KK K(E{A'(؁q D JR9&(%DZz&fx/k>$"c@0z-n r0EWp 9קC}p*95$-v BF 9G|rºrGR1Q&6NMoQ U<*5)P$: 6)i\ںDI2}AJb3y5?ٌ;qyB W: (nɋ L22h)'x.VKT1帗b]vSȋ_iwz+A .I"( 0(K: 62} 6o"Yr-e@ћ8$2ML.qfGNP03#|о  þO?/YBήA{A|oѬǒ ڡ kq@ -}'A7Y¨4_,Q_hz%o> 1: 4*2sRFx5J"EAy*v/g|4awJ/_}d4'v;wy e%ɏ_:݄o [V즃M40!zgk; qު,q@":{8 >d LI¯>&YWݸ k4NsvrCۼ UF {'_m% * $L|ѥY{G(kLcvq a mh^)tXo)g˽U3wN۵fwP3EKyn%侀br_J}% ^L%侚_$er_Gzr3Fo[6A_O}D[Ƚܷ.rMU侗ܿ$}^M5 Xw))&L2&'Ə"^ƍKLy8)e)n6H/LF;y^IdcL5=%Θ@A' $37d7~oa N7?쌌t}zf53';5o!|[2R3|˒k/HOfvbLȶe Jlw2rZ3g3!"y .̿ răSJofDvu{vCY3(}FbJ:"ӌ0 G`9pNMLz&ԌE|s g?w7|ڳ5M&<&#m3N|w/2O>.}D'ƅLjb>׻6?OlC O7Td;WMAh8.`p;#jqÈM@ @[8f6JHΒ?qx23u3G7f .we9/.JlĦ!z D0D ̴MIMxb+ Ce-OA|#ud~:g1ϸ3r4{9F\]6 UL&Q)NBgqzNKT #gy5 ̀NE(GXwBƯ<qƓG~hĿZ_[86FLћ_i)gm+Gfx~v Q\!PPLf{G-,ą#!3:#0Ew9ub~>C}F(]cĵ<:Լ@*3 {ʐL3ήGŜ刟{<B%rp~X0բafca96"ne?+qh7B\ΡC=:t6ʩ/~񜩟h*uO"&ؠG{w“kcԏ#H# yq)SN!I^|1;2I{zs[E歚?;wW DFF'T h l6 w0/Ohb39zW"_VG#!X\Ikx]C4jL}Yh_b "́~(bKةXėFyq|v4,ۿ)1ʧxJ=SRm/k7|jQnm zr2sC,x S6&,S;A9"~0<x2-v:bE^ +hyɉ7'Jϐ|{l~x3I>v]&ץ, iOoK$vfCH;~ÏtR2+ <7~pv i!"-:Iڻ'%s||]R~y#ƫ&CDGɧQOϰdZ31=P#܅ysZ1cC#1Crl̬t}Rj޳z!= 7`2H&2:& c4L8f:3* h^Y]qpL$t jρAvʙP,F- bӝ,sдQaKLPPg8h9cjk(,ŁPYAsPH 9UQYʡ{P8htuQA[DB9PtG = n9(:ĎTM0ꖮCsÁA@P91M]? pĞ^x*Ū;!9u?44=l,!~P9P-9` !ͺ'bՊBRB3́Jf/!~(-D jT:D[=jAA22LT]ăj MS"uࠚ~QT?+߮?\T]R 8PuZD"͋Rs,^VTqėF)hJqs酦1?4%\&S @UT,%.hÁRдs.);Faxzs tוG?!;ՂrV = Yw^)h8gP=i tt@0LeziY+[Ftj{V`jҲHm?w{,S  PCgEh5_ACi; C_a:}C_W:}C_̾xЌt-5 t݄VÃӝfg~ beF2L23vf' b}9]n_w/RE0.XС( _u0F`RLò+XVŪY rl8Fzv(/.'(_,(z[5 *X`5x.@  |=aU56P8)W+, 6W//(ݺu Wz*W/ 6Wy׆bc̗U)Ww z]=^AWp.O8pj3k3N`1/*qx`6Yn/Lx`@N%c</g:@ <@OW880`Cdp8 [4+ ~H8|e&p ` ?n{4QVZ"#-@W|6:80~ :LF| @wHAwVǬp2dk? Qo8UW<X_ ]~po_|H#o 0W^8p"`` '9^{#? x*À~K.\p=`0x 5x?08p/&)O>IOxe:2fDL KPF0 `p?@:@$daV5` kwa8 DZDSBMJ <ojcZH 3@_5@w2Z̧}b@ 64 Q TNS \ _]>}hB:i4Ϊ.,ϗ&_Z8nvb 8v\G8Y %bp,\ -r798%p%(%Jpge~(C}h(CU`se1)`t3bDZNv55EpO-Ļ9vBNfϸ\хqg\k0MIyCfVFBV]bћek^-?!3oL%[;JQ&Mٙ7ɇx{i7wDLV!f;rqg+?cI㟾#,[;r ynRA^dXS35<Û9 C͒xj3oQU &3͚B9%H[h͸3m/k55 ]8αYŝ~lk.ȹ ׾qcY(l%/Nlr{+~ N))kn[2_ߴi-rw[^ tM];d$?/wL~C>[,wÝb*?wɎi3[rҞ-#w7K%b$fy^RGqPV߶}C :E)9]$_⦘b L|f@>3_cէfeIRrslygvzN~n*uhmP})mqSfde'LzLL$LKI2&OPNNI' ¤&`>njg W;7",k` iFf|2)Br #6ɓF|L3MF;nq$w &d$#2q8n/y)F1E4O$df9rC[8'%y&L|(#4:UC$K?{JvjcI?i:m? }\PӬyl-eGfgOz/I qS穭nhaB2`"Fe(!1tzh!}^j{ Gh({i,>Ce77'}  .Ӛ|g2s091";Qﭹ{j2#Dh! ɇ9pj*D s3 ϴ*t։ålʵ(5 >X22󑓛-4_3XA$>߶5|kRffOl~A/_|*Io TXJRڭnZKn뇔֠ ZH,m|-&ؒJ(HH ;̀׶gs 2vhaRT>J!Ar}aK`6!g2C?p0оV/éaʼ0e4-ʪT# 5LÚ3 !@2+\጑W*KBfbwFa$\İ g ÞxaMe>aް1 3u^h/gYh12ä0QfT FYQ[0c_eO_e4dدh3L{ ; ӳa_*g xQ`Qu!Ff370GvQK FFa#42̯&zQ7*63LUu e^2.}Y\_V>ַX*X`5 *8D Sp')8\E#U] (ߣ{[}W)~OR_ V  *8F(QSc &噡˙ky98ݾ߸^wo Y/3~Zqn_*~o,AG0H=TCeJ82 8 oR J!A :::::::::::::::YCwBιP0o>5HX>@Yf2f+k"TL/'jyJ68 0͏.*-< iN! ; `27(ʰQC&e9:7/ٌ𜑗lJvNZN5c5R^f[SR}Ѭi|Ǽ9G~ˏ쌂2 eiC??i}7- R]~%#a~1$M׎ԴgS^OydvNNV!2s~WrY~/rۺɝOܴqUr,y3S,y9ZbiHsVFvȷ`() ʫ`4[JJ9Mv2,)ANlAr䥦QgZc5nP)Y9sZ_MNϟ,2{QF^>P.@kBgS,YoRҙyrm&HMGP GAʵYLyE34.x hٸY B P!Դ 1Ț<J eѦfefbMLV&ڰ_FPAE,ԁ05I Xȷl8.}G)Lϒd5K -PmR)Vl,rYļ )yTi@ØoO[AΪ|F&xFk* xx_߃Cy=rL).ǖΔ\8%~N̰^Sjj[u2ܛk]T9mM70 %x[n|c-R<¼Na65r|0VS;[sy)pU!Rc32r+A>>؃۠$U uBXIa>bwk!L$cVL 8Ch׆$3[BdC0Gτ<.0WC4+VapRw3:7VQ FLBҊ(*Hb! (8" (NAyhQ)Ruh>wﹹW\]}kNߙϾ{gg%{2?\loQv4[,rB{̜k6ӆV8͒n,{+Kbf;޶kߴw7-jퟱ"~ogOdzFJ/kmG2{,|^v,;k :p>beٺn7s쓸nv񇿰?_U0K,LcmňPsmn%JF\فҼrʼ9S?03wXC7/7>,[UQszϑgGO{c*{GQy,k1oYNyn>Yck Orjjk0:x7rvźl|o)V=Gk6,[*G6Xy&z;s۬%Ne_$ߜeY}#jZՑ#["D6g==;kv=9[Z?C+ln6F?2槝Feۥn#ޒY?Κo+|LKy>R1+On-7=wEۍ;Cܑ}_'͎}[dm֢C.Z-/wMw9>T;7ȪHό,rǾ7p\;/Zwmgy6VּѮv9PFd~nNd?ۿc܈wGe*o@R)Ce( <@򖃿oܶw{w7R2w+x 0U2N8OɀR0 O=N p ޻?|p=S{{Ӆ%3Ox8p ^v8K<~'ϨIJrU³=/7\Sㅻ-<kj>l2I›GoOE ׁN|Tm7;u&|:˅/RiW  p1 _kKO~ nOt 𒛅o%([W+b;vpG}8 .oQ.8>'wg}s1|2͑ƭZd'E>[VwoݸY_.OݸY LƭdGwgd*ߍ[-;wg}WjnlOOJ?7n}?Q>+w'7n}o6'nleX|2qwgqG{>~~ l nl=}7n}O۾>ۋOݸپ,O7n}Gg'nl>Lݸ >qgˍ?ρO/7n}'&q볽>9q}>9wg>'nOC]?7n}nOھ>W*ߍgOݸaύ[3öƭJ|rƭ|aoރO{ݸ_~!Ӫʯύ[cVO']vq3>.ܸL_?no=T|2>a''7n}|7n}ۖ'nܯ ?|rƭ|^'ӯS>%awgNd-Sg7n}#/>jn_V~q3y9|rƭ>|7n}__ACAnOjqa׏N>LOە6'ϧMU!sV>>w_·J)ߍ:{Ğɏ+w%Um_S Uo;}Ca~Wj]?V]9oÿJӕ)>9u S~wp#ތ]Rig)>DGyrަω<K|+!ޚK'ӿ[mߍx _.wSƭ{On|y8'qϽ_(dݸs Lݸ/T~*#77*loTK'ӿMnwRkURxHudw n L"n߁VޟLe}7n}oSip!|25jݸ~|2Vwg7>'吏_7n}7O?Uݽ9gd._ڿq~Sx>Cw֟gd?|_C.#K|]'s$?_˰-ejVOwl_pG\uܸߥ>9|qySS~Rw(w(7xnO 8q >2q_W.^x |2csg_$xה_S~O'?OA^OOmߍ?PMMIx?xBпt0]H>/T Oa_T[/R/f7wOmQS澲gx<+qEud]ƭ'&ߍ[ ῡ|Cٱ/?_F=H |2וƭlWd}7n}O t>ƭ'郞 UƭS鿥|7*d+ߍ[soO:|Q/&c83?3clbi_? `=n \^}=m}FۿWoF,_OfYt0Y^-}z0l}n0O~f0|?0|T0C3̷fu~f87*`3?w6q`3j0er} qoi%`# / 3Qf}`֯ot?}K`G>¬=9`l}`o.JVԗ{8?>;0˳,I0= ė|.k>|ߟC@0βluq>%`u`_ÿߧx)nTS&{+x⑊*zŋ?%śx9A(g(xɊx)~GunP[q(WRK>?l 8#$Qf8)g$F>' !p4Xp|0&p"4$ 6&@ՎB 73?lܛjc.@(.`MtSѓj'!a&qdg(7GnkSq# @$βeUpf91 1tf/8b,Έ5;ׄZ|  2^ˀz̽2EFٲ-jC@O[J,VU'.1 ^Ж]%Ѵ` 9عF 54Qa'] jm4[A _ȩ<4*;V>k9iԠ>:/tu,56Ҋ棙1vj&uU i)OO(R߱ܟ=0zoHE{&탈Wq2'ט7d|M}w_聐FR3sOj2r2\|禽/_P'Giy+7ON) }j>SR>E*թ7Okk+l39:(<~q+G0J09sˇWVf̞߸Ws8!Ff~+++&eOWi'OM湯0sNq2%,d^ArseMd[Ξf21gWb~1/6zBMyܸ 3˪m[Lӵj2g()8K):ުkVMM(1-(/7J14m 7Zg*J&YߗZ#ꕥUcLo]k'ڶ渊cgՙCGi8YNsR6_YP3OVVM(+0-@y=?S+H+_ZR,Ɇjڛ,6C\,0$6^^LPPc=l{5 [oj٦ʳM, "\8δv +K=V9ՖTWϑ9>:Gy\g`O⯤&1I -LAK%SВ)hd Z2-LAK%S)pX7fW-1=>$QWn7=ga}{ѥg{4:&I=&i>5=>)\{ZR ֗T_Rfv<_X_LWL M5L={% SuSLd2큳ǷS<  {t4hT{ד 1[l(aMؘ$&3US^tL)U?n^<ɻ~{=r/%C);?̡'wZHi ,BL`uxa Ϳĉ[^ƿGFo9АkԨNUxCiuFW@>ҕ?PK3)'gp=PKq:UY __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/._Zlib.bundleUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UL darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/.packlistUT 1cԘ1cL1cux α 01t n7ͅnrX|{sJU0@lڢL.-VZq 7~\Ӏ[|b G?OB4"_8Q;~N-ԟbr&#fărt>|IDa7fd,V>/a AG*uz$^^RApZѸJ48ީu^k樟Yh)|S_0x:'=o/yh!яW=z?9Ǟ3G;Z^7Z9 䎤߷}߷}߷}߷}߷}&I))^3zLX pII X[NdK`u":BIp`@,Џb94CE8̡q豁z=psh Ρk=GzUzCGqhʡ6|5CA¡?ЛR7y=Cu:CsFC{szVCr}q%#A7si zCk8484CVsΡn nL+4XYˏŇ5cP:װj fCI IO$G%6yTxwsRvi]/x0tvv -;Y]%$$ۓrvIv7V )[GmIll)xCy8رFJ.R%CJhJBg4 V=Rw >A ] ўVP Hzݱt6}Xq2QGQ{1qBA"τ8m6 "3JgD~ljtNauP(! &o 8qV`#xs( @_tDq,wNl!iO3M˛7*NT=6abu?s^x04SYLtLS^DŽX5u@ L?.~cp|?~⧅tqCn_Z ?N-m8A;'Cǃz*R/Z;:FrvLB?.~1- x]=H WD(VkTS NH?^',xx YQ㙿j,ӦVzmsVN ݱx'{d L@nf8U&>,Nܜ<Kh|u8ʠ7IJk0\*4& P?΂XY8 /p.qhc$wB%R$)V> Y9ؒ .#<b]6ĺ~>A2UCiؒ78}xd?vD&9ح=¯ 9 d?%7GԻxO &w(̟CjKzSqVGe'86_v%@ (ez [i[!\=dLad'2' gT=sng$V#yj쮴vIvjru:MY XmM&x癿F',kSp CQGbh$. t7F!#TeߒJ, ޅ܁s@1Y셇!hmFep +q(H/-Gb`Peؼm h _X2>n&4N0d3d)}g*YO-ta8vmZk?py^J-&'UUӜ@RNU)n3İ].L+xlِu\ƽKܩNr'vY _aHXo?4\]U._h@jK-.r3WwB_v\)n4fnjn_SDNhk5,㬺t[t].xSSη]C,|!%^]#c5,zj̵q1t' ugJE2 |#`fn.;?-K]q/BH61%܁˪C:I5=ÓaÈ)7W*he,p9M]ƖP}]ޙ0AIcdk+^=<;%ha NqǩE! D]D!#-T=5ٴ08%OrC>l4& E3١H?%66^nDOQI`OU:YF1|2vF;0FRl̕dIZFtl(V;[*9XgpĪ`)|&*IauSO̔pR?3Y 3=PQ<1 TO}ĀII9KxJl ;Ei՚`]Fve1P6܅@>2%bi #hc4EY=(,@ |0I=qI]>H].aQ}hd0Eqrpa!4|6QpJR?AzHಃ?=;lZUɺg|͂i5MDٖfexvww38|jlqٸ@;x.O~v]~WcNe3*͑ cJ/O{{Z_x4%R)ᰑLoyAaC!Ȩ8w_2_4?8כi:q\t2 美i>w0s$ᦩ4_444Lnٯktb4K4R5L3d¦Gkտ|Ϝ/x{Y<{{|-4ܙ)?4V^BfKpZv~] Eg+-c:dXz]wڪa^=`\И#4PK|-wbbHѴ 3Q)@sa+zoPNiՎ1px몶Tj_TSj+T$:*%DjO$ծ_OڨS}v W(ڭ'jWedj!~w."ն4$O¾wy/|=%=)FbĖNJ G}ƳŨ| *yg_ZɋeϾc?AMGtK$LP:> o~gR_{͠ӯf/f0Ӯ57G.6P)l3QZ%}|y:5˭5t[35G kK5tiKz]7,pJAY3-Yp6Nh%%VPNout+t0݌w˃2/?;7:\Mߋ\wl&5J̮*3S0 ׸V@mkdcq;/~FPn6`ZiޠGVh;)),H'ne'jrtdZ)܈5T=UgZM؅Fi3^w~9')WIZ@LLKgovH:%66N/4DKIlluɁ:d0VdHJؖNX ISW]ֱ$+kKjߞZ>zV^HWRsh<u0T{}#Tc=BZL:8q/ɝmCZI Sr.L&&-קWKl I;照sic'ԇ? OTbb됟Z#jOxV/A"-;xEMKJo׻¤NqĜ\pm")+0IF.B'Pܶ9S xq'7fW|]Ś_qAVO;h^D{ akI7K/)'(y[+xmǵW ^ʻ bMPO W <,<@k#v_vJ x"O(a7d ըOdRTopMKя>6ɏ:a6-t /JWD`[V|_ _}ZÜ;FRA⭧ea$Wg*f*_T6qSycT+"L`j]?}7cKn:b$J IGP2.?78/=sO8urGkM:GذOPFM=B}j|ȗVV_W,yaMed#?J < ">yX}cڕb;iJ wćN6{TJBJ~CRa%OTlJ*?K})Uj6TJx Rija%oP2y;Ü,*yI]_薁(QX*m8F{n`b:O%~!!r^X!u"EZC`x2 Pu4<weDS1sMD4Ef >Tgo;M8㛋y`N`jY!0=u#o>L;2Cr8$ #9$ nB@=pu  VGZBy :6ܽECC3k<)Ffyv,!1z5Xxg97JM!Ta}-ٟ`3E-c1Zjn L?@g' @?Z66wwg&;=rL\(xT\h lМ;GSM5kfV Ok QΡ/le vF=ZeQs.5t*J]-TuLϑ+= pA')FP)e[*~$`8IB|56:yZUgBaaѹrP`x*PҷMNդA琟NsřRYRi flݒ r ;9i`IVob:NexS}G񵞶G+SVX{g(q[ fdy jȾ'\-dmcJř"3 OF)]Ttʂ^Ug]VϪ=mX,>\xukP˺J`jM "IϮgͬ0T\I-@JR #Qs(9nl^)ٝPlEUt^{_=n J^K%$ړ}p >W8.3P@r&oM&JMbL)AgqTAPLF⇶VO[%y^C(ǿg$ڡE9=x`ՙlFg yUٙ{j[!lՊVL9x6b{.gasIicǁ]Oy]^RI3Bɚ^m,-,z/]#'.arXZeSfm `fƝmЌ)Tt69 OWA]aDlpi`MZ ;,;? 0G6ʬ.BV9U 5ZBmf=XSp'u6Zvkf+(6J^A czқD ?-+6엔g ([p[l+v=Sf{S\|:B?D}L2̳Ɋ-5,x%7;ιiZB&k9 T@O*ɐ+4,T'd5WM)#nP*ip(  'Z\ٰY*1%+k܄`2K\X2W&,삠h';#J`6% x<#gOyq@<:3VvX\,c!YqQ!-:qZaڬ?㏖)[PF{Hkp@>M FOy6aSh}Bӗ^GZ6VvD`; xv&!f;^߂Vv6/67FtiB1 qUE3 }`wIj P_|EƬmV~Qpnw)~{^u#;^4_尩/H}"qI%#OQg;6`tK?hUX5mQdM";L`m6v^!|n\=mM?ۆq=xaeEVoeEvuX@ 6vʎj"ΰ+;wyYJxXJ,C*LՋi@±+N,Kv@>Sq&W:-pl}G1֘hؗ .|-UR΁&pᅨZVa/tx(rux? 3[aAG!H_ Q*)l#A0D /, EvJ-WIwAu{xjپ`ozkeWoufvJg,8s*.ބU4lxE=RmƑ Ε@QB\GMs]"TzPfrҨNJ>aɚЅj=j%1+)5J?6n myV4 _#f z{w$gyGxU &`y=Tݭbi+Nv4Nlo31D{SZ2%j$gSSv ~M^Yd˓UkRZY5ϚG1(݆e76ac2.ܪqDmύ'>'^9Rqx/)VT:8l-+g";mkTȇex9QjW,J,MH [R!4@V-NWx_ㇰ'c~b$-2fv09Y_dkҋ8qM_d(ث1Њ2܋Ay֢֎֪bb`:X*Lr0VN5Ji3~9(O{]DX>TJA@INF*!BLYAb0Kp&28yج,`U5{o5qs62DV ȠHE?RD%/SuY g 7YY D@T8"*0jz 8)gjͭ_qR c=4mqň6vKa~2=|#vl}BЬMyZV8c&pƪ Lo6ya>ݑ~,ȴh\{}v$o\G]>+54`B#8Ӳ%zKP)3TTx%~&*ő^=",4l|d9ZwKrp;$ rbwܑɿyv(LYr$k.;Cʀ Dli&|5HZ4gԬx]ZKhvvdY8rƗ`drɳW[*K#ȱ`5};!0a8<5#W"ſ{ S OK;1u vÓuASfIN zCC6t?ks]%lKFQ1XZVBv -)olˆR.6uap2@;Xv4­ ϵk|7ZnWkc4"\f%|*!)~iʓ!ـy-> :y$WkVM2aE+m\#ZKਂA.+;^%ÕhAv%q1XF7ױ$V-eoV^ 3 l4+is9rB! _@_ӕCN/upӶꫭC@;}cg~t&h M|7*is;n -]Iq0k6KgMvA aLdCf ƃ%D-²Mq_e{}Ѳ˽ }ղ8 "dr ڠSX'uR) A'ūBx 6Uvx-#AW2 AݒqZV yZHNndLؙELP;4 d:R°O9,ZɋrA3aUńaX%/6 Pa/rQ3apX=aa p{mJeLý7'5 ?i1<'xӵIpmu]GA $;J-G! PvGyB(QτݏCQU*ҦVUe=Fj?ROE5.jAzP%-~˾/%oPFUF*%=vz*oDOoϔ`3HRbvOq! 2>.K(R[ :ze=2Ð$&[ۆ[,ٞXU_,3%Ub6\QBHh$I@2[ǦHjghBdO0-Vb/pNٲm,lgS$66[bs$SL;dsj%`Sl,@pxʣa3x!R:~8~?UJjUYſAJT'gn@-.c ;e%̤5<>q09p aûzazmP:2RymԻ{:<&Xcp?ni)xڢ]3=mgF[cJT{ ]AM`8)}a*sc=//9UlM.}ωv9X9~ 0k4RdȄoo˃י}-Dnn. u{z.j̡i3Ӕs=Q1݃33/8UM+bn[ (Ql<@g;BQ$Vf50 [a wO0z Hk4{|ž&w:TKjf0$߄?)?S?3g6,DAD;ҎkO;k# ?Pkrwڣ)=869.Kdʹ䱳=`E#!KF 5ꄲW)ϙjWΝaw$]NHrg="$3َla^sJިT{,CWe kj,++LɈг1NɝAAlYd$ЅIzS$q_v0$."sg UJǂl)ة$ѐxcxx5PMt?n?#Z`\p,Πv', q&6Hcċqr ,:<JЉ|K$欗)ʀ'@ǛlP7`a+hE oJ|PkM{Y6yn|n4.g%x s(8E?(Z6*qo05l]~uiMjhLnx]Q}gvb U;+ ωc=={ڟd6o'Kʰ5V9T$"+N6J^AAEZYB-0XUӁ;4k ;wQb֑O26M5l!G7tHm^<f횀<2Gؐ>7 ݟz I;(Y4AQ!i*T?L-\]"FTEl &T(H4܄ K<;w&&#'8N.:]ɃQѲtK4خ qVZ ?b _P?3S_F ˃Ô* MULño*uWߓX gqRvmқ QQwx[ȣX6DjQ졸((xŬgDnP/ʉ7jCUw!^8Vvr= ɸn.DA;<?bs-|j9zGaW#vj{o=PZj[T;<>C(C]7h]сAy|- O#%a4qk!&4>њ8T@Ƨ ݀q?<^uPל8d<ljWvHُ"zoc&GxT51+K{k{d3`!Xy=8xǂ<< 2dFzxSOyY3̍yK CaX'B]ހù6@<4ޟVmv|h6e 6rNo][-|s.W ӕs̍6Gl;HeA>9JFu` p/%*πm|q e]|=ͥk)ZHŕv180u6 L yZt s1A[ 8jjkC|RvdY>T(h(hK*@;M;{'D6p 1iVsnլ$V/5X.̈PzkA.#Cdg+x'ymz#7mcG5JvR.GF02oM*~$J >wo~פl7?GYb6~R [m巳#H1hA*Evu+3La4-x)݅-̯-(wvzg&Omʏp뎳tvqӛ*Ӛ''w-*?L_rl+kƻ(*p.W#f<3iUcP4 G= /WN\#B8羹 y;#)?vW:I~5WεP8!3}V p0kQ:`#S eҬSCQb``D HTB=Ct m/ԋN**6РF07-\ߡP3F esΪ*LU> |"4 pNK's 칰0=baa.,M%r9hFP+ ᷝso7 2\~?x9  /Z[0 Wl]j>I_. ϔjV=`>lE= YlX R3>Bt mkn ƼJ p/\Ȯ\\W.5@eVV{s\lWQӐ\1GA$p4HPɻO._x%BKV9p n \s(ֲFsA{"Ϊ9eh)OdS`$iӻ'Jly,S3v)8Ne-7YRg#Oζ[Tw,V1N&8SZ_җ[6EI@٨j B*YA{`sx痜?ئ`- e_Q *`A0..LGEmuJ$"ʹZ{;[1Hm΃ s]}\aD]Mdt&/A ,T4.-NggBqkh9!Y[^ƢSIRލ:am@]yfRZÖ'o&]1~[FWE3p-8o4Hb'P{YQ_BZ5R$kL;Mo&wY:a:?heN0eI&h(O7{ q#[y& >̵Wdn`di],BS:@`P(2UZyȍFwD&nn= o k-rND˚Q_"{ίWEfl9jѰMɢlnTEɰ5 :pNjpF+s=*rM+eAқ YPpȖpġSiA>-I;E.I}:ds-`|lM)}̪{:TzK:q Ut6])T <6.bC M}&ǀLQݎd PsH2A힭Ӂ?'EmZ# 'iKif}?ӌS!oTYɡxѮ>o*?R7|Nߠ.8a}e$bv7f?fA^Ǫ"a<} pM4vt︟+-n!/3N^d%4~vc{'vvڊܰwjm4;j;6;^;El+7;K4;j'6\Oފ WAU] yg56\E _Boɣ%O ۃ4&gŸ]vtQG6xnM?1Ò XPqh$z Qq$TCFk0J,' oҰ K#!mD:Od2$ #]h,WXEWA8%J{8} j3-+{_&dg,ĉwO+-H `Jj֯pf"_8"XO|8$YvbIW^@ߠXSD eC3!&|OYhoXIS6 Px!/@6|aW(yҸx^rR=q>*/Q`}@zbFbac`}b '>1ĸO>1#OH>1RNi}b|O;ĸO>1cx?#O{ct}ba#O O1}b8'FA1OĘ'C}bL>1f3 PO-d&[Þ Ϊp–`Y5l# ަ-Z2^M'3]x|$Ȭu7bһdaK8M|%z@ܒv†V6}jnҖ'aNX!heƷ;ZOТ![6ÌxȖMA]kJVTZ38\h5!ʴ0H*AHqA]$ė[C$cCՑ5[e d{照3ȾszRq5xxTéV6OEO?M?e B ?XSsS9$,i H, wb!^+܌ZaSeԄՇ&מ6m'*8 ʣ+~[ѭZ0JX@\UpעJx:GCワ1ġd~;Yi?d#=MQzYn2GRB<1Hn,h-߫ӿyS]wa+k<&+vV`Dž[@2.i+  ]L~6-;7zaݢG|HtJ搴௴&{GqE6 zpo(2h :WeAM]uƮtDDZ!u=w?捍VC uղXM!=%GBh:-7dd56\ag Qc޼z]}eGm!Tq,XSIh/݊ b@)0<+B ,ߨ; i~ڎOk]U_nDτF_Nw'q]Hy$BWl CaZIcێcij5⦡!'"\Q"8C]8L{ۖ̓pk׮dzڦ]75+VW)|uGWt@y1QvnͅD68xɩ? 7cP;Eyqd6h,m v}װC7U|E6́t3;*OX1,N^96G )6䁲Q3c ǪWq.kp?jێPK;?1E4[~qphw.-bRx]"".w[Ĵ~{-.-bFxW8Ea""f[~1Ey-"o.EE">"Nwo쇱E#o"*Ԣ9,bKy]Yf>E<_Oj j+†3NyY׆(7+_ne^@hFiuҝB8PX܁{m6hK5F5 .=c9 ,{ڮ+ ouul;y<)ċ~ \wqGl4L#Zi~H{ӮmZMD;\C <wFk;U]_X<)/Ġ[KVu ٲNz~oYP{>+t }[e]O"2/{9O" [h&@kd{XkBAֱ.\g4wCxqVETHR%:.NuqijD^]=1zOdO ~tb5^]Dr"53xqV|Wk'xqVŋZq6/k<^׊%_+HM J_RTS*-Kׄ_䩩)͗(6,Nպ b5wS)S?jO"kx*g و5@k2fLك5Z BK|_`=z7kR4QTS51i5Z@9xDb []W@5XML)׮ъF[ XZnJ3<[JAm5ȔZͣT k)k8COjgua Dŧh)u0i{4ֺ:pUcbf)dZViT+GZhMWX]JBDU V=B޼>o˨BY'8lF1nq{0d%Zmg,(nZS:]U$}݈_k^Wc[Ёv;q௳2Df-A gGϣ+^Wlbռ B _$u:EEEz7Pyi&Q[kCI$B!5D42+fIG.&"=:-w8~P['xGݭvnj+D ?@[1{:хNPNsY[41lPĚ+AˠqtVp4fiiһnfVۻmlN޷ʓp&v:e{*4ȓIeh$w OYT&-ʶ/ r6D{2U'a˓*٤{/µD]ǡ_Pcg];=խk}/KS"M_ONffFm̉_Gvѹ륮Qk̩u ̹Xv3g|843*ٹ9J\-7Zz\_ETbIQ:_ft'e'D>T`gORe # H:(PVt+h]Q6NM։( lr 9d[AVleȘml{CJT9m̶gbmyvl5C E3P4ӿ83X b'rKhl":s-kxMܺq7̤Uq?INSs|o+8׿$(ߘc]̊SLZ&,&barQjCބM6?Mkjj g Hnka Ǻ7n2- ^l{i)Gď0VX>C^ q NWg=J4_J|^A(݃]?o{7Mf>TyQݩzO'L㐡u(IN֏g"?_{_T5~o@ ElQ  EDJAII 4M6MؤPhD);*xEۂ-eyHE|?gfnrsP&3gfάgΜYNpxA>+ך/4¡sa%$Eam6.(+Yc5Xvdc[X7,k@6ђ%69Ӂ [V Rۑ i.Sܭ,cP mn R4 sȆ,y1VPֻ5`Vpv3 5QN!  "%^-ApF`G( i, 98[K0S^"0 cY ӿ/quwoouR8|{w.'[y\osdy0d<,JwD RϪKwE(8q%Z([]y}ޓ!knV]Ƚ5idWh h*M'kzM_\&W;+,/ x5b%[bb 7Qz}Q(o@Jxz7*%T ƦJ T4Z\apS\6Z2a\SPj0ՑBZ_Z&FSv6O]+!qG8 rɾGJя50}7ްҀa^p_n*+Y!y$KROFJj0ƤED/m$ |omG^כ.z<&۔v[p&Z@@ߑUT&.ԐGBjTd]F cv/԰K5wQfS154 y >lM>V]-ez; [e&LWgZyN ٛUSS357k7>+Fhžg-[2 ݟdM2. pl''{[Z^},V q3Jxebp< Hť1ɂs2fEOEsJ[T't\<(6PAg23rNJtbwW9%v _!s c$ ?pN!>F-P9-9Ump]lV̝q#_Is^^c~?b bn9s.#CYXLxp@7/@j߯D& O vnB&RȪye_E$K/zU+HlyXJ{PM?7w \VDS|X4KqX-*wڳw2lH[tB c^)whH,jmt3s[}X  y9 ւ"|Js3s@LDƔ1 +kxL\e WH]ʜJU!w$SƱv0wl>lwו5bW C(tzbk'}C웉kKm#61~&?>#e.򝓉(9a5"g_Ѳ޸i YŤrܧ  1J*}|0Ƙm woC.T 1Ԇ7/H:i زKTXȤ]7 XT4kPv`HGOqmaqvz/ghABl^g?"Dr(h>|Np ah?;vo)w &כno=1e n g^H xS-(t;{G)֠ SQpW;~') g^O`s;Y2'|Po9Z@X*TǐکvmWv>kkSٓ>C,L1ADMԦV'js( 3* * &ʔ}XBOuWMCP; 5^gA&Xu>r7oxj1/|QK:_AD:0n^a,BbD(2ǐ]ў%;Fˍ)7;ńhu{#z]'"3:u{M*,@T6s@wsַڠ&M3i%k,bpҭz0_˘]YKyy+StX%͖i,y2̖Ndrb۵FKw a7)t+ا6;["nyY'өUbzϗJ5:"6ߟ7Y,=w) Fy*d3&Ɠ M!>[+ź?${nC;mzB3>[t^])N-6R1zb+"b5'YAcpv6J8}?׏#WriŒr4j%xVO^,_лһ:, bP̠UԪY0yCnY@,/`iw-فuچW3aLocQQh2i OG*` ڼ@DLvŬld;QN$yK1 =r j^٥jǩ0QP5eYij-3M6'QM.)r+6- 7YR~>wp)״7B|sFW3oz^ a0҉g佭aQuF|l772 mPd#_ (|#\w3)>|i4k=*4iLQ( `~w/Po+a[n%6t񴛾 `8[qgS: N/pB~sd'`X_b9+08OjB4 $Bڜ'R>Y9Hdl&$f(IE v4YLi0,$tN/ T;N/=T*뤶fxO~9MFvY> Uw &lS ^.-(ۇT4Ѯ EOz11RRx ;,FfוӮ,KG쫼=(х 5G4͆F^=mLvALdp(NvΜBy';N L7bpuzʑ?ѹFd%[ҫoETl3T/jZJ܉c]c2rj+*2$l0茥k)$-\OtNuK' 9od%mKw:/hb/isiLzU<J0,:Z3$'FpY}"#W(pO\a=+uJ&RQsoCt$1oY%u4\4%`N-:Ný2!/jc)AzeJw澛֍r UiyGi|>zB]bfQ<:LCV %ÊD8E[DQUAPM⠏DW7y(>(ZmQE``.T{TJܒfpݝdzi4vPdx]P~RQ2{B uy{Xk 5T 9.ƀF55-]Y&@>g*m~wK,]di3c\Ƹd͙d=*[ XL,$&o QdW&ydY,Hъ֑\`GjO| .d9(B7 E_^261 -.-4Hf@"roL~"d)|'drw~>rK&ɂU49sY&,kA} 4J>V.P 1gb&/A($\H؅&!HgC({t _s߷i瞊{«ŲD #wBBh \)Vufwp^#E$d ɧp N#\֮;y:ނVDRZq;ON`}#GD&g\eϛ.@2Z׎-erJ3IURwW@wߵX\]ZxZ/|pcx0?~yʹx2ɗ:a?jPj ;aG#[]-F Ų(qg d?ë2;%5 2  #0aG!rG Vn:~ԻFp`d厃GKFF?h mmx@2 Մt'VY*hbd_qD3 ьhFA4 Q\Dk((E5 {vŝaÎꝚѫ3vЋJX&чr̮QJgޓT&82'hŊݟjdJ:.O?/!9)#>_NW_Mא!'7[o$m#_L?!%俌" I8 c'GE|< 1#ԍU;8eq$!8vߘ%&ӭ1C7vt=~?ј77ڈD,5bmuǙ) y5`Abӓ,6T4nMխ|Pc4]HLF:}GR7ƍvt@.+>g&My0ɘIc=xxyO=9W&>e?ۚG;YWN[5ͩS KAޛ\/R^΋3֭KoϜ)sщq CbYc v2bm?gyh/=K{y~19{B{S.`؄:+>iYFs&Q.у-epOK,%rDzߡ Nwaʗiɿ>ivTqwjZ7qn=:uH֛m~zo]T,Q_zujU.t=r=hkqen~۟%~yOvVW6cfTad.yf_ytﭗxQWC~fu^ɏ6]Stz`+%?Ѽst<xkP^VW !CN}_ӾK{g"fٹ3om1gy_L绝g;x~Xꮵ~o6\ˇdUogK3_xCk6/3h?޷5cR~Ʊ-`-E/Uf[lZӦv&0jЋ/|Lu`$AAw̯> `/pq׀#n[>v=C ~Lt;@ㆺpB`aNy?~|`\|-*:uA00`^AļhlWYG3KESI` :# 1Á>?5 `B~w)=`~ ? k+=b1} `?; $=හpk B'e0s.?~u0~ o,OH{!ti=t{$p w@ cpp/З Q>Oh~gw[кCH=!6 6/fh?S]~isUֻ~ WQ}*# x$©ĕ۰*Z6L?AB:}7_c>¼@õ3%9?@~is`i`.1p/0y*J{;ce_ z+gB O_pn95þݑvOD3>c1^)9eDY.Ҫ/LdeHWܟ e<2+Aǃ> :8]ahpAE [o"G=mVPАob>&'[Lw'wC;N3S^(~_]xd0sl/#TTޝrO!O돻<3y/9l7#MsF>~N``)~OO,s ?1 'ga?|9";ԁWc~>y ?Ah(>f}{j߂mC_ܠKQ(Ƽ}{., t)ao<߽:8V4^tA0?) t^f3ϨE+G4% bc:/ ZciжڀcT5=՜gI{B+.r~RڀP 7stkFƐ!s ! R3T{g[3l IΩHm؏24f'MXؖd[FCq_ՙl@al{c,՚9nh #FlΤ R5)as螔\Hh8נoP ڹq=b8]՚'vFغй}tl l{F+.c6=CKuflsrRFbp%kh;ѱM5&j"bƲu1cABA9!4N?A/;)2vȸ;fd(br oTjdsFsΜfMM 룋OYfNLo &:̱L4[a`}2o0 d8+Z3R >䤔$;]h2R ӭ`kSh!:osuyi؎\3sqAݽ CP/liYk^cZځP_z׫̳I{U]D;3!ad8>|zHCzx Y,s}7d 1lMYH ى1FR5I'E\(y'&%XutEk 4\fAa<]:8zyh]q fo~9 qB_[jn~1ZGS@l h4|0LqNxvN)Tz5;ҟSqo4`9X~,&8R,wqZ9 Vys3@~ H~ڒZ⪈ReT13jf6cfsf`f 3[23[3S6lL-3َ1vf3=3`̼y73;23;3 32S{y/313ݙك=y3{1o>KLW~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~W~Uҁ6Pn]Ͻ}{7 m*w : tAW4q AYA*v)~ tӠjMA/>пVsKAoVs4'z o.}f7.:>#=nuحqtyf\bK[}\f9j`cNrV9''͖Ci (N1eb\511)YJ4Üh͘nU>6f7[fMO͑f HG9dCZ0i٭^xږuH'Ͷ&%RCQixSmܙ9)3 %H:Lӭq 'oY{`lYh3y 2m6{5-)68Ü1<"e13>3.>')][mhqd_szG[\jk%m1SlB--=)dm5' =W+a{S%t87/ MA#q3R쏦'AύWskrU{TIp} V 0n{ ocU]l ˂''Ofwܕj!^eLM^1Yn8} ]؇:ARb=>;nDyƑ]WXH,9wO?`ޗĭ !߀]j }FFkjԯ݊K U 5N@DY1c; !:U >[1$$UZ\8zyVhV ޥlEfkUU"-T߫$]6']׵@}\M~RqϷyMnr{8n({h[Z~[np3ýlhFgE*\Wp#K/P22x?700 W2 SA3X7 s >2x*=U-(\A/5Px3R5E ~D >O2x#{[=I ~/·3[wcpً)<'wRxR /\P ,Qd@zOVFx0 AB`ǻy9/Vy _I_Kb|#W~K/=G%hp1×` T/Gi>%X# >Wm}WXD_KEr-Ro+_ʢp7/~Sa/~%~<ßWAroB[_֖Uf җ`)vW1wz_w|/+E(u27V ?VϨ--KoyM~YB#iDӗ`) yMnK?ŗ#~`Y )o|'|VPÐ, PK} %??~{``?g_. bS~1XjKeQi_;,}&zW(+ oIZYR('p^  xT_+ VMr>WpsjTPUj{z ~@ӭ;=H#"=(&}Ѡcx+Ͷqǃz"I<(_stp>޳AAuimq0?eX `nu#Prd qqP'>͈ot0zv;r˃8˶]Lw^&Y;quVo7gݜ⪯y^k0#b ·og4Mu`|' XuFBy_ji$sc%Hճ ѱFBܸr}6Z,MZ=U,k"3&BDHsR({,'v]yS#HyHsBB\9)JE%290aR,%xMR%}+qd S;I eKh/yGoX?2ޡψψn#?2#VgV#̉t[wqŢq -R,ZDpz@T4S~0+gV~;x5$e&viL7s,ʵB+P5#=y*$_IPRFJ6[PK ] wPKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Bzip2/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U\M darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/https/.packlistUT 1cԘ1cL1cux L*J,H-736 (/O())(+/-.ON/H,JMacz++++cPKN\PKq:UX __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/https/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKPq:UZL darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/.packlistUT 1cԘ1cL1cux L*J,H-736O)Iw*I̫+/-.ON/H,JMacr++z++cPK&MZPKPq:UW __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UH darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/SSL/.packlistUT a1cԘ1cL1cux L*J,H-736ON-+'&?"}ϼԢԂb(ML.MKˬ JChIfN1Xeiq~N~rb~qFbQ~nb5XYAtiIQmeQB^@PKIlPKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/SSL/._.packlistUT a1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:URH darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Expat/.packlistUT 1cԘ1cL1cux L*J,H-736Џvw(H,+/-.ON/H,JMacR++Z++bcjPKeIRPKq:US __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Expat/._.packlistUT 1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:U G darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/.packlistUT ~1cԘ1cL1cux L*J,H-736ЏvwJ,N+ǣ43'Ȁ(Ե"9$3?ldiq~N~rb~qFbQ~nb[Y4&V1CՄpHPKx$;Jj PKq:UR __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/._.packlistUT ~1cԘ1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKq:UN darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/Expat.bundleUT 1cN1cL1cux }yXUUaRT3)(80WՋZi 2*( +je9i8ZVoQY 6!w9>{xιg{Y{<|珏s q /s|ڐeN=^?i<]Yht9>,Qgϕˑ?FGg-2scgyIzbLsFRtIgYUhKԸԄ4 ~q5x${Vx'5d勱WYc0vƾb'` {c_f16c,c16ccUۻ?a_`&Yl1_b,b#k_c0 s,6c/bC1v5`U$c)~8cgXnF5؟>`đۛŖc c=Ya c_a:cX,Y3{N;8ba}sYl{uYf;r 킱wXo{c}1vbw`ƾ>%$ƾ9c/D탱a;cck<.g=16cNdcGal$b\1v b*b1}}V=”3_<1tBhTqU&=_q/򂟳OCkd) JGx| b2tl(w_\Ф!^#m Ѷ Oh%:9ys]&y@CRN¢dYmÑ`4@xcd{ȫPk}1PF 哺#HdYBV$ZE,5|J ܇? BMuc>BV=1s1^6sME $1X{3NV4E#ɵQ8Ht=5d*[Fmzΐ_l%4V;V$3g`sc/%,m!*ك yZ^)\.zkT}"f|#*r3Dw/ȯ2 wZ34,h>xm 5NAitotR g@ӟB'$!HgW(L'fd#uͣD< xBz/eZm9x*M_d*r"/)L^9>6%Zո/zd/ )n])%FȖ?T;Vl 14na5xB6[DWBZc?e?Ie,E?u!C'N }!4zJ)_a;WľFD?++.ώIÛq*v8} >򗇄`h{x>D><,g= CcZ/l]bf/g=$6I=&iW)bx='9:taR0l /[*ud2("= (2>xڻ bZ_〯9-iZ=)H)ʞTH*}-KCV6~V`D? Lm^h*O֑Q] 윢?3S==?Bi$яhHWK֕")?)G.#R/~YbEb/-ѴnZW)̀Rpc)5LE_6T-!ӰTΔYъ{j k ٳR8BBl+Yqge ext ugճdGH;|pSͿޅtGC>h[X0a*vrvJN$$Il2~@RNo*fgz-4s@uDeddlFf>{1|$^Y%JCK,24RJ#J9CڕK:q訞dYbMGMcGu93ծ:8EZiQEb .R3*GD⨾9f;*2n|zb9Y6(kg,g9e^Q93JƁs j~F}92tNQL$z?/3i3]m2/qU ~[c`6,\_uGG`m GbsGX&EڰXŀ(b w0X4f߿E#eZQ" ~|X$`V')a [B=śGb3`1#Xzb@x<&R$2$F%m_+0p  - ,VN+C@ESoI"ص"hKfFl)_c)-@,||X=eh XWwPXdb2j;¢o4ܡŽ`v.-ű׵g/0~t^|v3sEH(gCa潽Z>uNy0ͼol'I(Oߛ}Mt N$*g.rA7~/fo]@:q"~78;{aop5 ~^^w^+V{ݡ&mJMjmCM Z48oVO\~m:[%Y[oCE$wm/aqM-,nцż-uń-`1dK]`j,l`f`f%,aẩ6,aq`rZaG, زaG caecjâb/&%,l'`1L),,&5,:orDX{1m _ot",w!, xuF 7j"nc`,|75ibޫ,CX2X|M B9,~PjX9(T"UF85%,n@Xjbn9,<^{ X|]X*ai?iy ỘtxU F:ŝ ",_a >ߠ `qh /KpށX6,67Hߠ uGh._тE,.E _Q¢HO׆E w g_AX`2F%,#,`9,x1`Qv,㊗p_Ob ?赝YHհ}CX\/"acp~ ow֋8VE/Ն"az kb:zG.h,"J8!,,VS¢X3kjâX בӰub,:efm)aE,.k>>,6nc㟵JX?MN51 y]g׈Fk"w %X4ނxn6,fleY`mXtZSX#XTTX|I VKCX1XX^R¢L=jâL g '_BX`h5#t~I aeZmW?,^[?t?2H OVQXlbrcV9śDX \J%"yE,mDXhO9ۄS[Vq”cUjPtF(&~r~ ^1J)G^^1} h҈x:'M=ma^i,؟VrlZP8$r&v`{ \e/2])낀^ٽm2y ,eAZ ¦q2UN-i,&(1|#IDA?zo@ sR ӽ#d9BB =JW,Ij2,*dB$[%h _my{p9+^e_!ygWh2 ]d C2C [M9*6Ҷ\i$M[2'OM:6«6Y3??T=ŷlR6^Rsr)v&EdПXiB8QP`)3D]1Y.+cL>Y^ ihx/aM1\mc;plCA4W? nhi5\·ݼ,!)6^θew7uވ>GKp+.u6uCNr9m, xeJ _- A%at3R3xg XHsPJ_^. _/+i ,%@Ay+P{h=:KKk"uel*2%wX5< _au*\u'W[E#!QV aD8ʪ/dp2}K;tBL8[6 .*GuR*mpBeF nZAJ Gx.'CEg\UE%dxw NeysbX˚jJ %Pf(u4Зq+G$>tykceĄ]eܡ/é(MHOp7h!ghG# M _4TK.onZtp[5o|-evg/mA|R4iP^YA6}0h[ }1_ތݚЪ5K.{6O7%8hTFݨ[HQDQq%+U%F^SNZ kXGig4&v;> wi(h都Uy{It0Yý̷&f=̣[NO"iRV/+p!}x?{CżMrgH YMds; ˎ 6O86H +O.v2ŗۖ'uyp~c-O=OKGd4tP AZ;ł 9"o9TYq{JæzUNeu0Y?66 JH9W<4\&[.sD-I3GPuCBӘ{MCMn`Ns3Դs|SCuM]['oM[1 7\'y]l0lQ0_ ?Psxa=?GU*8-3rJ7-wh9"]Kj-(i5l_=,-'K)Ķ?! * -/fnRhoN1Qmp>K~HYl*jɭYf A&.F0 y!=4Ϭ=^Ƴ4[,[pE~h͛=^Ͱ<˻BhFξxʧiXS­d!*/F){gRk_G)y~%_5Κ}`v0s7Q9Tfh/B~,o5D̎Eݔ͚Zhs֟e[Ýr ;e/l'CN:El9coE؛ =/RAA䄉0Rf򴓒줤gjT|4{ڋQ9l٤w&'.tTfaQ QEuY)/?"'.2 Eqz)if(pET٢ &p/WE=+!aE/c.h o|Q(~>X?](=.fR.qaQh/.t.itN(b+"Қ($ONs|TmX em.Q6,~K,>HsiZh*"9!,,iJXTa1?6,հ𝏜jR*X|``~EE,.Γbcc"5a1oo%h䧄 2 ٟk)a0EG2c03ER"$EEL  ,Z8!\lb]SĆ^dbNv0lݙ\akZ17pbGOO$:lLG3|F}Ma2Yb@{5љ5j^@XY3 q3a8J;S12S6Gs;I56S>Efڮ!Hotɖ%;V~xi KemcÁfch Nqx&66b{ $M7R>LT`Dmo5CT` =˓(xC/HIR`DNLO&}`v34%'K:&~4t#O, ;Hh6tԓb6y$| Vm#d ಎ0 SbwkD 4E vD =oA[EK{vcwuF.&:{H_FXm%W( Hģmqo+t\%!t Ikim׍`Ef#YӒg H~44']^t'ݾ-Uty0Y$03a09O:b= 0RھaFv}Ol7 i-g'pmD?k,ŰAD a9z-N֚Kp`vLg?t- y|wg@D* 5Zl( z06{ƞ, WuR]Ȱ8!xEH _^F1[yrFk"ZpwSE4rjce:&ɮĂx+? Z-o_QFkXNؒrQ&F>sbE *z8C1ޱCX竧2ߦi)Pu 廉~z"}C+` VKnJ}4PWV2uj0Z}u'm2:sr2pm8 ~θ~rcFf`c}2ЄcQ!TMY#}eTdhʅh{* -xda#}q(i7|}E]!@e"ywЖDǨ7㩟򜝄/MFlh OVRF ?*oL.oRT4MAiBxt(f뒓hE?Ơ8-~ޟP$ЌIMȯT"5$d HbC&GujD.Ey3%Oxt(H"ZAA"џIM2Hf&^D($RB"71ϡx[O'^ɤEFcQ<'G <=Xrr/hTkb*15Sj}&uYBf&p GE> 9< |UIu D=?Hdr"Jd-D=Iħ HsT"4$R$HB!EǠЇ0%j jK?΅j_Y$E ԕk$1I3g2M|dJ?OjXiuhHD3 AhvzT1VZ:ZiXZ]C\N=n}=z1 Yf"lSHdJFqoQD_OPE[66zQ$%HW_E3bF4y0c(v1V&A r'# ddЉ*]ڡNTLXP3D+ /(ڍ\4Q1AHТ w7sx|whl`bqL6ӱx3b&,/zB#I%$ݕ@} `x~y:Ao$c DQ㡌wdi{ɽp$8nK\~)w4((_=NT3|'{~g4OG{ali%_>aKyaqbWa5<^jfxƊEwMxy_7VUΨRZRzv<ja?FAV?Ѭfr/!]؟w3y2p5cS1·3ݝۙ뜊PbY W#svY;/ ^A嫪o }'>UݑLu$Rfg nMi fM.&xZ?bSu5av,3ևX@w!`XK´wn*'=;] \)x/dd>83V=:cXV fE>Y$˛QU$g\GtVeC&ՌcАkXg9m Ocp} qW7Ac4vCQ b1`UJc14O3|EfApk{c-dl-[m]]د!̍w,_rBJeCx2x98=+t ~~+%)8mW7K tW7'Z<՘ZHq6"E{4F eGs/r y2?[[!d ' ʋn*^YumѴKG4Jߖ1d1Tn6g|$ʈrZ!%Jo88Ϳ"ȘeϩlƬA22oT}8@ K]1x,G]k A_gK-=i/ fd^= k Bs8sk%*p{"v&BL軰D/֗["­j h^ɅM.'tC\k&,J0o"8 }ţ}S*__&=A"8ܬsT:_DtIߓ/v_үZԇ@( jC p̸ R(9rEP#o3x-1- u9m4 ,+!: ?8Eʻ8 g1wMB>b!o$J #. ǝ'D2"ЦFlO|oR{g/YLƢ3;/~忓".XNҜ–eNٕ^3X-F"xЇt_P0eTב{ϞR;`~(CQP0:JHSWDbQ0?zV2w"z+Fy,3y` v2lR<)` (?gUƈGE"-mڂ#iFDo+uat)>e)=>#k˾Hul!H j˾n=(P o L-%YI𽜤L4l .n7 2`7Jo++ƷeZʛb Hp*#T^ܸ[kpwzEi n=,2<2 jO:\_?W.OX40uApD+ԑe"%OFHKnԎkdYrEX|8gV.1>SjaD%SzRzA{F|\=4 <6ǿ11zFzL> <=\##3뇄.;W9ФXjt8#| h}?Vqk ~Uƒq_IꇣװazyWci \%Kcʺ,oi #Lkz^KCZ:V-a,2Y_Wp,{@fRwemeI6S:=!kaQd ֈ2]Nc8]W/mPR'0Gga2W:1a>&a䛧t+5.gt3gYGC^Pɀ0 hBJ_)C)l T'%Lh`>9PaM)oLb)sdQMj0!"ᄒãcT^0i)fCr{m”7Lf)9~e[*C1)Cf$D=XAh/T6`\y]>i+7?B2Nς7Ltl CB4,YP% 6BM!8`s֐8 8 !2]m%i.ciJ94JW} A G p05uBԥws-+[9g W , UZYA2U ɀkQ']'?Vix:E[!8YF``C<KߐF5!,ïVm i2iffQm\ fJmrFc&"kg4gi1d旡hm0iB@^Ǝ3SSxER)C5$PYԫ#;֠*jJ]NPqn-軽Etۨ˞ߓL? \6g~67f0]U ,v9k<2DUBn/=`)"̃iq&R5\Ga9pc (o2&k1 ow`a;R@@ă Ht`Wll.U˜l)ei9<83.cPĹ͖Цc i $Ygcͽ*.@ nA7΢#1,] ::݀3 Y-0Xh9l`hQȃ=O +TffH%=@a2?x~Fj側Sfn&)mnHAlWS1}/K[3X$̒ʦ4BYN5$ul"ހmɆ&R-NH=Wc7F1ghB/ǞfIs}$xEqC jSưkMoy2ރy8Pieʁ_@Etv̾,{}FI 0X% 5J=@Y@ ?H"WWmI[ ./ueOkXc*'7,pTxGk715]Cu'o5h ꞌa)؇Оړ$J"* l0?D]~b52xiY*{F{CEv5T6rb" q0vD_TeݟP.NQqJxrMr#GJgy:V PrG;֦PT짨MUHcwR~})۲l|vet茂sൟ=E2'_ dWZDi+5KyTRjNM̦H.Bϫ/~~]򭕕u!TbxJhOC: ڑAU;HdG˨l!N 6-(OBmSňSCs0OOs\s!_r >J䝾b&AB&ch}5Kz'43dh.ֿ}hI:(m2a]DAX{ߵdS`dξLUi?W-{J,Q: )ǨmFl j?LIwVK1tNM֙&е0$GD:U]=pb[F^~ޕK$lN9vX41,Eڧ5 K:mJ!CG|hoWJ .ݧ-}j`S2Cb^5:bfީ(={uƺUO΀&HTYKtS׉"D RY@ԅjC_:(6Cz BH!(yRȭSSۮNS 6Fth4= ?Dx7EJ(l76X76K)dXY:2ߓ]L ".*'5{RRIE^*AhQ/ЛQ,N쐄W.TA(o:d)sijČg B%-`w/h!/vҭ;C<*zjqԔj5z/k*zsIݧQĂ62 zYє"W*4oED f L?y~RU+ .uBG.Q']⎁XOj4I a^q{ϞSA0_RkVh6lne#"2}/"te*l4Q⤉ ;]>j7N9 Iw*#4)nE ŭH}P@:c">r :}DbAt83R3i|.茠H&y\ώ3ٖSbWy41X %L-V鎹zZ/v/-!Y$dٹ~c^2vߌ)9\wl~_WݱBu?l a=í>o񬱦Ę{ղqX>RFhO Nt]#׆v"JWׅ .)S a ?wA!f> "= |W87:UWRڹ& ΂M\WA"/$"iM޸GXzNW<އ0*^X2{I4YSe0&}R7A|#4"B a ur_}\"=@0〳Ϥ"?SAJi(–B5q`1\C7fOT>gH놖V K|a_lq@VhC~.o P0h}#ƛg kfvO`Uv)8s8C Wz*HlbZ]9mzʻ)-3M|y-S-7ֺKdá7mË*gz1]EA@鱡q(0of8-Se6eh ^9rj6}8a; Uݑv艽 6tS>}{=&=bPJ6X 0XzrC0&$``ˊ 7y|g GaA2-WLF@mAC_+ʊ_^bU(, jp/ys[)L+ `%Zc{jz[z5 Z ?__= W`Qg%-Y6]$m.[^ly +COYdbb6ƚ 6h/z/dU4˛tV&i)\qS%焻znIZ:xQA(d)&*\fc̝t@SCК7aciFMTT-$|7i&nt5IbeznB%&'6C,SCOf69\U <պV.Ȍ=ő }Ǜ*\gA4b5LSi0GJFL-(Ӭ4T:w R! ڏD~R3%/AfB)-')SZ4%|PNDͤQ@\3(`(7j?WX?F=(6$wHԹ8A=Tj?ٛSZ'ꇞ%~ &l2wkSisڦXu,r1 SxH2*l޴>MUI֓15iOYGjNatOUocZ8*U%nƷ gXAVa󐨃+VB+A}cKm8ŷԷV׷k}jτĞE׀gz"g.vOsH,p|TGi{1. ǷvsRZ'F+

{mB3ZN2"m6petN;Hyk|#5zJ5^5^gk2k:fЫ^gkΥ^su1z]Fu^^_M^^wzG-z-6"z=Iiz-׳z^/k^+UzF z^?/赂^[z^ןJkV^+ WgzuzN Ճ^Ы'6ڑ^3kWrgǘ{rzӻ׷wܤӠA1Q 1,#>cc2bxF_D3g$NbNIvLx83IOOO5bR3SFk1 mdFZl|f&15Ӝa5':"<>!ƒwTQO5'&Mi(cHYD1{l|II:if)).i9o.u#$ut#ȴ$PVXZ9> }j|AqcR0S ddYjM47>/LHKsX))5~%eHaiɖ:c7g9Gl!#ifqPaZ)-*6-8ſ$4=/2XX{bKI,bvR%9nfRzKOC423gOTb11r YjaIeƤ{$Q-)|LK*bH]RZI!~MbDU+="e읐睎Yd!yM6#>1mzǦY aF|fZxxHM)Gm:4G19ThCLw2Aor\O `\/LnPCKgN':)5:A޴ZޤN&2m!f6[`erI2it6 ScR8hd᝚fIfIحw,gRqI)x3X{ěccb㸱y읖@bSHI4KBɅtE+= r 2ic2HMLOi{ $$#.Ih4ZV-nc,ɟIGHxgd*8^"SbJ>$؆`dE (K ?A̍'8%s|t.,1)94(\0׃{Rcxw㺌?e#"MFC(KCT%JI&ҖLV^xQRhe$"ij8DIq&8AČi Ʃ HD .p"מ}a}InNM:88:҅t\3n>ؽ>{vo݃{vױ'7efޜ[{Kvo݋۰{[voٽwdNO{gv>]ٽ{wvO{Ov)vޗ{v`4d@v}e vfveag> nd>M} G3GIQ]y ?\%@Br\I2c"D@3aPtWtU≠.Dn%A͊QHV.fI`h$DY=5=޽=L5?rv9ߩU^znpێۥ2^帽Rܮp6n/íNfpS0.~;*|.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$8y=ޚit&IHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHn;)ra2ra+7jiiO@uM}à)k`PZ ztZ8 *mtdY-@_=z Xo -@wvF6X͠VAA?Mm> ʂ : =Z Zz4v$4:8 z"q50  z4q50t4$ ttһrPX8.h hcԤqV\P' hh8˲awqo\^;Sp \oJ~ɀJЍq ~,)T;=g|/tXi_`W\uX tN6kwa, B'N/}Oq:E53=vW_E]m79eKڗ &y&vte KvP?V897Ե32u%ajxak\! |fb W!EE:4NeHQg 8at#x|oP 9D-{,38X.יw@^yb%^^nfUX8Rw v;^6vz.՞J!lˮy_ny B9y^;- q''0˹*n_ -~RUC֚\g+U`/xf򹼛9vVbN< /4 Gn-p),] yZN贻0{bKSv2pB!Ibjr^URek5s͆gԃX9E7(9a՚rp`׭j*&hʰg:*P;_2~54]R}(|m:ˋX=GLwsxIW)/L %xjNV=QQ>]S^XIKѱ۶H5:j[gw]~{u/mF=NѰ~MuðsҪ#uҷ6Rwsn9Iu_Oon80я.ܸ%m;;]?iYca"yt;y4| 4߈dm?|'4/AW!~旑uSjJͳ7^k5ߌڗ~#oN/~Usjj| ' ϹI)^GqsOm>d%]<9|^ӼyFw<5oE?AUS'|ccț5=tYhj knE^++GyA+EsX ȇhy4oR uzS.~y0LEVB)gњ0!mfk$_ VAky7*qo6u'&{Sqo6'&7!to曍EOL'ͼ f^iq)OL8?~/i>y:'ͼ|if^i~'NyؔS8o敟oOLy~b+?נ;g敟e~34_o敟o|5OO~bg~3]4O7Oo3W~C?qyOL++?[z}o敟 OLv|3pOLo敟#ף8oe'~39~b+?FM~b?f^i=Մ~bo敟__]V6~y*v|3_p}w?yOLf>:>o㯏fo敟֛wY1Om'&h+7O]|d^O;z ``~Z_~b_f^i=#7O{d~3=?p?/0W~z?0I~3> 3f>zOX5O+ 'f^ y!GfobŽo敟޷E?1?3q?f>}'&iͼ'NyE?F?1aG|to敟GD?1mv|3 W~z6?G? ǿ#q~oG~z6SPIm&27uRޫ P g3naJ%ƫe;e4㣌;_g1>q㕌}zw0nj0~[Gq+K_x-;og(8U0nf|e}3x'-#Xcx_`| w1~1cYaq'kxxv`\}~O1~)=ƭ} tFM}t3[@nK)=} mzН@w'= {AݗkЍ@@Sz<m|iANA z(J5ɿ;j<7O@?= YJ R~zI/Rz~ 4г@=+Ћ_^&J10跠#ߥ߃^+)j=j%~E*boʷX[-Vo(PN S8\:լ:ŚUWW#q:s}/)t|2jÇ&|⓪&I &Iku$ī<4԰@y/tm:;`&U'A'A#  'v95>N/ڄxnƋEj(O5dB2l67wyl푁 78N]679NmsT5y^2#>KJd驓TG ǫr+G=*OH涳 ԃˡ?5/r{O'\:ץD'Ml:[v%n?-Q_\vi{G!cnl(;ؒF*Cch1B]>Zjұt'qeJ?ULuˡ|& EPs艛Yjk-S;vtVixkާ;]v3JRX;acI(\@08JGwdBkMsprӛ301Yӡk4tfYg7<{zA[Ѧ9EįnEf]2Y̺d%.uɬ PK_8lPKq:UY __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/._Expat.bundleUT 1cN1cԦ1cux c`cg`b`MLVVP'" 0CBL@l!.XPWXXWPo``almfllhjb`XimffllklkbakifknfjhffjPKt,PKu:U Adarwin-perl-deps/UT 1cޞ1c1cux PKu:UMѡ8 O__MACOSX/._darwin-perl-depsUT 1cޞ1cӦ1cux PKq:U Ajdarwin-perl-deps/Proc/UT җ1ck1cL1cux PKq:Ut, 큾__MACOSX/darwin-perl-deps/._ProcUT җ1ck1cӦ1cux PKq:U Adarwin-perl-deps/Compress/UT 1cj1cL1cux PKq:Ut,$ __MACOSX/darwin-perl-deps/._CompressUT 1cj1cӦ1cux PKrVTB8#! darwin-perl-deps/AppendToPathUT וbM1cL1cux PKrVTt,( 큒__MACOSX/darwin-perl-deps/._AppendToPathUT וbM1cӦ1cux PKq:U Adarwin-perl-deps/Mozilla/UT 21ck1cL1cux PKq:Ut,# __MACOSX/darwin-perl-deps/._MozillaUT 21ck1cӦ1cux PKcq:U Adarwin-perl-deps/LWP/UT ږ1ck1cL1cux PKcq:Ut, 1__MACOSX/darwin-perl-deps/._LWPUT ږ1ck1cӦ1cux PKq7U7nD ! %darwin-perl-deps/Needs.pmUT 5-cM1cL1cux PKq7Ut,$ __MACOSX/darwin-perl-deps/._Needs.pmUT 5-cM1cӦ1cux PKq:U Adarwin-perl-deps/Net/UT 1ck1cL1cux PKq:Ut, __MACOSX/darwin-perl-deps/._NetUT 1ck1cӦ1cux PKu:U ]  darwin-perl-deps/.DS_StoreUT 1c1c1cux PKu:U 85x% __MACOSX/darwin-perl-deps/._.DS_StoreUT 1cӦ1cӦ1cux PKT A}darwin-perl-deps/libwww/UT t[ibk1cL1cux PKTt," __MACOSX/darwin-perl-deps/._libwwwUT t[ibk1cӦ1cux PKTEe 1$ $darwin-perl-deps/lwpcook.podUT bM1cL1cux PKTt,' $*__MACOSX/darwin-perl-deps/._lwpcook.podUT bM1cӦ1cux PKq:U A+darwin-perl-deps/Test/UT 1cl1cL1cux PKq:Ut, +__MACOSX/darwin-perl-deps/._TestUT 1cl1cӦ1cux PKq:U A,darwin-perl-deps/File/UT 1ck1cL1cux PKq:Ut, 2-__MACOSX/darwin-perl-deps/._FileUT 1ck1cӦ1cux PKOq:U A'.darwin-perl-deps/Module/UT 1ck1cL1cux PKOq:Ut," }.__MACOSX/darwin-perl-deps/._ModuleUT 1ck1cӦ1cux PK"q:U At/darwin-perl-deps/Date/UT a1cj1cL1cux PK"q:Ut, /__MACOSX/darwin-perl-deps/._DateUT a1cj1cӦ1cux PKq:U A0darwin-perl-deps/Parse/UT —1ck1cL1cux PKq:Ut,! 1__MACOSX/darwin-perl-deps/._ParseUT —1ck1cӦ1cux PKq:U A2darwin-perl-deps/IO/UT 1ck1cL1cux PKq:Ut, Z2__MACOSX/darwin-perl-deps/._IOUT 1ck1cӦ1cux PKT"va $M3darwin-perl-deps/lwptut.podUT bM1cL1cux PKTt,& $V__MACOSX/darwin-perl-deps/._lwptut.podUT bM1cӦ1cux PKkrDG"p $zWdarwin-perl-deps/Switch.pmUT :(SM1cL1cux PKkrDt,% $z__MACOSX/darwin-perl-deps/._Switch.pmUT :(SM1cӦ1cux PK!q:U A}{darwin-perl-deps/Encode/UT _1cj1cL1cux PK!q:Ut," {__MACOSX/darwin-perl-deps/._EncodeUT _1cj1cӦ1cux PK%q:U A|darwin-perl-deps/HTML/UT f1ck1cL1cux PK%q:Ut, }__MACOSX/darwin-perl-deps/._HTMLUT f1ck1cӦ1cux PKXq:U A~darwin-perl-deps/WWW/UT ɖ1cl1cL1cux PKXq:Ut, f~__MACOSX/darwin-perl-deps/._WWWUT ɖ1cl1cӦ1cux PKq:U AZdarwin-perl-deps/XML/UT 1cl1cL1cux PKq:Ut, 큭__MACOSX/darwin-perl-deps/._XMLUT 1cl1cӦ1cux PK"q:U Adarwin-perl-deps/Time/UT a1cl1cL1cux PK"q:Ut, __MACOSX/darwin-perl-deps/._TimeUT a1cl1cӦ1cux PKq:U Adarwin-perl-deps/Mac/UT ×1ck1cL1cux PKq:Ut, =__MACOSX/darwin-perl-deps/._MacUT ×1ck1cӦ1cux PKq:U A1darwin-perl-deps/Sub/UT 1cl1cL1cux PKq:Ut, 큄__MACOSX/darwin-perl-deps/._SubUT 1cl1cӦ1cux PKt:U, Axdarwin-perl-deps/darwin-thread-multi-2level/UT 1cj1cL1cux PKt:Ut,6 __MACOSX/darwin-perl-deps/._darwin-thread-multi-2levelUT 1cj1cӦ1cux PK՛P  $darwin-perl-deps/TimeDate.pmUT ^M1cL1cux PK՛Pt,' $__MACOSX/darwin-perl-deps/._TimeDate.pmUT ^M1cӦ1cux PKkq:U Adarwin-perl-deps/ExtUtils/UT 1cj1cL1cux PKkq:Ut,$ o__MACOSX/darwin-perl-deps/._ExtUtilsUT 1cj1cӦ1cux PKTq:U Ahdarwin-perl-deps/HTTP/UT 1ck1cL1cux PKTq:Ut, 큼__MACOSX/darwin-perl-deps/._HTTPUT 1ck1cӦ1cux PKT u!T $darwin-perl-deps/LWP.pmUT bM1cL1cux PKTt," $__MACOSX/darwin-perl-deps/._LWP.pmUT bM1cӦ1cux PK'q:U Adarwin-perl-deps/Try/UT k1cl1cL1cux PK'q:Ut, խ__MACOSX/darwin-perl-deps/._TryUT k1cl1cӦ1cux PKTy2 $ɮdarwin-perl-deps/URI.pmUT hebM1cL1cux PKTt," $M__MACOSX/darwin-perl-deps/._URI.pmUT hebM1cӦ1cux PK,q:U ADdarwin-perl-deps/URI/UT t1cl1cL1cux PK,q:Ut, 큗__MACOSX/darwin-perl-deps/._URIUT t1cl1cӦ1cux PK7!HL!- $darwin-perl-deps/Proc/Daemon.podUT JʆVM1cL1cux PK7!Ht,+ $__MACOSX/darwin-perl-deps/Proc/._Daemon.podUT JʆVM1cӦ1cux PKtq:U Adarwin-perl-deps/Proc/PID/UT 1co1cL1cux PKtq:Ut,$ r__MACOSX/darwin-perl-deps/Proc/._PIDUT 1co1cӦ1cux PK7!H _If $kdarwin-perl-deps/Proc/Daemon.pmUT JʆVM1cL1cux PK7!Ht,* $!__MACOSX/darwin-perl-deps/Proc/._Daemon.pmUT JʆVM1cӦ1cux PKTB>M/-/! $ darwin-perl-deps/Compress/Zlib.pmUT LbM1cL1cux PKTt,, $D__MACOSX/darwin-perl-deps/Compress/._Zlib.pmUT LbM1cӦ1cux PKq:U AEdarwin-perl-deps/Mozilla/CA/UT 21cn1cL1cux PKq:Ut,& F__MACOSX/darwin-perl-deps/Mozilla/._CAUT 21cn1cӦ1cux PKoAS 7 $Gdarwin-perl-deps/Mozilla/CA.pmUT [WaM1cL1cux PKoASt,) $J__MACOSX/darwin-perl-deps/Mozilla/._CA.pmUT [WaM1cӦ1cux PKoASr7S( mKdarwin-perl-deps/Mozilla/mk-ca-bundle.plUT [WaM1cL1cux PKoASt,3 mi__MACOSX/darwin-perl-deps/Mozilla/._mk-ca-bundle.plUT [WaM1cӦ1cux PK(ptN)l5#2 $jdarwin-perl-deps/LWP/media.typesUT 9\M1cL1cux PK(ptNt,+ $__MACOSX/darwin-perl-deps/LWP/._media.typesUT 9\M1cӦ1cux PK(ptNm " $darwin-perl-deps/LWP/MediaTypes.pmUT 9\M1cL1cux PK(ptNt,- $__MACOSX/darwin-perl-deps/LWP/._MediaTypes.pmUT 9\M1cӦ1cux PKTuQ! $darwin-perl-deps/LWP/UserAgent.pmUT bM1cL1cux PKTt,, $+__MACOSX/darwin-perl-deps/LWP/._UserAgent.pmUT bM1cӦ1cux PKT{ٟ $ $,darwin-perl-deps/LWP/Protocol.pmUT bM1cL1cux PKTt,+ $ __MACOSX/darwin-perl-deps/LWP/._Protocol.pmUT bM1cӦ1cux PKcq:U A darwin-perl-deps/LWP/Authen/UT ږ1cn1cL1cux PKcq:Ut,&  __MACOSX/darwin-perl-deps/LWP/._AuthenUT ږ1cn1cӦ1cux PKTp /"! $ darwin-perl-deps/LWP/ConnCache.pmUT bM1cL1cux PKTt,, $|__MACOSX/darwin-perl-deps/LWP/._ConnCache.pmUT bM1cӦ1cux PKq:U A}darwin-perl-deps/LWP/Protocol/UT 1cn1cL1cux PKq:Ut,( __MACOSX/darwin-perl-deps/LWP/._ProtocolUT 1cn1cӦ1cux PKTY:  $darwin-perl-deps/LWP/RobotUA.pmUT bM1cL1cux PKTt,* $}(__MACOSX/darwin-perl-deps/LWP/._RobotUA.pmUT bM1cӦ1cux PKTy:b  $|)darwin-perl-deps/LWP/Debug.pmUT bM1cL1cux PKTt,( $!/__MACOSX/darwin-perl-deps/LWP/._Debug.pmUT bM1cӦ1cux PKTm# $0darwin-perl-deps/LWP/MemberMixin.pmUT bM1cL1cux PKTt,. $n2__MACOSX/darwin-perl-deps/LWP/._MemberMixin.pmUT bM1cӦ1cux PKTl(  $q3darwin-perl-deps/LWP/Simple.pmUT bM1cL1cux PKTt,) $>__MACOSX/darwin-perl-deps/LWP/._Simple.pmUT bM1cӦ1cux PKTIDC! $?darwin-perl-deps/LWP/DebugFile.pmUT bM1cL1cux PKTt,, $Y@__MACOSX/darwin-perl-deps/LWP/._DebugFile.pmUT bM1cӦ1cux PKcq:U AZAdarwin-perl-deps/LWP/Debug/UT ږ1cn1cL1cux PKcq:Ut,% 큳A__MACOSX/darwin-perl-deps/LWP/._DebugUT ږ1cn1cӦ1cux PKF5To$բ  $Bdarwin-perl-deps/Net/HTTPS.pmUT aM1cL1cux PKF5Tt,( $ I__MACOSX/darwin-perl-deps/Net/._HTTPS.pmUT aM1cӦ1cux PKUq:U A Jdarwin-perl-deps/Net/HTTP/UT –1cn1cL1cux PKUq:Ut,$ aJ__MACOSX/darwin-perl-deps/Net/._HTTPUT –1cn1cӦ1cux PKF5T7( $ZKdarwin-perl-deps/Net/HTTP.pmUT aM1cL1cux PKF5Tt,' $][__MACOSX/darwin-perl-deps/Net/._HTTP.pmUT aM1cӦ1cux PK|A %B9! $Y\darwin-perl-deps/Net/IP.pmUT z,PM1cL1cux PK|At,% $֞__MACOSX/darwin-perl-deps/Net/._IP.pmUT z,PM1cӦ1cux PKTEe 1$# Пdarwin-perl-deps/libwww/lwpcook.podUT t[ibN1cL1cux PKTt,. 큦__MACOSX/darwin-perl-deps/libwww/._lwpcook.podUT t[ibN1cӦ1cux PKT"va" 큩darwin-perl-deps/libwww/lwptut.podUT t[ibM1cL1cux PKTt,- __MACOSX/darwin-perl-deps/libwww/._lwptut.podUT t[ibM1cӦ1cux PKnCR7nD ! $darwin-perl-deps/Test/Needs.pmUT ј`M1cL1cux PKnCRt,) $__MACOSX/darwin-perl-deps/Test/._Needs.pmUT ј`M1cӦ1cux PK Q%: $darwin-perl-deps/Test/Fatal.pmUT X/_M1cL1cux PK Qt,) $__MACOSX/darwin-perl-deps/Test/._Fatal.pmUT X/_M1cӦ1cux PKqY U%yqS> $darwin-perl-deps/Test/Warn.pmUT jbM1cL1cux PKqY Ut,( $\__MACOSX/darwin-perl-deps/Test/._Warn.pmUT jbM1cӦ1cux PKF`$y ) $Ydarwin-perl-deps/Test/RequiresInternet.pmUT cUM1cL1cux PKFt,4 $O__MACOSX/darwin-perl-deps/Test/._RequiresInternet.pmUT cUM1cӦ1cux PKX0Q~ (C=# $Xdarwin-perl-deps/File/GlobMapper.pmUT @b_M1cL1cux PKX0Qt,. $#__MACOSX/darwin-perl-deps/File/._GlobMapper.pmUT @b_M1cӦ1cux PK=aTT6 $$darwin-perl-deps/File/Listing.pmUT w[bM1cL1cux PK=aTt,+ $\9__MACOSX/darwin-perl-deps/File/._Listing.pmUT w[bM1cӦ1cux PK5q:U>40Q $\:darwin-perl-deps/Module/Build.pmUT 1cM1cL1cux PK5q:Ut,+ $k__MACOSX/darwin-perl-deps/Module/._Build.pmUT 1cM1cӦ1cux PKPq:U Aldarwin-perl-deps/Module/Build/UT 1cn1cL1cux PKPq:Ut,( l__MACOSX/darwin-perl-deps/Module/._BuildUT 1cn1cӦ1cux PK"q:U Amdarwin-perl-deps/Date/Language/UT a1cm1cL1cux PK"q:Ut,) 7n__MACOSX/darwin-perl-deps/Date/._LanguageUT a1cm1cӦ1cux PKk;Y % $5odarwin-perl-deps/Date/Format.pmUT Ό#KM1cL1cux PKk;t,* $]}__MACOSX/darwin-perl-deps/Date/._Format.pmUT Ό#KM1cӦ1cux PK՛P WUl ! $\~darwin-perl-deps/Date/Language.pmUT ^M1cL1cux PK՛Pt,, $ __MACOSX/darwin-perl-deps/Date/._Language.pmUT ^M1cӦ1cux PKPUN?# $!darwin-perl-deps/Date/Parse.pmUT j^M1cL1cux PKPt,) $̒__MACOSX/darwin-perl-deps/Date/._Parse.pmUT j^M1cӦ1cux PKRLңJt mʓdarwin-perl-deps/Parse/EDID.pmUT  ?[M1cL1cux PKRLt,) m-__MACOSX/darwin-perl-deps/Parse/._EDID.pmUT  ?[M1cӦ1cux PKq:U A+darwin-perl-deps/IO/Compress/UT 1cm1cL1cux PKq:Ut,' 큆__MACOSX/darwin-perl-deps/IO/._CompressUT 1cm1cӦ1cux PKj:QTL $darwin-perl-deps/IO/HTML.pmUT qo_M1cL1cux PKj:Qt,& $?__MACOSX/darwin-perl-deps/IO/._HTML.pmUT qo_M1cӦ1cux PKq:U A:darwin-perl-deps/IO/Uncompress/UT 1cm1cL1cux PKq:Ut,) 큗__MACOSX/darwin-perl-deps/IO/._UncompressUT 1cm1cӦ1cux PKq:U Adarwin-perl-deps/IO/Socket/UT a1cn1cL1cux PKq:Ut,% __MACOSX/darwin-perl-deps/IO/._SocketUT a1cn1cӦ1cux PKFuX6A0! $darwin-perl-deps/Encode/Locale.pmUT  GwUM1cL1cux PKFt,, $__MACOSX/darwin-perl-deps/Encode/._Locale.pmUT  GwUM1cӦ1cux PK8a8T00u2 $darwin-perl-deps/HTML/Tagset.pmUT GM1cL1cux PK8a8t,* $p__MACOSX/darwin-perl-deps/HTML/._Tagset.pmUT GM1cӦ1cux PKpR@av+" $odarwin-perl-deps/WWW/RobotRules.pmUT  ?OM1cL1cux PKpR@t,- $__MACOSX/darwin-perl-deps/WWW/._RobotRules.pmUT  ?OM1cӦ1cux PKXq:U A darwin-perl-deps/WWW/RobotRules/UT ɖ1cp1cL1cux PKXq:Ut,* : __MACOSX/darwin-perl-deps/WWW/._RobotRulesUT ɖ1cp1cӦ1cux PKq:U A9 darwin-perl-deps/XML/SAX/UT 1cp1cL1cux PKq:Ut,# 큐 __MACOSX/darwin-perl-deps/XML/._SAXUT 1cp1cӦ1cux PKӵ~JF|M( $ darwin-perl-deps/XML/NamespaceSupport.pmUT nXM1cL1cux PKӵ~Jt,3 $!__MACOSX/darwin-perl-deps/XML/._NamespaceSupport.pmUT nXM1cӦ1cux PK=N4 5$ $"darwin-perl-deps/XML/SAX.pmUT &]M1cL1cux PK=Nt,& $0__MACOSX/darwin-perl-deps/XML/._SAX.pmUT &]M1cӦ1cux PKq:U A1darwin-perl-deps/XML/Simple/UT 1cp1cL1cux PKq:Ut,& I2__MACOSX/darwin-perl-deps/XML/._SimpleUT 1cp1cӦ1cux PKM"rLqir $D3darwin-perl-deps/XML/Simple.pmUT ڭZM1cL1cux PKM"rLt,) $__MACOSX/darwin-perl-deps/XML/._Simple.pmUT ڭZM1cӦ1cux PKq:Ub6E $darwin-perl-deps/XML/Entities.pmUT l1cM1cL1cux PKq:Ut,+ $__MACOSX/darwin-perl-deps/XML/._Entities.pmUT l1cM1cӦ1cux PKq:U Adarwin-perl-deps/XML/Entities/UT o1cp1cL1cux PKq:Ut,( __MACOSX/darwin-perl-deps/XML/._EntitiesUT o1cp1cӦ1cux PKk;nP  $darwin-perl-deps/Time/Zone.pmUT Ό#KM1cL1cux PKk;t,( $$__MACOSX/darwin-perl-deps/Time/._Zone.pmUT Ό#KM1cӦ1cux PKq:U" A!darwin-perl-deps/Mac/PropertyList/UT q1cn1cL1cux PKq:Ut,, 큁__MACOSX/darwin-perl-deps/Mac/._PropertyListUT q1cn1cӦ1cux PKrw?J " $darwin-perl-deps/Mac/SysProfile.pmUT iFNN1cL1cux PKrw?t,- $ __MACOSX/darwin-perl-deps/Mac/._SysProfile.pmUT iFNN1cӦ1cux PK=*TxӻF^$ $ darwin-perl-deps/Mac/PropertyList.pmUT bN1cL1cux PK=*Tt,/ $6__MACOSX/darwin-perl-deps/Mac/._PropertyList.pmUT bN1cӦ1cux PKJ&5sF $:darwin-perl-deps/Sub/Uplevel.pmUT XN1cL1cux PKJt,* $__MACOSX/darwin-perl-deps/Sub/._Uplevel.pmUT XN1cӦ1cux PKq:U1 Adarwin-perl-deps/darwin-thread-multi-2level/Proc/UT y1cl1cL1cux PKq:Ut,; 큈__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ProcUT y1cl1cӦ1cux PKq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/Compress/UT 1cl1cL1cux PKq:Ut,? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._CompressUT 1cl1cӦ1cux PKq:U1 Adarwin-perl-deps/darwin-thread-multi-2level/auto/UT 1cl1cL1cux PKq:Ut,; 큎__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._autoUT 1cl1cӦ1cux PK/q:U1 Adarwin-perl-deps/darwin-thread-multi-2level/HTML/UT {1cm1cL1cux PK/q:Ut,; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._HTMLUT {1cm1cӦ1cux PKq:U0 Adarwin-perl-deps/darwin-thread-multi-2level/XML/UT 1cm1cL1cux PKq:Ut,: 큋__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._XMLUT 1cm1cӦ1cux PKq:U0 Adarwin-perl-deps/darwin-thread-multi-2level/Sub/UT i1cm1cL1cux PKq:Ut,: __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._SubUT i1cm1cӦ1cux PKq:U1 A darwin-perl-deps/darwin-thread-multi-2level/List/UT i1cm1cL1cux PKq:Ut,; 큆 __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ListUT i1cm1cӦ1cux PKq:UaV,7 $ darwin-perl-deps/darwin-thread-multi-2level/XSLoader.pmUT 1cN1cL1cux PKq:Ut,B $q__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._XSLoader.pmUT 1cN1cӦ1cux PKq:U1 Adarwin-perl-deps/darwin-thread-multi-2level/Data/UT k1cm1cL1cux PKq:Ut,; __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._DataUT k1cm1cӦ1cux PKq:U3 Adarwin-perl-deps/darwin-thread-multi-2level/Scalar/UT i1cm1cL1cux PKq:Ut,= x__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/._ScalarUT i1cm1cӦ1cux PKkq:U" A darwin-perl-deps/ExtUtils/ParseXS/UT 1cm1cL1cux PKkq:Ut,, __MACOSX/darwin-perl-deps/ExtUtils/._ParseXSUT 1cm1cӦ1cux PKD.N:# $!darwin-perl-deps/ExtUtils/Config.pmUT SO1cL1cux PKDt,. $5&__MACOSX/darwin-perl-deps/ExtUtils/._Config.pmUT SO1cӦ1cux PKkq:U# A8'darwin-perl-deps/ExtUtils/Typemaps/UT 1cm1cL1cux PKkq:Ut,- 큙'__MACOSX/darwin-perl-deps/ExtUtils/._TypemapsUT 1cm1cӦ1cux PK5%Tfy)  $(darwin-perl-deps/ExtUtils/xsubppUT 0aN1cL1cux PK5%Tt,+ $22__MACOSX/darwin-perl-deps/ExtUtils/._xsubppUT 0aN1cӦ1cux PK5%T)Ij$ $23darwin-perl-deps/ExtUtils/ParseXS.pmUT 0aO1cL1cux PK5%Tt,/ $\}__MACOSX/darwin-perl-deps/ExtUtils/._ParseXS.pmUT 0aO1cӦ1cux PK5%T i% $`~darwin-perl-deps/ExtUtils/Typemaps.pmUT 0aO1cL1cux PK5%Tt,0 $ٙ__MACOSX/darwin-perl-deps/ExtUtils/._Typemaps.pmUT 0aO1cӦ1cux PKqLFmM) $ޚdarwin-perl-deps/ExtUtils/InstallPaths.pmUT ZO1cL1cux PKqLt,4 $³__MACOSX/darwin-perl-deps/ExtUtils/._InstallPaths.pmUT ZO1cӦ1cux PK4q:U" A˴darwin-perl-deps/ExtUtils/Helpers/UT 1cm1cL1cux PK4q:Ut,, +__MACOSX/darwin-perl-deps/ExtUtils/._HelpersUT 1cm1cӦ1cux PK5%TђC&6% $,darwin-perl-deps/ExtUtils/ParseXS.podUT 0aO1cL1cux PK5%Tt,0 $Ž__MACOSX/darwin-perl-deps/ExtUtils/._ParseXS.podUT 0aO1cӦ1cux PK])IF $ $ʾdarwin-perl-deps/ExtUtils/Helpers.pmUT WP1cL1cux PK])It,/ $P__MACOSX/darwin-perl-deps/ExtUtils/._Helpers.pmUT WP1cӦ1cux PKw$RA!r ^ $Tdarwin-perl-deps/HTTP/Cookies.pmUT _O1cL1cux PKw$Rt,+ $4__MACOSX/darwin-perl-deps/HTTP/._Cookies.pmUT _O1cӦ1cux PK$Tr/WX %. $4darwin-perl-deps/HTTP/Config.pmUT bO1cL1cux PK$Tt,* $__MACOSX/darwin-perl-deps/HTTP/._Config.pmUT bO1cӦ1cux PK$TC'} $darwin-perl-deps/HTTP/Message.pmUT bO1cL1cux PK$Tt,+ $__MACOSX/darwin-perl-deps/HTTP/._Message.pmUT bO1cӦ1cux PK$TUFHB! $darwin-perl-deps/HTTP/Response.pmUT bO1cL1cux PK$Tt,, $ 5__MACOSX/darwin-perl-deps/HTTP/._Response.pmUT bO1cӦ1cux PK$TiY " $ 6darwin-perl-deps/HTTP/Request.pmUT bO1cL1cux PK$Tt,+ $9C__MACOSX/darwin-perl-deps/HTTP/._Request.pmUT bO1cӦ1cux PK-q:U A9Ddarwin-perl-deps/HTTP/Headers/UT v1cm1cL1cux PK-q:Ut,( 큕D__MACOSX/darwin-perl-deps/HTTP/._HeadersUT v1cm1cӦ1cux PK-q:U AEdarwin-perl-deps/HTTP/Request/UT v1cm1cL1cux PK-q:Ut,( E__MACOSX/darwin-perl-deps/HTTP/._RequestUT v1cm1cӦ1cux PK$T!Bb $Fdarwin-perl-deps/HTTP/Headers.pmUT bO1cL1cux PK$Tt,+ $h__MACOSX/darwin-perl-deps/HTTP/._Headers.pmUT bO1cӦ1cux PKkR@8o>" $idarwin-perl-deps/HTTP/Negotiate.pmUT ޙ?OO1cL1cux PKkR@t,- $__MACOSX/darwin-perl-deps/HTTP/._Negotiate.pmUT ޙ?OO1cӦ1cux PKcTB$s $darwin-perl-deps/HTTP/Daemon.pmUT |)!bO1cL1cux PKcTt,* $T__MACOSX/darwin-perl-deps/HTTP/._Daemon.pmUT |)!bO1cӦ1cux PK$T&'2 $Sdarwin-perl-deps/HTTP/Status.pmUT bO1cL1cux PK$Tt,* $__MACOSX/darwin-perl-deps/HTTP/._Status.pmUT bO1cӦ1cux PK0q:U Adarwin-perl-deps/HTTP/Cookies/UT }1cm1cL1cux PK0q:Ut,( B__MACOSX/darwin-perl-deps/HTTP/._CookiesUT }1cm1cӦ1cux PKR sOUS:l. $?darwin-perl-deps/HTTP/Date.pmUT L[]O1cL1cux PKR sOt,( $__MACOSX/darwin-perl-deps/HTTP/._Date.pmUT L[]O1cӦ1cux PKwSX6q!R $darwin-perl-deps/Try/Tiny.pmUT OaP1cL1cux PKwSt,' $a__MACOSX/darwin-perl-deps/Try/._Tiny.pmUT OaP1cӦ1cux PKT?Ȯ $]darwin-perl-deps/URI/IRI.pmUT hebO1cL1cux PKTt,& $t__MACOSX/darwin-perl-deps/URI/._IRI.pmUT hebO1cӦ1cux PKTwU|  $odarwin-perl-deps/URI/gopher.pmUT hebO1cL1cux PKTt,) $__MACOSX/darwin-perl-deps/URI/._gopher.pmUT hebO1cӦ1cux PKT$  $darwin-perl-deps/URI/Escape.pmUT hebO1cL1cux PKTt,) $U__MACOSX/darwin-perl-deps/URI/._Escape.pmUT hebO1cӦ1cux PKT^U $Sdarwin-perl-deps/URI/ldapi.pmUT hebO1cL1cux PKTt,( $__MACOSX/darwin-perl-deps/URI/._ldapi.pmUT hebO1cӦ1cux PKTws $darwin-perl-deps/URI/telnet.pmUT hebO1cL1cux PKTt,) $ __MACOSX/darwin-perl-deps/URI/._telnet.pmUT hebO1cӦ1cux PKTZ $ darwin-perl-deps/URI/rsync.pmUT hebO1cL1cux PKTt,( $ __MACOSX/darwin-perl-deps/URI/._rsync.pmUT hebO1cӦ1cux PKTUg&w $ darwin-perl-deps/URI/https.pmUT hebO1cL1cux PKTt,( $ __MACOSX/darwin-perl-deps/URI/._https.pmUT hebO1cӦ1cux PKTd ܫ $darwin-perl-deps/URI/sip.pmUT hebO1cL1cux PKTt,& $__MACOSX/darwin-perl-deps/URI/._sip.pmUT hebO1cӦ1cux PKT@lv?! $darwin-perl-deps/URI/_punycode.pmUT hebO1cL1cux PKTt,, $n__MACOSX/darwin-perl-deps/URI/.__punycode.pmUT hebO1cӦ1cux PKT_w $odarwin-perl-deps/URI/nntps.pmUT hebO1cL1cux PKTt,( $Q__MACOSX/darwin-perl-deps/URI/._nntps.pmUT hebO1cӦ1cux PK,q:U ANdarwin-perl-deps/URI/file/UT t1co1cL1cux PK,q:Ut,$ 큦__MACOSX/darwin-perl-deps/URI/._fileUT t1co1cӦ1cux PKTM'l  $darwin-perl-deps/URI/ldap.pmUT hebO1cL1cux PKTt,' $0%__MACOSX/darwin-perl-deps/URI/._ldap.pmUT hebO1cӦ1cux PKT/I] $,&darwin-perl-deps/URI/WithBase.pmUT hebO1cL1cux PKTt,+ ${,__MACOSX/darwin-perl-deps/URI/._WithBase.pmUT hebO1cӦ1cux PKT1   ${-darwin-perl-deps/URI/_query.pmUT hebO1cL1cux PKTt,) $1__MACOSX/darwin-perl-deps/URI/.__query.pmUT hebO1cӦ1cux PKTP $2darwin-perl-deps/URI/urn.pmUT hebO1cL1cux PKTt,& $|6__MACOSX/darwin-perl-deps/URI/._urn.pmUT hebO1cӦ1cux PKT+  $w7darwin-perl-deps/URI/_generic.pmUT hebO1cL1cux PKTt,+ $A__MACOSX/darwin-perl-deps/URI/.__generic.pmUT hebO1cӦ1cux PKTGz7e ! $Bdarwin-perl-deps/URI/_userpass.pmUT hebO1cL1cux PKTt,, $dD__MACOSX/darwin-perl-deps/URI/.__userpass.pmUT hebO1cӦ1cux PKT%Ⱦ $eEdarwin-perl-deps/URI/snews.pmUT hebO1cL1cux PKTt,( $_F__MACOSX/darwin-perl-deps/URI/._snews.pmUT hebO1cӦ1cux PKT)s $\Gdarwin-perl-deps/URI/nntp.pmUT hebO1cL1cux PKTt,' $9H__MACOSX/darwin-perl-deps/URI/._nntp.pmUT hebO1cӦ1cux PKT^:1  $5Idarwin-perl-deps/URI/Split.pmUT hebO1cL1cux PKTt,( $M__MACOSX/darwin-perl-deps/URI/._Split.pmUT hebO1cӦ1cux PKTS= & $Ndarwin-perl-deps/URI/file.pmUT hebO1cL1cux PKTt,' $~^__MACOSX/darwin-perl-deps/URI/._file.pmUT hebO1cӦ1cux PKTKJKo} $z_darwin-perl-deps/URI/mms.pmUT hebO1cL1cux PKTt,& $R`__MACOSX/darwin-perl-deps/URI/._mms.pmUT hebO1cӦ1cux PKT  $3darwin-perl-deps/URI/data.pmUT hebO1cL1cux PKTt,' $9__MACOSX/darwin-perl-deps/URI/._data.pmUT hebO1cӦ1cux PKT9^v $5darwin-perl-deps/URI/sips.pmUT hebO1cL1cux PKTt,' $__MACOSX/darwin-perl-deps/URI/._sips.pmUT hebO1cӦ1cux PKT/3 $darwin-perl-deps/URI/pop.pmUT hebO1cL1cux PKTt,& $`__MACOSX/darwin-perl-deps/URI/._pop.pmUT hebO1cӦ1cux PKT-s^s $[darwin-perl-deps/URI/tn3270.pmUT hebO1cL1cux PKTt,) $:__MACOSX/darwin-perl-deps/URI/._tn3270.pmUT hebO1cӦ1cux PKTx3՚ $8darwin-perl-deps/URI/news.pmUT hebO1cL1cux PKTt,' $<__MACOSX/darwin-perl-deps/URI/._news.pmUT hebO1cӦ1cux PKT2g $8darwin-perl-deps/URI/_idna.pmUT hebO1cL1cux PKTt,( $ __MACOSX/darwin-perl-deps/URI/.__idna.pmUT hebO1cӦ1cux PKTmy\k $darwin-perl-deps/URI/_foreign.pmUT hebO1cL1cux PKTt,+ $Ѳ__MACOSX/darwin-perl-deps/URI/.__foreign.pmUT hebO1cӦ1cux PKTu. $ѳdarwin-perl-deps/URI/_server.pmUT hebO1cL1cux PKTt,* $@__MACOSX/darwin-perl-deps/URI/.__server.pmUT hebO1cӦ1cux PKT˨  $?darwin-perl-deps/URI/ftp.pmUT hebO1cL1cux PKTt,& $__MACOSX/darwin-perl-deps/URI/._ftp.pmUT hebO1cӦ1cux PKTAE y $darwin-perl-deps/URI/mailto.pmUT hebO1cL1cux PKTt,) $__MACOSX/darwin-perl-deps/URI/._mailto.pmUT hebO1cӦ1cux PKmL;)vH.! $darwin-perl-deps/Proc/PID/File.pmUT E[M1cL1cux PKmLt,, $__MACOSX/darwin-perl-deps/Proc/PID/._File.pmUT E[M1cӦ1cux PKoASt& $darwin-perl-deps/Mozilla/CA/cacert.pemUT [WaM1cL1cux PKoASt,1 $ __MACOSX/darwin-perl-deps/Mozilla/CA/._cacert.pemUT [WaM1cӦ1cux PKTuԸ% $ darwin-perl-deps/LWP/Authen/Digest.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Authen/._Digest.pmUT bM1cӦ1cux PKT}# $# darwin-perl-deps/LWP/Authen/Ntlm.pmUT bM1cL1cux PKTt,. $ __MACOSX/darwin-perl-deps/LWP/Authen/._Ntlm.pmUT bM1cӦ1cux PKT[< $ $ darwin-perl-deps/LWP/Authen/Basic.pmUT bM1cL1cux PKTt,/ $ݯ __MACOSX/darwin-perl-deps/LWP/Authen/._Basic.pmUT bM1cӦ1cux PKT: b' $ darwin-perl-deps/LWP/Protocol/gopher.pmUT bM1cL1cux PKTt,2 $] __MACOSX/darwin-perl-deps/LWP/Protocol/._gopher.pmUT bM1cӦ1cux PKDQ˥- & $d darwin-perl-deps/LWP/Protocol/https.pmUT P|_M1cL1cux PKDQt,1 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._https.pmUT P|_M1cӦ1cux PKTS% $ darwin-perl-deps/LWP/Protocol/cpan.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._cpan.pmUT bM1cӦ1cux PKT 7DL) $ darwin-perl-deps/LWP/Protocol/loopback.pmUT bM1cL1cux PKTt,4 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._loopback.pmUT bM1cӦ1cux PKT_of% $ darwin-perl-deps/LWP/Protocol/nntp.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._nntp.pmUT bM1cӦ1cux PKT@-nd% $ darwin-perl-deps/LWP/Protocol/nogo.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._nogo.pmUT bM1cӦ1cux PKT |% $ darwin-perl-deps/LWP/Protocol/file.pmUT bM1cL1cux PKTt,0 $\ __MACOSX/darwin-perl-deps/LWP/Protocol/._file.pmUT bM1cӦ1cux PKTrR? ;% $a darwin-perl-deps/LWP/Protocol/http.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._http.pmUT bM1cӦ1cux PKTF X% $ darwin-perl-deps/LWP/Protocol/data.pmUT bM1cL1cux PKTt,0 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._data.pmUT bM1cӦ1cux PKT,A7J$ $ darwin-perl-deps/LWP/Protocol/ftp.pmUT bM1cL1cux PKTt,/ $i __MACOSX/darwin-perl-deps/LWP/Protocol/._ftp.pmUT bM1cӦ1cux PKT73N8' $m darwin-perl-deps/LWP/Protocol/mailto.pmUT bM1cL1cux PKTt,2 $ __MACOSX/darwin-perl-deps/LWP/Protocol/._mailto.pmUT bM1cӦ1cux PKT64JY' $ darwin-perl-deps/LWP/Debug/TraceHTTP.pmUT bM1cL1cux PKTt,2 $W __MACOSX/darwin-perl-deps/LWP/Debug/._TraceHTTP.pmUT bM1cӦ1cux PKF5T ~VD$ $^ darwin-perl-deps/Net/HTTP/Methods.pmUT aM1cL1cux PKF5Tt,/ $N3 __MACOSX/darwin-perl-deps/Net/HTTP/._Methods.pmUT aM1cӦ1cux PKF5Tc  $R4 darwin-perl-deps/Net/HTTP/NB.pmUT aM1cL1cux PKF5Tt,* $"9 __MACOSX/darwin-perl-deps/Net/HTTP/._NB.pmUT aM1cӦ1cux PK5q:U~y*+ $!: darwin-perl-deps/Module/Build/Authoring.podUT 1cM1cL1cux PK5q:Ut,6 $0K __MACOSX/darwin-perl-deps/Module/Build/._Authoring.podUT 1cM1cӦ1cux PKTLE^b$% $;L darwin-perl-deps/Module/Build/Tiny.pmUT (>:TM1cL1cux PKTLEt,0 $l[ __MACOSX/darwin-perl-deps/Module/Build/._Tiny.pmUT (>:TM1cӦ1cux PK5q:UCU+ $q\ darwin-perl-deps/Module/Build/ConfigData.pmUT 1cM1cL1cux PK5q:Ut,6 $e __MACOSX/darwin-perl-deps/Module/Build/._ConfigData.pmUT 1cM1cӦ1cux PK5q:U?N' $f darwin-perl-deps/Module/Build/Config.pmUT 1cM1cL1cux PK5q:Ut,2 $h __MACOSX/darwin-perl-deps/Module/Build/._Config.pmUT 1cM1cӦ1cux PK5q:U~%gK' $i darwin-perl-deps/Module/Build/Compat.pmUT 1cM1cL1cux PK5q:Ut,2 $: __MACOSX/darwin-perl-deps/Module/Build/._Compat.pmUT 1cM1cӦ1cux PKOq:U' AA darwin-perl-deps/Module/Build/Platform/UT 1cn1cL1cux PKOq:Ut,1 큦 __MACOSX/darwin-perl-deps/Module/Build/._PlatformUT 1cn1cӦ1cux PK5q:UV]-C) $ darwin-perl-deps/Module/Build/Cookbook.pmUT 1cM1cL1cux PK5q:Ut,4 $P __MACOSX/darwin-perl-deps/Module/Build/._Cookbook.pmUT 1cM1cӦ1cux PK5q:Ue x & $Y darwin-perl-deps/Module/Build/Notes.pmUT 1cM1cL1cux PK5q:Ut,1 $ݯ __MACOSX/darwin-perl-deps/Module/Build/._Notes.pmUT 1cM1cӦ1cux PK5q:UDe:I' $ darwin-perl-deps/Module/Build/Dumper.pmUT 1cM1cL1cux PK5q:Ut,2 $ __MACOSX/darwin-perl-deps/Module/Build/._Dumper.pmUT 1cM1cӦ1cux PK5q:UƁŜ) $ darwin-perl-deps/Module/Build/PPMMaker.pmUT 1cM1cL1cux PK5q:Ut,4 $ __MACOSX/darwin-perl-deps/Module/Build/._PPMMaker.pmUT 1cM1cӦ1cux PK5q:U2_`U % $Ľ darwin-perl-deps/Module/Build/API.podUT 1cM1cL1cux PK5q:Ut,0 $U __MACOSX/darwin-perl-deps/Module/Build/._API.podUT 1cM1cӦ1cux PK5q:UD"* $Z darwin-perl-deps/Module/Build/Bundling.podUT 1cM1cL1cux PK5q:Ut,5 $ __MACOSX/darwin-perl-deps/Module/Build/._Bundling.podUT 1cM1cӦ1cux PK5q:UQ/L* $ darwin-perl-deps/Module/Build/PodParser.pmUT 1cM1cL1cux PK5q:Ut,5 $ __MACOSX/darwin-perl-deps/Module/Build/._PodParser.pmUT 1cM1cӦ1cux PK5q:U $! __MACOSX/darwin-perl-deps/Date/Language/._TigrinyaEthiopian.pmUT hIM1cӦ1cux PKPW:73, $4 darwin-perl-deps/Date/Language/Chinese_GB.pmUT hIM1cL1cux PKPW:t,7 $ __MACOSX/darwin-perl-deps/Date/Language/._Chinese_GB.pmUT hIM1cӦ1cux PKPW:J) $ darwin-perl-deps/Date/Language/Amharic.pmUT hIM1cL1cux PKPW:t,4 $ __MACOSX/darwin-perl-deps/Date/Language/._Amharic.pmUT hIM1cӦ1cux PKk;tqh) $ darwin-perl-deps/Date/Language/Russian.pmUT Ό#KM1cL1cux PKk;t,4 $K __MACOSX/darwin-perl-deps/Date/Language/._Russian.pmUT Ό#KM1cӦ1cux PKPW:D`) $T darwin-perl-deps/Date/Language/Finnish.pmUT hIM1cL1cux PKPW:t,4 $Q __MACOSX/darwin-perl-deps/Date/Language/._Finnish.pmUT hIM1cӦ1cux PK՛Pp½\( $Z darwin-perl-deps/Date/Language/French.pmUT ^M1cL1cux PK՛Pt,3 $ __MACOSX/darwin-perl-deps/Date/Language/._French.pmUT ^M1cӦ1cux PKPW:i[Wj( $ darwin-perl-deps/Date/Language/Somali.pmUT hIM1cL1cux PKPW:t,3 $I" __MACOSX/darwin-perl-deps/Date/Language/._Somali.pmUT hIM1cӦ1cux PKPW:Nzz& $Q# darwin-perl-deps/Date/Language/Afar.pmUT hIM1cL1cux PKPW:t,1 $% __MACOSX/darwin-perl-deps/Date/Language/._Afar.pmUT hIM1cӦ1cux PKk;f0+ $& darwin-perl-deps/Date/Language/Norwegian.pmUT Ό#KM1cL1cux PKk;t,6 $( __MACOSX/darwin-perl-deps/Date/Language/._Norwegian.pmUT Ό#KM1cӦ1cux PKk; 9 |* $* darwin-perl-deps/Date/Language/Romanian.pmUT Ό#KM1cL1cux PKk;t,5 $,, __MACOSX/darwin-perl-deps/Date/Language/._Romanian.pmUT Ό#KM1cӦ1cux PKPW:U!1>' $6- darwin-perl-deps/Date/Language/Dutch.pmUT hIM1cL1cux PKPW:t,2 $/ __MACOSX/darwin-perl-deps/Date/Language/._Dutch.pmUT hIM1cӦ1cux PKPW:) $0 darwin-perl-deps/Date/Language/English.pmUT hIM1cL1cux PKPW:t,4 $.3 __MACOSX/darwin-perl-deps/Date/Language/._English.pmUT hIM1cӦ1cux PKk;ϣ( $74 darwin-perl-deps/Date/Language/German.pmUT Ό#KM1cL1cux PKk;t,3 $6 __MACOSX/darwin-perl-deps/Date/Language/._German.pmUT Ό#KM1cӦ1cux PKPW:4E&S+ $7 darwin-perl-deps/Date/Language/Brazilian.pmUT hIM1cL1cux PKPW:t,6 $9 __MACOSX/darwin-perl-deps/Date/Language/._Brazilian.pmUT hIM1cӦ1cux PKk;҅* $: darwin-perl-deps/Date/Language/Austrian.pmUT Ό#KM1cL1cux PKk;t,5 $5= __MACOSX/darwin-perl-deps/Date/Language/._Austrian.pmUT Ό#KM1cӦ1cux PKk;|p0 * $?> darwin-perl-deps/Date/Language/Tigrinya.pmUT Ό#KM1cL1cux PKk;t,5 $@ __MACOSX/darwin-perl-deps/Date/Language/._Tigrinya.pmUT Ό#KM1cӦ1cux PKk;<) $A darwin-perl-deps/Date/Language/Italian.pmUT Ό#KM1cL1cux PKk;t,4 $ D __MACOSX/darwin-perl-deps/Date/Language/._Italian.pmUT Ό#KM1cӦ1cux PKPW:Ŵ-' $E darwin-perl-deps/Date/Language/Oromo.pmUT hIM1cL1cux PKPW:t,2 $nG __MACOSX/darwin-perl-deps/Date/Language/._Oromo.pmUT hIM1cӦ1cux PKPW:H( $uH darwin-perl-deps/Date/Language/Sidama.pmUT hIM1cL1cux PKPW:t,3 $J __MACOSX/darwin-perl-deps/Date/Language/._Sidama.pmUT hIM1cӦ1cux PKk; ( $K darwin-perl-deps/Date/Language/Danish.pmUT Ό#KM1cL1cux PKk;t,3 $N __MACOSX/darwin-perl-deps/Date/Language/._Danish.pmUT Ό#KM1cӦ1cux PK՛P + $O darwin-perl-deps/Date/Language/Bulgarian.pmUT ^M1cL1cux PK՛Pt,6 $T __MACOSX/darwin-perl-deps/Date/Language/._Bulgarian.pmUT ^M1cӦ1cux PKk;) $U darwin-perl-deps/Date/Language/Chinese.pmUT Ό#KM1cL1cux PKk;t,4 $W __MACOSX/darwin-perl-deps/Date/Language/._Chinese.pmUT Ό#KM1cӦ1cux PKk;"h, 0 mX darwin-perl-deps/Date/Language/Russian_cp1251.pmUT Ό#KM1cL1cux PKk;t,; m[ __MACOSX/darwin-perl-deps/Date/Language/._Russian_cp1251.pmUT Ό#KM1cӦ1cux PKPW:kEY4(' $\ darwin-perl-deps/Date/Language/Gedeo.pmUT hIM1cL1cux PKPW:t,2 $(_ __MACOSX/darwin-perl-deps/Date/Language/._Gedeo.pmUT hIM1cӦ1cux PKT-I&׉$ $/` darwin-perl-deps/IO/Compress/Gzip.pmUT LbM1cL1cux PKTt,/ $. __MACOSX/darwin-perl-deps/IO/Compress/._Gzip.pmUT LbM1cӦ1cux PKT'RS[' $2 darwin-perl-deps/IO/Compress/Deflate.pmUT LbM1cL1cux PKTt,2 $ __MACOSX/darwin-perl-deps/IO/Compress/._Deflate.pmUT LbM1cӦ1cux PKTxp9S% $ darwin-perl-deps/IO/Compress/Bzip2.pmUT LbM1cL1cux PKTt,0 $׻ __MACOSX/darwin-perl-deps/IO/Compress/._Bzip2.pmUT LbM1cӦ1cux PKq:U" Aܼ darwin-perl-deps/IO/Compress/Gzip/UT 1cm1cL1cux PKq:Ut,, < __MACOSX/darwin-perl-deps/IO/Compress/._GzipUT 1cm1cӦ1cux PKq:U% A= darwin-perl-deps/IO/Compress/Adapter/UT 1cm1cL1cux PKq:Ut,/ 큠 __MACOSX/darwin-perl-deps/IO/Compress/._AdapterUT 1cm1cԦ1cux PKq:U" A darwin-perl-deps/IO/Compress/Zlib/UT 1cm1cL1cux PKq:Ut,,  __MACOSX/darwin-perl-deps/IO/Compress/._ZlibUT 1cm1cԦ1cux PKT"_4qvi* $ darwin-perl-deps/IO/Compress/RawDeflate.pmUT LbM1cL1cux PKTt,5 $ __MACOSX/darwin-perl-deps/IO/Compress/._RawDeflate.pmUT LbM1cԦ1cux PKq:U! A darwin-perl-deps/IO/Compress/Zip/UT 1cm1cL1cux PKq:Ut,+ \ __MACOSX/darwin-perl-deps/IO/Compress/._ZipUT 1cm1cԦ1cux PKOT?i# $\ darwin-perl-deps/IO/Compress/Zip.pmUT bM1cL1cux PKOTt,. $! __MACOSX/darwin-perl-deps/IO/Compress/._Zip.pmUT bM1cԦ1cux PKT.( R$ $" darwin-perl-deps/IO/Compress/FAQ.podUT LbM1cL1cux PKTt,/ $@= __MACOSX/darwin-perl-deps/IO/Compress/._FAQ.podUT LbM1cԦ1cux PKq:U" AD> darwin-perl-deps/IO/Compress/Base/UT 1cm1cL1cux PKq:Ut,, 큤> __MACOSX/darwin-perl-deps/IO/Compress/._BaseUT 1cm1cԦ1cux PKT؜]$ $? darwin-perl-deps/IO/Compress/Base.pmUT LbM1cL1cux PKTt,/ $W __MACOSX/darwin-perl-deps/IO/Compress/._Base.pmUT LbM1cԦ1cux PKT2/#~( $X darwin-perl-deps/IO/Uncompress/Gunzip.pmUT LbM1cL1cux PKTt,3 $l| __MACOSX/darwin-perl-deps/IO/Uncompress/._Gunzip.pmUT LbM1cԦ1cux PKTd#o) $t} darwin-perl-deps/IO/Uncompress/Inflate.pmUT LbM1cL1cux PKTt,4 $ __MACOSX/darwin-perl-deps/IO/Uncompress/._Inflate.pmUT LbM1cԦ1cux PKTL5' $ darwin-perl-deps/IO/Uncompress/Unzip.pmUT LbM1cL1cux PKTt,2 $ __MACOSX/darwin-perl-deps/IO/Uncompress/._Unzip.pmUT LbM1cԦ1cux PKT%GYy/ $ darwin-perl-deps/IO/Uncompress/AnyUncompress.pmUT LbM1cL1cux PKTt,: $r __MACOSX/darwin-perl-deps/IO/Uncompress/._AnyUncompress.pmUT LbM1cԦ1cux PKq:U' A darwin-perl-deps/IO/Uncompress/Adapter/UT 1cn1cL1cux PKq:Ut,1 __MACOSX/darwin-perl-deps/IO/Uncompress/._AdapterUT 1cn1cԦ1cux PKT+&"|, m darwin-perl-deps/IO/Uncompress/RawInflate.pmUT LbM1cL1cux PKTt,7 m__MACOSX/darwin-perl-deps/IO/Uncompress/._RawInflate.pmUT LbM1cԦ1cux PKTOGr d) $darwin-perl-deps/IO/Uncompress/Bunzip2.pmUT LbM1cL1cux PKTt,4 $7__MACOSX/darwin-perl-deps/IO/Uncompress/._Bunzip2.pmUT LbM1cԦ1cux PKT b~n, $8darwin-perl-deps/IO/Uncompress/AnyInflate.pmUT LbM1cL1cux PKTt,7 $X__MACOSX/darwin-perl-deps/IO/Uncompress/._AnyInflate.pmUT LbM1cԦ1cux PKTm$?& $Ydarwin-perl-deps/IO/Uncompress/Base.pmUT LbM1cL1cux PKTt,1 $~__MACOSX/darwin-perl-deps/IO/Uncompress/._Base.pmUT LbM1cԦ1cux PKq:U Adarwin-perl-deps/IO/Socket/SSL/UT a1cn1cL1cux PKq:Ut,) __MACOSX/darwin-perl-deps/IO/Socket/._SSLUT a1cn1cԦ1cux PK)T_tz ! $darwin-perl-deps/IO/Socket/SSL.pmUT O۔bM1cL1cux PK)Tt,, $__MACOSX/darwin-perl-deps/IO/Socket/._SSL.pmUT O۔bM1cԦ1cux PK}'TY*oS" $darwin-perl-deps/IO/Socket/SSL.podUT uRaM1cL1cux PK}'Tt,- $m__MACOSX/darwin-perl-deps/IO/Socket/._SSL.podUT uRaM1cԦ1cux PKO@ Adarwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable/UT y1cl1cL1cux PKq:Ut,H __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/._ProcessTableUT y1cl1cԦ1cux PKSSS4H; $;darwin-perl-deps/darwin-thread-multi-2level/Proc/Killfam.pmUT %aN1cL1cux PKSt,F $S__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/._Killfam.pmUT %aN1cԦ1cux PKq:U9 Andarwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/UT 1cl1cL1cux PKq:Ut,C __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Compress/._RawUT 1cl1cԦ1cux PKq:U6 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/UT җ1cl1cL1cux PKq:Ut,@ q__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ProcUT җ1cl1cԦ1cux PKq:U: Adarwin-perl-deps/darwin-thread-multi-2level/auto/Compress/UT 1cl1cL1cux PKq:Ut,D __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._CompressUT 1cl1cԦ1cux PKq:U9 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Mozilla/UT 21cl1cL1cux PKq:Ut,C 큎__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._MozillaUT 21cl1cԦ1cux PKq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/LWP/UT 1cl1cL1cux PKq:Ut,? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._LWPUT 1cl1cԦ1cux PKq:U5 A-darwin-perl-deps/darwin-thread-multi-2level/auto/Net/UT 1cl1cL1cux PKq:Ut,? 큠__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._NetUT 1cl1cԦ1cux PKq:U6 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Test/UT 1cm1cL1cux PKq:Ut,@ (__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._TestUT 1cm1cԦ1cux PK$q:U6 A=darwin-perl-deps/darwin-thread-multi-2level/auto/File/UT e1cm1cL1cux PK$q:Ut,@ 큱__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._FileUT e1cm1cԦ1cux PKOq:U8 Aơdarwin-perl-deps/darwin-thread-multi-2level/auto/Module/UT 1cm1cL1cux PKOq:Ut,B <__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ModuleUT 1cm1cԦ1cux PK"q:U6 ASdarwin-perl-deps/darwin-thread-multi-2level/auto/Date/UT a1cm1cL1cux PK"q:Ut,@ ǣ__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._DateUT a1cm1cԦ1cux PKq:U7 Aܤdarwin-perl-deps/darwin-thread-multi-2level/auto/Parse/UT —1cm1cL1cux PKq:Ut,A Q__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ParseUT —1cm1cԦ1cux PKq:U4 Agdarwin-perl-deps/darwin-thread-multi-2level/auto/IO/UT 1cm1cL1cux PKq:Ut,> ٦__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._IOUT 1cm1cԦ1cux PK!q:U8 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Encode/UT _1cm1cL1cux PK!q:Ut,B b__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._EncodeUT _1cm1cԦ1cux PK/q:U6 Aydarwin-perl-deps/darwin-thread-multi-2level/auto/HTML/UT {1cm1cL1cux PK/q:Ut,@ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._HTMLUT {1cm1cԦ1cux PKXq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/WWW/UT ɖ1cm1cL1cux PKXq:Ut,? u__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._WWWUT ɖ1cm1cԦ1cux PKq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/XML/UT 1cm1cL1cux PKq:Ut,? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._XMLUT 1cm1cԦ1cux PKq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Mac/UT ×1cm1cL1cux PKq:Ut,? 큃__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._MacUT ×1cm1cԦ1cux PKq:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Sub/UT 1cm1cL1cux PKq:Ut,? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._SubUT 1cm1cԦ1cux PKkq:U: Adarwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/UT 1cm1cL1cux PKkq:Ut,D 큖__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ExtUtilsUT 1cm1cԦ1cux PKTq:U6 Adarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/UT 1cm1cL1cux PKTq:Ut,@ #__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._HTTPUT 1cm1cԦ1cux PKq:U6 A8darwin-perl-deps/darwin-thread-multi-2level/auto/List/UT i1cm1cL1cux PKq:Ut,@ 크__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._ListUT i1cm1cԦ1cux PKq:U8 Adarwin-perl-deps/darwin-thread-multi-2level/auto/Switch/UT ŗ1cm1cL1cux PKq:Ut,B 7__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._SwitchUT ŗ1cm1cԦ1cux PK'q:U5 ANdarwin-perl-deps/darwin-thread-multi-2level/auto/Try/UT k1cm1cL1cux PK'q:Ut,? __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._TryUT k1cm1cԦ1cux PKq:U: Aոdarwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/UT 1cm1cL1cux PKq:Ut,D M__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._XSLoaderUT 1cm1cԦ1cux PKq:U6 Afdarwin-perl-deps/darwin-thread-multi-2level/auto/Data/UT k1cm1cL1cux PKq:Ut,@ ں__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._DataUT k1cm1cԦ1cux PK,q:U5 Adarwin-perl-deps/darwin-thread-multi-2level/auto/URI/UT t1cm1cL1cux PK,q:Ut,? b__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/._URIUT t1cm1cԦ1cux PKƊ|ToQ= $vdarwin-perl-deps/darwin-thread-multi-2level/HTML/LinkExtor.pmUT AbN1cL1cux PKƊ|Tt,H $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._LinkExtor.pmUT AbN1cԦ1cux PKƊ|T_d% <> $darwin-perl-deps/darwin-thread-multi-2level/HTML/PullParser.pmUT AbN1cL1cux PKƊ|Tt,I $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._PullParser.pmUT AbN1cԦ1cux PKƊ|T C!> $darwin-perl-deps/darwin-thread-multi-2level/HTML/HeadParser.pmUT AbN1cL1cux PKƊ|Tt,I $ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._HeadParser.pmUT AbN1cԦ1cux PKƊ|T}j2: $'darwin-perl-deps/darwin-thread-multi-2level/HTML/Parser.pmUT AbO1cL1cux PKƊ|Tt,E $C__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._Parser.pmUT AbO1cԦ1cux PKƊ|TZf : $]darwin-perl-deps/darwin-thread-multi-2level/HTML/Filter.pmUT AbO1cL1cux PKƊ|Tt,E $~__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._Filter.pmUT AbO1cԦ1cux PKƊ|Tqam:< $darwin-perl-deps/darwin-thread-multi-2level/HTML/Entities.pmUT AbO1cL1cux PKƊ|Tt,G $.__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._Entities.pmUT AbO1cԦ1cux PKƊ|T\qg'> $/darwin-perl-deps/darwin-thread-multi-2level/HTML/TokeParser.pmUT AbN1cL1cux PKƊ|Tt,I $>__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/HTML/._TokeParser.pmUT AbN1cԦ1cux PKq:U7 A?darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/UT 1cm1cL1cux PKq:Ut,A D@__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/._ParserUT 1cm1cԦ1cux PK:8OX//#Il9 $ZAdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser.pmUT ܧ]N1cL1cux PK:8Ot,D $e__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/._Parser.pmUT ܧ]N1cԦ1cux PKU~UX57 $)fdarwin-perl-deps/darwin-thread-multi-2level/Sub/Util.pmUT bO1cL1cux PKU~Ut,B $vn__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Sub/._Util.pmUT bO1cԦ1cux PKq:U6 Aodarwin-perl-deps/darwin-thread-multi-2level/List/Util/UT i1cm1cL1cux PKq:Ut,@ p__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/._UtilUT i1cm1cԦ1cux PKU~U'T ni8 $qdarwin-perl-deps/darwin-thread-multi-2level/List/Util.pmUT bO1cL1cux PKU~Ut,C $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/._Util.pmUT bO1cԦ1cux PKeP)Hb>8 $darwin-perl-deps/darwin-thread-multi-2level/Data/UUID.pmUT >a^O1cL1cux PKePt,C $̚__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Data/._UUID.pmUT >a^O1cԦ1cux PKU~U! *: $darwin-perl-deps/darwin-thread-multi-2level/Scalar/Util.pmUT bO1cL1cux PKU~Ut,E $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Scalar/._Util.pmUT bO1cԦ1cux PK5%Tx. $darwin-perl-deps/ExtUtils/ParseXS/Constants.pmUT 0aP1cL1cux PK5%Tt,9 $__MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Constants.pmUT 0aP1cԦ1cux PK5%T9}/ $°darwin-perl-deps/ExtUtils/ParseXS/CountLines.pmUT 0aP1cL1cux PK5%Tt,: $:__MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._CountLines.pmUT 0aP1cԦ1cux PK5%T@#^C. $Idarwin-perl-deps/ExtUtils/ParseXS/Utilities.pmUT 0aP1cL1cux PK5%Tt,9 $#__MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Utilities.pmUT 0aP1cԦ1cux PK5%Ts7F ) $1darwin-perl-deps/ExtUtils/ParseXS/Eval.pmUT 0aO1cL1cux PK5%Tt,4 $__MACOSX/darwin-perl-deps/ExtUtils/ParseXS/._Eval.pmUT 0aO1cԦ1cux PK5%T@%) $darwin-perl-deps/ExtUtils/Typemaps/Cmd.pmUT 0aO1cL1cux PK5%Tt,4 $__MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._Cmd.pmUT 0aO1cԦ1cux PK5%T(T>%* $darwin-perl-deps/ExtUtils/Typemaps/Type.pmUT 0aO1cL1cux PK5%Tt,5 $__MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._Type.pmUT 0aO1cԦ1cux PK5%TH9}. $darwin-perl-deps/ExtUtils/Typemaps/InputMap.pmUT 0aO1cL1cux PK5%Tt,9 $(__MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._InputMap.pmUT 0aO1cԦ1cux PK5%T5L/ $6darwin-perl-deps/ExtUtils/Typemaps/OutputMap.pmUT 0aO1cL1cux PK5%Tt,: $__MACOSX/darwin-perl-deps/ExtUtils/Typemaps/._OutputMap.pmUT 0aO1cԦ1cux PK])Ig") $darwin-perl-deps/ExtUtils/Helpers/Unix.pmUT WO1cL1cux PK])It,4 $__MACOSX/darwin-perl-deps/ExtUtils/Helpers/._Unix.pmUT WO1cԦ1cux PK])IA?rn ( $darwin-perl-deps/ExtUtils/Helpers/VMS.pmUT WO1cL1cux PK])It,3 $__MACOSX/darwin-perl-deps/ExtUtils/Helpers/._VMS.pmUT WO1cԦ1cux PK])I+, $darwin-perl-deps/ExtUtils/Helpers/Windows.pmUT WO1cL1cux PK])It,7 $__MACOSX/darwin-perl-deps/ExtUtils/Helpers/._Windows.pmUT WO1cԦ1cux PK$TOq7. % $darwin-perl-deps/HTTP/Headers/Auth.pmUT bO1cL1cux PK$Tt,0 $__MACOSX/darwin-perl-deps/HTTP/Headers/._Auth.pmUT bO1cԦ1cux PK$T/ % $darwin-perl-deps/HTTP/Headers/Util.pmUT bO1cL1cux PK$Tt,0 $ __MACOSX/darwin-perl-deps/HTTP/Headers/._Util.pmUT bO1cԦ1cux PK$T U % $ darwin-perl-deps/HTTP/Headers/ETag.pmUT bO1cL1cux PK$Tt,0 $__MACOSX/darwin-perl-deps/HTTP/Headers/._ETag.pmUT bO1cԦ1cux PK$T4pg?' $darwin-perl-deps/HTTP/Request/Common.pmUT bO1cL1cux PK$Tt,2 $&__MACOSX/darwin-perl-deps/HTTP/Request/._Common.pmUT bO1cԦ1cux PKw$R+'Z #* $'darwin-perl-deps/HTTP/Cookies/Microsoft.pmUT _P1cL1cux PKw$Rt,5 $5__MACOSX/darwin-perl-deps/HTTP/Cookies/._Microsoft.pmUT _P1cԦ1cux PKw$R&K ) $6darwin-perl-deps/HTTP/Cookies/Netscape.pmUT _O1cL1cux PKw$Rt,4 $w=__MACOSX/darwin-perl-deps/HTTP/Cookies/._Netscape.pmUT _O1cԦ1cux PKTn$! $>darwin-perl-deps/URI/file/Unix.pmUT hebO1cL1cux PKTt,, $@__MACOSX/darwin-perl-deps/URI/file/._Unix.pmUT hebO1cԦ1cux PKT||Q $Adarwin-perl-deps/URI/file/QNX.pmUT hebO1cL1cux PKTt,+ $DC__MACOSX/darwin-perl-deps/URI/file/._QNX.pmUT hebO1cԦ1cux PKT[" $DDdarwin-perl-deps/URI/file/Win32.pmUT hebO1cL1cux PKTt,- $G__MACOSX/darwin-perl-deps/URI/file/._Win32.pmUT hebO1cԦ1cux PKTƅ^1 $Hdarwin-perl-deps/URI/file/OS2.pmUT hebO1cL1cux PKTt,+ $iJ__MACOSX/darwin-perl-deps/URI/file/._OS2.pmUT hebO1cԦ1cux PKTqW $iKdarwin-perl-deps/URI/file/Mac.pmUT hebO1cL1cux PKTt,+ $O__MACOSX/darwin-perl-deps/URI/file/._Mac.pmUT hebO1cԦ1cux PKTziP! $Pdarwin-perl-deps/URI/file/Base.pmUT hebO1cL1cux PKTt,, $XS__MACOSX/darwin-perl-deps/URI/file/._Base.pmUT hebO1cԦ1cux PKTe+XL $YTdarwin-perl-deps/URI/file/FAT.pmUT hebO1cL1cux PKTt,+ $V__MACOSX/darwin-perl-deps/URI/file/._FAT.pmUT hebO1cԦ1cux PKTu $Wdarwin-perl-deps/URI/urn/oid.pmUT hebO1cL1cux PKTt,* $NX__MACOSX/darwin-perl-deps/URI/urn/._oid.pmUT hebO1cԦ1cux PKTPZo $MYdarwin-perl-deps/URI/urn/isbn.pmUT hebO1cL1cux PKTt,+ $@]__MACOSX/darwin-perl-deps/URI/urn/._isbn.pmUT hebO1cԦ1cux PK5q:U5\ / $@^darwin-perl-deps/Module/Build/Platform/MacOS.pmUT 1cM1cL1cux PK5q:Ut,: $Ee__MACOSX/darwin-perl-deps/Module/Build/Platform/._MacOS.pmUT 1cM1cԦ1cux PK5q:UpI. $Tfdarwin-perl-deps/Module/Build/Platform/Unix.pmUT 1cM1cL1cux PK5q:Ut,9 $j__MACOSX/darwin-perl-deps/Module/Build/Platform/._Unix.pmUT 1cM1cԦ1cux PK5q:Uِe=;- $kdarwin-perl-deps/Module/Build/Platform/VOS.pmUT 1cM1cL1cux PK5q:Ut,8 $m__MACOSX/darwin-perl-deps/Module/Build/Platform/._VOS.pmUT 1cM1cԦ1cux PK5q:U<*G7/- $ndarwin-perl-deps/Module/Build/Platform/VMS.pmUT 1cM1cL1cux PK5q:Ut,8 $I__MACOSX/darwin-perl-deps/Module/Build/Platform/._VMS.pmUT 1cM1cԦ1cux PK5q:UF~B 1 $Vdarwin-perl-deps/Module/Build/Platform/Default.pmUT 1cM1cL1cux PK5q:Ut,< $__MACOSX/darwin-perl-deps/Module/Build/Platform/._Default.pmUT 1cM1cԦ1cux PK5q:U FJZ0 $(darwin-perl-deps/Module/Build/Platform/cygwin.pmUT 1cM1cL1cux PK5q:Ut,; $__MACOSX/darwin-perl-deps/Module/Build/Platform/._cygwin.pmUT 1cM1cԦ1cux PK5q:U7~- $darwin-perl-deps/Module/Build/Platform/os2.pmUT 1cM1cL1cux PK5q:Ut,8 $\__MACOSX/darwin-perl-deps/Module/Build/Platform/._os2.pmUT 1cM1cԦ1cux PK5q:UYt*- $idarwin-perl-deps/Module/Build/Platform/aix.pmUT 1cM1cL1cux PK5q:Ut,8 $__MACOSX/darwin-perl-deps/Module/Build/Platform/._aix.pmUT 1cM1cԦ1cux PK5q:U6Q:0 $Ɏdarwin-perl-deps/Module/Build/Platform/darwin.pmUT 1cM1cL1cux PK5q:Ut,; $&__MACOSX/darwin-perl-deps/Module/Build/Platform/._darwin.pmUT 1cM1cԦ1cux PK5q:UKK&v =1 $6darwin-perl-deps/Module/Build/Platform/Windows.pmUT 1cM1cL1cux PK5q:Ut,< $+__MACOSX/darwin-perl-deps/Module/Build/Platform/._Windows.pmUT 1cM1cԦ1cux PKT0|+. $<darwin-perl-deps/IO/Compress/Gzip/Constants.pmUT LbM1cL1cux PKTt,9 $4__MACOSX/darwin-perl-deps/IO/Compress/Gzip/._Constants.pmUT LbM1cԦ1cux PKT52/ $Bdarwin-perl-deps/IO/Compress/Adapter/Deflate.pmUT LbM1cL1cux PKTt,: $__MACOSX/darwin-perl-deps/IO/Compress/Adapter/._Deflate.pmUT LbM1cԦ1cux PKTllƣ - $darwin-perl-deps/IO/Compress/Adapter/Bzip2.pmUT LbM1cL1cux PKTt,8 $__MACOSX/darwin-perl-deps/IO/Compress/Adapter/._Bzip2.pmUT LbM1cԦ1cux PKTL0 $+darwin-perl-deps/IO/Compress/Adapter/Identity.pmUT LbM1cL1cux PKTt,; $t__MACOSX/darwin-perl-deps/IO/Compress/Adapter/._Identity.pmUT LbM1cԦ1cux PKTJ!elq* $darwin-perl-deps/IO/Compress/Zlib/Extra.pmUT LbM1cL1cux PKTt,5 $m__MACOSX/darwin-perl-deps/IO/Compress/Zlib/._Extra.pmUT LbM1cԦ1cux PKT y. $wdarwin-perl-deps/IO/Compress/Zlib/Constants.pmUT LbM1cL1cux PKTt,9 $ø__MACOSX/darwin-perl-deps/IO/Compress/Zlib/._Constants.pmUT LbM1cԦ1cux PKTf!YB- $ѹdarwin-perl-deps/IO/Compress/Zip/Constants.pmUT LbM1cL1cux PKTt,8 $T__MACOSX/darwin-perl-deps/IO/Compress/Zip/._Constants.pmUT LbM1cԦ1cux PKT>qXX+ $adarwin-perl-deps/IO/Compress/Base/Common.pmUT LbM1cL1cux PKTt,6 $2__MACOSX/darwin-perl-deps/IO/Compress/Base/._Common.pmUT LbM1cԦ1cux PKTEb 1 $=darwin-perl-deps/IO/Uncompress/Adapter/Inflate.pmUT LbM1cL1cux PKTt,< $__MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Inflate.pmUT LbM1cԦ1cux PKT%wږ1 $/darwin-perl-deps/IO/Uncompress/Adapter/Bunzip2.pmUT LbM1cL1cux PKTt,< $D__MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Bunzip2.pmUT LbM1cԦ1cux PKT'n2 mUdarwin-perl-deps/IO/Uncompress/Adapter/Identity.pmUT LbM1cL1cux PKTt,= mC__MACOSX/darwin-perl-deps/IO/Uncompress/Adapter/._Identity.pmUT LbM1cԦ1cux PKzNP's,+ $Udarwin-perl-deps/IO/Socket/SSL/Intercept.pmUT QF^M1cL1cux PKzNPt,6 $__MACOSX/darwin-perl-deps/IO/Socket/SSL/._Intercept.pmUT QF^M1cԦ1cux PK&SY~7C. $darwin-perl-deps/IO/Socket/SSL/PublicSuffix.pmUT 0V6aM1cL1cux PK&St,9 $=.__MACOSX/darwin-perl-deps/IO/Socket/SSL/._PublicSuffix.pmUT 0V6aM1cԦ1cux PK&SZ=X' $K/darwin-perl-deps/IO/Socket/SSL/Utils.pmUT 0V6aM1cL1cux PK&St,2 $J__MACOSX/darwin-perl-deps/IO/Socket/SSL/._Utils.pmUT 0V6aM1cԦ1cux PKq:U) AKdarwin-perl-deps/XML/SAX/PurePerl/Reader/UT 1cp1cL1cux PKq:Ut,3 .L__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._ReaderUT 1cp1cԦ1cux PKN N&. $6Mdarwin-perl-deps/XML/SAX/PurePerl/Exception.pmUT ]M1cL1cux PKN Nt,9 $6P__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._Exception.pmUT ]M1cԦ1cux PKN Na3t1 $DQdarwin-perl-deps/XML/SAX/PurePerl/NoUnicodeExt.pmUT ]M1cL1cux PKN Nt,< $R__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._NoUnicodeExt.pmUT ]M1cԦ1cux PKN N6:oZ `B- $Sdarwin-perl-deps/XML/SAX/PurePerl/DTDDecls.pmUT ]M1cL1cux PKN Nt,8 $`__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._DTDDecls.pmUT ]M1cԦ1cux PKN NNg= , $adarwin-perl-deps/XML/SAX/PurePerl/XMLDecl.pmUT ]M1cL1cux PKN Nt,7 $ye__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._XMLDecl.pmUT ]M1cԦ1cux PKN N.D 3 $fdarwin-perl-deps/XML/SAX/PurePerl/EncodingDetect.pmUT ]M1cL1cux PKN Nt,> $i__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._EncodingDetect.pmUT ]M1cԦ1cux PKN N*W1 $'jdarwin-perl-deps/XML/SAX/PurePerl/DebugHandler.pmUT ]M1cL1cux PKN Nt,< $ql__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._DebugHandler.pmUT ]M1cԦ1cux PKN N w + $mdarwin-perl-deps/XML/SAX/PurePerl/Reader.pmUT ]M1cL1cux PKN Nt,6 $rq__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._Reader.pmUT ]M1cԦ1cux PKN Nz]Xq/ $}rdarwin-perl-deps/XML/SAX/PurePerl/UnicodeExt.pmUT ]M1cL1cux PKN Nt,: $s__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._UnicodeExt.pmUT ]M1cԦ1cux PK N5+12, $tdarwin-perl-deps/XML/SAX/PurePerl/DocType.pmUT ]M1cL1cux PK Nt,7 $y__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._DocType.pmUT ]M1cԦ1cux PKN Nk0 $zdarwin-perl-deps/XML/SAX/PurePerl/Productions.pmUT ]M1cL1cux PKN Nt,; $__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/._Productions.pmUT ]M1cԦ1cux PK-SuH $ darwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable/Process.pmUT Y?aN1cL1cux PK-St,S $X__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Proc/ProcessTable/._Process.pmUT Y?aN1cԦ1cux PKT٬f*A $darwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/Bzip2.pmUT LbN1cL1cux PKTt,L $)__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/._Bzip2.pmUT LbN1cԦ1cux PKyPT-.@ $Jdarwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/Zlib.pmUT gdbN1cL1cux PKyPTt,K $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/Compress/Raw/._Zlib.pmUT gdbN1cԦ1cux PKtq:U: Adarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/UT 1cl1cL1cux PKtq:Ut,D 큉__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/._PIDUT 1cl1cԦ1cux PKq:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/Daemon/UT җ1cl1cL1cux PKq:Ut,G __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/._DaemonUT җ1cl1cԦ1cux PKq:UC A9darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/ProcessTable/UT y1cl1cL1cux PKq:Ut,M 큺__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/._ProcessTableUT y1cl1cԦ1cux PKq:U> Adarwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/UT 1cl1cL1cux PKq:Ut,H X__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/._RawUT 1cl1cԦ1cux PKq:U< Audarwin-perl-deps/darwin-thread-multi-2level/auto/Mozilla/CA/UT 21cl1cL1cux PKq:Ut,F __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mozilla/._CAUT 21cl1cԦ1cux PK(q:U@ A darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/MediaTypes/UT m1cl1cL1cux PK(q:Ut,J 큈__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._MediaTypesUT m1cl1cԦ1cux PKq:U> Adarwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/UT 1cl1cL1cux PKq:Ut,H #__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._ProtocolUT 1cl1cԦ1cux PKq:URC{> @darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/.packlistUT 1cԘ1cL1cux PKq:Ut,I __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/._.packlistUT 1cԘ1cԦ1cux PKUq:U: A-darwin-perl-deps/darwin-thread-multi-2level/auto/Net/HTTP/UT –1cl1cL1cux PKUq:Ut,D 큥__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._HTTPUT –1cl1cԦ1cux PKq:U< Adarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/UT 1cl1cL1cux PKq:Ut,F 8__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._SSLeayUT 1cl1cԦ1cux PKq:U8 ASdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/UT 1cm1cL1cux PKq:Ut,B __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/._IPUT 1cm1cԦ1cux PKq:U; Adarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/UT 1cm1cL1cux PKq:Ut,E Y__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._WarnUT 1cm1cԦ1cux PKUq:UG Asdarwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/UT Ö1cm1cL1cux PKUq:Ut,Q __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._RequiresInternetUT Ö1cm1cԦ1cux PK*q:U< Adarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/UT p1cm1cL1cux PK*q:Ut,F 큘__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._NeedsUT p1cm1cԦ1cux PK(q:U< Adarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/UT l1cm1cL1cux PK(q:Ut,F -__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/._FatalUT l1cm1cԦ1cux PK$q:U> AHdarwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/UT e1cm1cL1cux PK$q:Ut,H __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/File/._ListingUT e1cm1cԦ1cux PKPq:U> Adarwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/UT 1cm1cL1cux PKPq:Ut,H ]__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/._BuildUT 1cm1cԦ1cux PK"q:U< Azdarwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/UT a1cm1cL1cux PK"q:Ut,F __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Date/._ParseUT a1cm1cԦ1cux PKq:U< Adarwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/UT —1cm1cL1cux PKq:Ut,F 큉__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/._EDIDUT —1cm1cԦ1cux PKq:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/IO/Compress/UT 1cm1cL1cux PKq:Ut,G __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._CompressUT 1cm1cԦ1cux PK&q:U9 A;darwin-perl-deps/darwin-thread-multi-2level/auto/IO/HTML/UT h1cm1cL1cux PK&q:Ut,C 큲__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._HTMLUT h1cm1cԦ1cux PKq:U; Adarwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/UT a1cm1cL1cux PKq:Ut,E C__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/._SocketUT a1cm1cԦ1cux PK!q:U? A]darwin-perl-deps/darwin-thread-multi-2level/auto/Encode/Locale/UT _1cm1cL1cux PK!q:Ut,I __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Encode/._LocaleUT _1cm1cԦ1cux PK%q:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Tagset/UT f1cm1cL1cux PK%q:Ut,G s__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/._TagsetUT f1cm1cԦ1cux PK/q:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/HTML/Parser/UT {1cm1cL1cux PK/q:Ut,G __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTML/._ParserUT {1cm1cԦ1cux PKXq:U@ A&darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/RobotRules/UT ɖ1cm1cL1cux PKXq:Ut,J 큤__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/WWW/._RobotRulesUT ɖ1cm1cԦ1cux PKq:U9 Adarwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/UT 1cm1cL1cux PKq:Ut,C :__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._SAXUT 1cm1cԦ1cux PKq:U< ARdarwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/UT 1cm1cL1cux PKq:Ut,F __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._ParserUT 1cm1cԦ1cux PKq:U< Adarwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/UT 1cm1cL1cux PKq:Ut,F a__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._SimpleUT 1cm1cԦ1cux PKkq:UF A|darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/UT 1cm1cL1cux PKkq:Ut,P __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._NamespaceSupportUT 1cm1cԦ1cux PKq:U> A%darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/UT o1cm1cL1cux PKq:Ut,H 큡__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/._EntitiesUT o1cm1cԦ1cux PKq:UB Adarwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/UT q1cm1cL1cux PKq:Ut,L >__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/._PropertyListUT q1cm1cԦ1cux PKq:U@ A_darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/UT ×1cm1cL1cux PKq:Ut,J __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/._SysProfileUT ×1cm1cԦ1cux PKq:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/UT 1cm1cL1cux PKq:Ut,G w__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/._UplevelUT 1cm1cԦ1cux PKkq:UB Adarwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/UT 1cm1cL1cux PKkq:Ut,L __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._ParseXSUT 1cm1cԦ1cux PK4q:UA A4darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/UT 1cm1cL1cux PK4q:Ut,K 큳__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._ConfigUT 1cm1cԦ1cux PK5q:UG Adarwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/UT 1cm1cL1cux PK5q:Ut,Q X __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._InstallPathsUT 1cm1cԦ1cux PK4q:UB A~ darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/UT 1cm1cL1cux PK4q:Ut,L __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/._HelpersUT 1cm1cԦ1cux PKTq:U@ A darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/UT 1cm1cL1cux PKTq:Ut,J 큝 __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._NegotiateUT 1cm1cԦ1cux PK#q:U; A darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/UT b1cm1cL1cux PK#q:Ut,E 5__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._DateUT b1cm1cԦ1cux PK-q:U> AOdarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/UT v1cm1cL1cux PK-q:Ut,H __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._MessageUT v1cm1cԦ1cux PKSq:U= Adarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/UT 1cm1cL1cux PKSq:Ut,G c__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._DaemonUT 1cm1cԦ1cux PK0q:U> Adarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/UT }1cm1cL1cux PK0q:Ut,H __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/._CookiesUT }1cm1cԦ1cux PKq:U; Adarwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/UT i1cm1cL1cux PKq:Ut,E 큑__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/._UtilUT i1cm1cԦ1cux PKq:Ubb:BA darwin-perl-deps/darwin-thread-multi-2level/auto/Switch/.packlistUT ŗ1cԘ1cL1cux PKq:Ut,L t__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Switch/._.packlistUT ŗ1cԘ1cԦ1cux PK'q:U: Adarwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/UT k1cm1cL1cux PK'q:Ut,D __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Try/._TinyUT k1cm1cԦ1cux PKq:UˠX UaC &darwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/.packlistUT 1cԘ1cL1cux PKq:Ut,N __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XSLoader/._.packlistUT 1cԘ1cԦ1cux PKq:U; A/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/UT k1cm1cL1cux PKq:Ut,E 큨__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/._UUIDUT k1cm1cԦ1cux PKmq:UNk> darwin-perl-deps/darwin-thread-multi-2level/auto/URI/.packlistUT 1cԘ1cL1cux PKmq:Ut,I __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/URI/._.packlistUT 1cԘ1cԦ1cux PKq:UA Adarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/UT 1cm1cL1cux PKq:Ut,K V __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._EncodingsUT 1cm1cԦ1cux PK:8OOn(P? $v!darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Expat.pmUT ܧ]N1cL1cux PK:8Ot,J $qJ__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._Expat.pmUT ܧ]N1cԦ1cux PKq:U= AKdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/UT 1cm1cL1cux PKq:Ut,G L__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._StyleUT 1cm1cԦ1cux PKZ*8OT.F $'Mdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/LWPExternEnt.plUT ]N1cL1cux PKZ*8Ot,Q $P__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/._LWPExternEnt.plUT ]N1cԦ1cux PKU~UA; $Qdarwin-perl-deps/darwin-thread-multi-2level/List/Util/XS.pmUT bO1cL1cux PKU~Ut,F $T__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/List/Util/._XS.pmUT bO1cԦ1cux PKN N GK8 $Udarwin-perl-deps/XML/SAX/PurePerl/Reader/NoUnicodeExt.pmUT ]M1cL1cux PKN Nt,C $KW__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._NoUnicodeExt.pmUT ]M1cԦ1cux PKN N' 2 $cXdarwin-perl-deps/XML/SAX/PurePerl/Reader/Stream.pmUT ]M1cL1cux PKN Nt,= $[__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._Stream.pmUT ]M1cԦ1cux PKN NLkF6 $\darwin-perl-deps/XML/SAX/PurePerl/Reader/UnicodeExt.pmUT ]M1cL1cux PKN Nt,A $^__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._UnicodeExt.pmUT ]M1cԦ1cux PKN N`$V/ $-_darwin-perl-deps/XML/SAX/PurePerl/Reader/URI.pmUT ]M1cL1cux PKN Nt,: $b__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._URI.pmUT ]M1cԦ1cux PKN N'82 $cdarwin-perl-deps/XML/SAX/PurePerl/Reader/String.pmUT ]M1cL1cux PKN Nt,= $2f__MACOSX/darwin-perl-deps/XML/SAX/PurePerl/Reader/._String.pmUT ]M1cԦ1cux PKtq:U? ADgdarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/UT 1cl1cL1cux PKtq:Ut,I g__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/._FileUT 1cl1cԦ1cux PKq:UI $rdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx.alUT 1cN1cL1cux PKq:Ut,T $֞__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx.alUT 1cN1cԦ1cux PKq:UWUK/H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx2.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_httpx2.alUT 1cN1cԦ1cux PKq:U?I $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx.alUT 1cN1cL1cux PKq:Ut,T $n__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_httpx.alUT 1cN1cԦ1cux PKq:U AI $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http3.alUT 1cN1cL1cux PKq:Ut,T $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http3.alUT 1cN1cԦ1cux PKq:U1-NE $)darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcpcat.alUT 1cN1cL1cux PKq:Ut,P $C__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcpcat.alUT 1cN1cԦ1cux PKq:U,?I $hdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx3.alUT 1cN1cL1cux PKq:Ut,T $έ__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx3.alUT 1cN1cԦ1cux PKq:UKH $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/randomize.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._randomize.alUT 1cN1cԦ1cux PKq:UA\eH $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https4.alUT 1cN1cL1cux PKq:Ut,S $*__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https4.alUT 1cN1cԦ1cux PKq:UkSBI $Rdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http3.alUT 1cN1cL1cux PKq:Ut,T $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_http3.alUT 1cN1cԦ1cux PKq:UW[7?K $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/make_headers.alUT 1cN1cL1cux PKq:Ut,V $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._make_headers.alUT 1cN1cԦ1cux PKq:UOXn/I $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/initialize.alUT 1cN1cL1cux PKq:Ut,T $.__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._initialize.alUT 1cN1cԦ1cux PKq:Um<X $Wdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/open_proxy_tcp_connection.alUT 1cN1cL1cux PKq:Ut,c $9__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._open_proxy_tcp_connection.alUT 1cN1cԦ1cux PKq:UhfG $qdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https.alUT 1cN1cL1cux PKq:Ut,R $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https.alUT 1cN1cԦ1cux PKq:Uq';H $Cdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/set_proxy.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._set_proxy.alUT 1cN1cԦ1cux PKq:U-<H $<darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx.alUT 1cN1cԦ1cux PKq:UV]5H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_read.alUT 1cN1cL1cux PKq:Ut,S $&__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_read.alUT 1cN1cԦ1cux PKq:U ?7K $Ndarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_all.alUT 1cN1cL1cux PKq:Ut,V $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_all.alUT 1cN1cԦ1cux PKq:U^2T $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/dump_peer_certificate.alUT 1cN1cL1cux PKq:Ut,_ $/__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._dump_peer_certificate.alUT 1cN1cԦ1cux PKq:U#H M $cdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_until.alUT 1cN1cL1cux PKq:Ut,X $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_read_until.alUT 1cN1cԦ1cux PKq:U6G<O $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/set_cert_and_key.alUT 1cN1cL1cux PKq:Ut,Z $H__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._set_cert_and_key.alUT 1cN1cԦ1cux PKq:UBI $wdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https4.alUT 1cN1cL1cux PKq:Ut,T $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_https4.alUT 1cN1cԦ1cux PKq:U뒔H $ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx3.alUT 1cN1cL1cux PKq:Ut,S $j__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_httpx3.alUT 1cN1cԦ1cux PKq:Uċ?H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_http3.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_http3.alUT 1cN1cԦ1cux PKq:UZ?H $#darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_https.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_https.alUT 1cN1cԦ1cux PKq:U{J $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx4.alUT 1cN1cL1cux PKq:Ut,U $L__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_httpx4.alUT 1cN1cԦ1cux PKq:Ua&fL $vdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_write_all.alUT 1cN1cL1cux PKq:Ut,W $6__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_write_all.alUT 1cN1cԦ1cux PKq:Uǹ?I $bdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx3.alUT 1cN1cL1cux PKq:Ut,T $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx3.alUT 1cN1cԦ1cux PKq:UEDJ $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_https3.alUT 1cN1cL1cux PKq:Ut,U $X__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_https3.alUT 1cN1cԦ1cux PKq:U W<H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx.alUT 1cN1cԦ1cux PKq:U\?H $ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http.alUT 1cN1cL1cux PKq:Ut,S $t__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_http.alUT 1cN1cԦ1cux PKq:Ue)>H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http.alUT 1cN1cԦ1cux PKq:UB?H $+darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_https.alUT 1cN1cԦ1cux PKq:U@I?H $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_http3.alUT 1cN1cL1cux PKq:Ut,S $ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_http3.alUT 1cN1cԦ1cux PKq:U٤ѯ-H $Hdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/autosplit.ixUT 1cN1cL1cux PKq:Ut,S $ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._autosplit.ixUT 1cN1cԦ1cux PKq:UJ_dAJ $ darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx4.alUT 1cN1cL1cux PKq:Ut,U $0 __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx4.alUT 1cN1cԦ1cux PKq:UezI $Zdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/debug_read.alUT 1cN1cL1cux PKq:Ut,T $k__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._debug_read.alUT 1cN1cԦ1cux PKq:U{ \-M $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_write_CRLF.alUT 1cN1cL1cux PKq:Ut,X $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_write_CRLF.alUT 1cN1cԦ1cux PKq:UEJ $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_https3.alUT 1cN1cL1cux PKq:Ut,U $p__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_https3.alUT 1cN1cԦ1cux PKq:UӵBI $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_https4.alUT 1cN1cL1cux PKq:Ut,T $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_https4.alUT 1cN1cԦ1cux PKq:UR(.H $-darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/httpx_cat.alUT 1cN1cL1cux PKq:Ut,S $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._httpx_cat.alUT 1cN1cԦ1cux PKq:Ux~;wAI $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_https.alUT 1cN1cL1cux PKq:Ut,T $|__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_https.alUT 1cN1cԦ1cux PKq:U,pHL $darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_write_all.alUT 1cN1cL1cux PKq:Ut,W $"__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_write_all.alUT 1cN1cԦ1cux PKq:U` BH $#darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/new_x_ctx.alUT 1cN1cL1cux PKq:Ut,S $T&__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._new_x_ctx.alUT 1cN1cԦ1cux PKq:UhO $|'darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_X509_lookup.alUT 1cN1cL1cux PKq:Ut,Z $*)__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_X509_lookup.alUT 1cN1cԦ1cux PKq:UBI $Y*darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_https.alUT 1cN1cL1cux PKq:Ut,T $+__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_https.alUT 1cN1cԦ1cux PKq:US<G $,darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_http.alUT 1cN1cL1cux PKq:Ut,R $T.__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_http.alUT 1cN1cԦ1cux PKq:U_SV ${/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/set_server_cert_and_key.alUT 1cN1cL1cux PKq:Ut,a $1__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._set_server_cert_and_key.alUT 1cN1cԦ1cux PKq:U*8I $K2darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_write.alUT 1cN1cL1cux PKq:Ut,T $3__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_write.alUT 1cN1cԦ1cux PKq:Ukv| E $4darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/sslcat.alUT 1cN1cL1cux PKq:Ut,P $f:__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._sslcat.alUT 1cN1cԦ1cux PKq:UeEAJ $;darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx3.alUT 1cN1cL1cux PKq:Ut,U $<__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_httpx3.alUT 1cN1cԦ1cux PKq:Uw-G $>darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/http_cat.alUT 1cN1cL1cux PKq:Ut,R $@__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._http_cat.alUT 1cN1cԦ1cux PKq:Uy?BI $Bdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_https3.alUT 1cN1cL1cux PKq:Ut,T $jC__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_https3.alUT 1cN1cԦ1cux PKq:U֩L $Ddarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_CRLF.alUT 1cN1cL1cux PKq:Ut,W $F__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_read_CRLF.alUT 1cN1cԦ1cux PKq:UٹMJ $GGdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_https4.alUT 1cN1cL1cux PKq:Ut,U $H__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_https4.alUT 1cN1cԦ1cux PKq:Uʰa H $Idarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/https_cat.alUT 1cN1cL1cux PKq:Ut,S $O__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._https_cat.alUT 1cN1cԦ1cux PKq:UAsgM $9Pdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_write_CRLF.alUT 1cN1cL1cux PKq:Ut,X $vR__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_write_CRLF.alUT 1cN1cԦ1cux PKq:UKlXqL $Sdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_CRLF.alUT 1cN1cL1cux PKq:Ut,W $2U__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_CRLF.alUT 1cN1cԦ1cux PKq:U)~9?H $^Vdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_http4.alUT 1cN1cL1cux PKq:Ut,S $W__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_http4.alUT 1cN1cԦ1cux PKq:U+?I $Xdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx4.alUT 1cN1cL1cux PKq:Ut,T $MZ__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._get_httpx4.alUT 1cN1cԦ1cux PKq:UIXBJ $v[darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx3.alUT 1cN1cL1cux PKq:Ut,U $\__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_httpx3.alUT 1cN1cԦ1cux PKq:UhDJ $^darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_https4.alUT 1cN1cL1cux PKq:Ut,U $r___MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_https4.alUT 1cN1cԦ1cux PKq:Uy'R $`darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/open_tcp_connection.alUT 1cN1cL1cux PKq:Ut,] $c__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._open_tcp_connection.alUT 1cN1cԦ1cux PKq:Uz vi\H $edarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/make_form.alUT 1cN1cL1cux PKq:Ut,S $g__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._make_form.alUT 1cN1cԦ1cux PKq:UoVyG H $6hdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx4.alUT 1cN1cL1cux PKq:Ut,S $j__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_httpx4.alUT 1cN1cԦ1cux PKq:UXc?H $;kdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_http4.alUT 1cN1cL1cux PKq:Ut,S $l__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_http4.alUT 1cN1cԦ1cux PKq:UųmBI $mdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_https3.alUT 1cN1cL1cux PKq:Ut,T $6o__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_https3.alUT 1cN1cԦ1cux PKq:U  I m_pdarwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/SSLeay.bundleUT 1cN1cL1cux PKq:Ut,T m}!__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._SSLeay.bundleUT 1cN1cԦ1cux PKq:Uk"#H $"darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https2.alUT 1cN1cL1cux PKq:Ut,S $W$__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https2.alUT 1cN1cԦ1cux PKq:U0. F $%darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcpxcat.alUT 1cN1cL1cux PKq:Ut,Q $ '__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcpxcat.alUT 1cN1cԦ1cux PKq:UAI $F(darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/post_http4.alUT 1cN1cL1cux PKq:Ut,T $)__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._post_http4.alUT 1cN1cԦ1cux PKq:UM[C1E *darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/.packlistUT ŗ1cԘ1cL1cux PKq:Ut,P e-__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._.packlistUT ŗ1cԘ1cԦ1cux PKq:U5"H $.darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/do_https3.alUT 1cN1cL1cux PKq:Ut,S $B0__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._do_https3.alUT 1cN1cԦ1cux PKq:U?I $j1darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx4.alUT 1cN1cL1cux PKq:Ut,T $2__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._put_httpx4.alUT 1cN1cԦ1cux PKq:U}DZI $3darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/head_http4.alUT 1cN1cL1cux PKq:Ut,T $m5__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._head_http4.alUT 1cN1cԦ1cux PKq:UzeK $6darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/want_nothing.alUT 1cN1cL1cux PKq:Ut,V $8__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._want_nothing.alUT 1cN1cԦ1cux PKq:UQK $99darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_all.alUT 1cN1cL1cux PKq:Ut,V $;__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._ssl_read_all.alUT 1cN1cԦ1cux PKq:USM $<darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_until.alUT 1cN1cL1cux PKq:Ut,X $?__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/SSLeay/._tcp_read_until.alUT 1cN1cԦ1cux PKq:Ux(QoA @darwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/.packlistUT 1cԘ1cL1cux PKq:Ut,L A__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Net/IP/._.packlistUT 1cԘ1cԦ1cux PKq:UsMAID Bdarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/.packlistUT 1cԘ1cL1cux PKq:Ut,O C__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Warn/._.packlistUT 1cԘ1cԦ1cux PKUq:U,MaP Ddarwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/.packlistUT Ö1cԘ1cL1cux PKUq:Ut,[ E__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/RequiresInternet/._.packlistUT Ö1cԘ1cԦ1cux PKq:UEBKE Fdarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/.packlistUT |1cԘ1cL1cux PKq:Ut,P G__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Needs/._.packlistUT |1cԘ1cԦ1cux PK(q:UxpBKE Hdarwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/.packlistUT l1cԘ1cL1cux PK(q:Ut,P I__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Test/Fatal/._.packlistUT l1cԘ1cԦ1cux PKq:UNrDOG Jdarwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/.packlistUT d1cԘ1cL1cux PKq:Ut,R K__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/File/Listing/._.packlistUT d1cԘ1cԦ1cux PKPq:UC ALdarwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/UT 1cm1cL1cux PKPq:Ut,M >M__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/._TinyUT 1cm1cԦ1cux PKOq:UF]AG `Ndarwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/.packlistUT 1cԘ1cL1cux PKOq:Ut,R 6P__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/._.packlistUT 1cԘ1cԦ1cux PK"q:UIJE ]Qdarwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/.packlistUT a1cԘ1cL1cux PK"q:Ut,P :S__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Date/Parse/._.packlistUT a1cԘ1cԦ1cux PKq:U BKE _Tdarwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/.packlistUT —1cԘ1cL1cux PKq:Ut,P 4U__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Parse/EDID/._.packlistUT —1cԘ1cԦ1cux PKq:U8ZF YVdarwin-perl-deps/darwin-thread-multi-2level/auto/IO/Compress/.packlistUT 1cԘ1cL1cux PKq:Ut,Q GX__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Compress/._.packlistUT 1cԘ1cԦ1cux PK&q:UvE$?EB mYdarwin-perl-deps/darwin-thread-multi-2level/auto/IO/HTML/.packlistUT h1cԘ1cL1cux PK&q:Ut,M Adarwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/UT ~1cm1cL1cux PKq:Ut,H (__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/._BaseUT ~1cm1cԦ1cux PKq:UB AEdarwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/UT 1cm1cL1cux PKq:Ut,L Ź__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/._ExpatUT 1cm1cԦ1cux PKq:Ufk E darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/.packlistUT 1cԘ1cL1cux PKq:Ut,P __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/._.packlistUT 1cԘ1cԦ1cux PKq:U%.iWE darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/.packlistUT 1cԘ1cL1cux PKq:Ut,P __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Simple/._.packlistUT 1cԘ1cԦ1cux PKkq:UL_O darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/.packlistUT 1cԘ1cL1cux PKkq:Ut,Z __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/NamespaceSupport/._.packlistUT 1cԘ1cԦ1cux PKq:UQN.v'G 0darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/.packlistUT ė1cԘ1cL1cux PKq:Ut,R ;__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Entities/._.packlistUT ė1cԘ1cԦ1cux PKq:U߁i5K bdarwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/.packlistUT q1cԘ1cL1cux PKq:Ut,V d__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/PropertyList/._.packlistUT q1cԘ1cԦ1cux PKq:U;bFSI darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/.packlistUT ×1cԘ1cL1cux PKq:Ut,T l__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Mac/SysProfile/._.packlistUT ×1cԘ1cԦ1cux PKq:UHOICMF darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/.packlistUT 1cԘ1cL1cux PKq:Ut,Q l__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Sub/Uplevel/._.packlistUT 1cԘ1cԦ1cux PKkq:U9C &@K darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/.packlistUT 1cԘ1cL1cux PKkq:Ut,V __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/ParseXS/._.packlistUT 1cԘ1cԦ1cux PK4q:U!GUJ darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/.packlistUT 1cԘ1cL1cux PK4q:Ut,U __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Config/._.packlistUT 1cԘ1cԦ1cux PK5q:UEc2MaP &darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/.packlistUT 1cԘ1cL1cux PK5q:Ut,[ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/InstallPaths/._.packlistUT 1cԘ1cԦ1cux PK4q:UsϷpK Adarwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/.packlistUT 1cԘ1cL1cux PK4q:Ut,V J__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/ExtUtils/Helpers/._.packlistUT 1cԘ1cԦ1cux PKTq:UT?FSI udarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/.packlistUT 1cԘ1cL1cux PKTq:Ut,T R__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Negotiate/._.packlistUT 1cԘ1cԦ1cux PK#q:UAbAID {darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/.packlistUT b1cԘ1cL1cux PK#q:Ut,O N__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Date/._.packlistUT b1cԘ1cԦ1cux PK-q:UR~PDG rdarwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/.packlistUT v1cԘ1cL1cux PK-q:Ut,R __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Message/._.packlistUT v1cԘ1cԦ1cux PKSq:U#CMF darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/.packlistUT 1cԘ1cL1cux PKSq:Ut,Q __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Daemon/._.packlistUT 1cԘ1cԦ1cux PK0q:UhG darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/.packlistUT }1cԘ1cL1cux PK0q:Ut,R __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/HTTP/Cookies/._.packlistUT }1cԘ1cԦ1cux PKq:Udh NX,F mdarwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/Util.bundleUT f1cN1cL1cux PKq:Ut,Q m,__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/._Util.bundleUT f1cN1cԦ1cux PKq:Uj:KD -darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/.packlistUT i1cԘ1cL1cux PKq:Ut,O .__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/List/Util/._.packlistUT i1cԘ1cԦ1cux PK'q:U.y?GC 0darwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/.packlistUT k1cԘ1cL1cux PK'q:Ut,N 0__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Try/Tiny/._.packlistUT k1cԘ1cԦ1cux PKq:U?F!F m1darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/UUID.bundleUT k1cN1cL1cux PKq:Ut,Q mS__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/._UUID.bundleUT k1cN1cԦ1cux PKq:UVmD Tdarwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/.packlistUT k1cԘ1cL1cux PKq:Ut,O U__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Data/UUID/._.packlistUT k1cԘ1cԦ1cux PKZ*8O_0Q $Wdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1252.encUT ]1cL1cux PKZ*8Ot,\ ${Y__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1252.encUT ]1cԦ1cux PKZ*8O#Y0K $Zdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/ibm866.encUT ]1cL1cux PKZ*8Ot,V $#]__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._ibm866.encUT ]1cԦ1cux PKZ*8O* 0Q $N^darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1250.encUT ]1cL1cux PKZ*8Ot,\ $`__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1250.encUT ]1cԦ1cux PKZ*8O\^0Q $bdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1251.encUT ]1cL1cux PKZ*8Ot,\ $d__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1251.encUT ]1cԦ1cux PKZ*8OIm 0Q $edarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/windows-1255.encUT ]1cL1cux PKZ*8Ot,\ $Bh__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._windows-1255.encUT ]1cԦ1cux PKZ*8O/ggU $sidarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-euc-jp-unicode.encUT ]1cL1cux PKZ*8Ot,` $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-euc-jp-unicode.encUT ]1cԦ1cux PKZ*8O d80O $darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-3.encUT ]1cL1cux PKZ*8Ot,Z $+__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-3.encUT ]1cԦ1cux PKZ*8OT)<OQ $Zdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-cp932.encUT ]1cL1cux PKZ*8Ot,\ $"__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-cp932.encUT ]1cԦ1cux PKZ*8O/10O $Sdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-2.encUT ]1cL1cux PKZ*8Ot,Z $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-2.encUT ]1cԦ1cux PKZ*8O#8GS $darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-unicode.encUT ]1cL1cux PKZ*8Ot,^ $P__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-unicode.encUT ]1cԦ1cux PKZ*8O!?0O $Qdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-7.encUT ]1cL1cux PKZ*8Ot,Z $T__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-7.encUT ]1cԦ1cux PKZ*8OM0O $LUdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-5.encUT ]1cL1cux PKZ*8Ot,Z $W__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-5.encUT ]1cԦ1cux PKZ*8O(^R0O $Xdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-4.encUT ]1cL1cux PKZ*8Ot,Z $[__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-4.encUT ]1cԦ1cux PKZ*8OlFLG $B\darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/READMEUT ]N1cL1cux PKZ*8Ot,R $~`__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._READMEUT ]N1cԦ1cux PKZ*8O0q0O $adarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-9.encUT ]1cL1cux PKZ*8Ot,Z $c__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-9.encUT ]1cԦ1cux PKZ*8Oؒ\0O $ddarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-8.encUT ]1cL1cux PKZ*8Ot,Z $f__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-8.encUT ]1cԦ1cux PKZ*8OE&jkI $!hdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/big5.encUT ]1cL1cux PKZ*8Ot,T $"__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._big5.encUT ]1cԦ1cux PKZ*8ORx08GT $Kdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-jisx0221.encUT ]1cL1cux PKZ*8Ot,_ $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-jisx0221.encUT ]1cԦ1cux PKZ*8O:\W $4darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/Japanese_Encodings.msgUT ]N1cL1cux PKZ*8Ot,b $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._Japanese_Encodings.msgUT ]N1cԦ1cux PKZ*8OK $darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/euc-kr.encUT ]1cL1cux PKZ*8Ot,V $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._euc-kr.encUT ]1cԦ1cux PKZ*8O̿Ž0P $Idarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/iso-8859-15.encUT ]1cL1cux PKZ*8Ot,[ $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._iso-8859-15.encUT ]1cԦ1cux PKZ*8OWƑgV $Ԣdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-euc-jp-jisx0221.encUT ]1cL1cux PKZ*8Ot,a $ __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-euc-jp-jisx0221.encUT ]1cԦ1cux PKZ*8OTe0K $? darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/koi8-r.encUT ]1cL1cux PKZ*8Ot,V $__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._koi8-r.encUT ]1cԦ1cux PKZ*8O8GR $darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/x-sjis-jdk117.encUT ]1cL1cux PKZ*8Ot,] $H__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Encodings/._x-sjis-jdk117.encUT ]1cԦ1cux PKZ*8OG$dD $Idarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Tree.pmUT ]O1cL1cux PKZ*8Ot,O $5N__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Tree.pmUT ]O1cԦ1cux PKZ*8O_QD $YOdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Subs.pmUT ]P1cL1cux PKZ*8Ot,O $Q__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Subs.pmUT ]P1cԦ1cux PKZ*8O/G-F $ Sdarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Stream.pmUT ]O1cL1cux PKZ*8Ot,Q $zX__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Stream.pmUT ]O1cԦ1cux PKZ*8OyE $Ydarwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Debug.pmUT ]O1cL1cux PKZ*8Ot,P $ \__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Debug.pmUT ]O1cԦ1cux PKZ*8O$JG $0]darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/Objects.pmUT ]O1cL1cux PKZ*8Ot,R $`__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/XML/Parser/Style/._Objects.pmUT ]O1cԦ1cux PKtq:U FIRH adarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/.packlistUT 1cԘ1cL1cux PKtq:Ut,S b__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/PID/File/._.packlistUT 1cԘ1cԦ1cux PKq:UЯj\hW $cdarwin-perl-deps/darwin-thread-multi-2level/auto/Proc/ProcessTable/Process/autosplit.ixUT r1cN1cL1cux PKq:Ut,b $d__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Proc/ProcessTable/Process/._autosplit.ixUT r1cN1cԦ1cux PKq:U3)'gp=N m2fdarwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/Zlib.bundleUT 1cN1cL1cux PKq:Ut,Y m)__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/._Zlib.bundleUT 1cN1cԦ1cux PKq:U#2vL +darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/.packlistUT 1cԘ1cL1cux PKq:Ut,W ,__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Zlib/._.packlistUT 1cԘ1cԦ1cux PKq:UMZGP mL-darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Bzip2/Bzip2.bundleUT 1cN1cL1cux PKq:Ut,[ m__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Bzip2/._Bzip2.bundleUT 1cN1cԦ1cux PKq:U ] wM 4darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Bzip2/.packlistUT 1cԘ1cL1cux PKq:Ut,X F__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Compress/Raw/Bzip2/._.packlistUT 1cԘ1cԦ1cux PKq:UN\M sdarwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/https/.packlistUT 1cԘ1cL1cux PKq:Ut,X \__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/LWP/Protocol/https/._.packlistUT 1cԘ1cԦ1cux PKPq:U&MZL darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/.packlistUT 1cԘ1cL1cux PKPq:Ut,W p__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/Module/Build/Tiny/._.packlistUT 1cԘ1cԦ1cux PKq:UIlH darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/SSL/.packlistUT a1cԘ1cL1cux PKq:Ut,S __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/IO/Socket/SSL/._.packlistUT a1cԘ1cԦ1cux PKq:UeIRH ܿdarwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Expat/.packlistUT 1cԘ1cL1cux PKq:Ut,S __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Expat/._.packlistUT 1cԘ1cԦ1cux PKq:Ux$;Jj G darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/.packlistUT ~1cԘ1cL1cux PKq:Ut,R __MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/SAX/Base/._.packlistUT ~1cԘ1cԦ1cux PKq:U_8lN m darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/Expat.bundleUT 1cN1cL1cux PKq:Ut,Y m0__MACOSX/darwin-perl-deps/darwin-thread-multi-2level/auto/XML/Parser/Expat/._Expat.bundleUT 1cN1cԦ1cux PK 2UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/000077500000000000000000000000001432320066700226115ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/.gitignore000066400000000000000000000000301432320066700245720ustar00rootroot00000000000000*.xcarchive app/ build/ UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/OCS Inventory Pkg Setup.pkgproj000066400000000000000000000563431432320066700304070ustar00rootroot00000000000000 PACKAGES MUST-CLOSE-APPLICATION-ITEMS MUST-CLOSE-APPLICATIONS PACKAGE_FILES DEFAULT_INSTALL_LOCATION /Applications HIERARCHY CHILDREN CHILDREN BUNDLE_CAN_DOWNGRADE BUNDLE_POSTINSTALL_PATH PATH_TYPE 0 BUNDLE_PREINSTALL_PATH PATH_TYPE 0 CHILDREN GID 80 PATH app/OCSNG.app PATH_TYPE 3 PERMISSIONS 493 TYPE 3 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Automator PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Input Methods PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 1005 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickLook PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 PRESERVE_EXTENDED_ATTRIBUTES SHOW_INVISIBLE SPLIT_FORKS TREAT_MISSING_FILES_AS_WARNING VERSION 5 PACKAGE_SCRIPTS POSTINSTALL_PATH PATH scripts/postinstall PATH_TYPE 1 PREINSTALL_PATH PATH scripts/preinstall PATH_TYPE 1 RESOURCES PACKAGE_SETTINGS AUTHENTICATION 1 CONCLUSION_ACTION 0 FOLLOW_SYMBOLIC_LINKS IDENTIFIER org.ocsinventory-ng.agent.macosx LOCATION 0 NAME OCS Inventory Pkg Setup OVERWRITE_PERMISSIONS PAYLOAD_SIZE -1 REFERENCE_PATH RELOCATABLE USE_HFS+_COMPRESSION VERSION 2.10.0 TYPE 0 UUID BC109A21-9EAA-4729-A1B3-A6785D957867 PROJECT PROJECT_COMMENTS NOTES PROJECT_PRESENTATION BACKGROUND APPAREANCES DARK_AQUA LIGHT_AQUA SHARED_SETTINGS_FOR_ALL_APPAREANCES INSTALLATION TYPE HIERARCHIES INSTALLER LIST CHILDREN DESCRIPTION OPTIONS HIDDEN STATE 1 PACKAGE_UUID BC109A21-9EAA-4729-A1B3-A6785D957867 TITLE TYPE 0 UUID 225BE162-243E-4A1A-9060-15D1A23BEB6D REMOVED MODE 0 INSTALLATION_STEPS ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewIntroductionController INSTALLER_PLUGIN Introduction LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewReadMeController INSTALLER_PLUGIN ReadMe LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewLicenseController INSTALLER_PLUGIN License LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallerPluginController ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_INSTALLERPLUGIN_PATH PATH config.bundle PATH_TYPE 1 ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallerPluginController ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_INSTALLERPLUGIN_PATH PATH auth.bundle PATH_TYPE 1 ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallerPluginController ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_INSTALLERPLUGIN_PATH PATH daemonconfig.bundle PATH_TYPE 1 ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewDestinationSelectController INSTALLER_PLUGIN TargetSelect LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationTypeController INSTALLER_PLUGIN PackageSelection LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationController INSTALLER_PLUGIN Install LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewSummaryController INSTALLER_PLUGIN Summary LIST_TITLE_KEY InstallerSectionTitle INTRODUCTION LOCALIZATIONS LICENSE LOCALIZATIONS LANGUAGE English VALUE PATH license/gpl-2.0.txt PATH_TYPE 1 LANGUAGE French VALUE PATH license/gpl-2.0.txt PATH_TYPE 1 MODE 0 README LOCALIZATIONS SUMMARY LOCALIZATIONS TITLE LOCALIZATIONS LANGUAGE English VALUE OCS Inventory Pkg Setup PROJECT_REQUIREMENTS LIST RESOURCES ROOT_VOLUME_ONLY PROJECT_SETTINGS BUILD_FORMAT 1 BUILD_PATH PATH build PATH_TYPE 1 EXCLUDED_FILES PATTERNS_ARRAY REGULAR_EXPRESSION STRING .DS_Store TYPE 0 PROTECTED PROXY_NAME Remove .DS_Store files PROXY_TOOLTIP Remove ".DS_Store" files created by the Finder. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING .pbdevelopment TYPE 0 PROTECTED PROXY_NAME Remove .pbdevelopment files PROXY_TOOLTIP Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING CVS TYPE 1 REGULAR_EXPRESSION STRING .cvsignore TYPE 0 REGULAR_EXPRESSION STRING .cvspass TYPE 0 REGULAR_EXPRESSION STRING .svn TYPE 1 REGULAR_EXPRESSION STRING .git TYPE 1 REGULAR_EXPRESSION STRING .gitignore TYPE 0 PROTECTED PROXY_NAME Remove SCM metadata PROXY_TOOLTIP Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING classes.nib TYPE 0 REGULAR_EXPRESSION STRING designable.db TYPE 0 REGULAR_EXPRESSION STRING info.nib TYPE 0 PROTECTED PROXY_NAME Optimize nib files PROXY_TOOLTIP Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING Resources Disabled TYPE 1 PROTECTED PROXY_NAME Remove Resources Disabled folders PROXY_TOOLTIP Remove "Resources Disabled" folders. STATE SEPARATOR NAME OCS Inventory Pkg Setup PAYLOAD_ONLY TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING TYPE 0 VERSION 2 UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/000077500000000000000000000000001432320066700250225ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/000077500000000000000000000000001432320066700266175ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Info.plist000066400000000000000000000027561432320066700306010ustar00rootroot00000000000000 BuildMachineOSBuild 21G72 CFBundleDevelopmentRegion en CFBundleExecutable auth CFBundleIdentifier org.ocsinventory.agent.auth CFBundleInfoDictionaryVersion 6.0 CFBundleName auth CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSupportedPlatforms MacOSX CFBundleVersion 1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 13F100 DTPlatformName macosx DTPlatformVersion 12.3 DTSDKBuild 21E226 DTSDKName macosx12.3 DTXcode 1341 DTXcodeBuild 13F100 InstallerSectionTitle auth LSMinimumSystemVersion 10.15 NSHumanReadableCopyright NSMainNibFile AuthInstallerPane NSPrincipalClass InstallerSection UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/MacOS/000077500000000000000000000000001432320066700275615ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/MacOS/auth000077500000000000000000002141201432320066700304500ustar00rootroot00000000000000 __TEXT@@__text__TEXT66__stubs__TEXT=$=__stub_helper__TEXTD=LD=__objc_methname__TEXT=k=__cstring__TEXT>N>__objc_classname__TEXTI?I?__objc_methtype__TEXT]?R]?__unwind_info__TEXT?H?__DATA_CONST@@@@__got__DATA_CONST@ @__cfstring__DATA_CONST @ @__objc_classlist__DATA_CONSTAA__objc_imageinfo__DATA_CONSTAAx__DATA@@__la_symbol_ptr__DATA0 __objc_const__DATA00__objc_selrefs__DATAЁЁ__objc_classrefs__DATAPP__objc_ivar__DATAh(h__objc_data__DATAP__data__DATAH__LINKEDITPX"0((X0AX0 P((/c0a:6Zj`2   * `pB,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 8/usr/lib/libobjc.A.dylib 8d/usr/lib/libSystem.B.dylib hpB/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation p//System/Library/Frameworks/InstallerPlugins.framework/Versions/A/InstallerPlugins&)IUHH0H}HuH9LHEH}H}HH5KH HEHHHEH}H5KH 1ALHH}HEH H}H0]f.DUHH H}HuHUH=KH5K8 HfHHEH KH<H H}HyKHH5? 6HEH WKH<H5JH <H}H5JH ]UHHH}HuHUH=HEH}H=JHHEH JHH5PJMHEH}H5>J8HEH JH<H5*JHJHH}H5JH}HEHEHH}H5IHRHH}HEHEH #JH<H5IHHH}H5IyHH}HEkH}H5I1NH|HEH}HUH5KI-H[H}HEH}H5$IHH-H}HEH}1H}1 HEH DIH<H5HHHH}H5HH}HEHEHH}H5HH)cHH}HEUHEH HH<H5?H1H_HH}H5;HH>H}HEH}H5H1HHEH}HUH5GHH}HEH}H5GH<HH}HEH}1H}1HEH GH<H5XGJHxHHpH5AG+HpHxHxHH}H5GHHH}HEHEH`HEH JGH<H5FHH`HHhH5FHH}HE}HhpH}H5uFHPH~H}HEBH}H5OF$HRHEHEHPH}4HH52FHXH}H5EHPHXHH5FH}H5EH}1H}1H}1Hİ]UHH H}HuH}H}HEH1H}HEH1jH}HEH1SH}HEH1<H}HmEH1%H ]Ð%B%B%B%B%B%BLEAS%hhh5hKhihbundleForClass:localizedStringForKey:value:table:defaultManagerfileExistsAtPath:gotoNextPaneinitToFileAtPath:append:openstringValuelengthstringByAppendingString:dataUsingEncoding:base64EncodedStringWithOptions:objectValuebyteswrite:maxLength:closetitledidEnterPane:shouldExitPane:.cxx_destructauthUserauthPwdauthRealmfilemgrtmpCfgFilePathPaneTitle/tmp/ocs_installer/ocsinventory-agent.cfguser= password=realm=AuthInstallerPane@16@0:8v24@0:8q16c24@0:8q16v16@0:8@"NSTextField"@"NSFileManager"@"NSString"644=4 > ?)/?0?6?8? B?@T=^=h=r=|==((I?>]?6>e?6>p?P7>{?< x>?>?>?h>?p>?@h[?I?x====== >>>">;>N>n>z>>>X`@HP0!0pQ"VCp0\ASASASASASCSAp`LRCQ@_OBJC_CLASS_$_NSBundleQr@_OBJC_CLASS_$_NSFileManager@_OBJC_METACLASS_$_NSObject0@__objc_empty_cache@_objc_msgSendq@_objc_release@_objc_retain@dyld_stub_binder@_OBJC_CLASS_$_NSOutputStreamr@___CFConstantStringClassReferenceq @_OBJC_CLASS_$_InstallerPaner@_OBJC_METACLASS_$_InstallerPaner@_objc_allocr@_objc_autoreleaseReturnValuer@_objc_opt_classr@_objc_retainAutoreleaser @_objc_retainAutoreleasedReturnValuer(@_objc_storeStrong_OBJC_ IVAR_$_AuthInstallerPane.cMETACLASS_$_AuthInstallerPaneCLASS_$_AuthInstallerPanefilemgrtmpCfgFilePathauthUserPwdRealml 66P7<60^xdd0fұb.6$6$N.6 $6$N.P7.$P7$@N@.<S$<$Nv&0&x&& C q     d"Irxhp/Fb&6DQi78:=>?9;<@78:=>? _OBJC_CLASS_$_AuthInstallerPane_OBJC_IVAR_$_AuthInstallerPane.authPwd_OBJC_IVAR_$_AuthInstallerPane.authRealm_OBJC_IVAR_$_AuthInstallerPane.authUser_OBJC_IVAR_$_AuthInstallerPane.filemgr_OBJC_IVAR_$_AuthInstallerPane.tmpCfgFilePath_OBJC_METACLASS_$_AuthInstallerPane_OBJC_CLASS_$_InstallerPane_OBJC_CLASS_$_NSBundle_OBJC_CLASS_$_NSFileManager_OBJC_CLASS_$_NSOutputStream_OBJC_METACLASS_$_InstallerPane_OBJC_METACLASS_$_NSObject___CFConstantStringClassReference__objc_empty_cache_objc_alloc_objc_autoreleaseReturnValue_objc_msgSend_objc_opt_class_objc_release_objc_retain_objc_retainAutorelease_objc_retainAutoreleasedReturnValue_objc_storeStrongdyld_stub_binder-[AuthInstallerPane title]-[AuthInstallerPane didEnterPane:]-[AuthInstallerPane shouldExitPane:]-[AuthInstallerPane .cxx_destruct]__OBJC_METACLASS_RO_$_AuthInstallerPane__OBJC_$_INSTANCE_METHODS_AuthInstallerPane__OBJC_$_INSTANCE_VARIABLES_AuthInstallerPane__OBJC_CLASS_RO_$_AuthInstallerPane__dyld_private/Users/factorfxfactorfx/Documents/LDR/auth/auth/AuthInstallerPane.m/Users/factorfxfactorfx/Library/Developer/Xcode/DerivedData/auth-aegrjdugnhtqipasdubckjelntdr/Build/Intermediates.noindex/auth.build/Debug/auth.build/Objects-normal/x86_64/AuthInstallerPane.o-[AuthInstallerPane title]-[AuthInstallerPane didEnterPane:]-[AuthInstallerPane shouldExitPane:]-[AuthInstallerPane .cxx_destruct]__OBJC_METACLASS_RO_$_AuthInstallerPane__OBJC_$_INSTANCE_METHODS_AuthInstallerPane__OBJC_$_INSTANCE_VARIABLES_AuthInstallerPane__OBJC_CLASS_RO_$_AuthInstallerPane_OBJC_IVAR_$_AuthInstallerPane.filemgr_OBJC_IVAR_$_AuthInstallerPane.tmpCfgFilePath_OBJC_IVAR_$_AuthInstallerPane.authUser_OBJC_IVAR_$_AuthInstallerPane.authPwd_OBJC_IVAR_$_AuthInstallerPane.authRealm_OBJC_METACLASS_$_AuthInstallerPane_OBJC_CLASS_$_AuthInstallerPane $$g X ΐ  t@org.ocsinventory.agent.auth325U55CH79A+Sf\8#GԵꬫ=oך}$M9E5@+U41a,N*ͬ&P2`jߩzN]*XofkOX||zڽH,XofkOX||zڽH,Wsub}CkkyB8F Nz 01fm}HAVL~XofkOX||zڽH,XofkOX||zڽH,XofkOX||zڽH,j\2l1Q"BڑhXofkOX||zڽH,XofkOX||zڽH,XofkOX||zڽH,tbSɴ ՞dktB6  org.ocsinventory.agent.auth subject.CN3Apple Development: factorfx@icloud.com (S2969W9YS4) *Hcd 0 *H 010  `He0 *H 0Q09|i %9{Dzx0  *H  0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 200219181347Z 300220000000Z0u1D0BU ;Apple Worldwide Developer Relations Certification Authority1 0 U G310U Apple Inc.1 0 UUS0"0  *H 0 Y L.-Vx0H C-$]EY6\Tdlb-Ɨ<jygˬ?ᄼGf9I:`z ֧sFb`7}h͍x{-[Y#u4"IU<ņɟ̳:{\G -iM@KL;!.CT0Kj ?x 0_T;I%7VRI|`800U00U#0+iGv k.@GM^0D+80604+0(http://ocsp.apple.com/ocsp03-applerootca0.U'0%0#!http://crl.apple.com/root.crl0U d &(c 짲0U0 *Hcd0  *H  ewDGB_9 bŐs՞Ъl(@[U$A#oʀwaI%g9%z3( .W@s\Q) Oa2wD]r1F@>/fTYHI`Yݔlx! ;lKR`89mR1SLIItQ˄GNu'n\l 6d7jg+I˼qE凪 A:y\P4;000  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0"0  *H 0 䑩 GP^y-6WLUKl"0>P Af$kУ*z G[73Mir]_%UM] d5#KYPXPg ˬ, op?0C=+I(ε^=: !.t< bqGSU/ApLE~LkPAtb A30XZ2hesg^eIv3ew-z0v0U0U00U+iGv k.@GM^0U#0+iGv k.@GM^0U 00 *Hcd00*+https://www.apple.com/appleca/0+0Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *H \6L-x팛wvw0O=G7@,ԱؾsdyO4آ>xk}9S 8ıO k+Y |@Vtӷ#;Go$ѷpE'mx~"5%kԢ$#s`[ /DH`8=&g 3j /Sj[dc3w:,V!ںsO6U٧2Bq~RB$*M^cKP 7uu!00?<1l*0  *H  0u1D0BU ;Apple Worldwide Developer Relations Certification Authority1 0 U G310U Apple Inc.1 0 UUS0 220808151143Z 230808151142Z010 &,d 5GC8UY8NMN1<0:U 3Apple Development: factorfx@icloud.com (S2969W9YS4)10U 325U55CH7910U Gilles Dubois1 0 UUS0"0  *H 0 mN# -Okfc=>OJ|#>_7#H5U 09yˉSk p{Zl2|Ms#3F,G•>x"}c҄>p1.`?0?i^pS iFe o U| :r<8Zr5Mt* 85>tAG(F.4^s $X(v?롓E6q 'XP ai`>sZ@z8040 U00U#0 d &(c 짲0p+d0b0-+0!http://certs.apple.com/wwdrg3.der01+0%http://ocsp.apple.com/ocsp03-wwdrg3040U 00  *Hcd00+0 Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.07++https://www.apple.com/certificateauthority/0U% 0 +0U.4:"?Y21k0U0 *Hcd0 *Hcd 0  *H  _Y0w!>5_%53Cqjθ+/p)Hc %j+-2-e#Ós@̴AwJUnLlo\Sk9$ji@9eXT]mt5:4b~9~>o[g}L# M4hxyЬc _Tͮ Uye%!g5(  >說G "v !$1"H\Y1000u1D0BU ;Apple Worldwide Developer Relations Certification Authority1 0 U G310U Apple Inc.1 0 UUS?<1l*0  `He0 *H  1  *H 0 *H  1 220810132540Z0/ *H  1" ET:#ҡy(h 5ۺ0< *Hcd 1/0- `He ET:#ҡy(h 5ۺ0) *Hcd 1 cdhashes RexUOqoj4Bnk0qHjrRidtHkZGuU= 0  *H  u ;XMql't;gܡcW%SCddߠ ;#zk=@YWe]+ܑ,ec 8'*uٽ3S^)n򗁋$*Budx)׽P@ۓzJ}l-0v(b3A'EhVO\r2&XOiqzH&:KBܵn&{7i|ƟL톒;EGuUnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/000077500000000000000000000000001432320066700305715ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/Base.lproj/000077500000000000000000000000001432320066700325705ustar00rootroot00000000000000AuthInstallerPane.nib000066400000000000000000000216361432320066700365760ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/Base.lprojNIBArchive l2L"ȁɃ́̈́сҁӄ׃ځۄ߁䁇儉閄 $%./3>?G^_`hklmquv 23;>?@WX`cdefgkl~/HIJKLMNOPQRSTUVWXYZ[\]^_`aNSSourceIBModuleNameNSBackgroundColorNSOriginalClassNameNS.bytesNSContentsNSDrawsBackgroundNSInitializeWithInitNSLabelNSIDNSControlWritingDirectionNSSubviewsNSViewWantsBestResolutionOpenGLSurfaceIBNSClipsToBoundsNSAccessibilityOidsKeysNSControlUsesSingleLineModeNSCatalogNameIBModuleProviderIBNSLayoutMarginsGuideNSConnectionsNSControlSendActionMaskNSDestinationNSOidsValuesNSClassNameNSObjectsValuesNSNibTouchBarNSAccessibilityConnectorsNSCellFlags2NSCustomColorSpaceIBClassReferenceNSTextFieldAlignmentRectInsetsVersionIB.systemFontUpdateVersionNSOidsKeysNSSuperviewNSControlRefusesFirstResponderNSCellNSControlSizeNSColorNameNSControlContinuousNSRootNSCellFlagsNSFrameSizeNSAllowsLogicalLayoutDirectionNSNextResponderNSvFlagsNSHuggingPriorityNSColorNSChildControllerCreationSelectorNameNSTextColorNS.intvalNSControlSize2NSModelNSControlTextAlignmentNSInlinedValueIBNSSafeAreaLayoutGuideUINibEncoderEmptyKeyNSICCNSWhiteNSEnabledNSColorSpaceNSDevNSControlLineBreakModeNSFrameNSSupportNSVisibleWindowsIBClassNameNSfFlagsNSControlViewNSSizeNSFontUsesAppearanceFontSizeNSComponentsNSObjectsKeysNSKeyNSAccessibilityOidsValuesIB.objectdataNSName     K O P Q j k k    InstallerSection   " ' I   AuthInstallerPaneNSObjectfirstPane   (    (  {{35, 149}, {96, 21}}Ap@      *@.AppleSystemUIFont   SystemtextBackgroundColor1 1 1 applmntrGRAYXYZ .acspAPPLnone-appldescydscm<cprt X#wtpt |kTRC  descGeneric Gray Gamma 2.2 Profilemluc skSK.daDK:caES8viVN@$ptBRJdukUA,frFU>huHU4zhTWLkoKR"fnbNO:csCZ(heIL$roRO*deDEN8itITNsvSE8zhCN jaJP&&elGR*LptPORvnlNL@esESLthTH2TtrTR$fiFIFhrHR>plPLJ.arEG,xruRU:enUS<Vaeobecn siv gama 2,2Generisk gr 2,2 gamma-profilGamma de grisos genrica 2.2Cu hnh Mu xm Chung Gamma 2.2Perfil Genrico da Gama de Cinzas 2,2030;L=0 Gray-30<0 2.2Profil gnrique gris gamma 2,2ltalnos szrke gamma 2.2u(ppQI^2.2r_icϏ| ֌  2.2 \ |Generisk gr gamma 2,2-profilObecn aed gama 2.2   2.2Gama gri generic 2,2Allgemeines Graustufen-Profil Gamma 2,2Profilo grigio generico della gamma 2,2Generisk gr 2,2 gammaprofilfnpp^|ep2.2cϏeNN,000000 2.2 000000   2.2Perfil genrico de cinzentos da Gamma 2,2Algemeen grijs gamma 2,2-profielPerfil genrico de gamma de grises 2,2#1*5A!!2@#"L1H'D 2.2Genel Gri Gama 2,2Yleinen harmaan gamma 2,2 -profiiliGeneri ki Gray Gamma 2.2 profilUniwersalny profil szaro[ci gamma 2,2:'E' 2.2 DHF 1E'/J 9'E1I0O A5@0O 30<<0 2,2-?@>D8;LGeneric Gray Gamma 2.2 ProfiletextCopyright Apple Inc., 2012XYZ Qcurv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km   controlTextColor0 0 1authPwd   ! (    (  {{35, 86}, {96, 21}}Ap@     authRealm  # & (   $ (  %{{35, 211}, {96, 21}}Ap@   #  authUser  ( H ) )  * G NSView + 5 ; #  A (   , ( -  .{{33, 240}, {74, 16}}{251, 750}@ / 2 +  3Username : 0 1Mro-sY-ZAf.titleUsername : *@  4 labelColor (   6 ( -  7{{33, 178}, {74, 16}}@ 8 2 5  3Password : 9 :A3p-tZ-dYM.titlePassword : (   < ( -  ={{33, 115}, {49, 16}}@ > 2 ;  3Realm : ? @m6M-ck-BMP.titleRealm : (   B ( -  C{{33, 294}, {152, 16}}@ D  A  3Authentication settings : E FUp8-Jd-4Tv.titleAuthentication settings :{418, 330}contentView   J parentSection L  ( + . 5 7 ; = # %  A C  M N NSApplication    ( + ( 5 ( ; ( # (  ( A (   L  ( + . 5 7 ; = # %  A C    " ' I R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i NSObjectNSIBObjectDataNSCustomObjectIBClassReferenceNSStringNSMutableSetNSMutableArrayNSNibOutletConnectorNSClassSwapperNSTextFieldNSTextFieldCellNSFontNSColorNSColorSpaceNSDataNSLocalizableStringNSArrayNSNumberInstallerSections.plist000066400000000000000000000007611432320066700352400ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources SectionOrder Introduction ReadMe License auth.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/en.lproj/000077500000000000000000000000001432320066700323205ustar00rootroot00000000000000AuthInstallerPane.strings000066400000000000000000000005301432320066700372350ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/en.lproj /* Class = "NSTextFieldCell"; title = "Password : "; ObjectID = "A3p-tZ-dYM"; */ "A3p-tZ-dYM.title" = "Password : "; /* Class = "NSTextFieldCell"; title = "Username :"; ObjectID = "Mro-sY-ZAf"; */ "Mro-sY-ZAf.title" = "Username :"; /* Class = "NSTextFieldCell"; title = "Realm :"; ObjectID = "m6M-ck-BMP"; */ "m6M-ck-BMP.title" = "Realm :"; InfoPlist.strings000066400000000000000000000001521432320066700355610ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/en.lprojInstallerSectionTitle = "Authentication settings"; Localizable.strings000066400000000000000000000002661432320066700361010ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/Resources/en.lproj/* Localized versions of Info.plist keys */ "PaneTitle" = "OCS Inventory Agent Config"; UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/_CodeSignature/000077500000000000000000000000001432320066700315125ustar00rootroot00000000000000CodeResources000066400000000000000000000074231432320066700341310ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/auth.bundle/Contents/_CodeSignature files Resources/Base.lproj/AuthInstallerPane.nib iAaRjupEiwqbD8EyukmnsYXHqcU= Resources/InstallerSections.plist d/o7U6efjd6BdbGVPerGq/kXWE0= Resources/en.lproj/AuthInstallerPane.strings hash NRxnT0eioNvancMco3d+p+8tnU8= optional Resources/en.lproj/InfoPlist.strings hash b/1OIrmBinyQP/24z5jmXX5Dp3E= optional Resources/en.lproj/Localizable.strings hash cKEewgFCyjvdkJOhap0CjTyGJhM= optional files2 Resources/Base.lproj/AuthInstallerPane.nib hash2 YoxG4vpkRJFjUlX/QA1pdcMfVBXpaMmCJK9qHwMBqoY= Resources/InstallerSections.plist hash2 40wR1xp9VKHrhsE6M+dJ4Q1BZVIV7Zyl3YIieHj4UpU= Resources/en.lproj/AuthInstallerPane.strings hash2 +wzQbqmSwue+vxecCib8kBz6c7y8nUNOWUz8GJD2jrc= optional Resources/en.lproj/InfoPlist.strings hash2 ql1jffDxgCUAuf3zqv9HUTKAwjhYu4IL42J3Px8/XtI= optional Resources/en.lproj/Localizable.strings hash2 hNPSLNIwjZWhAcKfL7aV1Wa7Sh4zrYHtXKSw8FDR0P4= optional rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/000077500000000000000000000000001432320066700253265ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/000077500000000000000000000000001432320066700271235ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Info.plist000066400000000000000000000030611432320066700310730ustar00rootroot00000000000000 BuildMachineOSBuild 19H2 CFBundleDevelopmentRegion en CFBundleExecutable config CFBundleIdentifier org.ocsinventory.agent.config CFBundleInfoDictionaryVersion 6.0 CFBundleName config CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSupportedPlatforms MacOSX CFBundleVersion 1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 12A7300 DTPlatformName macosx DTPlatformVersion 10.15.6 DTSDKBuild 19G68 DTSDKName macosx10.15 DTXcode 1201 DTXcodeBuild 12A7300 InstallerSectionTitle config LSMinimumSystemVersion 10.15 NSHumanReadableCopyright Copyright © 2020 OCS Inventory. All rights reserved. NSMainNibFile ConfigInstallerPane NSPrincipalClass InstallerSection UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/MacOS/000077500000000000000000000000001432320066700300655ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/MacOS/config000077500000000000000000002210601432320066700312610ustar00rootroot00000000000000 __TEXT@@__text__TEXT00__stubs__TEXT 6< 6__stub_helper__TEXTH6tH6__objc_methname__TEXT66__cstring__TEXT:^:__objc_classname__TEXT(?(?__objc_methtype__TEXT>?z>?__unwind_info__TEXT?H?__DATA_CONST@@@@__got__DATA_CONST@(@ __cfstring__DATA_CONST(@`(@__objc_classlist__DATA_CONSTEE__objc_imageinfo__DATA_CONSTEEx__DATA@@__la_symbol_ptr__DATAP__objc_const__DATAPP__objc_selrefs__DATAX@X__objc_classrefs__DATA0__objc_ivar__DATAȄpȄ__objc_data__DATA8P8__data__DATAH__LINKEDIT0b"0@@ 0jX P@@Pxǎ 3$p2   a* `h,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 8/usr/lib/libobjc.A.dylib 8d/usr/lib/libSystem.B.dylib XdH=iH}HHUHuHHU%E1DHUH59jH2HuH=:jH4>H=hH}HHUHuHHUE@%E1DHUH5iH2HuH=iH4>H=hH}HHUHuHHUE$E1DHUH5iH2HuH=iH4>H=ChH}HHUHuHHUE$b1HUH5XiH2HuH= hHxHHxHpHHpHhLhLhE$H^%HMHhH H5gHH$<HhHHMHEH#HEH yhHUHH`HXH5gHXHH#HH $H$E1H5fHHPHHPHHt#HH5fH`HHH@K#H@HC#HHH3#HEH gHUHH8H0,H5OfH0HH"HH ]$H6$E1EH5!fHH(HH(H "HH5)fH8HHH"HHw"H Hg"HEH fHUHHH`H5eHHH "HDH #Hj#E1EH5UeHHHHH!HH5eeHHHH!HHHH!HH!HEH fHUHHHH5dHHHE!HiH "H"E1EH5zdHHHHH!H%H5dHHHH HHHH HH HEH5>dHǺ HEH5-dH| H=HEH5dH\ H0"HMH-eH H5cHH. H'"HMH eH H5cHH E1DHEH dHH5cHE1DHEH dHH5cHHEH dHH5ecHǺHEH dHH5AcHǺsHEH dHH5%cHTHm!HMHZdH H5cHH+Hd!HMH1dH H5bHHH;!HMHdH H5bHHE1DHEHE1DHEHHP]@UHHpHHHEHpHhHDž`H`HHcH59bHPHtHXHbH@H H H5 H= E1ELaHHHLHHHLHLIH$1HPHXH5aHHXH5aHǺ1HXH5paHgHXHPH5ZaHIHXH5`H2HHHH1HHǺ@HXH5 aHHH5`HHHHxAHHHu1HHHH6HHHHHHHHH2HH9>HHHHEHHHH@H@H5`HHHHpH `HHH5~_HE1DHHHHHH9HHH5_HHHHxARE1DHHHHH,1HPH>1HXH+1H`H H HUH9 Hp] f.UHH H}HuHEH}HHEH _HH5^HuHHEHEH v_HHUH5^HFE1DHEHfE1DH}WH ]UHH@H}HuHUHEHEHEHEHEHEHEH ^HH5]HHHEH} HEH x^HH5]H|HH5]HHHhZHhHH`KH`H H H5l]HHMHEHHEHUH5K]HHEHMH]H H50]HHXHHH5]HXHHHPHPHHMH5\HHqHHMH5\HHSHEH p]HH5u\H4HXH5e\HHHHHHHH@H@HH#HMH5(\HHHEHMH\H H5 \HH8H HH5[H8HHH0vH0qHHMH5[HHKHEH 0\HH5m[H,HP H5][HHH( H(HH H HH;HMH5 [HHHEHMH[H H5[HHH HH5ZHHHHnHiHzHMH5ZHHCHEH 0[HH5ZH$H#HHMH5XZHHHHMH55ZHHHEH ZHH5#ZHH#HiHMH5YHHHfHMH5YHHoHEH tZHH5YHPH#H?HMH5YHH(H<HMH5aYHH1AHMHUH5YH2H5NYHϹAH H5 YH׈HUHEHHEHYHH5XHH#HHMH5XHH]HHMH5XHH:1AHMHUH5XH2H5XHϹAHUH5YH2H5)XH׈H H5XHHHHHHHHJH1H H}H5WHxHHHH}HEHZHEH5WHHHHEHEHEHEHEHEHEHMHEHMH5oWHHHHAHELL $H@HD$H xWHUHuH=WH4>H=VHHHHHHzHH +H5VHHHHIH>HbHMHEH-H E1EHEHMHVHH5`VHǹAHUH5VH2HuH=VH4>H=VHHHHH1AHHuH=`VH >H5UHHaHVHEH KVHH5UH/1ƅwHHEH VHH5`UH1HRHEH UHH5UHHHxƅwH5THHˆwHxHmHTHWHMHEH:H HMH5SHHHDHMHTHuHHHxHpH5)SHpHHHH HE1H5RHHhHHhH`HH5RHxHHHX\HXHTH`HDHEH SHUHHPHH=H5`RHHHHH!H HGE1EH52RHH@HH@H8HH5:RHPHHH0H0HH8HxHEH5RHǺWHEH5QHC*HRHCHMHEH&HHMH5QHHH0HMH}RHuHH(H HH5QHHH HH HE1H5PHHHHHq HH5PH HHHH HH@ HH0 HEH QHUHHH)H5LPHHH H H :H3E1EH5PHHHHH HH5&PHHHH| HHt HHd HEH5OHǺC HEH5OH/ HMH5PHH 1HMH11HMH!1HMH1HMH1HMH1HMH1HMHH@]fUHH 1H}HuHUH5IPHHHHU1H $PHUHHo1H PHUHHU1H OHUHH;1H OHUHH!1H OHUHH1H OHUHH1H OHUHH1H OHUHH1H tOHUHH1H OHUHH1H 8OHUHHk1H VOHUHHQ1H NHUHH7H ]Ð%I%I%I%I%I%I%I%I%J%JL9OAS% h&h8hOhrhhhhhhbundleForClass:localizedStringForKey:value:table:arrayWithObjects:defaultManagerfileExistsAtPath:removeItemAtPath:error:createDirectoryAtPath:withIntermediateDirectories:attributes:error:setMessageText:setInformativeText:addButtonWithTitle:setAlertStyle:runModalgotoNextPanesetStringValue:setState:removeAllItemsaddItemWithTitle:selectItemWithTitle:openPanelinitWithObjects:setCanChooseDirectories:setCanChooseFiles:setAllowsMultipleSelection:setAllowedFileTypes:URLscountByEnumeratingWithState:objects:count:pathtitleOfSelectedItemsetTitle:stringValuelengthmutableCopyappendString:objectValuestatewriteToFile:atomically:encoding:error:replaceOccurrencesOfString:withString:options:range:stringWithFormat:copyItemAtPath:toPath:error:gotoPreviousPanetitleprotocolsdidEnterPane:chooseCacertFile:chooseProtocol:shouldExitPane:.cxx_destructservertaglogfilecacertfiledebugmodelazymodedownloadsslprotocolistfilemgrtmpCfgFilePathtmpModulesFilePathtmpServerdirFilePathtmpCacertFilePathPaneTitlehttphttps/tmp/ocs_installer/tmp/ocs_installer/ocsinventory-agent.cfg/tmp/ocs_installer/modules.conf/tmp/ocs_installer/serverdir/tmp/ocs_installer/cacert.pem/etc/ocsinventory-agent/ocsinventory-agent.cfgAlready_conf_warnAlready_conf_warn_commentYesNoocsinventory-ng/var/log/ocsng.loghttp://https://pemPEMcrtCRTserver=/ocsinventory tag=logfile=debug=1 debug=0 lazy=1 lazy=0 ssl=1 ssl=0 # this list of module will be load by the at run time # to check its syntax do: # #perl modules.conf # You must have NO error. Else the content will be ignored # This mechanism goal it to keep compatibility with 'plugin' # created for the previous linux_agent. # The new unified_agent have its own extension system that allow # user to add new information easily. #use Ocsinventory::Agent::Modules::Example; use Ocsinventory::Agent::Modules::Download; # DO NOT REMOVE THE 1; 1;#use Ocsinventory::Agent::Modules::Download; # DO NOT REMOVE THE 1; 1;//var/lib/ocsinventory-agent/%@__%@_ocsinventoryOKMissing_cert_warnMissing_cert_warn_commentInvalid_srv_addrInvalid_srv_addr_commentConfigInstallerPane@16@0:8v24@0:8q16v24@0:8@16c24@0:8q16v16@0:8@"NSTextField"@"NSButton"@"NSPopUpButton"@"NSFileManager"@"NSString"044 64 : ::::);<;Y;w;.;;;;;;;;<<<<<<&< 4<6<;<D<M<V<^<f<m<t<>FU>G>>/>>>>?`@66X6b6l6v66666(((?9>?09>?9F? 9Q?`!:Q?P%:\?%!:g?4 /:o?06:o?::o?(B:o?M:~?W:~?`:~?i:~? m:?Ȅy:?Є:?؄:?:?:?@/ބWɯ{jI*2chR=k}g7j gQd\ѼWng5v6n8+N{%ZNғq`3NUX  wEPH+-䔅ĝhg~pYKwB9L;H!]jj5`F)Ëyjaghb_nϙce00U' `GYRT0U00U#0+iGv k.@GM^0.U'0%0#!http://crl.apple.com/root.crl0U0 *Hcd0  *H OY,l/25n}i w,gm:Y\߃*arE0 G񓊣tØr;>E T2Sk NPl! NWk[<= # J&?LmWzX{h䆌JIUK0ᠱ) w4 ;bcA;L۫ɕOM&)zf.!xၮӐ8g0Q\ql 000  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0"0  *H 0 䑩 GP^y-6WLUKl"0>P Af$kУ*z G[73Mir]_%UM] d5#KYPXPg ˬ, op?0C=+I(ε^=: !.t< bqGSU/ApLE~LkPAtb A30XZ2hesg^eIv3ew-z0v0U0U00U+iGv k.@GM^0U#0+iGv k.@GM^0U 00 *Hcd00*+https://www.apple.com/appleca/0+0Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *H \6L-x팛wvw0O=G7@,ԱؾsdyO4آ>xk}9S 8ıO k+Y |@Vtӷ#;Go$ѷpE'mx~"5%kԢ$#s`[ /DH`8=&g 3j /Sj[dc3w:,V!ںsO6U٧2Bq~RB$*M^cKP 7uu!00_7x0  *H  01 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0 201013144840Z 211013144840Z010 &,d 5GC8UY8NMN1<0:U 3Apple Development: factorfx@icloud.com (S2969W9YS4)10U 325U55CH7910U Factorfx Factorfx1 0 UUS0"0  *H 0 =HmOƽGpOܼZ}6CAgʉd7yWx6vJf- l ՚xR.BL`z ,Eo?[290t?(pOQ6b)~ʝSLC"Orā7&/D#\%EoP{qX{*Ky(hObɞ= mWo}v#I6HM)!ߘ(U2;aM՛\'kW{؃00 U00U#0' `GYRT0?+3010/+0#http://ocsp.apple.com/ocsp03-wwdr190U 00  *Hcd00+0 Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.06+*http://www.apple.com/certificateauthority/0U% 0 +0U?y݊v*b˗0U0 *Hcd0 *Hcd 0  *H  #u:9p$(QQC%o!պPpotĶ&9zVޡHqnsك}a;!@GMݞFYI;1K^nʳX9]tiIj#-~KPПJ7WyOJf_`JtrwjJcDh;YE(@vA$@H~@wݔ)G⠣U@Qw/1 cdhashes AE+vvBxkHnghxy6kW7HDZv9VHRU= 0  *H r'(\Pqh7}xS;!}8!!m_g43Sjurn8j{OCDUVW`rstu   ./09>?@QRY^_`svw{$%*05;@FLQV\bgmrx}  ors  p~U$null "#$VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeysKKJL&'([NSClassName_InstallerSection+,-.Z$classnameX$classes^NSCustomObject-/XNSObject123ZNS.objects+,56\NSMutableSet57/UNSSet19H:;<=>?@ABCDEFG&ڀۀ܀݀ހ3JKLMNPQRXNSSource]NSDestinationWNSLabel_%NSChildControllerCreationSelectorName T&UVWXY_NSInitializeWithInit_NSOriginalClassName _ConfigInstallerPaneXNSObject+,]^^NSClassSwapper]/YfirstPane+,ab_NSNibOutletConnectorac/^NSNibConnectorJKLMNPghR klmnopqrstuvwxyz{|}~hRVRVVRV_%NSTextFieldAlignmentRectInsetsVersion_NSReuseIdentifierKeyXNSvFlags_IBNSLayoutMarginsGuide_NSControlContinuous_NSAllowsLogicalLayoutDirection_NSNextResponder_IBNSSafeAreaLayoutGuide_NSControlWritingDirection_NSControlSendActionMask]NSControlSize_&NSViewWantsBestResolutionOpenGLSurface_NSControlLineBreakMode_NSControlTextAlignment_ NSDoNotTranslateAutoresizingMaskWNSFrameVNSCell]NSNibTouchBarYNSEnabled[NSSuperview_IBNSClipsToBounds_NSControlRefusesFirstResponder_NSControlUsesSingleLineMode  %  v&mqnUr|VYRRRR_NSViewConstraints[NSFrameSizeZNSSubviews ''(_{{22, 20}, {251, 21}}ZcacertfilegVh[NSCellFlags]NSControlViewYNSSupport_NSDrawsBackground_NSBackgroundColorZNSContents[NSTextColor_NSCellIdentifier\NSCellFlags2pA$ !@PVNSSizeXNSfFlagsVNSName#@*_.AppleSystemUIFont+,VNSFont/[NSColorName\NSColorSpace]NSCatalogNameWNSColor VSystem_textBackgroundColorWNSWhite\NSComponents_NSCustomColorSpaceB1C1 1 TNSIDUNSICCWNSModel OhhapplmntrGRAYXYZ .acspAPPLnone-appldescydscm<cprt $#wtpt HkTRC \ descGeneric Gray Gamma 2.2 Profilemluc skSK.daDK8caES8viVN@"ptBRJbukUA,frFU>huHU4zhTWJnbNO:hcsCZ(heIL$itITNroRO*plPLJruRU:FenUS<arEG,Vaeobecn siv gama 2,2Generisk gr 2,2 gammaprofilGamma de grisos genrica 2.2Cu hnh Mu xm Chung Gamma 2.2Perfil Genrico da Gama de Cinzas 2,2030;L=0 Gray-30<0 2.2Profil gnrique gris gamma 2,2ltalnos szrke gamma 2.2u(ppQI^ 2.2 r_icϏGenerisk gr gamma 2,2-profilObecn aed gama 2.2   2.2Profilo grigio generico della gamma 2,2Gama gri generic 2,2Allgemeines Graustufen-Profil Gamma 2,2| ֌  2.2 \ |fnpp^|ep 2.2 cϏeNN,000000 2.2 000000   2.2Perfil genrico de cinzentos da Gamma 2,2Algemeen grijs gamma 2,2-profielPerfil genrico de gamma de grises 2,2#1*5A!!2@#"L1H'D 2.2Genel Gri Gama 2,2Yleinen harmaan gamma 2,2 -profiiliGeneri ki Gray Gamma 2.2 profilUniwersalny profil szaro[ci gamma 2,21I0O A5@0O 30<<0 2,2-?@>D8;LGeneric Gray Gamma 2.2 Profile:'E' 2.2 DHF 1E'/J 9'EtextCopyright Apple Inc., 2012XYZ Qcurv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km+,\NSColorSpace/\NSColorSpace+,WNSColor/ "#_controlTextColorB0C0 1 +,_NSTextFieldCell/\NSActionCellVNSCell+,[NSTextField/YNSControlVNSView[NSResponderJKLMNP R ـVNSView1 Hg)1[dhu{3klmnopqrstuvwxyz{|}~RVRVV()RV+ % *, _{{128, 272}, {155, 21}}VserverV7)$ -!+;<=>?@AYNS.stringUNSDevUNSKey0_ocsinventory-ng/._0Sw-Bb-gYo.title_ocsinventory-ng+,EF_NSLocalizableStringEG/XNSStringlmnopqrstuvyxwz{|}~IRVROPVVSTRVZ5 Z6 4: 21\H3+,_`^NSMutableArray_a/WNSArray_{{18, 269}, {105, 25}}[protocolist1egf79ijklmnopVrrp_NSFirstAttributeV2_NSShouldBeArchivedZNSConstant[NSFirstItem\NSConstantV2_NSFirstAttribute8 #@Y1+,uv_NSLayoutConstraintu/+,axa/z{|}~ VVVI_NSPreferredEdgeVNSMenu_NSPeriodicDelay]NSButtonFlags_NSPeriodicInterval]NSAltersState_NSUsesItemFromMenu_NSMenuItemRespectAlignment_NSAlternateContents_NSKeyEquivalent^NSButtonFlags2_NSAuxButtonTypeZNSMenuItem_NSArrowPosition1>@@@YK <5;=P{T ]NSMnemonicLoc_NSKeyEquivModMaskXNSActionYNSOnImageZNSKeyEquivXNSTargetWNSTitleWNSState\NSMixedImage>MBN:?I[NSMenuItemsOX;<=>0Whttp://A@_3w5-Xc-SgN.titleWhttp://RR\IBDesignSize[NSClassName_IBDesignImageConfiguration^NSResourceName]IBNamespaceIDECDHWNSImage_NSMenuCheckmarkZNS.sizevalZNS.specialFGX{12, 12}+,WNSValue/+,_NSCustomResource/RRɀKCJH_NSMenuMixedStateLGW{10, 2}__popUpItemAction:+,ZNSMenuItem/1H=PT3{T>NB:QMI;<=>0VItem 2SR_zHq-2z-s9z.titleVItem 2{T>NB:UMI;<=>   0VItem 3WV_EnV-PM-EsB.titleVItem 3+,VNSMenu/+,_NSPopUpButtonCell/^NSMenuItemCell\NSButtonCell+,]NSPopUpButton/XNSButtonkmnopqrstuvxywz{|}~RVRVV$%RV+_NSHuggingPriority % \^ ]_{{18, 225}, {90, 16}}Z{251, 750}/456@[$b_;<=>9:;0_Log File path :a`_Bqz-yE-1gz.title_Log File path :@ c#ZlabelColorklmnopqrstuvwxyz{|}~ERVRVVNORVf % eg _{{20, 196}, {181, 21}}WlogfileVEd$ !flmnopqrstuvxywz{|}~aRVRgVVjkRVqj t il k_{{248, 198}, {100, 18}}YdebugmodeZ{250, 750}~}v|wx{|~a_NSAlternateImageH0ZDebug modeon_31X-X1-h1b.titleZDebug mode[NSImageNameqrXNSSwitch+,_NSButtonImageSource/+,/+,/kmnopqrstuvxywz{|}~RVRVVRV+ % vw ]_{{20, 152}, {136, 16}}/46u$bx;<=>0_TAG Value (optional) :zy_CJY-Du-ySH.title_TAG Value (optional) :klmnopqrstuvwxyz{|}~RVRVVRV} % |~ _{{22, 123}, {179, 21}}StagV{$ !}lmnopqrstuvxywz{|}~RVRgVVRVq t k_{{248, 125}, {142, 18}}Xdownload~}v|x{|0_Deployment feature_Fz6-ny-C1b.title_Deployment featurelmnopqrstuvxywz{|}~RVRgVVRVq t k_{{248, 99}, {89, 18}}Xlazymode~}v|w {|H8Q0YLazy mode_gFK-QK-e24.titleYLazy modelmnopqrstuvxywz{|}~RVRgVV&'RVq t k_{{248, 71}, {86, 18}}Sssl~}v| {|5;<=0YSSL check_0JY-Jz-90N.titleYSSL checkkmnopqrstuvxywz{|}~RVRVVIJRV+ % ]_{{22, 49}, {299, 16}}/4X6$b;<=>[\]0_1Certificate File (needed by 'Deployment feature')_UvL-Ff-Y6G.title_1Certificate File (needed by 'Deployment feature')mnopqrstuvyxwz{|}~RVRggVVjkRVqr t k1tH3_{{275, 13}, {91, 32}}1xgy9ijklmnopV~~p8 #@S~}|wp@<s;<=>0VBrowse_MAB-ch-ni8.titleVBrowsekmnopqrstuvxywz{|}~RVRVVRV+ % ]_{{135, 301}, {108, 16}}/4$b;<=>0^OCS Server URL_w48-wL-2Wx.title^OCS Server URLV_NSFontUsesAppearanceFontSize kmnopqrstuxvywz{|}~RVRVVRV+ % ]_{{289, 272}, {101, 21}}1gˀ9ijklmnopVp8 #@X@/4$b;<=>݀0]/ocsinventory_DIf-zY-Upa.title]/ocsinventoryZ{408, 323}1g$€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀӀԀՀր׀؀9ij l  no V   \NSSecondItem_NSSecondAttribute_NSSecondAttributeV28 [1ij l  noV8 )1ij l  noV8 )1 ijl   no V!   _NSSymbolicConstant8 1WNSSpaceij l  no V   8 d[ij lmk  noV//܀8 1[#@?ij l  noVр8 {dijl   noV!܀8 d[ij l  noV8 hdijl   no V! 8 )1ijl   noV!܀8 )ij l  noV8 )ij l  noV܀8 )ij lmk  no V[[   8 #@a ij lmk  noVaa܀8 du#@<ij l  no V   8 {uij lmk  no Vll   8 u#@6ij l  noV8 {ijl   noV!܀8 {uij l  no Vg   8 {ijl   noV!܀8 ij lmk  no V   8 #@8ij l  no V   8 hij lmk  no V 8 dh#@Hijl   noV!g܀8 ijl   noV!g8 ij l  noVg8 ijl   noV!р8 ijl   no V! 8 )ij l  noVр8 ij l  no V   8 ij l  no V   8 ij lmk  noV܀8 #@(ij lmk  noV܀8 #@,ijl   no V!g 8 ij lmk  noVр8 #@H[contentViewJKLMNPaR hjJKLMNPR JKLMNPR JKLMNPER dfJKLMNPR ߀]parentSectionJKLMNPIR 15JKLMNPR )+JKLMNPR JKLMNPR {}JKLP _chooseCacertFile:+,_NSNibControlConnector/^NSNibConnectorJKLP1 _chooseProtocol:1!gL"P)Tf%Ok'gJky ),1:>=PT7[^dghluw{~€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀӀԀՀր׀؀9&p(]NSApplication1tgLTg)1:>>>1[dhu{91g["P)Tf%Ok'gJky:;<=>?@ABCDEFG ),1:>=PT7[^dghluw{~€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀӀԀՀր׀؀&ڀۀ܀݀ހ91!g["#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI9    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJLMNOPQRSTUVWXYZ[1H31g9+,^NSIBObjectData/",1:?QZw'-Zao| "%(+-6BDFYbmv   &/=Emoqsuw ")8MOQSUW1Rd~@HO]gs & : F Q S T V X [ ] _ a c e g i   + 8 = ? A C D F H J L Q R c j s z   4 < I ^ a e g i k |  +4<AVXZ\^q!#%,5VXZ\^`bdfhjlnprtv <>@BCEGIK\flrt E G I J K M O Q S T U W Y [ \ ^ _ ` b k l n w !!!(!5!H!J!L!M!V!X!a!v!{!!!!!"""*"8"M"j"""""""""""""""""""""""# #####A#O#c#l#v#########################$$$3$@$L$i$x$$$$$$$$$$$$$$$$$$$%%%,%.%0%2%4%6%8%K%X%Z%\%d%x%%%%%%%%%%%%%%%%%%%%%%&&&&C&E&G&I&K&M&O&Q&S&d&f&m&o&q&&&&&&&&&&&&' ''v''''''''''''''''''''''''''''((("($(&(9(K(`(b(d(f(h(s((((((((((((((((()))9);)=)?)@)B)D)F)H)))))))))))))))))))))*4*G*L*Q*S*U*Z*\*^*`*b*d*f*h*y*{**************++ ++w+y+z+{+}++++++++++++++++++++++,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,---f-h-j-k-l-n-p-r-s-t-v-x-z-{-}-~--------------. ..$.&.(.;.P...................././3/5/7/9/;/=/?/A/C/T/V/`/b/d/w///////////////////000Z0\0^0`0b0d0f0h0j0{0}000001 1 111111111111 1!1"1$1<1]1_1a1c1e1g1i1z1|111112b2d2e2f2h2j2l2n2o2p2r2t2v2w2y2z2{2}222222222222223333 3%3'3)3+3-3>3@3G3I3K3^3e333333333333333333444 4"4$4&4(4-4>4@4O4Q4S4f4u4444455555555!5"5#5%5'5)5*5,5-5.505J5S5V5X5Z5w5y5z555555555555555566 6W6Y6[6]6_6a6c6e6g6i6k6m6o6q6s6u6w6y6{6}6666666666666666666666666777#7%7'7(7*7,7M7O7P7R7T7V7{7777777777777777788#8%8&8(8*8O8Q8R8T8V8X8y8{8|8~8888888888888889999%9'9(9*9,9U9W9X9Z9\9e99999999999999999: :":#:%:':L:N:O:Q:S:U:v:x:y:{:}::::::::::::;;;; ; ;5;7;8;:;<;E;j;l;m;o;q;s;;;;;;;;;;;;;;;;;<<<>>>>>>+>@>B>D>F>H>J>_>a>c>e>g>i>~>>>>>>>>>>>>>>>>>>>>? ??? ?"?$?6?????????????????????@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@}@@@@A3A5A7A9A;A=A?AAACAEAGAIAKAMAOAQASAUAWAYA[A]A_AaAcAeAgAiAkAmAoAqAsAuAwAyA{A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCC C C CCCCCCCCCC!C#C%C'C)C+C-C/C1C3C5C7C9C;C=C?CACCCECGCPD D D DDDDDDDDDD!D#D%D'D)D+D.D1D4D7D:D=D@DCDFDIDLDODRDUDXD[D^DaDdDgDjDmDpDsDvDyD|DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEE E E EEEEEEEEEE!E#E%E'E)E+E-E/E1E3E5E7E9E;E=E?EAECEEEGEIEKEMEOEQESEUEWEYE[E]E_EaEcEeEgEiEkEmEoEqEsEuEwEyE{E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEInstallerSections.plist000066400000000000000000000007631432320066700355460ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Resources SectionOrder Introduction ReadMe License config.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Resources/en.lproj/000077500000000000000000000000001432320066700326245ustar00rootroot00000000000000ConfigInstallerPane.strings000066400000000000000000000027451432320066700400570ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Resources/en.lproj /* Class = "NSButtonCell"; title = "SSL check"; ObjectID = "0JY-Jz-90N"; */ "0JY-Jz-90N.title" = "SSL check"; /* Class = "NSTextFieldCell"; title = "ocsinventory-ng"; ObjectID = "0Sw-Bb-gYo"; */ "0Sw-Bb-gYo.title" = "ocsinventory-ng"; /* Class = "NSButtonCell"; title = "Debug mode"; ObjectID = "31X-X1-h1b"; */ "31X-X1-h1b.title" = "Debug mode"; /* Class = "NSMenuItem"; title = "http://"; ObjectID = "3w5-Xc-SgN"; */ "3w5-Xc-SgN.title" = "http://"; /* Class = "NSTextFieldCell"; title = "Log File path :"; ObjectID = "Bqz-yE-1gz"; */ "Bqz-yE-1gz.title" = "Log File path :"; /* Class = "NSTextFieldCell"; title = "TAG Value (optional) :"; ObjectID = "CJY-Du-ySH"; */ "CJY-Du-ySH.title" = "TAG Value (optional) :"; /* Class = "NSTextFieldCell"; title = "/ocsinventory"; ObjectID = "DIf-zY-Upa"; */ "DIf-zY-Upa.title" = "/ocsinventory"; /* Class = "NSButtonCell"; title = "Deployment feature"; ObjectID = "Fz6-ny-C1b"; */ "Fz6-ny-C1b.title" = "Deployment feature"; /* Class = "NSButtonCell"; title = "Browse"; ObjectID = "MAB-ch-ni8"; */ "MAB-ch-ni8.title" = "Browse"; /* Class = "NSTextFieldCell"; title = "Certificate File (needed by 'Deployment feature')"; ObjectID = "UvL-Ff-Y6G"; */ "UvL-Ff-Y6G.title" = "Certificate File (needed by 'Deployment feature')"; /* Class = "NSButtonCell"; title = "Lazy mode"; ObjectID = "gFK-QK-e24"; */ "gFK-QK-e24.title" = "Lazy mode"; /* Class = "NSTextFieldCell"; title = "OCS Server URL"; ObjectID = "w48-wL-2Wx"; */ "w48-wL-2Wx.title" = "OCS Server URL";∂ InfoPlist.strings000066400000000000000000000001421432320066700360640ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Resources/en.lprojInstallerSectionTitle = "Agent configuration"; Localizable.strings000066400000000000000000000040601432320066700364010ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/Resources/en.lproj/* Localized versions of Info.plist keys */ "PaneTitle" = "OCSInventory Agent Config"; //Yes button "Yes" = "Yes"; //No button "No" = "No"; //Warning about already existing cofiguration file "Already_conf_warn" = "OCS agent configuration file seems to already exists. Do you want to launch OCS Inventory NG agent configuration?"; //Warning about already existing cofiguration file comment "Already_conf_warn_comment" = "The previous /etc/ocsinventory-agent/ocsinventory-agent.cfg file will be erased"; //Warning about missing certificate file "Missing_cert_warn" = "You have enabled Download feature and SSL certicate check but you don't specify a certificate file"; //Warning about missing certificate file comment "Missing_cert_warn_comment" = "If you don't specifiy a certificate file, Download feature won't work"; //Warning about invalid server address "Invalid_srv_addr" = "Invalid OCS server address"; //Warning about invalid server address comment "Invalid_srv_addr_comment" = "Please check and re-enter your OCS server address"; UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/_CodeSignature/000077500000000000000000000000001432320066700320165ustar00rootroot00000000000000CodeResources000066400000000000000000000074331432320066700344360ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/config.bundle/Contents/_CodeSignature files Resources/Base.lproj/ConfigInstallerPane.nib /2uW7PRUqJYc0CBfYVF9eTe8fWo= Resources/InstallerSections.plist LpXhZ1VvF2siFxs4mpia0PCnR5c= Resources/en.lproj/ConfigInstallerPane.strings hash PzyXIbbioRBe8IB10xAeUcFqpQs= optional Resources/en.lproj/InfoPlist.strings hash KjbuOb4lqm/uiqKFnyUAUqhTfKQ= optional Resources/en.lproj/Localizable.strings hash m6w4i8zyDoQz37Wax6vL4HBa3Lk= optional files2 Resources/Base.lproj/ConfigInstallerPane.nib hash2 ocHa7coRCnTc0wO4Ordcv/KK4vefWyxwQA6WO2GJYrQ= Resources/InstallerSections.plist hash2 luK21Ws/HQdlP/xeZXZ1Sw+m/repA8RbW72bm8ELOY8= Resources/en.lproj/ConfigInstallerPane.strings hash2 5ou2+oxEv8fJwzCru3W2EWlaOFIzIqxLzlRIvJe3A/Y= optional Resources/en.lproj/InfoPlist.strings hash2 KQQbL7yg0pVKzwqwiD7sT3VAy5Pik/w/gtKizZSSzYc= optional Resources/en.lproj/Localizable.strings hash2 jVwd52Zgtjk0de+f9zdgvJRvbNHadUyNTZZeuzeqnRc= optional rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/000077500000000000000000000000001432320066700265125ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/000077500000000000000000000000001432320066700303075ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Info.plist000066400000000000000000000031061432320066700322570ustar00rootroot00000000000000 BuildMachineOSBuild 19H2 CFBundleDevelopmentRegion en CFBundleExecutable daemonconfig CFBundleIdentifier org.ocsinventory.agent.daemonconfig CFBundleInfoDictionaryVersion 6.0 CFBundleName daemonconfig CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSupportedPlatforms MacOSX CFBundleVersion 1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 12A7300 DTPlatformName macosx DTPlatformVersion 10.15.6 DTSDKBuild 19G68 DTSDKName macosx10.15 DTXcode 1201 DTXcodeBuild 12A7300 InstallerSectionTitle daemonconfig LSMinimumSystemVersion 10.15 NSHumanReadableCopyright Copyright © 2020 OCS Inventory. All rights reserved. NSMainNibFile DaemonConfigPane NSPrincipalClass InstallerSection UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/MacOS/000077500000000000000000000000001432320066700312515ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/MacOS/daemonconfig000077500000000000000000002150001432320066700336260ustar00rootroot00000000000000 __TEXT@@__text__TEXT`0 `0__stubs__TEXT*:$*:__stub_helper__TEXTP:LP:__objc_methname__TEXT:W:__cstring__TEXT<E<__objc_classname__TEXT8?8?__objc_methtype__TEXTK?^K?__unwind_info__TEXT?H?__DATA_CONST@@@@__got__DATA_CONST@ @__cfstring__DATA_CONST @ @__objc_classlist__DATA_CONSTBB__objc_imageinfo__DATA_CONSTBBx__DATA@@__la_symbol_ptr__DATA0 __objc_const__DATA00__objc_selrefs__DATA__objc_classrefs__DATA(__objc_ivar__DATA0__objc_data__DATAP__data__DATA``H__LINKEDITZ"0((xE P))1*>H~?| f2   a* `h,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 8/usr/lib/libobjc.A.dylib 8d/usr/lib/libSystem.B.dylib XdH=PH}HHUHuHHU E1DHUH5PH2HuH=PH4>H=OH}HHUHuHHUE M1HUH5oPH2HuH=OH}HHUHuHHUHMLELMQ H HMH7PH H5TOHH( HEH PHH5:OHǺ HEH PHH5OHǺ E1DHEHH`]UHH Hn H}HuHUHEHEH5NH HMHEHy HEH fOHH5NHR HH! HMH5vNHH* HEH OHH5\NH H?H5LNHHHE HMHHE HEH HNHHEHEHMHNH H5MHHE HH5MHMHHHEp HHEHEH_ H}HEH5MH8 H 1 EiEEHUH5YMHH H & HUH5MEH=YMH}HHuHUHʉ H H5MHUHHHE HEH H HUH5LHH HSMHHMHEHj HEH MH5LHHEC HwH H E1H5LHHxHHxHp H6H5kLHMHHHh HHhHH` HpH HEH ZLHUHHXHPH5qKHPHHn HH H E1EH5CKHHHHHHH@* H^H5KHXHHH8 H8HH@HHEH KHUHH0H(H5JH(HHHH S H E1EH5wJHH HH H^HH5JH0HHH5HH-HHHEH5JHǺHEH5JHHMH5}JHH1HMH1HMHH HMH5IHHE1EHEHMHbJHH5JHǹA[HUH5XJH2H5}IH׈6H_1HUH5IH2HuH=IH4>H=IHHHHHHHL1HMH1HMHH ]f.DUHH 1H}HuHUH5aIHHHHU1H Label org.ocsng.agent ProgramArguments /Applications/OCSNG.app/Contents/MacOS/OCSNG RunAtLoad StartInterval %d OKPeriodicity_warnPeriodicity_warn_comment DaemonConfigPane@16@0:8v24@0:8q16c24@0:8q16v16@0:8@"NSTextField"@"NSButton"@"NSFileManager"@"NSString"`044*:4 < <=(9=P=R=R>>$>> >>>?'?8@`:j:t:~:::((8?<K?`0<S?1<^?@3<i?p9 <q?<?<?<?<?<?@pI?8?x:::::;L;\;f;r;x;;;;;;;;;; <<!<2<Y<X`h@PH0!0pQ"VCp0\ASASASASASASCSAp`0xRCQ@_OBJC_CLASS_$_NSBundleQr@_OBJC_CLASS_$_NSFileManager@_OBJC_CLASS_$_NSNumberFormatter@_OBJC_CLASS_$_NSString@_OBJC_METACLASS_$_NSObject8@__objc_empty_cache@_objc_msgSendq@_objc_release@_objc_retain@dyld_stub_binder@_OBJC_CLASS_$_NSAlertr@___CFConstantStringClassReferenceq @_OBJC_CLASS_$_InstallerPaner@_OBJC_METACLASS_$_InstallerPaner@_objc_alloc_initr@_objc_autoreleaseReturnValuer@_objc_opt_classr@_objc_retainAutoreleasedReturnValuer @_objc_storeStrongr(@_objc_unsafeClaimAutoreleasedReturnValue_OBJC_ IVAR_$_DaemonConfigPane.`METACLASS_$_DaemonConfigPaneCLASS_$_DaemonConfigPanefilemgrtmpperiodicitystartupnowLaunchdFilePathNowFilePath` `071Y@3}p90xA`PddfW_.`0$`0$N.1$1$@N@.@3$@3$0N0.p9$p9$N'&0N&xy&&   M w    d8!Gi:Vl3FWt ;<>ABC=?@D;<>ABC _OBJC_CLASS_$_DaemonConfigPane_OBJC_IVAR_$_DaemonConfigPane.filemgr_OBJC_IVAR_$_DaemonConfigPane.now_OBJC_IVAR_$_DaemonConfigPane.periodicity_OBJC_IVAR_$_DaemonConfigPane.startup_OBJC_IVAR_$_DaemonConfigPane.tmpLaunchdFilePath_OBJC_IVAR_$_DaemonConfigPane.tmpNowFilePath_OBJC_METACLASS_$_DaemonConfigPane_OBJC_CLASS_$_InstallerPane_OBJC_CLASS_$_NSAlert_OBJC_CLASS_$_NSBundle_OBJC_CLASS_$_NSFileManager_OBJC_CLASS_$_NSNumberFormatter_OBJC_CLASS_$_NSString_OBJC_METACLASS_$_InstallerPane_OBJC_METACLASS_$_NSObject___CFConstantStringClassReference__objc_empty_cache_objc_alloc_init_objc_autoreleaseReturnValue_objc_msgSend_objc_opt_class_objc_release_objc_retain_objc_retainAutoreleasedReturnValue_objc_storeStrong_objc_unsafeClaimAutoreleasedReturnValuedyld_stub_binder-[DaemonConfigPane title]-[DaemonConfigPane didEnterPane:]-[DaemonConfigPane shouldExitPane:]-[DaemonConfigPane .cxx_destruct]__OBJC_METACLASS_RO_$_DaemonConfigPane__OBJC_$_INSTANCE_METHODS_DaemonConfigPane__OBJC_$_INSTANCE_VARIABLES_DaemonConfigPane__OBJC_CLASS_RO_$_DaemonConfigPane__dyld_private/Users/factorfxfactorfx/Documents/UnixAgent/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/DaemonConfigPane.m/Users/factorfxfactorfx/Library/Developer/Xcode/DerivedData/daemonconfig-cckvrqjkxvyrgtbwmwomqnvezhis/Build/Intermediates.noindex/daemonconfig.build/Debug/daemonconfig.build/Objects-normal/x86_64/DaemonConfigPane.o-[DaemonConfigPane title]-[DaemonConfigPane didEnterPane:]-[DaemonConfigPane shouldExitPane:]-[DaemonConfigPane .cxx_destruct]__OBJC_METACLASS_RO_$_DaemonConfigPane__OBJC_$_INSTANCE_METHODS_DaemonConfigPane__OBJC_$_INSTANCE_VARIABLES_DaemonConfigPane__OBJC_CLASS_RO_$_DaemonConfigPane_OBJC_IVAR_$_DaemonConfigPane.filemgr_OBJC_IVAR_$_DaemonConfigPane.tmpLaunchdFilePath_OBJC_IVAR_$_DaemonConfigPane.tmpNowFilePath_OBJC_IVAR_$_DaemonConfigPane.periodicity_OBJC_IVAR_$_DaemonConfigPane.startup_OBJC_IVAR_$_DaemonConfigPane.now_OBJC_METACLASS_$_DaemonConfigPane_OBJC_CLASS_$_DaemonConfigPane $s 4  Xorg.ocsinventory.agent.daemonconfig325U55CH79!5Yή(M6YyX"VU񽂥߰Yd>9 2.OaENڍ1Ϧ?E .U_{BrZ=I"&_ꫭXofkOX||zڽH,XofkOX||zڽH,,a R`>G@Ȃ2Rhʒڇ05 hr>zr~Es8~iĎ_XofkOX||zڽH,XofkOX||zڽH,XofkOX||zڽH,==t5rďˎND jA>ye[y%H  #org.ocsinventory.agent.daemonconfig subject.CN3Apple Development: factorfx@icloud.com (S2969W9YS4) *Hcd 0 *H 010  `He0 *H 0"0 ޼9m0  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 130207214847Z 230207214847Z01 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0"0  *H 0 8TV$9H_&4Sz|cawd^#9P-VXp-~nJ>/ބWɯ{jI*2chR=k}g7j gQd\ѼWng5v6n8+N{%ZNғq`3NUX  wEPH+-䔅ĝhg~pYKwB9L;H!]jj5`F)Ëyjaghb_nϙce00U' `GYRT0U00U#0+iGv k.@GM^0.U'0%0#!http://crl.apple.com/root.crl0U0 *Hcd0  *H OY,l/25n}i w,gm:Y\߃*arE0 G񓊣tØr;>E T2Sk NPl! NWk[<= # J&?LmWzX{h䆌JIUK0ᠱ) w4 ;bcA;L۫ɕOM&)zf.!xၮӐ8g0Q\ql 000  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0"0  *H 0 䑩 GP^y-6WLUKl"0>P Af$kУ*z G[73Mir]_%UM] d5#KYPXPg ˬ, op?0C=+I(ε^=: !.t< bqGSU/ApLE~LkPAtb A30XZ2hesg^eIv3ew-z0v0U0U00U+iGv k.@GM^0U#0+iGv k.@GM^0U 00 *Hcd00*+https://www.apple.com/appleca/0+0Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *H \6L-x팛wvw0O=G7@,ԱؾsdyO4آ>xk}9S 8ıO k+Y |@Vtӷ#;Go$ѷpE'mx~"5%kԢ$#s`[ /DH`8=&g 3j /Sj[dc3w:,V!ںsO6U٧2Bq~RB$*M^cKP 7uu!00_7x0  *H  01 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0 201013144840Z 211013144840Z010 &,d 5GC8UY8NMN1<0:U 3Apple Development: factorfx@icloud.com (S2969W9YS4)10U 325U55CH7910U Factorfx Factorfx1 0 UUS0"0  *H 0 =HmOƽGpOܼZ}6CAgʉd7yWx6vJf- l ՚xR.BL`z ,Eo?[290t?(pOQ6b)~ʝSLC"Orā7&/D#\%EoP{qX{*Ky(hObɞ= mWo}v#I6HM)!ߘ(U2;aM՛\'kW{؃00 U00U#0' `GYRT0?+3010/+0#http://ocsp.apple.com/ocsp03-wwdr190U 00  *Hcd00+0 Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.06+*http://www.apple.com/certificateauthority/0U% 0 +0U?y݊v*b˗0U0 *Hcd0 *Hcd 0  *H  #u:9p$(QQC%o!պPpotĶ&9zVޡHqnsك}a;!@GMݞFYI;1K^nʳX9]tiIj#-~KPПJ7WyOJf_`JtrwjJcDh;YE(@vA$@H~@wݔ)G⠣U@Qw/1 cdhashes 9Uc6AOtkQAnrsMlUt10pTOU1Rqw= 0  *H dW9k?x,V!kIŏ9T#lh-k#:ΆߪF7FTk45L JǙAk.TtErL6j+YT1R NΙ6AV<ܒ /*Azbeņ-οK2F]Cn=%Z W4A+gᎼ52fx~@9]28䂬[f͑)C8cD\nO|95х@n'v~UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/000077500000000000000000000000001432320066700322615ustar00rootroot00000000000000Base.lproj/000077500000000000000000000000001432320066700342015ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/ResourcesDaemonConfigPane.nib000066400000000000000000000302701432320066700400320ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/Base.lprojbplist00 X$versionY$archiverT$topX$objects_NSKeyedArchiver _IB.systemFontUpdateVersion]IB.objectdata %)*048AKRSTWX\bz{ $%&*69<INOPTUZ[lmtyz{  &+17>?@FLMSTZvyz  2U$null "#$VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeyssqnr&'([NSClassName_InstallerSection+,-.Z$classnameX$classes^NSCustomObject-/XNSObject123ZNS.objects+,56\NSMutableSet57/UNSSet19@:;<=>?hikmYBCDEFHIJXNSSource]NSDestinationWNSLabel_%NSChildControllerCreationSelectorName L&MNOPQ_NSInitializeWithInit_NSOriginalClassName _DaemonConfigPaneXNSObject+,UV^NSClassSwapperU/YfirstPane+,YZ_NSNibOutletConnectorY[/^NSNibConnectorBCDEFH_`J gcde&fghiMjklmnNQqrJJuqwJJ_NSViewConstraints_IBNSClipsToBounds_&NSViewWantsBestResolutionOpenGLSurfaceXNSvFlags_NSNextResponder_IBNSLayoutMarginsGuide[NSFrameSizeZNSSubviews_IBNSSafeAreaLayoutGuide]NSNibTouchBar[ ZVNSView1|@}~+:@RYfhgkeldJN_JnNNJN_n_%NSTextFieldAlignmentRectInsetsVersion_NSControlContinuous_NSAllowsLogicalLayoutDirection_NSControlWritingDirection_NSControlSendActionMask]NSControlSize_NSControlTextAlignment_ NSDoNotTranslateAutoresizingMask_NSControlLineBreakModeWNSFrameVNSCellYNSEnabled[NSSuperview_NSControlRefusesFirstResponder_NSControlUsesSingleLineMode_NSHuggingPriority  *  _{{48, 228}, {155, 16}}Z{251, 750}}[NSCellFlags]NSControlViewYNSSupport_NSBackgroundColor[NSTextColorZNSContents\NSCellFlags2@)&YNS.stringUNSDevUNSKey_Launch OCS agent every_CR7-Av-TyG.title_Launch OCS agent every+,_NSLocalizableString/XNSStringNVNSSizeXNSfFlags_NSFontUsesAppearanceFontSizeVNSName#@* _.AppleSystemUIFont+,VNSFont/[NSColorName\NSColorSpace]NSCatalogNameWNSColor% !VSystem_textBackgroundColorWNSWhite\NSComponents_NSCustomColorSpaceB1C1 1"%TNSIDUNSICCWNSModel #$OhhapplmntrGRAYXYZ .acspAPPLnone-appldescydscm<cprt $#wtpt HkTRC \ descGeneric Gray Gamma 2.2 Profilemluc skSK.daDK8caES8viVN@"ptBRJbukUA,frFU>huHU4zhTWJnbNO:hcsCZ(heIL$itITNroRO*plPLJruRU:FenUS<arEG,Vaeobecn siv gama 2,2Generisk gr 2,2 gammaprofilGamma de grisos genrica 2.2Cu hnh Mu xm Chung Gamma 2.2Perfil Genrico da Gama de Cinzas 2,2030;L=0 Gray-30<0 2.2Profil gnrique gris gamma 2,2ltalnos szrke gamma 2.2u(ppQI^ 2.2 r_icϏGenerisk gr gamma 2,2-profilObecn aed gama 2.2   2.2Profilo grigio generico della gamma 2,2Gama gri generic 2,2Allgemeines Graustufen-Profil Gamma 2,2| ֌  2.2 \ |fnpp^|ep 2.2 cϏeNN,000000 2.2 000000   2.2Perfil genrico de cinzentos da Gamma 2,2Algemeen grijs gamma 2,2-profielPerfil genrico de gamma de grises 2,2#1*5A!!2@#"L1H'D 2.2Genel Gri Gama 2,2Yleinen harmaan gamma 2,2 -profiiliGeneri ki Gray Gamma 2.2 profilUniwersalny profil szaro[ci gamma 2,21I0O A5@0O 30<<0 2,2-?@>D8;LGeneric Gray Gamma 2.2 Profile:'E' 2.2 DHF 1E'/J 9'EtextCopyright Apple Inc., 2012XYZ Qcurv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km+,\NSColorSpace/\NSColorSpace+,WNSColor/%'(ZlabelColorB0C0 1"%+,_NSTextFieldCell  /\NSActionCellVNSCell+,  [NSTextField /YNSControlVNSView[NSResponderfhgkceldJN_Jn NNJN_n_NSReuseIdentifierKey- *. ,2 _{{217, 225}, {38, 21}}[periodicity1')(/1+,-./012N4~42_NSFirstAttributeV2_NSShouldBeArchivedZNSConstant[NSFirstItem\NSConstantV2_NSFirstAttribute0 #@C++,78_NSLayoutConstraint7/+,:;WNSArray:/=>?~BNEFGH_NSDrawsBackground_NSCellIdentifierpA+)6 387@KLMQ554_Kd5-vS-SZ8.titleQ5Q[periodicityW%9(_controlTextColorfhgkeldJN_JnNNdeJN_n * ;< _{{261, 228}, {49, 16}}Bs:)6&=vwxWhour(s)?>_L5X-oH-TrN.titleWhour(s)fhgkceld|JN_JnNNnJN_nB QC AF E_{{48, 179}, {245, 18}}Wstartup1)D1+,-./012N20 #@n @Z{250, 750}>|_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSAlternateImage_NSAuxButtonType_NSPeriodicDelay^NSButtonFlags2KH8QNOK@GBJP_ Launch OCS Agent at daemon startIH_dlF-LS-rTI.title_ Launch OCS Agent at daemon startр[NSImageNameLMXNSSwitch+,_NSButtonImageSource/PP+,\NSButtonCell  /+,XNSButton/fhgkeldJN_JnNNnJN_nT Q SU E_{{48, 148}, {190, 18}}Snow>NOKRVTJP_Launch daemon after installXW_kI2-ox-p1X.title_Launch daemon after install+,^NSMutableArray:/Z{418, 330}1)\]^_`abcde1+,.01N~}\NSSecondItem_NSSecondAttribute_NSSecondAttributeV20 ++,.01 N}   0 @+,./-01 N_}   0 #@I+,.01 N   0 R@+,./-01N~0 +@#@>+,./-01N%%0 @R#@1+,.01N~0 :++,./-01 N}~00 0 +#@0+,./-01N_~660 +#@U+,8.01 N;~ _NSSymbolicConstant0 f:+WNSSpace[contentViewBCDEFHJ RTBCDEFHJJ j]parentSectionBCDEFH~QJ +l[periodicityBCDEFH|J @B1[)\H_}~(eo +2/:<@FDRU\]^_`abcde1&w(p]NSApplication1{)_}_~~_____________++:@@R11) \H_}~(e:;<=>?o +2/:<@FDRU\]^_`abcdehikm11) ڀtuvwxyz{|}~1     1@Y1)1+,^NSIBObjectData/",1:?QZw!/K^x"+679BOV\ertvxz|~$%')+>GP_dnw  IRd}`?X`gq}>JXbv " + A H Q f m v      ! # % , B W _ l &/<ANW_dy{}! !6AMZmoqr{}  02468KM^aceq                6 W Y [ ] _ a c t v ~ !!!! ! ! !!!!!!!!!!!!!!!:!B!K!N!P!R!o!q!r!{!}!!!!"""%"7"I"X"Z"c"h"j"l"q"s"u"w"y"{"~"""""""""####### #)#2#H#M#N#O#X#e#n#w#############$$$$$$$ $"$&$e$g$i$k$m$o$q$s$u$$$$$$$$$$%%%#%%%'%)%+%-%/%1%3%5%7%9%Z%g%{%%%%%%%%%%%%%%%%%%&& &!&#&%&N&P&Q&S&U&^&&&&&&&&&&&&&&&&&'!'#'$'&'('1'V'k'm'n'p'r't'|'''''''''''''''''''''((((((('(\(^(`(b(d(f(h(j(l(n(p(r(t(v(x(z(|(~(((((((((((((((((((((((((())))) ) ) )))))))))&)i)k)m)o)q)s)u)w)y){)})))))))))))))))))))))))))))))***** * * **********!*#*%*'*)*+*-*/*1*3*5*7*9*;*=*?*A*C*E*G*I*K*M*O*Q*S*U*W*Y*[*]*_*a*c*e*g*i*r*s*u*~*****InstallerSections.plist000066400000000000000000000007711432320066700367310ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources SectionOrder Introduction ReadMe License daemonconfig.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/en.lproj/000077500000000000000000000000001432320066700340105ustar00rootroot00000000000000DaemonConfigPane.strings000066400000000000000000000012141432320066700404770ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/en.lproj /* Class = "NSTextFieldCell"; title = "Launch OCS agent every"; ObjectID = "CR7-Av-TyG"; */ "CR7-Av-TyG.title" = "Launch OCS agent every"; /* Class = "NSTextFieldCell"; title = "5"; ObjectID = "Kd5-vS-SZ8"; */ "Kd5-vS-SZ8.title" = "5"; /* Class = "NSTextFieldCell"; title = "hour(s)"; ObjectID = "L5X-oH-TrN"; */ "L5X-oH-TrN.title" = "hour(s)"; /* Class = "NSButtonCell"; title = "Launch OCS Agent at daemon start"; ObjectID = "dlF-LS-rTI"; */ "dlF-LS-rTI.title" = "Launch OCS Agent at daemon start"; /* Class = "NSButtonCell"; title = "Launch daemon after install"; ObjectID = "kI2-ox-p1X"; */ "kI2-ox-p1X.title" = "Launch daemon after install"; InfoPlist.strings000066400000000000000000000001441432320066700372520ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/en.lprojInstallerSectionTitle = "Daemon configuration"; Localizable.strings000066400000000000000000000007541432320066700375730ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/Resources/en.lproj/* Localized versions of Info.plist keys */ "PaneTitle" = "OCS agent daemon options"; //Peridocity warn "Periodicity_warn"="Invalid periodicity value"; //Periodicity warn comment "Periodicity_warn_comment"="Please enter a valid number value"; UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/_CodeSignature/000077500000000000000000000000001432320066700332025ustar00rootroot00000000000000CodeResources000066400000000000000000000074171432320066700356240ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/daemonconfig.bundle/Contents/_CodeSignature files Resources/Base.lproj/DaemonConfigPane.nib YSDA1a5fuj+Jc06KON6XOatR9jc= Resources/InstallerSections.plist FmRNRuAEAYqK2RpLIFeIg+9+eiU= Resources/en.lproj/DaemonConfigPane.strings hash eiGDqgREZn8HceRx9B8K/gkZH04= optional Resources/en.lproj/InfoPlist.strings hash Ap5X6SZrkIlC/1YsU77r6gFzm/k= optional Resources/en.lproj/Localizable.strings hash QfqBhmtEWE7k7/JEDj9TMckLuYY= optional files2 Resources/Base.lproj/DaemonConfigPane.nib hash2 +kNCTsd4rx2/61z6rtInN8bHutm1MxSM0omZyNv/1sM= Resources/InstallerSections.plist hash2 2P+v0n1PTQjdpYze2cgaBZ20QzsklEInKYnQFbgHigo= Resources/en.lproj/DaemonConfigPane.strings hash2 ch/7In9R0lRrq8IKXcyfgevRJNnS6wGSfc70wd5AN9c= optional Resources/en.lproj/InfoPlist.strings hash2 GWlsYxdk4Xhflv7F+rV96boG3puquJ6R2TTtqmKzkIc= optional Resources/en.lproj/Localizable.strings hash2 F5eHWu45VUsWfzZPxEBjkaB/9TJLEZToW7wQmQs25Cc= optional rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/license/000077500000000000000000000000001432320066700242335ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/license/gpl-2.0.txt000066400000000000000000000432541432320066700260630ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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) 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. 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) year 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 Lesser General Public License instead of this License. UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/logos/000077500000000000000000000000001432320066700237345ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsinventory_packages_setup/logos/OCS_logo.jpg000077500000000000000000000245671432320066700261230ustar00rootroot00000000000000PNG  IHDR,rF pHYs.#.#x?v OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxyTŹ ; EEAE\@ D 5^1.֘nqԸt4brMr5+jsܐ#ffT6MOm癇sN꭯"444ra&PR?X,D:顠D5 Q;,MXGVOO'0= ԄduX;b`J,i9:xagaih6Yu>jipn |VkX_h3P&, Ӯ|Z{`p&, X]ŏ5aihk8MX!Zq1XFA\h;hkhhhDэ!V԰}6h҄kۭ> ŰG|cM9oz!+-FnW1=ag~w=,@SIL~TJO KȳwMTV6^*$eYJJln<D_2+(1։ >iw _2T6a1@|5ax x2|^a@v@?LORV%1W,s8ZF]u y456tL M+fS&+~ \t,-:P&?tu |#Dl-)Z"m Cq {٪yLz<^&qA5X ,C3PQd)R۸GUc#}a45RjYtVdq1 85|[~\WѹWgj|w"B"GV eq>oF T #*7Hp}q:+`i`6R&X6MYS.',ӣM#33&RoCN\{f䴃i+UXȒ5-=pб{=gs (Ih+%-HpkIWpDs~ gjyTN2 wHΙ)r]Kag]-5zXfj<9zWKظd]>OmU- <3&iقJ7ݗgLWGXWʉڵu' CͶ]w xlK&,l6ӴC}9v:1_<"j^3:ZƘ+ǥu=MXق2t0H]vcNc|= >y⃜| sE~J=ɉ&,l}uW1u]zwa[xs:F`'y{F~%cSNjd  >Cn4F[3@$ئ=ġu>LzT ld3_z/fCڷ7t.)ࣩAFn  nC ozP -~k>+B(\Uv޸U*q(-#oS˒PSǏOc]CJՄM<a#^. D߶+W/}@:vأ3.<8]6;{ 9Y{lUi`k&AĚ, C'"z&TE[NuA(\ʎ)ݶYz%lX~6kds[X W;C7duECm[>zWZ6@TkmozMX& SC,G L=Ԅ9I;Gm&,<ղ*+O! o^FFhDBG1p~뚰4򛴶U* Gߺ&,&@$x?˨J:g7yUC-xLJs{T)Y MXHb9au`)`xm/_ɩ:tDo 54'֕@PzW9")=]fХOWv;RPkX,~y_3?eGP_SzKEeU[B <Ѳ{W^ҜӰ6VyFLňVu&VBG-O5!?pGH~{y Qϒa:k}/21"5{V]u-ZφEk.( VJThSuN2Pp pG8 NgW( 68Շ߱J>DiDUyOUhO.VI&+JڹyT**lJg4pB5q>[ﶰ?ԡ@dՁV s٣M#^Lf cv70/(n!_|'?T m CP6(4< F#c(y, Cv>~gw`,p)%ACKX~߁y&n ?2&"<,BxeYt?M;I^x&WDWx9 ƛ8KpC埆* duz8w9}Hp0Gd<@$MGC[WL-.q٬UNA$!NI@$8yؤEa",tܘ@$FlBvcZ|{`="Uw{* ?BI5nvE@ +a%p.5bH |>Β.b`616c_~8- V'1E86q!2pu Di3.  fpL ܐzTj3Y-äBZP'VZ=) x82 m\ Lt{ |8XNd-pĵ&)J"@ Xqϰ?Γ?T1ah 5;V#+j@Y ;8(pRmF8d x6 J;2Lhgh9>:\)~(*D!)$;H9GroV"%128Qz?T\ DIy&Ṳe444$vGp`1@ #U;zqeºB cu4§iG:kZTpBZTxb5R Ԣ*H ;4rQh@3*# T WkT5aia]j Qp"hױ?ӢjЄS(Oȿ0-؍ *]vIhi"zG3,]s"`ؕ Ǯ5:v&sg'e;IlױWets;R$nnզ4JhH"ôFțo]+_~$Ru &`0 \v"͏eflIױ_j>b.Oʖ| (FW(HQ"ױ7zLlXPg]0:#Nls~9Gc]Ƕcdq!"TS|< <:h~ERUcWxI%'vA $BD28ױ$٦؏G䔏CѦv&= Qױ7+ٚ*h~$K[{aZMql Y]fؽ^$vC u]i ~K*8u-11mMczTN0ZP ӺXP$e8u\sO`("%:tF Ώ$!^Eo=9 $Yz4SĻGr/]~H&DYXt0c񮂴ul 2=4cQŠ\@$=γuGL8'lXd{ {*P=?0/ `2aZYo7oH-1 S dԚu| 4 Ӛ!yY!'ôF>B!`tv))\K jD DA "!cXn]i ۢ Od`vCV\yPQ]juׁ%$Ѥ-6e$W]=U;-E}JJ6%;k" _R1lK'F&%bVkQ.~KY8BQ<㕉HSW(;LC3$Yôv~aMg 5uծcfF׷ű/Á :) \{kt +&^^DO?twTKvOO*ٍ  Z+Vp` YBijXIIQ1Z*Ṃqg<4MLRjŅRe,rxǮ5Lk*`yLv#MP{}땳*C74V%z)0:l%{IX*#:Gi h:ױϔ/*;ô'˚V 7uiIÌtpSY?%hLq;m(ln)u-i=NbTv\Ǯ"؞QR*YUMô-Nki2e> )s݊`(.3NW߼Ѯ7ORD]IU^dT'[G͛/ JFzugJde[~ L?Qf42JXm: G^Db)lHgi4V1}* mV(5fƜb~x4/ʚ2LXy M3LkߨBu{{vd5UdFu$zҩo%K5 oq~wT BF?k|[}J7wG8f6U w-Ym[oMS ōcYL8/Te[u&J׉jESƄ?^6 Ӛ:ca= C/ad'|co'z4=0;=TTߺBkl[c3K TJufôf) 9b=,j )"666x0n$*;;]Fo2%Tdzq!Qf(frG+0i-2L,lt]nSbxô40z\/"`Uv(>\npv꧊c/o[ݵg0w ӚcWҶߧyN: 0نiوL*Aϧ0i5u܋Z&Յױo'eV11oiKVʑcG Ӻ=Nc4PED'}ôV"/}+ `Xv?pN RE/=h5?U:{2{BptV#ˆvH:6<.R%\Kps-aWP LK[6dfz=Rnȃ]yo7+dױZΖpJ<ݨ@%1""&\XaW#36;",xŞA9ҫΩ|o fJHo<<}.TױF/Hf`=K0[!hy=W f@d^x90I:`GID \=3g#ܒ D?Tu!ADMh1pI xaZGU'ZV95k/DxIDxr.F'yدf` #include #include /***************************************************** * GetAllPIDsForProcessName ***************************************************** * Purpose: This functions purpose is to lookup a BSD * process PID given the BSD process name. This function may * potentially return multiple PIDs for a given BSD process name * since several processes can have the same BSD process name. * * Parameters: * ProcessName A constant C-string. On calling * GetAllPIDsForProcessName this variable holds the BSD process name * used to do the process lookup. Note that the process name you need * to pass is the name of the BSD executable process. If trying * to find the PID of an regular OSX application you will need to pass the * name of the actual BSD executable inside an application bundle (rather * than the bundle name itself). In any case as a user you can find the * BSD process name of any process (including OSX applications) by * typing the command "ps -axcocommand,pid" in terminal. * * ArrayOfReturnedPIDs A pointer to a pre-allocated array of pid_t. * On calling GetAllPIDsForProcessName this variable must be a pointer to a * pre-allocated array of pid_t whos length (in number of pid_t entries) is defined * in ArrayOfPIDsLength. On successful return from GetAllPIDsForProcessName * this array will hold the PIDs of all processes which have a matching process * name to that specified in the ProcessName input variable. The number of actual * PIDs entered in the array starting at index zero will be the value returned * in NumberOfMatchesFound. On failed return if the error is a buffer overflow * error then the buffer will be filled to the max with PIDs which matched. * Otherwise on failed return the state of the array will be undefined. Note * the returned PID array is not sorted and is listed in order of process encountered. * * NumberOfPossiblePIDsInArray A unsigned integer. On calling * GetAllPIDsForProcessName this variable will hold the number of * pre-allocated PID entries which are in the ArrayOfReturnedPIDs for this functions * use. Note this value must have a value greater than zero. * * NumberOfMatchesFound An unsigned integer. On calling GetAllPIDsForProcessName * this variable will point to a pre-allocated unsigned integer. On return from * GetAllPIDsForProcessName this variable will contain the number of PIDs contained in the * ArrayOfReturnedPIDs. On failed return the value of the variable will be undefined. * * SysctlError A pointer to a pre-allocated integer. On failed return, this * variable represents the error returned from the sysctl command. On function * success this variable will have a value specified by the sysctl based on the * error that occurred. On success the variable will have the value zero. * Note this variable can also be NULL in which case the variable is ignored. * * *Function Result* A integer return value. * See result codes listed below. * Result Codes: * 0 Success. A set of process PIDs were found and are located in * ArrayOfReturnedPIDs array. * -1 Could not find a process with a matching process name * (i.e. process not found). * -2 Invalid arguments passed. * -3 Unable to get the size of sysctl buffer required * (consult SysctlError return value for more information) * -4 Unable to allocate memory to store BSD process information * (consult SysctlError return value for more information) * -5 The array passed to hold the returned PIDs is not large enough * to hold all PIDs of process with matching names. * *****************************************************/ int GetAllPIDsForProcessName(const char* ProcessName, pid_t ArrayOfReturnedPIDs[], const unsigned int NumberOfPossiblePIDsInArray, unsigned int* NumberOfMatchesFound, int* SysctlError) { // --- Defining local variables for this function and initializing all to zero --- // int mib[6] = {0,0,0,0,0,0}; //used for sysctl call. int SuccessfullyGotProcessInformation; size_t sizeOfBufferRequired = 0; //set to zero to start with. int error = 0; long NumberOfRunningProcesses = 0; unsigned int Counter = 0; struct kinfo_proc* BSDProcessInformationStructure = NULL; pid_t CurrentExaminedProcessPID = 0; char* CurrentExaminedProcessName = NULL; // --- Checking input arguments for validity --- // if (ProcessName == NULL) //need valid process name { return(kInvalidArgumentsError); } if (ArrayOfReturnedPIDs == NULL) //need an actual array { return(kInvalidArgumentsError); } if (NumberOfPossiblePIDsInArray <= 0) { //length of the array must be larger than zero. return(kInvalidArgumentsError); } if (NumberOfMatchesFound == NULL) //need an integer for return. { return(kInvalidArgumentsError); } //--- Setting return values to known values --- // //initalizing PID array so all values are zero memset(ArrayOfReturnedPIDs, 0, NumberOfPossiblePIDsInArray * sizeof(pid_t)); *NumberOfMatchesFound = 0; //no matches found yet if (SysctlError != NULL) //only set sysctlError if it is present { *SysctlError = 0; } //--- Getting list of process information for all processes --- // /* Setting up the mib (Management Information Base) which is an array of integers where each * integer specifies how the data will be gathered. Here we are setting the MIB * block to lookup the information on all the BSD processes on the system. Also note that * every regular application has a recognized BSD process accociated with it. We pass * CTL_KERN, KERN_PROC, KERN_PROC_ALL to sysctl as the MIB to get back a BSD structure with * all BSD process information for all processes in it (including BSD process names) */ mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_ALL; /* Here we have a loop set up where we keep calling sysctl until we finally get an unrecoverable error * (and we return) or we finally get a successful result. Note with how dynamic the process list can * be you can expect to have a failure here and there since the process list can change between * getting the size of buffer required and the actually filling that buffer. */ SuccessfullyGotProcessInformation = FALSE; while (SuccessfullyGotProcessInformation == FALSE) { /* Now that we have the MIB for looking up process information we will pass it to sysctl to get the * information we want on BSD processes. However, before we do this we must know the size of the buffer to * allocate to accomidate the return value. We can get the size of the data to allocate also using the * sysctl command. In this case we call sysctl with the proper arguments but specify no return buffer * specified (null buffer). This is a special case which causes sysctl to return the size of buffer required. * * First Argument: The MIB which is really just an array of integers. Each integer is a constant * representing what information to gather from the system. Check out the man page to know what * constants sysctl will work with. Here of course we pass our MIB block which was passed to us. * Second Argument: The number of constants in the MIB (array of integers). In this case there are three. * Third Argument: The output buffer where the return value from sysctl will be stored. In this case * we don't want anything return yet since we don't yet know the size of buffer needed. Thus we will * pass null for the buffer to begin with. * Forth Argument: The size of the output buffer required. Since the buffer itself is null we can just * get the buffer size needed back from this call. * Fifth Argument: The new value we want the system data to have. Here we don't want to set any system * information we only want to gather it. Thus, we pass null as the buffer so sysctl knows that * we have no desire to set the value. * Sixth Argument: The length of the buffer containing new information (argument five). In this case * argument five was null since we didn't want to set the system value. Thus, the size of the buffer * is zero or NULL. * Return Value: a return value indicating success or failure. Actually, sysctl will either return * zero on no error and -1 on error. The errno UNIX variable will be set on error. */ error = sysctl(mib, 3, NULL, &sizeOfBufferRequired, NULL, 0); /* If an error occurred then return the accociated error. The error itself actually is stored in the UNIX * errno variable. We can access the errno value using the errno global variable. We will return the * errno value as the sysctlError return value from this function. */ if (error != 0) { if (SysctlError != NULL) { *SysctlError = errno; //we only set this variable if the pre-allocated variable is given } return(kErrorGettingSizeOfBufferRequired); } /* Now we successful obtained the size of the buffer required for the sysctl call. This is stored in the * SizeOfBufferRequired variable. We will malloc a buffer of that size to hold the sysctl result. */ BSDProcessInformationStructure = (struct kinfo_proc*) malloc(sizeOfBufferRequired); if (BSDProcessInformationStructure == NULL) { if (SysctlError != NULL) { *SysctlError = ENOMEM; //we only set this variable if the pre-allocated variable is given } return(kUnableToAllocateMemoryForBuffer); //unrecoverable error (no memory available) so give up } /* Now we have the buffer of the correct size to hold the result we can now call sysctl * and get the process information. * * First Argument: The MIB for gathering information on running BSD processes. The MIB is really * just an array of integers. Each integer is a constant representing what information to * gather from the system. Check out the man page to know what constants sysctl will work with. * Second Argument: The number of constants in the MIB (array of integers). In this case there are three. * Third Argument: The output buffer where the return value from sysctl will be stored. This is the buffer * which we allocated specifically for this purpose. * Forth Argument: The size of the output buffer (argument three). In this case its the size of the * buffer we already allocated. * Fifth Argument: The buffer containing the value to set the system value to. In this case we don't * want to set any system information we only want to gather it. Thus, we pass null as the buffer * so sysctl knows that we have no desire to set the value. * Sixth Argument: The length of the buffer containing new information (argument five). In this case * argument five was null since we didn't want to set the system value. Thus, the size of the buffer * is zero or NULL. * Return Value: a return value indicating success or failure. Actually, sysctl will either return * zero on no error and -1 on error. The errno UNIX variable will be set on error. */ error = sysctl(mib, 3, BSDProcessInformationStructure, &sizeOfBufferRequired, NULL, 0); //Here we successfully got the process information. Thus set the variable to end this sysctl calling loop if (error == 0) { SuccessfullyGotProcessInformation = TRUE; } else { /* failed getting process information we will try again next time around the loop. Note this is caused * by the fact the process list changed between getting the size of the buffer and actually filling * the buffer (something which will happen from time to time since the process list is dynamic). * Anyways, the attempted sysctl call failed. We will now begin again by freeing up the allocated * buffer and starting again at the beginning of the loop. */ free(BSDProcessInformationStructure); } }//end while loop // --- Going through process list looking for processes with matching names --- // /* Now that we have the BSD structure describing the running processes we will parse it for the desired * process name. First we will the number of running processes. We can determine * the number of processes running because there is a kinfo_proc structure for each process. */ NumberOfRunningProcesses = sizeOfBufferRequired / sizeof(struct kinfo_proc); /* Now we will go through each process description checking to see if the process name matches that * passed to us. The BSDProcessInformationStructure has an array of kinfo_procs. Each kinfo_proc has * an extern_proc accociated with it in the kp_proc attribute. Each extern_proc (kp_proc) has the process name * of the process accociated with it in the p_comm attribute and the PID of that process in the p_pid attibute. * We test the process name by compairing the process name passed to us with the value in the p_comm value. * Note we limit the compairison to MAXCOMLEN which is the maximum length of a BSD process name which is used * by the system. */ for (Counter = 0 ; Counter < NumberOfRunningProcesses ; Counter++) { //Getting PID of process we are examining CurrentExaminedProcessPID = BSDProcessInformationStructure[Counter].kp_proc.p_pid; //Getting name of process we are examining CurrentExaminedProcessName = BSDProcessInformationStructure[Counter].kp_proc.p_comm; if ((CurrentExaminedProcessPID > 0) //Valid PID && ((strncmp(CurrentExaminedProcessName, ProcessName, MAXCOMLEN) == 0))) //name matches { // --- Got a match add it to the array if possible --- // if ((*NumberOfMatchesFound + 1) > NumberOfPossiblePIDsInArray) { //if we overran the array buffer passed we release the allocated buffer give an error. free(BSDProcessInformationStructure); return(kPIDBufferOverrunError); } //adding the value to the array. ArrayOfReturnedPIDs[*NumberOfMatchesFound] = CurrentExaminedProcessPID; //incrementing our number of matches found. *NumberOfMatchesFound = *NumberOfMatchesFound + 1; } }//end looking through process list free(BSDProcessInformationStructure); //done with allocated buffer so release. if (*NumberOfMatchesFound == 0) { //didn't find any matches return error. return(kCouldNotFindRequestedProcess); } else { //found matches return success. return(kSuccess); } } /***************************************************** * GetPIDForProcessName ***************************************************** * Purpose: A convience call for GetAllPIDsForProcessName(). * This function looks up a process PID given a BSD process * name. * * Parameters: * ProcessName A constant C-string. On calling * GetPIDForProcessName this variable holds the BSD process name * used to do the process lookup. Note that the process name you need * to pass is the name of the BSD executable process. If trying * to find the PID of an regular OSX application you will need to pass the * name of the actual BSD executable inside an application bundle (rather * than the bundle name itself). In any case as a user you can find the * BSD process name of any process (including OSX applications) by * typing the command "ps -axcocommand,pid" in terminal. * * *Function Result* A integer return value. * See result codes listed below. * Result Codes: * >0 Success. The value returned is the PID of the * matching process. * -1 Error getting PID for requested process. This error can * be caused by several things. One is if no such process exists. * Another is if more than one process has the given name. The * thing to do here is to call GetAllPIDsForProcessName() * for complete error code or to get PIDs if there are multiple * processes with that name. *****************************************************/ int GetPIDForProcessName(const char* ProcessName) { pid_t PIDArray[1] = {0}; int Error = 0; unsigned int NumberOfMatches = 0; /* Here we are calling the function GetAllPIDsForProcessName which wil give us the PIDs * of the process name we pass. Of course here we are hoping for a single PID return. * First Argument: The BSD process name of the process we want to lookup. In this case the * the process name passed to us. * Second Argument: A preallocated array of pid_t. This is where the PIDs of matching processes * will be placed on return. We pass the array we just allocated which is length one. * Third Argument: The number of pid_t entries located in the array of pid_t (argument 2). In this * case our array has one pid_t entry so pass one. * Forth Argument: On return this will hold the number of PIDs placed into the * pid_t array (array passed in argument 2). * Fifth Argument: Passing NULL to ignore this argument. * Return Value: An error indicating success (zero result) or failure (non-zero). * */ Error = GetAllPIDsForProcessName(ProcessName, PIDArray, 1, &NumberOfMatches, NULL); if ((Error == 0) && (NumberOfMatches == 1))//success! { return((int) PIDArray[0]); //return the one PID we found. } else { return(-1); } } UnixAgent-2.10.0/macosx/ocsng_app-xcode/GetPID.h000077500000000000000000000207141432320066700212760ustar00rootroot00000000000000/* File: GetPID.h Description: This file defines a simple API to do process PID lookup based on process name. Author: Chad Jones Copyright: Copyright 2003 Apple Computer, Inc. All rights reserved. Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apples copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Change History (most recent first): */ #if !defined(__DTSSampleCode_GetPID__) #define __DTSSampleCode_GetPID__ 1 #include #include #if defined(__cplusplus) extern "C" { #endif // --- Defining constants for use with sample code --- // enum {kSuccess = 0, kCouldNotFindRequestedProcess = -1, kInvalidArgumentsError = -2, kErrorGettingSizeOfBufferRequired = -3, kUnableToAllocateMemoryForBuffer = -4, kPIDBufferOverrunError = -5}; /***************************************************** * GetAllPIDsForProcessName ***************************************************** * Purpose: This functions purpose is to lookup a BSD * process PID given the BSD process name. This function may * potentially return multiple PIDs for a given BSD process name * since several processes can have the same BSD process name. * * Parameters: * ProcessName A constant C-string. On calling * GetAllPIDsForProcessName this variable holds the BSD process name * used to do the process lookup. Note that the process name you need * to pass is the name of the BSD executable process. If trying * to find the PID of an regular OSX application you will need to pass the * name of the actual BSD executable inside an application bundle (rather * than the bundle name itself). In any case as a user you can find the * BSD process name of any process (including OSX applications) by * typing the command "ps -axcocommand,pid" in terminal. * * ArrayOfReturnedPIDs A pointer to a pre-allocated array of pid_t. * On calling GetAllPIDsForProcessName this variable must be a pointer to a * pre-allocated array of pid_t whos length (in number of pid_t entries) is defined * in ArrayOfPIDsLength. On successful return from GetAllPIDsForProcessName * this array will hold the PIDs of all processes which have a matching process * name to that specified in the ProcessName input variable. The number of actual * PIDs entered in the array starting at index zero will be the value returned * in NumberOfMatchesFound. On failed return if the error is a buffer overflow * error then the buffer will be filled to the max with PIDs which matched. * Otherwise on failed return the state of the array will be undefined. * * NumberOfPossiblePIDsInArray A unsigned integer. On calling * GetAllPIDsForProcessName this variable will hold the number of * pre-allocated PID entries which are in the ArrayOfReturnedPIDs for this functions * use. Note this value must have a value greater than zero. * * NumberOfMatchesFound An unsigned integer. On calling GetAllPIDsForProcessName * this variable will point to a pre-allocated unsigned integer. On return from * GetAllPIDsForProcessName this variable will contain the number of PIDs contained in the * ArrayOfReturnedPIDs. On failed return the value of the variable will be undefined. * * SysctlError A pointer to a pre-allocated integer. On failed return, this * variable represents the error returned from the sysctl command. On function * success this variable will have a value specified by the sysctl based on the * error that occurred. On success the variable will have the value zero. * Note this variable can also be NULL in which case the variable is ignored. * * *Function Result* A integer return value. * See result codes listed below. * Result Codes: * 0 Success. A set of process PIDs were found and are located in * ArrayOfReturnedPIDs array. * -1 Could not find a process with a matching process name * (i.e. process not found). * -2 Invalid arguments passed. * -3 Unable to get the size of sysctl buffer required * (consult SysctlError return value for more information) * -4 Unable to allocate memory to store BSD process information * (consult SysctlError return value for more information) * -5 The array passed to hold the returned PIDs is not large enough * to hold all PIDs of process with matching names. * *****************************************************/ int GetAllPIDsForProcessName(const char* ProcessName, pid_t ArrayOfReturnedPIDs[], const unsigned int NumberOfPossiblePIDsInArray, unsigned int* NumberOfMatchesFound, int* SysctlError); //Can be NULL /***************************************************** * GetPIDForProcessName ***************************************************** * Purpose: A convience call for GetAllPIDsForProcessName(). * This function looks up a process PID given a BSD process * name. * * Parameters: * ProcessName A constant C-string. On calling * GetPIDForProcessName this variable holds the BSD process name * used to do the process lookup. Note that the process name you need * to pass is the name of the BSD executable process. If trying * to find the PID of an regular OSX application you will need to pass the * name of the actual BSD executable inside an application bundle (rather * than the bundle name itself). In any case as a user you can find the * BSD process name of any process (including OSX applications) by * typing the command "ps -axcocommand,pid" in terminal. * * *Function Result* A integer return value. * See result codes listed below. * Result Codes: * >=0 Success. The value returned is the PID of the * requested process. * -1 Error getting PID for requested process. This error can * be caused by several things. One is if no such process exists. * Another is if more than one process has the given name. The * Answer is to call GetAllPIDsForProcessName() * for complete error code or to get PIDs if there are multiple * processes with that name. *****************************************************/ int GetPIDForProcessName(const char* ProcessName); #if defined(__cplusplus) } #endif #endifUnixAgent-2.10.0/macosx/ocsng_app-xcode/Info.plist000066400000000000000000000015551432320066700220200ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile ocs_logo CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature OCNG CFBundleVersion $(CURRENT_PROJECT_VERSION) LSApplicationCategoryType public.app-category.utilities LSUIElement UnixAgent-2.10.0/macosx/ocsng_app-xcode/OCSNG.xcodeproj/000077500000000000000000000000001432320066700227075ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsng_app-xcode/OCSNG.xcodeproj/ocs.mode1000066400000000000000000001171621432320066700244320ustar00rootroot00000000000000 ActivePerspectiveName Project AllowedModules BundleLoadPath MaxInstances n Module PBXSmartGroupTreeModule Name Groups and Files Outline View BundleLoadPath MaxInstances n Module PBXNavigatorGroup Name Editor BundleLoadPath MaxInstances n Module XCTaskListModule Name Task List BundleLoadPath MaxInstances n Module XCDetailModule Name File and Smart Group Detail Viewer BundleLoadPath MaxInstances 1 Module PBXBuildResultsModule Name Detailed Build Results Viewer BundleLoadPath MaxInstances 1 Module PBXProjectFindModule Name Project Batch Find Tool BundleLoadPath MaxInstances n Module PBXRunSessionModule Name Run Log BundleLoadPath MaxInstances n Module PBXBookmarksModule Name Bookmarks Tool BundleLoadPath MaxInstances n Module PBXClassBrowserModule Name Class Browser BundleLoadPath MaxInstances n Module PBXCVSModule Name Source Code Control Tool BundleLoadPath MaxInstances n Module PBXDebugBreakpointsModule Name Debug Breakpoints Tool BundleLoadPath MaxInstances n Module XCDockableInspector Name Inspector BundleLoadPath MaxInstances n Module PBXOpenQuicklyModule Name Open Quickly Tool BundleLoadPath MaxInstances 1 Module PBXDebugSessionModule Name Debugger BundleLoadPath MaxInstances 1 Module PBXDebugCLIModule Name Debug Console Description DefaultDescriptionKey DockingSystemVisible Extension mode1 FavBarConfig PBXProjectModuleGUID 061EA96D130275AC009A0BD6 XCBarModuleItemNames XCBarModuleItems FirstTimeWindowDisplayed Identifier com.apple.perspectives.project.mode1 MajorVersion 31 MinorVersion 1 Name Default Notifications OpenEditors Content PBXProjectModuleGUID 06C5590613CC1F6A00405FC9 PBXProjectModuleLabel main.m PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 06C5590713CC1F6A00405FC9 PBXProjectModuleLabel main.m _historyCapacity 0 bookmark 06C5593E13CC2EFB00405FC9 history 06C5591D13CC27B200405FC9 SplitCount 1 StatusBarVisibility Geometry Frame {{0, 20}, {948, 609}} PBXModuleWindowStatusBarHidden2 RubberWindowFrame 390 203 948 650 0 0 1440 878 PerspectiveWidths -1 -1 Perspectives ChosenToolbarItems active-target-popup active-buildstyle-popup action NSToolbarFlexibleSpaceItem buildOrClean build-and-runOrDebug com.apple.ide.PBXToolbarStopButton get-info toggle-editor NSToolbarFlexibleSpaceItem com.apple.pbx.toolbar.searchfield ControllerClassBaseName IconName WindowOfProjectWithEditor Identifier perspective.project IsVertical Layout BecomeActive ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 080E96DDFE201D6D7F000001 29B97315FDCFA39411CA2CEA 29B97317FDCFA39411CA2CEA 29B97323FDCFA39411CA2CEA 1058C7A0FEA54F0111CA2CBB 1058C7A2FEA54F0111CA2CBB 1C37FBAC04509CD000000102 06C5593713CC2B2600405FC9 06C5593813CC2B2600405FC9 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 5 3 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 690}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 708}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 10 115 1440 749 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 203pt Dock ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel MyNewFile14.java PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel MyNewFile14.java SplitCount 1 StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {1232, 0}} RubberWindowFrame 10 115 1440 749 0 0 1440 878 Module PBXNavigatorGroup Proportion 0pt ContentConfiguration PBXProjectModuleGUID 1CE0B20506471E060097A5F4 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{0, 5}, {1232, 703}} RubberWindowFrame 10 115 1440 749 0 0 1440 878 Module XCDetailModule Proportion 703pt Proportion 1232pt Name Project ServiceClasses XCModuleDock PBXSmartGroupTreeModule XCModuleDock PBXNavigatorGroup XCDetailModule TableOfContents 06C5590413CC1F6A00405FC9 1CE0B1FE06471DED0097A5F4 06C5590513CC1F6A00405FC9 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 ToolbarConfiguration xcode.toolbar.config.default ControllerClassBaseName IconName WindowOfProject Identifier perspective.morph IsVertical 0 Layout BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 11E0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 337}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 1 XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 355}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 373 269 690 397 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 100% Name Morph PreferredWidth 300 ServiceClasses XCModuleDock PBXSmartGroupTreeModule TableOfContents 11E0B1FE06471DED0097A5F4 ToolbarConfiguration xcode.toolbar.config.default.short PerspectivesBarVisible ShelfIsVisible SourceDescription file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' StatusbarIsVisible TimeStamp 0.0 ToolbarDisplayMode 1 ToolbarIsVisible ToolbarSizeMode 1 Type Perspectives UpdateMessage The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? WindowJustification 5 WindowOrderList 06E04A76134C3537009FD4CA 06C5590613CC1F6A00405FC9 1C0AD2B3069F1EA900FABCE6 /Users/ocs/work/ocs/dev/ocsng_app-xcode/OCSNG.xcodeproj WindowString 10 115 1440 749 0 0 1440 878 WindowTools FirstTimeWindowDisplayed Identifier windowTool.build IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel main.m StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {1440, 466}} RubberWindowFrame 185 -243 1440 748 0 0 1440 878 Module PBXNavigatorGroup Proportion 466pt BecomeActive ContentConfiguration PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel Build XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open 1011 GeometryConfiguration Frame {{0, 471}, {1440, 236}} RubberWindowFrame 185 -243 1440 748 0 0 1440 878 Module PBXBuildResultsModule Proportion 236pt Proportion 707pt Name Build Results ServiceClasses PBXBuildResultsModule StatusbarIsVisible TableOfContents 06E04A76134C3537009FD4CA 06C558F513CC1D1900405FC9 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.build WindowString 185 -243 1440 748 0 0 1440 878 WindowToolGUID 06E04A76134C3537009FD4CA WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.debugger IsVertical Layout Dock ContentConfiguration Debugger HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {313, 196}} {{313, 0}, {381, 196}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {694, 196}} {{0, 196}, {694, 185}} LauncherConfigVersion 8 PBXProjectModuleGUID 1C162984064C10D400B95A72 PBXProjectModuleLabel Debug - GLUTExamples (Underwater) GeometryConfiguration DebugConsoleDrawerSize {100, 120} DebugConsoleVisible None DebugConsoleWindowFrame {{200, 200}, {500, 300}} DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame {{0, 0}, {694, 381}} RubberWindowFrame 496 358 694 422 0 0 1440 878 Module PBXDebugSessionModule Proportion 381pt Proportion 381pt Name Debugger ServiceClasses PBXDebugSessionModule StatusbarIsVisible TableOfContents 1CD10A99069EF8BA00B06720 06BF31CC13CAD57A006FA767 1C162984064C10D400B95A72 06BF31CD13CAD57A006FA767 06BF31CE13CAD57A006FA767 06BF31CF13CAD57A006FA767 06BF31D013CAD57A006FA767 06BF31D113CAD57A006FA767 06BF31D213CAD57A006FA767 ToolbarConfiguration xcode.toolbar.config.debug WindowString 496 358 694 422 0 0 1440 878 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible Identifier windowTool.find Layout Dock Dock ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CD0528D0623707200166675 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {781, 167}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXNavigatorGroup Proportion 781pt Proportion 50% BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD0528E0623707200166675 PBXProjectModuleLabel Project Find GeometryConfiguration Frame {{8, 0}, {773, 254}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXProjectFindModule Proportion 50% Proportion 428pt Name Project Find ServiceClasses PBXProjectFindModule StatusbarIsVisible 1 TableOfContents 1C530D57069F1CE1000CFCEE 1C530D58069F1CE1000CFCEE 1C530D59069F1CE1000CFCEE 1CDD528C0622207200134675 1C530D5A069F1CE1000CFCEE 1CE0B1FE06471DED0097A5F4 1CD0528E0623707200166675 WindowString 62 385 781 470 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible 0 Identifier MENUSEPARATOR FirstTimeWindowDisplayed Identifier windowTool.debuggerConsole IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAAC065D492600B07095 PBXProjectModuleLabel Debugger Console GeometryConfiguration Frame {{0, 0}, {440, 358}} RubberWindowFrame 73 409 440 400 0 0 1440 878 Module PBXDebugCLIModule Proportion 358pt Proportion 359pt Name Debugger Console ServiceClasses PBXDebugCLIModule StatusbarIsVisible TableOfContents 06C399E61394981F0047198A 06BF31D313CAD57A006FA767 1C78EAAC065D492600B07095 WindowString 73 409 440 400 0 0 1440 878 WindowToolGUID 06C399E61394981F0047198A WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.run IsVertical Layout Dock ContentConfiguration LauncherConfigVersion 3 PBXProjectModuleGUID 1CD0528B0623707200166675 PBXProjectModuleLabel Run Runner HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {493, 167}} {{0, 176}, {493, 267}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {405, 443}} {{414, 0}, {514, 443}} GeometryConfiguration Frame {{0, 0}, {459, 159}} RubberWindowFrame 31 655 459 200 0 0 1440 878 Module PBXRunSessionModule Proportion 159pt Proportion 159pt Name Run Log ServiceClasses PBXRunSessionModule StatusbarIsVisible TableOfContents 1C0AD2B3069F1EA900FABCE6 06C558F613CC1D1900405FC9 1CD0528B0623707200166675 06C558F713CC1D1900405FC9 ToolbarConfiguration xcode.toolbar.config.run WindowString 31 655 459 200 0 0 1440 878 WindowToolGUID 1C0AD2B3069F1EA900FABCE6 WindowToolIsVisible Identifier windowTool.scm Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAB2065D492600B07095 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1C78EAB3065D492600B07095 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {452, 0}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 Module PBXNavigatorGroup Proportion 0pt BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD052920623707200166675 PBXProjectModuleLabel SCM GeometryConfiguration ConsoleFrame {{0, 259}, {452, 0}} Frame {{0, 7}, {452, 259}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 TableConfiguration Status 30 FileName 199 Path 197.09500122070312 TableFrame {{0, 0}, {452, 250}} Module PBXCVSModule Proportion 262pt Proportion 266pt Name SCM ServiceClasses PBXCVSModule StatusbarIsVisible 1 TableOfContents 1C78EAB4065D492600B07095 1C78EAB5065D492600B07095 1C78EAB2065D492600B07095 1CD052920623707200166675 ToolbarConfiguration xcode.toolbar.config.scm WindowString 743 379 452 308 0 0 1280 1002 Identifier windowTool.breakpoints IsVertical 0 Layout Dock BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C77FABC04509CD000000102 PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided no PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 168 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {168, 350}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 0 GeometryConfiguration Frame {{0, 0}, {185, 368}} GroupTreeTableConfiguration MainColumn 168 RubberWindowFrame 315 424 744 409 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 185pt ContentConfiguration PBXProjectModuleGUID 1CA1AED706398EBD00589147 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{190, 0}, {554, 368}} RubberWindowFrame 315 424 744 409 0 0 1440 878 Module XCDetailModule Proportion 554pt Proportion 368pt MajorVersion 2 MinorVersion 0 Name Breakpoints ServiceClasses PBXSmartGroupTreeModule XCDetailModule StatusbarIsVisible 1 TableOfContents 1CDDB66807F98D9800BB5817 1CDDB66907F98D9800BB5817 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpoints WindowString 315 424 744 409 0 0 1440 878 WindowToolGUID 1CDDB66807F98D9800BB5817 WindowToolIsVisible 1 Identifier windowTool.debugAnimator Layout Dock Module PBXNavigatorGroup Proportion 100% Proportion 100% Name Debug Visualizer ServiceClasses PBXNavigatorGroup StatusbarIsVisible 1 ToolbarConfiguration xcode.toolbar.config.debugAnimator WindowString 100 100 700 500 0 0 1280 1002 Identifier windowTool.bookmarks Layout Dock Module PBXBookmarksModule Proportion 100% Proportion 100% Name Bookmarks ServiceClasses PBXBookmarksModule StatusbarIsVisible 0 WindowString 538 42 401 187 0 0 1280 1002 FirstTimeWindowDisplayed Identifier windowTool.classBrowser IsVertical Layout Dock BecomeActive ContentConfiguration OptionsSetName Hierarchy, all classes PBXProjectModuleGUID 1CA6456E063B45B4001379D8 PBXProjectModuleLabel Class Browser - NSObject GeometryConfiguration ClassesFrame {{0, 0}, {378, 96}} ClassesTreeTableConfiguration PBXClassNameColumnIdentifier 208 PBXClassBookColumnIdentifier 22 Frame {{0, 0}, {630, 332}} MembersFrame {{0, 101}, {378, 231}} MembersTreeTableConfiguration PBXMemberTypeIconColumnIdentifier 22 PBXMemberNameColumnIdentifier 216 PBXMemberTypeColumnIdentifier 101 PBXMemberBookColumnIdentifier 22 RubberWindowFrame 397 461 630 352 0 0 1440 878 Module PBXClassBrowserModule Proportion 332pt Proportion 332pt Name Class Browser ServiceClasses PBXClassBrowserModule StatusbarIsVisible TableOfContents 1C0AD2AF069F1E9B00FABCE6 069BBEBB134C395300F43B40 1CA6456E063B45B4001379D8 ToolbarConfiguration xcode.toolbar.config.classbrowser WindowString 397 461 630 352 0 0 1440 878 WindowToolGUID 1C0AD2AF069F1E9B00FABCE6 WindowToolIsVisible UnixAgent-2.10.0/macosx/ocsng_app-xcode/OCSNG.xcodeproj/project.pbxproj000066400000000000000000000572751432320066700260030ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 000B44222538931C008B12B1 /* GetPID.c in Sources */ = {isa = PBXBuildFile; fileRef = EE2C4E590DF1CA5800171780 /* GetPID.c */; }; 000B444F25389CAF008B12B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 000B5224254177FD008B12B1 /* lib in Resources */ = {isa = PBXBuildFile; fileRef = 000B5223254177FD008B12B1 /* lib */; }; 0625C76F13CAC89000D6EB7C /* ocs_logo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 0625C76E13CAC89000D6EB7C /* ocs_logo.icns */; }; 0649FB3414D9E198001EC640 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0649FB3314D9E198001EC640 /* Localizable.strings */; }; 06C39B371394ADB20047198A /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39B361394ADB20047198A /* CoreData.framework */; }; 06C39B381394ADB20047198A /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39B361394ADB20047198A /* CoreData.framework */; }; 06C39B3A1394ADDF0047198A /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39B391394ADDF0047198A /* AppKit.framework */; }; 06C39B3B1394ADDF0047198A /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39B391394ADDF0047198A /* AppKit.framework */; }; 06C39BCE1394B5600047198A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39BCD1394B5600047198A /* Security.framework */; }; 06C39BCF1394B5600047198A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06C39BCD1394B5600047198A /* Security.framework */; }; 06D657B4134FDBFF00981FE3 /* ocscontact.m in Sources */ = {isa = PBXBuildFile; fileRef = 06D657B3134FDBFF00981FE3 /* ocscontact.m */; }; 0B6A94131F83D4E600D02E57 /* THANKS in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A940E1F83D4E500D02E57 /* THANKS */; }; 0B6A94141F83D4E600D02E57 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A940F1F83D4E600D02E57 /* LICENSE */; }; 0B6A94151F83D4E600D02E57 /* Changes in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A94101F83D4E600D02E57 /* Changes */; }; 0B6A94161F83D4E600D02E57 /* ocsinventory-agent in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A94111F83D4E600D02E57 /* ocsinventory-agent */; }; 0B6A94171F83D4E600D02E57 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A94121F83D4E600D02E57 /* AUTHORS */; }; 0B6A943E1F83DB3F00D02E57 /* uninstaller.sh in Resources */ = {isa = PBXBuildFile; fileRef = 0B6A943D1F83DB3F00D02E57 /* uninstaller.sh */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 000B444925389C74008B12B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 000B5223254177FD008B12B1 /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = ../../lib; sourceTree = ""; }; 0625C76E13CAC89000D6EB7C /* ocs_logo.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = ocs_logo.icns; path = icons/ocs_logo.icns; sourceTree = ""; }; 06C39B361394ADB20047198A /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 06C39B391394ADDF0047198A /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 06C39BCD1394B5600047198A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; 06D65785134FD5B800981FE3 /* ocscontact-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ocscontact-Info.plist"; sourceTree = ""; }; 06D657A7134FD97A00981FE3 /* ocscontact */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ocscontact; sourceTree = BUILT_PRODUCTS_DIR; }; 06D657B2134FDBFF00981FE3 /* ocscontact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocscontact.h; sourceTree = ""; }; 06D657B3134FDBFF00981FE3 /* ocscontact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ocscontact.m; sourceTree = ""; }; 0B6A940E1F83D4E500D02E57 /* THANKS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = THANKS; path = ../../THANKS; sourceTree = ""; }; 0B6A940F1F83D4E600D02E57 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../../LICENSE; sourceTree = ""; }; 0B6A94101F83D4E600D02E57 /* Changes */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Changes; path = ../../Changes; sourceTree = ""; }; 0B6A94111F83D4E600D02E57 /* ocsinventory-agent */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; name = "ocsinventory-agent"; path = "../../ocsinventory-agent"; sourceTree = ""; }; 0B6A94121F83D4E600D02E57 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = ""; }; 0B6A943D1F83DB3F00D02E57 /* uninstaller.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = uninstaller.sh; path = ../scripts/uninstaller.sh; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* OCSNG_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCSNG_Prefix.pch; sourceTree = ""; }; 438B3A5D23E0D10A00631B54 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 438B3A5E23E0D10B00631B54 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 438B3A5F23E0D10F00631B54 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* OCSNG.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OCSNG.app; sourceTree = BUILT_PRODUCTS_DIR; }; EE2C4E590DF1CA5800171780 /* GetPID.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GetPID.c; sourceTree = ""; }; EE2C4E5A0DF1CA5800171780 /* GetPID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetPID.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 06D657A5134FD97A00981FE3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 000B444F25389CAF008B12B1 /* Cocoa.framework in Frameworks */, 06C39B371394ADB20047198A /* CoreData.framework in Frameworks */, 06C39B3A1394ADDF0047198A /* AppKit.framework in Frameworks */, 06C39BCE1394B5600047198A /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 06C39B381394ADB20047198A /* CoreData.framework in Frameworks */, 06C39B3B1394ADDF0047198A /* AppKit.framework in Frameworks */, 06C39BCF1394B5600047198A /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 29B97316FDCFA39411CA2CEA /* main.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 06C39BCD1394B5600047198A /* Security.framework */, 06C39B391394ADDF0047198A /* AppKit.framework */, 06C39B361394ADB20047198A /* CoreData.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* OCSNG.app */, 06D657A7134FD97A00981FE3 /* ocscontact */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* OCSNG */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, 06D65785134FD5B800981FE3 /* ocscontact-Info.plist */, ); name = OCSNG; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( EE2C4E590DF1CA5800171780 /* GetPID.c */, EE2C4E5A0DF1CA5800171780 /* GetPID.h */, 06D657B2134FDBFF00981FE3 /* ocscontact.h */, 06D657B3134FDBFF00981FE3 /* ocscontact.m */, 32CA4F630368D1EE00C91783 /* OCSNG_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 000B5223254177FD008B12B1 /* lib */, 0B6A943D1F83DB3F00D02E57 /* uninstaller.sh */, 0B6A94121F83D4E600D02E57 /* AUTHORS */, 0B6A94101F83D4E600D02E57 /* Changes */, 0B6A940F1F83D4E600D02E57 /* LICENSE */, 0B6A94111F83D4E600D02E57 /* ocsinventory-agent */, 0B6A940E1F83D4E500D02E57 /* THANKS */, 0625C76E13CAC89000D6EB7C /* ocs_logo.icns */, 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 0649FB3314D9E198001EC640 /* Localizable.strings */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 000B444925389C74008B12B1 /* Foundation.framework */, 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 06D657A6134FD97A00981FE3 /* ocscontact */ = { isa = PBXNativeTarget; buildConfigurationList = 06D657A9134FD99800981FE3 /* Build configuration list for PBXNativeTarget "ocscontact" */; buildPhases = ( 06D657A4134FD97A00981FE3 /* Sources */, 06D657A5134FD97A00981FE3 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = ocscontact; productName = ocscontact; productReference = 06D657A7134FD97A00981FE3 /* ocscontact */; productType = "com.apple.product-type.tool"; }; 8D1107260486CEB800E47090 /* OCSNG */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "OCSNG" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = OCSNG; productInstallPath = "$(HOME)/Applications"; productName = OCSNG; productReference = 8D1107320486CEB800E47090 /* OCSNG.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1200; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "OCSNG" */; compatibilityVersion = "Xcode 3.0"; developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( Base, en, de, fr, ja, ); mainGroup = 29B97314FDCFA39411CA2CEA /* OCSNG */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* OCSNG */, 06D657A6134FD97A00981FE3 /* ocscontact */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 0B6A94151F83D4E600D02E57 /* Changes in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 0625C76F13CAC89000D6EB7C /* ocs_logo.icns in Resources */, 0B6A94161F83D4E600D02E57 /* ocsinventory-agent in Resources */, 0649FB3414D9E198001EC640 /* Localizable.strings in Resources */, 0B6A94171F83D4E600D02E57 /* AUTHORS in Resources */, 000B5224254177FD008B12B1 /* lib in Resources */, 0B6A943E1F83DB3F00D02E57 /* uninstaller.sh in Resources */, 0B6A94131F83D4E600D02E57 /* THANKS in Resources */, 0B6A94141F83D4E600D02E57 /* LICENSE in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 06D657A4134FD97A00981FE3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 06D657B4134FDBFF00981FE3 /* ocscontact.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 000B44222538931C008B12B1 /* GetPID.c in Sources */, 8D11072D0486CEB800E47090 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 0649FB3314D9E198001EC640 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 438B3A5E23E0D10B00631B54 /* en */, 438B3A5F23E0D10F00631B54 /* fr */, ); name = Localizable.strings; sourceTree = ""; }; 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 438B3A5D23E0D10A00631B54 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 06D657AA134FD99800981FE3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = NO; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "Apple Development"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 325U55CH79; ENABLE_HARDENED_RUNTIME = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INSTALL_PATH = "$(HOME)/bin"; MACOSX_DEPLOYMENT_TARGET = 10.12; OBJROOT = build; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_BUNDLE_IDENTIFIER = org.ocsng.agentcontact; PRODUCT_NAME = ocscontact; SYMROOT = build; VALID_ARCHS = x86_64; ZERO_LINK = NO; }; name = Debug; }; 06D657AB134FD99800981FE3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = NO; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "Apple Development"; COPY_PHASE_STRIP = YES; DEVELOPMENT_TEAM = 325U55CH79; ENABLE_HARDENED_RUNTIME = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INSTALL_PATH = /Applications; MACOSX_DEPLOYMENT_TARGET = 10.12; OBJROOT = build; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_BUNDLE_IDENTIFIER = org.ocsng.agentcontact; PRODUCT_NAME = ocscontact; SDKROOT = macosx; SKIP_INSTALL = YES; SYMROOT = build; VALID_ARCHS = x86_64; ZERO_LINK = NO; }; name = Release; }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ADDITIONAL_SDKS = ""; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 2.10.0; DEVELOPMENT_TEAM = 325U55CH79; ENABLE_HARDENED_RUNTIME = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = OCSNG_Prefix.pch; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.12; MARKETING_VERSION = 2.10.0; OBJROOT = build; ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = org.ocsng.agent; PRODUCT_NAME = OCSNG; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SYMROOT = build; VALID_ARCHS = x86_64; WRAPPER_EXTENSION = app; ZERO_LINK = ""; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2.10.0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 325U55CH79; ENABLE_HARDENED_RUNTIME = YES; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = OCSNG_Prefix.pch; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = Info.plist; MACOSX_DEPLOYMENT_TARGET = 10.12; MARKETING_VERSION = 2.10.0; OBJROOT = build; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.ocsng.agent; PRODUCT_NAME = OCSNG; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SYMROOT = build; VALID_ARCHS = x86_64; WRAPPER_EXTENSION = app; ZERO_LINK = ""; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = ""; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_GROUP = $GROUP; INSTALL_MODE_FLAG = ""; INSTALL_OWNER = $USER; MACOSX_DEPLOYMENT_TARGET = 10.12; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; DEPLOYMENT_LOCATION = YES; DSTROOT = "/tmp/$(PROJECT_NAME).dst"; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = ""; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; INSTALL_GROUP = $GROUP; INSTALL_MODE_FLAG = ""; INSTALL_OWNER = $USER; INSTALL_PATH = /Applications; LD_MAP_FILE_PATH = "$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt"; MACOSX_DEPLOYMENT_TARGET = 10.12; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.12; SDKROOT = macosx; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 06D657A9134FD99800981FE3 /* Build configuration list for PBXNativeTarget "ocscontact" */ = { isa = XCConfigurationList; buildConfigurations = ( 06D657AA134FD99800981FE3 /* Debug */, 06D657AB134FD99800981FE3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "OCSNG" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "OCSNG" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } UnixAgent-2.10.0/macosx/ocsng_app-xcode/OCSNG_Prefix.pch000066400000000000000000000002151432320066700227220ustar00rootroot00000000000000// // Prefix header for all source files of the 'OCSNG' target in the 'OCSNG' project // #ifdef __OBJC__ #import #endif UnixAgent-2.10.0/macosx/ocsng_app-xcode/en.lproj/000077500000000000000000000000001432320066700215715ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsng_app-xcode/en.lproj/InfoPlist.strings000066400000000000000000000003721432320066700251150ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyleft Barely3am.com - claimid/saxjazman9, 2008";UnixAgent-2.10.0/macosx/ocsng_app-xcode/en.lproj/Localizable.strings000066400000000000000000000010621432320066700254240ustar00rootroot00000000000000// // OCSINVENTORY-NG // Copyleft Guillaume PROTET 2011 // Web : http://www.ocsinventory-ng.org // // This code is open source and may be copied and modified as long as the source // code is always made freely available. // Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt // // //Yes button "Yes" = "Yes"; //No button "No" = "No"; //First Window question "Ask_agent_run" = "Do you want to launch OCS Inventory NG agent ?"; //First window comment "Ask_agent_run_comment" = "This will take contact with OCS Inventory NG server";UnixAgent-2.10.0/macosx/ocsng_app-xcode/fr.lproj/000077500000000000000000000000001432320066700215765ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsng_app-xcode/fr.lproj/Localizable.strings000066400000000000000000000010641432320066700254330ustar00rootroot00000000000000// // OCSINVENTORY-NG // Copyleft Guillaume PROTET 2011 // Web : http://www.ocsinventory-ng.org // // This code is open source and may be copied and modified as long as the source // code is always made freely available. // Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt // // //Yes button "Yes" = "Oui"; //No button "No" = "Non"; //First Window question "Ask_agent_run" = "Voulez-vous lancer l'agent OCS Inventory NG ?"; //First window comment "Ask_agent_run_comment" = "Ceci prendra contact avec le serveur OCS Inventory NG";UnixAgent-2.10.0/macosx/ocsng_app-xcode/icons/000077500000000000000000000000001432320066700211555ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/ocsng_app-xcode/icons/ocs_logo.icns000066400000000000000000000246261432320066700236510ustar00rootroot00000000000000icns)TOC ic08)~ic08)~PNG  IHDR\rfsRGB)0IDATx} x]ywfYeyWٲ-K^11IhI6 ihJBP~~p44 PU˛,aٖe--־/wkdՕts}ys37yϜov0~6O#d,Q&O,] ¿baG5|TQGǶ?}l I||C@$ `aL 69pC90! x^#QDtFQ o7"2|D $Ln 1,d>0$ 0Ev@m?\[.Jq䥹e`΂[[, w?yK%3$ ܌A !NjyF kJ&KYX,\ \BK=3y60-])6rIl@]Gy&0W)~ٿ$ gLn*OxpE!xg^!|뿓gՓcR0GfyY2j<C@T`L .;Lw'dPFY j$p&jo ~WE9 ]nkg.p1Ocϻڀ%F^'vB?mx»>Ed>>d60arJ<x;FA@^ӟ`"_|w1Qy (=$ ʤ|a W$ ̆ SV0vv;CW\]w{20bk;y;LnBR "`TG26KL+< L@\C\ o&^o&Ch F# 3q;t]~2G_@XY5cX*X 4'˹9~F>@X itg/L}G@ZxHh4ku8Z" @z  `u"ld_[ _K% :XKH d #gxw,~B FbT ̑@)n#Q JXhkf(=0 ,]{K *H@vژwC@ ȶh#c??!F[@cO OV 0@ mA0zmc??!F[@cO OǶ? ?~!Mq)vAŤPph ٩J7k&jn^?AX?D3WϢ7gQ$ ֚WC4ȓ݆ |I}k`m+h*C2 GM/qLT_wt;K)F/JVSL>P|/Pש3$.nQTY~G3D7:s Ϫ"d!3!M,L/ri eŽ';;NBٹS"n~)4w[rd~maMjLԒRD|F[6cֻyA\]8\|[6-"q}t"͉K7aTnW@tr4/tn3|()@>[{-wbPz, p^*@Y?A<R\f="a< oSGGPgs2THCnt5TwB3yc-|׻ `ub.o>L_42ki:$AGU)eUʰ@T=:i] J3v.K *ESuiWQ2xko;?iN^IELVI'^:BPIC8M%[NU0Z;@^ h]GaaJ_~t=l%SK4s;(*CyK2읎Z@^:2=?|͊T^*Q@M^U R鳅TwVIhѧҢ[AQK]0a0͚,zPsaq|z~:R¾ .iPı xhdzep}܇;Ind:H}q5s,+z@T#8~ J_>r7;Tr=PsJqYW(o!SS 7"S9x{iUgB6i,R뽫E>@ǰ@a5~b<VҼtd$|HCp1DI60etR= #p%0L!o*uν;gMw@pD #"fk)cBM98jwE1Wn}xAUo H9IeFWw7W?Me~:jh#Ro[d7fݿmwLбvVr~KTw=4d.=͘6R]4'ƌM gxeeJ~s}dK38qE*^(ɪCtD|U(Y}JeBb^flNZ*AGd??_6Qh\g1AL1Q.W6iż;7|?#/l%!8 4gֆT-}Rs-t}}KUD߶N_-5 н(0vzJ ǫ:7S!ks5~z ct :[zITlɤ_ZCt-@d3hC)<>\Tu)ˣW_! Cy]:<$їBZ]`9;mLQQ>q[UA7VHA`'a/Kj:AK]%I^P~ :ߋZzzE}[Bp"-l#W1{Ђwl=?OGyŹP1ޗn*qOëצ/Zx-D~M߿1UOLJw렒gЕ3NDrБ{8H>-H,UwqϦLw8%;W=S: :RAGBch=/-KOFZ AyEx /-UOҠPdWNpБgAGD|1#~G'O/0Ԫifܳ} 39ݚ^TVEϒ[(2M͜wMj"a~KQT|02M/4#E!U)nnpU+6?m*^tJ:@MԳet][ & !  *gAG*f7 AG'_gwQ6JDvֵ  y9 ݀4/(? v؅~T=$GHE@"0UuF2,OKo#dFggg7Q$CO!Ud}x0 dwh-)ӼSĻFVN%Hmewl?OCJ`c?ض R73%aˎ @@=Yc߼ET\5{?v5.5Ul 2>8ײXۂYϛ@%LVv8(Ape):mV%8LM閄R +ɣ|ug?q:Z%;M=gRNB\3KYƬ',Cbb8*_?J*Q;k۩]uEQvDJ +>C 9fK.ܮZiz0DE) YA"ot|&eliC/QcIG`],:'C11:~d>*޹9xǞ(t6@_K/>AG?TdQ0mmEЯ)iOQx,wL AGJOdk@ $9?qrk2dž({HTqd xtR Dω;e<}lEtKU% @LC}G= ] IӈurЖ~rT e9F&FѬj+@z27r Ƒ^ܔ56eg'k?Wk;Zf>ևvqⒺ)Ry=63bt_|(jyt_P)/ SP5Ӝp^>s\BVqscއ%\Yj57'ER-)C)<֜굲exTpܟ@"NlILZLKfRg4@))\I5'OZjT{r5ڧ+/щWh `=ydV_W6~a?^\ͳBvau--tWnr#AWk[žf$Z)bZ2'&+?jx SPwPzn/h@ 68qbelA>[(8K ⵐTEui sh߯]~#,D_<@Uo}uz6'Kdյ{)<9#hցA>L2͏MIR(vNZ|[6ԗ"{ny P=j6ᶮT=;@,SN8Fp,cjv9EYYՔ(QdঅTk*&䥟]A (Tl[A;[uva\poOE(Gv6)e\:[SФ)4Q z-`ϼC/ )= Ak:Ew4Ǥz2(WR$6X5eܐIb[/ut'RF<PCVA)kVUMu/2If`D{Й rrTH^EUybY/XaqLfګw;b[Ux<ֻ}Ca=IHr?=XWbf(7 #y ռ+lf?#EOy"gEmPs\M΃<ZfSF j)(R Q(M^jGZUԦ!]T8EF`E뀀S@NI `m@_8EF`E뀀S@NI `m@_8Eϝ?$ k@> +||SՈd_   J1_   J1_   J1_   J1_   J1_   J1_   J1_   <S݅>W[ 2h\S@XZ(8\QB;52;8R*ԩ{.w}r mx| 'E1l&?g8>̍9S-{ 7l,&XctԶQoߣϯ֝">fLw|A׵ )qYe~x>%,L 7[jZwj? q Li =/" {{3e"=c/RwV@>>:b1EH͈UJ#Khڡ,dCCtǩa X0@m'ib1kǩrc6A˴kzNUO[{1U ?Lvj`jy* x|x-HP{DT Oҕ&!T[N̅p2]CsnGgS *RwK75U\?Kh@v. p]qȞ#tL3(nI͘Gn<2I,ڨejlΆqo4{6^f@a!!.$s!0Wib݄fP74(P X{m."p(VD`^E\ ŀXW& " B1 `E@VU EP X{m."p(VD`^E8(`miFlf6 @٨CJj`jB@O/-Wï6:' G3̨dYW 8hm_:6 ɤlTΑg o;~6G^g G+~ xP'EsG&>,Ѻu:|+"`JW;6vP>ѭJ konUδn';vF#@:qSne#[%O]C|R,~̋@@ 5ߌm50rE; @|~ հRk!$@@wn]< L^Ժ0R9(A< `*ciw$%/Ua A{Xo]KI| |vh!p&vVFI#zmAg(0DGAT)C<a2^  d}N+_vJRj[}-6~ʌ|\cyB y&Pw1N@# `~ƒf  .ǩU\&ȴB0paD@|IfUM\I+cM`<p|j*4H%2`!Yl P۩Uʓ_3mcyiKlFb Nv8;1u)iԼ3{G,[ɺ]|HE_i]w<f~6&cJr/$ G@x\ML6pD 3;YmvJɑ*bgW?ֹn'G32G"0H@`BxݾymeiMx1R YK!"#3!bG U|e<|ݹcIENDB`UnixAgent-2.10.0/macosx/ocsng_app-xcode/main.m000066400000000000000000000077441432320066700211600ustar00rootroot00000000000000// // OCSINVENTORY-NG // // Copyleft Wes Young (claimid.com/saxjazman9 - Barely3am.com) 2008 // // // This code is open source and may be copied and modified as long as the source // code is always made freely available. // Please refer to the General Public Licence http://www.gnu.org/ // // #import #include #include #include "GetPID.h" int main(int argc, char *argv[]) { NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; [NSApplication sharedApplication]; int launchOcsAgent = 1; //Getting current user NSString *user = NSUserName() ; if (![user isEqualToString:@"root"]) { //If not launched by Launchd //show icon on Dock if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) { ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToForegroundApplication); } NSAlert *askOcsAgentLaunch = [[NSAlert alloc] init]; [askOcsAgentLaunch setMessageText:NSLocalizedString(@"Ask_agent_run", @"First Window question")]; [askOcsAgentLaunch setInformativeText:NSLocalizedString(@"Ask_agent_run_comment", @"First window comment")]; [askOcsAgentLaunch addButtonWithTitle:NSLocalizedString(@"Yes", @"Yes Button")]; [askOcsAgentLaunch addButtonWithTitle:NSLocalizedString(@"No", @"No Button")]; [askOcsAgentLaunch setAlertStyle:NSAlertStyleInformational]; //Our application become the topmost window [NSApp activateIgnoringOtherApps:YES]; if ([askOcsAgentLaunch runModal] != NSAlertFirstButtonReturn) { // Button 'No' was clicked, we don't launch OCS agent launchOcsAgent = 0; } [askOcsAgentLaunch release]; } if (launchOcsAgent == 1 ) { // Too be on the safe side, I chose the array length to be 10. const int kPIDArrayLength = 10; pid_t myArray[kPIDArrayLength]; unsigned int numberMatches; // simple way of geting our PID, see if we're already running.... int error = GetAllPIDsForProcessName("OCSNG",myArray,kPIDArrayLength,&numberMatches,NULL); if (error == 0) { // Success if (numberMatches > 1) { // There's already a copy of this app running return -1; } } //We launch contact to server using Authorization Services (with asking password) OSStatus myStatus; AuthorizationFlags myFlags = kAuthorizationFlagDefaults; AuthorizationRef myAuthorizationRef; myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,myFlags, &myAuthorizationRef); if (myStatus != errAuthorizationSuccess) return myStatus; do { { AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0}; AuthorizationRights myRights = {1, &myItems}; myFlags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; myStatus = AuthorizationCopyRights (myAuthorizationRef,&myRights, NULL, myFlags, NULL ); } if (myStatus != errAuthorizationSuccess) break; { //We use an helper tool instead of running OCS agent directly NSString *ocscontactPath = [[NSBundle mainBundle] pathForResource:@"ocscontact"ofType:nil]; char *myArguments[] = { "", NULL }; FILE *myCommunicationsPipe = NULL; char myReadBuffer[128]; myFlags = kAuthorizationFlagDefaults; myStatus = AuthorizationExecuteWithPrivileges (myAuthorizationRef, [ocscontactPath UTF8String], kAuthorizationFlagDefaults, myArguments, &myCommunicationsPipe); if (myStatus == errAuthorizationSuccess) for(;;) { int bytesRead = read (fileno (myCommunicationsPipe),myReadBuffer, sizeof (myReadBuffer)); if (bytesRead < 1) break; write (fileno (stdout), myReadBuffer, bytesRead); } } } while (0); AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDefaults); return myStatus; } [autoreleasepool release]; return NSApplicationMain(argc, (const char **) argv); } UnixAgent-2.10.0/macosx/ocsng_app-xcode/ocscontact-Info.plist000066400000000000000000000013401432320066700241460ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier org.ocsinventory-ng.ocscontact CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 2.6 NSMainNibFile MainMenu NSPrincipalClass NSApplication UnixAgent-2.10.0/macosx/ocsng_app-xcode/ocscontact.h000066400000000000000000000006261432320066700223570ustar00rootroot00000000000000// // OCSINVENTORY-NG // Copyleft Guillaume PROTET 2011 // Web : http://www.ocsinventory-ng.org // // This code is open source and may be copied and modified as long as the source // code is always made freely available. // Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt // // #ifdef __OBJC__ #import #endif @interface ocscontact : NSObject { } @end UnixAgent-2.10.0/macosx/ocsng_app-xcode/ocscontact.m000066400000000000000000000020131432320066700223540ustar00rootroot00000000000000// // OCSINVENTORY-NG // Copyleft Guillaume PROTET 2011 // Web : http://www.ocsinventory-ng.org // // This code is open source and may be copied and modified as long as the source // code is always made freely available. // Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt // // //ocscontact is the helper tool to run OCS agent using Authorization Services. //ocscontact executable MUST be owned by root and have 700 permissions #import "ocscontact.h" @implementation ocscontact int main( int argc, char *argv[], char *envp[]) { NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; NSLog(@"Running ocscontact"); setuid(0); //To be able to run OCS agent as root NSTask *Task = [[NSTask alloc] init]; //We get the path of ocsinventory-agent executable NSString *ocsinventoryAgentPath = [[NSBundle mainBundle] pathForResource:@"ocsinventory-agent"ofType:nil]; [Task setLaunchPath:ocsinventoryAgentPath]; [Task launch]; [autoreleasepool release]; return 0; } @end UnixAgent-2.10.0/macosx/patches/000077500000000000000000000000001432320066700164205ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/patches/lib-ocsinventory-agent-backend-darwn.patch000066400000000000000000000011471432320066700265440ustar00rootroot00000000000000--- a/lib/Ocsinventory/Agent/Backend.pm +++ b/lib/Ocsinventory/Agent/Backend.pm @@ -85,8 +87,11 @@ sub initModList { } if ($config->{devlib}) { - # devlib enable, I only search for backend module in ./lib - push (@dirToScan, './lib'); + eval "use Cwd qw(abs_path);"; + eval "use File::Basename;"; + my $path = dirname( abs_path($0) ); + $logger->debug("devlib mode: Only looking in $path for backend modules."); + push (@dirToScan, $path . "/lib"); } else { # my ($inst) = ExtUtils::Installed->new(); # eval {@installed_files = UnixAgent-2.10.0/macosx/patches/ocsinventory-agent-darwin.patch000066400000000000000000000007301432320066700245610ustar00rootroot00000000000000--- ../unified_unix_agent/ocsinventory-agent 2011-05-08 19:23:10.000000000 +0200 +++ ocsinventory-agent 2011-07-29 00:15:15.000000000 +0200 @@ -18,6 +18,18 @@ #USA. # +BEGIN { + use File::Basename; + use Cwd qw(abs_path); + + my $scriptname = basename(__FILE__); + my $path = abs_path($0); + $path =~ s/$scriptname//g; + + unshift(@INC,$path."lib/"); + unshift(@INC,$path."lib//darwin-thread-multi-2level/"); +} + + use strict; use warnings; UnixAgent-2.10.0/macosx/scripts/000077500000000000000000000000001432320066700164605ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/scripts/create-darwin-perl-lib_fromCPAN.pl000077500000000000000000000131421432320066700247370ustar00rootroot00000000000000#!/usr/bin/perl -w # # COPYRIGHT: # # This software is Copyright (c) 2008 claimid.com/saxjazman9 # # (Except where explicitly superseded by other copyright notices) # # Special thanks to Jesse over a best practical for the framework # from which this script is has been created # # LICENSE: # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. # # This work 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 or visit their web page on the internet at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. # # # This is just a basic script that checks to make sure that all # the modules needed by OCS MacOSX agent before you can compile it. # # You have to install LWP in your system to use this script # # WARNING: Before executing this script please modify your ~/.cpan/CPAN/MyConfig.pm file as follows: # $> perl -MCPAN -e shell # cpan> o conf makepl_arg 'LIB=~/darwin-perl-lib PREFIX=--perl-only' # cpan> o conf commit # cpan> quit # # This will set the CPAN shell up to install the modules in this script to ~/darwin-perl-lib # it will also cause the man pages and other misc perl stuff to not be installed... we only need the modules anyway # # After this script is done, you will take the ~/darwin-perl-lib and move it to the source code directory for # compiling your application # # Once the script has completed and you are confident you have everything, you can reverse the changes to your # MyConfig.pm by: # # # $> perl -MCPAN -e shell # cpan> o conf makepl_arg '' # cpan> o conf commit # cpan> quit # # # THIS IS A BETA SCRIPT! USE AT YOUR OWN RISK # use strict; use warnings; use Getopt::Long; use CPAN; use LWP::Simple qw/getstore/; my %args; my %deps; GetOptions( \%args, 'install', ); unless (keys %args) { help(); exit(0); } # Set up defaults my %default = ( 'CORE' => 1, ); $args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default; # # Place any core modules (+ versions) that are required in the form: MOD::MOD 0.01 # $deps{'CORE'} = [ text_to_hash( << ".") ]; Test::Needs XML::SAX XML::Parser XML::Simple URI Proc::Daemon Proc::PID::File Data::UUID Switch XML::NamespaceSupport File::Listing Net::IP Compress::Zlib Compress::Raw::Zlib IO::Zlib IO::Socket::SSL Mac::SysProfile Mac::PropertyList Parse::EDID XSLoader LWP LWP::UserAgent LWP::Protocol::https XML::Entities Mac::SysProfile ExtUtils::ParseXS Scalar::Util Proc::ProcessTable . # push all the dep's into a @missing array my @missing; my @deps = @{ $deps{'CORE'} }; while (@deps) { my $module = shift @deps; my $version = shift @deps; push @missing, $module, $version; } # assuming we've passed the --install, proceed with the compiling and install to our if ( $args{'install'} ) { while( @missing ) { resolve_dep(shift @missing, shift @missing); } } # convert the dep text list to a hash sub text_to_hash { my %hash; for my $line ( split /\n/, $_[0] ) { my($key, $value) = $line =~ /(\S+)\s*(\S*)/; $value ||= ''; $hash{$key} = $value; } return %hash; } # pull in our local .cpan/CPAN/MyConfig.pm file # use the cpan shell to force install the module to our local dir # force install is used because although we may have the package already up-to-date on our system, # we want a clean fresh copy installed to our darwin-perl-lib dir. sub resolve_dep { my $module = shift; my $version = shift; local @INC = @INC; my $user = `whoami`; chomp $user; unshift @INC, "/Users/$user/Library/Application Support/.cpan"; if ( $ENV{'HOME'} ) { unshift @INC, "$ENV{'HOME'}/.cpan"; } unshift @INC, "/Users/$user/perl5"; print "\nInstall module $module\n"; my $cfg = (eval { require CPAN::MyConfig }); unless($cfg){ die('CPAN Not configured properly'); } CPAN::Shell->force('install',$module); } # the help.... sub help { print <<'.'; By default, testdeps determine whether you have installed all the perl modules OCSNG.app needs to run. --install Install missing modules . } sub install_tarball { my $cpan_url = shift; my $tarball_url = shift; my $directory = shift; my $mod_dir; my $tarball = $tarball_url; $tarball =~ s/(.*)\/(.*)\/(.*)\///; if ($directory) { $mod_dir = $directory; } else { $mod_dir = $tarball ; $mod_dir =~ s/\.tar\.gz//; } print "Getting $cpan_url/$tarball_url file\n"; my $resp = getstore("$cpan_url/$tarball_url", $tarball); die "Couldn't get $cpan_url/$tarball_url -> HTTP response: $resp." unless $resp == 200; print "Extracting $tarball file\n"; open(EXCLUDE,">exclude_hiddens"); print EXCLUDE ".*"; close EXCLUDE; system("tar -xvzf $tarball -X exclude_hiddens"); #We exclude hiddens files from extract (mainly for older Mac::Sysprofile package) unlink "exclude_hiddens"; print "Installing $mod_dir module\n"; chdir($mod_dir); system("env ARCHFLAGS='-arch i386 -arch ppc -arch x86_64' perl Makefile.PL LIB='~/darwin-perl-lib' PREFIX='--perl-only'"); #Multi architectures support system("make && make install"); chdir('..'); system("rm -Rf $mod_dir"); } 1; UnixAgent-2.10.0/macosx/scripts/uninstaller.sh000077500000000000000000000012711432320066700213600ustar00rootroot00000000000000#!/bin/bash OSVER=`uname -r` echo "OSVer is $OSVER" PID=`ps ax -e | grep OCSNG | grep -v grep | grep -v $0 | awk '{print $1}'` if [ "$PID" != "" ]; then echo "killing process: $PID" sudo kill $PID fi FILES="/Library/Receipts/OCSNG* /etc/ocsinventory-agent/ /var/lib/ocsinventory-agent/ /Applications/OCSNG.app /var/log/ocsng.log" if [ "$OSVER" == "7.9.0" ]; then FILES="$FILES /Library/StartupItems/OCSInventory" else FILES="$FILES /Library/LaunchDaemons/org.ocsng.agent.plist" echo 'Stopping and unloading service' launchctl stop org.ocsng.agent launchctl unload /Library/LaunchDaemons/org.ocsng.agent.plist fi for FILE in $FILES; do echo 'removing '.$FILE rm -f -R $FILE done UnixAgent-2.10.0/macosx/setup_plugins/000077500000000000000000000000001432320066700176725ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/.gitkeep000066400000000000000000000000001432320066700213110ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/000077500000000000000000000000001432320066700242665ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth.xcodeproj/000077500000000000000000000000001432320066700272235ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth.xcodeproj/project.pbxproj000066400000000000000000000321461432320066700323050ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 55; objects = { /* Begin PBXBuildFile section */ 002E96AA28A1546900F97B83 /* AuthInstallerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 002E96A928A1546900F97B83 /* AuthInstallerPane.m */; }; 002E96AD28A1546900F97B83 /* AuthInstallerPane.xib in Resources */ = {isa = PBXBuildFile; fileRef = 002E96AB28A1546900F97B83 /* AuthInstallerPane.xib */; }; 002E96B028A1546900F97B83 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 002E96AE28A1546900F97B83 /* Localizable.strings */; }; 002E96B228A1546900F97B83 /* InstallerSections.plist in Resources */ = {isa = PBXBuildFile; fileRef = 002E96B128A1546900F97B83 /* InstallerSections.plist */; }; 002E96B628A1546900F97B83 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 002E96B428A1546900F97B83 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 002E96A528A1546900F97B83 /* auth.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = auth.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 002E96A828A1546900F97B83 /* AuthInstallerPane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthInstallerPane.h; sourceTree = ""; }; 002E96A928A1546900F97B83 /* AuthInstallerPane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthInstallerPane.m; sourceTree = ""; }; 002E96AC28A1546900F97B83 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AuthInstallerPane.xib; sourceTree = ""; }; 002E96AF28A1546900F97B83 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 002E96B128A1546900F97B83 /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = ""; }; 002E96B328A1546900F97B83 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 002E96B528A1546900F97B83 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 002E96BD28A159AA00F97B83 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AuthInstallerPane.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 002E96A228A1546900F97B83 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 002E969C28A1546900F97B83 = { isa = PBXGroup; children = ( 002E96A728A1546900F97B83 /* auth */, 002E96A628A1546900F97B83 /* Products */, ); sourceTree = ""; }; 002E96A628A1546900F97B83 /* Products */ = { isa = PBXGroup; children = ( 002E96A528A1546900F97B83 /* auth.bundle */, ); name = Products; sourceTree = ""; }; 002E96A728A1546900F97B83 /* auth */ = { isa = PBXGroup; children = ( 002E96A828A1546900F97B83 /* AuthInstallerPane.h */, 002E96A928A1546900F97B83 /* AuthInstallerPane.m */, 002E96AB28A1546900F97B83 /* AuthInstallerPane.xib */, 002E96AE28A1546900F97B83 /* Localizable.strings */, 002E96B128A1546900F97B83 /* InstallerSections.plist */, 002E96B328A1546900F97B83 /* Info.plist */, 002E96B428A1546900F97B83 /* InfoPlist.strings */, ); path = auth; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 002E96A428A1546900F97B83 /* auth */ = { isa = PBXNativeTarget; buildConfigurationList = 002E96B928A1546900F97B83 /* Build configuration list for PBXNativeTarget "auth" */; buildPhases = ( 002E96A128A1546900F97B83 /* Sources */, 002E96A228A1546900F97B83 /* Frameworks */, 002E96A328A1546900F97B83 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = auth; productName = auth; productReference = 002E96A528A1546900F97B83 /* auth.bundle */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 002E969D28A1546900F97B83 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; LastUpgradeCheck = 1340; TargetAttributes = { 002E96A428A1546900F97B83 = { CreatedOnToolsVersion = 13.4.1; }; }; }; buildConfigurationList = 002E96A028A1546900F97B83 /* Build configuration list for PBXProject "auth" */; compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 002E969C28A1546900F97B83; productRefGroup = 002E96A628A1546900F97B83 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 002E96A428A1546900F97B83 /* auth */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 002E96A328A1546900F97B83 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 002E96AD28A1546900F97B83 /* AuthInstallerPane.xib in Resources */, 002E96B628A1546900F97B83 /* InfoPlist.strings in Resources */, 002E96B028A1546900F97B83 /* Localizable.strings in Resources */, 002E96B228A1546900F97B83 /* InstallerSections.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 002E96A128A1546900F97B83 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 002E96AA28A1546900F97B83 /* AuthInstallerPane.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 002E96AB28A1546900F97B83 /* AuthInstallerPane.xib */ = { isa = PBXVariantGroup; children = ( 002E96AC28A1546900F97B83 /* Base */, 002E96BD28A159AA00F97B83 /* en */, ); name = AuthInstallerPane.xib; sourceTree = ""; }; 002E96AE28A1546900F97B83 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 002E96AF28A1546900F97B83 /* en */, ); name = Localizable.strings; sourceTree = ""; }; 002E96B428A1546900F97B83 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 002E96B528A1546900F97B83 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 002E96B728A1546900F97B83 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 002E96B828A1546900F97B83 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; }; name = Release; }; 002E96BA28A1546900F97B83 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 325U55CH79; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = auth/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainNibFile = AuthInstallerPane; INFOPLIST_KEY_NSPrincipalClass = InstallerSection; INSTALL_PATH = "$(HOME)/Library/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.15; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.auth; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_EMIT_LOC_STRINGS = YES; WRAPPER_EXTENSION = bundle; }; name = Debug; }; 002E96BB28A1546900F97B83 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 325U55CH79; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = auth/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainNibFile = AuthInstallerPane; INFOPLIST_KEY_NSPrincipalClass = InstallerSection; INSTALL_PATH = "$(HOME)/Library/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.15; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.auth; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; WRAPPER_EXTENSION = bundle; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 002E96A028A1546900F97B83 /* Build configuration list for PBXProject "auth" */ = { isa = XCConfigurationList; buildConfigurations = ( 002E96B728A1546900F97B83 /* Debug */, 002E96B828A1546900F97B83 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 002E96B928A1546900F97B83 /* Build configuration list for PBXNativeTarget "auth" */ = { isa = XCConfigurationList; buildConfigurations = ( 002E96BA28A1546900F97B83 /* Debug */, 002E96BB28A1546900F97B83 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 002E969D28A1546900F97B83 /* Project object */; } UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/000077500000000000000000000000001432320066700252275ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/AuthInstallerPane.h000066400000000000000000000005471432320066700307710ustar00rootroot00000000000000// // AutInstallerPane.h // auth // // Created by Factorfx Factorfx on 08/08/2022. // #import @interface AuthInstallerPane : InstallerPane { IBOutlet NSTextField *authUser; IBOutlet NSTextField *authPwd; IBOutlet NSTextField *authRealm; NSFileManager *filemgr; NSString *tmpCfgFilePath; } @end UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/AuthInstallerPane.m000066400000000000000000000046451432320066700310010ustar00rootroot00000000000000// // AuthInstallerPane.m // auth // // Created by Factorfx Factorfx on 08/08/2022. // #import "AuthInstallerPane.h" @implementation AuthInstallerPane - (NSString *)title { return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil]; } - (void)didEnterPane:(InstallerSectionDirection)dir { filemgr = [ NSFileManager defaultManager]; tmpCfgFilePath = @"/tmp/ocs_installer/ocsinventory-agent.cfg"; // if there is no cfg file in the tmp dir, user does not want to overwrite current config = skip auth if (![filemgr fileExistsAtPath:@"/tmp/ocs_installer/ocsinventory-agent.cfg"]) { [self gotoNextPane]; } } - (BOOL)shouldExitPane:(InstallerSectionDirection)Direction { NSString *authConfig = @""; // check the direction of movement if (Direction == InstallerDirectionForward) { NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:tmpCfgFilePath append:YES]; [stream open]; if ( [[authUser stringValue] length] > 0) { authConfig = [authConfig stringByAppendingString:@"user="]; NSData *user = [[authUser stringValue] dataUsingEncoding:NSUTF8StringEncoding]; NSString *userEncoded = [user base64EncodedStringWithOptions:kNilOptions]; authConfig = [authConfig stringByAppendingString:userEncoded]; authConfig = [authConfig stringByAppendingString:@"\n"]; } if ( [[authPwd stringValue] length] > 0) { authConfig = [authConfig stringByAppendingString:@"password="]; NSData *pwd = [[authPwd stringValue] dataUsingEncoding:NSUTF8StringEncoding]; NSString *pwdEncoded = [pwd base64EncodedStringWithOptions:kNilOptions]; authConfig = [authConfig stringByAppendingString:pwdEncoded]; authConfig = [authConfig stringByAppendingString:@"\n"]; } if ( [[authRealm stringValue] length] > 0) { authConfig = [authConfig stringByAppendingString:@"realm="]; authConfig = [authConfig stringByAppendingString:[authRealm objectValue]]; authConfig = [authConfig stringByAppendingString:@"\n"]; } NSData *strData = [authConfig dataUsingEncoding:NSUTF8StringEncoding]; [stream write:(uint8_t *)[strData bytes] maxLength:[strData length]]; [stream close]; } return (YES); } @end UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/Base.lproj/000077500000000000000000000000001432320066700272265ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/Base.lproj/AuthInstallerPane.xib000066400000000000000000000171621432320066700333240ustar00rootroot00000000000000 UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/Info.plist000066400000000000000000000017731432320066700272070ustar00rootroot00000000000000 CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 InstallerSectionTitle auth NSHumanReadableCopyright Copyright © 2020 OCS Inventory. All rights reserved. NSMainNibFile AuthInstallerPane NSPrincipalClass InstallerSection UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/InstallerSections.plist000066400000000000000000000007611432320066700317550ustar00rootroot00000000000000 SectionOrder Introduction ReadMe License auth.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/en.lproj/000077500000000000000000000000001432320066700267565ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/en.lproj/AuthInstallerPane.strings000066400000000000000000000005301432320066700337520ustar00rootroot00000000000000 /* Class = "NSTextFieldCell"; title = "Password : "; ObjectID = "A3p-tZ-dYM"; */ "A3p-tZ-dYM.title" = "Password : "; /* Class = "NSTextFieldCell"; title = "Username :"; ObjectID = "Mro-sY-ZAf"; */ "Mro-sY-ZAf.title" = "Username :"; /* Class = "NSTextFieldCell"; title = "Realm :"; ObjectID = "m6M-ck-BMP"; */ "m6M-ck-BMP.title" = "Realm :"; UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/en.lproj/InfoPlist.strings000066400000000000000000000000641432320066700323000ustar00rootroot00000000000000InstallerSectionTitle = "Authentication settings"; UnixAgent-2.10.0/macosx/setup_plugins/auth_plugin_installer/auth/en.lproj/Localizable.strings000066400000000000000000000001321432320066700326060ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ "PaneTitle" = "OCS Inventory Agent Config"; UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/000077500000000000000000000000001432320066700245725ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config.xcodeproj/000077500000000000000000000000001432320066700300335ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config.xcodeproj/project.pbxproj000066400000000000000000000307351432320066700331170ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 43E4B07623E70E4F00E03641 /* ConfigInstallerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 43E4B07523E70E4F00E03641 /* ConfigInstallerPane.m */; }; 43E4B07923E70E4F00E03641 /* ConfigInstallerPane.xib in Resources */ = {isa = PBXBuildFile; fileRef = 43E4B07723E70E4F00E03641 /* ConfigInstallerPane.xib */; }; 43E4B07C23E70E4F00E03641 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43E4B07A23E70E4F00E03641 /* Localizable.strings */; }; 43E4B07E23E70E4F00E03641 /* InstallerSections.plist in Resources */ = {isa = PBXBuildFile; fileRef = 43E4B07D23E70E4F00E03641 /* InstallerSections.plist */; }; 43E4B08223E70E4F00E03641 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43E4B08023E70E4F00E03641 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 43E4B07123E70E4F00E03641 /* config.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = config.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 43E4B07423E70E4F00E03641 /* ConfigInstallerPane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConfigInstallerPane.h; sourceTree = ""; }; 43E4B07523E70E4F00E03641 /* ConfigInstallerPane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ConfigInstallerPane.m; sourceTree = ""; }; 43E4B07823E70E4F00E03641 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ConfigInstallerPane.xib; sourceTree = ""; }; 43E4B07B23E70E4F00E03641 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 43E4B07D23E70E4F00E03641 /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = ""; }; 43E4B07F23E70E4F00E03641 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43E4B08123E70E4F00E03641 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 43E4B08D23E7187F00E03641 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ConfigInstallerPane.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 43E4B06E23E70E4E00E03641 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 43E4B06823E70E4E00E03641 = { isa = PBXGroup; children = ( 43E4B07323E70E4F00E03641 /* config */, 43E4B07223E70E4F00E03641 /* Products */, ); sourceTree = ""; }; 43E4B07223E70E4F00E03641 /* Products */ = { isa = PBXGroup; children = ( 43E4B07123E70E4F00E03641 /* config.bundle */, ); name = Products; sourceTree = ""; }; 43E4B07323E70E4F00E03641 /* config */ = { isa = PBXGroup; children = ( 43E4B07423E70E4F00E03641 /* ConfigInstallerPane.h */, 43E4B07523E70E4F00E03641 /* ConfigInstallerPane.m */, 43E4B07723E70E4F00E03641 /* ConfigInstallerPane.xib */, 43E4B07A23E70E4F00E03641 /* Localizable.strings */, 43E4B07D23E70E4F00E03641 /* InstallerSections.plist */, 43E4B07F23E70E4F00E03641 /* Info.plist */, 43E4B08023E70E4F00E03641 /* InfoPlist.strings */, ); path = config; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 43E4B07023E70E4E00E03641 /* config */ = { isa = PBXNativeTarget; buildConfigurationList = 43E4B08523E70E4F00E03641 /* Build configuration list for PBXNativeTarget "config" */; buildPhases = ( 43E4B06D23E70E4E00E03641 /* Sources */, 43E4B06E23E70E4E00E03641 /* Frameworks */, 43E4B06F23E70E4E00E03641 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = config; productName = config; productReference = 43E4B07123E70E4F00E03641 /* config.bundle */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 43E4B06923E70E4E00E03641 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Gilles Dubois"; TargetAttributes = { 43E4B07023E70E4E00E03641 = { CreatedOnToolsVersion = 11.3.1; }; }; }; buildConfigurationList = 43E4B06C23E70E4E00E03641 /* Build configuration list for PBXProject "config" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 43E4B06823E70E4E00E03641; productRefGroup = 43E4B07223E70E4F00E03641 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 43E4B07023E70E4E00E03641 /* config */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 43E4B06F23E70E4E00E03641 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 43E4B07923E70E4F00E03641 /* ConfigInstallerPane.xib in Resources */, 43E4B08223E70E4F00E03641 /* InfoPlist.strings in Resources */, 43E4B07C23E70E4F00E03641 /* Localizable.strings in Resources */, 43E4B07E23E70E4F00E03641 /* InstallerSections.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 43E4B06D23E70E4E00E03641 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 43E4B07623E70E4F00E03641 /* ConfigInstallerPane.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 43E4B07723E70E4F00E03641 /* ConfigInstallerPane.xib */ = { isa = PBXVariantGroup; children = ( 43E4B07823E70E4F00E03641 /* Base */, 43E4B08D23E7187F00E03641 /* en */, ); name = ConfigInstallerPane.xib; sourceTree = ""; }; 43E4B07A23E70E4F00E03641 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 43E4B07B23E70E4F00E03641 /* en */, ); name = Localizable.strings; sourceTree = ""; }; 43E4B08023E70E4F00E03641 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 43E4B08123E70E4F00E03641 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 43E4B08323E70E4F00E03641 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 43E4B08423E70E4F00E03641 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; }; name = Release; }; 43E4B08623E70E4F00E03641 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 325U55CH79; INFOPLIST_FILE = config/Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.config; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; name = Debug; }; 43E4B08723E70E4F00E03641 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 325U55CH79; INFOPLIST_FILE = config/Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.config; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 43E4B06C23E70E4E00E03641 /* Build configuration list for PBXProject "config" */ = { isa = XCConfigurationList; buildConfigurations = ( 43E4B08323E70E4F00E03641 /* Debug */, 43E4B08423E70E4F00E03641 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 43E4B08523E70E4F00E03641 /* Build configuration list for PBXNativeTarget "config" */ = { isa = XCConfigurationList; buildConfigurations = ( 43E4B08623E70E4F00E03641 /* Debug */, 43E4B08723E70E4F00E03641 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 43E4B06923E70E4E00E03641 /* Project object */; } UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/000077500000000000000000000000001432320066700260375ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/Base.lproj/000077500000000000000000000000001432320066700300365ustar00rootroot00000000000000ConfigInstallerPane.xib000066400000000000000000000463001432320066700343550ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/Base.lproj

UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/ConfigInstallerPane.h000066400000000000000000000013161432320066700321000ustar00rootroot00000000000000// // MyInstallerPane.h // config // // Created by Gilles Dubois on 02/02/2020. // Copyright © 2020 Gilles Dubois. All rights reserved. // #import @interface ConfigInstallerPane : InstallerPane { IBOutlet NSTextField *server; IBOutlet NSTextField *tag; IBOutlet NSTextField *logfile; IBOutlet NSTextField *cacertfile; IBOutlet NSButton *debugmode; IBOutlet NSButton *lazymode; IBOutlet NSButton *download; IBOutlet NSButton *ssl; IBOutlet NSPopUpButton *protocolist; NSFileManager *filemgr; NSString *tmpCfgFilePath; NSString *tmpModulesFilePath; NSString *tmpServerdirFilePath; NSString *tmpCacertFilePath; } @end UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/ConfigInstallerPane.m000066400000000000000000000246021432320066700321100ustar00rootroot00000000000000// // MyInstallerPane.m // config // // Created by Gilles Dubois on 02/02/2020. // Copyright © 2020 Gilles Dubois. All rights reserved. // #import "ConfigInstallerPane.h" @implementation ConfigInstallerPane - (NSString *)title { return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil]; } - (NSArray *) protocols { return [NSArray arrayWithObjects:@"http", @"https", nil]; } - (void)didEnterPane:(InstallerSectionDirection)dir { NSAlert *cfgFileExistsWrn; NSString *tmpPath = @"/tmp/ocs_installer"; filemgr = [ NSFileManager defaultManager]; tmpCfgFilePath = @"/tmp/ocs_installer/ocsinventory-agent.cfg"; tmpModulesFilePath = @"/tmp/ocs_installer/modules.conf"; tmpServerdirFilePath = @"/tmp/ocs_installer/serverdir"; tmpCacertFilePath = @"/tmp/ocs_installer/cacert.pem"; //Checking if temp directory exists if ([filemgr fileExistsAtPath:tmpPath]) { [filemgr removeItemAtPath:tmpCfgFilePath error:nil]; [filemgr removeItemAtPath:tmpModulesFilePath error:nil]; [filemgr removeItemAtPath:tmpServerdirFilePath error:nil]; [filemgr removeItemAtPath:tmpCacertFilePath error:nil]; } else { [filemgr createDirectoryAtPath:tmpPath withIntermediateDirectories:true attributes:nil error:nil]; } if ([filemgr fileExistsAtPath:@"/etc/ocsinventory-agent/ocsinventory-agent.cfg"]) { //We display a warning dialog cfgFileExistsWrn = [[NSAlert alloc] init]; [cfgFileExistsWrn setMessageText:NSLocalizedStringFromTableInBundle(@"Already_conf_warn",nil,[NSBundle bundleForClass:[self class]], @"Warning about already existing cofiguration file")]; [cfgFileExistsWrn setInformativeText:NSLocalizedStringFromTableInBundle(@"Already_conf_warn_comment",nil,[NSBundle bundleForClass:[self class]], @"Warning about already existing configuration file comment")]; [cfgFileExistsWrn addButtonWithTitle:NSLocalizedStringFromTableInBundle(@"Yes",nil,[NSBundle bundleForClass:[self class]], @"Yes button")]; [cfgFileExistsWrn addButtonWithTitle:NSLocalizedStringFromTableInBundle(@"No",nil,[NSBundle bundleForClass:[self class]], @"No button")]; [cfgFileExistsWrn setAlertStyle:NSAlertStyleInformational]; if ([cfgFileExistsWrn runModal] != NSAlertFirstButtonReturn) { // No button was clicked, we don't display config pane [self gotoNextPane]; } } // fill defaults values [server setStringValue:@"ocsinventory-ng"]; [logfile setStringValue:@"/var/log/ocsng.log"]; [debugmode setState:0]; [lazymode setState:0]; [download setState:1]; [ssl setState:1]; //Defaults for protocol droping list [protocolist removeAllItems]; [protocolist addItemWithTitle: @"http://"]; [protocolist addItemWithTitle: @"https://"]; [protocolist selectItemWithTitle: @"https://"]; } - (IBAction)chooseCacertFile:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; NSArray* fileTypes = [[NSArray alloc] initWithObjects:@"pem",@"PEM",@"crt",@"CRT",nil]; //Configuration for the browse panel [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setAllowsMultipleSelection:NO]; [panel setAllowedFileTypes:fileTypes]; // Get panel return value NSInteger clicked = [panel runModal]; // If OK clicked only if (clicked == NSModalResponseOK) { for (NSURL *url in [panel URLs]) { // do something with the url here. NSString *path = url.path; [cacertfile setStringValue:path]; } } } - (IBAction) chooseProtocol:(id)sender { NSString *protocol = [protocolist titleOfSelectedItem]; //We show the selected protocol [protocolist setTitle:protocol]; } - (BOOL)shouldExitPane:(InstallerSectionDirection)Direction { NSMutableString *ocsAgentCfgContent; NSMutableString *modulesCfgContent; NSString *serverDir; NSMutableString *protocolName; NSAlert *srvConfigWrn; NSAlert *caCertWrn; NSString *protocol = [protocolist titleOfSelectedItem]; // check the direction of movement if (Direction == InstallerDirectionForward) { if ( [[server stringValue] length] > 0) { ocsAgentCfgContent = [@"server=" mutableCopy]; //Adding server value to the mutable string [ocsAgentCfgContent appendString:protocol]; [ocsAgentCfgContent appendString:[server objectValue]]; [ocsAgentCfgContent appendString:@"/ocsinventory"]; [ocsAgentCfgContent appendString:@"\n"]; //if tag filled if ( [[tag stringValue] length] > 0) { [ocsAgentCfgContent appendString:@"tag="]; [ocsAgentCfgContent appendString:[tag objectValue]]; [ocsAgentCfgContent appendString:@"\n"]; } //if logfile filled if ( [[logfile stringValue] length] > 0) { [ocsAgentCfgContent appendString:@"logfile="]; [ocsAgentCfgContent appendString:[logfile objectValue]]; [ocsAgentCfgContent appendString:@"\n"]; } //if debugmode checked if ([debugmode state] == 1) { [ocsAgentCfgContent appendString:@"debug=1\n"]; } else { [ocsAgentCfgContent appendString:@"debug=0\n"]; } //if lazymode checked if ([lazymode state] == 1) { [ocsAgentCfgContent appendString:@"lazy=1\n"]; } else { [ocsAgentCfgContent appendString:@"lazy=0\n"]; } //if ssl checked if ([ssl state] == 1) { [ocsAgentCfgContent appendString:@"ssl=1\n"]; } else { [ocsAgentCfgContent appendString:@"ssl=0\n"]; } //Writing to ocsinventory agent configuration file [ocsAgentCfgContent writeToFile:tmpCfgFilePath atomically: YES encoding:NSUTF8StringEncoding error:NULL]; modulesCfgContent = [@"# this list of module will be load by the at run time\n" @"# to check its syntax do:\n" @"# #perl modules.conf\n" @"# You must have NO error. Else the content will be ignored\n" @"# This mechanism goal it to keep compatibility with 'plugin'\n" @"# created for the previous linux_agent.\n" @"# The new unified_agent have its own extension system that allow\n" @"# user to add new information easily.\n" @"\n" @"#use Ocsinventory::Agent::Modules::Example;\n" mutableCopy]; //if download checked if ( [download state] == 1) { [modulesCfgContent appendString:@"use Ocsinventory::Agent::Modules::Download;\n" @"\n" @"# DO NOT REMOVE THE 1;\n" @"1;" ]; } else { [modulesCfgContent appendString:@"#use Ocsinventory::Agent::Modules::Download;\n" @"\n" @"# DO NOT REMOVE THE 1;\n" @"1;" ]; } //Writing to modules configuration file [modulesCfgContent writeToFile:tmpModulesFilePath atomically: YES encoding:NSUTF8StringEncoding error:NULL]; //We have to copy cacert.pem if is asked by user if ( [[cacertfile stringValue] length] > 0) { protocolName = [protocol mutableCopy]; [protocolName replaceOccurrencesOfString:@"/" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [protocolName length])]; serverDir = [NSString stringWithFormat:@"/var/lib/ocsinventory-agent/%@__%@_ocsinventory", protocolName, [server objectValue]]; [serverDir writeToFile:tmpServerdirFilePath atomically: YES encoding:NSUTF8StringEncoding error:NULL]; [filemgr copyItemAtPath:[cacertfile objectValue] toPath:tmpCacertFilePath error:nil]; } if ( [download state] == 1 && [ssl state] == 1 && [[cacertfile stringValue] length] == 0 ) { //We display a warning dialog caCertWrn = [[NSAlert alloc] init]; [caCertWrn addButtonWithTitle:@"OK"]; [caCertWrn setMessageText:NSLocalizedStringFromTableInBundle(@"Missing_cert_warn",nil,[NSBundle bundleForClass:[self class]], @"Warning about missing certificate file")]; [caCertWrn setInformativeText:NSLocalizedStringFromTableInBundle(@"Missing_cert_warn_comment",nil,[NSBundle bundleForClass:[self class]], @"Warning about missing certificate file comment")]; [caCertWrn setAlertStyle:NSAlertStyleInformational]; [caCertWrn runModal]; // display the warning dialog } } else { //We display a warning dialog srvConfigWrn = [[NSAlert alloc] init]; [srvConfigWrn addButtonWithTitle:@"OK"]; [srvConfigWrn setMessageText:NSLocalizedStringFromTableInBundle(@"Invalid_srv_addr",nil,[NSBundle bundleForClass:[self class]], @"Warning about invalid server address")]; [srvConfigWrn setInformativeText:NSLocalizedStringFromTableInBundle(@"Invalid_srv_addr_comment",nil,[NSBundle bundleForClass:[self class]], @"Warning about invalid server address comment")]; [srvConfigWrn setAlertStyle:NSAlertStyleInformational]; [srvConfigWrn runModal]; [self gotoPreviousPane]; } } return (YES); } @end UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/Info.plist000066400000000000000000000017771432320066700300230ustar00rootroot00000000000000 CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 InstallerSectionTitle config NSHumanReadableCopyright Copyright © 2020 OCS Inventory. All rights reserved. NSMainNibFile ConfigInstallerPane NSPrincipalClass InstallerSection UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/InstallerSections.plist000066400000000000000000000007631432320066700325670ustar00rootroot00000000000000 SectionOrder Introduction ReadMe License config.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/en.lproj/000077500000000000000000000000001432320066700275665ustar00rootroot00000000000000ConfigInstallerPane.strings000066400000000000000000000027451432320066700350210ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/en.lproj /* Class = "NSButtonCell"; title = "SSL check"; ObjectID = "0JY-Jz-90N"; */ "0JY-Jz-90N.title" = "SSL check"; /* Class = "NSTextFieldCell"; title = "ocsinventory-ng"; ObjectID = "0Sw-Bb-gYo"; */ "0Sw-Bb-gYo.title" = "ocsinventory-ng"; /* Class = "NSButtonCell"; title = "Debug mode"; ObjectID = "31X-X1-h1b"; */ "31X-X1-h1b.title" = "Debug mode"; /* Class = "NSMenuItem"; title = "http://"; ObjectID = "3w5-Xc-SgN"; */ "3w5-Xc-SgN.title" = "http://"; /* Class = "NSTextFieldCell"; title = "Log File path :"; ObjectID = "Bqz-yE-1gz"; */ "Bqz-yE-1gz.title" = "Log File path :"; /* Class = "NSTextFieldCell"; title = "TAG Value (optional) :"; ObjectID = "CJY-Du-ySH"; */ "CJY-Du-ySH.title" = "TAG Value (optional) :"; /* Class = "NSTextFieldCell"; title = "/ocsinventory"; ObjectID = "DIf-zY-Upa"; */ "DIf-zY-Upa.title" = "/ocsinventory"; /* Class = "NSButtonCell"; title = "Deployment feature"; ObjectID = "Fz6-ny-C1b"; */ "Fz6-ny-C1b.title" = "Deployment feature"; /* Class = "NSButtonCell"; title = "Browse"; ObjectID = "MAB-ch-ni8"; */ "MAB-ch-ni8.title" = "Browse"; /* Class = "NSTextFieldCell"; title = "Certificate File (needed by 'Deployment feature')"; ObjectID = "UvL-Ff-Y6G"; */ "UvL-Ff-Y6G.title" = "Certificate File (needed by 'Deployment feature')"; /* Class = "NSButtonCell"; title = "Lazy mode"; ObjectID = "gFK-QK-e24"; */ "gFK-QK-e24.title" = "Lazy mode"; /* Class = "NSTextFieldCell"; title = "OCS Server URL"; ObjectID = "w48-wL-2Wx"; */ "w48-wL-2Wx.title" = "OCS Server URL";∂ UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/en.lproj/InfoPlist.strings000066400000000000000000000000601432320066700331040ustar00rootroot00000000000000InstallerSectionTitle = "Agent configuration"; UnixAgent-2.10.0/macosx/setup_plugins/config_plugin_installer/config/en.lproj/Localizable.strings000066400000000000000000000020271432320066700334230ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ "PaneTitle" = "OCSInventory Agent Config"; //Yes button "Yes" = "Yes"; //No button "No" = "No"; //Warning about already existing cofiguration file "Already_conf_warn" = "OCS agent configuration file seems to already exists. Do you want to launch OCS Inventory NG agent configuration?"; //Warning about already existing cofiguration file comment "Already_conf_warn_comment" = "The previous /etc/ocsinventory-agent/ocsinventory-agent.cfg file will be erased"; //Warning about missing certificate file "Missing_cert_warn" = "You have enabled Download feature and SSL certicate check but you don't specify a certificate file"; //Warning about missing certificate file comment "Missing_cert_warn_comment" = "If you don't specifiy a certificate file, Download feature won't work"; //Warning about invalid server address "Invalid_srv_addr" = "Invalid OCS server address"; //Warning about invalid server address comment "Invalid_srv_addr_comment" = "Please check and re-enter your OCS server address"; UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/000077500000000000000000000000001432320066700254275ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig.xcodeproj/000077500000000000000000000000001432320066700320545ustar00rootroot00000000000000project.pbxproj000066400000000000000000000310341432320066700350520ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 4315F1EA23E730CD0047BEE1 /* DaemonConfigPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 4315F1E923E730CD0047BEE1 /* DaemonConfigPane.m */; }; 4315F1ED23E730CD0047BEE1 /* DaemonConfigPane.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4315F1EB23E730CD0047BEE1 /* DaemonConfigPane.xib */; }; 4315F1F023E730CD0047BEE1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4315F1EE23E730CD0047BEE1 /* Localizable.strings */; }; 4315F1F223E730CD0047BEE1 /* InstallerSections.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4315F1F123E730CD0047BEE1 /* InstallerSections.plist */; }; 4315F1F623E730CD0047BEE1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4315F1F423E730CD0047BEE1 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 4315F1E523E730CD0047BEE1 /* daemonconfig.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = daemonconfig.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 4315F1E823E730CD0047BEE1 /* DaemonConfigPane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DaemonConfigPane.h; sourceTree = ""; }; 4315F1E923E730CD0047BEE1 /* DaemonConfigPane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DaemonConfigPane.m; sourceTree = ""; }; 4315F1EC23E730CD0047BEE1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/DaemonConfigPane.xib; sourceTree = ""; }; 4315F1EF23E730CD0047BEE1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 4315F1F123E730CD0047BEE1 /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = ""; }; 4315F1F323E730CD0047BEE1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4315F1F523E730CD0047BEE1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 4315F1FD23E732200047BEE1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/DaemonConfigPane.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 4315F1E223E730CD0047BEE1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4315F1DC23E730CD0047BEE1 = { isa = PBXGroup; children = ( 4315F1E723E730CD0047BEE1 /* daemonconfig */, 4315F1E623E730CD0047BEE1 /* Products */, ); sourceTree = ""; }; 4315F1E623E730CD0047BEE1 /* Products */ = { isa = PBXGroup; children = ( 4315F1E523E730CD0047BEE1 /* daemonconfig.bundle */, ); name = Products; sourceTree = ""; }; 4315F1E723E730CD0047BEE1 /* daemonconfig */ = { isa = PBXGroup; children = ( 4315F1E823E730CD0047BEE1 /* DaemonConfigPane.h */, 4315F1E923E730CD0047BEE1 /* DaemonConfigPane.m */, 4315F1EB23E730CD0047BEE1 /* DaemonConfigPane.xib */, 4315F1EE23E730CD0047BEE1 /* Localizable.strings */, 4315F1F123E730CD0047BEE1 /* InstallerSections.plist */, 4315F1F323E730CD0047BEE1 /* Info.plist */, 4315F1F423E730CD0047BEE1 /* InfoPlist.strings */, ); path = daemonconfig; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 4315F1E423E730CD0047BEE1 /* daemonconfig */ = { isa = PBXNativeTarget; buildConfigurationList = 4315F1F923E730CD0047BEE1 /* Build configuration list for PBXNativeTarget "daemonconfig" */; buildPhases = ( 4315F1E123E730CD0047BEE1 /* Sources */, 4315F1E223E730CD0047BEE1 /* Frameworks */, 4315F1E323E730CD0047BEE1 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = daemonconfig; productName = daemonconfig; productReference = 4315F1E523E730CD0047BEE1 /* daemonconfig.bundle */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 4315F1DD23E730CD0047BEE1 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Gilles Dubois"; TargetAttributes = { 4315F1E423E730CD0047BEE1 = { CreatedOnToolsVersion = 11.3.1; }; }; }; buildConfigurationList = 4315F1E023E730CD0047BEE1 /* Build configuration list for PBXProject "daemonconfig" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 4315F1DC23E730CD0047BEE1; productRefGroup = 4315F1E623E730CD0047BEE1 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 4315F1E423E730CD0047BEE1 /* daemonconfig */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 4315F1E323E730CD0047BEE1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 4315F1ED23E730CD0047BEE1 /* DaemonConfigPane.xib in Resources */, 4315F1F623E730CD0047BEE1 /* InfoPlist.strings in Resources */, 4315F1F023E730CD0047BEE1 /* Localizable.strings in Resources */, 4315F1F223E730CD0047BEE1 /* InstallerSections.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 4315F1E123E730CD0047BEE1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4315F1EA23E730CD0047BEE1 /* DaemonConfigPane.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 4315F1EB23E730CD0047BEE1 /* DaemonConfigPane.xib */ = { isa = PBXVariantGroup; children = ( 4315F1EC23E730CD0047BEE1 /* Base */, 4315F1FD23E732200047BEE1 /* en */, ); name = DaemonConfigPane.xib; sourceTree = ""; }; 4315F1EE23E730CD0047BEE1 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 4315F1EF23E730CD0047BEE1 /* en */, ); name = Localizable.strings; sourceTree = ""; }; 4315F1F423E730CD0047BEE1 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 4315F1F523E730CD0047BEE1 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 4315F1F723E730CD0047BEE1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 4315F1F823E730CD0047BEE1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; }; name = Release; }; 4315F1FA23E730CD0047BEE1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 325U55CH79; INFOPLIST_FILE = daemonconfig/Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.daemonconfig; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; name = Debug; }; 4315F1FB23E730CD0047BEE1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 325U55CH79; INFOPLIST_FILE = daemonconfig/Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = org.ocsinventory.agent.daemonconfig; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4315F1E023E730CD0047BEE1 /* Build configuration list for PBXProject "daemonconfig" */ = { isa = XCConfigurationList; buildConfigurations = ( 4315F1F723E730CD0047BEE1 /* Debug */, 4315F1F823E730CD0047BEE1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4315F1F923E730CD0047BEE1 /* Build configuration list for PBXNativeTarget "daemonconfig" */ = { isa = XCConfigurationList; buildConfigurations = ( 4315F1FA23E730CD0047BEE1 /* Debug */, 4315F1FB23E730CD0047BEE1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 4315F1DD23E730CD0047BEE1 /* Project object */; } UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/000077500000000000000000000000001432320066700300605ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/Base.lproj/000077500000000000000000000000001432320066700320575ustar00rootroot00000000000000DaemonConfigPane.xib000066400000000000000000000160731432320066700356500ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/Base.lproj UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/DaemonConfigPane.h000066400000000000000000000007101432320066700333640ustar00rootroot00000000000000// // MyInstallerPane.h // daemonconfig // // Created by OCSInventory on 02/02/2020. // Copyright © 2020 OCSInventory. All rights reserved. // #import @interface DaemonConfigPane : InstallerPane { IBOutlet NSTextField *periodicity; IBOutlet NSButton *now; IBOutlet NSButton *startup; NSFileManager *filemgr; NSString *tmpLaunchdFilePath; NSString *tmpNowFilePath; } @end UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/DaemonConfigPane.m000066400000000000000000000102641432320066700333760ustar00rootroot00000000000000// // MyInstallerPane.m // daemonconfig // // Created by OCSInventory on 02/02/2020. // Copyright © 2020 OCSInventory. All rights reserved. // #import "DaemonConfigPane.h" @implementation DaemonConfigPane - (NSString *)title { return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil]; } - (void)didEnterPane:(InstallerSectionDirection)dir { NSString *tmpPath = @"/tmp/ocs_installer"; filemgr = [ NSFileManager defaultManager]; tmpLaunchdFilePath =@"/tmp/ocs_installer/org.ocsng.agent.plist"; tmpNowFilePath = @"/tmp/ocs_installer/now"; //Checking if temp directory exists if ([filemgr fileExistsAtPath:tmpPath]) { [filemgr removeItemAtPath:tmpLaunchdFilePath error:nil]; [filemgr removeItemAtPath:tmpNowFilePath error:nil]; } else { [filemgr createDirectoryAtPath:tmpPath withIntermediateDirectories:true attributes:nil error:nil]; } // fill defaults values [periodicity setStringValue:@"5"]; [startup setState:1]; [now setState:1]; } - (BOOL)shouldExitPane:(InstallerSectionDirection)Direction { NSMutableString *launchdCfgFile; NSAlert *periodicityValueWrn; //Creating org.ocsng.agent.plist file for launchd //TODO: use XML parser instead of writing the XML as a simple text file ? launchdCfgFile = [@"\n" @"\n" @"\n" @"\n" @"\tLabel\n" @"\torg.ocsng.agent\n" @"\tProgramArguments\n" @"\t\t\n" @"\t\t\t/Applications/OCSNG.app/Contents/MacOS/OCSNG\n" @"\t\t\n" mutableCopy]; if ([startup state] == 1) { [launchdCfgFile appendString:@"\tRunAtLoad\n" @"\t\n" ]; } if ( [[periodicity stringValue] length] > 0) { //We convert string to numeric value and check if it is integer NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; NSNumber *convert = [formatter numberFromString:[periodicity stringValue]]; if (convert) { int hours = [convert intValue]; int seconds = hours * 3600; [launchdCfgFile appendString:@"\tStartInterval\n" @"\t" ]; [launchdCfgFile appendString:[NSString stringWithFormat:@"%d", seconds]]; [launchdCfgFile appendString:@"\n"]; } else { //We display a warn message and we go back to pane periodicityValueWrn = [[NSAlert alloc] init]; [periodicityValueWrn addButtonWithTitle:NSLocalizedString(@"OK", @"OK")]; [periodicityValueWrn setMessageText:NSLocalizedStringFromTableInBundle(@"Periodicity_warn",nil,[NSBundle bundleForClass:[self class]], @"Peridocity warn")]; [periodicityValueWrn setInformativeText:NSLocalizedStringFromTableInBundle(@"Periodicity_warn_comment",nil,[NSBundle bundleForClass:[self class]], @"Periodicity warn comment")]; [periodicityValueWrn setAlertStyle:NSAlertStyleInformational]; [periodicityValueWrn runModal]; [self gotoPreviousPane]; } } [launchdCfgFile appendString:@"\n" @"" ]; //Writing org.ocsng.agent.plist file [launchdCfgFile writeToFile:tmpLaunchdFilePath atomically: YES encoding:NSUTF8StringEncoding error:NULL]; //Check if we launch agent after install if ([now state] == 1) { [filemgr createFileAtPath:tmpNowFilePath contents:nil attributes:nil]; } return (YES); } @end UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/Info.plist000066400000000000000000000020021432320066700320220ustar00rootroot00000000000000 CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 InstallerSectionTitle daemonconfig NSHumanReadableCopyright Copyright © 2020 OCS Inventory. All rights reserved. NSMainNibFile DaemonConfigPane NSPrincipalClass InstallerSection InstallerSections.plist000066400000000000000000000007711432320066700345300ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig SectionOrder Introduction ReadMe License daemonconfig.bundle Target PackageSelection Install UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/en.lproj/000077500000000000000000000000001432320066700316075ustar00rootroot00000000000000DaemonConfigPane.strings000066400000000000000000000012141432320066700362760ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/en.lproj /* Class = "NSTextFieldCell"; title = "Launch OCS agent every"; ObjectID = "CR7-Av-TyG"; */ "CR7-Av-TyG.title" = "Launch OCS agent every"; /* Class = "NSTextFieldCell"; title = "5"; ObjectID = "Kd5-vS-SZ8"; */ "Kd5-vS-SZ8.title" = "5"; /* Class = "NSTextFieldCell"; title = "hour(s)"; ObjectID = "L5X-oH-TrN"; */ "L5X-oH-TrN.title" = "hour(s)"; /* Class = "NSButtonCell"; title = "Launch OCS Agent at daemon start"; ObjectID = "dlF-LS-rTI"; */ "dlF-LS-rTI.title" = "Launch OCS Agent at daemon start"; /* Class = "NSButtonCell"; title = "Launch daemon after install"; ObjectID = "kI2-ox-p1X"; */ "kI2-ox-p1X.title" = "Launch daemon after install"; InfoPlist.strings000066400000000000000000000000611432320066700350470ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/en.lprojInstallerSectionTitle = "Daemon configuration"; Localizable.strings000066400000000000000000000003651432320066700353700ustar00rootroot00000000000000UnixAgent-2.10.0/macosx/setup_plugins/daemonconfig_plugin_install/daemonconfig/en.lproj/* Localized versions of Info.plist keys */ "PaneTitle" = "OCS agent daemon options"; //Peridocity warn "Periodicity_warn"="Invalid periodicity value"; //Periodicity warn comment "Periodicity_warn_comment"="Please enter a valid number value"; UnixAgent-2.10.0/memconf000077500000000000000000014057011432320066700150610ustar00rootroot00000000000000#!/usr/bin/env perl # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # MODIFY THE LOCATION TO THE FULL PATH TO PERL ABOVE IF NECESSARY # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # # @(#) memconf - Identify sizes of memory modules installed on a # @(#) Solaris, Linux, FreeBSD or HP-UX workstation or server. # @(#) Micron Technology, Inc. - Tom Schmidt 16-Nov-2017 V3.14 # # Maintained by Tom Schmidt (tschmidt@micron.com) # # Check http://sourceforge.net/projects/memconf/ or my website at # http://www.4schmidts.com/unix.html to get the latest version of memconf. # # If memconf does not recognize a system, then please run 'memconf -D' to # have it automatically E-mail me the information I need to enhanced to # recognize it. If the unrecognized system is a Sun clone, please also send # any hardware documentation on the memory layout that you may have. # # Usage: memconf [ -v | -D | -h ] [explorer_dir] # -v verbose mode # -D E-mail results to memconf maintainer # -h print help # explorer_dir Sun/Oracle Explorer output directory # # memconf reports the size of each SIMM/DIMM memory module installed in a # system. It also reports the system type and any empty memory sockets. # In verbose mode, it also reports the following information if available: # - banner name, model and CPU/system frequencies # - address range and bank numbers for each module # # memconf 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. # # Original version based on SunManagers SUMMARY by Howard Modell # (h.modell@ieee.org) on 29-Jan-1997. # # Tested to work on 32-bit and 64-bit kernels on: # - Solaris 10 6/06 or later on x86 with /usr/platform/i86pc/sbin/prtdiag # - Linux on SPARC with sparc-utils and /dev/openprom # - Linux on x86 and x86_64 with kernel-utils or pmtools for dmidecode # - FreeBSD on x86 and x86_64 with dmidecode # - Most HP-UX systems with SysMgmtPlus (cprop) or Support Tools Manager (cstm) # - Solaris (SunOS 4.X or 5.X) on the following SPARC systems # - sun4c Sun SS1, SS2, IPC, IPX, ELC with Open Boot PROM V2.X # - sun4m Sun 4/6x0, SS4, SS5, SS10, SS20, LX/ZX, Classic, Voyager, JavaEngine1 # - sun4d Sun SPARCserver-1000, 1000E, SPARCcenter-2000, 2000E # - sun4u Sun Ultra 1, 2, 5, 10, 30, 60, 450 # - sun4u Sun Ultra 80, Ultra Enterprise 420R, and Netra t1400/1405. # - sun4u Sun Ultra Enterprise 220R, 250, 450 # - sun4u Sun Ultra Enterprise 3000, 3500, 4000/5000, 4500/5500, 6000, 6500 # - sun4u1 Sun Ultra Enterprise 10000 # - sun4u Sun StorEdge N8400 and N8600 Filer # - sun4u Sun SPARCengine Ultra AX, AXi, AXmp, AXmp+, AXe # - sun4u Sun SPARCengine CP 1400, CP 1500, CP2140 # - sun4u Sun Netra t1 100/105, t1120/1125, ft1800, X1, T1 200, AX1105-500, 120 # - sun4u Sun Netra 20 (Netra T4) # - sun4u Sun Netra ct800 # - sun4u Sun Blade 100, 150, 1000, 1500, 2000, 2500 # - sun4u Sun Fire 280R # - sun4u Sun Fire 3800, 4800, 4810, 6800 # - sun4u Sun Fire V100, V120, V210, V240, V250, V440 # - sun4u Sun Netra 210, 240, 440 # - sun4u Sun Fire V125, V215, V245, V445 # - sun4u Sun Fire V480, V490, V880, V880z, V890 # - sun4u Sun Fire 12000, 15000, E20K, E25K # - sun4u Sun Fire V1280, Netra 1280 (Netra T12) # - sun4u Sun Fire E2900, E4900, E6900 # - sun4u Sun Fire B100s Blade Server # - sun4u Sun Ultra 25 Workstation # - sun4u Sun Ultra 45 Workstation # - sun4u Sun/Fujitsu Siemens SPARC Enterprise M3000, M4000, M5000, M8000, # and M9000 Server # - sun4v Sun Fire T2000, T1000, Netra T2000 # - sun4v Sun Blade T6300, T6320, T6340 # - sun4v Sun SPARC Enterprise T2000, T1000 Server # - sun4v Sun SPARC Enterprise T5120, T5140, T5220, T5240 Server, Netra T5220 # - sun4v Sun SPARC Enterprise T5440 Server, Netra T5440 # - sun4v Oracle SPARC T3-1, T3-1B, T3-2, T4-1, T4-2, T4-4, T5-2, T5-4, T7-4 # - sun4v Oracle SPARC S7-2, S7-2L # - sun4v Fujitsu SPARC M10-1, M10-4 # - sun4m Tatung COMPstation 5, 10, 20AL, 20S and 20SL clones # - sun4m transtec SPARCstation 20I clone # - sun4m Rave Axil-255 SPARCstation 5 clone # - sun4m Rave Axil-245, 311 and 320 clones (no verbose output) # - sun4u AXUS Ultra 250 # - sun4u Tatung COMPstation U2, U60 and U80D clones # - Force Computers SPARC clones (no verbose output) # - Tadpole SPARCbook 3 and RDI PowerLite-170 (no verbose output) # - Tadpole VoyagerIIi # - Tadpole (Cycle) 3200 CycleQUAD Ultra 2 upgrade motherboard # - Tadpole (Cycle) UP-520-IIi SPARCstation 5/20 upgrade motherboard # - Tadpole SPARCle # - Auspex 7000/650 (no verbose output) # - Fujitsu S-4/10H, S-4/20L and S-4/20H clones (no verbose output) # - Fujitsu GP7000, GP7000F # - Fujitsu Siemens PrimePower 200, 400, 600, 800, 1000, 2000 # - Fujitsu Siemens PrimePower 250, 450, 650, 850 # - Fujitsu Siemens PrimePower 900, 1500, 2500, HPC2500 # - Twinhead TWINstation 5G, 20G # - Detects VSIMMs for SX graphics on SS10SX/SS20 (1st VSIMM only) # - Detects Prestoserve NVSIMMs on SS10/SS20/SS1000/SC2000 # # Untested systems that should work: # - sun4c Sun SS1+ with Open Boot PROM V2.X # - sun4m Tatung COMPstation 20A clone # - sun4u Sun Netra ct400, ct410, ct810 # - sun4u Sun SPARCengine CP2040, CP2060, CP2080, CP2160 # - sun4v Sun Netra CP3260 # - sun4v Oracle SPARC T3-1BA, T3-4, T4-1B, T4-2B, T5-8, T5-1B, T7-1, T7-2 # - sun4v Oracle SPARC M5-32, M6-32, M7-8, M7-16 # - sun4v Oracle Netra SPARC T3 systems # - sun4v Fujitsu SPARC M10-4S # - May not work properly on Sun clones # # Won't work on: # - SPARC systems without /dev/openprom # - sun4c Sun SS1, SS1+, SLC, IPC with Open Boot PROM V1.X (no 'memory' lines # in devinfo/prtconf output) # - sun4 kernel architecture, and sun3 and older systems # - Perl 5.001 is known to have problems with hex number conversions # - Does not detect unused VSIMMs (another FB installed) or second VSIMM # # To Do list and Revision History can be found on the maintainers web site at # http://www.4schmidts.com/unix.html # Uncomment for debugging (perl 5 only) #use diagnostics; $^W=1; # Enables -w warning switch, put here for SunOS4 compatibility. $starttime=(times)[0]; $version="V3.14"; $version_date="16-Nov-2017"; $URL="http://sourceforge.net/projects/memconf/"; $newpath="/usr/sbin:/sbin:/bin:/usr/bin:/usr/ucb:/usr/local/bin:/var/local/bin"; $ENV{PATH}=(defined($ENV{PATH})) ? "$newpath:$ENV{PATH}" : $newpath; # Force C locale so that output is in English $ENV{LC_ALL}="C"; $_=$]; ($PERL_VERSION_MAJOR)=/(\d).*/; if ($PERL_VERSION_MAJOR < 5) { ($PERL_VERS)=/(\d\.\d)/; ($PERL_PATCH)=/(\d*)$/; $PERL_PATCH="0$PERL_PATCH" if ($PERL_PATCH < 10); $PERL_VERSION="$PERL_VERS$PERL_PATCH"; } else { ($PERL_VERSION)=/(\d\.\d{3}).*/; } $uname="/usr/bin/uname"; $uname="/bin/uname" if (-x '/bin/uname'); $running_on=""; if (-x $uname) { $os=&mychomp(`$uname`); $os="FreeBSD-based $os" if ($os ne "FreeBSD" && -f '/etc/freebsd-update.conf'); $running_on=$os; $hostname=&mychomp(`$uname -n`); if ($os eq "AIX") { $machine=&mychomp(`$uname -M`); # oslevel command can return stderr output, so use uname instead $osmajor=&mychomp(`$uname -v`); $osminor=&mychomp(`$uname -r`); $osrel="$osmajor.$osminor"; $kernver=""; $platform=&mychomp(`$uname -p`); } else { $machine=&mychomp(`$uname -m`); $osrel=&mychomp(`$uname -r`); $kernver=&mychomp(`$uname -v`); $platform=$machine; } } else { $hostname=""; $machine=""; $os="this unsupported"; $osrel=""; $kernver=""; } $osrelease=""; $prtdiag_cmd=""; $prtdiag_exec=""; $have_prtdiag_data=0; $prtdiag_checked=0; $prtdiag_memory=0; $prtfru_cmd=""; $have_prtfru_data=0; $have_prtfru_details=0; $missing_prtfru_details=" "; $prtpicl_cmd=""; $have_prtpicl_data=0; $psrinfo_cmd=""; $have_psrinfo_data=0; $use_psrinfo_data=1; $psrinfo_checked=0; $virtinfo_cmd=""; $have_virtinfo_data=0; $virtinfoLDOMcontrolfound=0; $cfgadm_cmd=""; $have_cfgadm_data=0; $ipmitool_cmd=""; $have_ipmitool_data=0; $ipmi_cpucnt=0; $ipmi_cputype=""; @ipmi_mem=(""); $ipmi_memory=0; $smbios_cmd=""; $have_smbios_data=0; @smbios_mem=(""); $smbios_memory=0; $kstat_cmd=""; $have_kstat_data=0; @kstat_brand=(); @kstat_MHz=(); $kstat_cpubanner=""; @kstat_core_id=(""); @kstat_core=(""); @kstat_ncore_per_chip=(""); @kstat_ncpu_per_chip=(""); $kstat_checked=0; $ldm_cmd=""; $have_ldm_data=0; $ldm_memory=0; $free_cmd=""; $free_checked=""; $have_free_data=0; $meminfo_cmd=""; $have_meminfo_data=0; $modprobe_eeprom_cmd=""; $decodedimms_cmd=""; $decodedimms_checked=""; $have_decodedimms_data=0; @reorder_decodedimms=(); $topology_cmd=""; @topology_header=(); @topology_data=(); $topology_mfg=""; $maxmembusspeed=""; $foundspeed=0; $mixedspeeds=0; $have_x86_devname=0; $manufacturer=""; $systemmanufacturer=""; $boardmanufacturer=""; $baseboard=""; $biosvendor=""; if (-d '/usr/platform') { $platform=&mychomp(`$uname -i`); if (-x "/usr/platform/$platform/sbin/prtdiag") { $prtdiag_cmd="/usr/platform/$platform/sbin/prtdiag"; } elsif (-x "/usr/platform/$machine/sbin/prtdiag") { $prtdiag_cmd="/usr/platform/$machine/sbin/prtdiag"; } elsif (-x '/usr/sbin/prtdiag') { $prtdiag_cmd="/usr/sbin/prtdiag"; } } elsif (-x '/usr/kvm/prtdiag') { $platform=$machine; $prtdiag_cmd='/usr/kvm/prtdiag'; } elsif (-x '/usr/sbin/prtdiag') { $platform=&mychomp(`$uname -i`); $prtdiag_cmd="/usr/sbin/prtdiag"; } if ($prtdiag_cmd) { if (-x $prtdiag_cmd) { $prtdiag_exec="$prtdiag_cmd"; } } $buffer=""; $filename=""; $installed_memory=0; $failed_memory=0; $spare_memory=0; $failing_memory=0; $memory_error_logged=0; $failed_fru=""; $ultra=0; $simmbanks=0; $bankcnt=0; $slot0=0; $smallestsimm=16777216; $largestsimm=0; $found8mb=0; $found16mb=0; $found32mb=0; $found10bit=0; $found11bit=0; $foundbank1or3=0; $sxmem=0; $nvmem=0; $nvmem1=0; $nvmem2=0; $memtype="SIMM"; $sockettype="socket"; $verbose=0; $debug=0; $recognized=1; $untested=1; $untested_type=""; $perlhexbug=0; $exitstatus=0; $meg=1048576; @socketstr=(""); @socketlabelstr=(""); @orderstr=(""); @groupstr=(""); @bankstr=(""); @banksstr=(""); $bankname="banks"; @bytestr=(""); @slotstr=(""); $simmrangex=0; $simmrange=1; $showrange=1; $start1x=""; $stop1x=""; @simmsizes=(0,16777216); @simmsizesfound=(); @memorylines=(""); $socket=""; $socketlabel=""; $order=""; $group=""; $slotnum=""; $bank=""; $dualbank=0; $byte=""; $gotmemory=""; $gotmodule=""; $gotmodulenames=""; $gotcpunames=""; $gotcpuboards=""; $slotname0=""; @boards_cpu=""; @boards_mem=""; $empty_banks=""; $banks_used=""; $nvsimm_banks=""; $boardslot_cpu=" "; $boardslot_cpus=" "; @boardslot_cpus=(); $boardslot_mem=" "; $boardslot_mems=" "; @boardslot_mems=(); $boardfound_cpu=0; $boardfound_mem=0; $prtdiag_has_mem=0; $prtdiag_banktable_has_dimms=0; $prtdiag_failed=0; $prtconf_warn=""; $flag_cpu=0; $flag_mem=0; $flag_rewrite_prtdiag_mem=0; $format_cpu=0; $format_mem=0; $foundname=0; $sockets_used=""; $sockets_empty=""; $sortslots=1; $devtype=""; $interleave=0; $stacked=0; $freq=0; $sysfreq=0; $cpufreq=0; $cputype=""; $cputype_prtconf=""; $cputype_psrinfo=""; $cpuinfo_cputype=""; @cpucnt=(); $cpucntfrom=""; $cpucntflag=0; $cpuinfo_cpucnt=0; $have_cpuinfo_data=0; $cpuinfo_coreidcnt=0; $cpuinfo_cpucores=0; @cpuinfo_physicalid=(); $cpuinfo_physicalidcnt=0; $cpuinfo_siblings=0; $cpuinfo_checked=0; $xm_info_cmd=""; $have_xm_info_data=0; $xen_ncpu=0; $xen_nr_nodes=0; $xen_sockets_per_node=0; $xen_cores_per_socket=0; $foundGenuineIntel=0; @diagcpucnt=(); $diagthreadcnt=0; $psrcpucnt=0; $foundpsrinfocpu=0; $ncpu=0; # remains 0 if using prtdiag output only $ndcpu=0; # prtdiag cpu count $npcpu=0; # physical cpu count $nvcpu=0; # virtual cpu count $necpu=0; # empty cpu socket count $threadcnt=0; $corecnt=1; $hyperthread=0; $hyperthreadcapable=0; $header_shown=0; $romver=""; $romvernum=""; $SUNWexplo=0; $banner=""; $bannermore=""; $cpubanner=""; $diagbanner=""; $model=""; $systemmodel=""; $boardmodel=""; $modelmore=""; $model_checked=0; $BSD=0; # Initially assume SunOS 5.X $config_cmd="/usr/sbin/prtconf -vp"; $config_command="prtconf"; $config_permission=0; $permission_error=""; $dmidecode_error=""; $freephys=0; $isX86=0; $HPUX=0; $devname=""; # Sun internal development code name $familypn=""; # Sun family part number (system code) $clone=0; $totmem=0; $latest_dmidecode_ver="2.12"; $minimum_dmidecode_ver="2.8"; $dmidecode_ver="0"; $dmidecodeURL="http://www.nongnu.org/dmidecode/"; $have_dmidecode=0; $cpuarr=-1; $memarr=-1; $release=""; $waitshown=0; $totalmemshown=0; $vmshown=0; $controlLDOMshown=0; $helpers_defined=0; $picl_foundmemory=0; @picl_mem_pn=(); @picl_mem_bank=(); @picl_mem_dimm=(); if (-x '/usr/bin/id') { $uid=&mychomp(`/usr/bin/id`); $uid=~s/uid=//; $uid=~s/\(.*//; } else { $uid=0; # assume super-user } $empty_memory_printed=0; @filelist=(); # # Parse options # foreach $name (@ARGV) { if ($name eq "-v") { # verbose mode $verbose=1; } elsif ($name eq "-d") { # more verbose debug mode $verbose=2; } elsif ($name eq "-debug") { # most verbose debug mode $debug=1; } elsif ($name eq "-debugtime") { # most verbose debug mode with timestamps $debug=2; } elsif ($name eq "-D") { # E-mail information of system to maintainer $verbose=3; open(MAILFILE, ">/tmp/memconf.output") || die "can't open /tmp/memconf.output: $!"; print MAILFILE "Output from 'memconf -d' on $hostname\n"; print MAILFILE "----------------------------------------------------\n"; close(MAILFILE); *STDERR = *STDOUT; # Redirect stderr to stdout open(STDOUT, "| tee -a /tmp/memconf.output") || die "can't open /tmp/memconf.output: $!"; print "Gathering memconf data to E-mail to maintainer. This may take a few minutes.\nPlease wait...\n"; } elsif (-f "$name/sysconfig/prtconf-vp.out") { # Sun/Oracle Explorer output $SUNWexplo=1; # Special case for regression testing Sun/Oracle Explorer data $os="SunOS"; open(FILE, "<$name/sysconfig/prtconf-vp.out"); @config=; close(FILE); if (-f "$name/sysconfig/prtdiag-v.out") { open(FILE, "<$name/sysconfig/prtdiag-v.out"); @prtdiag=; $have_prtdiag_data=1; $prtdiag_cmd="/usr/platform/$platform/sbin/prtdiag"; $prtdiag_exec="$prtdiag_cmd"; close(FILE); } if (-f "$name/fru/prtfru_-x.out") { open(FILE, "<$name/fru/prtfru_-x.out"); @prtfru=; $have_prtfru_data=1; $prtfru_cmd='/usr/sbin/prtfru'; close(FILE); } if (-f "$name/sysconfig/prtpicl-v.out") { open(FILE, "<$name/sysconfig/prtpicl-v.out"); @prtpicl=; $have_prtpicl_data=1; $prtpicl_cmd='/usr/sbin/prtpicl'; close(FILE); } if (-f "$name/sysconfig/psrinfo-v.out") { open(FILE, "<$name/sysconfig/psrinfo-v.out"); @psrinfo=; $have_psrinfo_data=1; $psrinfo_cmd='/usr/sbin/psrinfo'; close(FILE); } # Sun/Oracle Explorer does not include "psrinfo -p" or # "psrinfo -p -v" data yet. # Is virtinfo output available in Oracle Explorer? if (-f "$name/sysconfig/cfgadm-alv.out") { open(FILE, "<$name/sysconfig/cfgadm-alv.out"); @cfgadm=; $have_cfgadm_data=1; $cfgadm_cmd='/usr/sbin/cfgadm'; close(FILE); } if (-f "$name/sysconfig/uname-a.out") { open(FILE, "<$name/sysconfig/uname-a.out"); $uname=&mychomp(); close(FILE); @unamearr=split(/\s/, $uname); $hostname=$unamearr[1]; $machine=$unamearr[4]; $osrel=$unamearr[2]; $platform=$unamearr[6]; $prtdiag_cmd="/usr/platform/$platform/sbin/prtdiag"; $prtdiag_exec="$prtdiag_cmd"; } else { if ($config[0] =~ /System Configuration:/) { @machinearr=split(/\s+/, $config[0]); $machine=$machinearr[4]; } $osrel=""; $hostname=""; } if (-f "$name/sysconfig/prtconf-V.out") { open(FILE, "<$name/sysconfig/prtconf-V.out"); $romver=&mychomp(); close(FILE); } $filename="$name"; } elsif (-f $name) { # Regression test file with prtconf/dmidecode output open(FILE, "<$name"); @config=; close(FILE); # Regression test file may also have prtdiag, etc. @prtdiag=@config; @prtfru=@config; $have_prtfru_data=1; @prtpicl=@config; $have_prtpicl_data=1; @psrinfo=@config; $have_psrinfo_data=1; @virtinfo=@config; $have_virtinfo_data=1; @cfgadm=@config; $have_cfgadm_data=1; @ipmitool=@config; $have_ipmitool_data=1; @ldm=@config; $have_ldm_data=1; @cpuinfo=@config; $have_cpuinfo_data=1; @meminfo=@config; $have_meminfo_data=1; @free=@config; $have_free_data=1; @xm_info=@config; $have_xm_info_data=1; @decodedimms=@config; @smbios=@config; $have_smbios_data=1; @kstat=@config; $have_kstat_data=1; @machinfo=@config; $hostname=""; $osrel=""; # Check test file to determine OS and machine for ($val=0; $val <= $#config; $val++) { if ($config[$val]) { if ($config[$val] =~ /System Configuration:/) { @machinearr=split(/\s+/, $config[$val]); $machine=$machinearr[4]; $machine="" if (! defined($machine)); $platform=$machine; # Special case for regression testing SunOS prtconf files $os="SunOS"; last; } elsif ($config[$val] =~ / dmidecode |DMI .* present/) { $have_dmidecode=1; if ($config[$val] =~ / dmidecode /) { $dmidecode_ver=&mychomp($config[$val]); $dmidecode_ver=~s/.* dmidecode //; } $machine=""; $platform=""; # Special case for regression testing Linux dmidecode files $os="Linux"; last; } } } $filename="$name"; } else { &show_help; } } &pdebug("starting"); print "memconf: $version $version_date $URL\n" if (-t STDOUT || $verbose); &find_helpers; if (! $filename && -r '/proc/cpuinfo') { open(FILE, "/proc/cpuinfo"); @cpuinfo=; close(FILE); $have_cpuinfo_data=1; } if (! $filename && $xm_info_cmd) { @xm_info=&run("$xm_info_cmd"); $have_xm_info_data=1; } # Check cpuinfo now on unsupported machines (arm, mips, etc.) &check_cpuinfo if (! $filename && $machine !~ /.86|ia64|amd64|sparc/); &check_free; &check_dmidecode if ($have_dmidecode); if (! $filename) { if ($os eq "HP-UX") { &hpux_check; if (-x '/opt/propplus/bin/cprop') { &hpux_cprop; } elsif (-x '/usr/sbin/cstm') { &hpux_cstm; } else { &show_header; &show_supported; } } elsif ($os =~ /Linux|FreeBSD/) { &linux_distro if (! $release); if ($machine =~ /arm/i) { if (-f '/etc/Alt-F' && -f '/tmp/board') { # NAS model open(FILE, "
); close(FILE); } elsif (-f '/etc/model') { # DLink NAS model open(FILE, "); close(FILE); } } # Use dmidecode for Linux x86, not for Linux SPARC &check_dmidecode if ($config_cmd =~ /dmidecode/ && -x "$config_cmd" && ($machine =~ /.86/ || ! -x '/usr/sbin/prtconf')); if ($machine =~ /.86/ || ! -e '/dev/openprom') { &show_header; &show_supported; } } elsif ($os ne "SunOS") { &show_header; &show_supported; } if (-f '/vmunix') { # SunOS 4.X (Solaris 1.X) $BSD=1; if (! -x '/usr/etc/devinfo') { print "ERROR: no 'devinfo' command. Aborting.\n"; &pdebug("exit 1"); exit 1; } $config_cmd="/usr/etc/devinfo -pv"; $config_command="devinfo"; } else { # Solaris 2.X or later $BSD=0; if (! -x '/usr/sbin/prtconf') { print "ERROR: no 'prtconf' command. Aborting.\n"; &pdebug("exit 1"); exit 1; } $config_cmd="/usr/sbin/prtconf -vp"; $config_command="prtconf"; } } else { # Special case for regression testing SunOS4 and SunOS5 files if ($filename =~ /\bdevinfo\./) { $os="SunOS"; $BSD=1; } elsif ($filename =~ /\bprtconf\./) { $os="SunOS"; $BSD=0; } # Special case for regression testing Linux files $os="Linux" if ($filename =~ /Linux/); # Special case for regression testing HP-UX files if ($filename =~ /\bcprop[\.+]/) { &hpux_check; &hpux_cprop; } elsif ($filename =~ /\b(cstm|machinfo)[\.+]/) { &hpux_check; &hpux_cstm; } } $kernbit=""; $hasprtconfV=0; $solaris=""; $solaris="1.0" if ($osrel eq "4.1.1"); $solaris="1.0.1" if ($osrel eq "4.1.2"); $solaris="1.1" if ($osrel =~ /4.1.3/); $solaris="1.1.1" if ($osrel eq "4.1.3_U1"); $solaris="1.1.2" if ($osrel eq "4.1.4"); if ($osrel =~ /^5./) { $osminor=$osrel; $osminor=~s/^5.//; if ($SUNWexplo) { if (-f "$filename/etc/release") { open(FILE, "<$filename/etc/release"); $release=; close(FILE); } } else { if (-f '/etc/release') { open(FILE, "; close(FILE); } } if ($release =~ "Solaris") { $release=~s/\s+//; $release=&mychomp($release); $solaris="$release"; } if ($release =~ "OmniOS") { $release=~s/\s+//; $release=&mychomp($release); $solaris="$release"; } if ($osminor =~ /^[7-9]$|^1[0-9]$/) { $hasprtconfV=1; $solaris=$osminor if (! $solaris); $kernbit=32; if ($SUNWexplo) { $cpuarch=""; if (-f "$filename/sysconfig/isainfo.out") { open(FILE, "<$filename/sysconfig/isainfo.out"); $cpuarch=; close(FILE); } elsif (-f "$filename/sysconfig/isainfo-kv.out") { open(FILE, "<$filename/sysconfig/isainfo-kv.out"); $cpuarch=; close(FILE); } $kernbit=64 if ($cpuarch =~ /sparcv9|ia64|amd64/); } elsif (-x '/bin/isainfo') { $kernbit=&mychomp(`/bin/isainfo -b`); } } elsif ($osminor =~ /^[4-6]$/) { $hasprtconfV=1; $solaris="2.$osminor" if (! $solaris); } else { $solaris="2.$osminor"; } # x86 Solaris 2.1 through 2.5.1 has different syntax than SPARC $config_cmd="/usr/sbin/prtconf -v" if ($machine eq "i86pc" && $osminor =~ /^[1-5]$/); # Solaris x86 returns booting system rather than PROM version $hasprtconfV=0 if ($machine eq "i86pc"); } if (! $filename) { @config=&run("$config_cmd"); if ($hasprtconfV) { # SPARC Solaris 2.4 or later $romver=&mychomp(`/usr/sbin/prtconf -V 2>&1`); if ($romver eq "Cannot open openprom device") { $prtconf_warn="ERROR: $romver"; $romver=""; } else { @romverarr=split(/\s/, $romver); $romvernum=$romverarr[1]; } } else { # SPARC Solaris 2.3 or older, or Solaris x86 # Try to use sysinfo if installed to determine the OBP version. # sysinfo is available from http://www.MagniComp.com/sysinfo/ close(STDERR) if ($verbose != 3); $romver=`sysinfo -show romver 2>/dev/null | tail -1`; open(STDERR) if ($verbose != 3); if ($romver) { $romver=&mychomp($romver); @romverarr=split(/\s/, $romver); $romver=$romverarr[$#romverarr]; } else { # Assume it is old $romver="2.X" if ($machine =~ /sun4/); } $romvernum=$romver; } } if ($filename && $have_prtpicl_data && ! $SUNWexplo) { foreach $line (@prtpicl) { $line=&dos2unix($line); $line=&mychomp($line); $line=~s/\s+$//; # Parse osrel and hostname from prtpicl data if ($line =~ /\s+:OS-Release\s/) { $osrel=$line; $osrel=~s/^.*:OS-Release\s+(.*)$/$1/; if ($osrel =~ /^5./) { $osminor=$osrel; $osminor=~s/^5.//; if ($osminor =~ /^[7-9]$|^1[0-9]$/) { $solaris=$osminor; # Solaris 10 SPARC and later is 64-bit $kernbit=64 if ($osminor =~ /^1[0-9]$/ && $machine =~ /sun4/); } else { # Solaris 2.6 and earlier is 32-bit $solaris="2.$osminor"; $kernbit=32; } if ($machine =~ /86/) { $solaris .= " X86" if ($solaris !~ / X86/); # Solaris 9 X86 and earlier is 32-bit $kernbit=32 if ($osminor =~ /^[7-9]$/); } elsif ($machine =~ /sun4/) { $solaris .= " SPARC" if ($solaris !~ / SPARC/); $kernbit=32 if ($machine =~ /sun4[cdm\b]/); } } } if ($line =~ /\s+:HostName\s/) { $hostname=$line; $hostname=~s/^.*:HostName\s+(.*)$/$1/; } } } sub please_wait { return if ($waitshown); $waitshown=1; print "Gathering data for memconf. This may take over a minute. Please wait...\n" if (-t STDOUT); } sub find_helpers { return if ($helpers_defined); $helpers_defined=1; if ($os eq "HP-UX") { $config_cmd="echo 'selclass qualifier cpu;info;wait;selclass qualifier memory;info;wait;infolog'|/usr/sbin/cstm"; } elsif ($os =~ /Linux|FreeBSD/) { if (defined($ENV{DMIDECODE}) && -x $ENV{DMIDECODE}) { # this may be a setuid-root version of dmidecode $config_cmd=$ENV{DMIDECODE}; } else { foreach $bin ('/usr/local/sbin','/usr/local/bin','/usr/sbin','/usr/bin','/bin') { if (-x "$bin/dmidecode") { $config_cmd="$bin/dmidecode"; last; } } } } elsif (-x '/usr/sbin/prtconf') { # Solaris 2.X or later $config_cmd="/usr/sbin/prtconf -vp"; $prtfru_cmd='/usr/sbin/prtfru' if (-x '/usr/sbin/prtfru'); $prtpicl_cmd='/usr/sbin/prtpicl' if (-x '/usr/sbin/prtpicl'); $psrinfo_cmd='/usr/sbin/psrinfo' if (-x '/usr/sbin/psrinfo'); $virtinfo_cmd='/usr/sbin/virtinfo' if (-x '/usr/sbin/virtinfo'); $cfgadm_cmd='/usr/sbin/cfgadm' if (-x '/usr/sbin/cfgadm'); $smbios_cmd='/usr/sbin/smbios' if (-x '/usr/sbin/smbios'); $kstat_cmd='/usr/bin/kstat -m cpu_info' if (-x '/usr/bin/kstat'); $ldm_cmd='/opt/SUNWldm/bin/ldm' if (-x '/opt/SUNWldm/bin/ldm'); } if ($os =~ /Linux|FreeBSD/) { $free_cmd='/usr/bin/free -m' if (-x '/usr/bin/free'); $meminfo_cmd='cat /proc/meminfo' if (-r '/proc/meminfo' || $running_on !~ /Linux|FreeBSD/); $topology_cmd='/usr/bin/topology --summary --nodes --cpus --io --routers' if (-x '/usr/bin/topology' || $running_on !~ /Linux|FreeBSD/); if (&is_xen_hv) { $xm_info_cmd='/usr/sbin/xm info'; $xm_info_cmd='/usr/bin/xm info' if (-x '/usr/bin/xm'); } if (-x '/usr/bin/decode-dimms.pl' || $running_on !~ /Linux|FreeBSD/) { $modprobe_eeprom_cmd='/sbin/modprobe eeprom'; $decodedimms_cmd='/usr/bin/decode-dimms.pl'; } } if ($os =~ /SunOS|Linux|FreeBSD/) { if (defined($ENV{IPMITOOL}) && -x $ENV{IPMITOOL}) { # this may be a setuid-root version of ipmitool $ipmitool_cmd=$ENV{IPMITOOL}; } else { foreach $bin ('/usr/sfw/bin','/usr/local/sbin','/usr/local/bin','/usr/sbin','/usr/bin','/bin') { if (-x "$bin/ipmitool") { $ipmitool_cmd="$bin/ipmitool"; last; } } } } } sub show_helpers { $s=shift; # Prefer prtconf for Linux SPARC if ($machine =~ /sun|sparc/i || $filename =~ /LinuxSPARC/) { print "$s/usr/sbin/prtconf -vp\n"; print "$s$config_cmd\n" if ($config_cmd =~ /dmidecode/ && -x "$config_cmd"); } else { print "$s$config_cmd\n" if ($config_cmd); } if ($os eq "SunOS") { print "$s$prtdiag_cmd -v\n" if ($prtdiag_exec); print "$s$prtfru_cmd -x\n" if ($prtfru_cmd); print "$s$prtpicl_cmd -v\n" if ($prtpicl_cmd); if ($psrinfo_cmd) { print "$s$psrinfo_cmd -v\n"; $tmp=&mychomp(`$psrinfo_cmd -p 2>/dev/null`); if ($tmp ne "") { print "$s$psrinfo_cmd -p\n"; print "$s$psrinfo_cmd -p -v\n"; } } print "$s$virtinfo_cmd -pa\n" if ($virtinfo_cmd); print "$s$cfgadm_cmd -al\n" if ($cfgadm_cmd); print "$s$smbios_cmd\n" if ($smbios_cmd); print "$s$kstat_cmd\n" if ($kstat_cmd); print "$s$ldm_cmd list-devices -a -p\n" if ($ldm_cmd); } if ($os =~ /Linux|FreeBSD/) { print "${s}cat /proc/cpuinfo\n" if (-r '/proc/cpuinfo' || $running_on !~ /Linux|FreeBSD/); print "${s}cat /proc/meminfo\n" if (-r '/proc/meminfo' || $running_on !~ /Linux|FreeBSD/); print "$s$free_cmd\n" if ($free_cmd); print "${s}/usr/bin/topology\n" if (-x '/usr/bin/topology' || $running_on !~ /Linux|FreeBSD/); print "$s$xm_info_cmd\n" if ($xm_info_cmd); print "${s}/usr/bin/xenstore-ls /local/domain/DOMID\n" if (-x '/usr/bin/xenstore-ls' || $running_on !~ /Linux|FreeBSD/); print "$s$modprobe_eeprom_cmd; $decodedimms_cmd\n" if ($decodedimms_cmd); } if ($os =~ /SunOS|Linux|FreeBSD/) { print "$s$ipmitool_cmd fru\n" if ($ipmitool_cmd && $running_on eq $os); } if ($os eq "HP-UX") { print "$s/usr/contrib/bin/machinfo\n" if (-x '/usr/contrib/bin/machinfo'); } } sub show_help { &find_helpers; if ($os =~ /Linux|FreeBSD/ && $config_cmd =~ /prtconf/) { if ($machine =~ /.86|ia64|amd64|sparc/) { $config_cmd="dmidecode"; } else { $config_cmd=""; } } print "Usage: memconf [ -v | -D | -h ] [explorer_dir]\n"; print " -v verbose mode\n"; print " -D E-mail results to memconf maintainer\n"; print " -h print help\n"; print " explorer_dir Sun/Oracle Explorer output directory\n"; print "\nThis is memconf, $version $version_date\n\nCheck my website "; print "at $URL to get the latest\nversion of memconf.\n\n"; &show_supported if ($os !~ /SunOS|HP-UX|Linux|FreeBSD/); print "Please send bug reports and enhancement requests along with "; print "the output of the\nfollowing commands to tschmidt\@micron.com "; print "as E-mail attachments so that memconf\nmay be enhanced. "; print "You can do this using the 'memconf -D' command if this system\n"; print "can E-mail to the Internet.\n"; &show_helpers(" "); &pdebug("exit"); exit; } sub check_hyperthread { &pdebug("in check_hyperthread: corecnt=$corecnt"); if ($cputype =~ /Intel.*\sXeon.*\s(E5540|E5620|L5520|X5560|X5570)\b/ && (($corecnt == 8 && ! &is_xen_hv) || &is_xen_hv)) { &pdebug("hyperthread=1: hack in cpubanner, cputype=$cputype") if (! $hyperthread); $hyperthread=1; $corecnt=4; $cputype=~s/Eight.Core //ig; $cputype=&multicore_cputype($cputype,$corecnt); } if ($cputype =~ /Intel.*\sXeon.*\s(L5640|X5670|X5675)\b/ && (($corecnt == 12 && ! &is_xen_hv) || &is_xen_hv)) { &pdebug("hyperthread=1: hack in cpubanner, cputype=$cputype") if (! $hyperthread); $hyperthread=1; $corecnt=6; $cputype=~s/Twelve.Core //ig; $cputype=&multicore_cputype($cputype,$corecnt); } } sub show_hyperthreadcapable { if ($hyperthreadcapable && ! $hyperthread) { print "NOTICE: CPU"; if ($npcpu > 1) { print "s are"; } else { print " is"; } print " capable of Hyper-Threading, but it is not enabled in the BIOS.\n"; } } sub cpubanner { # Hard-code some CPU models for hyper-threading on regression tests. # Hyper-Thread detection in Solaris x86 is done earlier by check_kstat # This hard-code method assumes Hyper-Threading is enabled if the # core count matches. This is not used when kstat data is available. if ($kstat_cpubanner && $modelmore !~ /MHz\)/) { &pdebug("in cpubanner, using kstat_cpubanner for cpubanner"); $cpubanner=$kstat_cpubanner; return; } &checkX86; if ($filename && $os eq "SunOS" && $isX86 && ! $hyperthread && ! $kstat_checked) { &check_hyperthread; } elsif ($filename && &is_xen_hv) { # Xen Hypervisor hides Hyper-Threading from /proc/cpuinfo, so # also hard-core some CPU models for it. &check_hyperthread; } &pdebug("in cpubanner, corecnt=$corecnt, npcpu=$npcpu, nvcpu=$nvcpu, cputype=$cputype"); if ($modelmore =~ /\(Solaris x86 machine\)/ && ! $cpubanner && $cputype ne "x86") { $modelmore=""; while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d+)$/; $cputype=$1; $cpufreq=$2; } &x86multicorecnt($cputype); $ncpu=$cpucnt{"$cputype $cpufreq"}; if ($cpucntflag == 0 && $npcpu == 0) { for $tmp (2,3,4,6,8,10,12,16) { $ncpu /= $tmp if ($corecnt == $tmp && $ncpu % $tmp == 0); } } $ncpu=$npcpu if ($npcpu); $cpubanner="$ncpu X " if ($ncpu > 1); $tmp=&multicore_cputype($cputype,$corecnt); $cpubanner .= "$tmp"; $cpubanner .= " x86" if ($cputype eq "AMD"); $cpubanner .= " ${cpufreq}MHz" if ($cpufreq && $cpufreq ne "0" && $cputype !~ /Hz$/); } } sub show_header { return if ($header_shown); &pdebug("cpucntfrom=$cpucntfrom"); &cpubanner; $header_shown=1; undef %saw; @saw{@simmsizesfound}=(); @simmsizesfound=sort numerically keys %saw; print "hostname: $hostname\n" if ($hostname); if ($filename) { print (($SUNWexplo) ? "Sun/Oracle Explorer directory" : "filename"); print ": $filename\n"; } if ($manufacturer) { $manufacturer="Sun Microsystems, Inc." if ($manufacturer =~ /Sun Microsystems/i); } if ($diagthreadcnt && $cpucntfrom eq "prtdiag") { # Replace @cpucnt with @diagcpucnt while (($cf,$tmp)=each(%cpucnt)) { delete $cpucnt{"$cf"}; $cpucnt{"$cf"}=$diagcpucnt{"$cf"}; } } if ($banner) { # See if banner includes CPU information if ($banner !~ /\(.*SPARC/ && $banner !~ /MHz/ && ! $kstat_cpubanner) { @cputypecnt=keys(%cpucnt); $x=0; while (($cf,$cnt)=each(%cpucnt)) { $x++; $cf=~/^(.*) (\d*)$/; $ctype=$1; $cfreq=$2; &multicore_cpu_cnt(""); $cpubanner .= "$cnt X " if ($cnt > 1); if ($ctype =~ /390Z5/) { $cpubanner .= "SuperSPARC"; $cpubanner .= "-II" if ($cfreq > 70); } elsif ($ctype =~ /MB86907/) { $cpubanner .= "TurboSPARC-II"; } elsif ($ctype =~ /MB86904|390S10/) { $cpubanner .= "microSPARC"; $cpubanner .= "-II" if ($cfreq > 70); } elsif ($ctype =~ /L2A0925/) { $cpubanner .= "microSPARC-IIep"; } elsif ($ctype =~ /,RT62[56]/) { $cpubanner .= "hyperSPARC"; } else { $cpubanner .= "$ctype"; } $cpubanner .= " ${cfreq}MHz" if ($cfreq && $cpubanner !~ /Hz$/); $cpubanner .= ", " if ($x < scalar(@cputypecnt)); } } elsif ($banner =~ /\(/ && $banner !~ /MHz/) { # CPU listed without speed while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d*)$/; $cfreq=$2; $banner=~s/\)/ ${cfreq}MHz\)/g if ($cfreq); } } } $modelmore="" if ($modelmore =~ /\(Solaris x86 machine\)/ && $model ne "i86pc" && $model ne "i86xpv" && $model ne "i86xen"); if ($verbose) { if ($banner) { print "banner: $banner"; print " $bannermore" if ($bannermore); print " ($cpubanner)" if ($cpubanner); print "\n"; } if ($manufacturer) { print "manufacturer: $manufacturer\n"; } if ($model) { print "model: $model"; print " $modelmore" if ($modelmore); print " $realmodel" if ($realmodel); print " ($cpubanner)" if ($cpubanner && ! $banner); print "\n"; } if ($baseboard) { print "base board: $baseboard\n"; } if (! $clone) { $tmp="Sun"; if ($manufacturer) { $tmp="Sun/Oracle" if ($manufacturer =~ /^Oracle\b/); } $tmp="Oracle" if ($platform =~ /^ORCL,/); print "$tmp development codename: $devname\n" if ($devname); print "$tmp Family Part Number: $familypn\n" if ($familypn); } if (! $filename || $SUNWexplo) { if ($solaris) { print "Solaris " if ($solaris !~ /(Solaris|OmniOS)/); print "$solaris"; if ($machine =~ /86/) { print " X86" if ($solaris !~ / X86/); } elsif ($machine =~ /sun4/) { print " SPARC" if ($solaris !~ / SPARC/); } print ", ${kernbit}-bit kernel, " if ($kernbit); } if ($os =~ /Linux|FreeBSD/ && $release) { if (-x '/bin/busybox') { @busybox=`/bin/busybox cat --help 2>&1`; $busyboxver=""; for (@busybox) { next if (! /^BusyBox/); $busyboxver=&mychomp($_); $busyboxver=~s/\).*$/\)/; } if ($busyboxver) { print "$busyboxver, "; } else { print "BusyBox, "; } } print "$release\n"; } else { print "$os"; print " $osrel" if ($osrel); print " ($osrelease)" if ($osrelease); print ", ${kernbit}-bit kernel" if ($kernbit && $HPUX); print "\n"; } } elsif ($HPUX) { print "$os"; print " $osrel" if ($osrel); print " ($osrelease)" if ($osrelease); print ", ${kernbit}-bit kernel" if ($kernbit); print "\n"; } elsif ($os =~ /Linux|FreeBSD/) { print "BusyBox " if ($filename =~ /BusyBox/); # for regression tests if ($release) { print "$release"; } elsif ($machine =~ /sun|sparc/i || $filename =~ /LinuxSPARC/) { print "Linux SPARC"; } elsif ($machine =~ /arm/i) { print "Linux ARM"; } elsif ($machine =~ /mips/i) { print "Linux MIPS"; } elsif ($have_dmidecode) { print "Linux x86"; } print ", ${kernbit}-bit kernel" if ($kernbit); print "\n"; } elsif ($BSD) { print "Solaris 1.X SPARC, 32-bit kernel, SunOS 4.X\n"; } elsif ($osrel && $solaris) { print "Oracle " if ($solaris !~ /Oracle/ && $platform =~ /^ORCL,/); print "Solaris " if ($solaris !~ /(Solaris|OmniOS)/); print "$solaris, "; print "${kernbit}-bit kernel, " if ($kernbit); print "SunOS $osrel\n"; } else { print "Solaris 2.X"; if ($machine =~ /86/) { print " X86"; } elsif ($machine =~ /sun4/) { print " SPARC"; } print ", SunOS 5.X\n"; } $ncpu=1 if ($ncpu == 0); # It has at least 1 CPU if ($kstat_cpubanner) { $tmp=$kstat_cpubanner; $tmp=~s/(\d) X /$1 /g; print "1 " if ($tmp eq $kstat_cpubanner); print "$tmp cpu"; print "s" if ($tmp ne $kstat_cpubanner); print (($sysfreq) ? ", " : "\n"); } elsif ($cpuarr == -1 && ! &is_xen_vm) { @cputypecnt=keys(%cpucnt); $x=0; $ctype=""; while (($cf,$cnt)=each(%cpucnt)) { if ($cpucntflag == 0 && $npcpu == 0 && $cpucntfrom ne "prtdiag") { for $tmp (2,3,4,6,8,10,12,16) { $cnt /= $tmp if ($corecnt == $tmp && $cnt % $tmp == 0); } $cpucntflag=1; } if ($npcpu) { $cnt=$npcpu; } else { $cnt=$ndcpu if ($ndcpu); $cnt=$ncpu if ($cpucntfrom =~ /cpuinfo/); } $x++; $cf=~/^(.*) (\d*)$/; $ctype=$1; $ctype=$cf if (! $ctype); $cfreq=$2; &checkX86; $ctype=&multicore_cputype($ctype,$corecnt) if ($isX86); &multicore_cpu_cnt(""); $ctype="" if ($ctype =~ /^\S*-Core $/); if ($ctype) { print "$cnt $ctype"; if ($cfreq) { print " ${cfreq}MHz" if ($cfreq && $ctype !~ /Hz$/); } print " cpu"; print "s" if ($cnt > 1); print ", " if ($x < scalar(@cputypecnt)); } } print (($sysfreq) ? ", " : "\n") if ($x && $ctype); } print "system freq: ${sysfreq}MHz\n" if ($sysfreq); } else { $modelbuf=""; if ($manufacturer) { $modelbuf .= "$manufacturer " if ($banner !~ /^$manufacturer/ && $model !~ /^$manufacturer/ && ($banner || $model)); } if ($banner && $bannermore) { $modelbuf .= "$banner $bannermore"; } elsif ($modelmore) { $modelbuf .= "$model $modelmore"; } elsif ($banner) { $modelbuf .= "$banner"; } elsif ($diagbanner) { $modelbuf .= "$diagbanner"; } elsif ($model) { $modelbuf .= "$model"; } if ($cpubanner) { if ($modelbuf) { $modelbuf .= " ($cpubanner)"; } else { $modelbuf = "$cpubanner"; } } $modelbuf .= " $realmodel" if ($realmodel); print "$modelbuf\n" if ($modelbuf); } # debug output if ($verbose > 1) { print "banner = $banner\n" if ($banner); print "diagbanner = $diagbanner\n" if ($diagbanner); print "cpubanner = $cpubanner\n" if ($cpubanner); print "bannermore = $bannermore\n" if ($bannermore); print "model = $model\n" if ($model); print "modelmore = $modelmore\n" if ($modelmore); print "machine = $machine\n" if ($machine); print "platform = $platform\n" if ($platform); print "ultra = $ultra\n" if ($ultra); if ($ultra eq "AXi") { print "found10bit = $found10bit\n"; print "found11bit = $found11bit\n"; } print "systemmanufacturer = $systemmanufacturer\n" if ($systemmanufacturer); print "systemmodel = $systemmodel\n" if ($systemmodel); print "boardmanufacturer = $boardmanufacturer\n" if ($boardmanufacturer); print "boardmodel = $boardmodel\n" if ($boardmodel); print "motherboard = $motherboard\n" if ($motherboard); print "romver = $romver\n" if ($romver); print "freephys = $freephys\n" if ($freephys); print "perl version: " . &mychomp($]) . "\n"; print "memory line: $gotmemory\n" if ($gotmemory); print "module info: $gotmodule\n" if ($gotmodule); print "dmidecode version: $dmidecode_ver\n" if ($dmidecode_ver); # Fujitsu GP7000F and PrimePower systems print "cpu name info: $gotcpunames\n" if ($gotcpunames); print "cpu board info: $gotcpuboards\n" if ($gotcpuboards); print "module name info: $gotmodulenames\n" if ($gotmodulenames); print "simmsizes = @simmsizes\n" if ($simmsizes[0]); print "simmsizesfound = @simmsizesfound\n" if ($simmsizesfound[0]); } if ($verbose && $boardfound_cpu) { if ($format_cpu == 1) { print "CPU Units: Frequency Cache-Size Version\n" if ($model =~ /-Enterprise/ || $ultra eq "e"); } else { print "CPU Units:\n"; } if ($model ne "SPARCserver-1000" && $model ne "SPARCcenter-2000") { print @boards_cpu; print "Memory Units:\n" if (! &is_virtualmachine); } } if ($interleave && ! &is_virtualmachine) { print "Memory Interleave Factor: $interleave"; print "-way" if ($interleave =~/^\d+$/); print "\n"; } print "Maximum Memory Bus Speed: $maxmembusspeed\n" if ($maxmembusspeed); } sub show_unrecognized { if ($perlhexbug) { print " This is most likely because Perl V$PERL_VERSION"; print " is buggy in hex number\n conversions. Please"; print " upgrade your perl release to Perl V5.002 or later\n"; print " for best results.\n"; } else { print " This is most likely because memconf $version"; print " does not completely\n recognize this $os"; print " $osrel" if ($osrel); print " $platform system.\n"; &show_request if ($untested == 0); } } sub show_untested { $osname="$os $osrel"; $osname="$os" if ($osrel eq ""); if ($untested_type eq "OS") { print "WARNING: This is an untested $osname operating"; } elsif ($untested_type eq "OBP") { print "ERROR: This is an untested $osname OBP $romvernum"; } elsif ($untested_type eq "CPU") { print "ERROR: This is an untested CPU type on this $osname"; } else { print "ERROR: This is an untested $osname"; } print " system by memconf $version\n"; print " Please let the author know how it works.\n"; $exitstatus=1; &show_request; } sub show_request { print " Check my website at $URL\n"; print " for a newer version of memconf that may recognize this system better.\n"; print " Please run 'memconf -D' to create a tar file of the output from the\n"; print " following commands to send to Tom Schmidt (tschmidt\@micron.com) so\n"; print " memconf $version may be enhanced to properly recognize this system:\n"; print " memconf -d\n"; &show_helpers(" "); if ($untested) { print " If this system is a Sun clone, please also send any hardware\n"; print " documentation on the memory layout that you may have.\n"; } } sub show_supported { &show_total_memory; print "ERROR: memconf $version is not supported on this $os"; print" $osrel $machine system.\n memconf is supported on:\n"; print " Solaris (SunOS 4.X or 5.X) on SPARC\n"; print " Solaris 10 6/06 or later on x86 with /usr/platform/i86pc/sbin/prtdiag\n"; print " Linux on SPARC with sparc-utils and /dev/openprom\n"; print " Linux on x86 and x86_64 with kernel-utils or pmtools for dmidecode\n"; print " FreeBSD on x86 and x86_64 with dmidecode\n"; print " Most HP-UX systems with SysMgmtPlus (cprop) or Support Tools Manager (cstm)\n"; if ($os =~ /Linux|FreeBSD/) { if ($machine =~ /.86|ia64|amd64|sparc/) { if ($config_cmd =~ /dmidecode/) { print "ERROR: dmidecode command was not found. Please install "; print "dmidecode from\n $dmidecodeURL "; print "to fix this issue.\n"; } print "NOTICE: This may be corrected by installing the "; print (($machine =~ /sparc/) ? "sparc-utils" : "kernel-utils or pmtools"); print "\n package if available for this $machine system.\n"; } else { $config_cmd=""; } } print " memconf may be able to process Sun/Oracle Explorer data on this machine.\n"; print " Check my website at $URL\n"; print " for a newer version of memconf that may recognize this system better.\n"; $exitstatus=1; &mailmaintainer if ($verbose == 3); &pdebug("exit $exitstatus"); exit $exitstatus; } sub show_memory { $mem=shift; print "${mem}MB"; if ($mem >= $meg) { print " (", $mem / $meg, "TB)"; } elsif ($mem >= 1024) { print " (", $mem / 1024, "GB)"; } print "\n"; } sub show_memory_label { $mem=shift; return if (! defined($mem)); return "$mem" if ($mem =~ /[MG]B/); return $mem / 1024 . "GB" if ($mem >= 1024); return "${mem}MB"; } sub show_errors { if ($failing_memory) { print "ERROR: Some of the installed memory has failed.\n"; print " You should consider replacing the failed memory.\n"; $exitstatus=1; } if ($unknown_JEDEC_ID) { print "ERROR: An unknown memory manufacturer was detected by memconf.\n"; &show_request; $exitstatus=1; } } sub check_model { &pdebug("in check_model, model=$model, platform=$platform, banner=$banner, diagbanner=$diagbanner"); $modelbanner=$banner; $modelbanner=$diagbanner if ($banner eq "" && $diagbanner ne ""); &find_helpers; # Workaround for broken "uname -i" on Oracle SPARC T3 systems $platform=$model if ($platform eq "sun4v"); if ($filename) { $platform=$model; $platform="SUNW,Ultra-5_10" if ($diagbanner =~ /Sun Ultra 5\/10/); $platform="SUNW,Sun-Fire" if ($diagbanner =~ /Sun Fire ([346]8[01]0|E[246]900)\b/); $platform="SUNW,Sun-Fire-15000" if ($diagbanner =~ /Sun Fire E2[05]K\b/); $platform=~s/-S$// if ($model =~ /Sun-Blade-[12]500-S\b/); if ($prtdiag_cmd =~ /platform/) { $prtdiag_cmd="/usr/platform/$platform/sbin/prtdiag"; $prtdiag_cmd="/usr/platform/sun4v/sbin/prtdiag" if ($platform =~ /ORCL,/); } } $model=~s/.*SUNW,//g; $model=~s/.*ORCL,//g; $model=~s/TWS,//g; $model=~s/CYCLE,//g; $model=~s/Tadpole_//g; $model=~s/ASPX,//g; $model=~s/PFU,//g; $model=~s/FJSV,//g; $model=~s/CompuAdd //g; $model=~s/RDI,//g; $model=~s/\s+$//; $ultra="ultra" if ($ultra eq 0 && ($model =~ /Ultra|Blade|Fire/ || ($machine eq "sun4v" && ! $filename))); if ($model =~ /Fire[- ](X|B[12]00x)/i) { # Sun Fire X??00 Servers, i86pc # Sun B100x or B200x Blade Servers, i86pc $ultra=""; $machine="x86" if ($machine ne "i86pc"); $untested=1; &x86_devname; } $ultra="sparc64" if ($model =~ /SPARC64/); $ultra="e" if ($model =~ /-Enterprise/ && $model !~ /SPARC-Enterprise/); $ultra=1 if ($model =~ /Ultra-1\b/); $ultra=2 if ($model =~ /Ultra-2\b/); $ultra=5 if ($model =~ /Ultra-5\b/); $ultra="5_10" if ($model =~ /Ultra-5_10\b/); $ultra=30 if ($model =~ /Ultra-30\b/); $ultra=60 if ($model =~ /Ultra-60\b/); $ultra=80 if ($model =~ /Ultra-80\b/); $ultra=250 if ($model =~ /Ultra-250\b/); $ultra=450 if ($model =~ /Ultra-4\b/); $ultra="Netra t1" if ($banner =~ /Netra t1\b/); if ($model =~ /Ultra-4FT\b/) { $ultra="Netra ft1800"; $bannermore="(Netra ft1800)"; $modelmore="(Netra ft1800)"; } $ultra="Sun Blade 1000" if ($model =~ /Ultra-100\b/); # prototype $ultra="Sun Blade 1000" if ($model =~ /Sun-Blade-1000\b/); $ultra="Sun Blade 2000" if ($model =~ /Sun-Blade-2000\b/); $ultra="Netra 20" if ($model =~ /Netra-20\b/); $ultra="Netra 20" if ($model =~ /Netra-T4\b/); # E2900/E4900 also use Netra-T12 $ultra="Netra T12" if ($model =~ /Netra-T12\b/ && $ultra !~ /Sun Fire/); $ultra="Sun Blade 100" if ($model =~ /Grover\b/); # prototype $ultra="Sun Blade 100" if ($model =~ /Sun-Blade-100\b/); $ultra="Sun Fire 280R" if ($model =~ /Enterprise-820R\b/); # prototype $ultra="Sun Fire 280R" if ($model =~ /Sun-Fire-280R\b/); $ultra="Sun Fire" if ($model =~ /Serengeti\b/); # prototype $ultra="Sun Fire" if ($model eq "Sun-Fire" || $model =~ /Sun-Fire-[346]8[01]0\b/); $ultra="Sun Fire V480" if ($model =~ /Sun-Fire-480R\b/); $ultra="Sun Fire V490" if ($model =~ /Sun-Fire-V490\b/); $ultra="Sun Fire V880" if ($model =~ /Sun-Fire-880\b/); $ultra="Sun Fire V890" if ($model =~ /Sun-Fire-V890\b/); # Sun Fire 12K, E25K, etc. systems identifies itself as Sun Fire 15K $ultra="Sun Fire 15K" if ($model =~ /Sun-Fire-15000\b/ && $ultra !~ /Sun Fire /); $ultra="Sun Fire 12K" if ($model =~ /Sun-Fire-12000\b/); $ultra="Serverblade1" if ($model =~ /Serverblade1\b/); # UltraSPARC-IIIi (Jalapeno) systems $ultra="Enchilada" if ($model =~ /Enchilada\b/); # prototype $ultra="Enchilada" if ($model =~ /Sun-Fire-V210\b/); $ultra="Enchilada" if ($model =~ /Netra-210\b/); $ultra="Enchilada" if ($model =~ /Sun-Fire-V240\b/); $ultra="Enchilada" if ($model =~ /Netra-240\b/); $ultra="Sun Fire V440" if ($model =~ /Sun-Fire-V440\b/); $ultra="Netra 440" if ($model =~ /Netra-440\b/); $ultra="Sun Fire V250" if ($model =~ /Sun-Fire-V250\b/); $ultra="Sun Blade 1500" if ($model =~ /Sun-Blade-1500\b/); $ultra="Sun Blade 2500" if ($model =~ /Sun-Blade-2500\b/); if ($model =~ /Sun-Blade-[12]500-S\b/) { $model=~s/-S$//; $modelmore="(Silver)" if ($banner !~ /\(Silver\)/); } $ultra="Sun Ultra 45 Workstation" if ($model =~ /Sun-Ultra-45-Workstation\b/ || $model eq "A70"); $ultra="Sun Ultra 25 Workstation" if ($model =~ /Sun-Ultra-25-Workstation\b/ || $model eq "Ultra-25"); $ultra="Sun Ultra 45 or Ultra 25 Workstation" if ($model =~ /Sun-Ultra-45-or-Ultra-25-Workstation\b/); $ultra="Sun Fire V125" if ($model =~ /Sun-Fire-V125\b/); $ultra="Seattle" if ($model =~ /Sun-Fire-V215\b/); $ultra="Seattle" if ($model =~ /Sun-Fire-V245\b/); $ultra="Boston" if ($model =~ /Sun-Fire-V445\b/); # UltraSPARC-IV (Jaguar) or UltraSPARC-IV+ (Panther) systems $ultra="Sun Fire E2900" if ($model =~ /Sun-Fire-E2900\b/); $ultra="Sun Fire E4900" if ($model =~ /Sun-Fire-E4900\b/); $ultra="Sun Fire E6900" if ($model =~ /Sun-Fire-E6900\b/); $ultra="Sun Fire E20K" if ($model =~ /Sun-Fire-(E|Enterprise-)20K\b/); $ultra="Sun Fire E25K" if ($model =~ /Sun-Fire-(E|Enterprise-)25K\b/); # SPARC64-VI or SPARC64-VII systems $ultra=$banner if ($banner =~ /SPARC Enterprise M[34589]000 Server/); # UltraSPARC-T1 (Niagara) systems if ($model =~ /Sun-Fire-T200\b/) { $ultra="T2000"; $modelmore="(Sun Fire T2000)"; } $ultra="T2000" if ($model =~ /Sun-Fire-T2000\b|SPARC-Enterprise-T2000\b|Netra-T2000\b/ || $modelbanner =~ /SPARC Enterprise T2000\b|Netra T2000\b/); $ultra="T1000" if ($model =~ /Sun-Fire-T1000\b|SPARC-Enterprise-T1000\b/ || $modelbanner =~ /SPARC Enterprise T1000/); $ultra="T6300" if ($model =~ /Sun-Blade-T6300\b/ || $modelbanner =~ /\bT6300\b/); # UltraSPARC-T2 (Niagara-II) systems $ultra="T5120" if ($model =~ /SPARC-Enterprise-T5120\b/ || $modelbanner =~ /\bT5120\b/); $ultra="T5220" if ($model =~ /(SPARC-Enterprise|Netra)-T5220\b/ || $modelbanner =~ /\bT5220\b/); $ultra="T6320" if ($model =~ /Sun-Blade-T6320\b/ || $modelbanner =~ /\bT6320\b/); $ultra="CP3260" if ($model =~ /Netra-CP3260\b/ || $modelbanner =~ /\bNetra CP3260\b/); # UltraSPARC-T2+ (Victoria Falls) systems $ultra="T5140" if ($model =~ /\bT5140\b/ || $modelbanner =~ /\bT5140\b/); $ultra="T5240" if ($model =~ /\bT5240\b|-USBRDT-5240\b/ || $modelbanner =~ /\bT5240\b/); $ultra="T5440" if ($model =~ /\bT5440\b|-USBRDT-5440\b/ || $modelbanner =~ /\bT5440\b/); $ultra="T6340" if ($model =~ /Sun-Blade-T6340\b/ || $modelbanner =~ /\bT6340\b/); # SPARC-T3 (Rainbow Falls) systems $ultra="T3-1" if ($model =~ /SPARC-T3-1\b/ || $modelbanner =~ /SPARC T3-1\b/); $ultra="T3-1B" if ($model =~ /SPARC-T3-1B\b/ || $modelbanner =~ /SPARC T3-1B\b/); $ultra="T3-1BA" if ($model =~ /SPARC-T3-1BA\b/ || $modelbanner =~ /SPARC T3-1BA\b/); $ultra="T3-2" if ($model =~ /SPARC-T3-2\b/ || $modelbanner =~ /SPARC T3-2\b/); $ultra="T3-4" if ($model =~ /SPARC-T3-4\b/ || $modelbanner =~ /SPARC T3-4\b/); # SPARC-T4 systems $ultra="T4-1" if ($model =~ /SPARC-T4-1\b/ || $modelbanner =~ /SPARC T4-1\b/); $ultra="T4-1B" if ($model =~ /SPARC-T4-1B\b/ || $modelbanner =~ /SPARC T4-1B\b/); $ultra="T4-2" if ($model =~ /SPARC-T4-2\b/ || $modelbanner =~ /SPARC T4-2\b/); $ultra="T4-2B" if ($model =~ /SPARC-T4-2B\b/ || $modelbanner =~ /SPARC T4-2B\b/); $ultra="T4-4" if ($model =~ /SPARC-T4-4\b/ || $modelbanner =~ /SPARC T4-4\b/); # SPARC-T5 systems $ultra="T5-2" if ($model =~ /SPARC-T5-2\b/ || $modelbanner =~ /SPARC T5-2\b/); $ultra="T5-4" if ($model =~ /SPARC-T5-4\b/ || $modelbanner =~ /SPARC T5-4\b/); $ultra="T5-8" if ($model =~ /SPARC-T5-8\b/ || $modelbanner =~ /SPARC T5-8\b/); $ultra="T5-1B" if ($model =~ /SPARC-T5-1B\b/ || $modelbanner =~ /SPARC T5-1B\b/); # SPARC M5 and M6 systems $ultra="M5-32" if ($model =~ /SPARC-M5-32\b/ || $modelbanner =~ /SPARC M5-32\b/); $ultra="M6-32" if ($model =~ /SPARC-M6-32\b/ || $modelbanner =~ /SPARC M6-32\b/); # Fujitsu SPARC M10 systems $ultra="M10-1" if ($model =~ /SPARC-M10-1\b/ || $modelbanner =~ /SPARC M10-1\b/); $ultra="M10-4" if ($model =~ /SPARC-M10-4\b/ || $modelbanner =~ /SPARC M10-4\b/); $ultra="M10-4S" if ($model =~ /SPARC-M10-4S\b/ || $modelbanner =~ /SPARC M10-4S\b/); # SPARC S7 and M7 systems $ultra="S7-2" if ($model =~ /SPARC-S7-2\b/ || $modelbanner =~ /SPARC S7-2\b/); $ultra="S7-2L" if ($model =~ /SPARC-S7-2L\b/ || $modelbanner =~ /SPARC S7-2L\b/); $ultra="T7-1" if ($model =~ /SPARC-T7-1\b/ || $modelbanner =~ /SPARC T7-1\b/); $ultra="T7-2" if ($model =~ /SPARC-T7-2\b/ || $modelbanner =~ /SPARC T7-2\b/); $ultra="T7-4" if ($model =~ /SPARC-T7-4\b/ || $modelbanner =~ /SPARC T7-4\b/); $ultra="M7-8" if ($model =~ /SPARC-M7-8\b/ || $modelbanner =~ /SPARC M7-8\b/); $ultra="M7-16" if ($model =~ /SPARC-M7-16\b/ || $modelbanner =~ /SPARC M7-16\b/); # Older SPARCstations $modelmore="SPARCstation SLC" if ($model eq "Sun 4/20"); $modelmore="SPARCstation ELC" if ($model eq "Sun 4/25"); $modelmore="SPARCstation IPC" if ($model eq "Sun 4/40"); $modelmore="SPARCstation IPX" if ($model eq "Sun 4/50"); $modelmore="SPARCstation 1" if ($model eq "Sun 4/60"); $modelmore="SPARCstation 1+" if ($model eq "Sun 4/65"); $modelmore="SPARCstation 2" if ($model eq "Sun 4/75"); $modelmore="(SPARCsystem 600)" if ($model =~ /Sun.4.600/ && $banner !~ /SPARCsystem/); $modelmore="Sun 4/30" if ($model =~ /SPARCstation-LX/); $modelmore="Sun 4/15" if ($model =~ /SPARCclassic/); $modelmore="Sun 4/10" if ($model =~ /SPARCclassic-X/); $modelmore="(SPARCstation 10SX)" if ($model =~ /Premier-24/); if ($model eq "S240") { $manufacturer="Sun Microsystems, Inc."; $modelmore="SPARCstation Voyager"; } # x86 &checkX86; if ($isX86) { $modelmore="(Solaris x86 machine)"; $cputype="x86"; $machine=$model; $ultra=0; $cpucntfrom="prtconf" if (! $cpucntfrom); return if ($model_checked); &check_prtdiag if ($use_psrinfo_data == 2); &check_psrinfo; &cpubanner; $cpucnt{"$cputype $cpufreq"}++; } # Clones if ($banner =~ /\bMP-250[(\b]/) { $ultra="axus250"; $bannermore="Ultra-250"; $modelmore="(Ultra-250)"; } $manufacturer="AXUS" if ($ultra =~ /axus/); $manufacturer="Force Computers" if ($model =~ /SPARC CP/); if ($model eq "S3GX") { $bannermore="(SPARCbook 3GX)"; $modelmore="(SPARCbook 3GX)"; } if ($model eq "S3XP") { $bannermore="(SPARCbook 3XP)"; $modelmore="(SPARCbook 3XP)"; } $manufacturer="Sun Microsystems, Inc." if ($banner !~ /Axil/ && ( $model =~ /^SPARCstation|^SPARCsystem|^SPARCclassic/ || $model =~ /^SPARCserver|^SPARCcenter|Enterprise|Premier 24/ || $model =~ /Netra|Sun.Fire|Sun.Blade|Serverblade1/)); # Oracle purchased Sun in 2010, so newer systems bear the Oracle name. $manufacturer="Oracle Corporation" if ($platform =~ /^ORCL,/ && $manufacturer eq "Sun Microsystems, Inc."); if ($model =~ /Auspex/) { $manufacturer="Auspex"; $model=~s/Auspex //g; $bannermore="Netserver"; $modelmore="Netserver"; } $manufacturer="Fujitsu" if ($banner =~ /Fujitsu/); $manufacturer="Fujitsu Siemens" if ($banner =~ /Fujitsu Siemens/); $manufacturer="Fujitsu Siemens Computers" if ($banner =~ /Fujitsu Siemens Computers/); if ($model =~ /S-4|^GPU[SZU]/ || $model eq "GP") { $manufacturer="Fujitsu" if ($manufacturer !~ /^Fujitsu/); $model=~s,_,/,g; $untested=1 if ($model =~ /^GPUSC-L/); $untested=1 if ($model =~ /^GPUU/); } if ($model =~ /PowerLite-/) { $bannermore=$model; $bannermore=~s/PowerLite-//g; } $model_checked=1; } sub check_banner { &pdebug("in check_banner, banner=$banner, ultra=$ultra"); $ultra="ultra" if ($ultra eq 0 && ($banner =~ /Ultra|Blade|Fire/)); $ultra="sparc64" if ($banner =~ /SPARC64/); $ultra=5 if ($banner =~ /Ultra 5\b/); $ultra="5_10" if ($banner =~ /Ultra 5\/10\b/); $ultra=10 if ($banner =~ /Ultra 10\b/); $ultra="220R" if ($banner =~ /Enterprise 220R\b/); $ultra=80 if ($banner =~ /Ultra 80\b/); # E410 is prototype name of E420R, but may still be in the # banner as "Sun Ultra 80/Enterprise 410 UPA/PCI" $ultra="420R" if ($banner =~ /Enterprise 410\b/); $ultra="420R" if ($banner =~ /Enterprise 420R\b/); $ultra="Netra t140x" if ($banner =~ /Netra t 1400\/1405\b/); $ultra="CP1400" if ($banner =~ /Ultra CP 1400\b/); $ultra="CP1500" if ($banner =~ /Ultra CP 1500\b/); $ultra="CP2000" if ($banner =~ /\bCP2000\b/); $ultra="CP2040" if ($banner =~ /\bCP2000 model 40\b/); $ultra="CP2060" if ($banner =~ /\bCP2000 model 60\b/); $ultra="CP2080" if ($banner =~ /\bCP2000 model 80\b/); $ultra="CP2140" if ($banner =~ /\bCP2000 model 140\b/); $ultra="CP2160" if ($banner =~ /\bCP2000 model 160\b/); $ultra="Sun Blade 1000" if ($banner =~ /Sun Excalibur\b/); # prototype $ultra="Sun Blade 2000" if ($banner =~ /Sun Blade 2000\b/); $ultra="Netra ct400" if ($banner =~ /Netra ct400\b/); $ultra="Netra ct410" if ($banner =~ /Netra ct410\b/); $ultra="Netra ct800" if ($banner =~ /Netra ct800\b/); $ultra="Netra ct810" if ($banner =~ /Netra ct810\b/); $ultra="Sun Blade 150" if ($banner =~ /Sun Blade 150\b/); # Sun Fire 12K, E25K, etc. systems identifies itself as Sun Fire 15K $ultra="Sun Fire 12K" if ($banner =~ /Sun Fire (12000|12K)\b/); if ($banner =~ /Ultra 4FT\b/) { $ultra="Netra ft1800"; $bannermore="(Netra ft1800)"; $modelmore="(Netra ft1800)"; } # UltraSPARC-IIIi (Jalapeno) systems $ultra="Sun Ultra 45 Workstation" if ($banner =~ /Sun Ultra 45 Workstation\b/); $ultra="Sun Ultra 25 Workstation" if ($banner =~ /Sun Ultra 25 Workstation\b/); # UltraSPARC-IV (Jaguar) or UltraSPARC-IV+ (Panther) systems $ultra="Sun Fire E2900" if ($banner =~ /Sun Fire E2900\b/); $ultra="Sun Fire E4900" if ($banner =~ /Sun Fire E4900\b/); $ultra="Sun Fire E6900" if ($banner =~ /Sun Fire E6900\b/); $ultra="Sun Fire E20K" if ($banner =~ /Sun Fire E20K\b/); $ultra="Sun Fire E25K" if ($banner =~ /Sun Fire E25K\b/); # SPARC64-VI or SPARC64-VII systems $ultra=$banner if ($banner =~ /SPARC Enterprise M[34589]000 Server/); # Clones if ($banner =~ /\bMP-250[(\b]/) { $ultra="axus250"; $bannermore="Ultra-250"; $modelmore="(Ultra-250)"; } $manufacturer="Sun Microsystems, Inc." if ($banner =~ /Sun |Netra /); $manufacturer="AXUS" if ($ultra =~ /\baxus\b/); $manufacturer="Rave" if ($banner =~ /Axil/); $manufacturer="Tadpole/Cycle" if ($banner =~ /Cycle|\bUP-20\b|\b520IIi\b/); $manufacturer="Tadpole" if ($banner =~ /Tadpole|\bRDI\b|\bVoyagerIIi\b|\bSPARCLE\b/); $manufacturer="Tatung" if ($banner =~ /COMPstation/); $manufacturer="Twinhead" if ($banner =~ /TWINstation/); $manufacturer="Fujitsu" if ($banner =~ /Fujitsu/); $manufacturer="Fujitsu Siemens" if ($banner =~ /Fujitsu Siemens/); $manufacturer="Fujitsu Siemens Computers" if ($banner =~ /Fujitsu Siemens Computers/); } sub check_for_prtdiag { return if (! $prtdiag_exec && ! $filename); return if ($have_prtdiag_data); &find_helpers; # Check for LDOMs if ($ldm_cmd && ! $have_ldm_data) { # Warn that ldm and prtdiag may take a while to run &please_wait; @ldm=&run("$ldm_cmd list-devices -a -p"); $have_ldm_data=1; foreach $line (@ldm) { $line=&dos2unix($line); $line=&mychomp($line); &check_LDOM; } } @prtdiag=&run("$prtdiag_exec") if (! $filename); $have_prtdiag_data=1; foreach $line (@prtdiag) { $line=&dos2unix($line); # Some Solaris prtdiag outputs have malformed header, so # handle them also. if ($line =~ /^System Configuration: +|.BIOS Configuration: |Sun Microsystems .*Fire *X|Sun Microsystems *X|Sun Microsystems .*Blade *X|Sun Microsystems .*Memory size: |^Oracle Corporation/i || ($line =~ /Sun Microsystems .*Ultra / && $machine eq "i86pc")) { $line=&mychomp($line); $tmp=$line; $line=~s/System Configuration: +//g; $line=~s/BIOS Configuration: .*//g; if ($line =~ /^Sun Microsystems/i) { $manufacturer="Sun Microsystems, Inc." if ($line !~ / i86pc$/); if ($tmp =~ /System Configuration: *W[12]00z/ && ! $model && $machine eq "i86pc") { $diagbanner=$line; $diagbanner=~s/^.* Inc\. *(.*)/$1/; } } elsif ($line =~ /^Oracle /i) { $manufacturer="Oracle Corporation" if ($line !~ / i86pc$/); } elsif ($line =~ /Inc\./i) { $manufacturer=$line; $manufacturer=~s/^(.* Inc\.).*/$1/i; if ($tmp !~ /BIOS Configuration: / && ! $model && $machine eq "i86pc") { $diagbanner=$line; $diagbanner=~s/^.* Inc\. *(.*)/$1/; } } elsif ($line =~ /Corporation/i) { $manufacturer=$line; $manufacturer=~s/^(.* Corporation).*/$1/i; if ($tmp !~ /BIOS Configuration: / && ! $model && $machine eq "i86pc") { $diagbanner=$line; $diagbanner=~s/^.* Corporation *(.*)/$1/; } } elsif ($line !~ /(To Be Filled|System Manufacturer)/i) { $manufacturer=$line; $manufacturer=~s/^(\w+)[ \/].*/$1/; } foreach $tmp ("Sun Microsystems, Inc.","Sun Microsystems","Oracle Corporation") { if ($line =~ /^$tmp +sun\w+ +/) { $diagbanner=$line; $diagbanner=~s/$tmp +sun\w+ +//g; $diagbanner=~s/Memory size: .*$//g; } elsif ($line =~ /^$tmp *Sun +/i) { $diagbanner=$line; $diagbanner=~s/$tmp *Sun/Sun/ig; $diagbanner=~s/Memory size: .*$//g; $diagbanner=~s/ BLADE / Blade /g; $diagbanner=~s/ FIRE / Fire /g; $diagbanner=~s/ SERVER\b/ Server /g; $diagbanner=~s/ MODULE*\b/ Module /g; $diagbanner=~s/ */ /g; } elsif ($line =~ /^$tmp.*Ultra/i) { $diagbanner=$line; $diagbanner=~s/$tmp.*Ultra/Ultra/ig; $diagbanner=~s/Memory size: .*$//g; } elsif ($line =~ /^$tmp *W[12]100z/i) { $diagbanner=$line; $diagbanner=~s/$tmp *//ig; } $diagbanner=~s/\s+$//; } } $prtdiag_failed=1 if ($line =~ /Prtdiag Failed/i); # prtdiag only works on the global zone, so find out # if we are in a Solaris zone. solaris8 brand container shows # kernel version of "Generic_Virtual" $prtdiag_failed=2 if ($line =~ /prtdiag can only be run in the global /i || $kernver eq "Generic_Virtual"); } if ($psrinfo_cmd && ! $have_psrinfo_data) { @psrinfo=&run("$psrinfo_cmd -v"); $tmp=&mychomp(`$psrinfo_cmd -p 2>/dev/null`); # physical CPUs if ($tmp) { push(@psrinfo, "#psrinfo -p\n$tmp\n"); $tmp=&mychomp(`$psrinfo_cmd -p -v 2>/dev/null`); push(@psrinfo, "#psrinfo -p -v\n$tmp\n"); } $have_psrinfo_data=1; } if ($ipmitool_cmd && ! $have_ipmitool_data) { @ipmitool=&run("$ipmitool_cmd fru"); $have_ipmitool_data=1; } if ($smbios_cmd && ! $have_smbios_data) { @smbios=&run("$smbios_cmd"); $have_smbios_data=1; } if ($kstat_cmd && ! $have_kstat_data) { @kstat=&run("$kstat_cmd"); $have_kstat_data=1; } if (! $filename && $verbose == 3) { # Only run the following commands if E-mailing maintainer since # this data is used by memconf only for some systems if ($prtpicl_cmd && ! $have_prtpicl_data) { @prtpicl=&run("$prtpicl_cmd -v"); $have_prtpicl_data=1; } if ($virtinfo_cmd && ! $have_virtinfo_data) { @virtinfo=&run("$virtinfo_cmd -pa"); $have_virtinfo_data=1; } if ($cfgadm_cmd && ! $have_cfgadm_data) { @cfgadm=&run("$cfgadm_cmd -al"); $have_cfgadm_data=1; } if ($ldm_cmd && ! $have_ldm_data) { @ldm=&run("$ldm_cmd list-devices -a -p"); $have_ldm_data=1; } } } sub add_to_sockets_used { $_=shift; # strip leading slash for matching $_=~s/^\///; if ($sockets_used !~ /$_/) { $sockets_used .= "," if ($sockets_used && /\s/); $sockets_used .= " $_"; # &pdebug("in add_to_sockets_used, added $_"); } } sub add_to_sockets_empty { $_=shift; $sockets_empty .= "," if ($sockets_empty && /\s/); $sockets_empty .= " $_"; } sub check_prtdiag { return if ($prtdiag_checked); &pdebug("in check_prtdiag"); $prtdiag_checked=1; return if (! $prtdiag_exec && ! $filename); &check_for_prtdiag; if ($diagbanner =~ /W1100z\b/i) { $model=$diagbanner if ($model eq "i86pc"); } $flag_cpu=0; $flag_mem=0; $build_socketstr=0; foreach $line (@prtdiag) { $line=&dos2unix($line); if ($line =~ /====|\/ \(picl,|= 2) { if ($linearr[2] =~ /\bU\d\d\d\d\b/) { # Sun Ultra-250 format $sockets_used .= " $linearr[2]"; } elsif ($linearr[2] =~ /\b\d\d\d\d\b/) { # Sun Ultra-4 format $sockets_used .= " U$linearr[2]"; } } if ($#linearr >= 3) { if ($linearr[3] ne "BankIDs" && $linearr[3] ne "GroupID" && $line !~ /^0x\d[\d ]+\d.+ +\d +-$/) { if ($linearr[1] =~ /\b\d+MB\b/) { # Sun Blade 100/1000 format $simmsize=$linearr[1]; $simmsize=~s/MB//g; push(@simmsizesfound, "$simmsize"); } elsif ($linearr[1] =~ /\b\d+GB\b/) { # Sun Blade 1000 format $simmsize=$linearr[1]; $simmsize=~s/GB//g; $simmsize *= 1024; push(@simmsizesfound, "$simmsize"); } } if ($model eq "Ultra-250" || $ultra eq 250 || $model eq "Ultra-4" || $ultra eq 450 || $model eq "Ultra-4FT" || $ultra eq "Netra ft1800") { if ($linearr[3] =~ /\b\d+\b/) { $simmsize=$linearr[3]; push(@simmsizesfound, "$simmsize"); } } } if ($#linearr >= 2) { if ($linearr[$#linearr] =~ /\bDIMM\d/ && $linearr[$#linearr - 1] =~ /\bCPU\d/) { $socket="$linearr[$#linearr - 1]_$linearr[$#linearr]"; &add_to_sockets_used("$socket") if ($linearr[1] ne "empty"); $build_socketstr=1 if ($#socketstr == 0); push(@socketstr, ("$socket")) if ($build_socketstr); } elsif ($linearr[$#linearr - 2] =~ /\bDIMM\d|_DIMM\d/ && $linearr[$#linearr - 1] =~ /\bBank\b/i) { # Ultra40 and JavaWorkstation $socket="$linearr[$#linearr - 2] $linearr[$#linearr - 1] $linearr[$#linearr]"; &add_to_sockets_used("$socket") if ($linearr[1] ne "empty"); $build_socketstr=1 if ($#socketstr == 0); push(@socketstr, ("$socket")) if ($build_socketstr); } elsif ($linearr[$#linearr] =~ /\b(DIMM\d|[UJ]\d\d\d\d[\b,])/ || ($linearr[$#linearr - 1] eq "Label" && $linearr[$#linearr] eq "-")) { $sockets_used .= " $linearr[$#linearr]"; # May be multiple sockets separated by "," $sockets_used=~s/,/ /g; } elsif ($linearr[2] =~ /MB\/P[01]\/B[01]\/D[01]|C[0-3]\/P[01]\/B[01]\/D[01]/) { $sockets_used .= " $linearr[2]"; # May be multiple sockets separated by "," $sockets_used=~s/,/ /g; } } if ($linearr[0] !~ /^0x/ && ($linearr[$#linearr] eq "-" || $linearr[$#linearr] =~ /^-,/)) { # unlabeled sockets $sockets_used .= " $linearr[$#linearr]"; # May be multiple sockets separated by "," $sockets_used=~s/,/ /g; } if ($linearr[$#linearr] =~ /\/J\d\d\d\d$/) { $linearr[$#linearr]=~s/.+\///g; $sockets_used .= " $linearr[$#linearr]"; } if ($ultra eq "Sun Fire 280R") { if ($line =~ / CA +0 +[0-3] .+4-way/) { $sockets_used="J0100 J0202 J0304 J0406 J0101 J0203 J0305 J0407"; } elsif ($line =~ / CA +0 +[02] /) { $sockets_used .= " J0100 J0202 J0304 J0406" if ($sockets_used !~ / J0100 /); } elsif ($line =~ / CA +[01] +[13] /) { $sockets_used .= " J0101 J0203 J0305 J0407" if ($sockets_used !~ / J0101 /); } } # Memory on Sun Fire systems if ($line =~ /^\/N\d\/SB\d\/P\d\/B\d\b/) { $boardslot_mem=substr($line,0,13); push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } elsif ($line =~ /^\/N\d\/SB\d\d\/P\d\/B\d\b/) { $boardslot_mem=substr($line,0,14); push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } elsif ($line =~ /^\/SB\d\d\/P\d\/B\d\b/) { $boardslot_mem=substr($line,0,11); push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d\b,/) { $boardslot_mem=substr($line,24,51); push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d\b/) { $boardslot_mem=substr($line,24,12); push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } if ($ultra =~ /Sun Fire/ && $#linearr >= 5) { if ($linearr[5] =~ /\d+MB/) { $simmsize=$linearr[5]; $simmsize=~s/MB//g; push(@simmsizesfound, "$simmsize"); } } if ($ultra =~ /Sun Fire V[48][89]0\b/) { # Fire V480, V490, V880, V890 $bankname="groups"; if ($banks_used ne "A0 A1 B0 B1") { $banks_used="A0 B0" if ($line =~ /^ ?[ABCD] .+ 4-way /); $banks_used="A0 A1 B0 B1" if ($line =~ /^ ?[ABCD] .+ 8-way /); } } if ($linearr[$#linearr] =~ /MB\/CMP0\/CH[0-3]\/R[01]\/D[01]/) { # UltraSPARC-T1 systems if ($#linearr >= 5) { if ($linearr[5] eq "MB") { $simmsize=$linearr[4]; $simmsize=~s/MB//g; $simmsize /= 2; push(@simmsizesfound, "$simmsize"); } elsif ($linearr[5] eq "GB") { $simmsize=$linearr[4]; $simmsize=~s/GB//g; $simmsize *= 512; push(@simmsizesfound, "$simmsize"); } if ($linearr[2] eq "MB") { $prtdiag_memory += $linearr[1]; } elsif ($linearr[2] eq "GB") { $prtdiag_memory += $linearr[1] * 1024; } $installed_memory=$prtdiag_memory if ($prtdiag_memory); } $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /MB\/CMP[0-3]\/BR[0-3]\/CH[01]\/D[01]|MB\/CMP[0-3]\/MR[01]\/BR[01]\/CH[01]\/D[23]/) { # UltraSPARC-T2 systems: T5120, T5220, T6320 # UltraSPARC-T2+ systems: T5140, T5240, T5440 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /MB\/CPU[0-3]\/CMP[0-3]\/BR[01]\/CH[01]\/D[01]|MB\/MEM[0-3]\/CMP[0-3]\/BR[01]\/CH[01]\/D[01]/) { $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /MB\/CMP[01]\/BOB[0-3]\/CH[01]\/D[01]/) { # SPARC T3-1, T3-1B, T4-1 or T4-1B $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /MB\/CMP[01]\/MR[01]\/BOB[01]\/CH[01]\/D[01]/) { # SPARC T3-2, T4-2 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /PM[01]\/CMP[01]\/BOB[0-3]\/CH[01]\/D[01]/) { # SPARC T3-4, T4-4 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/MB\/CM[01]\/CMP\/MR[0-3]\/BOB[01]\/CH[01]\/D[01]/) { # SPARC T5-2 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/PM[0-3]\/CM[01]\/CMP\/BOB[0-7]\/CH[01]\/D[01]/) { # SPARC T5-4, T5-8 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/MB\/CM0\/CMP\/BOB[0-7]\/CH[01]\/D[01]/) { # SPARC T5-1B $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/CMU\d+\/CMP\d+\/D\d+/) { # SPARC M5-32, M6-32 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/MBU\/CMP0\/MEM[01][0-3][AB]/) { # Fujitsu SPARC M10-1 $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /BB\d+\/CMU[LU]\/CMP[01]\/MEM[01][0-7][AB]/) { # Fujitsu SPARC M10-4, M10-4S (guess) $sockets_used .= " $linearr[$#linearr]"; } if ($linearr[$#linearr] =~ /SYS\/MB\/CMP\d+\/MCU\d+\/CH\d+\/D\d+/) { # SPARC S7-2, S7-2L $sockets_used .= " $linearr[$#linearr]"; } } if ($line =~ /CPU Units:/) { $flag_cpu=1; # Start of CPU section $flag_mem=0; # End of memory section $format_cpu=1; } if ($line =~ /==== (CPU|Processor Sockets |Virtual CPU)/) { $flag_cpu=1; # Start of CPU section $flag_mem=0; # End of memory section $format_cpu=2; } if ($line =~ /Memory Units:|==== Memory |==== Physical Memory |Used Memory:/) { $flag_cpu=0; # End of CPU section $flag_mem=1; # Start of memory section } if ($line =~ /CPU Units:/ && $line =~ /Memory Units:/) { $flag_cpu=1; # Start of CPU section $flag_mem=1; # Start of memory section } if ($flag_cpu && $line !~ /^\s*\n$/) { if ($model eq "Ultra-5_10" || $ultra eq "5_10" || $ultra eq 5 || $ultra eq 10) { $newline=$line; $newline=~s/^ //g if ($line !~ /Run Ecache CPU CPU/); push(@boards_cpu, "$newline"); } else { push(@boards_cpu, "$line"); } $boardfound_cpu=1; &checkX86; if ($flag_cpu == 2 && $isX86) { # Solaris x86 CPU type found in prtdiag $cputype2=&mychomp($line); # Remove multiple spaces before some Xeon models $cputype2=~s/\s\s+([ELWX][3-9])/ $1/; $cputype2=~s/\s\s+.*//; $cputype2=~s/(^.* Processor \d+) .*/$1/; $cputype2=&cleanup_cputype($cputype2); &x86multicorecnt($cputype2); # rewrite %cpucnt $cputype2 $cfreq=0; while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d+)$/; if (defined($2)) { $cfreq=$2; delete $cpucnt{"$1 $2"}; } else { delete $cpucnt{"$cf"}; } } $ndcpu++; if ($cpucntfrom ne "psrinfo") { $cpucntfrom="prtdiag"; $cpucntflag=1; $ncpu++ if ($filename); } $cputype=$cputype2 if ($cputype2); $cputype=$cputype_prtconf if (($cputype eq "AMD" || $cputype eq "Opteron") && $cputype_prtconf); $cputype=$cputype_psrinfo if ($cputype_psrinfo); $cpucnt{"$cputype $cfreq"}=$ncpu; } # CPUs on Sun Fire systems if ($line =~ /^\/N\d\/SB\d\/P\d\b/) { $boardslot_cpu=substr($line,0,10); push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; } elsif ($line =~ /^\/N\d\/SB\d\d\/P\d\b/) { $boardslot_cpu=substr($line,0,11); push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; } elsif ($line =~ /^\/SB\d\d\/P\d\b/) { $boardslot_cpu=substr($line,0,8); push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; &prtdiag_threadcount(1); } elsif ($line =~ /^ SB\d\/P\d\b/) { $boardslot_cpu=substr($line,4,6); push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; # prtdiag does not show cpuid or cputype } elsif ($line =~ / SB\d\/P\d$/) { $boardslot_cpu=substr($line,length($line)-7,6); push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; &prtdiag_threadcount(0); } } if ($flag_cpu && $line =~ /------/) { # Next lines are the CPUs on each system board $flag_cpu=2; } if ($flag_mem && $line =~ /------/) { # Next lines are the memory on each system board $flag_mem=2; } if ($filename && $use_psrinfo_data) { # May have "psrinfo -v" output in regression test file if ($line =~ /.+ operates at \d+ MHz/) { $cpufreq=&mychomp($line); $cpufreq=~s/.+ operates at //; $cpufreq=~s/ MHz.+//; $cpucntfrom="psrinfo" if ($cpucntfrom ne "ldm"); $cpucntflag="0"; # reset flag $psrcpucnt++; # rewrite %cpucnt $cputype with frequency while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d+)$/; $tmp=$1; if (defined($tmp)) { delete $cpucnt{"$1 $2"} if ($2 == 0); } } if (defined($tmp)) { $cpucnt{"$tmp $cpufreq"}=$psrcpucnt; $ncpu=$psrcpucnt; } } # May have "psrinfo -p -v" output in regression test # file that has more detailed information about the # CPUs. Assumes all CPUs are same. $foundpsrinfocpu=1 if ($line =~ /.+ \d+ virtual processor/); if ($foundpsrinfocpu && (($line =~ /.+Hz$/ && $line !~ /Speed: / && $line !~ / PCI/) || $line =~ /\bAMD .* Processor /) && $line !~ / x86 /) { $cputype=&mychomp($line); $cputype=&cleanup_cputype($cputype); $cputype=~s/^Version:\s+//; $cputype=~s/^brand\s+//; $cputype=~s/^:brand-string\s+//; # rewrite %cpucnt $cputype with cputype while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d+)$/; $cpufreq=$2; delete $cpucnt{"$1 $2"}; } $cpucnt{"$cputype $cpufreq"}=$psrcpucnt; } } if ($filename && $filename !~ /Sun/ && $line =~ /^ *Manufacturer:/ && $manufacturer =~ /^Sun\b/ && $diagbanner !~ /^Sun\b|^Ultra/) { # Regression test file with smbios output $manufacturer=&mychomp($line); $manufacturer=~s/^.*Manufacturer: *//; $manufacturer=~s/\s*$//g; &pdebug("in check_prtdiag, smbios manufacturer=$manufacturer"); } } # Rewrite prtdiag output to include DIMM information on SB1X00, SB2X00, # Enchilada, Chalupa (Sun Fire V440), Netra T12, Seattle and Boston # systems @new_boards_mem=""; $grpcnt=0; $intcnt=0; if ($ultra =~ /Sun Blade [12][05]00\b/ || $ultra eq "Sun Fire 280R" || $ultra eq "Netra 20" || $ultra eq "Sun Fire V250" || $ultra eq "Netra T12") { foreach $line (@boards_mem) { $line=&mychomp($line); $newline=$line; if ($line eq "-----------------------------------------------------------" && ! $prtdiag_banktable_has_dimms) { $newline=$line . "------"; } elsif ($line eq "--------------------------------------------------") { $newline=$line . "-----------"; } elsif ($line =~ /ControllerID GroupID Size/ && ! $prtdiag_banktable_has_dimms) { $newline="ID ControllerID GroupID Size DIMMs Interleave Way"; } elsif ($line =~ /ControllerID GroupID Labels Status/) { $newline=$line . " DIMMs"; } elsif ($line =~ /ControllerID GroupID Labels/) { $newline=$line . " DIMMs"; } elsif ($line =~ /ControllerID GroupID Size Labels/) { $newline=$line . " DIMMs"; } elsif ($line =~ /^\d[\d ] \d[\d ] \d /) { &read_prtdiag_bank_table; } elsif ($line =~ /^0x\d[\d ]+\d.+ +\d +-$| GroupID \d[\d ]$/) { &read_prtdiag_memory_segment_table; } elsif ($line =~ /J0100,/) { $sz=$grpsize{0,0}; if (defined($sz)) { $sz=~s/ //g; $newline=$line . " 4x$sz"; } } elsif ($line =~ /J0101,/) { $sz=$grpsize{0,1}; if (defined($sz)) { $sz=~s/ //g; $newline=$line . " 4x$sz"; } } elsif ($line =~ /\/J0[1-4]0[0246]\b/) { $sz=$grpsize{0,0}; if (defined($sz)) { $sz=~s/ //g; $newline=$line . " $sz"; } } elsif ($line =~ /\/J0[1-4]0[1357]\b/) { $sz=$grpsize{0,1}; if (defined($sz)) { $sz=~s/ //g; $newline=$line . " $sz"; } } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d,/) { $tmp=substr($line,0,2); $tmp=~s/ //g; $sz=$grpsize{$tmp,substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $sz=~s/ //g; $newline=$line . " 4x$sz"; } } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d\b/) { $tmp=substr($line,0,2); $tmp=~s/ //g; $sz=$grpsize{$tmp,substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $sz=~s/ //g; $newline=$line . " $sz"; } } elsif ($line =~ / MB\/DIMM\d,/) { $sz=$grpsize{0,substr($line,15,1)}; $newline=$line . " 2x$sz" if (defined($sz)); } elsif ($line =~ /DIMM\d,DIMM\d/) { @linearr=split(' ', $line); if ($linearr[2] =~ /\d+[MG]B/) { $sz=$linearr[2]; if ($sz =~ /\dGB/) { $sz=~s/GB//g; $sz *= 512; } else { $sz=~s/MB//g; $sz /= 2; } $sz=&show_memory_label($sz); } $newline=$line . " 2x$sz" if (defined($sz)); if ($line =~ /DIMM[13],DIMM[24]/ && $ultra eq "Sun Blade 1500") { # prototype has sockets DIMM1-DIMM4 @socketstr=("DIMM1".."DIMM4"); } if ($line =~ /DIMM[1357],DIMM[2468]/ && $ultra eq "Sun Blade 2500") { # prototype has sockets DIMM1-DIMM8 if ($line =~ /DIMM[13],DIMM[24]/) { @socketstr=("DIMM1".."DIMM4"); } elsif ($line =~ /DIMM[57],DIMM[68]/) { push(@socketstr, "DIMM5".."DIMM8"); } } } push(@new_boards_mem, "$newline\n") if ($newline); } @boards_mem=@new_boards_mem; $memfrom="prtdiag"; } elsif ($ultra eq "Enchilada" || $ultra eq "Sun Fire V440" || $ultra eq "Netra 440" || $ultra =~ /Sun Ultra [24]5 .*Workstation/ || $ultra eq "Sun Fire V125" || $ultra eq "Seattle" || $ultra eq "Boston" || $banner =~ /Sun Fire E[24]900\b/ || $diagbanner =~ /Sun Fire E[24]900/) { foreach $line (@boards_mem) { $line=&mychomp($line); $newline=$line; if ($line eq "-----------------------------------------------------------" && ! $prtdiag_banktable_has_dimms) { $newline=$line . "------"; } elsif ($line eq "--------------------------------------------------") { $newline=$line . "-----------"; } elsif ($line =~ /ControllerID GroupID Size/ && ! $prtdiag_banktable_has_dimms) { $newline="ID ControllerID GroupID Size DIMMs Interleave Way"; } elsif ($line =~ /ControllerID GroupID Labels Status/) { $newline=$line . " DIMMs"; } elsif ($line =~ /ControllerID GroupID Labels/) { $newline=$line . " DIMMs"; } elsif ($line =~ /^\d[\d ] \d[\d ] \d /) { &read_prtdiag_bank_table; } elsif ($line =~ /^0x\d[\d ]+\d.+ +\d +-$| GroupID \d[\d ]$/) { &read_prtdiag_memory_segment_table; } elsif ($line =~ / MB\/P[01]\/B[01]\/D[01],|C[0-3]\/P[01]\/B[01]\/D[01],/) { $sz=$grpsize{substr($line,0,1),substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $newline=$line . " 2x$sz"; } else { $newline=$line . " Failing"; $failing_memory=1; } } elsif ($line =~ / MB\/P[01]\/B[01]\/D[01]\b|C[0-3]\/P[01]\/B[01]\/D[01]\b/) { $sz=$grpsize{substr($line,0,1),substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $sz=~s/ //g; $sz=&show_memory_label($sz); } $space=" "; $space="" if ($line =~ / okay/); if ($line =~ / failed/) { if (defined($sz)) { $failed_memory += $sz; } else { $failing_memory=1; } } if (defined($sz)) { # If interleave factor is 16, then print 4x$sz if (defined($grpinterleave{substr($line,28,1),0})) { if ($grpinterleave{substr($line,28,1),0} eq "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" && ! $prtdiag_banktable_has_dimms) { $newline=$line . "$space 4x$sz"; } else { $newline=$line . "$space $sz"; } } else { $newline=$line . "$space $sz"; } } } elsif ($line =~ / MB\/DIMM[0-7]\b/) { $sz=$grpsize{substr($line,0,1),substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); $newline=$line . " $sz" if (defined($sz)); } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d,/) { $tmp=substr($line,0,2); $tmp=~s/ //g; $sz=$grpsize{$tmp,substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $sz=~s/ //g; $newline=$line . " 4x$sz"; } } elsif ($line =~ /\bSB\d\/P\d\/B\d\/D\d\b/) { $tmp=substr($line,0,2); $tmp=~s/ //g; $sz=$grpsize{$tmp,substr($line,15,1)}; $sz=$grpsize{0,substr($line,15,1)} if (! defined($sz)); if (defined($sz)) { $sz=~s/ //g; $newline=$line . " $sz"; } } push(@new_boards_mem, "$newline\n") if ($newline); } @boards_mem=@new_boards_mem; $memfrom="prtdiag"; } # Rewrite prtdiag output to exclude redundant labels @new_boards_mem=""; $flag_group=0; foreach $line (@boards_mem) { $line=&mychomp($line); $newline=$line; $flag_group++ if ($line =~ /Memory Module Groups:/); if ($flag_group ge 2) { $newline="" if ($line =~ /Memory Module Groups:|--------------------------------------------------|ControllerID GroupID/); } push(@new_boards_mem, "$newline\n") if ($newline); } if ($machine eq "sun4v" && $cputype !~ /UltraSPARC-T1$/) { if ($prtpicl_cmd && ! $have_prtpicl_data) { # Warn that prtpicl may take a while to run &please_wait; @prtpicl=&run("$prtpicl_cmd -v"); $have_prtpicl_data=1; } &check_prtpicl if ($have_prtpicl_data); if ($picl_foundmemory) { @new_boards_mem=""; $memfrom="prtpicl"; $picl_bank_cnt=scalar(keys %picl_mem_bank); if (scalar(keys %picl_mem_dimm) == 1 || $picl_bank_cnt > 1) { while (($socket,$simmsize)=each(%picl_mem_bank)) { if (scalar(keys %picl_mem_pn) == $picl_bank_cnt * 2 || $interleave == 8) { # CH1 was not listed $simmsize /= 2; $picl_mem_dimm{"$socket"}=$simmsize; $socket=~s/CH0/CH1/g; $picl_mem_dimm{"$socket"}=$simmsize; &add_to_sockets_used($socket); } else { $picl_mem_dimm{"$socket"}=$simmsize; } } } while (($socket,$simmsize)=each(%picl_mem_dimm)) { $pn=$picl_mem_pn{"$socket"}; $sz=&show_memory_label($simmsize); $newline="socket $socket has a "; $newline .= $pn . " " if (defined($pn)); $newline .= $sz . " " if (defined($sz)); $newline .= "$memtype"; push(@new_boards_mem, "$newline\n"); push(@simmsizesfound, $simmsize) if (defined($sz)); } @new_boards_mem=sort alphanumerically @new_boards_mem; } elsif ($flag_rewrite_prtdiag_mem) { # Hack: Rewrite prtdiag output better than original if ($sockets_used =~ /MB\/CMP[0-3]\/BR[0-3]\/CH[01]\/D1/) { # All 16 DIMMs are installed @new_boards_mem=""; if ($sockets_used !~ /MB\/CMP[0-3]\/BR[0-3]\/CH1\/D[01]/) { foreach $line (@boards_mem) { $line=&mychomp($line); $newline=$line; if ($line =~ /MB\/CMP[0-3]\/BR[0-3]\/CH0\/D[01]/) { $line=~s/\s+$//; $tmp=$line; $tmp=~s/^.*(MB\/CMP.*)/$1/; $tmp=~s/CH0/CH1/g; $space=""; $space=" " if ($line =~ /^MB\/CMP/); $newline="$space$line,$tmp"; } push(@new_boards_mem, "$newline\n") if ($newline); } } $sockets_used=""; for ($cnt=0; $cnt <= $#socketstr; $cnt++) { $sockets_used .= " $socketstr[$cnt]"; } $simmsize=$installed_memory / 16; } else { # 8-DIMMs or 4-DIMMs are installed. # Hack: assume 4-DIMM configuration since # 8-DIMM has prtpicl output. @new_boards_mem=""; foreach $line (@boards_mem) { $line=&mychomp($line); $newline=$line; if ($line =~ /MB\/CMP[0-3]\/BR[0-3]\/CH0\/D[01]/) { $line=~s/\s+$//; $space=""; $space=" " if ($line =~ /^MB\/CMP/); $newline="$space$line"; } push(@new_boards_mem, "$newline\n") if ($newline); } $simmsize=$installed_memory / 4; } # Round up DIMM value $simmsize=&roundup_memory($simmsize); push(@simmsizesfound, $simmsize); } else { $tmp=0; foreach $socket (sort split(' ', $sockets_used)) { $tmp++; } if ($tmp) { # Round up DIMM value $simmsize=&roundup_memory($installed_memory / $tmp); push(@simmsizesfound, $simmsize); } } } @boards_mem=@new_boards_mem; # &pdebug("sockets_used=$sockets_used"); } sub prtdiag_threadcount { $arg=shift; # column with thread count $diagthreadcnt++; $tmp=$line; $tmp=~s/,\s+/,/; @linearr=split(' ', $tmp); $cputype=$linearr[4]; $cputype=~s/SUNW,U/U/; $cpufreq=$linearr[1+$arg]; if ($line =~ /\bUS-/) { $cputype=~s/US-/UltraSPARC-/; $cpufreq=$linearr[2]; } $cputype=~s/UltraSPARC-IV/Dual-Core UltraSPARC-IV/; $diagcpucnt{"$cputype $cpufreq"}++; if ($linearr[$arg] =~ /,/) { $tmp=$linearr[$arg]; @linearr=split(',', $tmp); $diagthreadcnt += $#linearr; } $cpucntfrom="prtdiag"; } sub check_prtpicl { &pdebug("in check_prtpicl"); $flag_mem_seg=0; $flag_mem_bank=0; $flag_mem_chan=0; $flag_mem_mod=0; $flag_physical_platform=0; $processorbrd=""; $cpumembrd=""; $mem_riser=""; $mem_cu=""; $picl_dimm_per_bank=0; $max_picl_dimm_per_bank=0; $has_picl_mem_mod=0; foreach $line (@prtpicl) { $line=&dos2unix($line); $line=&mychomp($line); $line=~s/\s+$//; if ($line =~ /^\s+:Label\s+PM[01]/) { # SPARC T3-4, T4-4 $processorbrd=$line; $processorbrd=~s/^.*:Label\s+(.*)$/$1/; } if ($line =~ /^\s+:Label\s+CM[0-3]/) { # SPARC T5-2, T5-4, T5-8, T5-1B $cpumembrd=$line; $cpumembrd=~s/^.*:Label\s+(.*)$/$1/; } if ($line =~ /^\s+:Label\s+(CPU[0-3]|MEM[0-3])/) { $cpumembrd=$line; $cpumembrd=~s/^.*:Label\s+(.*)$/$1\//; } if ($line =~ /^\s+:Label\s+CMP[0-3]/) { $cmp=$line; $cmp=~s/^.*:Label\s+(.*)$/$1/; } if ($line =~ /\s+:name\s+memory-module/) { $flag_mem_mod=0; # End of memory module section &add_to_sockets_used($mem_dimm); } if (($line =~ /^\s+\w.*/ && $line !~ /^\s+memory-/ && $has_picl_mem_mod) || ($line =~ /\s+:name\s/ && ! $has_picl_mem_mod)) { $flag_mem_seg=0; $max_picl_dimm_per_bank=$picl_dimm_per_bank if ($picl_dimm_per_bank); if ($flag_mem_mod && $mem_dimm !~ /\//) { if ($ultra eq "S7-2" || $ultra eq "S7-2L") { # SPARC S7-2, S7-2L (guess) $socket="/SYS/MB/$cpumembrd$cmp/$mem_cu/$mem_channel/$mem_dimm"; } elsif ($ultra =~ /T5-(2|1B)/) { # SPARC T5-2, T5-1B (guess) $socket="/SYS/MB/$cpumembrd/CMP/$mem_branch/$mem_channel/$mem_dimm"; } elsif ($ultra =~ /T5-(4|8)/) { # SPARC T5-4, T5-8 (guess) $socket="/SYS/$processorbrd/$cpumembrd/CMP/$mem_branch/$mem_channel/$mem_dimm"; } elsif ($processorbrd) { # SPARC T3-4, T4-4 $socket="/SYS/$processorbrd/$cpumembrd$cmp/$mem_branch/$mem_channel/$mem_dimm"; } else { $socket="MB/$cpumembrd$cmp/$mem_branch/$mem_channel/$mem_dimm"; } $flag_mem_mod=0; # End of memory module section &add_to_sockets_used($socket); if (defined($mem_model) && defined($mem_mfg)) { $picl_mem_pn{"$socket"}="$mem_mfg $mem_model"; } elsif (defined($mem_mfg)) { $picl_mem_pn{"$socket"}="$mem_mfg"; } if ($max_picl_dimm_per_bank) { $picl_mem_dimm{"$socket"}=$picl_bank_size / $max_picl_dimm_per_bank; push(@simmsizesfound, "$picl_mem_dimm{\"$socket\"}"); } elsif ($sockets_used =~ /\/CH1\//) { $picl_mem_dimm{"$socket"}+=$picl_bank_size / 2; } else { $picl_mem_dimm{"$socket"}+=$picl_bank_size; } } elsif ($flag_mem_bank) { $socket="$bank_nac" if ($bank_nac); $flag_mem_bank=0; # End of memory bank section $bank_nac=""; if ($socket) { &add_to_sockets_used($socket); $picl_mem_bank{"$socket"}=$picl_bank_size; } } } if ($line =~ /^\s+memory-segment\s/) { $flag_mem_seg=1; # Start of memory segment section } if ($flag_mem_seg) { if ($line =~ /^\s+:InterleaveFactor\s/) { $interleave=$line; $interleave=~s/^.*:InterleaveFactor\s+(.*)$/$1/; $interleave=hex($interleave) if ($interleave =~ /^0x\d/); } if ($line =~ /^\s+:Size\s/) { $segment_size=$line; $segment_size=~s/^.*:Size\s+(.*)$/$1/; if ($segment_size =~ /^0x\d/) { $segment_size=~s/^(.*)00000$/$1/; $segment_size=hex($segment_size); } else { $segment_size /= $meg; } } } if ($line =~ /^\s+memory-bank\s/) { $flag_mem_bank=1; # Start of memory bank section $picl_dimm_per_bank=0; } if ($flag_mem_bank) { if ($line =~ /^\s+:Label\s/) { $bank_label=$line; $bank_label=~s/^.*:Label\s+(.*)$/$1/; } if ($line =~ /^\s+:nac\s/) { $bank_nac=$line; $bank_nac=~s/^.*:nac\s+(.*)\s*$/$1/; } if ($line =~ /^\s+:Size\s/) { $picl_bank_size=$line; $picl_bank_size=~s/^.*:Size\s+(.*)$/$1/; if ($picl_bank_size =~ /^0x\d/) { $picl_bank_size=~s/^(.*)00000$/$1/; $picl_bank_size=hex($picl_bank_size); } else { $picl_bank_size=$segment_size / $meg; } } } if ($line =~ /^\s+memory-module\s/) { $flag_mem_mod=1; # Start of memory module section $has_picl_mem_mod=1; } if ($flag_mem_mod) { if ($line =~ /^\s+:nac\s/) { $mem_dimm=$line; $mem_dimm=~s/^.*:nac\s+(.*)\s*$/$1/; $picl_dimm_per_bank++; } } if ($line =~ /^\s+MR\d\s/) { $mem_riser=$line; $mem_riser=~s/^.*(MR\d).*/$1/; } if ($line =~ /^\s+MCU\d\s/) { $mem_cu=$line; $mem_cu=~s/^.*(MCU\d).*/$1/; } if ($line =~ /^\s+(BR|BOB)\d\s/) { $flag_mem_chan=0; $mem_branch=$line; $mem_branch=~s/^.*(BR\d).*/$1/; $mem_branch=~s/^.*(BOB\d).*/$1/; # SPARC T3-2, T4-2 $mem_branch=$mem_riser . "/" . $mem_branch if ($mem_riser); } if ($line =~ /^\s+CH\d\s/) { $flag_mem_chan=1; # Start of memory channel section $mem_channel=$line; $mem_channel=~s/^.*(CH\d).*/$1/; } if ($flag_mem_chan && $line =~ /^\s+D\d\s/) { $flag_mem_mod=1; # Start of memory module section $picl_foundmemory=1; $mem_dimm=$line; $mem_dimm=~s/^.*(D\d).*/$1/; } if ($flag_mem_mod) { if ($line =~ /\s+:ModelName\s/) { $mem_model=$line; $mem_model=~s/^.*:ModelName\s+(.*)$/$1/; } if ($line =~ /\s+:MfgName\s/) { $mem_mfg=$line; $mem_mfg=~s/^.*:MfgName\s+(.*)$/$1/; } } if ($line =~ /\s+:name\s+physical-platform/) { $flag_physical_platform=1; } elsif ($line =~ /\s+:name\s+SYS/) { $flag_physical_platform=0; } if ($flag_physical_platform) { if ($line =~ /\s+:MfgName\s/) { $manufacturer=$line; $manufacturer=~s/^.*:MfgName\s+(.*)$/$1/; } } } } sub check_prtfru { &pdebug("in check_prtfru"); if ($prtfru_cmd && ! $have_prtfru_data) { # Warn that prtfru may take a while to run &please_wait; @prtfru=&run("$prtfru_cmd -x"); $have_prtfru_data=1; } $flag_mem_mod=0; $cpu_mem_slot=""; $mem_slot=""; $mem_desc=""; $mem_mfg=""; $mem_mfg_loc=""; $mem_pn=""; $sun_pn=""; $fru_details=""; $fru_sb=""; $fru_cpu=""; $fru_bank=""; $fru_dimm=""; $prevline=""; foreach $line (@prtfru) { $line=&dos2unix($line); $line=&mychomp($line); $line=~s/\s+$//; if ($line =~ //) { $fru_sb=$prevline; $fru_sb=~s/^.*Label=(.*)\s*\".*/$1/; &pdebug("in check_prtfru, found fru_sb=$fru_sb"); } if ($line =~ //) { $flag_mem_mod=0; # End of memory module section if ($mem_slot) { if ($mem_desc) { $have_prtfru_details=1; $fru_details .= "$cpu_mem_slot " if ($cpu_mem_slot); $fru_details .= "$mem_slot: $mem_desc"; $fru_details .= ", Sun $sun_pn" if ($sun_pn); if ($mem_mfg && $mem_pn) { $fru_details .= ", $mem_mfg $mem_pn"; } else { $fru_details .= ", $mem_mfg" if ($mem_mfg); $fru_details .= ", $mem_pn" if ($mem_pn); } $fru_details .= "\n"; } else { $missing_prtfru_details .= "${cpu_mem_slot}_" if ($cpu_mem_slot); $missing_prtfru_details .= "$mem_slot "; } } $mem_slot=""; $mem_desc=""; $mem_mfg=""; $mem_mfg_loc=""; $mem_pn=""; $sun_pn=""; $fru_dimm=""; } if ($flag_mem_mod) { if ($line =~ /(DIMM_Capacity|Fru_Description) value=/) { $mem_desc=$line; $mem_desc=~s/^.*\"(.*)\s*\".*$/$1/; } if ($line =~ /(Fundamental_Memory_Type|DIMM_Config_Type) value=/) { $tmp=$line; $tmp=~s/^.*\"(.*)\s*\".*$/$1/; if ($mem_desc) { $mem_desc .= " $tmp"; } else { $mem_desc="$tmp"; } } if ($line =~ /Manufacture_Loc value=/ && ! $mem_mfg_loc) { $mem_mfg_loc=$line; if ($mem_mfg_loc =~ /\".*\"/) { $mem_mfg_loc=~s/^.*\"(.*)\s*\".*$/$1/; } else { $mem_mfg_loc=~s/^.*\"(.*)\s*$/$1/; } } if ($line =~ /Vendor_Name value=/ && ! $mem_mfg) { $mem_mfg=$line; if ($mem_mfg =~ /\".*\"/) { $mem_mfg=~s/^.*\"(.*)\s*\".*$/$1/; } else { $mem_mfg=~s/^.*\"(.*)\s*$/$1/; } $mem_mfg=&get_mfg($mem_mfg); # Fix some unrecognized manufacturers if ($mem_mfg =~ /(unrecognized value|UNKNOWN Invalid Value)/i) { if ($mem_mfg =~ /[0\b]4400\b/ || $mem_mfg_loc =~ /Boise.*Idaho/i) { $mem_mfg="Micron Technology"; } elsif ($mem_mfg =~ /[0\b]7800\b/ || $mem_mfg_loc =~ /Onyang.*Korea/i) { $mem_mfg="Samsung"; } elsif ($mem_mfg =~ /[0\b]0551\b/ || $mem_mfg_loc =~ /\bQMY\b/) { $mem_mfg="Qimonda"; } else { # unrecognized manufacturer $recognized=-3; $exitstatus=1; } } } if ($line =~ /Manufacturer_Part_No value=/ && ! $mem_pn) { $mem_pn=$line; $mem_pn=~s/^.*\"(.*)\s*\".*$/$1/; } if ($line =~ /Sun_Part_No value=/ && ! $sun_pn) { $sun_pn=$line; $sun_pn=~s/^.*\"(.*)\s*\".*$/$1/; $sun_pn=~s/^(\d\d\d)(\d\d\d\d)$/$1-$2/; } # This data is not always accurate, so ignore it # if ($line =~ /Fru_Type value=/ && ! $mem_desc) { # $mem_desc=$line; # $mem_desc=~s/^.*\"(.*)\s*\".*$/$1/; # } } $prevline=$line; } } sub multicore_cputype { $s=shift; $tmp=shift; return if (! defined($s) || ! defined($tmp)); $s="Hyper-Threaded $s" if ($hyperthread && $s !~ /Hyper.Thread/i); if ($tmp == 2) { $s="Dual-Core $s" if ($s !~ /(Dual|Two).Core/i); } elsif ($tmp == 3) { $s="Triple-Core $s" if ($s !~ /(Triple|Three).Core/i); } elsif ($tmp == 4) { $s="Quad-Core $s" if ($s !~ /(Quad|Four).Core/i); } elsif ($tmp == 6) { $s="Six-Core $s" if ($s !~ /(Hex|Six).Core/i); } elsif ($tmp == 8) { $s="Eight-Core $s" if ($s !~ /(Octal|Eight).Core/i); } elsif ($tmp == 10) { $s="Ten-Core $s" if ($s !~ /Ten.Core/i); } elsif ($tmp == 12) { $s="Twelve-Core $s" if ($s !~ /Twelve.Core/i); } elsif ($tmp > 1) { $s="${tmp}-Core $s" if ($s !~ /${tmp}.Core/i); } $s=~s/ Core/-Core/ if ($s =~ /(Dual|Two|Triple|Three|Quad|Four|Hex|Six|Octal|Eight|Ten|Twelve|[0-9]) Core/i); return($s); } sub cleanup_cputype { $_=shift; return "" if (! defined($_)); s/ CPU//; s/ [Pp]rocessor//; s/ +MHz/MHz/; s/ (\d[\d\.]*GHz) \d*MHz/ $1/; s/\s+/ /g; s/^\s+//; s/\s+$//; s/\(r\)/\(R\)/g; s/\(tm\)/\(TM\)/g; s/ Core/-Core/ if (/(Dual|Two|Triple|Three|Quad|Four|Hex|Six|Octal|Eight|Ten|Twelve|[0-9]) Core/i); return($_); } sub multicore_cpu_cnt { $arg=shift; &check_psrinfo; &pdebug("in multicore_cpu_cnt, cputype=$cputype, threadcnt=$threadcnt"); if ($cputype =~ /UltraSPARC-T1$/) { $cputype="UltraSPARC-T1"; # Count 4-Thread (4, 6, or 8 Core) Niagara CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 8 Cores max (32 threads) $ncpu=int(($threadcnt - 1) / 32) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 4 / $ncpu . "-Core Quad-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /UltraSPARC-T2\+/) { $cputype="UltraSPARC-T2+"; # Count 8-Thread (4, 6, or 8 Core) Victoria Falls CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Assume there are no single-cpu systems with the US-T2+ $ncpu=2; # Valid configurations: # T5140,T5240: 2 x 4-Core (64 threads), 2 x 6-Core # (96 threads), 2 x 8-Core (128 threads) # T5440: 4 x 4-Core (128 threads), 4 x 8-Core # (256 threads) # Netra-T5440: 2 x 8-Core (128 threads) if ($ultra eq "T5140" || $ultra eq "T5240") { $ncpu=2; } elsif ($ultra eq "T5440") { $ncpu=4; $ncpu=2 if ($model =~ /Netra-T5440/); } } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /UltraSPARC-T2$/) { $cputype="UltraSPARC-T2"; # Count 8-Thread (4 or 8 Core) Niagara-II CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 8 Cores max (64 threads) $ncpu=int(($threadcnt - 1) / 64) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC-T3$/) { $cputype="SPARC-T3"; # Count 8-Thread (8 or 16 Core) Rainbow Falls CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 16 Cores max (128 threads) $ncpu=int(($threadcnt - 1) / 128) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC-T4$/) { $cputype="SPARC-T4"; # Count 8-Thread 8-Core SPARC-T4 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 8 Cores max (64 threads) $ncpu=int(($threadcnt - 1) / 64) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC-T5$/) { $cputype="SPARC-T5"; # Count 8-Thread 16-Core SPARC-T5 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 16 Cores max (128 threads) $ncpu=int(($threadcnt - 1) / 128) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC.M5$/) { $cputype="SPARC-M5"; # Count 8-Thread 6-Core SPARC-M5 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 6 Cores max (48 threads) $ncpu=int(($threadcnt - 1) / 48) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC.M6$/) { $cputype="SPARC-M6"; # Count 8-Thread 12-Core SPARC-M6 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 12 Cores max (96 threads) $ncpu=int(($threadcnt - 1) / 96) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC.S7$/) { $cputype="SPARC-S7"; # Count 8-Thread 8-Core SPARC-S7 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 8 Cores max (64 threads) $ncpu=int(($threadcnt - 1) / 64) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC.M7$/) { $cputype="SPARC-M7"; # Count 8-Thread 32-Core SPARC-M7 CPUs as 1 CPU if ($npcpu && $ldm_cmd && ! $have_ldm_data) { $ncpu=$npcpu; } else { # Each CPU has 32 Cores max (256 threads) $ncpu=int(($threadcnt - 1) / 256) + 1; } if (defined($arg)) { $cnt=$ncpu; return; } if ($threadcnt) { $cputype=$threadcnt / 8 / $ncpu . "-Core 8-Thread $cputype"; $cpucnt{"$cputype $cpufreq"}=$ncpu; } } elsif ($cputype =~ /SPARC64-VI$/) { # Count Dual-Core Dual-Thread Olympus-C SPARC64-VI CPUs as 1 CPU $ncpu=$threadcnt / 4; $cputype="Dual-Core Dual-Thread SPARC64-VI"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } elsif ($cputype =~ /SPARC64-VII\+\+$/) { # Count Quad-Core Dual-Thread Jupiter++ SPARC64-VII++ CPUs as 1 CPU $ncpu=$threadcnt / 8; $cputype="Quad-Core Dual-Thread SPARC64-VII++"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } elsif ($cputype =~ /SPARC64-VII\+$/) { # Count Quad-Core Dual-Thread Jupiter+ SPARC64-VII+ CPUs as 1 CPU $ncpu=$threadcnt / 8; $cputype="Quad-Core Dual-Thread SPARC64-VII+"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } elsif ($cputype =~ /SPARC64-VII$/) { # Count Quad-Core Dual-Thread Jupiter SPARC64-VII CPUs as 1 CPU $ncpu=$threadcnt / 8; $cputype="Quad-Core Dual-Thread SPARC64-VII"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } elsif ($cputype =~ /SPARC64-VIII$/) { # Guess on the Venus SPARC64-VIII name ??? # Count 8-Core Dual-Thread Venus SPARC64-VIII CPUs as 1 CPU $ncpu=$threadcnt / 16; $cputype="8-Core Dual-Thread SPARC64-VIII"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } elsif ($cputype =~ /SPARC64-X$/) { # Count 16-Core Dual-Thread SPARC64-X CPUs as 1 CPU $ncpu=$threadcnt / 32; $cputype="16-Core Dual-Thread SPARC64-X"; if (defined($arg)) { $cnt=$ncpu; return; } $cpucnt{"$cputype $cpufreq"}=$ncpu; } } sub x86multicorecnt { $_=shift; return if (! defined($_)); $corecnt=2 if (/\b(Dual|Two).Core/i); $corecnt=3 if (/\b(Triple|Three).Core/i); $corecnt=4 if (/\b(Quad|Four).Core/i); $corecnt=6 if (/\b(Hex|Six).Core/i); $corecnt=8 if (/\b(Octal|Eight).Core/i); $corecnt=10 if (/\bTen.Core/i); $corecnt=12 if (/\bTwelve.Core/i); } sub checkX86 { $isX86=1 if ($model eq "i86pc" || $machine eq "i86pc" || $model eq "i86xpv" || $machine eq "i86xpv" || $model eq "i86xen" || $machine eq "i86xen"); # Use CPU count from prtdiag (ndcpu) and thread count from psrinfo to # get core count per cpu for i86xpv/i86xen $use_psrinfo_data=2 if ($model eq "i86xpv" || $machine eq "i86xpv" || $model eq "i86xen" || $machine eq "i86xen"); } sub check_psrinfo { return if ($psrinfo_checked); &pdebug("in check_psrinfo, ndcpu=$ndcpu, npcpu=$npcpu, nvcpu=$nvcpu"); $psrinfo_checked=1; return if ($nvcpu || ! $use_psrinfo_data); if ($filename) { $npcpu=0; $j=0; $have_npcpu=0; foreach $line (@psrinfo) { $line=&dos2unix($line); # May have "psrinfo -p" output in regression test file # that has number of physical CPUs. if ($line =~ /^#.*psrinfo -p$/ && $psrinfo[$j + 1] =~ /^\d+$/) { $npcpu=&mychomp($psrinfo[$j + 1]); $have_npcpu=1; &pdebug("in check_psrinfo, found npcpu=$npcpu"); } # May have "psrinfo -p -v" output in regression test # file that has number of virtual CPUs. Assumes all # CPUs are same. if ($line =~ /^The .+ \d+ virtual processor/) { &check_psrinfo_pv; if ($use_psrinfo_data == 2 && $ndcpu > 1) { $corecnt /= $ndcpu; $npcpu=$ndcpu if (! $have_npcpu); } else { $npcpu++ if (! $have_npcpu); } $cpucntfrom="psrinfo" if ($cpucntfrom ne "ldm"); $cpucntflag="0"; # reset flag &pdebug("in check_psrinfo, found nvcpu=$nvcpu, corecnt=$corecnt, npcpu=$npcpu, hyperthread=$hyperthread"); } $j++; } } elsif ($psrinfo_cmd) { $ncpu=&mychomp(`$psrinfo_cmd | wc -l`); # physical & virtual CPUs $ncpu=~s/\s+//; $npcpu=&mychomp(`$psrinfo_cmd -p 2>/dev/null`); # physical CPUs if ($npcpu) { # Find number of virtual CPUs @tmp=`$psrinfo_cmd -p -v`; foreach $line (@tmp) { $line=&dos2unix($line); if ($line =~ /^The .+ \d+ virtual processor/) { &check_psrinfo_pv; if ($use_psrinfo_data == 2 && $ndcpu > 1) { $corecnt /= $ndcpu; $npcpu=$ndcpu; } } } if ($cputype eq "x86") { if ($tmp[2] =~ /.+Hz|\bAMD .* Processor /) { $cputype_psrinfo=&cleanup_cputype(&mychomp($tmp[2])); } } } else { $npcpu=$ncpu; $nvcpu=1; } @tmp=`$psrinfo_cmd -v`; if ($tmp[2] =~ /MHz/) { $cpufreq=&mychomp($tmp[2]); $cpufreq=~s/.+ operates at //; $cpufreq=~s/ MHz.+//; } $cpucntfrom="psrinfo" if ($cpucntfrom ne "ldm"); $have_psrinfo_data=1; } } sub check_psrinfo_pv { $nvcpu=&mychomp($line); $nvcpu=~s/.+ processor has //; $nvcpu=~s/ virtual processor.+//; if ($nvcpu =~ / cores and /) { $nvcpu=~s/cores and //; $corecnt=$nvcpu; $corecnt=~s/ \d+$//; $nvcpu=~s/^\d+ //; if ($nvcpu == 2 * $corecnt && $isX86) { $hyperthread=1; &pdebug("hyperthread=1: from psrinfo -p -v"); } } else { $corecnt=$nvcpu if ($nvcpu >= 2); $corecnt /= 2 if ($hyperthread); } } sub get_mfg { $_=shift; return "" if (! defined($_)); s/Manufacturer: *//ig; $has_JEDEC_ID=0; if (/JEDEC ID:/) { s/JEDEC ID://g; s/ //g; $has_JEDEC_ID=1; } s/^\s+//; s/\s+$//; s/^0x//; &pdebug("in get_mfg, JEDEC_ID=$_"); return "" if (/(^$|^\r$|^FFFFFFFFFFFF|^000000000000|^Undefined|Manufacturer\d)/i); s/^(00|80)// if (! /^007F/); # Based on JEDEC JEP106AT return "Micron Technology" if (/(^2C|Micron\b)/i); return "Micron CMS" if (/(^7F45|Micron CMS)/i); return "Crucial Technology" if (/(^1315$|^859B|^9B|^7F7F7F7F7F9B|Crucial\b)/i); # Inotera was a Joint Venture between Micron and Nanya # Micron fully acquired Inotera in 2016 return "Inotera Memories" if (/Inotera/i); # Micron acquired Elpida in August 2013 return "Elpida" if (/(^0500|^FE|^7F7FFE|^02FE|Elpida)/i); # Micron acquired Numonyx in February 2010 return "Numonyx (Intel)" if (/(^89|Intel)/i); return "Numonyx" if (/Numonyx/i); return "Fujitsu" if (/(^04|Fujitsu)/i); return "Hitachi" if (/(^07|Hitachi)/i); return "Inmos" if (/(^08|Inmos)/i); return "Intersil" if (/(^0B|Intersil)/i); return "Mostek" if (/(^0D|Mostek)/i); return "Freescale (Motorola)" if (/(^0E|Motorola)/i); return "Freescale" if (/Freescale/i); return "NEC" if (/^10/); return "Conexant (Rockwell)" if (/(^13|Rockwell)/i); return "Conexant" if (/Conexant/i); return "NXP (Philips Semi, Signetics)" if (/(^15|Philips Semi|Signetics)/i); return "Synertek" if (/(^16|Synertek)/i); return "Xicor" if (/(^19|Xicor)/i); return "Zilog" if (/(^1A|Zilog)/i); return "Mitsubishi" if (/(^1C|Mitsubishi)/i); return "ProMOS/Mosel Vitelic" if (/(^40|ProMOS|Mosel Vitelic)/i); return "Qimonda" if (/(^51|^8551|Qimonda)/i); return "Wintec Industries" if (/(^61|Wintec\b)/i); return "Goldenram" if (/(^6A|Goldenram)/i); return "Fairchild" if (/(^83|Fairchild)/i); return "GTE" if (/(^85|GTE)/i); return "DATARAM" if (/^91|^7F91/); return "Smart Modular" if (/^94|^0194|Smart Modular/i); return "Toshiba" if (/(^98|Toshiba)/i); return "Corsair" if (/(^9E|Corsair)/i); return "IBM" if (/^A4/i); return "Hynix Semiconductor (Hyundai Electronics)" if (/(^AD|Hyundai)/i); return "Hynix Semiconductor" if (/(HYN|Hynix)/i); return "Infineon (Siemens)" if (/(^C1|^7F7F7F7F7F51|Siemens)/i); return "Infineon" if (/Infineon/i); return "Samsung" if (/(^CE|Samsung)/i); return "Winbond Electronics" if (/(^DE|Winbond)/i); return "LG Semiconductor (Goldstar)" if (/(^E0|Goldstar)/i); return "LG Semiconductor" if (/LG Semi/i); return "Kingston" if (/(^7F98|^0198|Kingston)/i); return "SpecTek Incorporated" if (/(^7F7FB5|SpecTek)/i); return "Nanya Technology" if (/(^7F7F7F0B|^830B|Nanya)/i); return "Kingmax Semiconductor" if (/(^7F7F7F25|KINGMAX)/i); return "Ramaxel Technology" if (/(^7F7F7F7F43|Ramaxel)/i); return "A-DATA Technology" if (/(^7F7F7F7FCB|ADATA|A-DATA)/i); return "Team Group Inc." if (/^(7F7F7F7FEF|Team\b)/i); return "AMD" if (/^01/); return "AMI" if (/^02/); if ($has_JEDEC_ID || /^7F|^80|^FF/i) { $unknown_JEDEC_ID=1; &pdebug("in get_mfg, found unknown JEDEC ID $_"); } return &mychomp($_); } # See if CPUs and memory modules are listed in "ipmitool fru" output sub check_ipmitool { &pdebug("in check_ipmitool"); return if (! $ipmitool_cmd && ! $filename); $cputype2=""; $mem_mfg=""; $mem_model=""; $mem_pn=""; $flag_cpu=0; $flag_mem=0; $flag_mfg=0; $socket=""; foreach $line (@ipmitool) { $line=&dos2unix($line); $line=&mychomp($line); if ($line =~ /^ *$/) { # store cpu and memory modules in hash if ($flag_cpu) { if ($cputype2) { $cputype2=~s/DUAL.CORE/Dual-Core/; $cputype2=~s/TRIPLE.CORE/Triple-Core/; $cputype2=~s/QUAD.CORE/Quad-Core/; $cputype2=~s/SIX.CORE/Six-Core/; $cputype2=~s/EIGHT.CORE/Eight-Core/; $cputype2=~s/TEN.CORE/Ten-Core/; $cputype2=~s/TWELVE.CORE/Twelve-Core/; $cputype2=~s/ Core/-Core/; $cputype2=~s/OPTERON\(TM\) PROCESSOR/Opteron\(TM\)/; $ipmi_cputype="$cputype2"; $ipmi_cpucnt++; } } if ($flag_mem && $socket) { $ipmi_mem{"$socket"}=("$mem_mfg$mem_model$mem_pn") ? "$mem_mfg $mem_model$mem_pn" : ""; } $flag_cpu=0; # End of CPU section $flag_mem=0; # End of memory section $flag_mfg=0; # End of mfg section $cputype2=""; $mem_mfg=""; $mem_model=""; $mem_pn=""; } if ($line =~ / (cpu\d+\.vpd|p\d+\.fru )/) { $flag_cpu=1; # Start of CPU section $socket=$line; $socket=~s/^.*: +(.*\S)\.[vf][pr][du].*$/$1/; } if ($flag_cpu && $line =~ / Product Name /) { $cputype2=$line; $cputype2=~s/^.*: +(.*\S) *$/$1/; &x86multicorecnt($cputype2); } if ($line =~ / (cpu\d+\.mem\d+\.vpd|p\d+\.d\d+\.fru) /) { $flag_mem=1; # Start of memory module section $socket=$line; $socket=~s/^.*: +(.*\S)\.[vf][pr][du].*$/$1/; } elsif ($line =~ / P\d+C\d+\/B\d+\/C\d+\/D\d+ / && $ultra =~ /^T7-/) { # Need what M7-8 and M7-16 format looks like $flag_mem=1; # Start of memory module section $socket=$line; $socket=~s/^.*: +(.*\S)\s*.*$/$1/; } if ($flag_mem && $line =~ / Device not present /) { # Ignore missing Processor Modules $flag_mem=0 if ($ultra eq "T7-4" && $corecnt == 2 && $socket =~ /P1C\d+\/B\d+\/C\d+\/D\d+/); # Need what M7-8 and M7-16 format looks like } if ($flag_mem && $line =~ / Product Manufacturer /) { $mem_mfg=$line; $mem_mfg=~s/^.*: +(.*\S) *$/$1/; $mem_mfg=&get_mfg($mem_mfg); } if ($flag_mem && $line =~ / Product Name /) { $mem_model=$line; $mem_model=~s/^.*: +(.*\S) *$/$1/; $mem_model=~s/ ADDRESS\/COMMAND//; $mem_model=~s/PARITY/Parity/; } if ($flag_mem && $line =~ / Product Part Number /) { $mem_pn=$line; $mem_pn=~s/^.*: +(.*\S) *$/, $1/; $mem_pn=~s/^, .*,(.*\S)$/, $1/; } if ($line =~ /FRU Device Description *: *\/*SYS /) { $flag_mfg=1; # Start of mfg section } if ($flag_mfg && $line =~ / Product Manufacturer /) { $manufacturer="Sun Microsystems, Inc." if ($line =~ /Sun /i); $manufacturer="Oracle Corporation" if ($line =~ /Oracle/i); } } # Is ipmitool CPU count better? # &pdebug("ipmi_cpucnt=$ipmi_cpucnt"); if ($ncpu != $ipmi_cpucnt && $npcpu == 0 && $ipmi_cpucnt != 0) { $ncpu=$ipmi_cpucnt; $npcpu=$ipmi_cpucnt; $cpucntfrom="ipmitool"; $cpucnt{"$cputype $cpufreq"}=$ipmi_cpucnt; } # Did ipmitool find a better cputype? if (&lc($cputype) ne &lc($ipmi_cputype) && $ipmi_cputype) { # rewrite %cpucnt $cputype with cputype while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d+)$/; $cpufreq=$2; delete $cpucnt{"$1 $2"}; } $cpucnt{"$ipmi_cputype $cpufreq"}=$ipmi_cpucnt; } } # Check for logical domains sub check_for_LDOM { &pdebug("in check_for_LDOM"); $kernbit=64 if (! $kernbit && $machine eq "sun4v"); # Handle control LDOM on UltraSPARC-T1 and later systems if ($ldm_cmd && ! $have_ldm_data) { @ldm=&run("$ldm_cmd list-devices -a -p"); $have_ldm_data=1; } $ldmthreadcnt=0; if ($have_ldm_data) { foreach $line (@ldm) { $line=&dos2unix($line); $line=&mychomp($line); &check_LDOM; # Count virtual CPUs $ldmthreadcnt++ if ($line =~ /^\|pid=\d/); if ($line =~ /^\|pa=\d.*\|size=\d/) { # Add up total memory found in ldm output $sz=$line; $sz=~s/^.*size=(\d*).*/$1/; $ldm_memory += $sz; } } # Was ldm data found? $have_ldm_data=0 if (! $ldmthreadcnt && ! $ldm_memory); if ($ldmthreadcnt) { # VCPUs found in ldm output delete $cpucnt{"$cputype $cpufreq"}; &pdebug("ldm: ncpu=$ncpu, npcpu=$npcpu"); $cpucntfrom="ldm"; $threadcnt=$ldmthreadcnt; &multicore_cpu_cnt; } $installed_memory=$ldm_memory / $meg if ($ldm_memory); } # Handle guest domains on UltraSPARC-T1 and later systems if ($virtinfo_cmd && ! $have_virtinfo_data) { @virtinfo=&run("$virtinfo_cmd -pa"); $have_virtinfo_data=1; } if ($cfgadm_cmd && ! $have_cfgadm_data) { @cfgadm=&run("$cfgadm_cmd -al"); $have_cfgadm_data=1; } if ($have_virtinfo_data) { foreach $line (@virtinfo) { $line=&dos2unix($line); if ($line =~ /Domain role: LDoms guest|DOMAINROLE\|impl=LDoms\|control=false/i) { &found_guest_LDOM; &pdebug("exit 1"); exit 1; } $virtinfoLDOMcontrolfound=1 if ($line =~ /DOMAINROLE\|impl=LDoms\|control=true/i); } } if ($have_cfgadm_data) { foreach $line (@cfgadm) { $line=&dos2unix($line); if ($line =~ /Configuration administration not supported/ && $ldmthreadcnt == 0 && $virtinfoLDOMcontrolfound == 0) { # Hack: Assume cfgadm fails on guest domains. &found_guest_LDOM; &pdebug("exit 1"); exit 1; } } } } sub check_LDOM { if ($line =~ /Authorization failed|Connection refused/i) { if ($uid eq "0") { # No LDOMs configured $ldm_cmd=""; $have_ldm_data=0; } else { &found_guest_LDOM(""); print "ERROR: ldm: $line\n"; print " This user does not have permission to run '/opt/SUNWldm/bin/ldm'.\n"; print " Run memconf as a privileged user like root on the control LDOM.\n"; &pdebug("exit 1"); exit 1; } } } sub found_guest_LDOM { # Rewrite cputype and cpucnt hash since I don't # know how many cores the guest domain host has if ($cputype =~ /UltraSPARC-T1$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="UltraSPARC-T1"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /UltraSPARC-T2\+/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="UltraSPARC-T2+"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /UltraSPARC-T2$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="UltraSPARC-T2"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-T3$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-T3"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-T4$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-T4"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-T5$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-T5"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-M5$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-M5"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-M6$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-M6"; $cpucnt{"$cputype $cpufreq"}=1; } elsif ($cputype =~ /SPARC-S7$/) { delete $cpucnt{"$cputype $cpufreq"}; $cputype="SPARC-S7"; $cpucnt{"$cputype $cpufreq"}=1; } &show_header; $arg=shift; return if (defined($arg)); $domaincontrol=""; if ($have_virtinfo_data) { foreach $line (@virtinfo) { $line=&dos2unix($line); if ($line =~ /DOMAINCONTROL\|name=/i) { $domaincontrol=&mychomp($line); $domaincontrol=~s/^.*name=//; } } } print "ERROR: Guest Logical Domain (LDOM) detected.\n"; print " Run memconf on the control LDOM"; print " host \"$domaincontrol\"" if ($domaincontrol ne ""); print ".\n It cannot show system memory details on guest LDOMs.\n"; } sub found_nonglobal_zone { # non-global zone (container) print "WARNING: More details can be reported if memconf is run in the global zone"; if ($filename) { print ".\n"; } else { $globalzone=&mychomp(`/usr/sbin/arp -a | awk '/SP/ {print \$2}' | head -1`); print "\n on hostname '$globalzone'.\n"; } } sub check_smbios { &pdebug("in check_smbios"); $flag_smb_cpudevice=0; $flag_smb_memdevice=0; $cpu_membank=-1; $cpu_cnt=-1; $physmemarray=""; foreach $line (@smbios) { $line=&dos2unix($line); $line=&mychomp($line); next if ($line =~ /( *Unknown|: Other|: \.\.|: Not Specified)/i); if ($model eq "i86pc" || $model eq "i86xpv" || $model eq "i86xen") { if ($line =~ /^ *Manufacturer:/ && $line !~ /(To Be Filled|System Manufacturer)/i && $manufacturer eq "") { $manufacturer=$line; $manufacturer=~s/^ *Manufacturer: *//g; $manufacturer=~s/\s*$//g; &pdebug("in check_smbios, manufacturer=$manufacturer"); } if ($line =~ /^ *Product:/ && $line !~ /(To Be Filled|System .*Name|XXXX)/i) { $model=$line; $model=~s/^ *Product: *//g; $model=~s/\s*$//g; &pdebug("in check_smbios, model=$model"); &x86_devname; } } if ($line =~ /SMB_TYPE_PROCESSOR\b/) { $flag_smb_cpudevice=1; $cpu_cnt++; } if ($flag_smb_cpudevice && $line =~ /Location Tag:/) { $CPUSocketDesignation[$cpu_cnt]=$line; $CPUSocketDesignation[$cpu_cnt]=~s/^ *Location Tag: *//g; $flag_smb_cpudevice=0; } if ($line =~ /SMB_TYPE_MEMDEVICE\b/) { $mem_mfg=""; $socket=""; $pn=""; $simmsize=0; $memtype=""; $formfactor=""; $smb_mdf=""; $maxmembusspeed=""; $flag_smb_cpudevice=0; $flag_smb_memdevice=1; } if ($flag_smb_memdevice) { if ($line =~ /Manufacturer:/) { $mem_mfg=$line; $mem_mfg=~s/^ *Manufacturer: *//g; $mem_mfg=&get_mfg($mem_mfg); $mem_mfg=", $mem_mfg" if ($mem_mfg); } if ($line =~ /Location Tag:/) { # Ignore System ROM FLASH if ($line =~ /SYSTEM ROM/i) { $flag_smb_memdevice=0; } else { $socket=$line; $socket=~s/^ *Location Tag: *//g; $socket=~s/\s*$//g; } } if ($line =~ /Part Number:/) { $pn=$line; $pn=~s/^ *Part Number: *//g; $pn=~s/\s*$//g; $pn="" if ($pn =~ /^0xFF|PartNum/i); $pn=&hex2ascii($pn); if ($pn) { # Hack: Ballistic modules may have mfg Undefined $mem_mfg=", Crucial Technology" if (! $mem_mfg && $pn =~ /^BL/); if ($mem_mfg) { $pn=" $pn"; } else { $pn=", $pn"; } } } if ($line =~ /Physical Memory Array:/) { $tmp=&mychomp($line); $tmp=~s/^ *Physical Memory Array: *//g; $cpu_membank++ if ($physmemarray ne $tmp); $physmemarray=$tmp; } if ($line =~ /Size:/) { $simmsize=$line; $simmsize=~s/^ *Size: //g; $simmsize=~s/ bytes//g; $simmsize=0 if ($simmsize =~ /Not Populated/); $simmsize /= $meg; } if ($line =~ /Memory Type:/) { # Ignore FLASH (System ROM) if ($line =~ /FLASH/i) { $flag_smb_memdevice=0; } else { $memtype=$line; $memtype=~s/^ *Memory Type:.*\((.*)\).*/$1/g; $memtype .= " " if ($formfactor); $memtype="" if ($memtype =~ /Memory Type:|^other/); } } if ($line =~ /Form Factor:/) { $formfactor=$line; $formfactor=~s/^ *Form Factor:.*\((.*)\).*/$1/g; $formfactor="" if ($formfactor =~ /Form Factor:/); } $smb_mdf="Fast-Page " if ($line =~ /SMB_MDF_FASTPG/); $smb_mdf="Synchronous " if ($line =~ /SMB_MDF_SYNC/); $smb_mdf="EDO " if ($line =~ /SMB_MDF_EDO/); if ($line =~ /^ *Speed: *\d+ *MHz/) { $maxmembusspeed=$line; $maxmembusspeed=~s/^ *Speed: *(\d+) *MHz/${1}MHz/g; } if ($line =~ /Bank Locator:|^ *ID *SIZE *TYPE/ && $socket) { $bank_label=$line; $bank_label=~s/^ *(Bank Locator:|ID *SIZE *TYPE) *//g; $bank_label=~s/ *SLOT$//ig; $bank_label="BANK $bank_label" if ($bank_label =~ /^.$/); $bank_label="" if ($bank_label eq $socket || $bank_label eq "BANK"); if ($socket =~ /^CPU/ && $socket !~ /$bank_label/) { $socket .= "_$bank_label"; $bank_label=""; } $bank_label=" $bank_label" if ($bank_label); $flag_smb_memdevice=0; # Don't overwrite duplicate socket names if (! defined($smbios_mem{"$socket"})) { # Add CPU to X4170/X4270/X4275/X6270/X6275 if ($model =~ /Sun .*X(4[12]7[05]|627[05])\b/i && $socket !~ /CPU/) { $bank_label="" if ($bank_label =~ /\/P\d+$/); $cpu_number=$CPUSocketDesignation[$cpu_membank]; $cpu_number=~s/\s*//g; $socket="${cpu_number}_$socket"; } if ($model =~ /W1100z\b/i && $model !~ /2100z\b/i && $socket =~ /DIMM[5-8]/) { # DIMM5-DIMM8 don't exist on W1100z } else { $smbios_mem{"$socket$bank_label"}=($simmsize) ? "${simmsize}MB $smb_mdf$memtype$formfactor$mem_mfg$pn" : ""; $sockets_used=""; } } } } } $tmp=scalar(keys %smbios_mem); if (defined($tmp)) { if ($tmp) { &pdebug("Memory found with smbios"); &show_header; if (! &is_virtualmachine) { for (sort alphanumerically keys %smbios_mem) { if ($smbios_mem{$_}) { print "$_: $smbios_mem{$_}\n"; $simmsize=$smbios_mem{$_}; $simmsize=~s/^.*\b(\d+)M[Bb].*/$1/; $smbios_memory += $simmsize if ($simmsize); } else { &add_to_sockets_empty($_); } } } $totmem=$installed_memory; &print_empty_memory("memory sockets"); &finish; &pdebug("exit"); exit; } } } sub check_kstat { &pdebug("in check_kstat"); $instance=0; foreach $line (@kstat) { $line=&dos2unix($line); $_=&mychomp($line); # cpu thread instance number if (/\scpu_info\s+instance:\s+/) { ($instance)=(/.*\s(\d+)\s*$/); } if (/^\s*brand\s/) { ($val)=(/^\sbrand\s*(\S.*)\s*$/); push(@kstat_brand, "$val") if ($val); } if (/\sclock_MHz\s/) { ($val)=(/.*\s(\d+)\s*$/); push(@kstat_MHz, "$val") if ($val); } # count # of threads per unique core_id for each chip if (/\score_id\s/) { ($val)=(/.*\s(\d+)\s*$/); $kstat_core_id{$instance}=$val; $kstat_core{$val}++; } # number of cores per chip if (/\sncore_per_chip\s/) { ($val)=(/.*\s(\d+)\s*$/); $kstat_ncore_per_chip{$instance}=$val; } # max number of cpus (threads) per chip if (/\sncpu_per_chip\s/) { ($val)=(/.*\s(\d+)\s*$/); $kstat_ncpu_per_chip{$instance}=$val; } $foundGenuineIntel=1 if (/\svendor_id\s+GenuineIntel/); } if ($foundGenuineIntel && $instance) { # Assume all CPUs are same for ($val=0; $val <= $instance; $val++) { last if (! defined($kstat_core_id{$val}) || ! defined($kstat_ncore_per_chip{$val}) || ! defined($kstat_ncpu_per_chip{$val})); $kstat_checked=1; if ($kstat_ncpu_per_chip{$val} == 2 * $kstat_ncore_per_chip{$val}) { # CPU is hyper-thread capable, but it may not be # enabled in the BIOS &pdebug("in check_kstat, found CPU capable of Hyper-Threading") if (! $hyperthreadcapable); $hyperthreadcapable=1; if ($kstat_core{$kstat_core_id{$val}} == 2) { # Hyper-Thread is enabled in BIOS. # Only change corecnt if not already # done earlier in check_psrinfo_pv. $corecnt /= 2 if (! $hyperthread); $hyperthread=1; &pdebug("hyperthread=1: from kstat, cputype=$cputype"); last; } } } } elsif (@kstat_brand && @kstat_MHz) { @kstat_brandMHz=(); @kstat_brand_arr=(); @kstat_MHz_arr=(); $i=0; foreach $brand (@kstat_brand) { $kstat_brandMHz{$brand,$kstat_MHz[$i]}++; push(@kstat_brand_arr, "$brand") if (! grep($_ eq $brand, @kstat_brand_arr)); push(@kstat_MHz_arr, "$kstat_MHz[$i]") if (! grep($_ eq $kstat_MHz[$i], @kstat_MHz_arr)); $i++; } @kstat_cpubanners=(); # return unless have mix of CPUs or is VM return if ($#kstat_brand_arr == 0 && $#kstat_MHz_arr == 0 && ! &is_virtualmachine); foreach $brand (@kstat_brand_arr) { foreach $MHz (@kstat_MHz_arr) { if ($kstat_brandMHz{$brand,$MHz}) { $cputype=$brand; if ($isX86) { $cputype=&multicore_cputype($cputype,$corecnt); } else { &multicore_cpu_cnt; } $tmp=""; $cnt=$kstat_brandMHz{$brand,$MHz} / $corecnt; $cpucntfrom="kstat"; $tmp .= "$cnt X " if ($cnt > 1); push(@kstat_cpubanners, "$tmp$cputype ${MHz}MHz"); } } } $i=0; foreach (@kstat_cpubanners) { $kstat_cpubanner .= ", " if ($i); $kstat_cpubanner .= $_; $i++; } $kstat_cpubanner=&cleanup_cputype($kstat_cpubanner); &pdebug("in check_kstat, kstat_cpubanner=$kstat_cpubanner"); } } sub found_empty_bank { $empty_banks .= "," if ($empty_banks); $boardslot_mem=~s/[: ]//g; $empty_banks .= " Board $boardslot_mem @_"; } sub print_empty_memory { return if (&is_virtualmachine || $empty_memory_printed); $s=shift; print "empty $s: "; $sockets_empty=~s/^\s*//; $sockets_empty=~s/^,\s*//; print (($sockets_empty) ? "$sockets_empty\n" : "None\n"); $empty_memory_printed=1; } sub print_bios_error { return if (&is_virtualmachine); print " An upgraded BIOS from your manufacturer "; if (&check_dmidecode_ver != 0) { print "or a newer version of dmidecode\n from "; print "$dmidecodeURL "; } print "may fix this issue.\n This is a BIOS "; print "or dmidecode " if (&check_dmidecode_ver != 0); print "bug, not a bug in memconf"; print " or dmidecode" if (&check_dmidecode_ver == 0); print ".\n"; &check_dmidecode_ver(1); $recognized=0; $exitstatus=1; } sub found_nvsimm_bank { $nvsimm_banks .= ", Board $boardslot_mem @_"; } sub recommend_prtdiag_patch { # Sun BugID 4664349 print " This may be corrected by installing "; if ($osrel eq "5.9") { print "Sun patch 113221-03 or 118558-06 or later.\n"; } elsif ($osrel eq "5.8") { print "Sun patch 109873-26 or 111792-11 or later.\n"; } else { print "a Sun patch on this system.\n"; } } sub numerically { $a <=> $b; } sub alphanumerically { local($&, $`, $', $1, $2); # Sort numbers numerically return $a cmp $b if ($a !~ /\D/ && $b !~ /\D/); # Handle things like CH0/D0, p0.d0, DIMM1_A, Board 1,1A return $a cmp $b if ($a =~ /[\/\.,_]/ && $b =~ /[\/\.,_]/); # Handle things like DIMM 1A return $a cmp $b if ($a =~ /\d\D$/ && $b =~ /\d\D$/); # Handle things like DIMM 1 BANK A, ..., DIMM 12 BANK D if ($a =~ /(.*\D)(\d+)\D+$/) { ($a1, $a2) = ($1, $2); if ($b =~ /(.*\D)(\d+)\D+$/) { ($b1, $b2) = ($1, $2); return $a2 <=> $b2 if ($a1 eq $b1); } } # Handle things like DIMM1, ..., DIMM10 if ($a =~ /^(\D+)(\d+)\b/) { ($a1, $a2) = ($1, $2); if ($b =~ /^(\D+)(\d+)\b/) { ($b1, $b2) = ($1, $2); return $a2 <=> $b2 if ($a1 eq $b1); } } # Default is to sort alphabetically return $a cmp $b; } sub lc { $s=shift; return "" if (! defined($s)); $s=~tr/[A-Z]/[a-z]/; return $s; } sub dos2unix { # Convert "CR LF" or "CR" to "LF" $s=shift; $s=~s/\r\n/\n/g; $s=~s/\r/\n/g; return $s; } sub convert_freq { ($freqx)=@_; if ($isX86) { $freq=int(hex("0x$freqx") / 10000 + 0.5); } else { if ($freqx =~ /'/) { $freqpack=$freqx; $freqpack=~s/'//g; @frequnpack=unpack("C*",$freqpack); $freqx=""; foreach $field (@frequnpack) { $freqx.=sprintf("%02lx", $field); } if ($#frequnpack < 3) { $freqx.="00"; } } $freq=int(hex("0x$freqx") / 1000000 + 0.5); } return $freq; } sub mychomp { # Used instead of chop or chomp for compatibility with perl4 and perl5 ($a)=@_; return "" if (! defined($a)); $a=~s,$/$,,g; return $a; } sub hex2ascii { $_=shift; return $_ if (! /^0x/); s/0x(([0-9a-f][0-9a-f])+)/pack('H*', $1)/ie; s/[\x00|\s]+$//; # remove trailing nulls and spaces return $_; } sub pdebug { if ($debug == 1) { print "DEBUG: @_\n"; } elsif ($debug == 2) { printf "DEBUG time %.2f", ((times)[0] - $starttime); print ": @_\n"; } } sub run { &pdebug("Running @_"); `@_ 2>&1`; } sub read_prtdiag_bank_table { # prtdiag Bank Table $simmsize=substr($line,33,5); if ($simmsize =~ /\dGB/) { $simmsize=~s/GB//g; $simmsize *= 1024; } else { $simmsize=~s/MB//g; } if (! $prtdiag_banktable_has_dimms || $line =~ / 0$/) { # Interleave Way = 0 $simmsize /= 2; } if ($prtdiag_banktable_has_dimms && $line =~ / 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15/) { # Interleave Way = 16 $simmsize *= 4; $intcnt=1; push(@simmsizesfound, "$simmsize"); } elsif ($intcnt) { # Interleave Way = 16 $intcnt++; $simmsize *= 4; } $a=substr($line,9,2); $a=~s/ //g; $b=substr($line,23,1); $sz=&show_memory_label($simmsize); $grpsize{$a,$b}=$sz; $memlength=length($line); if ($memlength > 49) { $grpinterleave{$a,$b}=substr($line,49,40) if (substr($line,49,40)); } if ($intcnt == 0) { push(@simmsizesfound, "$simmsize"); $simmsize=&show_memory_label($simmsize) . " "; if (! $prtdiag_banktable_has_dimms) { $newline=substr($line,0,38) . " 2x" . substr($simmsize,0,5); $newline .= substr($line,42,20) if ($memlength > 38); } } $intcnt=1 if ($prtdiag_banktable_has_dimms && $line =~ / 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15/); $intcnt=0 if ($intcnt == 16); } sub read_prtdiag_memory_segment_table { # prtdiag Memory Segment Table $simmsize=($line =~ /\dGB/) ? substr($line,19,1) * 512 : substr($line,19,3) / 2; $grp=substr($line,-2,2); $grp=~s/ //g; if ($grp eq "-") { $grp=$grpcnt; $grpcnt++; } push(@simmsizesfound, "$simmsize"); $simmsize=&show_memory_label($simmsize); $grpsize{0,$grp}=$simmsize; } $motherboard=""; $realmodel=""; $manufacturer=""; $i=0; # May not have had permission to run prtconf, so see if prtdiag works &check_for_prtdiag; if ($diagbanner) { if (! $filename || $SUNWexplo) { $model=$platform; $model=~s/SUNW,//g; $model=~s/ORCL,//g; } else { $model=$diagbanner; $model=~s/ /-/g; # define $model for systems with $diagbanner != $model $model="Ultra-4" if ($diagbanner =~ /Sun.Enterprise.450\b/); $model="Sun-Blade-1000" if ($diagbanner =~ /Sun.Blade.1000\b/); $model="Sun-Fire-280R" if ($diagbanner =~ /Sun.Fire.280R\b/); $model="Netra t1" if ($diagbanner =~ /Netra.t1\b/); $model="Netra-T4" if ($diagbanner =~ /Netra.T4\b/); $model="Sun-Blade-100" if ($diagbanner =~ /Sun.Blade.1[05]0\b/); $model="Netra-T12" if ($diagbanner =~ /Sun.Fire.V1280\b/); $model="Serverblade1" if ($diagbanner =~ /Serverblade1\b/); $model="Ultra-Enterprise" if ($diagbanner =~ /Enterprise.(E?[3-6][05]00|10000)\b/); } # Check model and banner here in case we don't have prtconf data &check_model; &check_banner; } foreach $line (@config) { $line=&dos2unix($line); $line=&mychomp($line); $config_permission=1 if ($line =~ /Node /); if ($line =~ /Permission denied/i) { $permission_error="ERROR: $line" if (! $diagbanner || ! $prtdiag_has_mem); } if ($line =~ /(^\[Component\]:\s+Memory|cstm.*selclass qualifier )/) { # for HP-UX regression test file &hpux_check; &hpux_cprop if ($line =~ /^\[Component\]:\s+Memory/); &hpux_cstm; } if ($line =~ /banner-name:/ && ! $banner) { $banner=$line; $banner=~s/\s+banner-name:\s+//; $banner=~s/'//g; $banner=~s/SUNW,//g; $banner=~s/ORCL,//g; $banner=~s/TWS,//g; $banner=~s/CYCLE,//g; $banner=~s/\s+$//; &check_banner; } if ($line =~ /model:.*AXUS/) { # AXUS clones with their name on OBP $manufacturer="AXUS"; } if (($line =~ /SUNW,(Ultra-|SPARC|S240|JavaEngine1|Ultra.*[Ee]ngine)/ || $line =~ /SUNW,(Ultra.*Netra*|Premier-24|UltraAX-|Netra|Grover)/ || $line =~ /SUNW,(Enchilada|Serverblade1|Enterprise|A[0-9]|T[0-9])/ || $line =~ /ORCL,SPARC-|Sun.4|SUNW,Axil-|^i86pc|^i86xpv|^i86xen/ || $line =~ /model:\s+'(SPARC CPU|SPARC CPCI)-/ || $line =~ /\s+name:.*(SUNW,Sun-|'i86pc'|COMPstation|Tadpole)/ || $line =~ /\s+name:.*(Auspex|S-4|FJSV,GP|CompuAdd|RDI,)/) && $line !~ /\s+:Description\s+/ && $line !~ /\s+:*whoami:*\s+/ && $line !~ /\s+:*impl-arch-name:*\s+/ && $line !~ /Sun 4x Quad/i) { $model=$line; $model=~s/\s+name:\s+//; $model=~s/\s+model:\s+//; $model=~s/\s+:binding-name\s+//; $model=~s/\s+:PlatformName\s+//; $model=~s/'//g; $model=~s/\s+$//; &check_model; if ($line =~ /CompuAdd/) { $manufacturer="CompuAdd"; if ($model eq "SS-2") { $banner=$model if (! $banner); $bannermore="SPARCstation 2"; $modelmore="SPARCstation 2"; } } } $foundname=1 if ($line =~ /\s+name:\s+/); if ($line =~ /\s+model:\s+'.+,/ && ! $foundname) { # Ultra 5/10 motherboard is 375-xxxx part number # SS10/SS20 motherboard is Sxx,501-xxxx part number if ($line =~ /,(375|500|501)-/) { $motherboard=$line; $motherboard=~s/\s+model:\s+//; $motherboard=~s/'//g; } } if ($line =~ /\sname:\s+'memory'/) { $j=$i - 2; if ($config[$j] =~ /\sreg:\s/) { $gotmemory=&mychomp($config[$j]); } elsif ($config[$j - 1] =~ /\sreg:\s/) { $gotmemory=&mychomp($config[$j - 1]); } elsif ($config[$j + 1] =~ /\sreg:\s/) { $gotmemory=&mychomp($config[$j + 1]); } } if ($line =~ /\sdevice_type:\s+'memory-bank'/) { $j=$i - 3; if ($config[$j] =~ /\sreg:\s/ && $config[$j] !~ /.00000000$/) { $config[$j]=~s/\s+reg:\s+//; $gotmemory=($gotmemory) ? "$gotmemory.$config[$j]" : $config[$j]; $gotmemory=&mychomp($gotmemory); } } # The following is not used yet #if ($line =~ /\sdevice_type:\s+'memory-module'/) { # if ($config[$i - 2] =~ /\sreg:\s/) { # $config[$i - 3]=~s/\s+socket-name:\s+//; # if ($gotmodule) { # $gotmodule .= ".$config[$i - 3]"; # } else { # $gotmodule=$config[$i - 3]; # } # $gotmodule=&mychomp($gotmodule); # $config[$i - 2]=~s/\s+reg:\s+//; # @module=split(/\./, $config[$i - 2]); # $gotmodule .= ".$module[3]"; # $gotmodule=&mychomp($gotmodule); # $config[$i + 1]=~s/\s+name:\s+//; # $config[$i + 1] =~ y/[a-z]/[A-Z]/; # $gotmodule .= ".$config[$i + 1]"; # $gotmodule=&mychomp($gotmodule); # $gotmodule=~s/'//g; # } #} if ($line =~ /\ssimm-use:\s+/) { # DIMM usage on Fujitsu GP7000 $gotmodule=&mychomp($config[$i]); $gotmodule=~s/\s+simm-use:\s+//; $slotname0="SLOT0" if ($banner =~ /GP7000\b/); } if ($line =~ /\scomponent-name:\s+'.*CPU.*'/) { # CPUs on Fujitsu GP7000F and PrimePower systems $slotname=$line; $slotname=~s/\s+component-name:\s+//; $slotname=~s/'//g; $gotcpunames=($gotcpunames) ? "$gotcpunames $slotname" : $slotname; $boardname=$slotname; $boardname=~s/-.*//g; if ($boardname ne $slotname) { if ($gotcpuboards) { $gotcpuboards .= " $boardname" if ($gotcpuboards !~ /\b$boardname\b/); } else { $gotcpuboards=$boardname; } } } if ($line =~ /\sdevice_type:\s+'memory-module'/) { # DIMM usage on Fujitsu GP7000F and PrimePower systems $slotname=""; if ($config[$i - 3] =~ /\scomponent-name:\s/) { $slotname=$config[$i - 3]; } if ($config[$i - 4] =~ /\scomponent-name:\s/) { $slotname=$config[$i - 4]; } if ($slotname) { $slotname=~s/\s+component-name:\s+//; $slotname=~s/'//g; $slotname=&mychomp($slotname); $gotmodulenames=($gotmodulenames) ? "$gotmodulenames.$slotname" : $slotname; $slotname0=$slotname if (! $slotname0); $config[$i - 1]=~s/\s+reg:\s+//; @module=split(/\./, $config[$i - 1]); $gotmodulenames .= ".$module[1]"; $gotmodulenames=&mychomp($gotmodulenames); } } if ($line =~ /\sname:\s+'cgfourteen'/) { # Determine size of VSIMM # Currently assumes only one VSIMM is installed if ($config[$i - 2] =~ /\sreg:\s/) { $sx_line=&mychomp($config[$i - 2]); } elsif ($config[$i - 3] =~ /\sreg:\s/) { $sx_line=&mychomp($config[$i - 3]); } @sxline=split(/\./, $sx_line); $sxmem=hex("0x$sxline[5]") / $meg; } if ($line =~ /501-2197/) { # 1MB Prestoserve NVSIMMs (SS1000/SC2000) if ($config[$i + 1] =~ /\sreg:\s/) { $nv_line=&mychomp($config[$i + 1]); } elsif ($config[$i + 2] =~ /\sreg:\s/) { $nv_line=&mychomp($config[$i + 2]); } @nvline=split(/\./, $nv_line); $nvmem += hex("0x$nvline[2]") / $meg; } if ($line =~ /501-2001/) { # 2MB Prestoserve NVSIMMs (SS10/SS20) if ($config[$i + 1] =~ /\sreg:\s/) { $nv_line=&mychomp($config[$i + 1]); } elsif ($config[$i + 2] =~ /\sreg:\s/) { $nv_line=&mychomp($config[$i + 2]); } @nvline=split(/\./, $nv_line); $nvmem += hex("0x$nvline[2]") / $meg; $nvmem1=1 if ($nvline[1] eq "10000000"); $nvmem2=1 if ($nvline[1] eq "14000000" || $nvline[1] eq "1c000000"); } if ($line =~ /Memory size:\s/ && $installed_memory == 0) { $installed_memory=$line; $installed_memory=~s/^.*size: *(\d*[GM]*[Bb]*).*/$1/; if ($installed_memory =~ /GB/) { $installed_memory=~s/GB//g; $installed_memory *= 1024; } else { $installed_memory=~s/MB//ig; } # prtconf sometimes reports incorrect total memory # 32MB is minimum for sun4u machines if ($installed_memory < 32 && $machine eq "sun4u") { $prtconf_warn="Incorrect total installed memory (${installed_memory}MB) was reported by prtconf."; $installed_memory=0; } # Round up some odd-number total memory values $installed_memory++ if (sprintf("%3d", ($installed_memory + 1) / 2) * 2 != $installed_memory && $installed_memory >= 1023); $BSD=0; # prtconf and prtdiag only have this output $config_cmd="/usr/sbin/prtconf -vp" if ($config_cmd !~ /prtconf/); $config_command="prtconf"; } if ($sysfreq == 0 && $freq) { $sysfreq=$freq; $freq=0; } if ($devtype eq "cpu" || $line =~ /compatible: 'FJSV,SPARC64-/) { if ($cputype =~ /SPARC64-/) { $cpufreq=$freq if ($freq > $cpufreq); } else { $cpufreq=$freq; } $cpuline=$line; $j=$i - 3; while ($cpuline !~ /^$/ && $cpuline !~ /^\r$/) { if ($cpuline =~ /clock-frequency:/) { @freq_line=split(' ', $cpuline); $cpufreq=&convert_freq($freq_line[1]); $sysfreq=$freq if ($sysfreq == 0 && $freq); } elsif ($cpuline =~ /\s(name:|compatible:)\s/ && $cpuline !~ /Sun 4/ && $cpuline !~ /SPARCstation/ && $cpuline !~ /CompuAdd/ && $cpuline !~ /'cpu/ && $cpuline !~ /'core'/) { $cputype=&mychomp($cpuline); $cputype=~s/\s+name:\s+//; $cputype=~s/\s+compatible:\s+//; $cputype=~s/'//g; $cputype=~s/SUNW,//g; $cputype=~s/ORCL,//g; $cputype=~s/FJSV,//g; $cputype=~s/ .*//g; } elsif ($cpuline =~ /\sname:\s/ && ! $model) { $model=&mychomp($cpuline); $model=~s/\s+name:\s+//; $model=~s/'//g; $model=~s/SUNW,//g; $model=~s/ORCL,//g; $model=~s/FJSV,//g; } $j++; $cpuline=($config[$j]) ? $config[$j] : ""; } $freq=0; $cpufreq=$sysfreq if ($sysfreq >= $cpufreq); &pdebug("Checking cputype=$cputype, ncpu=$ncpu, threadcnt=$threadcnt"); if (! $cputype) { $cputype=$machine; $cputype="SPARC" if ($cputype =~ /^sun4/ || $model =~ /Sun 4\//); @bannerarr=split(/\s/, $banner); foreach $field (@bannerarr) { if ($field =~ /SPARC/ && $field !~ /SPARCstation/) { $cputype=$field; } elsif ($field =~ /390Z5/) { $field="TI,TMS$field" if ($field =~ /^390Z5/); $cputype=($cpufreq > 70) ? "SuperSPARC-II $field" : "SuperSPARC $field"; } elsif ($field =~ /RT62[56]/) { $cputype="hyperSPARC $field"; $machine="sun4m"; } } $cputype=~s/[()]//g; } elsif ($cputype =~ /MB86907/) { $cputype="TurboSPARC-II $cputype"; } elsif ($cputype =~ /MB86904|390S10/) { $cputype=($cpufreq > 70) ? "microSPARC-II $cputype" : "microSPARC $cputype"; } elsif ($cputype =~ /,RT62[56]/) { $cputype="hyperSPARC $cputype"; $machine="sun4m"; } elsif ($cputype =~ /UltraSPARC-IV/) { # Count Dual-Core US-IV & US-IV+ as 1 CPU $cputype="Dual-Core $cputype"; $machine="sun4u"; $threadcnt++; $threadcnt=0 if ($threadcnt == 2); # CPU count is better from prtdiag than psrinfo for # US-IV & US-IV+ Dual-Core processors. $use_psrinfo_data=0; } elsif ($cputype =~ /UltraSPARC-T1$/) { # Count 4-Thread (4, 6, or 8 Core) Niagara CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /UltraSPARC-T2\+/) { # Count 8-Thread (4, 6, or 8 Core) Victoria Falls CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /UltraSPARC-T2$/) { # Count 8-Thread (4 or 8 Core) Niagara-II CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC-T3$/) { # Count 8-Thread (8 or 16 Core) Rainbow Falls CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC-T4$/) { # Count 8-Thread 8-Core SPARC-T4 CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC-T5$/) { # Count 8-Thread 16-Core SPARC-T5 CPUs as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC64-VI$/ && $devtype eq "cpu") { # Count Dual-Core Dual-Thread as 1 CPU $machine="sun4u"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC64-VII\+\+$/ && $devtype eq "cpu") { # Count Quad-Core Dual-Thread as 1 CPU $machine="sun4u"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC64-VII\+$/ && $devtype eq "cpu") { # Count Quad-Core Dual-Thread as 1 CPU $machine="sun4u"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC64-VII$/ && $devtype eq "cpu") { # Count Quad-Core Dual-Thread as 1 CPU $machine="sun4u"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype eq "SPARC64-VIII" && $devtype eq "cpu") { # Guess on the Venus SPARC64-VIII name ??? # Count 8-Core Dual-Thread as 1 CPU $machine="sun4u"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } elsif ($cputype =~ /SPARC64-X$/ && $devtype eq "cpu") { # Count 16-Core Dual-Thread as 1 CPU $machine="sun4v"; $threadcnt++; # Number of cores & CPUs counted outside this loop below } if ($threadcnt == 0 && $devtype eq "cpu") { $ncpu++; $cpucnt{"$cputype $cpufreq"}++; $cpucntfrom=$config_command; } $devtype=""; if (! $kernbit) { $kernbit=32 if ($machine =~ /sun4[cdm\b]/); $kernbit=64 if ($machine eq "sun4v" || $cputype =~ /UltraSPARC-III|UltraSPARC-IV|SPARC64/); } } if ($line =~ /device_type:/) { @dev_line=split(/\'/, $line); $devtype=$dev_line[1]; } if ($line =~ /clock-frequency:/) { @freq_line=split(' ', $line); $freq=&convert_freq($freq_line[1]); } if ($line =~ /\sversion:\s+'OBP/ && ! $romver) { $romver=$line; $romver=~s/\s+version:\s+//; $romver=~s/'//g; @romverarr=split(/\s/, $romver); $romvernum=$romverarr[1]; } if ($line =~ /compatible:\s+'sun4.'/ && ! $osrel) { @compatible_line=split(/\'/, $line); $machine=$compatible_line[1]; } if ($line =~ /value='.*AMD Opteron/ && $cputype eq "x86") { $cputype_prtconf=$line; $cputype_prtconf=~s/.*='//; $cputype_prtconf=~s/'//g; } $i++; } &multicore_cpu_cnt; &check_cpuinfo; &check_xm_info; if (! $osrel) { if ($BSD) { $osrel="4.X"; $config_cmd="/usr/etc/devinfo -pv"; $config_command="devinfo"; $cpucntfrom="devinfo"; # } elsif ($os =~ /Linux|FreeBSD/) { # $osrel="2.X"; # Could also be 3.X Linux kernel, so leave empty } else { $osrel="5.X"; $solaris="2.X"; if ($machine =~ /86/) { $solaris .= " X86"; } elsif ($machine =~ /sun4/) { $solaris .= " SPARC"; } $config_cmd="/usr/sbin/prtconf -vp"; $config_command="prtconf"; } } $memfrom=$config_command; #$sysfreq=$freq if ($sysfreq == 0 && $freq); #$cpufreq=$sysfreq if ($sysfreq > $cpufreq && $ncpu); @romverarr=split(/\./, $romvernum) if ($romver); $romvermajor=($romverarr[0]) ? $romverarr[0] : 2; $romverminor=($romverarr[1]) ? $romverarr[1] : 0; $romverminor=0 if (! $romverminor || $romverminor eq "X"); if ($banner =~ /^ \(/) { # banner-name does not include the eeprom banner name. This happens # sometimes when OBP 3.23 is installed on Ultra-60/E220R and # Ultra-80/E420R systems. $bannermore="Ultra 60 or Enterprise 220R" if ($model eq "Ultra-60"); $bannermore="Ultra 80, Enterprise 420R or Netra t 1400/1405" if ($model eq "Ultra-80"); } # # SPARCengine systems # $ultra="AX" if ($motherboard =~ /501-3043/); $ultra="AX-300" if ($motherboard =~ /501-5037/); $ultra="AXi" if ($motherboard =~ /501-4559/); $ultra="AXmp" if ($banner =~ /UltraAX-MP/ || $model =~ /UltraAX-MP/ || $motherboard =~ /501-(5296|5487|5670)/); $ultra="AXmp+" if ($banner =~ /UltraAX-MP\+/ || $model =~ /UltraAX-MP\+/ || $motherboard =~ /501-4324/); $ultra="AXe" if ($banner =~ /UltraAXe\b/ || $model =~ /UltraAX-e\b/ || $motherboard =~ /375-0088/); $ultra="AX-e2" if ($banner =~ /Netra AX1105-500\b/ || $model =~ /UltraAX-e2\b/ || $motherboard =~ /375-0128/); $ultra="Netra X1" if ($banner =~ /Netra X1\b/ || $motherboard =~ /375-3015/); $ultra="Netra T1 200" if ($banner =~ /Netra T1 200\b/ || $motherboard =~ /375-0132/); $ultra="Sun Fire V100" if ($banner =~ /Sun Fire V100\b/); # Sun Fire V120/Netra 120 can use motherboard 375-0132 like Netra T1 200 above $ultra="Sun Fire V120" if ($banner =~ /Sun Fire V120\b/); $ultra="Netra 120" if ($banner =~ /Netra 120\b/); if ($ultra =~ /AX/) { if ($banner !~ /SPARCengine.*Ultra/) { $tmp="(SPARCengine Ultra $ultra)"; $bannermore=($bannermore) ? "$tmp $bannermore" : $tmp; } } if ($model =~ /Ultra-5_10\b/) { if ($banner =~ /\bVoyagerIIi\b/) { # Tadpole Voyager IIi has 8 DIMM slots, but prtconf reports # it as an Ultra 5/10 $model="VoyagerIIi"; $ultra="VoyagerIIi"; } } $ultra="Sun Blade 150" if ($banner =~ /Sun Blade 150\b/ || $diagbanner =~ /Sun Blade 150\b/); $ultra="UP-20" if ($banner =~ /\bUP-20\b/); # untested ??? $ultra="UP-520IIi" if ($motherboard =~ /501-4559/ && $banner =~ /\b520IIi\b/); $need_obp2=0; if ($model eq "Sun 4/20" || $model eq "Sun 4/25" || $model eq "Sun 4/40" || $model eq "Sun 4/50" || $model eq "Sun 4/60" || $model eq "Sun 4/65" || $model eq "Sun 4/75" || $model eq "SS-2") { $machine="sun4c"; $need_obp2=1 if ($model eq "Sun 4/40" || $model eq "Sun 4/60" || $model eq "Sun 4/65"); } &check_prtdiag if ($isX86); if ($isX86) { # Round up Solaris x86 memory (may have 128MB or more reserved) $installed_memory=&roundup_memory($installed_memory); } if (! $gotmemory && $ultra eq 0 && $machine ne "sun4d" && $boardfound_mem eq 0) { &check_prtdiag; &show_header; if ($installed_memory) { print "total memory = "; &show_memory($installed_memory); } print "$permission_error\n" if ($permission_error); print "$prtconf_warn\n" if ($prtconf_warn); if ($prtdiag_failed == 2) { &found_nonglobal_zone; } else { print "ERROR: no 'memory' line in \"$config_cmd\" output.\n" if ($machine =~ /sun4/); if (! $config_permission && $machine =~ /sun4/ && ! $prtconf_warn) { print " This user "; print (($permission_error) ? "does" : "may"); print " not have permission to run $config_command.\n"; print " Try running memconf as a privileged user like root.\n" if ($uid ne "0"); } elsif ($need_obp2) { print " Upgrading from Open Boot PROM V1.X to V2.X will "; print "allow memconf to\n detect the memory installed.\n"; } elsif ($prtconf_warn =~ /openprom/) { print " Please correct the problem with the openprom device.\n" if ($machine =~ /sun4/); } else { print " This is an unsupported system by memconf.\n" if ($machine =~ /sun4/); } } &show_supported if ($machine !~ /sun4/ && $prtdiag_failed != 2); $exitstatus=1; &mailmaintainer if ($verbose == 3); &pdebug("exit $exitstatus"); exit $exitstatus; } $gotmemory=~s/\s+reg:\s+//; $gotmemory=~s/'//g; @slots=split(/\./, $gotmemory); $slot=1; if ($machine =~ /sun4|i86pc|i86xpv|i86xen/ && $manufacturer && $manufacturer !~ /^Sun\b|^Oracle\b/ && $ultra !~ /SPARC Enterprise M[34589]000 Server/ && ! &is_virtualmachine) { $bannermore=($bannermore) ? "$bannermore clone" : "clone" if ($manufacturer ne "Force Computers"); $modelmore=($modelmore) ? "$modelmore clone" : "clone" if (! $isX86); $clone=1; } # DIMMs are installed in pairs on Ultra 1, 5 and 10; quads on # Ultra 2, 60, 80, 220R, 420R, 450; 8's in Ultra Enterprise # # On 64-bit systems, prtconf format is AAAAAAAA.AAAAAAAA.SSSSSSSS.SSSSSSSS # and on 32-bit systems, prtconf format is AAAAAAAA.AAAAAAAA.SSSSSSSS # where A is for Address, S is for Size. # Minimum module size is 1MB (0x00100000), so strip off last 5 hex digits of LSB # and prepend last 5 digits of MSB, which allows recognizing up to 4500TB! # if ($ultra) { $val0=3; # simmsize is in 3rd and 4th fields $valaddr=2; # address is 2 fields before simmsize $valinc=4; # fields per simm $memtype="DIMM"; } else { $val0=2; # simmsize is in 3rd field $valaddr=1; # address is 1 field before simmsize $valinc=3; # fields per simm } # # Define memory layout for specific systems # if ($model eq "Sun 4/20") { # SLC accepts 4MB SIMMs on motherboard # 501-1676 (4MB 100ns), 501-1698 (4MB 80ns) # 33-bit 72-pin Fast Page Mode (36-bit work also) # Does not support Open Boot PROM V2.X, so devinfo/prtconf output will # not have memory lines. $devname="OffCampus"; $untested=1; $simmrangex="00000010"; $simmbanks=4; $simmsperbank=1; @simmsizes=(4); @socketstr=("U0502","U0501","U0602","U0601"); } if ($model eq "Sun 4/25") { # ELC accepts 4MB or 16MB SIMMs on motherboard # 501-1698 or 501-1812 (4MB 80ns), 501-1822 (16MB 80ns) # 33-bit 72-pin Fast Page Mode (36-bit work also) $devname="NodeWarrior"; $untested=0; $simmrangex="00000010"; $simmbanks=4; $simmsperbank=1; @simmsizes=(4,16); @socketstr=("U0407".."U0410"); @bankstr=("MEM1".."MEM4"); } if ($model eq "Sun 4/40") { # IPC accepts 1MB or 4MB SIMMs on motherboard # 501-1697 (1MB 80ns), 501-1625 (4MB 100ns), 501-1739 (4MB 80ns) # Does not show memory with Open Boot PROM V1.X, but does with OBP V2.X $devname="Phoenix"; $untested=0; $simmrangex="00000010"; $simmbanks=3; $simmsperbank=4; @simmsizes=(1,4); @socketstr=("U0588","U0587","U0586","U0585","U0584","U0591","U0590","U0589","U0678","U0676","U0683","U0677"); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2); @bytestr=(0..3,0..3,0..3); } if ($model eq "Sun 4/50") { # IPX accepts 4MB or 16MB SIMMs on motherboard # 501-1812 (4MB 80ns), 501-1915 or 501-1822 (16MB 80ns) # 33-bit 72-pin Fast Page Mode (36-bit work also) $devname="Hobbes"; $untested=0; $simmrangex="00000010"; $simmbanks=4; $simmsperbank=1; @simmsizes=(4,16); @socketstr=("U0310","U0309","U0308","U0307"); @bankstr=(0..3); } if ($model eq "Sun 4/60" || $model eq "Sun 4/65") { # SS1 and SS1+ accepts 1MB or 4MB SIMMs on motherboard # 501-1408 (1MB 100ns), 501-1697 (SS1+ only) (1MB 80ns), # 501-1625 (4MB 100ns), 501-1739 (4MB 80ns) # Does not show memory with Open Boot PROM V1.X, but does with OBP V2.X if ($model eq "Sun 4/60") { $devname="Campus"; $untested=0; } else { $devname="CampusB, Campus+"; $untested=1; } $simmrangex="00000010"; $simmbanks=4; $simmsperbank=4; @simmsizes=(1,4); @socketstr=("U0588","U0587","U0586","U0585","U0584","U0591","U0590","U0589","U0678","U0676","U0683","U0677","U0682","U0681","U0680","U0679"); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bytestr=(0..3,0..3,0..3,0..3); } if ($model eq "Sun 4/75" || $model eq "SS-2") { # SS2 accepts 4MB SIMMs on motherboard and 32MB or 64MB SBus expansion # card (501-1823 Primary and 501-1824 Secondary) # 501-1739 (4MB 80ns) $devname="Calvin"; $untested=0; $simmrangex="00000010"; $simmbanks=4; $simmsperbank=4; @simmsizes=(4); @socketstr=("U0311","U0309","U0307","U0322","U0312","U0310","U0308","U0321","U0313","U0314","U0315","U0320","U0319","U0318","U0317","U0316"); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bytestr=(0..3,0..3,0..3,0..3); } if ($model =~ /SPARCclassic|SPARCstation-LX/) { # Classic-X (4/10) accepts 1MB, 2MB, 4MB and 16MB SIMMs on motherboard # Classic (4/15) and LX (4/30) accepts 4MB and 16MB SIMMs on motherboard # Can accept 32MB SIMMs in bank 1, allowing 128MB total (2x32, 4x16) # Possibly accepts 8MB SIMMs in bank 1 # 501-2289 (1MB), 501-2433 (2MB) on Classic-X only # 501-1991 (4MB), 501-2059 (16MB) # 36-bit 72-pin 60ns Fast Page Mode $devname="Sunergy"; if ($model =~ /SPARCclassic-X/) { $untested=1; @simmsizes=(1,2,4,8,16,32); } else { $untested=0; @simmsizes=(4,8,16,32); } $simmrangex="00000020"; $simmbanks=3; $simmsperbank=2; @socketstr=("U0304","U0303","U0301","U0302","U0402","U0401"); @bankstr=(1,1,2,2,3,3); } if ($model eq "S240") { # Voyager has 16MB on motherboard, plus accepts one or two 16MB or 32MB # Memory cards (501-2327 32MB, 501-2366 16MB) # Motherboard, address 0x00000000-0x007fffff, 0x01000000-0x017fffff # Lower slot=Mem 1, address 0x02000000-0x07ffffff # Upper slot=Mem 2, address 0x0a000000-0x0fffffff $devname="Gypsy"; $untested=0; $memtype="memory card"; $sockettype="slot"; $simmrangex="00000020"; $simmbanks=8; # Count the skipped address range $simmsperbank=1; @simmsizes=(16,32); @socketstr=("motherboard","Mem 1","Mem 1","Mem 1","?","Mem 2","Mem 2","Mem 2"); @orderstr=("","lower slot","lower slot","lower slot","?","upper slot","upper slot","upper slot"); } if ($model eq "JavaEngine1") { # Accepts 8MB, 16MB and 32MB EDO DIMMs $devname="Bali"; $untested=0; $memtype="DIMM"; $simmrangex="00000020"; $simmbanks=2; $simmsperbank=1; @simmsizes=(8,16,32); @socketstr=("J0501","J0502"); @bankstr=(0,1); } if ($model eq "SPARCstation-4") { # Accepts 8MB and 32MB SIMMs on motherboard # 501-2470 (8MB), 501-2471 (32MB) # 168-pin 60ns Fast Page Mode $devname="Perigee"; $untested=0; $simmrangex="00000020"; $simmbanks=5; $simmsperbank=1; @simmsizes=(8,32); @socketstr=("J0301".."J0305"); @bankstr=(0..4); } if ($model eq "SPARCstation-5" || $model eq "micro COMPstation 5" || $model =~ /Axil-255/ || $banner =~ /TWINstation 5G\b/) { # Accepts 8MB and 32MB SIMMs on motherboard # 501-2470 (8MB), 501-2471 (32MB) # 168-pin 60ns Fast Page Mode $devname="Aurora" if ($model eq "SPARCstation-5"); $untested=0; $simmrangex="00000020"; $simmbanks=8; $simmsperbank=1; @simmsizes=(8,32); @socketstr=("J0300".."J0303","J0400".."J0403"); @bankstr=(0..7); if ($banner =~ /TWINstation 5G\b/) { $simmbanks=6; @socketstr=(0..5); } if ($model ne "SPARCstation-5") { $bannermore="SPARCstation 5 clone"; $modelmore="SPARCstation 5 clone"; } } if ($model =~ /SPARCstation-10/ || $model eq "Premier-24" || $motherboard eq "SUNW,S10,501-2365") { # Accepts 16MB and 64MB SIMMs on motherboard # 501-1785 or 501-2273 (16MB 80ns), 501-2479 (16MB 60ns), # 501-2622 (32MB 60ns), 501-1930 (64MB 80ns), 501-2480 (64MB 60ns) # 200-pin 60ns or 80ns Fast Page Mode ECC # 32MB SIMMs not supported according to Sun, but appears to work fine # depending on the OBP revision. OBP 2.12 and older detects the 32MB # SIMM as 16MB, OBP 2.19 and later properly detects the 32MB SIMM. $devname="Campus2" if ($model =~ /SPARCstation-10/); $devname="Campus2+" if ($model =~ /Premier-24/); $untested=0; $simmrangex="00000040"; $simmbanks=8; $simmsperbank=1; $romvernum="2.X" if (! $romvernum); $romverminor=0 if (! $romverminor || $romverminor eq "X"); @simmsizes=(($romvermajor eq 2) && ($romverminor >= 19)) ? (16,32,64) : (16,64); @socketstr=("J0201","J0203","J0302","J0304","J0202","J0301","J0303","J0305"); @orderstr=("1st","3rd","4th","2nd","8th","6th","5th","7th"); @bankstr=(0..7); } if ($model =~ /SPARCstation-20|COMPstation-20S/ || $banner =~ /TWINstation 20G\b/) { # Accepts 16MB, 32MB and 64MB SIMMs on motherboard # 501-2479 (16MB), 501-2622 (32MB), 501-2480 (64MB) # 200-pin 60ns Fast Page Mode ECC $devname="Kodiak" if ($model eq "SPARCstation-20"); $untested=0; $simmrangex="00000040"; $simmbanks=8; $simmsperbank=1; @simmsizes=(16,32,64); @socketstr=("J0201","J0303","J0202","J0301","J0305","J0203","J0302","J0304"); @orderstr=("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr=(0..7); if ($model !~ /SPARCstation-20/) { $bannermore="SPARCstation 20 clone"; $modelmore="SPARCstation 20 clone"; } if ($model eq "SPARCstation-20I") { $bannermore="(SPARCstation-20I) clone"; $modelmore="clone"; } if ($banner =~ /TWINstation 20G\b/) { # @socketstr=("J0201","J0303","J0202","J0301","J0305","J0203","J0302","J0304"); # @orderstr=("1st","6th","2nd","4th","8th","3rd","5th","7th"); @socketstr=(0..7); @orderstr=(""); } } if ($model eq "SPARCsystem-600" || $model =~ /Sun.4.600/) { # Accepts 4MB or 16MB SIMMs on motherboard # Accepts 1MB, 4MB or 16MB SIMMs on VME expansion cards # A memory bank is 16 SIMMs of the same size and speed # Minimum memory configuration is 16 SIMMs in Bank 0 on the motherboard # Motherboard Bank 1 must be populated before adding expansion cards # Up to two VME memory expansion cards can be added # Use 4MB SIMM 501-1739-01 or 501-2460-01 # Use 16MB SIMM 501-2060-01 $devname="Galaxy"; $untested=0; $simmrangex="00000100"; $simmbanks=2; # 2 banks on CPU board, 4 banks on each expansion cards $simmsperbank=16; @simmsizes=(4,16); # Sockets, banks and bytes on motherboard @socketstr=("U1107","U1307","U1105","U1305","U1103","U1303","U1101","U1301","U1207","U1407","U1205","U1405","U1203","U1403","U1201","U1401","U1108","U1308","U1106","U1306","U1104","U1304","U1102","U1302","U1208","U1408","U1206","U1406","U1204","U1404","U1202","U1402"); @bankstr=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); @banksstr=("Motherboard bank 0","Motherboard bank 1"); @bytestr=("0L0","0L1","1L0","1L1","2L0","2L1","3L0","3L1","4L0","4L1","5L0","5L1","6L0","6L1","7L0","7L1","0H0","0H1","1H0","1H1","2H0","2H1","3H0","3H1","4H0","4H1","5H0","5H1","6H0","6H1","7H0","7H1"); # Sockets, banks and bytes on VME expansion cards @socketstr_exp=("U1501","U1503","U1505","U1507","U1601","U1603","U1605","U1607","U1701","U1703","U1705","U1707","U1801","U1803","U1805","U1807","U1502","U1504","U1506","U1508","U1602","U1604","U1606","U1608","U1702","U1704","U1706","U1708","U1802","U1804","U1806","U1808","U1901","U1903","U1905","U1907","U2001","U2003","U2005","U2007","U2101","U2103","U2105","U2107","U2201","U2203","U2205","U2207","U1902","U1904","U1906","U1908","U2002","U2004","U2006","U2008","U2102","U2104","U2106","U2108","U2202","U2204","U2206","U2208"); @bankstr_exp=("B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B0","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B1","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B2","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3","B3"); @bytestr_exp=("0L0","0L1","1L0","1L1","2L0","2L1","3L0","3L1","4L0","4L1","5L0","5L1","6L0","6L1","7L0","7L1","0H0","0H1","1H0","1H1","2H0","2H1","3H0","3H1","4H0","4H1","5H0","5H1","6H0","6H1","7H0","7H1","8L0","8L1","9L0","9L1","aL0","aL1","bL0","bL1","cL0","cL1","dL0","dL1","eL0","eL1","fL0","fL1","8H0","8H1","9H0","9H1","aH0","aH1","bH0","bH1","cH0","cH1","dH0","dH1","eH0","eH1","fH0","fH1"); } if ($model eq "Ultra-1" || $ultra eq 1) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # 501-2479 (16MB), 501-2622 (32MB), 501-2480 or 501-5691 (64MB), # 501-3136 (128MB) # 200-pin 60ns Fast Page Mode ECC $devname="Neutron (Ultra 1), Electron (Ultra 1E), Dublin (Ultra 150)"; $familypn="A11 (Ultra 1), A12 (Ultra 1E)"; $untested=0; $simmrangex="00000100"; $simmbanks=4; $simmsperbank=2; @simmsizes=(16,32,64,128); @socketstr=("U0701","U0601","U0702","U0602","U0703","U0603","U0704","U0604"); @bankstr=("0L","0H","1L","1H","2L","2H","3L","3H"); @bytestr=("00-15","16-31","00-15","16-31","00-15","16-31","00-15","16-31"); } if ($model eq "Ultra-2" || $ultra eq 2) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard $devname="Pulsar"; $familypn="A14"; $untested=0; $simmrangex="00000200"; $simmbanks=4; $simmsperbank=4; @simmsizes=(16,32,64,128); @socketstr=("U0501","U0401","U0701","U0601","U0502","U0402","U0702","U0602","U0503","U0403","U0703","U0603","U0504","U0404","U0704","U0604"); @groupstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bankstr=("0L","0H","1L","1H","0L","0H","1L","1H","0L","0H","1L","1H","0L","0H","1L","1H"); @bytestr=("00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63"); } if ($model eq "Ultra-30" || $ultra eq 30) { # Also Netra t 1100 # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # 501-2479 (16MB), 501-2622 (32MB), 501-2480 or 501-5691 (64MB), # 501-3136 (128MB) # 200-pin 60ns Fast Page Mode ECC # Two DIMMs form a pair, two pairs of DIMMs form a quad. # Minimum requirements is two DIMMs in any adjacent pair. # DIMMs can be installed in any order of pairs. # Interleaving requires a fully populated quad. # Each quad addresses 512MB of memory. $devname="Quark (Ultra-30), Lightweight (Netra t 1100)"; $familypn="A16 (Ultra-30), N01 (Netra t 1100)"; $untested=0; # simmrangex, simmbanks, and simmsperbank set later after determining # if interleaving banks using quads rather than pairs @simmsizes=(16,32,64,128); @socketstr=("U0701","U0801","U0901","U1001","U0702","U0802","U0902","U1002","U0703","U0803","U0903","U1003","U0704","U0804","U0904","U1004"); @bankstr=("Quad 0 Pair 0","Quad 0 Pair 0","Quad 0 Pair 1","Quad 0 Pair 1","Quad 1 Pair 0","Quad 1 Pair 0","Quad 1 Pair 1","Quad 1 Pair 1","Quad 2 Pair 0","Quad 2 Pair 0","Quad 2 Pair 1","Quad 2 Pair 1","Quad 3 Pair 0","Quad 3 Pair 0","Quad 3 Pair 1","Quad 3 Pair 1"); } if ($model eq "Ultra-5_10" || $ultra eq "5_10" || $ultra eq 5 || $ultra eq 10) { # Accepts 16MB, 32MB, 64MB, 128MB or 256MB DIMMs on motherboard # 16MB DIMM uses 10-bit column addressing and was not sold # 32, 64, 128 and 256MB DIMMs use 11-bit column addressing # Do not mix 16MB DIMMs with other sizes # 256MB DIMM not supported in Ultra 5 according to Sun documentation, # but they do work as long as you use low-profile DIMMs or take out the # floppy drive. # Memory speed is 60ns if 50ns and 60ns DIMMs are mixed # 2-way interleaving supported with four identical sized DIMMs # 50ns DIMMs supported on 375-0066 & 375-0079 motherboards # Bank 0 DIMM1/DIMM2 0x00000000-0x0fffffff, 0x20000000-0x2fffffff # Bank 1 DIMM3/DIMM4 0x10000000-0x1fffffff, 0x30000000-0x3fffffff $devname="Darwin/Otter (Ultra 5), Darwin/SeaLion (Ultra 10)"; $familypn="A21 (Ultra 5), A22 (Ultra 10)"; $untested=0; $simmrangex="00000100"; $simmbanks=2; $simmsperbank=2; @simmsizes=(16,32,64,128,256); @socketstr=("DIMM1".."DIMM4"); @bankstr=("0L","0H","1L","1H"); $sortslots=0; } if ($model eq "Ultra-60" || $ultra eq 60 || $ultra eq "220R") { # Also Netra t1120/1125 # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # 501-2479 (16MB), 501-2622 (32MB), 501-2480 or 501-5691 (64MB), # 501-3136 (128MB) # 200-pin 60ns Fast Page Mode ECC # U1001-U1004 bank 3 address 0xa0000000-0xbfffffff # U0901-U0904 bank 2 address 0x80000000-0x9fffffff # U0801-U0804 bank 1 address 0x20000000-0x3fffffff # U0701-U0704 bank 0 address 0x00000000-0x1fffffff if ($model eq "Ultra-60" || $ultra eq 60) { $devname="Deuterium (Ultra-60), Lightweight 2 (Netra t112x)"; $familypn="A23 (Ultra-60), N02/N04 (Netra t1120), N03 (Netra t1125)"; } if ($ultra eq "220R") { $devname="Razor"; $familypn="A34"; } $untested=0; $simmrangex="00000200"; $simmbanks=6; # Count the skipped address range $simmsperbank=4; @simmsizes=(16,32,64,128); @socketstr=("U0701".."U0704","U0801".."U0804","?","?","?","?","?","?","?","?","U0901".."U0904","U1001".."U1004"); @bankstr=(0,0,0,0,1,1,1,1,"?","?","?","?","?","?","?","?",2,2,2,2,3,3,3,3); } # # SPARCengine systems # if ($banner =~ /(Netra t1|Ultra CP 1500)\b/ || $ultra eq "Netra t1" || $model eq "Netra t1" || $ultra eq "CP1500" || $ultra eq "Netra ct400" || $ultra eq "Netra ct410" || $ultra eq "Netra ct800" || $ultra eq "Netra ct810") { # Netra t1 100/105, Netra ct400/410/800/810, SPARCengine CP1500 # Accepts 1 or 2 64MB, 128MB, 256MB or 512MB mezzanine memory cards # Netra ct400/800 use the Netra ct1600 DC chassis (N08) # Netra ct410/810 use the Netra ct1600 AC chassis (N09) # Also used in Sun Fire 12K & Sun Fire 15K # Install the highest capacity memory board first # The 370-4155 was sold for use in the Netra t1 100/105 # Up to four 370-4155 256MB memory boards can be installed # Only one 370-4155 can be mixed with any other memory boards # Cannot distinguish between 4 370-4155 256MB and 2 512MB memory boards # Maximum memory: 768MB for 270MHz/33MHz, 1GB for 360MHz/440MHz systems # # Top slot -> 64MB 64MB 128MB 128MB 256MB 256MB 512MB # Bottom slot SSF SS DSF SS SSF SS DSF SS DSF DS DSF SS DSF DS # | # v ------ ------ ------ ------ ------ ------ ------ # 64MB SSF SS Y N Y N N Y N # 64MB DSF SS Y Y Y Y Y Y Y # 128MB SSF SS Y N Y N N Y N # 128MB DSF SS Y Y Y Y Y Y Y # 256MB DSF SS Y Y Y Y Y Y Y # 512MB DSF DS Y/N * Y/N * Y/N * Y/N * Y/N * Y/N * Y/N * # # SSF=single-sided fab, DSF=double-sided fab # SS=stuffed on one side, DS=stuffed on both sides # * 512MB DSF DS board is supported on 360MHz and 440MHz systems, # 512MB DSF DS board is not supported on 270MHz and 333MHz systems # Lower board, address 0x00000000-0x0fffffff, 0x20000000-0x2fffffff # upper board, address 0x10000000-0x1fffffff, 0x30000000-0x3fffffff if ($banner =~ /Netra t1\b/ || $ultra eq "Netra t1" || $model eq "Netra t1") { $devname="Flyweight (Model 100), Flapjack (Model 105)"; $familypn="N07 (Model 100), N06 (Model 105)"; } $devname="Tonga" if ($ultra eq "Netra ct400"); $devname="Monte Carlo" if ($ultra eq "Netra ct800"); $familypn="N08" if ($ultra =~ /Netra ct[48]00/); if ($ultra =~ /Netra ct[48]10/) { $devname="Makaha"; $familypn="N09"; } $untested=0; $untested=1 if ($ultra eq "Netra ct400" || $ultra =~ /Netra ct[48]10/); $memtype="memory card"; $sockettype=""; $simmrangex="00000100"; $simmbanks=2; $simmsperbank=1; @simmsizes=(64,128,256,512); @socketstr=("base mezzanine board","additional mezzanine board"); @orderstr=("lower board","upper board"); $sortslots=0; } if ($banner =~ /Ultra CP 1400\b/ || $ultra eq "CP1400") { # Accepts 1 or 2 64MB, 128MB, 256MB or 512MB mezzanine memory cards # Has 64MB on-board memory on motherboard # Maximum memory: 832MB (64MB motherboard, 512MB bottom, 256MB top) # # Top slot -> 64MB 64MB 128MB 128MB 256MB 512MB # Bottom slot SSF SS DSF SS SSF SS DSF SS DSF SS DSF DS # | # v ------ ------ ------ ------ ------ ------ # 64MB SSF SS Y N Y N Y N # 64MB DSF SS Y Y Y Y Y N # 128MB SSF SS Y N Y N Y N # 128MB DSF SS Y Y Y Y Y N # 256MB DSF SS Y Y Y Y Y N # 512MB DSF DS Y Y Y Y Y N # # SSF=single-sided fab, DSF=double-sided fab # SS=stuffed on one side, DS=stuffed on both sides # 512MB DSF DS board is only supported in bottom slot # # Motherboard, address 0x00000000-0x03ffffff # Upper board, address 0x08000000-0xffffffff, 0x28000000-0x2fffffff # Lower board, address 0x10000000-0x17ffffff, 0x30000000-0x37ffffff $devname="Casanova"; $untested=0; $memtype="memory card"; $sockettype=""; $simmrangex="00000080"; $simmbanks=3; $simmsperbank=1; @simmsizes=(64,128,256,512); @socketstr=("motherboard","additional mezzanine board","base mezzanine board"); @orderstr=("","upper board","lower board"); $sortslots=0; } if ($ultra eq "AX" || $ultra eq "AX-300") { # SPARCengine Ultra AX and AX-300 # Accepts 8MB, 16MB, 32MB or 64MB DIMMs on motherboard # AX-300 also accepts 128MB DIMMs on motherboard $devname="Photon"; $untested=0; # unsure if socket order is correct $simmrangex="00000200"; $simmbanks=2; $simmsperbank=4; @simmsizes=(8,16,32,64,128); @socketstr=("U0301".."U0304","U0401".."U0404"); @bankstr=(0,0,0,0,1,1,1,1); } if ($ultra eq "AXi") { # SPARCengine Ultra AXi # Accepts 8MB, 16MB, 32MB, 64MB or 128MB single or dual bank 10-bit # column address type DIMMs on motherboard in all socket pairs # Accepts 8MB, 16MB, 32MB, 64MB, 128MB or 256MB dual bank 11-bit # column address type DIMMs on motherboard in Pairs 0 & 2 # (leave Pairs 1 & 3 empty) # DIMMs should be chosen as all 10-bit or all 11-bit column address type # Use 60ns DIMMs only #$devname="unknown"; $untested=0; $simmrangex="00000100"; $simmbanks=4; $simmsperbank=2; @simmsizes=(8,16,32,64,128,256); @socketstr=("U0404","U0403","U0304","U0303","U0402","U0401","U0302","U0301"); @bankstr=(0,0,2,2,1,1,3,3); $sortslots=0; } if ($ultra eq "AXmp" || $ultra eq "AXmp+") { # SPARCengine Ultra AXmp # Accepts 8MB, 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # Accepts 256MB dual-bank DIMMs in bank 0 or 1 (not both) # Can't distinguish dual-bank DIMMs from two banks of single bank DIMMs # SPARCengine Ultra AXmp+ # Accepts 8MB, 16MB, 32MB, 64MB, 128MB or 256MB DIMMs on motherboard # Accepts dual-bank DIMMs in both bank 0 and 1 # Can't distinguish dual-bank DIMMs from two banks of single bank DIMMs $devname="Crichton"; $untested=0; $simmbanks=2; $simmsperbank=8; if ($ultra eq "AXmp+") { $simmrangex="00000400"; @simmsizes=(8,16,32,64,128,256); } else { $simmrangex="00000800"; @simmsizes=(8,16,32,64,128); } @socketstr=("U0701".."U0704","U0801".."U0804","U0901".."U0904","U1001".."U1004"); @bankstr=(0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1); $sortslots=0; } if ($ultra eq "AXe") { # SPARCengine Ultra AXe # Accepts 32MB, 64MB, 128MB or 256MB single or dual bank DIMMs # DIMMs should be chosen as all 10-bit or all 11-bit column address type $devname="Topdog"; $untested=0; $simmrangex="00000100"; $simmbanks=2; $simmsperbank=2; @simmsizes=(32,64,128,256); @socketstr=("DIMM3","DIMM4","DIMM1","DIMM2"); @bankstr=(0,0,1,1); # Assume stacked DIMMs like AXi since only 128MB DIMMs have been tested $sortslots=0; } if ($ultra eq "AX-e2") { # Netra AX1105-500 # Accepts up to 4 64MB, 128MB, 256MB or 512MB registered SDRAM PC133 # DIMMs; 128MB Minimum, 2GB Maximum # DIMM0 & DIMM1 form Bank 0, DIMM2 & DIMM3 form Bank 1 # DIMMs don't have to be installed as pairs $devname="Birdsnest Lite"; $untested=0; $simmrangex="00000200"; $simmbanks=4; $simmsperbank=1; @simmsizes=(64,128,256,512); @socketstr=("DIMM0".."DIMM3"); @bankstr=(0,0,1,1); } if ($ultra eq "Netra X1" || $ultra eq "Sun Fire V100") { # Netra X1, Sun Fire V100, UltraAX-i2 # Accepts up to 4 128MB or 256MB PC133 DIMMs for 1GB maximum # 500MHz model also accepts up to 4 512MB PC133 DIMMs for 2GB maximum # Have seen slower models also work with 512MB DIMMs for 2GB maximum # Sun Fire V100 is 500MHz only # The memory installation sequence is Slot 3, 2, 1, and 0. # Each DIMM slot addresses 512MB with 400MHz UltraSPARC IIe # Each DIMM slot addresses 1GB with >= 550MHz UltraSPARC IIe # Memory is SDRAM PC133 CL=3 ECC registered # When equal size DIMMs are installed, the lowest slot number is # mapped to the lowest address range. # When mixed size DIMMs are installed, the slot number with the largest # size DIMM is mapped to the lowest address range. $devname="Flapjack-lite" if ($ultra eq "Netra X1"); $devname="Flapjack-liteCD500" if ($ultra eq "Sun Fire V100"); $familypn="N19"; $untested=0; $simmrangex=($cpufreq > 520) ? "00000400" : "00000200"; $simmbanks=4; $simmsperbank=1; @simmsizes=(128,256,512); @socketstr=("DIMM0".."DIMM3"); } if ($ultra eq "Netra T1 200" || $ultra eq "Sun Fire V120" || $ultra eq "Netra 120") { # Netra T1 200, Sun Fire V120, Netra 120, UltraAX-i2 # Accepts up to 4 256MB, 512MB or 1GB PC133 DIMMs for 4GB maximum # Sun Fire V120 is 550MHz or 650MHz # Netra 120 is same platform as Sun Fire V120, but is 650MHz only # Memory is SDRAM PC133 CL=3 ECC registered # The minimum memory requirement is one DIMM in Slot 0 # The memory installation sequence is Slot 0, 1, 2, 3 # Each DIMM slot addresses 512MB of memory with 500MHz UltraSPARC IIe # Each DIMM slot addresses 1GB of memory with >= 550MHz UltraSPARC IIe # When equal size DIMMs are installed, the lowest slot number is # mapped to the lowest address range. # When mixed size DIMMs are installed, the slot number with the largest # size DIMM is mapped to the lowest address range. if ($ultra eq "Netra T1 200") { $devname="Flapjack2"; $familypn="N21"; } if ($ultra eq "Sun Fire V120" || $ultra eq "Netra 120") { $devname="Flapjack2+"; $familypn="N25"; } $untested=0; $simmrangex=($cpufreq > 520) ? "00000400" : "00000200"; $simmbanks=4; $simmsperbank=1; @simmsizes=(256,512,1024); @socketstr=("DIMM0".."DIMM3"); } if ($banner =~ /\bCP2000\b/ || $ultra =~ /^CP2[01]\d0$/) { # Netra CP2000/CP2100 Series CompactPCI Boards (UltraSPARC-IIe) # CP2040 (SUNW,UltraSPARC-IIe-NetraCT-40) supports 256MB, 512MB, and 1GB # CP2060 (SUNW,UltraSPARC-IIe-NetraCT-60) has non-expandable 512MB # CP2080 (SUNW,UltraSPARCengine_CP-80) supports 256MB, 512MB, and 1GB # CP2140 (SUNW,UltraSPARCengine_CP-40) supports 512MB, 1GB and 2GB # CP2160 (SUNW,UltraSPARCengine_CP-60) supports 1GB and 2GB # 256MB Single-Wide module 375-3024 # 512MB Single-Wide module 375-3025 # 1GB Double-Wide module 375-3026 # 1GB Single-Wide module 375-3125 # 2GB Double-Wide module 375-3114 # Max number of stacked memory boards is two # Install double wide memory first, then single wide memory $devname="Othello" if ($ultra eq "CP2040"); $devname="Sputnik Bluesky" if ($ultra eq "CP2060"); $devname="Sputnik Orion" if ($ultra eq "CP2080"); $devname="Othello+" if ($ultra eq "CP2140"); $devname="Sputnik+" if ($ultra eq "CP2160"); $untested=1; $untested=0 if ($ultra eq "CP2140"); if ($ultra eq "CP2060") { $memtype="embedded memory"; $sockettype=""; $simmrangex="00001000"; $simmbanks=1; $simmsperbank=1; @simmsizes=(512); } else { $memtype="memory card"; $sockettype=""; $simmrangex="00001000"; $simmbanks=2; $simmsperbank=1; if ($ultra eq "CP2140") { @simmsizes=(512,1024,2048); } elsif ($ultra eq "CP2160") { @simmsizes=(1024,2048); } else { @simmsizes=(256,512,1024); } @socketstr=("base mezzanine board","additional mezzanine board"); @orderstr=("lower board","upper board"); $sortslots=0; } } # # Clones: most do not have verbose output since I don't have any socket data # on them # if ($ultra eq "axus250" || $modelmore =~ /Ultra-250/) { # AXUS Microsystems, Inc. http://www.axus.com.tw # AXUS 250 clone # accepts up to 128MB DIMMs on motherboard $untested=0; $simmrangex="00000200"; $simmbanks=4; $simmsperbank=4; @simmsizes=(8,16,32,64,128); @socketstr=("U0501","U0601","U0701","U0801","U0502","U0602","U0702","U0802","U0503","U0603","U0703","U0803","U0504","U0604","U0704","U0804"); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); } if ($model =~ /SPARC (CPU|CPCI)-/) { # Force Computers, http://www.forcecomputers.com # model format: "SPARC CPU-5V/64-110-X" for 64MB w/ 110MHz CPU $untested=1; $untested=0 if ($model =~ /SPARC CPU-/); if ($model =~ /\/${installed_memory}-/) { $totmem=$installed_memory; push(@simmsizesfound, "$totmem"); $buffer="motherboard contains ${totmem}MB on-board memory\n"; &finish; } } if ($model =~ /Axil/) { # RAVE Computer Association, http://rave.com $untested=1; $untested=0 if ($model =~ /Axil-(245|255|311|320)/); } if ($manufacturer =~ /Tadpole/) { # Tadpole RDI, http://www.tadpole.com $untested=1; $untested=0 if ($banner =~ /Tadpole S3|\bVoyagerIIi\b|\bCycleQUAD\b/); $untested=0 if ($model =~ /PowerLite-170/); if ($ultra eq "UP-20") { # Cycle UP-20 to upgrade SPARCstation 5/20 motherboards # Accepts 16MB, 32MB and 64MB SIMMs from SPARCstation 20 # Install SIMMs in pairs to form each bank $untested=1; $simmrangex="00000040"; $simmbanks=4; $simmsperbank=2; @simmsizes=(16,32,64); @bankstr=(0,0,1,1,2,2,3,3); } if ($ultra eq "UP-520IIi") { # Cycle UP-520-IIi to upgrade SPARCstation 5/20 motherboards # Accepts 8MB, 16MB, 32MB, 64MB, 128MB and 256MB DIMMs $untested=0; $simmrangex="00000200"; $simmbanks=4; $simmsperbank=2; @simmsizes=(8,16,32,64,128,256); @socketstr=("J301".."J304"); @bankstr=(0,0,1,1); } if ($banner =~ /\bSPARCLE\b/) { # UltraSPARC-IIe at 440MHz, 500MHz, or 650MHz # 256MB - 2GB ECC SDRAM, two slots, PC-133, 144-pin SO-DIMMs $untested=0; $simmbanks=2; $simmsperbank=1; @simmsizes=(128,256,512,1024); @socketstr=("DIMM0","DIMM1"); $memtype="SO-DIMM"; } } if ($manufacturer eq "Auspex") { # Auspex Netserver, http://www.auspex.com $memtype="Memory Module"; $untested=1; $untested=0 if ($model eq "SPARC Processor"); if ($osrel =~ /^5./) { $untested=1; # Untested with Solaris 2.X $untested_type="OS"; } } if ($manufacturer =~ /Fujitsu/) { # Hal Computer Systems, a Fujitsu Company, http://www.hal.com # Fujitsu Siemens, http://www.fujitsu-siemens.com $untested=1; $untested=0 if ($model =~ /S-4\/10H|S-4\/20[ABLH]/); if ($banner =~ /(GP7000|GP7000F)\b/) { $untested=0; if ($slotname0 =~ /SLOT[0-9]/) { # M200 # Up to 4GB of memory # System board has 16 DIMM slots, #00 - #15 # Banks - 0,0,1,1,2,2,2,2,3,3,3,3,4,4,4,4 # First Modules installed in Bank 0, slots 0-1 # Second Modules Installed in Bank 1, slots 2-3 # Modules in Bank 0 and 1 must be same size # Subsequent memory expansion installed in sets of four # modules in Bank 2 - 4 (Slots 4-7, 8-11, 12-15) @socketstr=("SLOT0".."SLOT9","SLOT10".."SLOT15"); } if ($slotname0 =~ /SLOT[AB][0-9]/) { # M400 and M600 # Up to 4GB of memory # System board has 32 DIMM slots, #00 - #15 Group A & B # Banks - 0,0,1,1,2,2,2,2,3,3,3,3,4,4,4,4 # First Modules installed in Bank 0 Group A, slots 0-1 # Second Modules installed in Bank 0 Group B, slots 0-1 # Modules in Group A and B must be same size # Next memory expansion installs in Bank 1 Group A & B, # slots 2-3 using modules of same size as Bank 0 # Subsequent memory expansion installed in sets of eight # modules in Bank 2 - 4 (Slots 4-7, 8-11, 12-15) in # both Group A and B @socketstr=("SLOTA0".."SLOTA9","SLOTA10".."SLOTA15","SLOTB0".."SLOTB9","SLOTB10".."SLOTB15"); } } if ($banner =~ /PRIMEPOWER *100N?\b/) { # PRIMEPOWER100N, 1U rack mount # Up to 2GB of memory # 4 memory module slots # 100MHz SDRAM ECC # Mount memory modules in order from memory module slot 0 $untested=1; } if ($banner =~ /PRIMEPOWER *[246]00\b/) { # Up to 8GB of memory # Each system board has 16 DIMM slots, #00 - #15 # Four banks of 4 (0-3,4-7,8-11,12-15) # PrimePower 200 and 400 use 1 system board # PrimePower 600 uses 2 system boards (00, 01) $untested=0; foreach $brd ("00","01") { if ($gotcpuboards =~ /\b$brd\b/) { if ($gotmodulenames =~ /${brd}-SLOT[0-9]/) { foreach $i (0..15) { push(@socketstr, ("${brd}-SLOT$i")); } } } } } if ($banner =~ /PRIMEPOWER *(800|1000|2000)\b/) { # 1-4 SPARC64 GP CPUs / system board # PrimePower 800 can have 4 system boards per system # PrimePower 1000 can have 8 system boards per system # PrimePower 2000 can have 32 system boards per system # Minimum Memory: 1GB / system board, 2GB / system # Maximum Memory: 8GB / system board, 32GB / system # 32 or 16 memory modules per system board, installed in quads $untested=0; @simmsizes=(128,256,512); foreach $brd ("00".."77") { if ($gotcpuboards =~ /\b$brd\b/) { if ($gotmodulenames =~ /${brd}-SLOT#[AB][0-9]/) { foreach $j ("A","B") { foreach $i ("00".."03","10".."13","20".."23","30".."33") { push(@socketstr, ("${brd}-SLOT#$j$i")); } } } } } } if ($banner =~ /PRIMEPOWER *250\b/) { # Pedestal, 2U or 4U rack mount # 1-2 SPARC64 V processors at 1.1GHz, 1.32GHz, 1.87GHz # 1GB-16GB DDR-SDRAM memory with ECC, 2-way, 8 DIMM slots $untested=0; @simmsizes=(256,512,1024,2048); foreach $i ("00".."07") { push(@socketstr, ("SLOT#$i")); } } if ($banner =~ /PRIMEPOWER *450\b/) { # Pedestal, 4U or 7U rack mount # 1-4 SPARC64 V processors at 1.1GHz, 1.32GHz, 1.87GHz # 1GB-32GB DDR-SDRAM memory with ECC, 4-way, 16 DIMM slots $untested=0; @simmsizes=(256,512,1024,2048); foreach $i ("00".."15") { push(@socketstr, ("SLOT#$i")); } } if ($banner =~ /PRIMEPOWER *[68]50\b/) { # PrimePower 650: 2-8 SPARC64 V processors at 1.1GHz or faster # 2GB-64GB memory, 8-way, 1 system board, 8U rack mount # PrimePower 850: 4-16 SPARC64 V processors at 1.1GHz or faster # 2GB-128GB memory, 16-way, 2 system boards, 16U rack mount # Uses DDR SDRAM ECC memory in 256MB, 512MB and 1GB sizes # Each system board has 32 memory module slots, laid out # with 4 DIMMs on 8 DIMM riser cards. $untested=0; @simmsizes=(256,512,1024,2048); foreach $brd ("C0S00","C0S01") { if ($gotcpuboards =~ /\b$brd\b/) { if ($gotmodulenames =~ /${brd}-SLOT#[A-D][0-9]/) { foreach $j ("A".."D") { foreach $i ("00".."07") { push(@socketstr, ("${brd}-SLOT#$j$i")); } } } } } } if ($banner =~ /PRIMEPOWER *(HPC2500|900|[12]500)\b/) { # SPARC64 V CPUs at 1.3GHz or 1.89GHz # PRIMEPOWER HPC2500 / 2500 # 2-8 CPUs / system board, 64-128 / system # Up to 16 8-way system boards / system # Up to 1024GB DDR-SDRAM memory with ECC, 128-way # Minimum Memory: 4GB / system board, 4GB / system # Maximum Memory: 64GB / system board, 1024GB / system # PRIMEPOWER 900 # 17U rack mount # 1-8 CPUs / system board, 1-16 / system # Up to 2 8-way system boards / system # Up to 128GB DDR-SDRAM memory with ECC, 8-way # Minimum Memory: 2GB / system board, 2GB / system # Maximum Memory: 64GB / system board, 128GB / system # PRIMEPOWER 1500 # 1-8 CPUs / system board, 1-32 / system # Up to 4 8-way system boards / system # Up to 256GB DDR-SDRAM memory with ECC, 8-way # Minimum Memory: 2GB / system board, 2GB / system # Maximum Memory: 64GB / system board, 256GB / system $untested=0; @simmsizes=(256,512,1024,2048); foreach $cab ("C0S","C1S") { foreach $brd ("00".."07") { if ($gotcpuboards =~ /\b$cab$brd\b/) { foreach $j ("A","B") { foreach $i ("00".."15") { push(@socketstr, ("$cab${brd}-SLOT#$j$i")); } } } } } } } if ($model =~ /COMPstation.10/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB and 64MB SIMMs on motherboard # Bank 0 must be filled first # Layout is like SPARCstation-10, but I don't know if it can accept # 32MB SIMMs or NVSIMMs $untested=0; $simmrangex="00000040"; $simmbanks=8; $simmsperbank=1; @simmsizes=(16,64); @socketstr=("J0201","J0203","J0302","J0304","J0202","J0301","J0303","J0305"); @bankstr=(0,2,4,6,1,3,5,7); } if ($model =~ /COMPstation-20A\b/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB, 32MB and 64MB SIMMs on motherboard $untested=1; $simmrangex="00000040"; $simmbanks=8; $simmsperbank=1; @simmsizes=(16,32,64); @socketstr=("J0201","J0304","J0203","J0302","J0303","J0301","J0305","J0202"); @orderstr=("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr=(1..8); } if ($model =~ /COMPstation-20AL/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB, 32MB and 64MB SIMMs on motherboard $untested=0; $simmrangex="00000040"; $simmbanks=8; $simmsperbank=1; @simmsizes=(16,32,64); @socketstr=("J0201","J0203","J0302","J0304","J0202","J0301","J0303","J0305"); @orderstr=("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr=(0..7); } if ($banner =~ /COMPstation_U(60|80D)_Series/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB, 32MB, 64MB, 128MB or 256MB DIMMs on motherboard # 4 banks with 4 DIMMs per bank $untested=0; if ($banner =~ /COMPstation_U60_Series/) { $simmrangex="00000200"; # use "00000400" with 256MB DIMMs $simmbanks=6; # Count the skipped address range } else { $simmrangex="00000400"; $simmbanks=4; } $simmsperbank=4; @simmsizes=(16,32,64,128,256); } if ($model =~ /\bVoyagerIIi\b/) { # Tadpole Voyager IIi has 8 DIMM slots, but otherwise appears # to look like an Ultra 5. It allows 256MB to 1GB of memory. $untested=0; $simmrangex="00000100"; $simmbanks=4; $simmsperbank=2; @simmsizes=(16,32,64,128); @socketstr=("DIMM1","DIMM2","DIMM5","DIMM6","DIMM3","DIMM4","DIMM7","DIMM8"); $sortslots=1; } # # systems below may have memory information available in prtdiag output # if ($model eq "SPARCserver-1000" || $model eq "SPARCcenter-2000") { $devname="Scorpion" if ($model eq "SPARCserver-1000"); $devname="Scorpion+" if ($banner =~ "1000E"); $devname="Dragon" if ($model eq "SPARCcenter-2000"); $devname="Dragon+" if ($banner =~ "2000E"); # Accepts 8MB and 32MB SIMMs on motherboard $untested=0; @simmsizes=(8,32); $prtdiag_has_mem=1; &check_prtdiag; if ($boardfound_mem) { $memfrom="prtdiag"; &pdebug("displaying memory from prtdiag"); foreach $line (@boards_mem) { if ($line =~ /Board/) { $boardslot_mem=substr($line,5,1); $simmsize=int substr($line,46,3) / 4; if ($simmsize == 0) { &found_empty_bank("Group 0"); } elsif ($simmsize == 1) { &found_nvsimm_bank("Group 0"); } else { push(@simmsizesfound, "$simmsize"); } $simmsize=int substr($line,54,3) / 4; if ($simmsize == 0) { &found_empty_bank("Group 1"); } elsif ($simmsize == 1) { &found_nvsimm_bank("Group 1"); } else { push(@simmsizesfound, "$simmsize"); } $simmsize=int substr($line,62,3) / 4; if ($simmsize == 0) { &found_empty_bank("Group 2"); } elsif ($simmsize == 1) { &found_nvsimm_bank("Group 2"); } else { push(@simmsizesfound, "$simmsize"); } $simmsize=int substr($line,70,3) / 4; if ($simmsize == 0) { &found_empty_bank("Group 3"); } elsif ($simmsize == 1) { &found_nvsimm_bank("Group 3"); } else { push(@simmsizesfound, "$simmsize"); } } } &show_header; print @boards_mem; print "Each memory unit group is comprised of 4 SIMMs\n"; $empty_banks=" None" if (! $empty_banks); print "empty memory groups:$empty_banks\n"; } else { &show_header; $recognized=0; } $totmem=$installed_memory; &finish; &pdebug("exit"); exit; } if ($model eq "Ultra-4" || $ultra eq 450 || $model eq "Ultra-4FT" || $ultra eq "Netra ft1800") { # Accepts 32MB, 64MB, 128MB or 256MB DIMMs on motherboard # 16MB DIMMs are not supported and may cause correctable ECC errors # 501-2622 (32MB), 501-2480 or 501-5691 (64MB), 501-3136 (128MB), # 501-4743 or 501-5896 (256MB) # 200-pin 60ns Fast Page Mode ECC # Netra ft1800 is based on Ultra 450 $devname="Tazmo (Tazmax/Tazmin)"; $familypn="A20, A25"; $familypn="N05" if ($model eq "Ultra-4FT" || $ultra eq "Netra ft1800"); $untested=0; $simmrangex="00000400"; $simmbanks=4; $simmsperbank=4; @simmsizes=(16,32,64,128,256); @socketstr=("U1901".."U1904","U1801".."U1804","U1701".."U1704","U1601".."U1604"); @groupstr=("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"); @bankstr=(2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1); } if ($model eq "Ultra-250" || $ultra eq 250) { # Accepts 16MB, 32MB, 64MB, or 128MB DIMMs on motherboard # 501-2479 (16MB), 501-2622 (32MB), 501-2480 or 501-5691 (64MB), # 501-3136 (128MB) # 200-pin 60ns Fast Page Mode ECC $devname="Javelin"; $familypn="A26"; $untested=0; $simmrangex="00000200"; $simmbanks=4; $simmsperbank=4; @simmsizes=(16,32,64,128); @socketstr=("U0701","U0801","U0901","U1001","U0702","U0802","U0902","U1002","U0703","U0803","U0903","U1003","U0704","U0804","U0904","U1004"); @bankstr=("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"); } if ($model eq "Ultra-80" || $ultra eq 80 || $ultra eq "420R" || $ultra eq "Netra t140x") { # Accepts 64MB or 256MB DIMMs # 501-5691 (64MB), 501-4743 501-5936 501-6005 501-6056 (256MB) # 200-pin 60ns 5V Fast Page Mode ECC, 576 bits data width # 64MB DIMMs same as in Ultra-60, 256MB DIMMs same as in Enterprise-450 # U0403,U0404,U1403,U1404 bank 3 address 0xc0000000-0xffffffff # U0303,U0304,U1303,U1304 bank 2 address 0x80000000-0xbfffffff # U0401,U0402,U1401,U1402 bank 1 address 0x40000000-0x7fffffff # U0301,U0302,U1301,U1302 bank 0 address 0x00000000-0x3fffffff # The minimum requirement is four DIMMs in any bank. The recommended # installation sequence is Bank 0,2,1,3. DIMMs are required on both the # Riser Board (U0[34]0?) and the System Board (U1[34]0?). Two-way and # four-way memory bank interleaving is supported. Memory is 2-way # interleaved when the same size DIMMs are installed in Banks 0 and 1. # Memory is 4-way interleaved when the same size DIMMs are installed in # Banks 0, 1, 2 and 3. # # prtconf does not reliably show the size of DIMMs in each slot when # 1GB of total memory is installed. It shows this: # reg: 00000000.00000000.00000000.40000000 # A system with 1GB is reported as having 4 256MB DIMMs, but may be # using 16 64MB DIMMs in a 4-way interleave. # This is an issue that Sun could fix in the OBP. # It is broken with OBP 3.33.0 2003/10/07 (patch 109082-06) and older. # prtfru (Solaris 8 and later) also does not work. # # Sun shipped U80 1GB configurations w/ 4x256MB DIMMs # Sun shipped U80 256MB configurations w/ 4x64MB DIMMs # Sun shipped E420R with 501-5936 256MB DIMMs # 64MB DIMM 501-2480 and 128MB DIMM 501-3136 are not supported. # 16MB and 32MB DIMMs are not sold for the Ultra 80. # $devname="Quasar (U80), Quahog (420R), Lightweight 3 (Netra t140x)"; $familypn="A27 (U80), A33 (420R), N14 (Netra t1405), N15 (Netra t1400)"; if ($ultra eq 80) { $devname="Quasar"; $familypn="A27"; } if ($ultra eq "420R") { $devname="Quahog"; $familypn="A33"; } if ($ultra eq "Netra t140x") { $devname="Lightweight 3"; $familypn="N14 (Netra t1405), N15 (Netra t1400)"; } $untested=0; $simmrangex="00000400"; $simmbanks=4; $simmsperbank=4; @simmsizes=(64,256); # Sun only supports 64MB and 256MB DIMMs @socketstr=("U0301","U0302","U1301","U1302","U0401","U0402","U1401","U1402","U0303","U0304","U1303","U1304","U0403","U0404","U1403","U1404"); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); } if ($ultra eq "Sun Blade 1000" || $ultra eq "Sun Blade 2000" || $ultra eq "Sun Fire 280R" || $ultra eq "Netra 20") { # Accepts up to 8 128MB, 256MB, 512MB, 1GB or 2GB DIMMs installed in # groups of four DIMMs per bank on motherboard # Uses 232-pin 3.3V ECC 7ns SDRAM # J0407 Group 1 Bank 1/3 address 0x0fa000000 - 0x1f3ffffff # J0406 Group 0 Bank 0/2 address 0x000000000 - 0x0f9ffffff # J0305 Group 1 Bank 1/3 address 0x0fa000000 - 0x1f3ffffff # J0304 Group 0 Bank 0/2 address 0x000000000 - 0x0f9ffffff # J0203 Group 1 Bank 1/3 address 0x0fa000000 - 0x1f3ffffff # J0202 Group 0 Bank 0/2 address 0x000000000 - 0x0f9ffffff # J0101 Group 1 Bank 1/3 address 0x0fa000000 - 0x1f3ffffff # J0100 Group 0 Bank 0/2 address 0x000000000 - 0x0f9ffffff # The minimum memory requirement is four DIMMs in any Group # DIMMs can be installed in any group order # Each group addresses 4GB of memory # Memory slots (Jxxxx) map to same-numbered DIMMs (Uxxxx) # For maximum 4-way interleaving, install 8 DIMMs of identical sizes $devname="Excalibur (Sun Blade 1000), Littleneck (Sun Fire 280R), Lightweight 2+ (Netra 20/Netra T4), Sun Blade 2000 (Sun Blade 2000)"; $familypn="A28 (Sun Blade 1000), A35 (Sun Fire 280R), N28 (Netra 20/Netra T4), A29 (Sun Blade 2000)"; if ($ultra eq "Sun Blade 1000") { $devname="Excalibur (Sun Blade 1000), Sun Blade 2000 (Sun Blade 2000)"; $familypn="A28 (Sun Blade 1000), A29 (Sun Blade 2000)"; } if ($ultra eq "Sun Fire 280R") { $devname="Littleneck"; $familypn="A35"; } if ($ultra eq "Netra 20") { $devname="Lightweight 2+"; $familypn="N28"; } if ($ultra eq "Sun Blade 2000") { $devname="Sun Blade 2000"; $familypn="A29"; } $untested=0; # SB1000/2000 uses 501-4143, 501-5938, 501-6230 or 501-6560 motherboards # SB1000 can use 600, 750 and 900MHz UltraSPARC-III CPUs # SB1000 can use 900MHz and faster UltraSPARC-III+ Cu CPUs # SB2000 only shipped with 900MHz and faster UltraSPARC-III+ Cu CPUs # SB2000 can use any of the SB1000 motherboards if ($ultra eq "Sun Blade 1000") { $modelmore=$banner; $modelmore=~s/Sun-Blade-1000/or Sun-Blade-2000/g; $modelmore=~s/\s+$//; while (($cf,$cnt)=each(%cpucnt)) { $cf=~/^(.*) (\d*)$/; $cfreq=$2; $modelmore=~s/\)/ ${cfreq}MHz\)/g if ($cfreq); } } $prtdiag_has_mem=1; $simmrangex="00001000"; $simmbanks=2; $simmsperbank=4; @simmsizes=(128,256,512,1024,2048); @socketstr=("J0100","J0202","J0304","J0406","J0101","J0203","J0305","J0407"); @bankstr=(0,0,0,0,1,1,1,1); } if ($model eq "Sun-Blade-100" || $ultra eq "Sun Blade 100" || $ultra eq "Sun Blade 150") { # Accepts 128MB, 256MB or 512MB DIMMs on motherboard # Uses 168-pin 3.3V ECC PC133 CL=3 SDRAM # U5 DIMM3 address 0x60000000 - 0x7fffffff or 0xc0000000 - 0xffffffff # U4 DIMM2 address 0x40000000 - 0x5fffffff or 0x80000000 - 0xbfffffff # U3 DIMM1 address 0x20000000 - 0x3fffffff or 0x40000000 - 0x7fffffff # U2 DIMM0 address 0x00000000 - 0x1fffffff or 0x00000000 - 0x3fffffff # The minimum memory requirement is one DIMM in U2 # The memory installation sequence is U2, U3, U4, U5 # Each bank addresses 512MB of memory with 500MHz UltraSPARC # Each bank addresses 1GB of memory with >= 550MHz UltraSPARC if ($model eq "Sun-Blade-100" || $ultra eq "Sun Blade 100") { $devname="Grover"; $familypn="A36"; } if ($ultra eq "Sun Blade 150") { $devname="Grover+"; $familypn="A41"; } $untested=0; $prtdiag_has_mem=1; $simmrangex=($cpufreq > 520) ? "00000400" : "00000200"; $simmbanks=4; $simmsperbank=1; @simmsizes=(128,256,512); @socketstr=("DIMM0".."DIMM3"); @bankstr=(0..3); } if ($ultra eq "Sun Fire" || $ultra eq "Sun Fire 15K" || $ultra eq "Sun Fire 12K" || $ultra =~ /Sun Fire ([346]8[01]0|E[246]900|E2[05]K)\b/) { # Sun Fire 3800 system # 2-8 UltraSPARC-III processors # Up to 2 CPU/Memory boards # Sun Fire 4800, 4810 and 6800 system # 2-12 UltraSPARC-III processors # Up to 3 CPU/Memory boards # Sun Fire 6800 system # 2-24 UltraSPARC-III processors # Up to 6 CPU/Memory boards # Sun Fire 15K system # 16-106 UltraSPARC-III+, IV or IV+ processors # Up to 18 CPU/Memory boards # Sun Fire 12K system # up to 56 UltraSPARC-III+, IV or IV+ processors and 288GB memory # Sun Fire E2900 & E4900 system # 4, 8, or 12 UltraSPARC-IV or IV+ processors, up to 3 Uniboards # E4900 adds dynamic system domains when compared to E2900 # Sun Fire E6900 system # 4-24 UltraSPARC-IV or IV+ processors, up to 6 Uniboards # Sun Fire E20K system # 4-36 UltraSPARC-IV or IV+ processors, up to 9 Uniboards # Sun Fire E25K system # Up to 72 UltraSPARC-IV or IV+ processors, up to 18 Uniboards # Each CPU/Memory board holds up to 4 processors and up to 32GB memory # (32 DIMMs per board, 8 banks of 4 DIMMs) # Accepts 256MB, 512MB or 1GB DIMMs # 1GB DIMM not supported at 750MHz # 256MB DIMM only supported on US-III # 2GB DIMMs supported on 48x0/6800/E2900/E4900/E6900/E20K/E25K # System Board slots are labeled SB0 and higher # A populated DIMM bank requires an UltraSPARC CPU. # DIMMs are 232-pin 3.3V ECC 7ns SDRAM # prtdiag output shows the memory installed. # # CPU1 and CPU0 Memory CPU3 and CPU2 Memory # -------------------- -------------------- # Socket CPU Bank DIMM Socket CPU Bank DIMM # ------ --- ---- ---- ------ --- ---- ---- # J14600 P1 B0 D3 J16600 P3 B0 D3 # J14601 P1 B1 D3 J16601 P3 B1 D3 # J14500 P1 B0 D2 J16500 P3 B0 D2 # J14501 P1 B1 D2 J16501 P3 B1 D2 # J14400 P1 B0 D1 J16400 P3 B0 D1 # J14401 P1 B1 D1 J16401 P3 B1 D1 # J14300 P1 B0 D0 J16300 P3 B0 D0 # J14301 P1 B1 D0 J16301 P3 B1 D0 # J13600 P0 B0 D3 J15600 P2 B0 D3 # J13601 P0 B1 D3 J15601 P2 B1 D3 # J13500 P0 B0 D2 J15500 P2 B0 D2 # J13501 P0 B1 D2 J15501 P2 B1 D2 # J13400 P0 B0 D1 J15400 P2 B0 D1 # J13401 P0 B1 D1 J15401 P2 B1 D1 # J13300 P0 B0 D0 J15300 P2 B0 D0 # J13301 P0 B1 D0 J15301 P2 B1 D0 # $devname="Serengeti" if ($ultra eq "Sun Fire"); if ($banner =~ /Sun Fire 3800\b/ || $diagbanner =~ /Sun Fire 3800\b/) { $devname="Serengeti8, SF3800 or SP"; $familypn="F3800"; } if ($banner =~ /Sun Fire 4800\b/ || $diagbanner =~ /Sun Fire 4800\b/) { $devname="Serengeti12, SF4800 or MD"; $familypn="F4800"; } if ($banner =~ /Sun Fire 4810\b/ || $diagbanner =~ /Sun Fire 4810\b/) { $devname="Serengeti12i, SF4810 or ME"; $familypn="F4810"; } if ($banner =~ /Sun Fire 6800\b/ || $diagbanner =~ /Sun Fire 6800\b/) { $devname="Serengeti24, SF6800 or DC"; $familypn="F6800"; } if ($ultra eq "Sun Fire 15K") { $devname="Starcat, Serengeti72"; $familypn="F15K"; } $devname="Starkitty" if ($ultra eq "Sun Fire 12K"); if ($banner =~ /Sun Fire E2900\b/ || $diagbanner eq "Sun Fire E2900") { $devname="Amazon 2"; $familypn="E29"; } if ($banner =~ /Sun Fire E4900\b/ || $diagbanner eq "Sun Fire E4900") { $devname="Amazon 4"; $familypn="E49"; } $devname="Amazon 6" if ($banner =~ /Sun Fire E6900\b/ || $diagbanner eq "Sun Fire E6900"); $devname="Amazon 20" if ($banner =~ /Sun Fire E20K\b/ || $diagbanner eq "Sun Fire E20K"); $devname="Amazon 25" if ($banner =~ /Sun Fire E25K\b/ || $diagbanner eq "Sun Fire E25K"); $untested=0; $prtdiag_has_mem=1; @simmsizes=(256,512,1024); @simmsizes=(256,512,1024,2048) if ($ultra =~ /Sun Fire ([46]8[01]0|E[246]900|E2[05]K)\b/); } if ($ultra eq "Sun Fire V880") { # Accepts 128MB, 256MB, 512MB or 1GB DIMMs in groups of four per CPU # 128MB DIMMs only supported on 750MHz CPU/memory boards # 1GB DIMMs only supported on 900MHz or faster CPU/memory boards # 2-8 UltraSPARC-III processors, 750MHz or faster # Up to 64GB memory, 8GB max per CPU, 4 DIMMs per CPU, 2 CPUs per board # DIMMs must be added four-at-a-time within the same group of DIMM # slots; every fourth slot belongs to the same DIMM group. # Each CPU/Memory board must be populated with a minimum of eight DIMMs, # installed in groups A0 and B0. # For 1050MHz and higher system boards, each CPU/Memory board must be # populated with all sixteen DIMMs, installed in groups A0,A1,B0,B1. # Each group used must have four identical DIMMs installed (all four # DIMMs must be from the same manufacturing vendor and must have the # same capacity). # DIMMs are 232-pin 3.3V ECC 7ns SDRAM # Uses 128-bit-wide path to memory, 150MHz DIMMs, 2.4GB/sec # bandwidth to processor and an aggregate memory bw of 9.6GB/sec # prtdiag output shows the memory installed. # # CPU CPU/Memory Slot Associated DIMM Group # --- --------------- --------------------- # 0 Slot A A0,A1 # 2 Slot A B0,B1 # 1 Slot B A0,A1 # 3 Slot B B0,B1 # 4 Slot C A0,A1 # 6 Slot C B0,B1 # 5 Slot D A0,A1 # 7 Slot D B0,B1 # $devname="Daktari (V880), Nandi (V880z)"; $familypn="A30 (V880), A47 (V880z)"; $untested=0; @simmsizes=($cpufreq < 800) ? (128,256,512) : (256,512,1024,2048); @banksstr=("A0","A1","B0","B1"); $prtdiag_has_mem=1; } if ($ultra eq "Sun Fire V480") { # Accepts 256MB, 512MB or 1GB DIMMs in groups of four per CPU # 2 or 4 UltraSPARC-III processors, 900MHz or faster # Up to 32GB memory, 8GB max per CPU, 4 DIMMs per CPU, 2 CPUs per board # Smaller version of Sun Fire V880 above $devname="Cherrystone"; $familypn="A37"; $untested=0; @simmsizes=(256,512,1024,2048); @banksstr=("A0","A1","B0","B1"); $prtdiag_has_mem=1; } if ($ultra eq "Sun Fire V490" || $ultra eq "Sun Fire V890") { # Accepts 512MB or 1GB DIMMs in groups of four per CPU # 2 or 4 UltraSPARC-III, IV or IV+ processors, 1050MHz or faster # Up to 32GB memory, 8GB max per CPU, 4 DIMMs per CPU, 2 CPUs per board # Similar memory contraints as Sun Fire V880 above if ($ultra eq "Sun Fire V490") { $devname="Sebring"; $familypn="A52"; } if ($ultra eq "Sun Fire V890") { $devname="Silverstone"; $familypn="A53"; } $untested=0; @simmsizes=(512,1024,2048); @banksstr=("A0","A1","B0","B1"); $prtdiag_has_mem=1; } if ($ultra eq "Netra T12") { # Sun Fire V1280, Netra 1280 # Essentially the same as a Sun Fire 4810, but is marketed as a low cost # single domain system. # 2-12 UltraSPARC-IIIcu processors using up to 3 CPU/Memory boards # Each CPU/Memory board holds up to 4 processors and up to 32GB memory # (32 DIMMs per board, 8 banks of 4 DIMMs) # Accepts 256MB, 512MB, 1GB or 2GB DIMMs # System Board slots are labeled SB0 and higher # A populated DIMM bank requires an UltraSPARC III CPU. # DIMMs are 232-pin 3.3V ECC 7ns SDRAM # prtdiag output shows the memory installed. $devname="Lightweight 8"; $familypn="A40 (Sun Fire V1280), N40 (Netra 1280)"; $untested=0; $prtdiag_has_mem=1; @simmsizes=(256,512,1024,2048); } if ($ultra eq "Enchilada") { # Sun Fire V210, V240, Netra 210, 240 # 1-2 UltraSPARC-IIIi (Jalapeno) processors # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # DDR-1 SDRAM PC2100 DIMMs, 8 DIMM slots, 4 DIMMs per processor, # 2 banks per processor, 2 DIMMs per bank # V210 accepts 1GB & 2GB DIMMs by installing Fan Upgrade Kit, X7418A # Mixing DIMM sizes and capacities is not supported. # prtdiag output can show the memory installed. $devname="Enchilada"; # Enxs if ($banner =~ /Sun Fire V210\b/ || $model =~ /Sun-Fire-V210/) { $devname="Enchilada 1U"; $familypn="N31"; } if ($model =~ /Netra-210\b/) { $devname="Salsa 19"; $familypn="N79"; } if ($banner =~ /Sun Fire V240\b/ || $model =~ /Sun-Fire-V240/) { $devname="Enchilada 2U"; $familypn="N32"; } if ($model =~ /Netra-240\b/) { $devname="Enchilada 19"; $familypn="N54"; } $untested=0 if ($banner =~ /Sun Fire (V210|240)\b/ || $model =~ /Sun-Fire-(V210|V240)/ || $model =~ /Netra-2[14]0\b/); $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; # Count the skipped address range for dual CPU $simmbanks=($ncpu > 1) ? 10 : 2; $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); @socketstr=("MB/P0/B0/D0","MB/P0/B0/D1","MB/P0/B1/D0","MB/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?"); push(@socketstr, "MB/P1/B0/D0","MB/P1/B0/D1","MB/P1/B1/D0","MB/P1/B1/D1") if ($ncpu > 1); } if ($ultra eq "Sun Fire V440" || $ultra eq "Netra 440") { # 1-4 UltraSPARC-IIIi (Jalapeno) processors # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # DDR-1 SDRAM PC2100 DIMMs, 16 DIMM slots, 4 DIMMs per processor, # 2 banks per processor, 2 DIMMs per bank # prtdiag output can show the memory installed. $devname="Chalupa"; $familypn="A42"; if ($ultra eq "Netra 440") { $devname="Chalupa 19"; $familypn="N42"; } $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; $simmbanks=26; # Count the skipped address range for each CPU $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); # Each CPU card has 4 DIMM slots labeled J0601 (B0/D0), J0602 (B0/D1), # J0701 (B1/D0) and J0702 (B1/D1). @socketstr=("C0/P0/B0/D0","C0/P0/B0/D1","C0/P0/B1/D0","C0/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?"); push(@socketstr, "C1/P0/B0/D0","C1/P0/B0/D1","C1/P0/B1/D0","C1/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?") if ($ncpu > 1); push(@socketstr, "C2/P0/B0/D0","C2/P0/B0/D1","C2/P0/B1/D0","C2/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?") if ($ncpu > 2); push(@socketstr, "C3/P0/B0/D0","C3/P0/B0/D1","C3/P0/B1/D0","C3/P0/B1/D1") if ($ncpu > 3); } if ($ultra eq "Sun Blade 1500") { # 1 UltraSPARC-IIIi (Jalapeno) processor # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # 184-pin DDR-1 SDRAM PC2100 DIMMs installed in pairs, 4 DIMM slots # prtdiag output can show the memory installed. $devname="Taco"; $devname .= "+" if ($modelmore =~ /\(Silver\)/ || $banner =~ /\(Silver\)/); $familypn="A43"; $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; $simmbanks=2; $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); @socketstr=("DIMM0".."DIMM3"); # DIMM1-DIMM4 on prototype } if ($ultra eq "Sun Blade 2500" || $ultra eq "Sun Fire V250") { # 1-2 UltraSPARC-IIIi (Jalapeno) processors # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # 184-pin DDR-1 SDRAM PC2100 DIMMs, 8 DIMM slots, 4 DIMMs per processor, # 2 banks per processor, 2 DIMMs per bank # prtdiag output can show the memory installed. if ($ultra eq "Sun Blade 2500") { $devname="Enchilada Workstation"; $devname .= " Silver" if ($modelmore =~ /\(Silver\)/ || $banner =~ /\(Silver\)/); $familypn="A39"; } if ($ultra eq "Sun Fire V250") { $devname="Enchilada 2P Tower"; $familypn="A50"; } $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; # Count the skipped address range for dual CPU $simmbanks=($ncpu > 1) ? 20 : 2; $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); if ($ultra eq "Sun Blade 2500") { @socketstr=("DIMM0".."DIMM3"); push(@socketstr, "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "DIMM4".."DIMM7") if ($ncpu > 1); } else { @socketstr=("MB/DIMM0","MB/DIMM1","MB/DIMM2","MB/DIMM3"); push(@socketstr, "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "MB/DIMM4","MB/DIMM5","MB/DIMM6","MB/DIMM7") if ($ncpu > 1); } } if ($ultra eq "Sun Ultra 45 Workstation" || $ultra eq "Sun Ultra 45 or Ultra 25 Workstation") { # 1-2 UltraSPARC-IIIi (Jalapeno) 1.6GHz processors # 1GB to 16GB of DDR1 SDRAM 266 or 333MHz registered ECC memory using # matched pairs of 512MB, 1GB and 2GB DIMMs # maximum of 4 DIMMs (8GB) per CPU # CPU0 Bank0 DIMM1&DIMM3 blue sockets, Bank1 DIMM0&DIMM2 black sockets # CPU1 Bank0 DIMM4&DIMM6 blue sockets, Bank1 DIMM5&DIMM7 black sockets # prtdiag output can show the memory installed. $devname="Chicago"; # also "Netra Salsa-19" development name $familypn="A70"; $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; # Count the skipped address range for dual CPU $simmbanks=($ncpu > 1) ? 20 : 2; $simmsperbank=2; @simmsizes=(512,1024,2048); @socketstr=("MB/DIMM1","MB/DIMM3","MB/DIMM0","MB/DIMM2"); push(@socketstr, "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "MB/DIMM4","MB/DIMM6","MB/DIMM5","MB/DIMM7") if ($ncpu > 1); } if ($ultra eq "Sun Ultra 25 Workstation") { # 1 UltraSPARC-IIIi (Jalapeno) 1.34GHz processors # 1GB to 8GB of DDR1 SDRAM 266 or 333MHz registered ECC memory using # matched pairs of 512MB, 1GB and 2GB DIMMs # maximum of 4 DIMMs (8GB) # Bank0 DIMM1&DIMM3 blue sockets, Bank1 DIMM0&DIMM2 black sockets # prtdiag output can show the memory installed. $devname="Southside"; $familypn="A89"; $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; $simmbanks=2; $simmsperbank=2; @simmsizes=(512,1024,2048); @socketstr=("MB/DIMM1","MB/DIMM3","MB/DIMM0","MB/DIMM2"); } if ($ultra eq "Sun Fire V125") { # 1 UltraSPARC-IIIi (Jalapeno) processor # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # DDR-1 SDRAM PC2100 DIMMs, 4 DIMM slots, 2 DIMMs per bank # Mixing DIMM sizes and capacities is not supported. # prtdiag output can show the memory installed. $devname="El Paso"; $familypn="125"; $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; $simmbanks=2; $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); @socketstr=("MB/P0/B0/D0","MB/P0/B0/D1","MB/P0/B1/D0","MB/P0/B1/D1"); } if ($ultra eq "Seattle") { # Sun Fire V215, V245 # 1-2 UltraSPARC-IIIi (Jalapeno) processors # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # DDR-1 SDRAM PC2100 DIMMs, 8 DIMM slots, 4 DIMMs per processor, # 2 banks per processor, 2 DIMMs per bank # Mixing DIMM sizes and capacities is not supported. # prtdiag output can show the memory installed. $devname="Seattle"; # Enxs if ($banner =~ /Sun Fire V215\b/ || $model =~ /Sun-Fire-V215/) { $devname="Seattle 1U"; $familypn="215"; } if ($banner =~ /Sun Fire V245\b/ || $model =~ /Sun-Fire-V245/) { $devname="Seattle 2U"; $familypn="245"; } $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; # Count the skipped address range for dual CPU $simmbanks=($ncpu > 1) ? 10 : 2; $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); @socketstr=("MB/P0/B0/D0","MB/P0/B0/D1","MB/P0/B1/D0","MB/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?"); push(@socketstr, "MB/P1/B0/D0","MB/P1/B0/D1","MB/P1/B1/D0","MB/P1/B1/D1") if ($ncpu > 1); } if ($ultra eq "Boston") { # Sun Fire V445 # 2-4 UltraSPARC-IIIi (Jalapeno) processors # UltraSPARC IIIi supports 128MB to 1GB single bank DIMMs. # UltraSPARC IIIi supports 256MB to 2GB dual bank DIMMs. # DDR-1 SDRAM PC2100 DIMMs, 16 DIMM slots, 4 DIMMs per processor, # 2 banks per processor, 2 DIMMs per bank # prtdiag output can show the memory installed. $devname="Boston"; $familypn="445, A77"; $untested=0; $prtdiag_has_mem=1; $prtdiag_banktable_has_dimms=1; $simmrangex="00002000"; $simmbanks=26; # Count the skipped address range for each CPU $simmsperbank=2; @simmsizes=(128,256,512,1024,2048); # Each CPU card has 4 DIMM slots labeled J0601 (B0/D0), J0602 (B0/D1), # J0701 (B1/D0) and J0702 (B1/D1). @socketstr=("C0/P0/B0/D0","C0/P0/B0/D1","C0/P0/B1/D0","C0/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?"); push(@socketstr, "C1/P0/B0/D0","C1/P0/B0/D1","C1/P0/B1/D0","C1/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?") if ($ncpu > 1); push(@socketstr, "C2/P0/B0/D0","C2/P0/B0/D1","C2/P0/B1/D0","C2/P0/B1/D1","?","?","?","?","?","?","?","?","?","?","?","?") if ($ncpu > 2); push(@socketstr, "C3/P0/B0/D0","C3/P0/B0/D1","C3/P0/B1/D0","C3/P0/B1/D1") if ($ncpu > 3); } if ($ultra eq "Serverblade1") { # Sun Fire B100s Blade Server # 1 UltraSPARC-IIi 650MHz processors # Two PC-133 DIMM slots holding up to 2GB memory # Up to 16 Blade Servers in a single B1600 Intelligent Shelf # prtdiag output shows the memory installed. $bannermore="(Sun Fire B100s Blade Server)"; $modelmore=$bannermore; $devname="Stiletto"; $familypn="A44"; $untested=0; $prtdiag_has_mem=1; $simmrangex="00000400"; $simmbanks=2; $simmsperbank=1; @simmsizes=(256,512,1024); @socketstr=("Blade/DIMM0","Blade/DIMM1"); } if ($ultra eq "T2000") { # 1 UltraSPARC-T1 (Niagara) processor with "CoolThreads" multithreading # 8 Core 1.2GHz (9.6GHz clock speed rating) or 4, 6, or 8 Core 1.0GHz # or 8 Core 1.4GHz # Up to 64GB DDR2 memory in 16 slots w/ Chipkill and DRAM sparing, ECC # registered DIMMs. Supports 512MB, 1GB, 2GB and 4GB DIMMs. # Option X7800A - 1GB (2x512MB DDR2) 370-6207, 512MB DDR2 DIMM, 533MHz # Option X7801A - 2GB (2x1GB DDR2) 370-6208, 1GB DDR2 DIMM, 533MHz # Option X7802A - 4GB (2x2GB DDR2) 370-6209, 2GB DDR2 DIMM, 533MHz # DIMMs must be installed in sets of 8. Two basic memory configurations # are supported: 8-DIMM or 16-DIMM. All DIMMs must have identical # capacity. An 8 DIMM configuration fully populates Rank 0 (R0) slots. # Base configurations sold by Sun use all 16 DIMM slots (2 ranks) except # smallest memory configuration (4GB, 8 x 512MB in Rank 0). # The minimum T2000 memory requirement is 8 Rank 0 DIMMs. # 4 memory controllers embedded in UltraSPARC-T1 (CH0-CH3) # # T2000 Memory Map # +----------------------------------------+ # | J0901 Channel 0 Rank 1 DIMM 1 | DIMM 1 # Install 1st | J0701 Channel 0 Rank 0 DIMM 1 | DIMM 2 # | J0801 Channel 0 Rank 1 DIMM 0 | DIMM 3 # Install 1st | J0601 Channel 0 Rank 0 DIMM 0 | DIMM 4 # | J1401 Channel 1 Rank 1 DIMM 1 | DIMM 5 # Install 1st | J1201 Channel 1 Rank 0 DIMM 1 | DIMM 6 # | J1301 Channel 1 Rank 1 DIMM 0 | DIMM 7 # Install 1st | J1101 Channel 1 Rank 0 DIMM 0 | DIMM 8 # +----------------------------------------+ # +---------------+ # | UltraSPARC T1 | # +---------------+ # +----------------------------------------+ # Install 1st | J2101 Channel 3 Rank 0 DIMM 0 | DIMM 9 # | J2301 Channel 3 Rank 1 DIMM 0 | DIMM 10 # Install 1st | J2201 Channel 3 Rank 0 DIMM 1 | DIMM 11 # | J2401 Channel 3 Rank 1 DIMM 1 | DIMM 12 # Install 1st | J1601 Channel 2 Rank 0 DIMM 0 | DIMM 13 # | J1801 Channel 2 Rank 1 DIMM 0 | DIMM 14 # Install 1st | J1701 Channel 2 Rank 0 DIMM 1 | DIMM 15 # | J1901 Channel 2 Rank 1 DIMM 1 | DIMM 16 # +----------------------------------------+ $devname="Ontario"; $familypn="T20"; if ($model =~ /Netra-T2000\b/ || $banner =~ /Netra T2000\b/) { $devname="Pelton"; $familypn="N20"; } $familypn="T20, SEB" if ($model =~ /SPARC-Enterprise-T2000/ || $banner =~ /SPARC Enterprise T2000/); $untested=0; $simmrangex="00002000"; if (scalar(@slots) == 8) { # Two ranks reported $simmbanks=2; $simmsperbank=8; } else { # One rank reported, but default base configurations ship with # two ranks (16 DIMMs) $simmbanks=1; $simmsperbank=16; } @simmsizes=(512,1024,2048,4096); @socketstr=("MB/CMP0/CH0/R0/D0","MB/CMP0/CH0/R0/D1","MB/CMP0/CH1/R0/D0","MB/CMP0/CH1/R0/D1","MB/CMP0/CH2/R0/D0","MB/CMP0/CH2/R0/D1","MB/CMP0/CH3/R0/D0","MB/CMP0/CH3/R0/D1","MB/CMP0/CH0/R1/D0","MB/CMP0/CH0/R1/D1","MB/CMP0/CH1/R1/D0","MB/CMP0/CH1/R1/D1","MB/CMP0/CH2/R1/D0","MB/CMP0/CH2/R1/D1","MB/CMP0/CH3/R1/D0","MB/CMP0/CH3/R1/D1"); &check_for_LDOM; } if ($ultra eq "T1000") { # 1 UltraSPARC-T1 (Niagara) processor with "CoolThreads" multithreading # 6 or 8 Core 1.0GHz # Up to 32GB DDR2 memory in 8 slots w/ Chipkill and DRAM sparing, ECC # registered DIMMs. Supports 512MB, 1GB, 2GB and 4GB DIMMs. # Option X7800A - 1GB (2x512MB DDR2) 370-6207, 512MB DDR2 DIMM, 533MHz # Option X7801A - 2GB (2x1GB DDR2) 370-6208, 1GB DDR2 DIMM, 533MHz # Option X7802A - 4GB (2x2GB DDR2) 370-6209, 2GB DDR2 DIMM, 533MHz # DIMMs must be installed in sets of 4. # Base configurations sold by Sun use all 8 DIMM slots (2 ranks) except # smallest memory configuration (2GB, 4 x 512MB in Rank 0). # The minimum T1000 memory requirement is 4 Rank 0 DIMMs. # 4 memory controllers embedded in UltraSPARC-T1 (CH0-CH3) # # T1000 Memory Map # +----------------------------------------+ # | J1301 Channel 3 Rank 1 DIMM 1 | # Install 1st | J1101 Channel 3 Rank 0 DIMM 1 | # | J1201 Channel 3 Rank 1 DIMM 0 | # Install 1st | J1001 Channel 3 Rank 0 DIMM 0 | # +----------------------------------------+ # +---------------+ # | UltraSPARC T1 | # +---------------+ # +----------------------------------------+ # Install 1st | J0501 Channel 0 Rank 0 DIMM 0 | # | J0701 Channel 0 Rank 1 DIMM 0 | # Install 1st | J0601 Channel 0 Rank 0 DIMM 1 | # | J0801 Channel 0 Rank 1 DIMM 1 | # +----------------------------------------+ $devname="Erie"; $familypn="T10"; $familypn="T10, SEA" if ($model =~ /SPARC-Enterprise-T1000/ || $banner =~ /SPARC Enterprise T1000/); $untested=0; $simmrangex="00002000"; if (scalar(@slots) == 8) { # Two ranks reported $simmbanks=2; $simmsperbank=4; } else { $simmbanks=1; $simmsperbank=8; } @simmsizes=(512,1024,2048,4096); @socketstr=("MB/CMP0/CH0/R0/D0","MB/CMP0/CH0/R0/D1","MB/CMP0/CH3/R0/D0","MB/CMP0/CH3/R0/D1","MB/CMP0/CH0/R1/D0","MB/CMP0/CH0/R1/D1","MB/CMP0/CH3/R1/D0","MB/CMP0/CH3/R1/D1"); &check_for_LDOM; } if ($ultra eq "T6300") { # 1 UltraSPARC-T1 (Niagara) processor with "CoolThreads" multithreading # 6-Core 1.0GHz, 8-Core 1.0GHz, 1.2GHz or 1.4GHz # Up to 32GB ECC Registered DDR2 PC4200 # Supports 1GB, 2GB and 4GB DIMMs. # DIMMs must be installed in sets of 4. # Supported memory configurations: # 4 FB-DIMMs (Channel 0 and Channel 3) # 4 FB-DIMMs (Channel 1 and Channel 2) # 8 FB-DIMMs (Channel 0, 1, 2 and 3) (fully populated configuration) # Due to interleaving rules for the CPU, the system will operate at # the lowest capacity of all the DIMMs installed. Therefore, it is # ideal to install eight identical DIMMs (not four DIMMs of one # capacity and four DIMMs of another capacity). $devname="St. Paul"; $familypn="A94"; $untested=0; $memtype="FB-DIMM"; $simmrangex="00002000"; $showrange=0; $simmbanks=2; $simmsperbank=4; @simmsizes=(1024,2048,4096); @socketstr=("MB/CMP0/CH0/R0/D0","MB/CMP0/CH0/R0/D1","MB/CMP0/CH3/R0/D0","MB/CMP0/CH3/R0/D1","MB/CMP0/CH1/R0/D0","MB/CMP0/CH1/R0/D1","MB/CMP0/CH2/R0/D0","MB/CMP0/CH2/R0/D1"); @socketlabelstr=("J6301","J6401","J7201","J7301","J6601","J6701","J6901","J7001"); &check_for_LDOM; } if ($ultra eq "T5120" || $ultra eq "T5220" || $ultra eq "T6320") { # 1 UltraSPARC-T2 (Niagara-II) multicore processor with "CoolThreads" # multithreading, 1.2GHz 4 or 8-Core or 1.4GHz 8-Core # Up to 64GB Fully Buffered ECC-registered DDR2 @ 667MHz # Supports 1GB, 2GB, 4GB and 8GB DIMMs. # DIMMs must be installed in sets of 4. # All FB-DIMMs must be the same density (same type and Sun part number) # Supported memory configurations: # 4 FB-DIMMs (Group 1) MB/CMP0/BR[0-3]/CH0/D0 # 8 FB-DIMMs (Groups 1-2) MB/CMP0/BR[0-3]/CH[01]/D0 # 16 FB-DIMMs (Groups 1-3) MB/CMP0/BR[0-3]/CH[01]/D[01] # # FB-DIMM Configuration: # Install FB-DIMM # Branch Channel FRU Name FB-DIMM Order Pair # # 0 0 MB/CMP0/BR0/CH0/D0 J1001 1 A # MB/CMP0/BR0/CH0/D1 J1101 3 B # 1 MB/CMP0/BR0/CH1/D0 J1201 2 A # MB/CMP0/BR0/CH1/D1 J1301 3 B # 1 0 MB/CMP0/BR1/CH0/D0 J1401 1 C # MB/CMP0/BR1/CH0/D1 J1501 3 D # 1 MB/CMP0/BR1/CH1/D0 J1601 2 C # MB/CMP0/BR1/CH1/D1 J1701 3 D # 2 0 MB/CMP0/BR2/CH0/D0 J2001 1 E # MB/CMP0/BR2/CH0/D1 J2101 3 F # 1 MB/CMP0/BR2/CH1/D0 J2201 2 E # MB/CMP0/BR2/CH1/D1 J2301 3 F # 3 0 MB/CMP0/BR3/CH0/D0 J2401 1 G # MB/CMP0/BR3/CH0/D1 J2501 3 H # 1 MB/CMP0/BR3/CH1/D0 J2601 2 G # MB/CMP0/BR3/CH1/D1 J2701 3 H # # Note - FB-DIMM names in ILOM messages are displayed with the full FRU # name, such as /SYS/MB/CMP0/BR0/CH0/D0. $devname="Huron"; if ($ultra eq "T5120") { $devname="Huron 1U"; $familypn="SEC"; } if ($ultra eq "T5220") { $devname="Huron 2U"; $familypn="SED"; } if ($banner =~ /Netra T5220\b/) { $devname="Turgo"; $familypn="NT52"; } if ($ultra eq "T6320") { $devname="Glendale"; $familypn="A95"; } $untested=0; $memtype="FB-DIMM"; $simmrangex="00008000"; $showrange=0; $simmbanks=4; $simmsperbank=4; @simmsizes=(1024,2048,4096,8192); @socketstr=("MB/CMP0/BR0/CH0/D0","MB/CMP0/BR1/CH0/D0","MB/CMP0/BR2/CH0/D0","MB/CMP0/BR3/CH0/D0","MB/CMP0/BR0/CH1/D0","MB/CMP0/BR1/CH1/D0","MB/CMP0/BR2/CH1/D0","MB/CMP0/BR3/CH1/D0","MB/CMP0/BR0/CH0/D1","MB/CMP0/BR1/CH0/D1","MB/CMP0/BR2/CH0/D1","MB/CMP0/BR3/CH0/D1","MB/CMP0/BR0/CH1/D1","MB/CMP0/BR1/CH1/D1","MB/CMP0/BR2/CH1/D1","MB/CMP0/BR3/CH1/D1"); &check_for_LDOM; } if ($ultra eq "CP3260") { # 1 UltraSPARC-T2 (Niagara-II) multicore processor with "CoolThreads" # multithreading, 6 or 8 core with 8 threads per core # 8 FB-DIMM slots, 8GB or 16GB, using 1GB or 2GB DIMMs, 8 channels # Fully Buffered ECC-registered DDR2 @ 667MHz # All FB-DIMMs must be the same density (same type and Sun part number) # Supported memory configurations: # FB0B FB0A FB1B FB1A FB2A FB2B FB3A FB3B # DIMM Pair 0 DIMM Pair 1 DIMM Pair 2 DIMM Pair 3 $devname="Monza"; $untested=1; $memtype="FB-DIMM"; $simmrangex="00008000"; $showrange=0; $simmbanks=1; $simmsperbank=8; @simmsizes=(1024,2048); @socketstr=("FB0A","FB0B","FB1A","FB1B","FB2A","FB2B","FB3A","FB3B"); &check_for_LDOM; } if ($ultra eq "T5140" || $ultra eq "T5240" || $ultra eq "T6340") { # T5140 has 2 UltraSPARC-T2+ (Victoria Falls) multicore processors with # "CoolThreads" multithreading, 1.2GHz 4, 6, or 8-Core # T5240 has 2 UltraSPARC-T2+ (Victoria Falls) multicore processors with # "CoolThreads" multithreading, 1.2GHz 4, 6, or 8-Core or 1.4GHz 8-Core # T6340 has 2 UltraSPARC-T2+ (Victoria Falls) multicore processors with # "CoolThreads" multithreading, 1.4GHz 8-Core # 8GB to 64GB Fully Buffered ECC-registered DDR2 @ 667MHz # Supports 1GB, 2GB, 4GB and 8GB DIMMs. # T5240 also supports optional mezzanine memory board doubling memory # with an additional 16 FB-DIMM sockets # All FB-DIMMs must be the same density (same type and Sun part number) # # T5140,T5240 Supported memory configurations: # 8 FB-DIMMs (Group 1) MB/CMP[01]/BR[01]/CH[01]/D0 # 12 FB-DIMMs (Groups 1-2) MB/CMP[01]/BR[01]/CH[01]/D0,MB/CMP0/BR[01]/CH[01]/D1 # 16 FB-DIMMs (Groups 1-3) MB/CMP[01]/BR[01]/CH[01]/D[01] # T5240 with memory mezzanine assembly supports these additional # memory configurations once the motherboard is fully populated: # 24 FB-DIMMs (Groups 1-4) MB/CMP[01]/MR0/BR[01]/CH[01]/D[23] # 32 FB-DIMMs (Groups 1-5) MB/CMP[01]/MR[01]/BR[01]/CH[01]/D[23] # # FB-DIMM Configuration: # Install FB-DIMM # Branch Channel FRU Name FB-DIMM Order Pair # # CMP0,0 0 MB/CMP0/BR0/CH0/D0 J0500 1 A # MB/CMP0/BR0/CH0/D1 J0600 2 B # 1 MB/CMP0/BR0/CH1/D0 J0700 1 A # MB/CMP0/BR0/CH1/D1 J0800 2 B # CMP0,1 0 MB/CMP0/BR1/CH0/D0 J0900 1 C # MB/CMP0/BR1/CH0/D1 J1000 2 D # 1 MB/CMP0/BR1/CH1/D0 J1100 1 C # MB/CMP0/BR1/CH1/D1 J1200 2 D # CMP1,0 0 MB/CMP1/BR0/CH0/D0 J1800 1 E # MB/CMP1/BR0/CH0/D1 J1900 3 F # 1 MB/CMP1/BR0/CH1/D0 J2000 1 E # MB/CMP1/BR0/CH1/D1 J2100 3 F # CMP1,1 0 MB/CMP1/BR1/CH0/D0 J2200 1 G # MB/CMP1/BR1/CH0/D1 J2300 3 H # 1 MB/CMP1/BR1/CH1/D0 J2400 1 G # MB/CMP1/BR1/CH1/D1 J2500 3 H # CMP0,0 0 MB/CMP0/MR0/BR0/CH0/D2 J0201 4 # MB/CMP0/MR0/BR0/CH0/D3 J0301 4 # 1 MB/CMP0/MR0/BR0/CH1/D2 J0401 4 # MB/CMP0/MR0/BR0/CH1/D3 J0501 4 # CMP0,1 0 MB/CMP0/MR0/BR1/CH0/D2 J0601 4 # MB/CMP0/MR0/BR1/CH0/D3 J0701 4 # 1 MB/CMP0/MR0/BR1/CH1/D2 J0801 4 # MB/CMP0/MR0/BR1/CH1/D3 J0901 4 # CMP1,0 0 MB/CMP1/MR1/BR0/CH0/D2 J0201 5 # MB/CMP1/MR1/BR0/CH0/D3 J0301 5 # 1 MB/CMP1/MR1/BR0/CH1/D2 J0401 5 # MB/CMP1/MR1/BR0/CH1/D3 J0501 5 # CMP1,1 0 MB/CMP1/MR1/BR1/CH0/D2 J0601 5 # MB/CMP1/MR1/BR1/CH0/D3 J0701 5 # 1 MB/CMP1/MR1/BR1/CH1/D2 J0801 5 # MB/CMP1/MR1/BR1/CH1/D3 J0901 5 # # Note - FB-DIMM names in ILOM messages are displayed with the full FRU # name, such as /SYS/MB/CMP0/BR0/CH0/D0. $devname="Maramba"; if ($ultra eq "T5140") { $devname="Maramba 1U"; $familypn="SET"; } if ($ultra eq "T5240") { $devname="Maramba 2U"; $familypn="SEU"; } $untested=0; if ($model =~ /-USBRDT-5240/) { $devname="Thunder"; $untested=1; } if ($ultra eq "T6340") { $devname="Scottsdale"; $familypn="T6340"; } if ($model =~ /Netra.*T6340/) { $familypn="NT6340"; $untested=1; } $memtype="FB-DIMM"; $simmrangex="00008000"; $showrange=0; $simmbanks=4; $simmbanks=8 if ($ultra eq "T5240" || $ultra eq "T6340"); $simmsperbank=4; @simmsizes=(1024,2048,4096,8192); @socketstr=("MB/CMP0/BR0/CH0/D0","MB/CMP0/BR0/CH1/D0","MB/CMP0/BR1/CH0/D0","MB/CMP0/BR1/CH1/D0","MB/CMP1/BR0/CH0/D0","MB/CMP1/BR0/CH1/D0","MB/CMP1/BR1/CH0/D0","MB/CMP1/BR1/CH1/D0","MB/CMP0/BR0/CH0/D1","MB/CMP0/BR0/CH1/D1","MB/CMP0/BR1/CH0/D1","MB/CMP0/BR1/CH1/D1","MB/CMP1/BR0/CH0/D1","MB/CMP1/BR0/CH1/D1","MB/CMP1/BR1/CH0/D1","MB/CMP1/BR1/CH1/D1"); push(@socketstr, "MB/CMP0/MR0/BR0/CH0/D2","MB/CMP0/MR0/BR0/CH0/D3","MB/CMP0/MR0/BR0/CH1/D2","MB/CMP0/MR0/BR0/CH1/D3","MB/CMP0/MR0/BR1/CH0/D2","MB/CMP0/MR0/BR1/CH0/D3","MB/CMP0/MR0/BR1/CH1/D2","MB/CMP0/MR0/BR1/CH1/D3","MB/CMP1/MR1/BR0/CH0/D2","MB/CMP1/MR1/BR0/CH0/D3","MB/CMP1/MR1/BR0/CH1/D2","MB/CMP1/MR1/BR0/CH1/D3","MB/CMP1/MR1/BR1/CH0/D2","MB/CMP1/MR1/BR1/CH0/D3","MB/CMP1/MR1/BR1/CH1/D2","MB/CMP1/MR1/BR1/CH1/D3") if ($ultra eq "T5240"); push(@socketstr, "MB/CMP0/BR0/CH0/D2","MB/CMP0/BR0/CH0/D3","MB/CMP0/BR0/CH1/D2","MB/CMP0/BR0/CH1/D3","MB/CMP0/BR1/CH0/D2","MB/CMP0/BR1/CH0/D3","MB/CMP0/BR1/CH1/D2","MB/CMP0/BR1/CH1/D3","MB/CMP1/BR0/CH0/D2","MB/CMP1/BR0/CH0/D3","MB/CMP1/BR0/CH1/D2","MB/CMP1/BR0/CH1/D3","MB/CMP1/BR1/CH0/D2","MB/CMP1/BR1/CH0/D3","MB/CMP1/BR1/CH1/D2","MB/CMP1/BR1/CH1/D3") if ($ultra eq "T6340"); &check_for_LDOM; } if ($ultra eq "T5440") { # T5440 has 4 UltraSPARC-T2+ (Victoria Falls) multicore processors # Netra-T5440 has 2 UltraSPARC-T2+ (Victoria Falls) multicore processors # 16GB to 256GB Fully Buffered ECC-registered DDR2 @ 667MHz # Supports 2GB, 4GB and 8GB DIMMs. # All FB-DIMMs must be the same density (same type and Sun part number) # # Note - FB-DIMM names in ILOM messages are displayed with the full FRU # name, such as /SYS/MB/CMP0/BR0/CH0/D0. $devname="Batoka" if ($ultra eq "T5440"); $devname="Congo" if ($model =~ /Netra-T5440/); $devname="Lightning" if ($model =~ /-USBRDT-5440/); $untested=0; $untested=1 if ($model =~ /-USBRDT-5440/); $memtype="FB-DIMM"; $simmrangex="00004000"; $showrange=0; $simmbanks=4; $simmsperbank=4; @simmsizes=(2048,4096,8192); if ($model =~ /Netra-T5440/) { $familypn="NT544"; @socketstr=("MB/CMP0/BR0/CH0/D0","MB/CMP0/BR0/CH1/D0","MB/CMP0/BR1/CH0/D0","MB/CMP0/BR1/CH1/D0","MB/CMP1/BR0/CH0/D0","MB/CMP1/BR0/CH1/D0","MB/CMP1/BR1/CH0/D0","MB/CMP1/BR1/CH1/D0","MB/CMP0/BR0/CH0/D1","MB/CMP0/BR0/CH1/D1","MB/CMP0/BR1/CH0/D1","MB/CMP0/BR1/CH1/D1","MB/CMP1/BR0/CH0/D1","MB/CMP1/BR0/CH1/D1","MB/CMP1/BR1/CH0/D1","MB/CMP1/BR1/CH1/D1","MB/CMP0/MR0/BR0/CH0/D2","MB/CMP0/MR0/BR0/CH0/D3","MB/CMP0/MR0/BR0/CH1/D2","MB/CMP0/MR0/BR0/CH1/D3","MB/CMP0/MR0/BR1/CH0/D2","MB/CMP0/MR0/BR1/CH0/D3","MB/CMP0/MR0/BR1/CH1/D2","MB/CMP0/MR0/BR1/CH1/D3","MB/CMP1/MR1/BR0/CH0/D2","MB/CMP1/MR1/BR0/CH0/D3","MB/CMP1/MR1/BR0/CH1/D2","MB/CMP1/MR1/BR0/CH1/D3","MB/CMP1/MR1/BR1/CH0/D2","MB/CMP1/MR1/BR1/CH0/D3","MB/CMP1/MR1/BR1/CH1/D2","MB/CMP1/MR1/BR1/CH1/D3"); } else { $familypn="SEV"; @socketstr=("MB/CPU0/CMP0/BR0/CH0/D0","MB/CPU0/CMP0/BR0/CH1/D0","MB/CPU0/CMP0/BR1/CH0/D0","MB/CPU0/CMP0/BR1/CH1/D0","MB/MEM0/CMP0/BR0/CH0/D1","MB/MEM0/CMP0/BR0/CH1/D1","MB/MEM0/CMP0/BR1/CH0/D1","MB/MEM0/CMP0/BR1/CH1/D1","MB/CPU1/CMP1/BR0/CH0/D0","MB/CPU1/CMP1/BR0/CH1/D0","MB/CPU1/CMP1/BR1/CH0/D0","MB/CPU1/CMP1/BR1/CH1/D0","MB/MEM1/CMP1/BR0/CH0/D1","MB/MEM1/CMP1/BR0/CH1/D1","MB/MEM1/CMP1/BR1/CH0/D1","MB/MEM1/CMP1/BR1/CH1/D1","MB/CPU2/CMP2/BR0/CH0/D0","MB/CPU2/CMP2/BR0/CH1/D0","MB/CPU2/CMP2/BR1/CH0/D0","MB/CPU2/CMP2/BR1/CH1/D0","MB/MEM2/CMP2/BR0/CH0/D1","MB/MEM2/CMP2/BR0/CH1/D1","MB/MEM2/CMP2/BR1/CH0/D1","MB/MEM2/CMP2/BR1/CH1/D1","MB/CPU3/CMP3/BR0/CH0/D0","MB/CPU3/CMP3/BR0/CH1/D0","MB/CPU3/CMP3/BR1/CH0/D0","MB/CPU3/CMP3/BR1/CH1/D0","MB/MEM3/CMP3/BR0/CH0/D1","MB/MEM3/CMP3/BR0/CH1/D1","MB/MEM3/CMP3/BR1/CH0/D1","MB/MEM3/CMP3/BR1/CH1/D1"); } &check_for_LDOM; } if ($ultra eq "T3-1" || $ultra eq "T3-1B") { # SPARC T3-1 and T3-1B have 1 SPARC-T3 (Rainbow Falls) multicore # processor with 8-Threads, 16-Core, 1.65GHz # 16 DIMM slots for up to 128GB memory (16 x 8GB), 8GB min (4 x 2GB) # supports 2GB, 4GB & 8GB DDR3 DIMMs, dual-rank # DIMM slots are organized into four branches, with each branch # connected to a separate Buffer-on-Board (BOB) ASIC, designated BOB0 # through BOB3. Each BOB ASIC has two DDR3 channels, with each channel # supporting two DIMMs. # Populate the 4 blue slots first (CH1/D0), the 4 white slots second # (CH0/D0), and the 8 black slots third (D1). $memtype="DDR3 DIMM"; $simmrangex="00004000"; $showrange=0; $simmbanks=4; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 8192; @simmsizes=(2048,4096,8192); $familypn="SE3" if ($ultra eq "T3-1"); $familypn="T31B" if ($ultra eq "T3-1B"); $familypn="NST3" if ($ultra eq "T3-1" && $banner =~ /Netra/i); $untested=0 if ($ultra eq "T3-1" || $ultra eq "T3-1B"); $untested=1 if ($banner =~ /Netra/i); @socketstr=("MB/CMP0/BOB0/CH1/D0","MB/CMP0/BOB1/CH1/D0","MB/CMP0/BOB2/CH1/D0","MB/CMP0/BOB3/CH1/D0","MB/CMP0/BOB0/CH0/D0","MB/CMP0/BOB1/CH0/D0","MB/CMP0/BOB2/CH0/D0","MB/CMP0/BOB3/CH0/D0","MB/CMP0/BOB0/CH1/D1","MB/CMP0/BOB1/CH1/D1","MB/CMP0/BOB2/CH1/D1","MB/CMP0/BOB3/CH1/D1","MB/CMP0/BOB0/CH0/D1","MB/CMP0/BOB1/CH0/D1","MB/CMP0/BOB2/CH0/D1","MB/CMP0/BOB3/CH0/D1"); &check_for_LDOM; } if ($ultra eq "T3-1BA") { # Netra SPARC T3-1BA has 1 SPARC-T3 (Rainbow Falls) multicore processor # with 8-Threads, 12-Core, 1.4GHz # 8 DIMM slots, 2GB or 4GB DDR3, all slots must be populated same # 16GB min (8 x 2GB), 32GB max (8 x 4GB) $memtype="DDR3 DIMM"; $simmrangex="00004000"; $showrange=0; $simmbanks=1; $simmsperbank=8; @simmsizes=(2048,4096); $untested=1; @socketstr=("DIMM0".."DIMM7"); # Guess &check_for_LDOM; } if ($ultra eq "T3-2") { # SPARC T3-2 has 2 SPARC-T3 (Rainbow Falls) multicore processors, each # with 8-Threads, 16-Core, 1.65GHz # 32 DIMM slots for up to 256GB memory (32 x 8GB), 64GB min (16 x 4GB) # supports 4GB & 8GB DDR3 DIMMs, dual-rank # A maximum of two memory risers (MR0 & MR1) supported per CPU, thus # allowing up to four memory risers total. # Each memory riser slot in the server chassis must be filled with # either a memory riser or filler panel, and each memory riser must be # filled with DIMMs and/or DIMM filler panels. # Each memory riser has 8 DIMM slots (D0-D3 for MB1, D4-D7 for MB0) # Install D0/D4 (blue), then D2/D6 (white), then D1/D5 (black), and # then D3/D7 (green). # Performance-oriented configurations should be configured with two # memory risers per CPU. In configurations that do not require two # memory risers per CPU, the following guidelines should be followed: # - Populate riser slot MR0 for each CPU, starting with the lowest # numbered CPU (P0). # - Populate riser slot MR1 for each CPU, starting with the lowest # numbered CPU (P0). $memtype="DDR3 DIMM"; $simmrangex="00004000"; $showrange=0; $simmbanks=4; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 8192; @simmsizes=(4096,8192); $familypn="SE4"; $untested=0; $untested=1 if ($banner =~ /Netra/i); @socketstr=("MB/CMP0/MR0/BOB0/CH0/D0","MB/CMP0/MR0/BOB0/CH1/D0","MB/CMP0/MR0/BOB1/CH0/D0","MB/CMP0/MR0/BOB1/CH1/D0","MB/CMP1/MR0/BOB0/CH0/D0","MB/CMP1/MR0/BOB0/CH1/D0","MB/CMP1/MR0/BOB1/CH0/D0","MB/CMP1/MR0/BOB1/CH1/D0","MB/CMP0/MR1/BOB0/CH0/D0","MB/CMP0/MR1/BOB0/CH1/D0","MB/CMP0/MR1/BOB1/CH0/D0","MB/CMP0/MR1/BOB1/CH1/D0","MB/CMP1/MR1/BOB0/CH0/D0","MB/CMP1/MR1/BOB0/CH1/D0","MB/CMP1/MR1/BOB1/CH0/D0","MB/CMP1/MR1/BOB1/CH1/D0","MB/CMP0/MR0/BOB0/CH0/D1","MB/CMP0/MR0/BOB0/CH1/D1","MB/CMP0/MR0/BOB1/CH0/D1","MB/CMP0/MR0/BOB1/CH1/D1","MB/CMP1/MR0/BOB0/CH0/D1","MB/CMP1/MR0/BOB0/CH1/D1","MB/CMP1/MR0/BOB1/CH0/D1","MB/CMP1/MR0/BOB1/CH1/D1","MB/CMP0/MR1/BOB0/CH0/D1","MB/CMP0/MR1/BOB0/CH1/D1","MB/CMP0/MR1/BOB1/CH0/D1","MB/CMP0/MR1/BOB1/CH1/D1","MB/CMP1/MR1/BOB0/CH0/D1","MB/CMP1/MR1/BOB0/CH1/D1","MB/CMP1/MR1/BOB1/CH0/D1","MB/CMP1/MR1/BOB1/CH1/D1"); &check_for_LDOM; } if ($ultra eq "T3-4") { # SPARC T3-4 has 2 or 4 SPARC-T3 (Rainbow Falls) multicore processors, # each with 8-Threads, 16-Core, 1.65GHz # 64 DIMM slots for up to 512GB memory (64 x 8GB), 128GB min (32 x 4GB) # supports 4GB & 8GB DDR3 DIMMs, dual-rank $memtype="DDR3 DIMM"; $simmrangex="00004000"; $showrange=0; $simmbanks=4; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 8192; @simmsizes=(4096,8192); $familypn="SE5"; $untested=1; $untested=1 if ($banner =~ /Netra/i); # Guess on socket name order ??? @socketstr=("PM0/CMP1/BOB0/CH0/D0","PM0/CMP1/BOB0/CH1/D0","PM0/CMP1/BOB1/CH0/D0","PM0/CMP1/BOB1/CH1/D0","PM0/CMP1/BOB2/CH0/D0","PM0/CMP1/BOB2/CH1/D0","PM0/CMP1/BOB3/CH0/D0","PM0/CMP1/BOB3/CH1/D0","PM0/CMP0/BOB0/CH0/D0","PM0/CMP0/BOB0/CH1/D0","PM0/CMP0/BOB1/CH0/D0","PM0/CMP0/BOB1/CH1/D0","PM0/CMP0/BOB2/CH0/D0","PM0/CMP0/BOB2/CH1/D0","PM0/CMP0/BOB3/CH0/D0","PM0/CMP0/BOB3/CH1/D0"); push(@socketstr, "PM0/CMP1/BOB0/CH0/D1","PM0/CMP1/BOB0/CH1/D1","PM0/CMP1/BOB1/CH0/D1","PM0/CMP1/BOB1/CH1/D1","PM0/CMP1/BOB2/CH0/D1","PM0/CMP1/BOB2/CH1/D1","PM0/CMP1/BOB3/CH0/D1","PM0/CMP1/BOB3/CH1/D1","PM0/CMP0/BOB0/CH0/D1","PM0/CMP0/BOB0/CH1/D1","PM0/CMP0/BOB1/CH0/D1","PM0/CMP0/BOB1/CH1/D1","PM0/CMP0/BOB2/CH0/D1","PM0/CMP0/BOB2/CH1/D1","PM0/CMP0/BOB3/CH0/D1","PM0/CMP0/BOB3/CH1/D1"); # Need to determine if PM1 is installed, its DIMMs are next push(@socketstr, "PM1/CMP1/BOB0/CH0/D0","PM1/CMP1/BOB0/CH1/D0","PM1/CMP1/BOB1/CH0/D0","PM1/CMP1/BOB1/CH1/D0","PM1/CMP1/BOB2/CH0/D0","PM1/CMP1/BOB2/CH1/D0","PM1/CMP1/BOB3/CH0/D0","PM1/CMP1/BOB3/CH1/D0","PM1/CMP0/BOB0/CH0/D0","PM1/CMP0/BOB0/CH1/D0","PM1/CMP0/BOB1/CH0/D0","PM1/CMP0/BOB1/CH1/D0","PM1/CMP0/BOB2/CH0/D0","PM1/CMP0/BOB2/CH1/D0","PM1/CMP0/BOB3/CH0/D0","PM1/CMP0/BOB3/CH1/D0"); push(@socketstr, "PM1/CMP1/BOB0/CH0/D1","PM1/CMP1/BOB0/CH1/D1","PM1/CMP1/BOB1/CH0/D1","PM1/CMP1/BOB1/CH1/D1","PM1/CMP1/BOB2/CH0/D1","PM1/CMP1/BOB2/CH1/D1","PM1/CMP1/BOB3/CH0/D1","PM1/CMP1/BOB3/CH1/D1","PM1/CMP0/BOB0/CH0/D1","PM1/CMP0/BOB0/CH1/D1","PM1/CMP0/BOB1/CH0/D1","PM1/CMP0/BOB1/CH1/D1","PM1/CMP0/BOB2/CH0/D1","PM1/CMP0/BOB2/CH1/D1","PM1/CMP0/BOB3/CH0/D1","PM1/CMP0/BOB3/CH1/D1"); &check_for_LDOM; } if ($ultra eq "T4-1" || $ultra eq "T4-1B") { # SPARC T4-1 and T4-1B have 1 SPARC-T4 multicore processor with # 8-Threads, 8-Core, 2.85GHz # 16 DIMM slots for up to 256GB memory (16 x 16GB), 16GB min (4 x 4GB) # supports 4GB, 8GB & 16GB DDR3 DIMMs # DIMM slots are organized into four branches, with each branch # connected to a separate Buffer-on-Board (BOB) ASIC, designated BOB0 # through BOB3. Each BOB ASIC has two DDR3 channels, with each channel # supporting two DIMMs. # Populate the 4 blue slots first (CH1/D0), the 4 white slots second # (CH0/D0), and the 8 black slots third (D1). $memtype="DDR3 DIMM"; $simmrangex="00008000"; # Guess $showrange=0; $simmbanks=4; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 16384; @simmsizes=(4096,8192,16384); $familypn="T41B" if ($ultra eq "T4-1B"); $untested=0 if ($ultra eq "T4-1"); @socketstr=("MB/CMP0/BOB0/CH1/D0","MB/CMP0/BOB1/CH1/D0","MB/CMP0/BOB2/CH1/D0","MB/CMP0/BOB3/CH1/D0","MB/CMP0/BOB0/CH0/D0","MB/CMP0/BOB1/CH0/D0","MB/CMP0/BOB2/CH0/D0","MB/CMP0/BOB3/CH0/D0","MB/CMP0/BOB0/CH1/D1","MB/CMP0/BOB1/CH1/D1","MB/CMP0/BOB2/CH1/D1","MB/CMP0/BOB3/CH1/D1","MB/CMP0/BOB0/CH0/D1","MB/CMP0/BOB1/CH0/D1","MB/CMP0/BOB2/CH0/D1","MB/CMP0/BOB3/CH0/D1"); &check_for_LDOM; } if ($ultra eq "T4-2" || $ultra eq "T4-2B") { # SPARC T4-2 and T4-2B have 2 SPARC-T4 multicore processor with # 8-Threads, 8-Core, 2.85GHz # 32 DIMM slots for up to 512GB memory (32 x 16GB), 64GB min (16 x 4GB) # supports 4GB, 8GB & 16GB DDR3 DIMMs $memtype="DDR3 DIMM"; $simmrangex="00008000"; # Guess $showrange=0; $simmbanks=8; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 16384; @simmsizes=(4096,8192,16384); $untested=0 if ($ultra eq "T4-2"); $untested=1 if ($banner =~ /Netra/i); @socketstr=("MB/CMP0/MR0/BOB0/CH0/D0","MB/CMP0/MR0/BOB0/CH1/D0","MB/CMP0/MR0/BOB1/CH0/D0","MB/CMP0/MR0/BOB1/CH1/D0","MB/CMP1/MR0/BOB0/CH0/D0","MB/CMP1/MR0/BOB0/CH1/D0","MB/CMP1/MR0/BOB1/CH0/D0","MB/CMP1/MR0/BOB1/CH1/D0","MB/CMP0/MR1/BOB0/CH0/D0","MB/CMP0/MR1/BOB0/CH1/D0","MB/CMP0/MR1/BOB1/CH0/D0","MB/CMP0/MR1/BOB1/CH1/D0","MB/CMP1/MR1/BOB0/CH0/D0","MB/CMP1/MR1/BOB0/CH1/D0","MB/CMP1/MR1/BOB1/CH0/D0","MB/CMP1/MR1/BOB1/CH1/D0","MB/CMP0/MR0/BOB0/CH0/D1","MB/CMP0/MR0/BOB0/CH1/D1","MB/CMP0/MR0/BOB1/CH0/D1","MB/CMP0/MR0/BOB1/CH1/D1","MB/CMP1/MR0/BOB0/CH0/D1","MB/CMP1/MR0/BOB0/CH1/D1","MB/CMP1/MR0/BOB1/CH0/D1","MB/CMP1/MR0/BOB1/CH1/D1","MB/CMP0/MR1/BOB0/CH0/D1","MB/CMP0/MR1/BOB0/CH1/D1","MB/CMP0/MR1/BOB1/CH0/D1","MB/CMP0/MR1/BOB1/CH1/D1","MB/CMP1/MR1/BOB0/CH0/D1","MB/CMP1/MR1/BOB0/CH1/D1","MB/CMP1/MR1/BOB1/CH0/D1","MB/CMP1/MR1/BOB1/CH1/D1"); &check_for_LDOM; } if ($ultra eq "T4-4") { # SPARC T4-4 has 4 SPARC-T4 multicore processor with # 8-Threads, 8-Core, 3.0GHz # 64 DIMM slots for up to 1TB memory (64 x 16GB), 64GB min (16 x 4GB) # supports 4GB, 8GB & 16GB DDR3 DIMMs $memtype="DDR3 DIMM"; $simmrangex="00008000"; # Guess $showrange=0; $simmbanks=16; # Assume largest DIMMs installed for prtconf-only data $simmsperbank=&roundup_memory($installed_memory) / 16384; @simmsizes=(4096,8192,16384); $untested=0; $untested=1 if ($banner =~ /Netra/i); @socketstr=("/SYS/PM0/CMP0/BOB0/CH0/D0","/SYS/PM0/CMP0/BOB0/CH1/D0","/SYS/PM0/CMP0/BOB1/CH0/D0","/SYS/PM0/CMP0/BOB1/CH1/D0","/SYS/PM0/CMP0/BOB2/CH0/D0","/SYS/PM0/CMP0/BOB2/CH1/D0","/SYS/PM0/CMP0/BOB3/CH0/D0","/SYS/PM0/CMP0/BOB3/CH1/D0","/SYS/PM0/CMP1/BOB0/CH0/D0","/SYS/PM0/CMP1/BOB0/CH1/D0","/SYS/PM0/CMP1/BOB1/CH0/D0","/SYS/PM0/CMP1/BOB1/CH1/D0","/SYS/PM0/CMP1/BOB2/CH0/D0","/SYS/PM0/CMP1/BOB2/CH1/D0","/SYS/PM0/CMP1/BOB3/CH0/D0","/SYS/PM0/CMP1/BOB3/CH1/D0","/SYS/PM1/CMP0/BOB0/CH0/D0","/SYS/PM1/CMP0/BOB0/CH1/D0","/SYS/PM1/CMP0/BOB1/CH0/D0","/SYS/PM1/CMP0/BOB1/CH1/D0","/SYS/PM1/CMP0/BOB2/CH0/D0","/SYS/PM1/CMP0/BOB2/CH1/D0","/SYS/PM1/CMP0/BOB3/CH0/D0","/SYS/PM1/CMP0/BOB3/CH1/D0","/SYS/PM1/CMP1/BOB0/CH0/D0","/SYS/PM1/CMP1/BOB0/CH1/D0","/SYS/PM1/CMP1/BOB1/CH0/D0","/SYS/PM1/CMP1/BOB1/CH1/D0","/SYS/PM1/CMP1/BOB2/CH0/D0","/SYS/PM1/CMP1/BOB2/CH1/D0","/SYS/PM1/CMP1/BOB3/CH0/D0","/SYS/PM1/CMP1/BOB3/CH1/D0"); &check_for_LDOM; } if ($ultra eq "T5-2") { # SPARC T5-2 has 2 SPARC-T5 multicore processor with # 8-Threads, 16-Core, 3.6GHz # 32 DIMM slots for up to 1TB memory (32 x 32GB), 256GB min (32 x 8GB) # supports 8GB, 16GB & 32GB DDR3 DIMMs # Each slot on a memory riser must be filled with a DIMM # All memory risers must contain the same type of DIMM $memtype="DDR3 DIMM"; $showrange=0; @simmsizes=(8192,16384,32768); $untested=0; # /SYS/MB/CM0/CMP/MR0/BOB0/CH0/D0 - /SYS/MB/CM1/CMP/MR3/BOB1/CH1/D0 for $s_cm (0,1) { for $s_mr (0..3) { for $s_bob (0,1) { for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CM$s_cm/CMP/MR$s_mr/BOB$s_bob/CH$s_ch/D0"); } } } } &check_for_LDOM; } if ($ultra eq "T5-4") { # SPARC T5-4 has 4 SPARC-T5 multicore processor with # 8-Threads, 16-Core, 3.6GHz # 64 DIMM slots for 2TB memory (64 x 32GB) or 1TB min (64 x 16GB) # supports 16GB & 32GB DDR3 DIMMs # All DIMMs installed in the server must have identical capacities # All DIMMs installed in each processor module must be identical $memtype="DDR3 DIMM"; $showrange=0; @simmsizes=(16384,32768); $untested=0; # /SYS/PM0/CM0/CMP/BOB0/CH0/D0 - /SYS/PM1/CM1/CMP/BOB7/CH1/D0 for $s_pm (0,1) { for $s_cm (0,1) { for $s_bob (0..7) { for $s_ch (0,1) { push(@socketstr, "/SYS/PM$s_pm/CM$s_cm/CMP/BOB$s_bob/CH$s_ch/D0"); } } } } &check_for_LDOM; } if ($ultra eq "T5-8") { # SPARC T5-8 has 8 SPARC-T5 multicore processor with # 8-Threads, 16-Core, 3.6GHz # 128 DIMM slots for 4TB memory (128 x 32GB) or 2TB min (128 x 16GB) # supports 16GB & 32GB DDR3 DIMMs # All DIMMs installed in the server must have identical capacities # All DIMMs installed in each processor module must be identical $memtype="DDR3 DIMM"; $showrange=0; @simmsizes=(16384,32768); $untested=1; # /SYS/PM0/CM0/CMP/BOB0/CH0/D0 - /SYS/PM3/CM1/CMP/BOB7/CH1/D0 for $s_pm (0..3) { for $s_cm (0,1) { for $s_bob (0..7) { for $s_ch (0,1) { push(@socketstr, "/SYS/PM$s_pm/CM$s_cm/CMP/BOB$s_bob/CH$s_ch/D0"); } } } } &check_for_LDOM; } if ($ultra eq "T5-1B") { # SPARC T5-1B has 1 SPARC-T5 multicore processor with # 8-Threads, 16-Core, 3.6GHz # 16 DIMM slots for up to 512GB memory (16 x 32GB), 128GB min (16 x 8GB) # supports 8GB, 16GB & 32GB DDR3 DIMMs # Install quantities of 16 DIMMs # Ensure that all DIMMs are the same capacity and rank classification $memtype="DDR3 DIMM"; $showrange=0; @simmsizes=(8192,16384,32768); $untested=1; # /SYS/MB/CM0/CMP/BOB0/CH0/D0 - /SYS/MB/CM0/CMP/BOB7/CH1/D0 for $s_bob (0..7) { for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CM0/CMP/BOB$s_bob/CH$s_ch/D0"); } } &check_for_LDOM; } if ($ultra eq "M5-32" || $ultra eq "M6-32") { # SPARC M5-32 has 8 to 32 SPARC M5 processor at 3.6GHz, each with: # 6 cores, 48 threads # 32 DIMM slots for up to 1TB memory (32 x 32GB) # supports 16GB & 32GB 1066MHz DDR3 DIMMs # SPARC M6-32 has 8 to 32 SPARC M5 processor at 3.6GHz, each with: # 12 cores, 96 threads # 32 DIMM slots for up to 1TB memory (32 x 32GB) # supports 16GB & 32GB 1066MHz DDR3 DIMMs # Each CMU (CPU Memory Unit) includes 2 CMPs and 64 DIMM slots # Each CMU can be Quarter, Half, or Fully-Populated # Quarter-Populated: CMP[01]/D0000-D1101 (16 DIMMs) # Half-Populated: CMP[01]/D0000-D1103 (32 DIMMs) # Fully-Populated: CMP[01]/D0000-D1113 (64 DIMMs) $memtype="DDR3 DIMM"; $showrange=0; @simmsizes=(16384,32768); $untested=1; # /SYS/CMU0/CMP0/D0000 - /SYS/CMU15/CMP1/D1113 $s_cmu=int(($npcpu/2)-1); for (0..$s_cmu) { for $s_cmp (0,1) { for $s_d1 (0,1) { for $s_d2 (0,1) { for $s_d3 (0,1) { for $s_d4 (0..3) { push(@socketstr, "/SYS/CMU$s_cmu/CMP$s_cmp/D$s_d1$s_d2$s_d3$s_d4"); } } } } } } &check_for_LDOM; } if ($ultra eq "M10-1") { # Fujitsu SPARC M10-1 has 1 SPARC64-X processor at 2.8GHz # 16 cores, 32 threads # 16 DIMM slots for up to 512GB memory (16 x 32GB), 128GB min (16 x 8GB) # supports 8GB, 16GB & 32GB R-DIMM or 64GB LR-DIMM # Mount memory in units of four or eight modules # Within a unit of four or eight modules, all the DIMMs must be of the # same capacity and rank # First mount memory group A, then mount memory group B $memtype="DIMM"; $showrange=0; @simmsizes=(8192,16384,32768,65536); $untested=0; # /SYS/MBU/CMP0/MEM[01][0-3][AB] for $s_memAB ("A","B") { for $s_cmp (0,1) { for $s_memN (0..3) { push(@socketstr, "/SYS/MBU/CMP0/MEM$s_cmp$s_memN$s_memAB"); } } } &check_for_LDOM; } if ($ultra eq "M10-4" || $ultra eq "M10-4S") { # Fujitsu SPARC M10-4 has up to 4 SPARC64-X processor at 2.8GHz # 16 cores, 32 threads each # 32 DIMM slots per memory unit for up to 2TB memory (32 x 64GB), 64GB min (8 x 8GB) # supports 8GB, 16GB & 32GB R-DIMM or 64GB LR-DIMM # Mount memory in units of eight modules # Within a unit of eight modules, all the DIMMs must be of the same # capacity and rank # First mount memory group A, then mount memory group B # M10-4S is a modular system that combines up to 16 M10-4 servers for # up to 64 processors and up to 32TB memory $memtype="DIMM"; $showrange=0; @simmsizes=(8192,16384,32768,65536); $untested=0; $untested=1 if ($ultra eq "M10-4S"); if ($npcpu > 4) { # M10-4S $ultra="M10-4S"; $untested=1; } # M10-4: /BB0/CMUL/CMP0/MEM0[0-7]A - /BB0/CMUU/CMP1/MEM1[0-7]B # M10-4S: /BB00/CMUL/CMP0/MEM0[0-7]A - /BB15/CMUU/CMP1/MEM1[0-7]B # Guess $bb=int(($npcpu/4)-1); # BB: Building Block for (0..$bb) { $bb="0$bb" if ($ultra eq "M10-4S" && $bb < 10); # Guess if (($npcpu/2) % 2) { push(@cmus, "/BB$bb/CMUL"); } else { push(@cmus, "/BB$bb/CMUU"); } for $s_cmu (@cmus) { for $s_cmp (0,1) { for $s_memAB ("A","B") { for $s_memN (0..7) { push(@socketstr, "$s_cmu/CMP$s_cmp/MEM$s_cmp$s_memN$s_memAB"); } } } } } &check_for_LDOM; } if ($ultra eq "S7-2" || $ultra eq "S7-2L") { # SPARC S7-2 has 1 or 2 SPARC S7 processors at 4.267GHz # SPARC S7-2L has 2 SPARC S7 processors at 4.267GHz # Each SPARC S7 processor supports: # 8 cores, 8 threads. # 16 DIMM slots for up to 1TB memory (16 x 64GB). # supports 16GB, 32GB & 64GB DDR4 DIMMs. # Do not mix DIMMs sizes. # Can be half populated (D0 white sockets), 4 DIMMs per CPU, or # fully populated (D0 white & D1 black sockets), 8 DIMMs per CPU. $memtype="DDR4 DIMM"; $showrange=0; @simmsizes=(16384,32768,65536); $untested=1; $untested=0 if ($ultra eq "S7-2"); $cmp_range=0; $cmp_range=1 if ($ncpu eq 2 || $corecnt eq 2); # /SYS/MB/CMP0/MCU0/CH0/D0 - /SYS/MB/CMP1/MCU1/CH1/D1 for $s_d (0,1) { for ($s_cmp=0; $s_cmp <= $cmp_range; $s_cmp++) { for $s_mcu (0,1) { for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CMP$s_cmp/MCU$s_mcu/CH$s_ch/D$s_d"); } } } } &check_for_LDOM; } if ($ultra eq "T7-1") { # SPARC T7-1 has 1 SPARC M7 processors at 4.13GHz # SPARC M7 processor supports: # 32 cores, 8 threads # 16 DIMM slots for up to 1TB memory (16 x 64GB) # SPARC T7-1 supports: # 16GB, 32GB & 64GB DDR4 DIMMs # Left Memory Riser: /SYS/MB/CM/CMP/MR1/BOB[01]0/CH[01] # Left Motherboard: /SYS/MB/CM/CMP/BOB[13]1/CH[01] # Right Motherboard: /SYS/MB/CM/CMP/BOB[02]1/CH[01] # Right Memory Riser: /SYS/MB/CM/CMP/MR0/BOB[23]0/CH[01] # CH0 Black sockets, CH1 White sockets # In base configuration, all DIMM slots on motherboard must be # fully occupied (8 DIMMs). # In upgrade configuration (16 DIMMs), both memory risers are # added and must be fully occupied. $memtype="DDR4 DIMM"; $showrange=0; @simmsizes=(16384,32768,65536); $untested=1; for $s_bob (0..3) { # Motherboard for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CM/CMP/BOB${s_bob}1/CH$s_ch"); } } for $s_bob (0,1) { # MR1 for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CM/CMP/MR1/BOB${s_bob}0/CH$s_ch"); } } for $s_bob (2,3) { # MR0 for $s_ch (0,1) { push(@socketstr, "/SYS/MB/CM/CMP/MR0/BOB${s_bob}0/CH$s_ch"); } } &check_for_LDOM; } if ($ultra eq "T7-2") { # SPARC T7-2 has 2 SPARC M7 processors at 4.13GHz # SPARC M7 processor supports: # 32 cores, 8 threads # 16 DIMM slots for up to 1TB memory (16 x 64GB) # SPARC T7-2 supports: # 16GB, 32GB & 64GB DDR4 DIMMs # /SYS/MB/CM[01]/CMP/MR[0-3]/BOB[01]/CH[01]/DIMM # CH0 Black sockets, CH1 White sockets # All 8 memory risers must be installed in all configurations # Half-populated configurations populate CH0 Black sockets (16 DIMMs) # Full-populated configurations fill CH0 and CH1 sockets (32 DIMMs) $memtype="DDR4 DIMM"; $showrange=0; @simmsizes=(16384,32768,65536); $untested=1; for $s_ch (0,1) { for $s_cm (0,1) { for $s_mr (0..3) { for $s_bob (0,1) { push(@socketstr, "/SYS/MB/CM$s_cm/CMP/MR$s_mr/BOB$s_bob/CH$s_ch/DIMM"); } } } } &check_for_LDOM; } if ($ultra eq "T7-4") { # SPARC T7-4 has 2 or 4 SPARC M7 processors at 4.13GHz # SPARC M7 processor supports: # 32 cores, 8 threads # 16 DIMM slots for up to 1TB memory (16 x 64GB) # SPARC T7-4 supports: # 16GB, 32GB & 64GB DDR4 DIMMs # /SYS/PM[0-3]/CM[01]/CMP/BOB[0-3][01]/CH[01]/DIMM # CH0 Black sockets, CH1 White sockets # Half-populated configurations populate CH0 Black sockets (16 DIMMs) # Full-populated configurations fill CH0 and CH1 sockets (32 DIMMs) $memtype="DDR4 DIMM"; $showrange=0; @simmsizes=(16384,32768,65536); $untested=0; for $s_pm (0..$npcpu-1) { for $s_ch (0,1) { for $s_cm (0,1) { for $s_boba (0..3) { for $s_bobb (0,1) { push(@socketstr, "/SYS/PM$s_pm/CM$s_cm/CMP/BOB$s_boba$s_bobb/CH$s_ch/DIMM"); } } } } } &check_for_LDOM; } if ($ultra eq "M7-8" || $ultra eq "M7-16") { # SPARC M7-8 has 2 to 8 SPARC M7 processors at 4.13GHz # SPARC M7-16 has 4 to 16 SPARC M7 processors at 4.13GHz # Each SPARC M7 processor has 32 cores, 8 threads # SPARC M7-8 & M7-16 supports: # 16 DIMM slots for up to 512GB memory (16 x 32GB) # supports 16GB & 32GB DDR4 DIMMs # SPARC M7-8, has CMIOU_0 to CMIOU_7 # SPARC M7-16, has CMIOU_0 to CMIOU_15 # /SYS/CMIOU[0-15]/CM/CMP/BOB[0-3][01]/CH[01]/DIMM # CH0 Black sockets, CH1 White sockets # Half-populated configurations populate CH0 Black sockets (8 DIMMs) # Full-populated configurations fill CH0 and CH1 sockets (16 DIMMs) $memtype="DDR4 DIMM"; $showrange=0; @simmsizes=(16384,32768); $untested=1; for $s_cmiou (0..$npcpu-1) { for $s_ch (0,1) { for $s_boba (0..3) { for $s_bobb (0,1) { push(@socketstr, "/SYS/CM$s_cmiou/CM/CMP/BOB$s_boba$s_bobb/CH$s_ch/DIMM"); } } } } &check_for_LDOM; } if ($model eq "SPARC-Enterprise" || $ultra =~ /SPARC Enterprise M[34589]000 Server/) { # CPUs: Dual-Core Dual-Thread SPARC64-VI or # Quad-Core Dual-Thread SPARC64-VII, VII+, VII++ # M3000: 2RU rack, single SPARC64-VII 2.52GHz cpu # up to 32GB, uses DDR2-533 4GB or 8GB memory DIMMs # M4000: 6RU rack, up to 4 SPARC64-VI or SPARC64-VII cpus # Up to 2 CPU (CMU), 2 CPUs per board # Main memory Up to 128 GB per domain / system, up to 4 memory # boards w/ maximum 32GB per board using 8 DDR2 4GB memory DIMMs # M5000: 10RU rack, up to 8 SPARC64-VI or SPARC64-VII cpus # Up to 4 CPU (CMU), 2 CPUs per board # Main memory Up to 256 GB per domain / system, up to 8 memory # boards w/ maximum 32GB per board using 8 DDR2 4GB memory DIMMs # M8000: up to 16 SPARC64-VI or SPARC64-VII cpus # Up to 4 CPU memory boards (CMU), Up to 4 processors and up to # 128 GB memory per board based on 32 4GB DIMMs # Main memory Up to 512GB per domain / system # M9000: 32 or 64 SPARC64-VI or SPARC64-VII cpus # 32 CPU # Up to 8 CPU memory boards (CMU), Up to 4 processors and up to # 128 GB memory per board based on 32 4GB DIMMs # Main memory Up to 1TB per domain / system # 64 CPU # Up to 16 CPU memory boards (CMU), Up to 4 processors and up to # 128 GB memory per board based on 32 4GB DIMMs # Main memory Up to 2TB per domain / system $familypn="SEW" if ($ultra =~ /Sun SPARC Enterprise M3000 Server/); if ($ultra =~ /Sun SPARC Enterprise M4000 Server/) { $devname="OPL FF1"; $familypn="SEE"; } if ($ultra =~ /Sun SPARC Enterprise M5000 Server/) { $devname="OPL FF2"; $familypn="SEF"; } $familypn="SEG" if ($ultra =~ /Sun SPARC Enterprise M8000 Server/); $familypn="SEH/SEJ" if ($ultra =~ /Sun SPARC Enterprise M9000 Server/); $untested=1; $untested=0 if ($ultra =~ /SPARC Enterprise M[34589]000 Server/); $prtdiag_has_mem=1; @simmsizes=(1024,2048,4096); } if (($model =~ /-Enterprise/ || $ultra eq "e") && $model !~ /SPARC-Enterprise/) { # E3x00/E4x00/E5x00/E6x00 accepts 8MB, 32MB, 128MB or 256MB DIMMs on # motherboard, 2 banks of 8 DIMMs per board. # 256MB DIMMs (2GB kit X7026A) can be used with OBP 3.2.24 or later and # Solaris 2.5.1 11/97, Solaris 2.6 3/98 or later # 501-2652 (8MB), 501-2653 (32MB), 501-2654 (128MB), 501-5658 (256MB) # 168-pin 60ns 3.3V ECC # E10000 accepts 32MB or 128MB DIMMs on motherboard, # using 2 or 4 banks of 8 DIMMs per board. # 501-2653 (32MB), 501-2654 (128MB) # 168-pin 60ns 3.3V ECC $devname="Duraflame" if ($banner =~ /\bE?3[05]00\b/); $devname="Campfire Rack" if ($banner =~ /\bE?5[05]00\b/); $devname="Campfire" if ($banner =~ /\bE?4[05]00\b/); $devname="Sunfire" if ($banner =~ /\bE?6[05]00\b/); $devname .= "+" if ($banner =~ /\bE?[3-6]500\b/); $devname="Starfire" if ($model =~ /-10000\b/); $familypn="E3000, A17" if ($banner =~ /\bE?3000\b/); $familypn="E3500" if ($banner =~ /\bE?3500\b/); $familypn="E4000, A18" if ($banner =~ /\bE?4000\b/); $familypn="E4500" if ($banner =~ /\bE?4500\b/); $familypn="E5000" if ($banner =~ /\bE?5000\b/); $familypn="E5500" if ($banner =~ /\bE?5500\b/); $familypn="E6000" if ($banner =~ /\bE?6000\b/); $familypn="E6500" if ($banner =~ /\bE?6500\b/); $familypn="E10000" if ($model =~ /-10000\b/); $untested=1; if ($banner =~ /\bE?[3-6][05]00\b/ || $model =~ /-Enterprise-E?[3-6][05]00/ || $model eq "Ultra-Enterprise") { $untested=0; @simmsizes=(8,32,128,256); } if ($model =~ /-Enterprise-10000\b/) { $untested=0; @simmsizes=(32,128); } $prtdiag_has_mem=1; @prtdiag=&run("$prtdiag_exec") if (! $filename); $i=0; $flag_cpu=0; $flag_mem=0; foreach $line (@prtdiag) { $line=&dos2unix($line); if ($line =~ /Memory Units:/) { # Start of memory section, Solaris 2.5.1 format $flag_mem=1; $format_mem=1; $flag_cpu=0; # End of CPU section } if ($line =~ /====( | Physical )Memory /) { # Start of memory section, Solaris 2.6 and later format $flag_mem=1; $format_mem=2; $flag_cpu=0; # End of CPU section } if ($line =~ /Factor/) { # No interleave factor on E10000 $format_mem += 2 if ($format_mem == 1 || $format_mem == 2); } if ($line =~ /Failed Field Replaceable Unit/) { $tmp=$line; $tmp=~s/^\t/ /g; $failed_fru .= $tmp; } if ($line =~ /IO Cards/) { $flag_cpu=0; # End of CPU section $flag_mem=0; # End of memory section } if ($flag_cpu && $line !~ /^\s*\n$/) { push(@boards_cpu, "$line"); $boardfound_cpu=1; $boardslot_cpu=($line =~ /Board/) ? substr($line,6,2) : substr($line,0,2); $boardslot_cpu=~s/[: ]//g; if ($flag_cpu == 2 && $boardslot_cpus !~ /\s$boardslot_cpu\s/ && $boardslot_cpu) { push(@boardslot_cpus, "$boardslot_cpu"); $boardslot_cpus .= $boardslot_cpu . " "; } } if ($line =~ /CPU Units:/) { $flag_cpu=1; # Start of CPU section $flag_mem=0; # End of memory section $format_cpu=1; } if ($line =~ /====( | Virtual )CPUs ====/) { $flag_cpu=1; # Start of CPU section $flag_mem=0; # End of memory section $format_cpu=2; } if ($flag_mem == 2 && $line !~ /^\s*\n$/) { $memfrom="prtdiag"; $boardslot_mem=($line =~ /Board/) ? substr($line,5,2) : substr($line,0,2); $boardslot_mem=~s/[: ]//g; if ($boardslot_mems !~ /\s$boardslot_mem\s/) { push(@boardslot_mems, "$boardslot_mem"); $boardslot_mems .= $boardslot_mem . " "; } if ($format_mem == 1) { # Memory on each system board, E10000 $mem0=substr($line,12,4); $mem0=0 if ($mem0 !~ /\d+/); $dimm0=$mem0 / 8; if ($dimm0) { $dimms0=sprintf("8x%3d", $dimm0); push(@simmsizesfound, "$dimm0"); } else { $dimms0=" "; &found_empty_bank("Bank 0"); } $mem1=substr($line,20,4); $mem1=0 if ($mem1 !~ /\d+/); $dimm1=$mem1 / 8; if ($dimm1) { $dimms1=sprintf("8x%3d", $dimm1); push(@simmsizesfound, "$dimm1"); } else { $dimms1=" "; &found_empty_bank("Bank 1"); } $mem2=substr($line,28,4); $mem2=0 if ($mem2 !~ /\d+/); $dimm2=$mem2 / 8; if ($dimm2) { $dimms2=sprintf("8x%3d", $dimm2); push(@simmsizesfound, "$dimm2"); } else { $dimms2=" "; &found_empty_bank("Bank 2"); } $mem3=substr($line,36,4); $mem3=0 if ($mem3 !~ /\d+/); $dimm3=$mem3 / 8; if ($dimm3) { $dimms3=sprintf("8x%3d", $dimm3); push(@simmsizesfound, "$dimm3"); } else { $dimms3=" "; &found_empty_bank("Bank 3"); } $newline=substr($line,0,10); $newline .= " " . $mem0 . " " . $dimms0; $newline .= " " . $mem1 . " " . $dimms1; $newline .= " " . $mem2 . " " . $dimms2; $newline .= " " . $mem3 . " " . $dimms3; $newline .= "\n"; push(@boards_mem, "$newline"); $boardfound_mem=1; } if ($format_mem == 2) { # Memory on each system board, E10000 # untested ??? reporting of empty banks $untested=1; $bank_slot=substr($line,6,2); $mem=substr($line,12,4); $mem=0 if ($mem !~ /\d+/); $dimm=$mem / 8; if ($dimm) { $dimms=sprintf("8x3d", $dimm); push(@simmsizesfound, "$dimm"); $newline=substr($line,0,18) . $dimms; $newline .= substr($line,16,47); push(@boards_mem, "$newline"); $boardfound_mem=1; $failed_memory += $mem if ($newline =~ /\b\bFailed\b\b/); $spare_memory += $mem if ($newline =~ /\b\bSpare\b\b/); } else { $flag_mem=0; &found_empty_bank("Bank $bank_slot"); } if ($bank_slot == 0) { $next_boardslot_mem=substr($prtdiag[$i + 1],0,2); $next_boardslot_mem=~s/[: ]//g; &found_empty_bank("Bank 1") if ($next_boardslot_mem ne $boardslot_mem); } if ($bank_slot == 1) { $prev_boardslot_mem=substr($prtdiag[$i - 1],0,2); $prev_boardslot_mem=~s/[: ]//g; &found_empty_bank("Bank 0") if ($prev_boardslot_mem ne $boardslot_mem); } } if ($format_mem == 3) { # Memory on each system board, E[3456]x00 $mem0=substr($line,10,4); $mem0=0 if ($mem0 !~ /\d+/); $dimm0=$mem0 / 8; if ($dimm0) { $dimms0=sprintf("8x%3d", $dimm0); push(@simmsizesfound, "$dimm0"); } else { $dimms0=" "; &found_empty_bank("Bank 0"); } $memlength=length($line); $mem1=($memlength > 34) ? substr($line,34,4) : 0; $mem1=0 if ($mem1 !~ /\d+/); $dimm1=$mem1 / 8; if ($dimm1) { $dimms1=sprintf("8x%3d", $dimm1); push(@simmsizesfound, "$dimm1"); } else { $dimms1=" "; &found_empty_bank("Bank 1"); } $newline=substr($line,0,16) . $dimms0; $newline .= substr($line,16,24); if ($dimm1) { $newline .= $dimms1; $newline .= substr($line,39,16); } push(@boards_mem, "$newline"); $boardfound_mem=1; } if ($format_mem == 4) { # Memory on each system board, E[3456]x00 $bank_slot=substr($line,7,1); $mem=substr($line,12,4); $mem=0 if ($mem !~ /\d+/); $dimm=$mem / 8; if ($dimm) { $dimms=sprintf("8x%3d", $dimm); push(@simmsizesfound, "$dimm"); $newline=substr($line,0,18) . $dimms; $newline .= substr($line,16,47); push(@boards_mem, "$newline"); $boardfound_mem=1; $failed_memory += $mem if ($newline =~ /\b\bFailed\b\b/); $spare_memory += $mem if ($newline =~ /\b\bSpare\b\b/); } else { $flag_mem=0; &found_empty_bank("Bank $bank_slot"); } if ($bank_slot == 0) { $next_boardslot_mem=substr($prtdiag[$i + 1],0,2); $next_boardslot_mem=~s/[: ]//g; &found_empty_bank("Bank 1") if ($next_boardslot_mem ne $boardslot_mem); } if ($bank_slot == 1) { $prev_boardslot_mem=substr($prtdiag[$i - 1],0,2); $prev_boardslot_mem=~s/[: ]//g; &found_empty_bank("Bank 0") if ($prev_boardslot_mem ne $boardslot_mem); } } } if ($flag_cpu == 1 && $line =~ /-----/) { # Next lines are the CPUs on each system board $flag_cpu=2; } if ($flag_mem == 1 && $line =~ /-----/) { # Next lines are the memory on each system board $flag_mem=2; } $i++; } &show_header; if ($boardfound_mem) { if ($boardfound_cpu) { foreach $board (@boardslot_cpus) { if ($boardslot_mems !~ /\s$board\s/) { $boardslot_mem=$board; if ($format_mem <= 2) { # E10000 &found_empty_bank("Bank 0"); &found_empty_bank("Bank 1"); &found_empty_bank("Bank 2"); &found_empty_bank("Bank 3"); } else { # E3x00/E4x00/E5x00/E6x00 &found_empty_bank("Bank 0"); &found_empty_bank("Bank 1"); } } } } if ($format_mem == 1) { # E10000 running Solaris 2.5.1 print " Bank 0 Bank 1 Bank 2 Bank 3\n"; print " MB DIMMs MB DIMMs MB DIMMs MB DIMMs\n"; print " ---- ----- ---- ----- ---- ----- ---- -----\n"; print @boards_mem; } if ($format_mem == 2) { # E10000 running Solaris 2.6 or later print "Brd Bank MB DIMMs Status Condition Speed\n"; print "--- ----- ---- ----- ------- ---------- -----\n"; print @boards_mem; } if ($format_mem == 3) { # E3x00/E4x00/E5x00/E6x00 running Solaris 2.5.1 print " Bank 0 Bank 1\n"; print " J3100-J3800 Interleave J3101-J3801 Interleave\n"; print " MB DIMMs Factor With MB DIMMs Factor With\n"; print " ---- ----- ------ ---- ---- ----- ------ ----\n"; print @boards_mem; } if ($format_mem == 4) { # E3x00/E4x00/E5x00/E6x00 running Solaris 2.6 or later print " Intrlv. Intrlv.\n"; print "Brd Bank MB DIMMs Status Condition Speed Factor With\n"; print "--- ----- ---- ----- ------- ---------- ----- ------- -------\n"; print @boards_mem; print "Bank 0 uses sockets J3100-J3800, Bank 1 uses sockets J3101-J3801\n"; } $empty_banks=" None" if (! $empty_banks); print "empty memory banks:$empty_banks\n"; } $totmem=$installed_memory; &finish; &pdebug("exit"); exit; } # # Check to see if this system has memory defined in the prtdiag output # &check_prtdiag; $model=$diagbanner if ($diagbanner && $isX86); $untested=0 if ($boardfound_mem && $isX86 && ! $have_x86_devname); &x86_devname; # Don't use prtdiag data on this clone $boardfound_mem=0 if ($manufacturer eq "AXUS"); # # Check to see if this system has module information in prtconf output # (Seen on Fujitsu GP7000, GP7000F, PrimePower) # if ($gotmodule || $gotmodulenames) { @simmslots=($gotmodulenames) ? split(/\./, $gotmodulenames) : split(/\./, $gotmodule); $totmem=0; for ($val=0; $val < scalar(@simmslots); $val += 2) { $socket=($gotmodulenames) ? $simmslots[$val] : "SLOT" . $val / 2; $simmsz=$simmslots[$val + 1]; $simmsize=hex("0x$simmsz") / $meg; $perlhexbug=1 if ($simmsize <= 0 && $simmsz ne "00000000"); $totmem += $simmsize; if ($simmsize) { push(@simmsizesfound, "$simmsize"); if (! $boardfound_mem) { push(@memorylines, "$socket has a ${simmsize}MB"); if ($simmsize > 1023) { push(@memorylines, " ("); push(@memorylines, $simmsize/1024); push(@memorylines, "GB)"); } push(@memorylines, " $memtype\n"); } $sockets_used .= " $socket"; } } &show_header; &pdebug("displaying memory from $memfrom") if ($memfrom); print (($boardfound_mem) ? @boards_mem : @memorylines); $totmem=$installed_memory; &finish; &pdebug("exit"); exit; } # # Check to see if this system has module information in ipmitool output # if ($have_ipmitool_data) { &check_ipmitool; $tmp=scalar(keys %ipmi_mem); if (defined($tmp)) { if ($tmp) { &pdebug("Memory found with ipmitool"); &show_header; for (sort alphanumerically keys %ipmi_mem) { if ($ipmi_mem{$_}) { print "socket $_: $ipmi_mem{$_}\n"; $simmsize=$ipmi_mem{$_}; $simmsize=~s/^.*\b(\d+)M[Bb].*/$1/; $ipmi_memory += $simmsize if ($simmsize); } else { &add_to_sockets_empty($_); } } $totmem=$installed_memory; &print_empty_memory("memory sockets"); &finish; &pdebug("exit"); exit; } } } # # Check to see if this system has cpu information in kstat output to recognize # Hyper-Threaded Intel CPUs # &check_kstat if ($have_kstat_data); # # Check to see if this system has module information in smbios output # &check_smbios if ($have_smbios_data); # # Check to see if this system has module information in prtfru output # &check_prtfru; # # Display memory if found in prtdiag and/or prtfru output # if ($boardfound_mem) { &show_header; &pdebug("displaying memory from $memfrom") if ($memfrom); &pdebug("displaying memory from prtfru") if ($fru_details && $memfrom ne "prtfru"); # Rewrite prtdiag output to exclude DIMM5-DIMM8 on W1100z if ($model =~ /W1100z\b/i && $model !~ /2100z\b/i) { @new_boards_mem=""; foreach $line (@boards_mem) { push(@new_boards_mem, "$line") if ($line !~ /DIMM[5-8]/); } @boards_mem=@new_boards_mem; } print @boards_mem if (! &is_virtualmachine); if ($have_prtfru_details) { print "FRU Memory Data:\n-----------------------------------------------------------------------\n$fru_details"; if ($missing_prtfru_details ne " ") { print "NOTICE: Not all memory modules reported detailed FRU data\n"; } print "-----------------------------------------------------------------------\n"; } $totmem=$installed_memory; } # # Look for empty memory banks on Sun Fire 3800, 4800, 4810, 6800, 12K, 15K and # Netra T12 systems. Also Sun Fire E2900, E4900, E6900, E20K and E25K. # if ($ultra eq "Sun Fire" || $ultra eq "Sun Fire 15K" || $ultra eq "Sun Fire 12K" || $ultra eq "Netra T12" || $ultra =~ /Sun Fire ([346]8[01]0|E[246]900|E2[05]K)\b/) { foreach $cpu (@boardslot_cpus) { $empty_banks .= " $cpu/B0" if ($boardslot_mems !~ /$cpu\/B0/); $empty_banks .= " $cpu/B1" if ($boardslot_mems !~ /$cpu\/B1/); } $empty_banks=" None" if (! $empty_banks); if ($boardslot_mems eq " ") { $empty_banks=" Unknown"; $exitstatus=1; } print "empty memory banks:$empty_banks\n" if ($boardfound_mem); } if ($boardfound_mem) { &finish; &pdebug("exit"); exit; } # # OK, get ready to print out results # for ($val=$val0; $val < scalar(@slots); $val += $valinc) { $newaddrmsb=substr($slots[$val - $valaddr - 1],3,5); $newaddrlsb=substr($slots[$val - $valaddr],0,3); $newsizemsb=($valinc == 4) ? substr($slots[$val - 1],3,5) : ""; $newsizelsb=substr($slots[$val],0,3); # Round up for DIMM value seen on US-T1 and US-T2 Niagara systems # Two Ranks of DIMMs appear as one in prtconf if ($newsizelsb eq "ff8") { if ($newsizemsb eq "00000") { $newsizemsb="00001"; # 512MB if ($ultra eq "T2000") { # Hack: 1 rank of smallest DIMMs $simmbanks=2; $simmsperbank=8; } # Hack: Could be 1 Rank of 1GB on T1000 $recognized=-1 if ($ultra eq "T1000" && scalar(@slots) == 4); } elsif ($newsizemsb eq "00001") { $newsizemsb="00002"; # 1GB # Hack: Could be 1 Rank of 1GB on T2000 $recognized=-1 if ($ultra eq "T2000" && scalar(@slots) == 4); # Hack: Could be 1 Rank of 2GB on T1000 $recognized=-1 if ($ultra eq "T1000" && scalar(@slots) == 4); } elsif ($newsizemsb eq "00003") { $newsizemsb="00004"; # 2GB # Hack: Could be 1 Rank of 2GB on T2000 $recognized=-1 if ($ultra eq "T2000" && scalar(@slots) == 4); } elsif ($newsizemsb eq "00007") { $newsizemsb="00008"; # Fully stuffed 2 Ranks of 2GB } $newsizelsb="000"; $installed_memory += 8; } elsif ($newsizelsb eq "7f8" && $newsizemsb eq "00000") { if ($ultra eq "T1000") { # Hack: 1 rank of smallest DIMMs $newsizelsb="800"; # 512MB $simmbanks=2; $simmsperbank=4; } else { $newsizelsb="800"; # Hack: unsupported 256MB DIMM } $installed_memory += 8; } elsif ($newsizelsb eq "f80") { if ($newsizemsb eq "00001") { $newsizemsb="00002"; # 1GB } elsif ($newsizemsb eq "00003") { $newsizemsb="00004"; # 2GB } elsif ($newsizemsb eq "00007") { $newsizemsb="00008"; # 4GB } elsif ($newsizemsb eq "0000f") { $newsizemsb="00010"; # 8GB } $newsizelsb="000"; $installed_memory += 128; } if ($sortslots) { $mods{"$newaddrmsb$newaddrlsb"}="$newsizemsb$newsizelsb"; } else { push(@newslots, "$newaddrmsb$newaddrlsb"); push(@newslots, "$newsizemsb$newsizelsb"); } } if ($sortslots) { for (sort alphanumerically keys %mods) { push(@newslots, $_); push(@newslots, $mods{$_}); } } # For Ultra-30, determine if interleaving of banks using four DIMMs if ($model eq "Ultra-30" || $ultra eq 30) { $interleave=2; # pairs show up in odd numbered address ranges for ($val=0; $val < scalar(@newslots); $val += 2) { $interleave=1 if ($newslots[$val] =~ /00000[1357]00/); } if ($interleave eq 2) { $simmrangex="00000200"; $simmbanks=4; $simmsperbank=4; } else { $simmrangex="00000100"; $simmbanks=8; $simmsperbank=2; } } # Check if SPARCsystem-600 has VME memory expansion boards if ($model eq "SPARCsystem-600" || $model =~ /Sun.4.600/) { for ($val=0; $val < scalar(@newslots); $val += 2) { if ($newslots[$val] =~ /00000[4-9ab]00/) { @simmsizes=(1,4,16); push(@socketstr, @socketstr_exp); push(@bankstr, @bankstr_exp); push(@bytestr, @bytestr_exp); $exp=($newslots[$val] =~ /00000[4-7]00/) ? "Expansion board 0 bank" : "Expansion board 1 bank"; push(@banksstr, ("$exp B0","$exp B1", "$exp B2","$exp B3")); } } } # Hack: Rewrite interleaved memory line for Ultra-80 or Enterprise 420R if (($model eq "Ultra-80" || $ultra eq 80 || $ultra eq "420R" || $ultra eq "Netra t140x") && $newslots[0] eq "00000000") { if ($newslots[1] eq "00001000" && $installed_memory eq 4096) { # 4GB of memory (maximum) using 16x256MB in Banks 0-3 $newslots[1]="00000400"; $newslots[2]="00000400"; $newslots[3]="00000400"; $newslots[4]="00000800"; $newslots[5]="00000400"; $newslots[6]="00000c00"; $newslots[7]="00000400"; $interleave=4; } elsif ($newslots[1] eq "00000800" && $installed_memory eq 2048) { # 2GB of memory using 8x256MB in Banks 0,1 $newslots[1]="00000400"; $newslots[2]="00000400"; $newslots[3]="00000400"; $interleave=2; } elsif ($newslots[1] =~ /00000[97653]00/) { # Early OBP releases showed total memory as a single bank $recognized=-1; } elsif ($newslots[1] eq "00000400" && $installed_memory eq 1024) { # 1GB of memory can be 4x256MB in Bank 0 or 16x64MB in Banks 0-3 # so flag OBP bug $recognized=-1; } elsif ($newslots[1] eq "00000200" && $installed_memory eq 512) { # 512MB of memory using 8x64MB in Banks 0,1 $newslots[1]="00000100"; $newslots[2]="00000400"; $newslots[3]="00000100"; $interleave=2; } } # Hack: Fix address ranges for Tatung COMPstation U60 and U80D if ($banner =~ /COMPstation_U(60|80D)_Series/) { # Tatung Science and Technology, http://www.tsti.com for ($val=0; $val < scalar(@newslots); $val += 2) { $simmbanks=4 if ($newslots[$val] =~ /00000[46]00/); # Check for 256MB DIMMs or 256MB address range per bank if ($newslots[$val + 1] =~ /00000400/ || $newslots[$val] =~ /00000c00/) { $simmrangex="00000400"; $simmbanks=4; } } if ($simmbanks eq 6) { # Skipped address range similar to Sun Ultra 60 @socketstr=("J17","J32","J36","J40","J18","J33","J37","J41","?","?","?","?","?","?","?","?","J19","J34","J38","J42","J20","J35","J39","J43"); @slotstr=(1..8,"?","?","?","?","?","?","?","?",9..16); @bankstr=(0,0,0,0,1,1,1,1,"?","?","?","?","?","?","?","?",2,2,2,2,3,3,3,3); } else { @socketstr=("J17","J32","J36","J40","J18","J33","J37","J41","J19","J34","J38","J42","J20","J35","J39","J43"); @slotstr=(1..16); @bankstr=(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); } } # Hack: Try to rewrite memory line for Sun Blade 1000 & 2000 if prtdiag output # did not show the memory. This does not expect 2GB DIMMs to be used. if (($ultra eq "Sun Blade 1000" || $ultra eq "Sun Blade 2000" || $ultra eq "Sun Fire 280R") && ! $boardfound_mem) { # Assume 8GB is 8x1GB instead of 4x2GB if ($newslots[1] eq "00002000") { $newslots[1]="00001000"; $newslots[2]="00001000"; $newslots[3]="00001000"; $recognized=-2; } # Assume 6GB is 4x1GB + 4x512MB instead of 4x1.5GB if ($newslots[1] eq "00001800") { $newslots[1]="00001000"; $newslots[2]="00001000"; $newslots[3]="00000800"; $recognized=-1; } # Assume 5GB is 4x1GB + 4x256MB instead of 4x1280MB if ($newslots[1] eq "00001400") { $newslots[1]="00001000"; $newslots[2]="00001000"; $newslots[3]="00000400"; $recognized=-1; } # Assume 4.5GB is 4x1GB + 4x128MB instead of 4x1152MB if ($newslots[1] eq "00001200") { $newslots[1]="00001000"; $newslots[2]="00001000"; $newslots[3]="00000200"; $recognized=-1; } # Assume 3GB is 4x512MB + 4x256MB instead of 4x768MB if ($newslots[1] eq "00000c00") { $newslots[1]="00000800"; $newslots[2]="00001000"; $newslots[3]="00000400"; $recognized=-1; } # Assume 2.5GB is 4x512MB + 4x128MB instead of 4x640MB if ($newslots[1] eq "00000a00") { $newslots[1]="00000800"; $newslots[2]="00001000"; $newslots[3]="00000200"; $recognized=-1; } # Assume 1.5GB is 4x256MB + 4x128MB instead of 4x384MB if ($newslots[1] eq "00000600") { $newslots[1]="00000400"; $newslots[2]="00001000"; $newslots[3]="00000200"; $recognized=-1; } } # for prtconf output only, or fully stuffed LDOM servers if ($ultra eq "T5120" || $ultra eq "T5220" || $ultra eq "T6320" || $ultra eq "T5140") { # Hack: Rewrite fully stuffed memory line if ($installed_memory >= 130816) { $newslots[0]="00000000"; $newslots[1]="00008000"; $newslots[2]="00008000"; $newslots[3]="00008000"; $newslots[4]="00010000"; $newslots[5]="00008000"; $newslots[6]="00018000"; $newslots[7]="00008000"; } } if ($ultra eq "T5240" || $ultra eq "T6340") { # Hack: Rewrite fully stuffed memory line if ($installed_memory >= 261632) { $newslots[0]="00000000"; $newslots[1]="00008000"; $newslots[2]="00008000"; $newslots[3]="00008000"; $newslots[4]="00010000"; $newslots[5]="00008000"; $newslots[6]="00018000"; $newslots[7]="00008000"; $newslots[8]="00020000"; $newslots[9]="00008000"; $newslots[10]="00028000"; $newslots[11]="00008000"; $newslots[12]="00030000"; $newslots[13]="00008000"; $newslots[14]="00038000"; $newslots[15]="00008000"; } } # Check for dual bank DIMMs on Ultra AXmp+ if ($ultra eq "AXmp+") { if ($#newslots eq 1 && $newslots[0] eq "00000c00") { $simmsperbank=4; $dualbank=1; } if ($#newslots eq 3) { if ($newslots[2] =~ /00000[8c]00/) { $simmrangex="00000800"; $dualbank=1 if ($newslots[1] eq $newslots[3]); } } if ($#newslots ge 5) { $dualbank=1 if ($newslots[4] =~ /00000[8c]00/); } if ($dualbank eq 1) { @bankstr=("0,2","0,2","0,2","0,2","0,2","0,2","0,2","0,2","1,3","1,3","1,3","1,3","1,3","1,3","1,3","1,3"); # Rearrange slots if necessary if ($#newslots ge 5) { if ($newslots[4] eq "00000800") { $tmp=$newslots[2]; $newslots[2]=$newslots[4]; $newslots[4]=$tmp; $tmp=$newslots[3]; $newslots[3]=$newslots[5]; $newslots[5]=$tmp; } } } } $totmem=0; for ($val=0; $val < scalar(@newslots); $val += 2) { &pdebug("displaying memory from $memfrom") if ($memfrom); $simmaddr=$newslots[$val]; $simmsz=$newslots[$val + 1]; $simmsize=hex("0x$simmsz"); $simmsize=&roundup_memory($simmsize) if ($simmsize > 16384); $perlhexbug=1 if ($simmsize <= 0 && $simmsz ne "00000000"); $totmem += $simmsize; if (($model eq "Sun 4/75" || $model eq "SS-2") && ($simmbanks < $bankcnt + 2)) { # SS2 SBus memory card $buffer=($simmaddr eq "00000080") ? "${buffer}SBus primary" : "${buffer}SBus secondary"; $start1=hex("0x$simmaddr") * $meg; $perlhexbug=1 if ($start1 < 0); $simmrange=hex("0x$simmrangex") * $meg; $perlhexbug=1 if ($simmrange <= 0 && $simmrangex ne "00000000"); $start1x=sprintf("%08lx", $start1); $stop1x=sprintf("%08lx", $start1 + (2 * $simmrange) - 1); $totmem += $simmsize; $simmsize *= 2; $val += 2; $buffer .= " contains ${simmsize}MB"; $buffer .= " (address 0x${start1x}-0x$stop1x)" if ($verbose); $buffer .= "\n"; } elsif ($simmbanks) { $start1=hex("0x$simmaddr") * $meg; $perlhexbug=1 if ($start1 < 0); if ($simmrangex ne "0") { $simmrange=hex("0x$simmrangex") * $meg; $perlhexbug=1 if ($simmrange <= 0 && $simmrangex ne "00000000"); if ($simmrange < hex("0x00001000") * $meg) { $start1x=sprintf("%08lx", $start1); $stop1x=sprintf("%08lx", $start1 + ($simmsize * $meg) - 1); } else { # Systems with > 4GB of memory $start1x=$simmaddr . "00000"; $start1x=~s/^0000//; $stop1x=sprintf("%08lx", ($start1 / $meg) + $simmsize - 1) . "fffff"; $stop1x=~s/^0000//; } } $cnt=0; while ($cnt < $simmbanks * $simmsperbank) { if ($start1 >= $simmrange * $cnt && $start1 < $simmrange * ($cnt + 1)) { $bankcnt=$cnt; $cnt3=$bankcnt * $simmsperbank; if ($#socketstr) { $socket=$socketstr[$cnt3]; if ($#socketlabelstr) { $socketlabel=" ($socketlabelstr[$cnt3])" if (defined($socketlabelstr[$cnt3])); } if ($found10bit && $newslots[$val] !~ /00000[0-3]00/) { $socket=$socketstr[$cnt3 + 4]; if ($#socketlabelstr) { $socketlabel=" ($socketlabelstr[$cnt3 + 4])" if (defined($socketlabelstr[$cnt3 + 4])); } } } $order=$orderstr[$cnt3] if ($#orderstr); $group=$groupstr[$cnt3] if ($#groupstr); $slotnum=$slotstr[$cnt3] if ($#slotstr); if ($#bankstr) { $bank=$bankstr[$cnt3]; $bank=$bankstr[$cnt3 + 4] if ($found10bit && $newslots[$val] !~ /00000[0-3]00/); } $banks=$banksstr[$cnt3/$simmsperbank] if ($#banksstr); $byte=$bytestr[$cnt3] if ($#bytestr); } $cnt++; } # # Check for stacked DIMMs. A 128MB DIMM is sometimes seen as 2 # 64MB DIMMs with a hole in the address range. This may report # more slots than are really in a system. (i.e. a SS20 with # 8 32MB SIMMs reports 16 slots of 16MB each). # Special handling for $sortslots == 0 systems (Ultra 5/10, # Netra t1, Ultra CP 1400/1500, Ultra AXi/AXe/AXmp/AXmp+) # $stacked=0; if ($val < $#newslots - 2) { if ($sortslots == 0) { $start2=$start1 + ($simmrange * 2); $start2=$start1 + ($simmrange * 4) if ($banner =~ /Ultra CP 1400\b/ || $ultra eq "CP1400"); $start2x=sprintf("%08lx", $start2 / $meg); $stacked=2 if ($stacked == 0 && $newslots[$val + 2] eq $start2x && $newslots[$val + 3] eq $simmsz); if ($memtype eq "memory card") { # Some 256MB mezzanine boards are seen # as 4 64MB memory blocks with holes in # the address range. $start3=$start1 + ($simmsize * 2 * $meg) if ($simmsize eq 64); # Some 512MB mezzanine boards are seen # as 4 128MB memory blocks. $start3=$start1 + ($simmsize * $meg) if ($simmsize eq 128 && $banner !~ /Ultra CP 1400\b/ && $ultra ne "CP1400"); if ($banner =~ /\bCP2000\b/ || $ultra =~ /^CP2[01]\d0$/) { # 1GB mezzanine boards are seen # as 4 256MB memory blocks. $start3=$start1 + ($simmsize * $meg); $stacked=4; } $start3x=sprintf("%08lx", $start3 / $meg); if ($val < $#newslots - 6 && $stacked != 0) { $stacked=4 if ($newslots[$val + 4] eq $start3x && $newslots[$val + 5] eq $simmsz && $simmrange != $start3); } } if ($ultra eq "AXi") { # Check for 10-bit column address DIMMs if ($newslots[$val] =~ /00000[0-3]80/) { $found10bit=1; } elsif ($stacked == 0) { $found11bit=1; } if ($found10bit && $newslots[$val] !~ /00000[0-3]00/) { $socket=$socketstr[$cnt3 + 4]; if ($#socketlabelstr) { $socketlabel=" ($socketlabelstr[$cnt3 + 4])" if (defined($socketlabelstr[$cnt3 + 4])); } $bank=$bankstr[$cnt3 + 4]; } } } else { $start2=$start1 + ($simmrange / 2); $start2x=sprintf("%08lx", $start2 / $meg); $stacked=2 if ($newslots[$val + 2] eq $start2x && $newslots[$val + 3] eq $simmsz && ($simmsize ne 64)); } # # Check for 32MB SIMMs in bank 1 on Classic or LX. # They look like 16MB SIMMs at 0x0000000 and 0x06000000 # Also check for 8MB SIMMs in bank 1 on Classic or LX. # They look like 4MB SIMMs at 0x0000000 and 0x06000000 # if ($model =~ /SPARCclassic|SPARCstation-LX/) { if ($start1 == 0 && ($simmsize == 32 || $simmsize == 8)) { if ($newslots[$#newslots - 1] eq "00000060") { $totmem += $simmsize; $start2=hex("0x$newslots[$#newslots - 1]") * $meg; $start2x=sprintf("%08lx", $start2); $stop2x=sprintf("%08lx", $start2 + ($simmsize * $meg) - 1); $stop1x .= ", 0x${start2x}-0x$stop2x"; $simmsize *= 2; pop(@newslots); pop(@newslots); } } } if ($stacked == 2) { $totmem += $simmsize; $start2=hex("0x$newslots[$val + 2]") * $meg; if ($simmrange < hex("0x00001000") * $meg) { $start2x=sprintf("%08lx", $start2); $stop2x=sprintf("%08lx", $start2 + ($simmsize * $meg) - 1); } else { # Systems with > 4GB of memory $start2x=sprintf("%08lx", ($start2 / $meg)) . "00000"; $start2x=~s/^0000//; $stop2x=sprintf("%08lx", ($start2 / $meg) + $simmsize - 1) . "fffff"; $stop2x=~s/^0000//; } $stop1x .= ", 0x${start2x}-0x$stop2x"; $simmsize *= 2; $val += 2; } if ($stacked == 4) { $totmem += $simmsize * 3; $start2=hex("0x$newslots[$val + 2]") * $meg; $start2x=sprintf("%08lx", $start2); $stop2x=sprintf("%08lx", $start2 + ($simmsize * $meg) - 1); $stop1x .= ", 0x${start2x}-0x$stop2x"; $start3=hex("0x$newslots[$val + 4]") * $meg; $start3x=sprintf("%08lx", $start3); $stop3x=sprintf("%08lx", $start3 + ($simmsize * $meg) - 1); $stop1x .= ", 0x${start3x}-0x$stop3x"; $start4=hex("0x$newslots[$val + 6]") * $meg; $start4x=sprintf("%08lx", $start4); $stop4x=sprintf("%08lx", $start4 + ($simmsize * $meg) - 1); $stop1x .= ", 0x${start4x}-0x$stop4x"; $simmsize *= 4; $val += 6; } } # # Check for Voyager memory cards. A 32MB memory card is seen # as 4 8MB memory blocks with holes in the address range. # if ($model eq "S240" && $start1 && $simmsize == 16 && $val < $#newslots - 4) { $start=hex("0x$newslots[$val + 4]") - hex("0x$newslots[$val]"); $perlhexbug=1 if ($start < 0); $startx=sprintf("%08lx", $start); if ($newslots[$val + 1] eq "008" && $newslots[$val + 3] eq "008" && $startx eq "00000040") { $totmem += $simmsize; $startx=$newslots[$val + 2]; $start=hex("0x$startx") * $meg; $startx=sprintf("%08lx", $start); $perlhexbug=1 if ($start < 0); $stopx=sprintf("%08lx", $start + ($simmsize * $meg) - 1); $stop1x .= ", 0x${startx}-0x$stopx"; $startx=$newslots[$val + 4]; $start=hex("0x$startx") * $meg; $startx=sprintf("%08lx", $start); $perlhexbug=1 if ($start < 0); $stopx=sprintf("%08lx", $start + ($simmsize * $meg) - 1); $stop1x .= ", 0x${startx}-0x$stopx"; $simmsize *= 2; $val += 4; } } $slot0=$simmsize if ($start1 == 0); $simmsizeperbank=$simmsize / $simmsperbank; $smallestsimm=$simmsizeperbank if ($simmsize < $smallestsimm); $largestsimm=$simmsizeperbank if ($simmsize > $largestsimm); $found8mb=1 if ($simmsizeperbank == 8); $found16mb=1 if ($simmsizeperbank == 16); $found32mb=1 if ($simmsizeperbank == 32); push(@simmsizesfound, "$simmsizeperbank"); $cnt2=0; while ($cnt2 < $simmsperbank) { $socket='?' if (! defined($socket)); $bank='' if (! defined($bank)); $byte='' if (! defined($byte)); $socket='?' if ($socket eq ""); $recognized=0 if ($socket eq "?"); $sockets_used .= " $socket"; if ($socket eq "motherboard") { $buffer .= "$socket has "; $buffer .= $simmsize/$simmsperbank . "MB"; } else { if ($model eq "SPARCsystem-600" || $model =~ /Sun.4.600/) { $exp="Expansion board 0" if ($newslots[$val] =~ /00000[4-7]00/); $exp="Expansion board 1" if ($newslots[$val] =~ /00000[89ab]00/); if ($newslots[$val] =~ /00000[4-9ab]00/) { $buffer .= "$exp "; $banks="$exp bank $bank"; } $banks_used .= " $banks" if ($banks && $banks_used !~ /$banks/); } # prtconf-only data displayed here $buffer=($sockettype) ? "$buffer$sockettype $socket$socketlabel has a " : "$buffer$socket$socketlabel is a "; $buffer .= $simmsize/$simmsperbank . "MB"; $buffer .= " (" . $simmsize/$simmsperbank/1024 . "GB)" if ($simmsize/$simmsperbank > 1023); $buffer .= " $memtype"; push(@simmsizesfound, $simmsize/$simmsperbank); } if ($verbose) { $buf=""; if ($order) { $buf .= "$order"; $buf .= " $memtype" if ($memtype !~ /memory card/); } $slotnum="" if (! defined($slotnum)); $buf .= "slot $slotnum" if ($slotnum ne ""); $buf .= ", " if ($order || $slotnum ne ""); $buf .= "group $group, " if ($group ne ""); if ($bank ne "") { if ($bank =~ /Quad/) { $buf .= "$bank, "; } elsif ($dualbank eq 1) { $buf .= "banks $bank, "; } else { $buf .= "bank $bank, "; } $foundbank1or3=1 if ($bank eq 1 || $bank eq 3); } $buf .= "byte $byte, " if ($byte ne ""); $buf .= "address 0x${start1x}-0x$stop1x" if ($start1x && $showrange eq 1); $buffer .= " ($buf)" if ($buf); } $buffer .= "\n"; $cnt2++; $cnt3=($bankcnt * $simmsperbank) + $cnt2; if ($#socketstr) { $socket=$socketstr[$cnt3]; if ($#socketlabelstr) { $socketlabel=" ($socketlabelstr[$cnt3])" if (defined($socketlabelstr[$cnt3])); } if ($found10bit && $newslots[$val] !~ /00000[0-3]00/) { $socket=$socketstr[$cnt3 + 4]; if ($#socketlabelstr) { $socketlabel=" ($socketlabelstr[$cnt3 + 4])" if (defined($socketlabelstr[$cnt3 + 4])); } } # &pdebug("socketstr[$cnt3], bankcnt=$bankcnt, cnt2=$cnt2"); } $order=$orderstr[$cnt3] if ($#orderstr); $group=$groupstr[$cnt3] if ($#groupstr); $slotnum=$slotstr[$cnt3] if ($#slotstr); if ($#bankstr) { $bank=$bankstr[$cnt3]; $bank=$bankstr[$cnt3 + 4] if ($found10bit && $newslots[$val] !~ /00000[0-3]00/); } $banks=$banksstr[$cnt3/$simmsperbank] if ($#banksstr); $byte=$bytestr[$cnt3] if ($#bytestr); } } elsif ($ultra eq 1 || $ultra eq 5 || $ultra eq 10 || $ultra eq 30) { $buffer .= "bank $slot has a pair of " . $simmsize/2 . "MB DIMMs\n"; push(@simmsizesfound, $simmsize/2); } elsif ($ultra eq 2 || $ultra eq 250 || $ultra eq 450 || $ultra eq 80 || $ultra eq "420R" || $ultra eq "Netra t140x" || $ultra eq "Netra ft1800") { $buffer .= "group $slot has four " . $simmsize/4 . "MB DIMMs\n"; push(@simmsizesfound, $simmsize/4); } elsif ($ultra eq 60 || $ultra eq "220R") { $buffer .= "group $slot has four " . $simmsize/2 . "MB DIMMs\n"; push(@simmsizesfound, $simmsize/2); } elsif ($ultra eq "e") { $buffer .= "group $slot has eight " . $simmsize/8 . "MB DIMMs\n"; push(@simmsizesfound, $simmsize/8); } elsif ($socket eq "motherboard") { $buffer .= "$slot has ${simmsize}MB\n"; push(@simmsizesfound, $simmsize); } else { $buffer .= "slot $slot has a ${simmsize}MB"; $buffer .= " (" . $simmsize/1024 . "GB)" if ($simmsize > 1023); $buffer .= " $memtype\n"; push(@simmsizesfound, $simmsize); } $slot++; } # # Try to distinguish Ultra 5 from Ultra 10 # Cannot distinguish Ultra 5/333MHz from Ultra 10/333MHz (375-0066 motherboard) # Cannot distinguish Ultra 5/440MHz from Ultra 10/440MHz (375-0079 motherboard) # if ($model eq "Ultra-5_10" || $ultra eq "5_10" || $ultra eq 5 || $ultra eq 10) { if ($motherboard =~ /375-0009/) { $ultra=($sysfreq > 91) ? 10 : 5; $realmodel=($ultra eq 5) ? "(Ultra 5)" : "(Ultra 10)"; } # Determine if interleaving of banks using four identical sized DIMMs # Assume 1-way interleaving with mix of stacked and unstacked DIMMs $interleave=1; if ($#newslots == 3 && $stacked == 0) { $interleave=2 if ($newslots[1] eq $newslots[3]); } if ($#newslots == 7 && $stacked == 2) { $interleave=2 if ($newslots[1] eq $newslots[5]); } } &finish; &pdebug("exit"); exit; sub hpux_check { &pdebug("in hpux_check"); $HPUX=1; $model=$machine; if ($filename) { $model=""; $machine=""; $platform=""; $os="HP-UX"; } else { $osmajor=$osrel; $osmajor=~s/[^.]*.[0B]*//; $osmajor=~s/\..*//; &hpux_osrelease; $model=&mychomp(`/usr/bin/model`) if (-x '/usr/bin/model'); $cpuversion=""; if (-x '/usr/bin/getconf') { $kernbit=&mychomp(`/usr/bin/getconf KERNEL_BITS`); $cpuversion=&mychomp(`/usr/bin/getconf CPU_VERSION`); } $kernbit=32 if ($osmajor <= 10); if (-x '/usr/contrib/bin/machinfo') { @machinfo=&run("/usr/contrib/bin/machinfo"); &hpux_machinfo; } elsif (-x '/usr/sbin/ioscan') { $ncpu=&mychomp(`/usr/sbin/ioscan -kfnC processor | grep '^processor' | wc -l`); $cpucntfrom="ioscan"; } else { # Get CPU count from kernel if ($machine eq "ia64") { $ncpu=&hpux_kernelval("active_processor_count"); } else { $ncpu=&hpux_kernelval("processor_count"); } $cpucntfrom="kernel"; } $ncpu=1 if (! defined($ncpu)); # It has at least 1 CPU $cpubanner .= "$ncpu X " if ($ncpu > 1); if ($machine =~ /^9000\//) { $schedmodel=$model; $schedmodel=~s/^.*\/(.*$)/$1/; if (! $cputype && -r '/usr/sam/lib/mo/sched.models') { $cputype=&myawk('/usr/sam/lib/mo/sched.models',"^$schedmodel\\b",2); } if (! $cputype && -r '/opt/langtools/lib/sched.models') { $cputype=&myawk('/opt/langtools/lib/sched.models',"^$schedmodel\\b",2); } if (! $cputype && -r '/usr/lib/sched.models') { $cputype=&myawk('/usr/lib/sched.models',"^$schedmodel\\b",2); } if ($cputype) { $cpubanner .= "$cputype "; &pdebug(" cputype=$cputype"); } if ($cpuversion == 768) { $cpubanner .= "Itanium[TM] 1"; } elsif ($cpuversion == 524) { $cpubanner .= "Motorola MC68020"; } elsif ($cpuversion == 525) { $cpubanner .= "Motorola MC68030"; } elsif ($cpuversion == 526) { $cpubanner .= "Motorola MC68040"; } else { $cpubanner .= "PA-RISC"; if ($cpuversion == 532) { $cpubanner .= " 2.0"; } elsif ($cpuversion == 529) { $cpubanner .= " 1.2"; } elsif ($cpuversion == 528) { $cpubanner .= " 1.1"; } elsif ($cpuversion == 523) { $cpubanner .= " 1.0"; } elsif (&hpux_kernelval("cpu_arch_is_2_0")) { $cpubanner .= " 2.0"; } elsif (&hpux_kernelval("cpu_arch_is_1_1")) { $cpubanner .= " 1.1"; } elsif (&hpux_kernelval("cpu_arch_is_1_0")) { $cpubanner .= " 1.0"; } } } elsif ($cputype) { $cpubanner .= "$cputype"; } else { $cpubanner .= "$machine"; } if (! defined($cfreq)) { # Get CPU speed from kernel $cfreq=&hpux_kernelval("itick_per_usec"); if (! defined($cfreq)) { $cfreq=&hpux_kernelval("itick_per_tick"); $cfreq /= 10000 if (defined($cfreq)); } &pdebug(" cfreq=$cfreq found in kernel") if (defined($cfreq)); } $cpubanner .= ", ${cfreq}MHz" if (defined($cfreq)); } $model="HP $model" if ($model !~ /\bHP\b/i); $model=~s/ +$//; $is_hpvm=0; &hpux_machinfo if ($filename); } sub hpux_kernelval { return if (! -r '/dev/kmem'); $_=shift; $kernel="/hp_ux"; $kernel="/stand/vmunix" if (-f '/stand/vmunix'); $adb="/usr/bin/adb"; $adb .= " -o" if ($machine eq "ia64"); $kernelval=`echo "$_/D" | $adb $kernel /dev/kmem 2>/dev/null | tail -1`; @linearr=split(' ', $kernelval); return $linearr[1]; } sub hpux_machinfo { &pdebug("in hpux_machinfo"); $flag_cpu=0; $flag_platform=0; $flag_os=0; # parse machinfo output for CPU and other information foreach $line (@machinfo) { $line=&dos2unix($line); $line=&mychomp($line); if (! $line || $line =~ /^ +$/) { # End of sections $flag_cpu=0; $flag_platform=0; $flag_os=0; next; } if ($line =~ /^CPU info:/) { $flag_cpu=1; # Start of CPU section next; } if ($flag_cpu == 1) { # Parse CPU count, type and frequency for cpubanner if ($line =~ /^\s*\d*\s+.*[Pp]rocessor.* \(\d.*Hz,/) { $ncpu=$line; $ncpu=~s/^\s*(\d+)\s+.*/$1/; $ncpu=1 if ($ncpu eq $line); $cpucntfrom="machinfo 'CPU info'"; $cputype=$line; $cputype=~s/^\s*\d*\s+(.*)$/$1/; $cputype=~s/ processors.*$//; $cputype=~s/^(.*)\s+\(\d.*Hz.*/$1/; $cputype=~s/\s+/ /g; $cfreq=$line; $cfreq=~s/^.*[Pp]rocessor.* \((\d.* [GM]Hz),/$1/; if ($cfreq =~ /GHz/) { $cfreq=~s/ GHz.*$//; $cfreq *= 1000; } else { $cfreq=~s/ MHz.*$//; } &pdebug(" cputype=$cputype, cfreq=$cfreq"); next; } elsif ($line =~ /logical processors \(\d+ per socket/) { # Report multicore processors $tmp=$line; $tmp=~/(\d+) logical processors \((\d+) per socket/; $cputype=&multicore_cputype($cputype,$2) if (defined($2)); next; } elsif ($line =~ /Number of CPUs = /) { @linearr=split('=', $line); $ncpu=$linearr[1]; $ncpu=~s/^ *//; $cpucntfrom="machinfo 'Number of CPUs'"; next; } elsif ($line =~ /^\s*\d+ sockets\s*$/) { $tmp=$line; $tmp=~/(\d+) sockets/; $ncpu=$1; $cpucntfrom="machinfo 'sockets'"; next; } elsif ($line =~ /processor model: /) { @linearr=split(':', $line); $cputype=$linearr[1]; $cputype=~s/^ *\d+ +//; $cputype=~s/ processor$//; &pdebug(" cputype=$cputype"); next; } elsif ($line =~ /Clock speed = \d+ [GM]Hz/) { @linearr=split('=', $line); $cfreq=$linearr[1]; $cfreq=~s/^ *//; if ($cfreq =~ /GHz/) { $cfreq=~s/ GHz//; $cfreq *= 1000; } else { $cfreq=~s/ MHz//; } next; } elsif ($line =~ /LCPU attribute is /) { $hyperthreadcapable=1; if ($line =~ /enabled/i) { $hyperthread=1; $cputype=~s/ Intel/ Hyper-Threaded Intel/ if ($cputype !~ /Hyper.Thread/i); } next; } } if ($line =~ /^Memory:\s/) { $installed_memory=$line; $installed_memory=~s/^Memory:\s*(\d*\s*[GM]*[Bb]*).*/$1/; if ($installed_memory =~ /GB/) { $installed_memory=~s/\s*GB//g; $installed_memory *= 1024; } else { $installed_memory=~s/MB//ig; } $totmem=&roundup_memory($installed_memory); next; } if ($line =~ /^Platform info:/) { $flag_platform=1; # Start of Platform section next; } if ($flag_platform == 1 && $model eq "HP" && $line =~ /\bModel/i) { @linearr=split('[:=]', $line); $model=$linearr[1]; $model=~s/^ +//; $model=~s/"//g; $model=~s/ +$//; if ($model =~ /^ia64/) { $machine="ia64"; $platform="ia64"; $kernbit=64; } $model="HP $model" if ($model !~ /\bHP\b/i); next; } if ($line =~ /^OS info:/) { $flag_os=1; # Start of OS section next; } if ($flag_os == 1 && ! $osrel && $line =~ /\bRelease/i) { @linearr=split('[:=]', $line); $osrel=$linearr[1]; $osrel=~s/^ +//; $osrel=~s/^HP-UX //; &hpux_osrelease; next; } } $is_hpvm=1 if ($model =~ /Virtual Machine/); } sub hpux_osrelease { if ($osrel eq "B.11.11") { $osrelease="11i v1"; } elsif ($osrel eq "B.11.20") { $osrelease="11i v1.5"; } elsif ($osrel eq "B.11.22") { $osrelease="11i v1.6"; } elsif ($osrel eq "B.11.23") { $osrelease="11i v2"; } elsif ($osrel eq "B.11.31") { $osrelease="11i v3"; } } sub hpux_cprop { &pdebug("in hpux_cprop"); $config_cmd="/opt/propplus/bin/cprop -summary -c Memory"; $config_command="cprop"; # Use HP-UX SysMgmtPlus software to attempt to report memory if ($filename) { $cprop_out="<$filename"; } else { &show_header; $cprop_out="$config_cmd 2>&1 |"; } $cnt=0; open(FILE, $cprop_out); while() { next if (/^[\s\*\-]+$/); next if (/(| Unknown|: Other|: \.\.|: Not Specified|:\s*$)/i); ($permission_error)=(/(.*)/) if (/Permission denied|does not have privileges|is not authorized to run/i); if (/not supported on HPVM guest/i) { $is_hpvm=1; last; } $memarr++ if (/^\[Instance\]:\s+\d+/); if ($memarr >= 0) { ($Status[$memarr])=(/:\s+(.*)$/) if (/\[Status\]:\s+/); if (/\[Location\]:\s+/) { ($Location[$memarr])=(/Location\]:\s+(.*)$/); $Location[$memarr]=~s/^.*details\s+://; $Location[$memarr]=~s/\s+:\s+/:/g; $Location[$memarr]=~s/\.$//; } ($Size[$memarr])=(/:\s+(.*)$/) if (/\[Size\]:\s+/); ($ModType[$memarr])=(/:\s+(.*)$/) if (/\[Module Type\]:\s+/); ($MemType[$memarr])=(/:\s+(.*)$/) if (/\[Memory Type\]:\s+/); if (/\[Part Number\]:\s+/) { ($PN[$memarr])=(/:\s+(.*)$/); $PN[$memarr]=&hex2ascii($PN[$memarr]); } } } close(FILE); $installed_memory=0; for ($cnt=0; $cnt <= $memarr; $cnt++) { $buffer=""; if (defined($Size[$cnt])) { $buffer="$Location[$cnt]:" if (defined($Location[$cnt])); $buffer.=" $PN[$cnt]" if (defined($PN[$cnt])); $simmsize=$Size[$cnt]; if ($simmsize =~ /GB/) { $simmsize=~s/GB//g; $simmsize *= 1024; } else { $simmsize=~s/MB//ig; } $installed_memory += $simmsize; $buffer.=" $Size[$cnt]"; $buffer.=" $MemType[$cnt]" if (defined($MemType[$cnt])); $buffer.=" $ModType[$cnt]" if (defined($ModType[$cnt])); if (defined($Status[$cnt])) { if ($Status[$cnt] !~ /OK/i) { $buffer.=" - $Status[$cnt]"; $failing_memory=1; } } $buffer=~s/^\s+//; if ("$buffer" ne "") { push(@boards_mem, "$buffer\n"); $boardfound_mem=1; $memfrom="cprop"; } } elsif (defined($Location[$cnt])) { # Empty socket $sockets_empty .= ";" if ($sockets_empty); $sockets_empty .= " $Location[$cnt]"; } } $totmem=$installed_memory if (! $totmem); if ($installed_memory && $totmem && $installed_memory != $totmem) { print "ERROR: Total installed memory (${totmem}MB) does not "; print "match the total of the\n memory modules found "; print "(${installed_memory}MB).\n"; } &hpux_finish; } sub hpux_cstm { &pdebug("in hpux_cstm"); $config_cmd="echo 'selclass qualifier memory;info;wait;infolog'|/usr/sbin/cstm 2>&1"; if (! $filename && $verbose == 3) { # Include CPU information when E-mailing maintainer since this # data is used by memconf for regression testing. $config_cmd="echo 'selclass qualifier cpu;info;wait;selclass qualifier memory;info;wait;infolog'|/usr/sbin/cstm 2>&1"; } $config_command="cstm"; # Use HP-UX Support Tool Manager software to attempt to report memory if (! $filename) { &show_header; @config=&run("$config_cmd"); } $flag_memerr=0; foreach $line (@config) { $line=&dos2unix($line); next if ($line eq "\n" || $line =~ /^ +$/ || $line =~ /^ +=+$/); if ($line =~ /Internal Application error/i) { $cstm_error=$line; $cstm_error=~s/^ *//; next; } if ($line =~ /=\-\+\-=/) { $flag_mem=0; # End of section next; } if ($line =~ /\bPA [78]\d+.* CPU\b/) { $cputype=&mychomp($line); $cputype=~s/^.* (PA [78]\d+).*/$1/; $cputype=~s/ //g; &pdebug(" cputype=$cputype"); $ncpu++; } if ($line =~ /^'9000\// && $model eq "HP" && ! $machine) { @linearr=split(' ', $line); $machine=$linearr[0]; $machine=~s/\'//g; $platform=$machine; $model="HP $machine"; } if ($flag_mem == 1) { next if ($line =~ /Log creation time/); if ($line =~ /^-- Information Tool Log for /) { $flag_mem=0; # End of memory section next; } if ($line =~ /^Memory Error Log Summary/) { $flag_memerr=1; # Start of memory error log } if ($line =~ / errors logged | memory error log |Last error /) { $flag_memerr=0; # End of memory error log } if ($flag_memerr == 0 || $verbose) { push(@boards_mem, "$line"); } elsif ($verbose == 0 && $line =~ /^Memory Error Log Summary| errors logged | memory error log |Last error /) { # Only display the memory errors if verbose push(@boards_mem, "$line"); } $memory_error_logged=1 if ($line =~ / errors logged | Last error detected/); $boardfound_mem=1; $memfrom="cstm"; } if ($line =~ /^-- Information Tool Log for .*MEMORY / && $flag_mem == 0) { $flag_mem=1; # Start of memory section } } &hpux_finish; } sub hpux_finish { if ($machine =~ /^9000\/7/) { $modelmore="workstation"; } elsif ($machine =~ /^9000\/8/) { $modelmore="server"; } if ($filename) { if ($cputype) { $cpubanner="$ncpu X " if ($ncpu > 1); $cpubanner .= "$cputype"; } else { $cpubanner="$ncpu cpus" if ($ncpu > 1); } if (defined($cfreq)) { $cpubanner .= ", ${cfreq}MHz"; } &show_header; } if ($boardfound_mem) { &pdebug("displaying memory from $memfrom") if ($memfrom); print @boards_mem; &print_empty_memory("memory slots") if ($sockets_empty); &show_total_memory; } else { if ($filename) { &show_total_memory; } else { if (! $totmem) { # Get total memory from kernel if ($osmajor > 10) { $totmem=&hpux_kernelval("memory_installed_in_machine"); } else { $totmem=&hpux_kernelval("physmem"); } if (defined($totmem)) { $totmem /= 256; # Convert pages to MB } else { $totmem=0; } if (-r '/var/adm/syslog/syslog.log' && $totmem == 0) { open(FILE, "; close(FILE); @physical=grep(/Physical:/,@syslog); foreach $line (@physical) { @linearr=split(' ', $line); $totmem=$linearr[6] / 1024; last; } } } &show_total_memory; # Check if on a virtual machine (HPVM guest) if (-x '/opt/hpvm/bin/hpvminfo') { &pdebug("Checking hpvminfo"); $tmp=`/opt/hpvm/bin/hpvminfo 2>&1`; if ($tmp =~ /HPVM guest/i) { $is_hpvm=1; } elsif ($tmp =~ /Permission denied|does not have privileges|is not authorized to run/i) { print "ERROR: $tmp"; print " This user does not have permission to run '/opt/hpvm/bin/hpvminfo'.\n"; print " Run memconf as a privileged user like root on the HPVM host.\n"; } } } if ($is_hpvm) { print "NOTICE: Details shown are for the configuration of this HPVM guest, not the\n physical CPUs and memory of the HPVM host it is running on.\n"; } elsif ($config_command eq "cstm") { print "ERROR: /usr/sbin/cstm $cstm_error" if (defined($cstm_error)); print "ERROR: /usr/sbin/cstm did not report the memory installed in this HP-UX system.\n"; print " Cannot display detailed memory configuration. A newer version of\n"; print " Diagnostic and Support Tools for HP-UX may fix this issue. Aborting.\n"; } $exitstatus=1; } # # Post notice if X86 machine is Hyper-Thread capable, but not enabled # &show_hyperthreadcapable; if ($permission_error) { print "ERROR: $permission_error\n"; print " This user does not have permission to run $config_command.\n"; print " Try running memconf as a privileged user like root.\n" if ($uid ne "0"); $exitstatus=1; } # Flag untested CPU types (machine="" on regression test files) if (! $machine || $machine =~ /^9000\// || $machine eq "ia64") { # Tested HP-UX on PA-RISC and Itanium $untested=0; } else { $untested=1; $untested_type="CPU" if (! $untested_type); } &show_untested if ($untested); &show_errors; if ($memory_error_logged && $verbose == 0) { print "WARNING: Memory errors have been logged.\n"; print " Run 'memconf -v' to display the memory error log.\n"; } &mailmaintainer if ($verbose == 3); &pdebug("exit $exitstatus"); exit $exitstatus; } sub myawk { $awkfile=shift; $awksearch=shift; $awkfield=shift; open(FILE, "<$awkfile"); @tmp=; close(FILE); foreach $line (@tmp) { if ($line =~ /$awksearch/) { @linearr=split(' ', $line); return $linearr[$awkfield]; } } return ""; } sub x86_devname { return if ($have_x86_devname || $machine =~ /sun4|sparc/ || ! defined($model)); # x86 Sun development names and family part number $m=(defined($manufacturer)) ? "$manufacturer $model" : $model; $m=~s/-/ /g; &pdebug("in x86_devname, model=$m"); $untested=1 if ($m =~ /(Blade|Server) X\d/i); $untested=2 if ($m =~ /Sun |Netra /i); if ($m =~ /Sun .*W1100z.*2100z\b/i || $m =~ /Sun .*W[12]100z\b/i) { &cpubanner; # Check for Opteron 200 Series in case one CPU is disabled if ($cpubanner =~ /Opteron.* 2\d\d\b/i || $ncpu == 2) { # W2100z uses Opteron 200 Series 2-way processors. $devname="Metropolis 2P"; $familypn="A59"; $diagbanner="W2100z"; @socketstr=("DIMM2 Bank 0","DIMM1 Bank 0","DIMM4 Bank 1","DIMM3 Bank 1","DIMM6 Bank 2","DIMM5 Bank 2","DIMM8 Bank 3","DIMM7 Bank 3"); @reorder_decodedimms=(4,3,2,1,8,7,6,5); } elsif ($cpubanner) { # W1100z uses Opteron 100 Series 1-way processor. # W1100z is not upgradable to dual processors, so # don't show empty CPU2 or DIMM5-DIMM8 slots. $devname="Metropolis 1P"; $familypn="A58"; $diagbanner="W1100z"; @socketstr=("DIMM2 Bank 0","DIMM1 Bank 0","DIMM4 Bank 1","DIMM3 Bank 1"); @reorder_decodedimms=(4,3,2,1); } $model="Java Workstation $diagbanner"; $diagbanner=$model; $untested=0; } if ($m =~ /Sun .*V20z.*40z\b/i) { $devname="Stinger"; $familypn="A55 (V20z), A57 (V40z)"; } elsif ($m =~ /Sun .*V20z\b/i) { $devname="Stinger 2P"; $familypn="A55"; $untested=0; } elsif ($m =~ /Sun .*V40z\b/i) { $devname="Stinger 4P"; $familypn="A57"; $untested=0; } if ($m =~ /\bX2100 M2\b/i) { $devname="Leo"; $familypn="A84"; $untested=0; } elsif ($m =~ /Sun .*X2100\b/i) { $devname="Aquarius"; $familypn="A75"; $untested=0; } if ($m =~ /Sun .*X2200 (speedbump|M2\b.*Quad.*Core)/i) { # AMD Quad-Core Barcelona processor $devname="Taurus2"; $familypn="A85"; $untested=0; } elsif ($m =~ /Sun .*X2200 M2\b/i) { $devname="Taurus"; $familypn="A85"; $untested=0; } if ($m =~ /Sun .*X2250\b/i) { $devname="Venus"; $familypn="X2250"; $untested=0; } if ($m =~ /Sun .*X2270 M2\b/i) { # X2270 has 1 or 2 CPUs $familypn="X2270M2"; $untested=0 if ($os eq "SunOS"); } elsif ($m =~ /Sun .*X2270\b/i) { # X2270 has 1 or 2 Quad-Core hyper-threaded CPUs $familypn="X227"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4100 M2\b/i) { $devname="Galaxy 1F"; $familypn="A86"; $untested=0; } elsif ($m =~ /Sun .*X4100\b/i) { $devname="Galaxy 1U"; $familypn="A64"; $untested=0; } if ($m =~ /Sun .*X4100E\b/i) { $devname="Galaxy 1E"; # Cancelled $familypn="A72"; } if ($m =~ /Sun .*X4140\b/i) { $devname="Dorado 1U"; $familypn="B12"; $untested=0; } if ($m =~ /Sun .*X4150\b/i) { $devname="Doradi 1U"; $familypn="B13"; $untested=0; } if ($m =~ /Sun .*X4170\b/i) { # X4170 has 1 or 2 Quad-Core hyper-threaded CPUs $devname="Lynx 1U"; $familypn="X4170"; $untested=0; } if ($m =~ /Sun .*X4200 M2\b/i) { $devname="Galaxy 2F"; $familypn="A87"; $untested=0; } elsif ($m =~ /Sun .*X4200\b/i) { $devname="Galaxy 2U"; $familypn="A65"; $untested=0; } if ($m =~ /Netra .*X4200\b/i) { $devname="Draco"; $familypn="N87"; } if ($m =~ /Sun .*X4200E\b/i) { $devname="Galaxy 2E"; # Cancelled $familypn="A73"; } if ($m =~ /Sun .*X4240\b/i) { $devname="Dorado 2U"; $familypn="B14"; $untested=0; } if ($m =~ /Netra .*X4250\b/i) { $devname="Aries"; $familypn="NX425"; } if ($m =~ /Sun .*X4250\b/i) { $devname="Doradi 2U"; $familypn="X4250"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4270 M2\b/i) { # X4270 has 1 or 2 Quad-Core hyper-threaded CPUs $devname="Lynx 2U"; $familypn="X4270M2"; $untested=0; } elsif ($m =~ /Sun .*X4270\b/i) { $devname="Lynx 2U"; $familypn="X4270"; $untested=0; } if ($m =~ /Sun .*X4275\b/i) { # X4275 has 1 or 2 Quad-Core hyper-threaded CPUs $devname="Lynx 2U"; $familypn="X4275"; } if ($m =~ /Netra .*X4270\b/i) { $familypn="NX4270"; } if ($m =~ /Sun .*X4440\b/i) { $devname="Tucana"; $familypn="B16"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4450\b/i) { $devname="Tucani"; $familypn="B15"; $untested=0; } if ($m =~ /Netra .*X4450\b/i) { $devname="Argo"; } if ($m =~ /Sun .*X4470 M2\b/i) { # X4470 has 4 CPU sockets $familypn="X4470M2"; $untested=0 if ($os eq "SunOS"); } elsif ($m =~ /Sun .*X4470\b/i) { $familypn="X4470"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4500\b/i) { $devname="Thumper"; $familypn="A76"; $untested=0; } if ($m =~ /Sun .*X4540\b/i) { $devname="Thor"; $familypn="B24"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4600\b/i) { $devname="Galaxy 4U"; $familypn="A67"; # Same for X4600 M2 $devname="Galaxy 4F" if ($m =~ /Sun .*X4600 M2\b/); $untested=0; } if ($m =~ /Sun .*X4640\b/i) { # Replacement for Sun Fire X4600 M2 $familypn="X4640"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4800 M2\b/i) { # X4800 has 8 CPU sockets $familypn="X4800M2"; } elsif ($m =~ /Sun .*X4800\b/i) { # X4800 has 8 CPU sockets $familypn="X4800"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X4950\b/i) { $devname="Streamstar StreamSwitch 2"; $familypn="A91"; } # The Sun Blade 8000 Modular System uses the Sun Blade # X8420/X8440/X8450 Server Modules if ($m =~ /Sun .*Blade 8000\b/i) { $devname="Andromeda 19"; $familypn="A81"; if ($m =~ /Sun .*Blade 8000 P\b/i) { $devname="Andromeda 14"; $familypn="A82"; } $untested=2; } if ($m =~ /Sun .*Fire V60x\b|Sun .*Fire\(tm\) V60\b/i) { $devname="Grizzly"; $familypn="A48"; } if ($m =~ /Sun .*Fire V65x\b|Sun .*Fire\(tm\) V65\b/i) { $devname="Grizzly 2U"; $familypn="A48"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*Ultra *20 M2\b/i) { $devname="Munich"; $familypn="A88"; $untested=2; $untested=0 if ($os eq "SunOS"); } elsif ($m =~ /Sun .*Ultra *20\b/i) { $devname="Marrakesh"; $familypn="A63"; $untested=2; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*Ultra *24\b/i) { $devname="Ursa"; $familypn="B21"; $untested=0; } if ($m =~ /Sun .*Ultra *27\b/i) { $familypn="B27"; $untested=0; } if ($m =~ /Sun .*Ultra *40 M2\b/i) { $devname="Stuttgart"; $familypn="A83"; $untested=0; } elsif ($m =~ /Sun .*Ultra *40\b/i) { $devname="Sirius"; $familypn="A71"; $untested=0; } # The Sun Blade 6000 and 6048 Modular Systems use the Sun Blade # X6220, X6250 or T6300 Server Modules. if ($m =~ /Sun .*Blade 6000\b/i) { $devname="Constellation 10"; $familypn="A90"; $untested=2; } if ($m =~ /Sun .*Blade 6048\b/i) { $devname="Constellation 48"; $familypn="B22"; $untested=2; } if ($m =~ /Sun .*X6220\b/i) { $devname="Gemini"; $familypn="A92"; } if ($m =~ /Sun .*X6240\b/i) { $devname="Gemini+"; $familypn="X6240"; $untested=0 if ($os eq "SunOS"); } if ($m =~ /Sun .*X6250\b/i) { $devname="Wolf"; $familypn="A93"; $untested=0; } if ($m =~ /Sun .*X6270 M2\b/i) { # X6270 has 1 or 2 CPUs $familypn="X6270M2"; $untested=0; } elsif ($m =~ /Sun .*X6270\b/i) { # X6270 has 1 or 2 Quad-Core hyper-threaded CPUs $familypn="X6270"; $untested=0; } if ($m =~ /Sun .*X6275 M2\b/i) { # X6275 M2 has 2 Quad-Core or Six-Core hyper-threaded CPUs $familypn="X6275M2"; } elsif ($m =~ /Sun .*X6275\b/i) { # X6275 has 2 or 4 Quad-Core hyper-threaded CPUs $familypn="X6275"; } if ($m =~ /Sun .*X6420\b/i) { $devname="Pegasus"; } if ($m =~ /Sun .*X6440\b/i) { $devname="Pegasus+"; $familypn="X6440"; } if ($m =~ /Sun .*X6450\b/i) { $devname="Hercules2"; $familypn="X6450"; } if ($m =~ /Sun .*X8400\b/i) { $devname="Andromeda"; $familypn="X8400"; } if ($m =~ /Sun .*X8420\b/i) { $devname="Capella"; } if ($m =~ /Sun .*X8440\b/i) { $devname="Mira"; $familypn="A98"; } if ($m =~ /Sun .*X8450\b/i) { # Quad-Core CPU for Sun Blade 8000 chassis $devname="Scorpio"; $familypn="X8450"; } if ($m =~ /Sun .*X8600\b/i) { $devname="Antares"; } $untested=1 if ($m =~ /Netra Server X3.2\b/i); # X3-2 $untested=0 if ($m =~ /Sun Server X4.2\b/i && $os eq "SunOS"); # X4-2 $untested=0 if ($m =~ /Sun Server X4.2L\b/i && $os eq "SunOS"); # X4-2L $untested=1 if ($m =~ /Sun Server X4.4\b/i); # X4-4 $untested=1 if ($m =~ /Sun Server X4.8\b/i); # X4-8 $untested=1 if ($m =~ /Netra Blade X3.2B\b/i); # X3-2B $untested=1 if ($m =~ /Sun Blade X4.2B\b/i); # X4-2B $untested=0 if ($m =~ /Oracle Server X5.2\b/i && $os eq "SunOS"); # X5-2 $untested=0 if ($m =~ /Oracle Server X5.2L\b/i && $os eq "SunOS"); # X5-2L $untested=0 if ($m =~ /Oracle Server X6.2L\b/i && $os eq "SunOS"); # X6-2L $have_x86_devname=1 if ($devname); } sub releasefile { # Check file for release information $arg=shift; &pdebug("in releasefile, checking $arg"); open(FILE, $arg); while() { $tmp=&mychomp($_); next if ($tmp =~ /^[\s\*\-\_\\\/\|]*$/); # Ignore line if it starts with Escape sequence next if ($tmp =~ /^\e\[/); $tmp=~s/\s*\\[nr].*//; $tmp=~s/^Welcome to //; $tmp=~s/\s+-\s+.*//; &pdebug("in releasefile $arg, found $tmp"); return($tmp); } close(FILE); return(""); } sub linux_distro { $release=""; $osname="$os $osrel"; $osname="$os" if ($osrel eq ""); $kernbit=""; $kernbit="32-bit kernel" if ($machine =~ /i.86|sparc/); $kernbit="64-bit kernel" if ($machine =~ /x86_64|sparc64|ia64|amd64/); if (-f '/etc/freebsd-update.conf') { # FreeBSD @linearr=split(' ', $kernver); $release="$linearr[0] $linearr[1], $kernbit"; return; } $kernbit .= ", " if ($kernbit); foreach $relfile ('/etc/pclinuxos-release', '/etc/centos-release', '/etc/distro-release', '/etc/enterprise-release', '/etc/fedora-release', '/etc/frugalware-release', '/etc/kate-version', '/etc/myah-version', '/etc/pardus-release', '/etc/parsix-version', '/etc/sabayon-release', '/etc/vector-version', '/etc/whitebox-release', '/etc/yellowdog-release', '/etc/yoper-release', '/etc/UnitedLinux-release', '/etc/gentoo-release', '/etc/mandriva-release', '/etc/mandrakelinux-release','/etc/mandrake-release', '/etc/slackware-version','/etc/slackware-release', '/etc/redhat-release','/etc/redhat_version', '/etc/SuSE-release') { if (-f "$relfile") { $release=&releasefile($relfile); $release .= ", $kernbit$osname"; return; } } if (-d '/KNOPPIX') { if (-r '/cdrom/index.html') { open(FILE, ") { if (//) { $release=&mychomp($_); $release=~s/<TITLE>//; $release=~s/<\/TITLE.*//; } } close(FILE); } elsif (-r '/init') { open(FILE, "</init"); while(<FILE>) { if (/DISTRO=/) { $release=&mychomp($_); $release=~s/.*DISTRO="*(.*)$/$1/; $release=~s/"//g; } } close(FILE); } $release="Knoppix" if (! $release); $release .= ", $kernbit$osname"; $release .= ", " . &releasefile("/etc/issue") if (-f '/etc/issue'); return; } elsif (-f '/gos/gOS/gos.html') { $release="gOS, $kernbit$osname"; $release .= ", " . &releasefile("/etc/issue") if (-f '/etc/issue'); return; } elsif (-f '/etc/motd.static') { $release=&releasefile("/etc/motd.static"); $release .= ", $kernbit$osname"; if (-f '/etc/issue') { $tmp=&releasefile("/etc/issue"); if ($release =~ /Knoppix/i) { $release="Knoppix, $kernbit$osname, $tmp"; } else { $release .= ", $tmp"; } } return; } elsif (-d '/ffp/etc') { $release="fun_plug"; if (-f '/ffp/etc/ffp-version') { $tmp=&mychomp(`grep FFP_VERSION= /ffp/etc/ffp-version`); $tmp=~s/^.*=//; $release .= " $tmp" if ($tmp); } if (-f '/etc/Alt-F') { $tmp=&releasefile('/etc/Alt-F'); $release="Alt-F $tmp with $release"; } } elsif (-f '/etc/Alt-F') { $tmp=&releasefile('/etc/Alt-F'); $release="Alt-F $tmp"; } # Debian, Ubuntu, BusyBox, etc. foreach $relfile ('/etc/issue.net','/etc/issue','/etc/motd') { $release=&releasefile("$relfile") if (! $release && -f "$relfile"); } $release=(defined($release)) ? "$release, $kernbit$osname" : ""; $release=~s/^, //; } sub check_mixedspeeds { $_=shift; return if ($_ !~ /(\dMHz|\dns)/); s/^.* (\d*)MHz.*$/$1/; s/^(\d*)MHz.*$/$1/; s/^.* (\d*)ns.*$/$1/; s/^(\d*)ns.*$/$1/; return if (! $_); &pdebug("in check_mixedspeeds, value=$_"); # round some memory speeds $_=266 if ($_ >= 265 && $_ <= 285); # DDR-266 PC-2100 $_=667 if ($_ >= 665 && $_ <= 668); # DDR2-667 PC2-5300 $_=1066 if ($_ >= 1065 && $_ <= 1068); # DDR2-1066 PC2-8500, DDR3-1066 PC3-8500 $_=1866 if ($_ >= 1865 && $_ <= 1868); # DDR3-1866 PC3-14900 if ($foundspeed) { $mixedspeeds=1 if ($foundspeed ne $_); } else { $foundspeed=$_; } } sub roundup_memory { $newval=shift; # &pdebug("in roundup_memory $newval"); # Round up memory (may have 128MB or more reserved) # Works for up to 16777216GB (16TB) for ($val=16; $val <= 64; $val += 16) { $newval=$val if ($newval >= $val-8 && $newval < $val); } for ($val=64; $val <= 1024; $val += 32) { $newval=$val if ($newval >= $val-16 && $newval < $val); } for ($val=1024; $val <= 4096; $val += 512) { $newval=$val if ($newval >= $val-128 && $newval < $val); } for ($val=4096; $val <= 14336; $val += 1024) { $newval=$val if ($newval >= $val-512 && $newval < $val); } for ($val=14336; $val <= 32768; $val += 2048) { $newval=$val if ($newval >= $val-1024 && $newval < $val); } for ($val=32768; $val <= 262144; $val += 4096) { $newval=$val if ($newval >= $val-2048 && $newval < $val); } for ($val=262144; $val <= 1048576; $val += 8192) { $newval=$val if ($newval >= $val-4096 && $newval < $val); } for ($val=1048576; $val <= 4194304; $val += 16384) { $newval=$val if ($newval >= $val-8192 && $newval < $val); } for ($val=4194304; $val <= 16777216; $val += 32768) { $newval=$val if ($newval >= $val-16384 && $newval < $val); } for ($val=16777216; $val <= 67108864; $val += 65536) { $newval=$val if ($newval >= $val-32768 && $newval < $val); } for ($val=67108864; $val <= 268435456; $val += 131072) { $newval=$val if ($newval >= $val-65536 && $newval < $val); } return($newval); } sub check_dmidecode_ver { $tmp=shift; @dmidecode_verarr=split(/\./, $dmidecode_ver); if (defined($tmp)) { @latest_dmidecode_verarr=split(/\./, $latest_dmidecode_ver); if (($dmidecode_verarr[0] < $latest_dmidecode_verarr[0]) || ($dmidecode_verarr[0] == $latest_dmidecode_verarr[0] && $dmidecode_verarr[1] < $latest_dmidecode_verarr[1])) { print " Your dmidecode package is an old version"; print " ($dmidecode_ver)" if ($dmidecode_ver); print ", so consider upgrading\n"; print " to dmidecode-$latest_dmidecode_ver or later.\n"; } elsif ($dmidecode_ver) { print " Your dmidecode version is $dmidecode_ver.\n" if (defined($tmp)); } } @minimum_dmidecode_verarr=split(/\./, $minimum_dmidecode_ver); if (($dmidecode_verarr[0] < $minimum_dmidecode_verarr[0]) || ($dmidecode_verarr[0] == $minimum_dmidecode_verarr[0] && $dmidecode_verarr[1] < $minimum_dmidecode_verarr[1])) { return 1; } else { return 0; } } sub check_free { return if ($free_checked); &pdebug("in check_free"); $free_checked=1; if (! $filename && $free_cmd) { # Check memory detected by OS @free=&run("$free_cmd"); $have_free_data=1; } if (! $filename && $meminfo_cmd) { # Check memory detected by kernel @meminfo=&run("$meminfo_cmd"); $have_meminfo_data=1; } if ($have_meminfo_data) { foreach $line (@meminfo) { $line=&dos2unix($line); if ($line =~ /MemTotal:\s+\d+ kB/) { @linearr=split(' ', $line); $freephys=int($linearr[1] / 1024); $totmem=&roundup_memory($freephys) if ($totmem == 0); last; } } } if ($have_free_data && ! $freephys) { foreach $line (@free) { $line=&dos2unix($line); if ($line =~ /Mem:/) { @linearr=split(' ', $line); $freephys=$linearr[1]; $totmem=&roundup_memory($freephys) if ($totmem == 0); last; } } } } sub check_for_decodedimms { return if (&is_virtualmachine); # Need root permissions to load eeprom kernel module return if ($uid ne "0" && ! $filename); &pdebug("in check_for_decodedimms"); if (! $filename && $decodedimms_cmd) { $flag=1; # Some systems lockup when loading eeprom module, avoid them # Avoid running on systems with PIIX4 like Dell PowerEdge 2650 @tmp=&run("/sbin/modprobe i2c_dev"); @tmp=&run("/usr/sbin/i2cdetect -l | grep -w PIIX4"); $flag=0 if (@tmp); # See if eeprom module is already loaded in kernel @tmp=&run("/sbin/lsmod | grep -w eeprom"); $flag=2 if (@tmp); if ($flag) { # Check memory SPD data from EEPROM @tmp=&run("$modprobe_eeprom_cmd") if ($flag == 1); @decodedimms=&run("$decodedimms_cmd"); $have_decodedimms_data=1; } } } sub check_topology { # Stoutland Platform (SGI Blade Chassis) topology command return if (&is_virtualmachine); &pdebug("in check_topology"); if ($filename) { @topology=@config; } else { @topology=&run("$topology_cmd"); } $flag_mem=0; $partition_cnt=0; foreach (@topology) { $_=&dos2unix($_); $_=&mychomp($_); if (/^System type: /) { push(@topology_header, "$_\n"); $topology_mfg="SGI.COM" if (/ UV/); } if (/^Serial number: /) { push(@topology_header, "$_\n"); $topology_mfg="SGI.COM" if (/ UV/); } if (/^Partition number: /) { push(@topology_header, "$_\n"); $partition_cnt++; } push(@topology_header, "$_\n") if (/^\s*\d+ Blades$/); push(@topology_header, "$_\n") if (/^\s*\d+ CPUs$/); push(@topology_header, "$_\n") if (/^\s*\d+.* GB Memory Total/i); push(@topology_header, "$_\n") if (/^\s*\d+.* GB Max Memory.*/i); $flag_mem=1 if (/(Idx|Index)\s.*\sNASID\s+CPUS\s+Memory/); $flag_mem=0 if (/^\s*$/); push(@topology_data, "$_\n") if ($flag_mem); } } sub check_decodedimms { return if ($decodedimms_checked); return if (&is_virtualmachine); &pdebug("in check_decodedimms"); $decodedimms_checked=1; # TLS - uncomment to not use decode-dimms.pl data - 19-Apr-2012 # $have_decodedimms_data=0; # TLS - If decode-dimms.pl is not available, suggest that it can be installed # with lmsensors to get more detailed memory information. if ($have_decodedimms_data) { $flag_mem=0; $flag_unknown=0; $mem_mfg=""; $pn=""; $simmsize=0; $memtype=""; $dimmspeed=""; $cnt=0; foreach $line (@decodedimms) { $line=&dos2unix($line); $line=&mychomp($line); if ($line =~ /^Guessing DIMM is in/i) { $tmp=$line; $tmp=~s/^.*\s+(\d+)\s*$/$1/; $cnt=($tmp - 1) if ($tmp); $flag_mem=1; } $flag_mem=0 if ($line =~ /^(Decoding EEPROM|EEPROM Checksum of bytes.*Bad|Number of SDRAM DIMMs detected and decoded)/i); if ($flag_mem) { if ($line =~ /^Fundamental Memory type/i) { # Required data from SPD EEPROM $memtype=$line; $memtype=~s/^Fundamental Memory type\s+(.*\S)\s*$/ $1/; &pdebug("in check_decodedimms, cnt=$cnt, memtype=$memtype"); $flag_unknown=($memtype =~ /^ *Unknown/i) ? 1 : 0; if ($flag_unknown) { &pdebug("in check_decodedimms, cnt=$cnt, Unknown memtype detected - failing DIMM"); } } if ($line =~ /^Maximum module speed/i) { $dimmspeed=$line; $dimmspeed=~s/^Maximum module speed\s+\D+\s+(.*\S)\s*$/ $1/; &check_mixedspeeds($dimmspeed); &pdebug("in check_decodedimms, cnt=$cnt, dimmspeed=$dimmspeed"); } $simmsize=$sizearr[$cnt] if (defined($sizearr[$cnt]) && ! $simmsize); if ($line =~ /^Size\s+.*MB/i) { $simmsize=$line; $simmsize=~s/^Size\s+(\d+)\s*MB.*$/$1/; &pdebug("in check_decodedimms, cnt=$cnt, simmsize=$simmsize"); } if ($line =~ /^Manufacturer\s+/i) { $mem_mfg=$line; $mem_mfg=~s/^Manufacturer\s+(.*\S)\s*$/ $1/; $mem_mfg=&get_mfg($mem_mfg); $mem_mfg="" if ($mem_mfg =~ /^\s+(FFFFFFFFFFFF|000000000000|Undefined)/i); $mem_mfg=" $mem_mfg" if ($mem_mfg); &pdebug("in check_decodedimms, cnt=$cnt, mem_mfg=$mem_mfg"); } if ($line =~ /^Part Number\s+/i) { $pn=$line; $pn=~s/^Part Number\s+(.*\S)\s*$/ $1/; $pn="" if ($pn =~ /^\s+(FFFFFFFFFFFF|000000000000|Undefined)/i); &pdebug("in check_decodedimms, cnt=$cnt, pn=$pn"); } } elsif ($simmsize && $memtype) { if ($reorder_decodedimms[$cnt]) { $tmp=$reorder_decodedimms[$cnt]-1; &pdebug("in check_decodedimms, reorder cnt=$tmp"); } else { $tmp=$cnt; } if (defined($socketlabelarr[$tmp])) { $socket=$socketlabelarr[$tmp]; $offset=-1; $incr=0; foreach (@boards_mem) { if (/\b$socket\b/) { if ($MemPartNum[$incr-1]) { # make sure pn matches $offset=$incr if (" $MemPartNum[$incr-1]" eq "$pn"); } else { $offset=$incr; } } $incr++; } if ($offset >= 0) { ($old)=grep(/$socket/,@boards_mem); chop($old); if ($flag_unknown) { $tmp="$old - FAILING"; $failing_memory=1; } else { $tmp="$socket: ${simmsize}MB$dimmspeed$memtype"; $tmp .= ",$mem_mfg$pn" if ($mem_mfg || $pn); } @tmp=("$tmp\n"); # Replace socket data from dmidecode # with socket data from decode-dimms.pl &pdebug("in check_decodedimms, replace socket data '$old' with '$tmp'"); splice(@boards_mem, $offset, 1, @tmp); $memfrom="decode-dimms.pl" if ($memfrom !~ /decode-dimms.pl/); } } else { $memfrom="dmidecode and decode-dimms.pl"; } $mem_mfg=""; $pn=""; $simmsize=0; $memtype=""; $dimmspeed=""; $cnt++; } } } } sub check_dmidecode { &pdebug("in check_dmidecode"); $DMI6=0; $DMI6cnt=0; $DMI6totmem=0; $DMI17=0; $DMI17totmem=0; $DMI17end=0; $DMItype=0; $platform=""; $FoundEnd=0; $BrokenTable=""; $unknown_JEDEC_ID=0; $ECCDIMM=0; $config_command="dmidecode"; if ($filename) { $DmiFile="<$filename"; } else { $DmiFile="$config_cmd 2>&1 |"; &linux_distro if (! $release); if ($ipmitool_cmd && ! $have_ipmitool_data) { @ipmitool=&run("$ipmitool_cmd fru"); $have_ipmitool_data=1; } } $cpu_membank=-1; $physmemarray=""; $memfrom="dmidecode"; &check_for_decodedimms; &check_topology; open(FILE, $DmiFile); while(<FILE>) { next if (/(<OUT OF SPEC>| Unknown|: Other|: \.\.|: Not Specified|:\s*$)/i); # for regression tests $have_decodedimms_data=1 if (/^Guessing DIMM is in/i); ($dmidecode_ver)=(/.* dmidecode (.*)/i) if (/ dmidecode /i); ($permission_error)=(/(.*)/) if (/Permission denied/i); ($dmidecode_error)=(/# *(.*)/) if (/No SMBIOS nor DMI entry point found/i && ! &is_xen_vm); # Detect end of DMI type 17 blocks # &pdebug("In DMI type 17, $_") if ($DMItype == 17); if (/(^Handle|^\s*$)/i && $DMItype == 17 && $memarr >= 0 && ! $DMI17end) { $DMI17end=1; $DMItype=0; # Ignore Flash chips for DMI17totmem $Size17[$memarr]=0 if (! defined($Size17[$memarr])); $Type17[$memarr]="" if (! defined($Type17[$memarr])); &pdebug("End of DMI type 17 block, $Size17[$memarr] $Type17[$memarr] detected") if ($Type17[$memarr] =~ /Flash/i); if ($Size17[$memarr] !~ /Not Installed/i && $Size17[$memarr] !~ /No Module Installed/i && $Type17[$memarr] !~ /Flash/i) { &pdebug("End of DMI type 17 block, adding $Size17[$memarr] memory to total"); $simmsize=$Size17[$memarr]; if ($simmsize =~ / *GB.*/i) { $simmsize=~s/ *GB.*//ig; $simmsize *= 1024; } else { $simmsize=~s/ *MB.*//ig; } $DMI17totmem += $simmsize if ($simmsize); } } ($DMItype)=(/DMI type (\d+)/i) if (/\bDMI type /i); if (/Handle .* DMI type 16,/i) { ($tmp)=(/Handle (.*), DMI type 16,/i); $cpu_membank++ if ($physmemarray ne $tmp); $physmemarray=$tmp; } $DMI17end=0 if ($DMItype != 17); # Type Information # ---------------------------------------- # 0 BIOS # 1 System # 2 Base Board # 3 Chassis # 4 Processor # 5 Memory Controller # 6 Memory Module # 7 Cache # 8 Port Connector # 9 System Slots # 10 On Board Devices # 11 OEM Strings # 12 System Configuration Options # 13 BIOS Language # 14 Group Associations # 15 System Event Log # 16 Physical Memory Array # 17 Memory Device # 18 32-bit Memory Error # 19 Memory Array Mapped Address # 20 Memory Device Mapped Address # 21 Built-in Pointing Device # 22 Portable Battery # 23 System Reset # 24 Hardware Security # 25 System Power Controls # 26 Voltage Probe # 27 Cooling Device # 28 Temperature Probe # 29 Electrical Current Probe # 30 Out-of-band Remote Access # 31 Boot Integrity Services # 32 System Boot # 33 64-bit Memory Error # 34 Management Device # 35 Management Device Component # 36 Management Device Threshold Data # 37 Memory Channel # 38 IPMI Device # 39 Power Supply # 40 Additional Information # 41 Onboard Device # Additionally, type 126 is used for disabled entries and type # 127 is an end-of-table marker. Types 128 to 255 are for # OEM-specific data. # Keep walking the dmidecode output for more about the system # Check system information if ($DMItype == 0) { ($biosvendor)=(/: +(.*\S) *$/) if (/^\s*Vendor: /i); } if ($DMItype == 1) { ($systemmanufacturer)=(/: +(.*\S) *$/) if (/^\s*(Manufacturer|Vendor): /i); ($systemmodel)=(/: +(.*\S) *$/) if (/^\s*Product( Name|): /i); } if ($DMItype == 2) { ($boardmanufacturer)=(/: +(.*\S) *$/) if (/^\s*(Manufacturer|Vendor): /i); ($boardmodel)=(/: +(.*\S) *$/) if (/^\s*Product( Name|): /i); $boardmodel=~s/^$boardmanufacturer // if ($boardmanufacturer && $boardmodel); # use DMItype2 manufacturer if Oracle (for VirtualBox) ($systemmanufacturer)=(/: +(.*\S) *$/) if (/^\s*(Manufacturer|Vendor): *Oracle */i); } # Check CPU information if ($DMItype == 4) { if (/^\s*Processor( Information|)$/i) { $cpuarr++; $ncpu++; } if (/^\s*Socket Designation: /i) { ($CPUSocketDesignation[$cpuarr])=(/: +(.*\S) *$/); $CPUSocketDesignation[$cpuarr]="CPU $cpuarr" if ($CPUSocketDesignation[$cpuarr] eq "Microprocessor"); } ($CPUFamily[$cpuarr])=(/: +(.*\S) *$/) if (/^\s*(Processor |)Family: /i); if (/^\s*(Processor |)Manufacturer: /i) { ($CPUManufacturer[$cpuarr])=(/: +(.*\S) *$/); $CPUManufacturer[$cpuarr]=~s/GenuineIntel/Intel/; } ($CPUVersion[$cpuarr])=(/: +(.*\S) *$/) if (/^\s*(Processor |)Version: /i); ($ExtSpeed[$cpuarr])=(/: +(.*\S) *$/) if (/^\s*External Clock: /i); ($CPUSpeed[$cpuarr])=(/: +(.*\S) *$/) if (/^\s*Current Speed: /i); if (/^\s*Status: /i) { ($CPUStatus[$cpuarr])=(/: +(.*\S) *$/); if ($CPUStatus[$cpuarr] =~ /(Unpopulated|Disabled By BIOS)/i) { $ncpu--; $necpu++; $CPUVersion[$cpuarr]=""; } } } # Check memory controller information if ($DMItype == 5) { ($ECCBIOS)=(/: +(.*\S) *$/) if (/^\s*Error Detecting Method: /i && ! $ECCBIOS); ($interleave)=(/: +(.*\S) *$/) if (/^\s*Current Interleave: /i && $interleave eq "0"); ($MAXMEM)=(/: +(.*\S) *$/) if (/^\s*Maximum Total Memory Size: /i && ! $MAXMEM); } # Check each memory device if ($DMItype == 6) { $DMI6=1; $memarr++ if (/^\s*Memory (Module Information|Bank)$/i); ($Locator6[$memarr])=(/: +(.*\S) *$/) if (/^\s*Socket( Designation|): /i); ($Speed6[$memarr])=(/: +(.*\S) *$/) if (/^\s*Current Speed: /i); ($Type6[$memarr])=(/: +(.*\S) *$/) if (/^\s*Type: /i); if (/^\s*Installed Size: /i) { ($Size6[$memarr])=(/: +(.*\S) *$/); if ($Size6[$memarr] !~ /Not Installed/i && $Size6[$memarr] !~ /No Module Installed/i) { $simmsize=$Size6[$memarr]; $simmsize=~s/ *MB.*//ig; $DMI6totmem += $simmsize if ($simmsize); $SizeDetail[$memarr]=$Size6[$memarr]; $Size6[$memarr]=$simmsize . "MB"; $SizeDetail[$memarr]=~s/\d+ *MBy*t*e* *//i; } } ($BankConnections6[$memarr])=(/: +(.*\S) *$/) if (/^\s*Bank Connections: /i); $DMI6cnt=$memarr + 1; } # SMBIOS 2.1 added DMI Types 16 & 17, obsoleting Types 5 & 6 # Check physical memory array if ($DMItype == 16) { ($ECCBIOS)=(/: +(.*\S) *$/) if (/^\s*Error Correction Type: /i && ! $ECCBIOS); ($MAXMEM)=(/: +(.*\S) *$/) if (/^\s*Maximum Capacity: /i && ! $MAXMEM); ($NUMMOD)=(/: +(.*\S) *$/) if (/^\s*Number Of Devices: /i && ! $NUMMOD); } # Check each memory device if ($DMItype == 17) { if ($DMI6) { # Prefer DMI type 17 information over DMI type 6 $memarr=-1 if (! $DMI17); } $DMI17=1; $memarr++ if (/^\s*Memory Device$/i); ($FormFactor[$memarr])=(/: +(.*\S) *$/) if (/^\s*Form Factor: /i); ($TotalWidth[$memarr])=(/: +(\d*) */) if (/^\s*Total Width: /i); ($DataWidth[$memarr])=(/: +(\d*) */) if (/^\s*Data Width: /i); if (/^\s*Locator: /i) { ($Locator17[$memarr])=(/: +(.*\S) *$/); $Locator17[$memarr]=~s/ */ /g; # Add CPU to X4170/X4270/X4275/X6270/X6275 if ($systemmodel =~ /Sun .*X(4[12]7[05]|627[05])\b/i && $Locator17[$memarr] !~ /CPU/) { $cpu_number=$CPUSocketDesignation[$cpu_membank]; $cpu_number=~s/\s*//g; $Locator17[$memarr]="${cpu_number}_$Locator17[$memarr]"; } } ($BankLocator[$memarr])=(/: +(.*\S) *$/) if (/^\s*Bank Locator: /i); ($Type17[$memarr])=(/: +(.*\S) *$/) if (/^\s*Type: /i); ($TypeDetail[$memarr])=(/: +(.*\S) *$/) if (/^\s*Type Detail: /i); ($Size17[$memarr])=(/: +(.*\S) *$/) if (/^\s*Size: /i); ($Speed17[$memarr])=(/: +(.*\S) *$/) if (/^\s*Speed: /i); ($MemManufacturer[$memarr])=&get_mfg(/: +(.*\S) *$/) if (/^\s*Manufacturer: /i && $Size17[$memarr] =~ /( MB|GB)/); if (/^\s*Part Number: /i && ! /PartNum/i && ! /NOT AVAILABLE/i) { ($MemPartNum[$memarr])=(/: +(.*\S) *$/); $MemPartNum[$memarr]=&hex2ascii($MemPartNum[$memarr]); # Hack: Ballistic modules may have mfg Undefined $MemManufacturer[$memarr]="Crucial Technology" if (! $MemManufacturer[$memarr] && $MemPartNum[$memarr] =~ /^BL/); } } $BrokenTable=&mychomp($_) if (/DMI table is broken/i); $FoundEnd=1 if (/End.Of.Table/i); } close(FILE); # Determine best manufacturer and model to display (or both) from # DMI type 1 (System) or DMI type 2 (Base Board) $baseboard="$boardmanufacturer $boardmodel" if ("$boardmanufacturer$boardmodel" ne ""); $baseboard="" if ($boardmanufacturer eq $systemmanufacturer && ($boardmodel eq $systemmodel || $boardmodel eq "")); if ($systemmanufacturer) { $manufacturer=$systemmanufacturer; } else { $manufacturer=$boardmanufacturer; $baseboard=""; } if ($systemmodel) { $model=$systemmodel; } else { $model=$boardmodel; } if ($manufacturer =~ /To Be Filled|System Manufacturer/i) { $manufacturer=$boardmanufacturer; $baseboard=""; } if ($model =~ /To Be Filled|System .*Name|XXXX/i) { $model=$boardmodel; $baseboard=""; } $baseboard="" if (&is_virtualmachine); # Check kernel to see how many processors it sees (for multi-core and # hyper-threaded CPUs) &check_cpuinfo; # Check Xen hardware for processors it sees (for multi-core and # hyper-threaded CPUs) &check_xm_info; # Check topology for manufacturer $manufacturer=$topology_mfg if ($topology_mfg); # Check Xenstore for manufacturer and model if not known if (&is_xen_vm && ! -f $filename && -x '/usr/bin/xenstore-ls' && -x '/usr/bin/xenstore-read') { $domid=&mychomp(`/usr/bin/xenstore-read domid 2>/dev/null`); if ($domid) { @xenstore=`/usr/bin/xenstore-ls /local/domain/$domid 2>/dev/null`; foreach (@xenstore) { if ($manufacturer eq "" && /\bsystem-manufacturer = */) { ($manufacturer)=(/= *"(.*)"$/); } if ($model eq "" && /\bsystem-product-name = */) { ($model)=(/= *"(.*)"$/); } } } } # hash CPUs $range=$ncpu; # Only display allocated CPUs on Virtual Machines $range=$cpuinfo_cpucnt if ($cpuinfo_cpucnt && &is_virtualmachine); for ($val=0; $val < $range; $val++) { $cputype=""; $cpufreq=""; if ($CPUVersion[$val]) { if ($CPUVersion[$val] eq "AMD" && $cpuinfo_cputype && ! &is_virtualmachine) { $cputype .= "$CPUManufacturer[$val] " if ($CPUManufacturer[$val] && $cpuinfo_cputype !~ /$CPUManufacturer[$val]/i); &pdebug("Adding AMD \$cpuinfo_cputype=$cpuinfo_cputype to cputype"); $cputype .= "$cpuinfo_cputype "; } else { $cputype .= "$CPUManufacturer[$val] " if ($CPUManufacturer[$val] && $CPUVersion[$val] !~ /$CPUManufacturer[$val]/i); $CPUVersion[$val]=&cleanup_cputype($CPUVersion[$val]); &pdebug("Adding \$CPUVersion[$val]=$CPUVersion[$val] to cputype"); $cputype .= "$CPUVersion[$val] "; } } elsif ($cpuinfo_cputype && ! &is_virtualmachine) { if ($CPUManufacturer[$val]) { $cputype .= "$CPUManufacturer[$val] " if ($cpuinfo_cputype !~ /$CPUManufacturer[$val]/i); } &pdebug("Adding \$cpuinfo_cputype=$cpuinfo_cputype to cputype"); $cputype .= "$cpuinfo_cputype "; } else { $cputype .= "$CPUManufacturer[$val] " if ($CPUManufacturer[$val]); $cputype .= "$CPUFamily[$val] " if ($CPUFamily[$val]); } if (! $machine && $CPUFamily[$val]) { $machine="ia64" if ($CPUFamily[$val] eq "Itanium"); } $cputype=~s/^\s+//; $cputype=~s/\s+$//; $cputype=~s/ +/ /g; if ($ncpu < $cpuinfo_cpucnt && $cpuinfo_cpucnt && $foundGenuineIntel) { # Distinguish Multi-Core from hyper-threading if ($cpuinfo_cpucores && $cpuinfo_physicalidcnt && $cpuinfo_cpucnt) { if ($cpuinfo_cpucnt / ($cpuinfo_cpucores * $cpuinfo_physicalidcnt) == 2) { $hyperthread=1; $ncpu=$cpuinfo_physicalidcnt; $range=$ncpu; # Adjust the range of this "for" loop &pdebug("hyperthread=1: from cpuinfo physical id, ncpu=$ncpu, cpuinfo_cpucnt=$cpuinfo_cpucnt, cpuinfo_physicalidcnt=$cpuinfo_physicalidcnt, cpuinfo_cpucores=$cpuinfo_cpucores, cputype=$cputype"); } } elsif ($cpuinfo_cpucores && $cpuinfo_coreidcnt > 1) { if ($cpuinfo_coreidcnt != $ncpu * $cpuinfo_cpucores) { if ($cpuinfo_cpucnt == $cpuinfo_coreidcnt && $cpuinfo_cpucores == 1 && $cpuinfo_cpucnt / $ncpu > 2) { $cpuinfo_cpucores=$cpuinfo_cpucnt / $ncpu; } else { $hyperthread=1; &pdebug("hyperthread=1: from cpuinfo, cputype=$cputype"); } } elsif ($cpuinfo_siblings) { if ($cpuinfo_coreidcnt / ($ncpu * $cpuinfo_siblings) == 2) { $hyperthread=1; &pdebug("hyperthread=1: from cpuinfo siblings, ncpu=$ncpu, cpuinfo_cpucnt=$cpuinfo_cpucnt, cpuinfo_coreidcnt=$cpuinfo_coreidcnt, cpuinfo_siblings=$cpuinfo_siblings, cputype=$cputype"); } } } elsif ($cpuinfo_siblings && ! ($cpuinfo_cpucores == 0 && $cputype =~ /Pentium.* 4\b/)) { if ($cpuinfo_cpucores == 0 && $cpuinfo_cpucnt / $cpuinfo_siblings == 2) { $hyperthread=1; if ($cpuinfo_physicalidcnt) { $ncpu=$cpuinfo_physicalidcnt; $cpuinfo_cpucores=$cpuinfo_cpucnt / $cpuinfo_physicalidcnt / 2; $range=$ncpu; # Adjust the range of this "for" loop &pdebug("hyperthread=1: from cpuinfo physical id, ncpu=$ncpu, cpuinfo_cpucnt=$cpuinfo_cpucnt, cpuinfo_physicalidcnt=$cpuinfo_physicalidcnt, cpuinfo_siblings=$cpuinfo_siblings, cputype=$cputype"); } else { &pdebug("hyperthread=1: from cpuinfo siblings, ncpu=$ncpu, cpuinfo_cpucnt=$cpuinfo_cpucnt, cpuinfo_physicalidcnt=$cpuinfo_physicalidcnt, cpuinfo_siblings=$cpuinfo_siblings, cputype=$cputype"); } } } elsif ($cpuinfo_cpucores == 0 && $cputype =~ /Pentium.* 4\b/) { # Can't tell RHEL3 Hyper-Threaded Pentium 4 # from Dual-Core Pentium D $hyperthread=1; &pdebug("hyperthread=1: hack in cpuinfo, cputype=$cputype"); } if ($xen_cores_per_socket) { $cputype=&multicore_cputype($cputype,$xen_cores_per_socket); } elsif ($cpuinfo_cpucores) { $cputype=&multicore_cputype($cputype,$cpuinfo_cpucores); } elsif ($hyperthread && $cpuinfo_siblings) { $cputype=&multicore_cputype($cputype,$cpuinfo_physicalidcnt); } else { $cputype=&multicore_cputype($cputype,$cpuinfo_cpucnt / $ncpu); } } if ($CPUSpeed[$val]) { $cpufreq="$CPUSpeed[$val]"; $cpufreq=~s/ *MHz$//; $CPUSpeed[$val]=~s/ *MHz$/MHz/; } &x86multicorecnt($cputype); $cpucnt{"$cputype $cpufreq"}++ if (! $xen_ncpu || $val < $xen_ncpu); $cpucntfrom="dmidecode" if ($cpucntfrom !~ /cpuinfo/ && $cpucntfrom ne "xm_info"); $ExtSpeed[$val]=~s/ *MHz$/MHz/ if ($ExtSpeed[$val]); } @cputypecnt=keys(%cpucnt); $x=0; while (($cf,$cnt)=each(%cpucnt)) { $x++; $cf=~/^(.*) (\d*)$/; $ctype=$1; $cfreq=$2; if ($cpucntflag == 0 && $cpucntfrom !~ /cpuinfo/ && $cpucntfrom ne "xm_info") { for $tmp (2,3,4,6,8,10,12,16) { $cnt /= $tmp if ($corecnt == $tmp && $cnt % $tmp == 0); } $cpucntflag=1; } $ctype="" if ($ctype =~ /^\S*-Core $/); if ($ctype) { $ctype=&multicore_cputype($ctype,$corecnt) if (&is_xen_hv); $cpubanner .= "$cnt X " if ($cnt > 1); $cpubanner .= "$ctype"; $cpubanner .= " ${cfreq}MHz" if ($cfreq && $ctype !~ /Hz$/); $cpubanner .= ", " if ($x < scalar(@cputypecnt)); } } if (&is_virtualmachine && $cpubanner eq "") { $cpubanner .= "$cpuinfo_cpucnt X " if ($cpuinfo_cpucnt > 1); $_=$cpuinfo_cputype; ($vcpu_type)=(/^(\w*)/); ($vcpu_freq)=(/(\d[\d\.]*[GM]Hz)/); $cpubanner .= "$vcpu_type $vcpu_freq"; } $machine="x86" if (! $machine); &x86_devname; # # Print information # &show_header; if (@topology_data) { print @topology_header; print @topology_data; $untested=0 if ($partition_cnt == 1 && $topology_mfg); # SGI UV $totmem=$installed_memory; &finish; &pdebug("exit"); exit; } # CPU information if ($verbose) { print "WARNING: CPU Information Unknown\n" if ($cpuarr < 0 && $cpucntfrom !~ /cpuinfo/); $range=$cpuarr; $range=$cpuinfo_cpucnt - 1 if ($cpucntfrom =~ /cpuinfo/ && ! $permission_error && &is_virtualmachine); # Second CPU doesn't exist on W1100z $range=0 if ($model =~ /W1100z\b/i); # Third & fourth CPUs don't exist on Ultra 40 $range=1 if ($familypn eq "A71"); for ($cnt=0; $cnt <= $range; $cnt++) { # Only display allocated CPUs on Virtual Machines next if ($CPUStatus[$cnt] && &is_virtualmachine && $CPUStatus[$cnt] =~ /(Unpopulated|Disabled By BIOS)/i); if ($CPUSocketDesignation[$cnt]) { print "$CPUSocketDesignation[$cnt]: "; } else { print "v" if (&is_virtualmachine); print "CPU $cnt: "; } if ($cpucntfrom =~ /cpuinfo/ && &is_virtualmachine) { $_=$cpuinfo_cputype; ($vcpu_type)=(/^(\w*)/); ($vcpu_freq)=(/(\d[\d\.]*[GM]Hz)/); print "$vcpu_type $vcpu_freq cpu\n"; next; } if ($CPUStatus[$cnt]) { if ($CPUStatus[$cnt] =~ /(Unpopulated|Disabled By BIOS)/i) { print "$CPUStatus[$cnt]\n"; next; } } $ctype=""; if ($CPUVersion[$cnt]) { $ctype .= "$CPUManufacturer[$cnt] " if ($CPUManufacturer[$cnt] && $CPUVersion[$cnt] !~ /$CPUManufacturer[$cnt]/i); $ctype .= "$CPUVersion[$cnt] "; } else { $ctype .= "$CPUManufacturer[$cnt] " if ($CPUManufacturer[$cnt]); $ctype .= "$CPUFamily[$cnt] " if ($CPUFamily[$cnt]); } $ctype=~s/ +/ /g; print "$ctype"; if ($CPUSpeed[$cnt]) { print "$CPUSpeed[$cnt] " if ($ctype !~ /Hz $/); } print "cpu"; print ", system freq: $ExtSpeed[$cnt]" if ($ExtSpeed[$cnt]); print "\n"; } } if ($ncpu > 1 && $foundGenuineIntel && $cpucntfrom =~ /cpuinfo/ && ! $permission_error && ! &is_xen_vm) { print "WARNING: Cannot detect if Hyper-Threading is enabled, "; print "CPU count may be half of\n what is shown if "; print "Hyper-Threading is enabled.\n"; } # Memory information if ($permission_error) { print "ERROR: $permission_error\n"; print " This user does not have permission to run $config_command.\n"; print " Try running memconf as a privileged user like root.\n" if ($uid ne "0"); &pdebug("exit 1"); exit 1; } $max=0; if ($MAXMEM) { if ($MAXMEM =~ /\d+ MB/) { $max=$MAXMEM; $max=~s/ MB//g; } elsif ($MAXMEM =~ /\d+ GB/) { $max=$MAXMEM; $max=~s/ GB//g; $max *= 1024; } elsif ($MAXMEM =~ /\d+ TB/) { $max=$MAXMEM; $max=~s/ TB//g; $max *= $meg; } } $DMItypeshown=0; $memarr=3 if ($model =~ /W1100z\b/i); # DIMM5-DIMM8 don't exist on W1100z for ($cnt=0; $cnt <= $memarr; $cnt++) { $buf=""; # Prefer DMI type 17 information over DMI type 6 $DMI=17; $DMI=6 if ($DMI6 && ! $DMI17); # Prefer DMI type 6 information if DMI type 6 reports different # total memory than DMI type 17 (BIOS bug) $DMI=6 if ($DMI6 && $DMI17 && $DMI6totmem > $DMI17totmem && &roundup_memory($freephys) == $DMI6totmem && ! &is_virtualmachine); &pdebug("using DMI type $DMI data for memory: DMI6totmem=$DMI6totmem, DMI17totmem=$DMI17totmem") if (! $DMItypeshown); $DMItypeshown=1; if ($DMI == 6) { next if (! $Size6[$cnt]); if ($Type6[$cnt]) {next if ($Type6[$cnt] =~ /Flash/i);} if (defined($Locator6[$cnt]) && defined($BankLocator[$cnt])) { $BankLocator[$cnt]="" if ($Locator6[$cnt] eq $BankLocator[$cnt]); if ($Locator6[$cnt] =~ /:/ && $BankLocator[$cnt] =~ /:/) { $Loc1=$Locator6[$cnt]; $Loc1=~s/.*://; $Loc2=$BankLocator[$cnt]; $Loc2=~s/.*://; $Locator6[$cnt]=~s/:.*// if ($Loc1 eq $Loc2); } } if ($#socketstr && ! $have_decodedimms_data) { $socketlabelarr[$cnt]="$socketstr[$cnt]"; } else { $socketlabelarr[$cnt]=$Locator6[$cnt]; } if ($Size6[$cnt] =~ /Not Installed|No Module Installed|^0 *MB.*/i) { &add_to_sockets_empty($socketlabelarr[$cnt]); } else { $buf="$socketlabelarr[$cnt]"; $simmsize=$Size6[$cnt]; $simmsize=~s/ *MB.*//ig; $sizearr[$cnt]=$simmsize; $Size6[$cnt]=~s/MByte/ MB/ig; $Size6[$cnt]=~s/ +MB/MB/g; if (defined($BankConnections6[$cnt])) { if ($Locator6[$cnt] =~ /BANK *\d/i && $BankConnections6[$cnt] =~ / /) { $tmp=$simmsize / 2; $buf .= ": 2 X ${tmp}MB"; } else { $buf .= ": $Size6[$cnt]"; } } else { $buf .= ": $Size6[$cnt]"; } $buf .= " $SizeDetail[$cnt]" if ($SizeDetail[$cnt]); if ($Speed6[$cnt]) { $Speed6[$cnt]=~s/ +MHz/MHz/; $Speed6[$cnt]=~s/ +ns/ns/; $buf .= " $Speed6[$cnt]"; &check_mixedspeeds($Speed6[$cnt]); } elsif ($Speed17[$cnt]) { $Speed17[$cnt]=~s/ +MHz/MHz/; $Speed17[$cnt]=~s/ +ns/ns/; $buf .= " $Speed17[$cnt]"; &check_mixedspeeds($Speed17[$cnt]); } if ($TypeDetail[$cnt]) { $buf .= " $TypeDetail[$cnt]" if ($TypeDetail[$cnt] !~ /None/i); } if ($FormFactor[$cnt] && defined($Type17[$cnt])) { $buf .= " $Type17[$cnt]"; $buf .= " $FormFactor[$cnt]" if ($Type17[$cnt] !~ /$FormFactor[$cnt]/); } elsif ($Type6[$cnt]) { $buf .= " $Type6[$cnt]"; } if ($MemManufacturer[$cnt]) { $buf .= ", $MemManufacturer[$cnt]" if ($MemManufacturer[$cnt] !~ /None/i); if ($MemPartNum[$cnt]) { $buf .= " $MemPartNum[$cnt]" if ($MemPartNum[$cnt] !~ /None/i); } } elsif ($MemPartNum[$cnt]) { $buf .= ", $MemPartNum[$cnt]" if ($MemPartNum[$cnt] !~ /None/i); } } $totmem=$DMI6totmem; } else { next if (! $Size17[$cnt]); if ($Type17[$cnt]) {next if ($Type17[$cnt] =~ /Flash/i);} if (defined($Locator17[$cnt]) && defined($BankLocator[$cnt])) { $BankLocator[$cnt]="" if ($Locator17[$cnt] eq $BankLocator[$cnt]); if ($Locator17[$cnt] =~ /:/ && $BankLocator[$cnt] =~ /:/) { $Loc1=$Locator17[$cnt]; $Loc1=~s/.*://; $Loc2=$BankLocator[$cnt]; $Loc2=~s/.*://; $Locator17[$cnt]=~s/:.*// if ($Loc1 eq $Loc2); } } if ($BankLocator[$cnt]) { $bank_label="$BankLocator[$cnt]"; # Don't include bank label if memory label also # includes the CPU $bank_label="" if ($Locator17[$cnt] =~ /CPU/ && $BankLocator[$cnt] =~ /\/P\d+$/); } if ($#socketstr && ! $have_decodedimms_data) { $socketlabelarr[$cnt]="$socketstr[$cnt]"; } else { $socketlabelarr[$cnt]=$Locator17[$cnt]; $socketlabelarr[$cnt] .= " $bank_label" if ($bank_label); } if ($Size17[$cnt] =~ /Not Installed|No Module Installed|^0 *MB.*/i) { &add_to_sockets_empty($socketlabelarr[$cnt]); } else { $buf="$socketlabelarr[$cnt]"; $simmsize=$Size17[$cnt]; if ($simmsize =~ / *GB.*/i) { $simmsize=~s/ *GB.*//ig; $simmsize *= 1024; } else { $simmsize=~s/ *MB.*//ig; } $sizearr[$cnt]=$simmsize; $Size17[$cnt]=~s/MByte/ MB/ig; $Size17[$cnt]=~s/ +MB/MB/g; $buf .= ": $Size17[$cnt]"; $buf .= " $SizeDetail[$cnt]" if ($SizeDetail[$cnt]); if ($Speed17[$cnt]) { $Speed17[$cnt]=~s/ +MHz/MHz/; $Speed17[$cnt]=~s/ +ns/ns/; $buf .= " $Speed17[$cnt]"; &check_mixedspeeds($Speed17[$cnt]); } elsif ($Speed6[$cnt]) { $Speed6[$cnt]=~s/ +MHz/MHz/; $Speed6[$cnt]=~s/ +ns/ns/; $buf .= " $Speed6[$cnt]"; &check_mixedspeeds($Speed6[$cnt]); } if ($TypeDetail[$cnt]) { $buf .= " $TypeDetail[$cnt]" if ($TypeDetail[$cnt] !~ /None/i); } $buf .= " $Type17[$cnt]" if ($Type17[$cnt]); if ($FormFactor[$cnt]) { if ($Type17[$cnt]) { $buf .= " $FormFactor[$cnt]" if ($Type17[$cnt] !~ /$FormFactor[$cnt]/); } else { $buf .= " $FormFactor[$cnt]"; } } if ($TotalWidth[$cnt] && $DataWidth[$cnt]) { $ECCDIMM=1 if ($TotalWidth[$cnt] > $DataWidth[$cnt]); } if ($MemManufacturer[$cnt]) { $buf .= ", $MemManufacturer[$cnt]" if ($MemManufacturer[$cnt] !~ /None/i); if ($MemPartNum[$cnt]) { # Don't repeat MFG if it is in Partnumber $MemPartNum[$cnt]=~s/$MemManufacturer[$cnt] //; $buf .= " $MemPartNum[$cnt]" if ($MemPartNum[$cnt] !~ /None/i); } } elsif ($MemPartNum[$cnt]) { $buf .= ", $MemPartNum[$cnt]" if ($MemPartNum[$cnt] !~ /None/i); } } $totmem=$DMI17totmem; } push(@boards_mem, "$buf\n") if ($buf); } # Check memory SPD data from EEPROM if available, it can be more # accurate and detailed than the dmidecode data &check_decodedimms; &pdebug("displaying memory from $memfrom") if ($memfrom); if (! &is_virtualmachine) { # Only show ECC enabled in BIOS if ECC memory is installed if ($ECCBIOS) { $ECCBIOS="None" if (! $ECCDIMM); print "Memory Error Correction: $ECCBIOS\n"; } print "Maximum Memory: "; if (! $MAXMEM || $max < $totmem || $max == 0) { $MAXMEM="Unknown"; $MAXMEM .= " (DMI incorrectly reports ${max}MB)" if ($max < $totmem && $max); print "$MAXMEM\n"; } else { &show_memory($max); } print "Maximum Memory Bus Speed: $maxmembusspeed\n" if ($maxmembusspeed); print @boards_mem if (@boards_mem); } # # Print total memory # $sockettype="sockets"; $sockettype="banks" if ($sockets_empty =~ /BANK *\d/i && $sockets_empty !~ /DIMM/); if ($memarr < 0 || $totmem == 0) { if (&is_virtualmachine) { if ($totmem) { print "total memory = "; &show_memory($totmem); } else { $exitstatus=1; } &check_virtualmachine; } else { &print_empty_memory("memory $sockettype") if ($sockets_empty); print "ERROR: Memory Information Unknown\n"; if ((! $FoundEnd || $BrokenTable ne "") && $dmidecode_ver) { print "WARNING: dmidecode output is truncated\n" if (! $FoundEnd); if ($BrokenTable ne "") { print "ERROR: $BrokenTable\n"; print " Your BIOS may be corrupted or have an invalid checksum.\n"; } } &print_bios_error; $exitstatus=1; } } else { &print_empty_memory("memory $sockettype"); print "total memory = "; &show_memory($totmem); } if ($ECCBIOS) { if ($ECCBIOS eq "None" && $ECCDIMM) { print "WARNING: ECC memory detected, but ECC is not enabled in the BIOS.\n"; $exitstatus=1; } } print "WARNING: Mixed speeds of memory modules found.\n" if ($mixedspeeds); print "ERROR: $dmidecode_error\n" if ($dmidecode_error); if ($freephys > $totmem && $totmem && ! &is_virtualmachine) { print "ERROR: Total physical memory (${freephys}MB) is "; print "greater than the total memory found.\n The total "; print "physical memory reported by 'free -m' does not match "; print "the\n memory reported by 'dmidecode'.\n"; &print_bios_error; } # See if half of the memory is unused due to missing a second CPU if ($totmem && $totmem == &roundup_memory($freephys) * 2 && $ncpu == 1 && $necpu == 1) { print "WARNING: Half of the installed memory is not being "; print "used due to only having a\n single CPU "; print "installed in this dual-CPU capable system.\n"; } if ($os =~ /Linux|FreeBSD/ && &roundup_memory($freephys) < $totmem && $totmem > 4096) { $tmp=0; @tmp=(""); if (-r '/var/log/dmesg' && ! $filename) { open(FILE, "</var/log/dmesg"); @tmp=<FILE>; close(FILE); } elsif ($filename) { @tmp=@config; } foreach $line (@tmp) { if ($line =~ /Warning only \d.*B will be used/) { $line=~s/Warning o/WARNING: O/; print $line; $tmp=1; } if ($line =~ /Use a PAE enabled kernel/) { print "WARNING: " . $line; if (-r '/etc/grub.conf' && $osrel) { $tmp=`grep ${osrel}PAE /etc/grub.conf`; $tmp=($tmp) ? 2 : 1; } else { $tmp=1; } } } if ($tmp) { print "WARNING: Total memory available to the OS is "; print "less than the total memory found.\n"; $recognized=0; $exitstatus=1; } if ($tmp >=1 && $osrel) { $osrelk=$osrel; $osrelk=~s/smp//; $osrelk=~s/hugemem//; if ($tmp == 1) { if ($osrel =~ /smp$/) { if (`grep ${osrelk}hugemem /etc/grub.conf 2>/dev/null`) { print "WARNING: Boot the ${osrelk}hugemem kernel to use the full memory.\n"; } else { print "WARNING: Using a 'hugemem' kernel may fix this issue (supports up to 64GB).\n"; } } elsif ($osrel =~ /hugemem$/) { print "WARNING: An upgraded BIOS may fix this issue.\n"; print "WARNING: This is not a bug in memconf.\n"; } else { if ($totmem < 16384) { if (`grep ${osrelk}smp /etc/grub.conf 2>/dev/null`) { print "WARNING: Boot the ${osrelk}smp kernel to use the full memory.\n"; } elsif (`grep ${osrelk}hugemem /etc/grub.conf 2>/dev/null`) { print "WARNING: Boot the ${osrelk}hugemem kernel to use the full memory.\n"; } else { print "WARNING: Using an 'smp' or 'hugemem' kernel may fix this issue ('smp' supports\n"; print " up to 16GB, 'hugemem' supports up to 64GB).\n"; } } else { if (`grep ${osrelk}hugemem /etc/grub.conf 2>/dev/null`) { print "WARNING: Boot the ${osrelk}hugemem kernel to use the full memory.\n"; } else { print "WARNING: Using a 'hugemem' kernel may fix this issue (supports up to 64GB).\n"; } } } } if ($tmp == 2) { print "WARNING: Boot the ${osrelk}PAE kernel "; print "to use the full memory.\n"; } } elsif ($tmp == 1) { if ($totmem < 16384) { print "WARNING: Using an 'smp' or 'hugemem' kernel may fix this issue ('smp' supports\n"; print " up to 16GB, 'hugemem' supports up to 64GB).\n"; } else { print "WARNING: Using a 'hugemem' kernel may fix this issue (supports up to 64GB).\n"; } } } # Flag untested CPU types (machine="" or "x86" on regression test files) # Tested so far on x86, i86pc, x86_64, Itanium ia64, and amd64 if (! $machine || $machine eq "x86" || $machine =~ /i.86/ || $machine eq "x86_64" || $machine eq "ia64" || $machine eq "amd64") { $untested=0 if ($untested == 1); # Linux on SPARC with dmidecode # } elsif ($machine eq "sparc64" || $machine eq "sun4u") { # $untested=0 if ($untested == 1); } else { $untested=1; $untested_type="CPU" if (! $untested_type); } &check_virtualmachine; &show_untested if ($untested); &show_errors; &mailmaintainer if ($verbose == 3); &pdebug("exit $exitstatus"); exit $exitstatus; } sub show_total_memory { return if ($totalmemshown || ! $totmem); $totalmemshown=1; # # Print total memory # print "total memory = "; &show_memory($totmem); print "$permission_error\n" if ($permission_error && ! $HPUX); if ($prtconf_warn) { print "WARNING: $prtconf_warn\n"; print " This may be corrected by installing "; print "a Sun patch on this system.\n"; } } sub show_control_LDOM_message { return if ($controlLDOMshown); $controlLDOMshown=1; # # Post notice if on control LDOM # print "NOTICE: Control Logical Domain (LDOM) detected. "; $picl_bank_cnt=scalar(keys %picl_mem_bank); if ($picl_foundmemory || $picl_bank_cnt) { print "The cpus and memory modules\n"; print " reported are for the system, not necessarily the control LDOM.\n"; } else { print "The SUNWldm software package\n"; print " may need updated for prtpicl to be able to report the installed cpus and\n"; print " memory for the system.\n"; } } sub is_virtualmachine { if ($uid ne "0") { # In case non-root user is running memconf $tmp=($os =~ /Linux|FreeBSD/ && ! $filename) ? `lspci 2>/dev/null | egrep -i '(VMware|VirtualBox|VirtualPC)'` : ""; # Include special case for regression testing VM files if ((! $filename && $tmp =~ /VMware/i) || $filename =~ /VMware/i) { $manufacturer="VMware, Inc." if (! $manufacturer); $model="VMware Virtual Platform" if (! $model); return(1); } elsif ((! $filename && $tmp =~ /VirtualBox|VBox/i) || $filename =~ /VirtualBox/i) { $manufacturer="Oracle Corporation" if (! $manufacturer); $model="VirtualBox" if (! $model); return(1); } elsif ((! $filename && $tmp =~ /VirtualPC/i) || $filename =~ /VirtualPC/i) { $manufacturer="Microsoft Corporation" if (! $manufacturer); $model="Virtual Machine" if (! $model); return(1); } } return(1) if ($manufacturer =~ /VMware/ || $model =~ /VMware|Virtual Platform|Virtual Machine|VirtualBox|VBox/ || $diagbanner =~ /Virtual Machine/); return(1) if (&is_xen_vm); return(0); } sub is_xen_hv { return(1) if (-d '/proc/xen' && -f '/proc/xen/xsd_port'); # Linux Hypervisor # Special case for regression testing Xen files return(1) if ($filename =~ /Xen_dom0/i); } sub is_xen_vm { return(1) if (-d '/proc/xen' && ! -f '/proc/xen/xsd_port'); # Linux return(1) if ($model =~ /HVM domU/); # Linux return(1) if ($model eq "i86xpv" || $machine eq "i86xpv" || $model eq "i86xen" || $machine eq "i86xen"); # Solaris # Special case for regression testing Xen files return(1) if ($filename =~ /Xen_domU/i); } sub check_virtualmachine { return if ($vmshown); $vmshown=1; if (&is_virtualmachine) { if (&is_xen_vm) { $vmh="Xen dom0 hypervisor"; $vms="Xen server"; $vmg="Xen domU guest"; } else { $vmh="VM hypervisor"; $vms="VM server"; $vmg="Virtual Machine (VM)"; } print "NOTICE: Details shown may be for the configuration of this $vmg,\n not the physical CPUs and memory of the $vms it is running on.\n"; print "WARNING: More details can be reported if memconf is run on the $vmh.\n"; print " $vms CPU: $cpuinfo_cputype\n" if ($cpuinfo_cputype); } } sub check_xm_info { if ($have_xm_info_data) { &pdebug("in check_xm_info"); foreach $line (@xm_info) { $line=&dos2unix($line); $_=$line; ($xen_nr_nodes)=(/: (\d*) */) if (/^nr_nodes\s*: \d+/); ($xen_sockets_per_node)=(/: (\d*) */) if (/^sockets_per_node\s*: \d+/); ($xen_cores_per_socket)=(/: (\d*) */) if (/^cores_per_socket\s*: \d+/); $hyperthread=1 if (/^threads_per_core\s*: 2/); } $xen_ncpu=$xen_nr_nodes * $xen_sockets_per_node; &pdebug("xen_ncpu=$xen_ncpu, ncpu=$ncpu, xen_nr_nodes=$xen_nr_nodes, xen_sockets_per_node=$xen_sockets_per_node, xen_cores_per_socket=$xen_cores_per_socket, hyperthread=$hyperthread"); if ($xen_ncpu) { $cpucntfrom="xm_info"; $corecnt=$xen_cores_per_socket; $nvcpu=$xen_cores_per_socket; $nvcpu=$nvcpu * 2 if ($hyperthread); } } } sub check_cpuinfo { if ($have_cpuinfo_data) { return if ($cpuinfo_checked); &pdebug("in check_cpuinfo"); $cpuinfo_checked=1; foreach $line (@cpuinfo) { $line=&dos2unix($line); $_=$line; $cpuinfo_cpucnt++ if (/^processor\s*: \d+/); $cpuinfo_coreidcnt++ if (/^core id\s*: \d+/); if (/^physical id\s*: \d+/) { ($physicalid)=(/: (\d*) */); $cpuinfo_physicalid{$physicalid}++; } ($cpuinfo_cpucores)=(/: (\d*) */) if (/^cpu cores\s*: \d+/); ($cpuinfo_siblings)=(/: (\d*) */) if (/^siblings\s*: \d+/); # Only GenuineIntel x86 has hyper-threading capability $foundGenuineIntel=1 if (/^vendor_id\s*: GenuineIntel/); # Linux on x86 or ARM CPU model if (/^model name\s*: /) { ($cpuinfo_cputype)=(/: (.*)$/); $cpuinfo_cputype=&cleanup_cputype($cpuinfo_cputype); if (/.*(ARM|Feroceon|Marvell)/) { if ($filename) { # Special case for regression testing $machine="arm"; $platform=$machine; $os="Linux"; } $cpucnt{"$cpuinfo_cputype"}=$corecnt; } } # Linux on SPARC CPU model if (/^cpu\s+: \D/) { ($cpuinfo_cputype)=(/: (.*)$/); $cpuinfo_cputype=&cleanup_cputype($cpuinfo_cputype); $machine="sparc" if ($cpuinfo_cputype =~ /sparc/i); $os="Linux"; } # Linux on SPARC OBP version if (/^prom\s+: /) { ($romver)=(/: (.*)$/); @romverarr=split(/\s/, $romver); $romvernum=$romverarr[1]; } # Linux on SPARC CPU type ($machine)=(/: (.*)$/) if (/^type\s+: sun/); # Linux on SPARC if (/^ncpus active\s*: \d+/) { ($cpuinfo_cpucnt)=(/: (.*)$/); # Assume single core $cpuinfo_cpucores=1; } # Linux on SPARC CPU freq if (/^Cpu\dClkTck\s*: \d+/ && $cpufreq == 0) { ($freq)=(/: (.*)$/); $cpufreq=&convert_freq($freq); $cpuinfo_cputype.= " ${cpufreq}MHz" if ($cpuinfo_cputype !~ /MHz/ && $cpufreq); } # Linux on unsupported CPU models (arm, mips, etc.) if (($machine !~ /.86|ia64|amd64|sparc/ && ! $filename) || $filename) { if (/^Processor\s+: /) { ($cpuinfo_cputype)=(/: (.*)$/); if ($filename && /^Processor\s+: .*(ARM|Feroceon|Marvell)/) { # Special case for regression testing $machine="arm"; $platform=$machine; } $os="Linux"; $cpucnt{"$cpuinfo_cputype"}=$corecnt; } elsif (/^cpu model\s+: /) { ($cpuinfo_cputype)=(/: (.*)$/); if ($filename && /^cpu model\s+: .*MIPS/) { # Special case for regression testing $machine="mips"; $platform=$machine; } $os="Linux"; $cpucnt{"$cpuinfo_cputype"}=$corecnt; } } if ($filename) { ($hostname)=(/: (.*)$/) if (/^host\s*: / && $hostname eq ""); if (/^machine\s*: /) { ($machine)=(/: (.*)$/); if (! defined($kernbit)) { $kernbit=32 if ($machine =~ /i.86|sparc/); $kernbit=64 if ($machine =~ /x86_64|sparc64|ia64|amd64/); } } if (/^release\s*: / && $release eq "") { ($release)=(/: (.*)$/); $release="Linux $release"; } } } $cpuinfo_physicalidcnt=keys %cpuinfo_physicalid; $cpuinfo_physicalidcnt=0 if (! defined($cpuinfo_physicalidcnt)); if ($cpuinfo_cpucnt > $ncpu && (! $foundGenuineIntel || $foundGenuineIntel && ! $ncpu)) { # Prefer cpuinfo over dmidecode for CPU info $cpucntfrom=$config_command if (! $cpucntfrom); &pdebug("Preferring CPU count from cpuinfo ($cpuinfo_cpucnt) over $cpucntfrom ($ncpu)"); if ($ncpu) { $cpucntfrom="dmidecode and cpuinfo"; } else { $cpucntfrom="cpuinfo"; } if ($cpuinfo_cpucores) { $ncpu=$cpuinfo_cpucnt / $cpuinfo_cpucores; } else { $ncpu=$cpuinfo_cpucnt; } } &pdebug("cpuinfo_cputype=$cpuinfo_cputype, ncpu=$ncpu, cpuinfo_cpucnt=$cpuinfo_cpucnt, cpuinfo_coreidcnt=$cpuinfo_coreidcnt, cpuinfo_cpucores=$cpuinfo_cpucores, cpuinfo_physicalidcnt=$cpuinfo_physicalidcnt, cpuinfo_siblings=$cpuinfo_siblings, foundGenuineIntel=$foundGenuineIntel"); } } sub finish { &show_header; #print "newslots=@newslots\n" if ($#newslots && $verbose > 1); # Large memory system like SPARC T7-4 can mismatch memory in prtconf and ipmitool if ($isX86 || $ultra =~ /^T7-/) { # smbios and ipmitool memory data is more accurate than prtconf if ($smbios_memory && $smbios_memory > $installed_memory) { $installed_memory=$smbios_memory; $totmem=$installed_memory; } elsif ($ipmi_memory && $ipmi_memory > $installed_memory) { $installed_memory=$ipmi_memory; $totmem=$installed_memory; } } # Cannot accurately determine installed memory unless information is # is in prtpicl output, or if system is fully stuffed $picl_bank_cnt=scalar(keys %picl_mem_bank); if ($ldm_memory && ! ($picl_foundmemory || $picl_bank_cnt)) { $totmem=&roundup_memory($installed_memory); &show_total_memory; &show_control_LDOM_message; return; } print $buffer if ($buffer); # # Special memory options # if ($sxmem) { # Currently assumes only one VSIMM is installed. # Auxiliary Video Board 501-2020 (SS10SX) or 501-2488 (SS20) # required if two VSIMMs are installed. if ($model eq "SPARCstation-20" || $model eq "SuperCOMPstation-20S") { # SS20 1st VSIMM in J0304/J0407, 2nd in J0305/J0406 print "sockets J0304/J0407 have"; $sockets_used .= " J0304"; } elsif ($model =~ /COMPstation-20A\b/) { # 1st VSIMM in J0202, 2nd in J0301 print "socket J0202 has"; $sockets_used .= " J0202"; } else { # SS10SX 1st VSIMM in J0301/J1203, 2nd in J0202/J1201 print "sockets J0301/J1203 have"; $sockets_used .= " J0301"; } print " a ${sxmem}MB VSIMM installed for SX (CG14) graphics\n"; } if ($nvmem) { # NVSIMMs for Prestoserve if ($model eq "SPARCstation-20" || $model eq "SuperCOMPstation-20S") { # SS20 1st 2MB NVSIMM in J0305/J0406, 2nd in J0304/J0407 if ($nvmem1) { $sockets_used .= " J0305"; print "sockets J0305/J0406 have a 2MB NVSIMM"; print " installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used .= " J0304"; print "sockets J0304/J0407 have a 2MB NVSIMM"; print " installed for Prestoserve\n"; } } elsif ($model =~ /COMPstation-20A\b/) { # 1st 2MB NVSIMM in J0301, 2nd in J0202 if ($nvmem1) { $sockets_used .= " J0301"; print "socket J0301 has a 2MB NVSIMM"; print " installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used .= " J0202"; print "socket J0202 has a 2MB NVSIMM"; print " installed for Prestoserve\n"; } } elsif ($model =~ /SPARCstation-10/ || $model eq "Premier-24") { # SS10 1st 2MB NVSIMM in J0202/J1201, 2nd in J0301/J1203 if ($nvmem1) { $sockets_used .= " J0202"; print "sockets J0202/J1201 have a 2MB NVSIMM"; print " installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used .= " J0301"; print "sockets J0301/J1203 have a 2MB NVSIMM"; print " installed for Prestoserve\n"; } } else { # SS1000 supports two banks of four 1MB NVSIMMs # SC2000 supports one bank of eight 1MB NVSIMMs print "Has ${nvmem}MB of NVSIMM installed for Prestoserve "; if ($model eq "SPARCserver-1000") { print "(1 bank of 4" if ($nvmem == 4); print "(2 banks of 4" if ($nvmem == 8); } else { print "(1 bank of 8"; } print " 1MB NVSIMMs$nvsimm_banks)\n"; } } # # Check for empty banks or sockets # if ($#banksstr) { foreach $banks (@banksstr) { if ($banks ne "?") { if ($banks_used !~ /\b$banks\b/ && $sockets_empty !~ /\b$banks\b/) { &add_to_sockets_empty($banks); } } } &print_empty_memory($bankname); } elsif ($#socketstr) { foreach $socket (@socketstr) { if ($socket ne "?") { # strip leading slash for matching $tmp=$socket; $tmp=~s/^\///; if ($sockets_used !~ /$tmp/ && $sockets_empty !~ /$tmp/) { &add_to_sockets_empty($socket); } } } if ($sockettype) { &print_empty_memory("${sockettype}s"); } else { &print_empty_memory("memory slots"); } } elsif ($verbose > 1 && $sockets_used) { print "memory sockets used: $sockets_used\n"; } # Look for duplicate sockets if ($sockets_used && $have_prtdiag_data) { $dup_sockets=""; if ($sockets_used =~ /;/) { $sep=';'; } elsif ($sockets_used =~ /,/) { $sep=','; } else { $sep=' '; } foreach $socket (sort split($sep, $sockets_used)) { next if ($socket eq "board" || $socket eq "mezzanine"); next if ($model eq "SPARCsystem-600" || $model =~ /Sun.4.600/); $pos=-1; $cnt=0; while (($pos=index(" $sockets_used ", " $socket ", $pos)) > -1) { $pos++; $cnt++; if ($cnt == 2 && $socket ne "-" && $socket ne "?") { # strip leading slash for matching $tmp=$socket; $tmp=~s/^\///; if ($dup_sockets !~ /$tmp/) { $dup_sockets .= " $socket"; print "ERROR: Duplicate socket $socket found\n"; $exitstatus=1; } } } } if ($dup_sockets) { print "WARNING: Memory was not properly reported by"; print " the 'prtdiag' command.\n"; &recommend_prtdiag_patch; } } # Look for unlabeled sockets if ($sockets_used =~ /\s-\s|^-\s|\s-$|^-$/) { print "WARNING: Unlabeled socket found"; print " in the 'prtdiag' command output" if ($have_prtdiag_data); print ".\n This may cause the reported empty sockets"; print " to be incorrect.\n"; &recommend_prtdiag_patch; } # Make sure Sun Fire V480/V490/V880/V890 is fully stuffed if >= 1050MHz if ($ultra =~ /Sun Fire V[48][89]0\b/) { print "ERROR: System should not have any empty banks since CPU is >= 1050MHz.\n" if ($cpufreq >= 1050 && $banks_used ne "A0 A1 B0 B1"); } if ($machine eq "sun4v") { # Round up Solaris memory (may have 128MB or more reserved) $installed_memory=&roundup_memory($installed_memory); $totmem=$installed_memory; } # # Print total memory # &show_total_memory; # # Post notice if on control LDOM # &show_control_LDOM_message if ($ldm_memory); # # Post notice if on a virtual machine # &check_virtualmachine; # # Post notice if X86 machine is Hyper-Thread capable, but not enabled # &show_hyperthreadcapable; # # Check for illegal memory stuffings # if ($model eq "Sun 4/50" || $model eq "Sun 4/25") { # IPX, ELC if ($slot0 != 16 && $largestsimm == 16 && $osrel =~ /4.1.1/) { print "ERROR: Install the highest capacity 16MB SIMM"; print " in socket $socketstr[0] under SunOS 4.1.1.\n"; $exitstatus=1; } } if ($model =~ /SPARCclassic|SPARCstation-LX/) { if ($found32mb) { # Reportedly can accept 32MB SIMMs in bank 1, allowing # 128MB total (2x32, 4x16) print "NOTICE: The 32MB SIMM is not supported in the"; print " $model according to\n Sun. However it does"; print " appear to work in bank 1 only, allowing a"; print " maximum of\n 128MB of total memory (2x32MB"; print " bank 1 + 4x16MB banks 2 & 3).\n"; } if ($found8mb) { # Possibly can accept 8MB SIMMs in bank 1 print "NOTICE: The 8MB SIMM is not supported in the"; print " $model according to\n Sun. However it does"; print " appear to work in bank 1 only.\n"; } } if ($model =~ /SPARCstation-10/ || $model eq "Premier-24") { if ($slot0 < $largestsimm && $BSD) { print "ERROR: Install the highest capacity SIMM in"; print " socket $socketstr[0] under Solaris 1.X.\n"; $exitstatus=1; } if (! $found32mb && $found16mb && ($romvermajor eq 2) && ($romverminor < 19)) { print "WARNING: The 32MB SIMM is not supported in the"; print " SS10 or SS10SX according to\n Sun. However"; print " it does work correctly depending on the Open"; print " Boot PROM\n version. This system is running"; print " OBP $romvernum, so 32MB SIMMs will only be\n"; print " recognized as 16MB SIMMs. You should"; print " upgrade to OBP 2.19 or later in order\n to"; print " be able to detect and utilize 32MB SIMMs.\n"; # OBP 2.14 and earlier see the 32MB SIMM as 16MB. # OBP 2.15 on a SS20 does see the 32MB SIMM as 32MB. # Have not tested 32MB SIMMs on SS10 with OBP 2.15-2.18 if ($romverminor > 14) { $untested=1; $untested_type="OBP"; } } if ($found32mb && ($romvermajor eq 2) && ($romverminor < 19)) { print "NOTICE: The 32MB SIMM is not supported in the"; print " SS10 or SS10SX according to\n Sun. However"; print " it does work correctly depending on the Open"; print " Boot PROM\n version. This system is running"; print " OBP $romvernum, and 32MB SIMMs were properly\n"; print " recognized.\n"; @simmsizes=(16,32,64); if ($romvernum ne "2.X") { $untested=1; $untested_type="OBP"; } } if (! $nvmem1 && $nvmem2) { print "ERROR: First NVSIMM should be installed in"; print " socket J0202, not socket J0301\n"; $exitstatus=1; } } if ($model eq "SPARCstation-20" || $model eq "SuperCOMPstation-20S") { if (! $nvmem1 && $nvmem2) { print "ERROR: First NVSIMM should be installed in"; print " socket J0305, not socket J0304\n"; $exitstatus=1; } } if ($model eq "SPARCstation-5") { if ($slot0 < $largestsimm && $BSD) { print "ERROR: Install the highest capacity SIMM in"; print " socket $socketstr[0] under Solaris 1.X.\n"; $exitstatus=1; } if ($osrel eq "4.1.3_U1" && $found32mb) { # Look to see if patch 101508-07 or later is installed # for 32MB SIMMs to work properly (bug 1176458) $what=&mychomp(`/usr/ucb/what /sys/sun4m/OBJ/module_vik.o`); if ($what !~ /module_vik.c 1.38 94\/08\/22 SMI/) { print "WARNING: Install SunOS 4.1.3_U1 patch"; print " 101508-07 or later in order for 32MB\n"; print " SIMMs to work reliably on the"; print " SPARCstation 5.\n"; } } } if ($model eq "Ultra-5_10" || $ultra eq "5_10" || $ultra eq 5 || $ultra eq 10) { if ($smallestsimm == 16 && $largestsimm > 16) { print "ERROR: 16MB DIMMs cannot be mixed with larger"; print " DIMMs on Ultra 5/10 systems.\n"; $exitstatus=1; } } if ($ultra eq 5) { if ($largestsimm == 256) { print "NOTICE: The 256MB DIMM is not supported in the"; print " Ultra 5 according to\n Sun. However it does"; print " work correctly as long as you use low-profile"; print "\n DIMMs or take out the floppy drive.\n"; } } if ($ultra eq "AXi") { # DIMMs should be chosen as all 10-bit or all 11-bit column # address type. If using 11-bit, then only use Bank 0 & 2. if ($found10bit && $found11bit) { print "ERROR: You should not mix 10-bit and 11-bit"; print " column address type DIMMs in the\n "; print "SPARCengine Ultra AXi.\n"; $exitstatus=1; } if ($found11bit) { if ($foundbank1or3) { print "ERROR"; $exitstatus=1; } else { print "WARNING"; } print ": Do not use Bank 1 (sockets U0402 & U0401) &"; print " Bank 3 (sockets U0302 &\n U0301) since"; print " 11-bit column address type DIMMs are"; print " installed. You should\n only use Bank 0"; print " (sockets U0404 & U0403) & Bank 2 (sockets"; print " U0304 & U0303).\n"; } } if ($model eq "Ultra-4" || $ultra eq 450 || $model eq "Ultra-4FT" || $ultra eq "Netra ft1800") { if ($found16mb) { print "WARNING: 16MB DIMMs are not supported and may"; print " cause correctable ECC errors.\n"; } } # # Check for unsupported memory sizes # foreach $i (@simmsizesfound) { $smallestsimm=$i if ($i < $smallestsimm); $largestsimm=$i if ($i > $largestsimm); $simmsizelegal=0; foreach $j (@simmsizes) { $simmsizelegal=1 if ($i == $j); } if (! $simmsizelegal && $simmsizes[0]) { print "ERROR: Unsupported ${i}MB $memtype found (supported "; if ($#simmsizes == 0) { print "size is @{simmsizes}MB)\n"; } else { print "MB sizes are: @simmsizes)\n"; } $exitstatus=1; } } if ($smallestsimm < $simmsizes[0]) { print "ERROR: Smaller than expected $memtype found "; print "(found ${smallestsimm}MB, smallest expected "; print "${simmsizes[0]}MB)\n"; $exitstatus=1; } if ($largestsimm > $simmsizes[$#simmsizes]) { print "ERROR: Larger than expected $memtype found "; print "(found ${largestsimm}MB, largest expected "; print "${simmsizes[$#simmsizes]}MB)\n"; $exitstatus=1; } # # Check for buggy perl version # if ($perlhexbug) { print "ERROR: This Perl V$PERL_VERSION is buggy in hex number"; print " conversions.\n"; $exitstatus=1; } if ($PERL_VERSION == 5.001) { print "WARNING: Perl V5.001 is known to be buggy in hex number"; print " conversions.\n"; } if ($PERL_VERSION < 5.002) { print "WARNING: Perl V5.002 or later is recommended for best"; print " results.\n"; print " You are running Perl V$PERL_VERSION\n"; } # # Check for bad eeprom banner-name. This happens sometimes when OBP 3.23 # or later is installed on Ultra-60/E220R and Ultra-80/E420R systems. # if ($banner =~ /^ \(/) { print "ERROR: banner-name not set in EEPROM (BugID 4257412)."; print " Cannot distinguish an\n "; print "Ultra 60 from an Enterprise 220R" if ($model eq "Ultra-60"); print "Ultra 80 from an Enterprise 420R or Netra t 1400/1405" if ($model eq "Ultra-80"); print "Sun Blade 1000/2000 from a Sun Fire 280R or Netra 20" if ($ultra eq "Sun Blade 1000" || $ultra eq "Sun Blade 2000" || $ultra eq "Sun Fire 280R" || $ultra eq "Netra 20"); print ".\n To correct this problem, please run one of "; print "the following commands as\n root depending on "; print "the system you have:\n"; if ($model eq "Ultra-60") { print " eeprom banner-name='Sun Ultra 60 UPA/PCI'\n"; print " eeprom banner-name='Sun Enterprise 220R'\n"; print "Note: Netra t1120/1125 systems may also use the 'Sun Ultra 60 UPA/PCI' banner\n"; } if ($model eq "Ultra-80") { print " eeprom banner-name='Sun Ultra 80 UPA/PCI'\n"; print " eeprom banner-name='Sun Enterprise 420R'\n"; print " eeprom banner-name='Netra t 1400/1405'\n"; print "Note: Netra t1400/1405 systems may also use the 'Sun Ultra 80 UPA/PCI' banner\n"; } if ($ultra eq "Sun Blade 1000" || $ultra eq "Sun Blade 2000" || $ultra eq "Sun Fire 280R" || $ultra eq "Netra 20") { print " eeprom banner-name='Sun-Blade-1000'\n"; print " eeprom banner-name='Sun Fire 280R'\n"; print " eeprom banner-name='Netra 20'\n"; print "Note: Netra 20 systems may also use the 'Sun-Blade-1000' banner\n"; } $exitstatus=1; } # # Check for possible memory detection errors by this program # if ($prtdiag_failed == 2) { &found_nonglobal_zone; $prtdiag_has_mem=0; } # prtdiag only available on SunOS $prtdiag_has_mem=0 if ($os ne "SunOS"); if (! $boardfound_mem && $prtdiag_has_mem) { print "WARNING: Memory should have been reported in the output from"; if ($prtdiag_cmd) { print "\n $prtdiag_cmd"; } else { if (-d '/usr/platform') { print " prtdiag,\n which was not found in /usr/platform/$machine/sbin"; } else { print " prtdiag."; } } print "\nERROR: prtdiag failed!" if ($prtdiag_failed); print "\n This system may be misconfigured, or may be"; print " missing software packages\n like SUNWpiclr,"; print " SUNWpiclu and SUNWpiclx, or may need the latest\n"; print " recommended Sun patches installed from"; print " http://sunsolve.sun.com/\n"; if ($ultra eq "Sun Fire V880") { print " This may be corrected by installing "; print "Sun patch 112186-19 or 119231-01 or later.\n"; } print " Check my website at $URL\n"; print " to get the latest version of memconf.\n"; $exitstatus=1; } if ($recognized == 0) { print "ERROR: Layout of memory ${sockettype}s not completely "; print "recognized on this system.\n"; $exitstatus=1; } if ($recognized < 0 && $os eq "SunOS") { if ($have_prtfru_details && $recognized == -3) { print "ERROR: Memory manufacturer not recognized.\n"; print " This is a bug in the Sun OBP or prtfru"; print " command, not a bug in memconf.\n"; } else { print "WARNING: Layout of memory ${sockettype}s not"; print " completely recognized on this system.\n"; } if ($model eq "Ultra-80" || $ultra eq 80 || $ultra eq "420R" || $ultra eq "Netra t140x") { if ($recognized == -1) { print " The memory configuration displayed is a guess which may be incorrect.\n"; if ($totmem eq 1024) { print " The 1GB of memory installed may be 4 256MB DIMMs populating bank 0,\n"; print " or 16 64MB DIMMs populating all 4 banks.\n"; } } print " This is a known bug due to Sun's 'prtconf', 'prtdiag' and 'prtfru'\n"; print " commands not providing enough detail for the memory layout of this\n"; print " SunOS $osrel $platform system to be accurately determined.\n"; print " This is a bug in Sun's OBP, not a bug in memconf. The latest OBP\n"; print " release (OBP 3.33.0 2003/10/07 from patch 109082-06) "; print (($totmem eq 1024) ? "still has this bug" : "should fix this"); print ".\n This system is using $romver\n"; $exitstatus=1; } if ($ultra eq "Sun Blade 1000" || $ultra eq "Sun Blade 2000" || $ultra eq "Sun Fire 280R" || $ultra eq "Netra 20") { # Do this if memory was not in the output of prtdiag if ($recognized == -2) { # Hack: If Sun Blade 1000 has 8GB of memory (maximum # allowed), then memory line was rewritten to show # memory stuffing. print " The memory configuration displayed should be"; print " correct though since this\n"; print " is a fully stuffed system.\n"; } else { print " The memory configuration displayed is a guess which may be incorrect.\n"; } } if ($ultra eq "T2000" || $ultra eq "T1000") { # Do this if memory was not in the output of prtdiag # Hack: If Sun Fire T2000 has 8GB or 16GB of memory or # if Sun Fire T1000 has 4GB or 8GB of memory, then it # may be 1 rank of DIMMs instead of default 2 ranks. print " The memory configuration displayed is a guess which may be incorrect.\n"; print " Base Sun configurations ship with two ranks of modules installed.\n"; print " This system may have one rank of " . $simmsizesfound[0]*2 . "MB DIMMs installed instead\n"; print " of two ranks of " . $simmsizesfound[0] . "MB DIMMs as shown.\n"; print " This is a known bug due to Sun's 'prtconf', 'prtdiag' and 'prtfru'\n"; print " commands not providing enough detail for the memory layout of this\n"; print " SunOS $osrel $platform system to be accurately determined.\n"; print " This is a Sun bug, not a bug in memconf.\n"; $exitstatus=1; } } if ($banner =~ /Netra t1\b/ || $ultra eq "Netra t1" || $model eq "Netra t1") { if ($totmem eq 1024) { print "WARNING: Cannot distinguish between four"; print " 370-4155 256MB mezzanine boards and\n"; print " two 512MB mezzanine boards.\n"; } if ($totmem eq 768) { print "WARNING: Cannot distinguish between three"; print " 370-4155 256MB mezzanine boards and\n"; print " one 512MB and one 256MB mezzanine boards.\n"; } } if ($installed_memory) { if ($installed_memory != $totmem) { print "ERROR: Total memory installed (${installed_memory}MB) "; print "does not match total memory found.\n"; $recognized=0; $exitstatus=1; } } if ($failed_memory) { print "ERROR: Failed memory (${failed_memory}MB) was detected.\n"; print " You should consider replacing the failed memory.\n"; $exitstatus=1; } if ($spare_memory) { print "NOTICE: Spare memory (${spare_memory}MB) was detected.\n"; print " You can configure the spare memory using the 'cfgadm' command.\n"; } &show_errors; if ($failed_fru) { print "ERROR: $failed_fru"; print " You should consider replacing the failed FRUs.\n"; $exitstatus=1; } &show_unrecognized if ($recognized == 0); if (! &is_virtualmachine) { if ($smbios_memory && &roundup_memory($smbios_memory) != $installed_memory) { print "ERROR: Memory found by smbios (${smbios_memory}MB) does not match memory found in $config_command (${installed_memory}MB).\n"; print " This may be corrected by installing a Sun BIOS patch on this system.\n"; $exitstatus=1; } if ($ipmi_memory && $ipmi_memory != $installed_memory) { print "ERROR: Memory found by ipmitool (${ipmi_memory}MB) does not match memory found in $config_command (${installed_memory}MB).\n"; print " This may be corrected by installing a Sun BIOS patch on this system.\n"; $exitstatus=1; } } # Tested on SunOS 4.X - 5.11 (Solaris 1.0 through Solaris 11) # Flag Future/Beta SunOS releases as untested if ($osrel =~ /^5.1[2-9]|^[6-9]/) { $untested=1; $untested_type="OS" if (! $untested_type); } # Flag untested CPU types: # US-IIIi+ (Serrano) if ($cputype =~ /UltraSPARC-IIIi\+/) { $untested=1; $untested_type="CPU" if (! $untested_type); } # SPARC-T4+, SPARC-T6 or newer if ($cputype =~ /SPARC-T([4-9]\+|[6-9])/) { $untested=1; $untested_type="CPU" if (! $untested_type); } # SPARC-M5, SPARC-M6 or other SPARC-M* if ($cputype =~ /SPARC.M\d\+/) { $untested=1; $untested_type="CPU" if (! $untested_type); } # SPARC-S* excluding SPARC-S7 if ($cputype =~ /SPARC.S\d\+/ && $cputype !~ /SPARC.S7\b/) { $untested=1; $untested_type="CPU" if (! $untested_type); } # SPARC64-VII++ or newer other than SPARC64-X if ($cputype =~ /SPARC64-(VII\+\+|VIII|IX|X)/ && $cputype !~ /SPARC64-X\b/) { $untested=1; $untested_type="CPU" if (! $untested_type); } # Dual-Core, Triple-Core, Quad-Core, Six-Core, Eight-Core, Ten-Core, # Twelve-Core, Fourteen-Core, Sixteen-Core, Eighteen-Core x86 CPUs # have been tested. Don't flag as untested CPU as of V3.14. # if ($isX86 && $corecnt !~ /^(1|2|3|4|6|8|10|12|14|16|18)$/) { # $untested=1; # $untested_type="CPU" if (! $untested_type); # } &show_untested if ($untested); &mailmaintainer if ($verbose == 3); &pdebug("exit $exitstatus"); exit $exitstatus; } sub createfile { $s=shift; push(@filelist, "$s"); open(OUTFILE, ">/tmp/$s") || die "can't open /tmp/$s: $!"; $tmp=0; foreach $line (@_) { print OUTFILE "$line"; print OUTFILE "\n" if ($line !~ /\n$/); $tmp++; } close(OUTFILE); print STDERR time . " created $tmp lines in $s\n" if ($debug); } sub b64encodefile { local($file)=@_; local($res)=""; local($chunk)=""; $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ' . 'abcdefghijklmnopqrstuvwxyz' . '0123456789+/'; $uuencode_alphabet=q|`!"#$%&'()*+,-./0123456789:;<=>?| . '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; # Build some strings for use in tr/// commands. # Some uuencodes use " " and some use "`", so we handle both. # We also need to protect backslashes and other special characters. $tr_uuencode=" " . $uuencode_alphabet; $tr_uuencode=~s/(\W)/\\$1/g; $tr_base64="A" . $base64_alphabet; $tr_base64=~s/(\W)/\\$1/g; $base64_pad='='; if (open(INFILE, "<$file")) { # break into chunks of 45 input chars, use perl's builtin # uuencoder to convert each chunk to uuencode format, # then kill the leading "M", translate to the base64 alphabet, # and finally append a newline. while (read(INFILE, $_, 45)) { if (length($_) == 45) { $chunk=substr(pack("u", $_), $[+1, 60); eval qq{ \$chunk =~ tr|$tr_uuencode|$tr_base64|; }; } else { # any leftover chars go onto a shorter line with # uuencode padding converted to base64 padding $chunk=substr(pack("u", $_), $[+1, int((length($_)+2)/3)*4 - (45-length($_))%3); eval qq{ \$chunk =~ tr|$tr_uuencode|$tr_base64|; }; $res .= $chunk . ($base64_pad x ((60 - length($chunk)) % 4)); } $res .= $chunk . "\n"; } close(INFILE); return($res); } else { return(""); } } sub mailmaintainer { # E-mail information of system to maintainer. Use system call to # sendmail instead of Mail::Send module so that this works for perl4 if (-x '/usr/sbin/sendmail') { $sendmail='/usr/sbin/sendmail'; } elsif (-x '/usr/lib/sendmail') { $sendmail='/usr/lib/sendmail'; } else { $sendmail=""; } if ($sendmail) { print "\nSending E-mail to memconf maintainer tschmidt\@micron.com"; print " with output of:\n memconf -d (seen above)\n"; &show_helpers(" "); print "\nIf this system cannot send E-mail to the internet, then please E-mail the\n"; print "following file to tschmidt\@micron.com as an attachment from a system that can:\n"; } else { print "\nPlease E-mail the following file as an attachment to tschmidt\@micron.com\n"; } # Rewrite fully-qualified hostnames so that attachment filename has # only one extension. $newhostname=$hostname; $newhostname=~s/\./_/g; $outfile="memconf_$newhostname"; print (" /tmp/${outfile}.tar\n"); if ($filename) { $mail_subj=($SUNWexplo) ? "Sun/Oracle Explorer directory $filename" : "filename $filename"; } else { $mail_subj="$hostname"; } $mail_subject="memconf output from $mail_subj"; close(STDOUT); rename("/tmp/memconf.output","/tmp/${outfile}.txt"); push(@filelist, "${outfile}.txt"); if ($config_cmd) { @config=&run("$config_cmd") if (! $config[0]); &createfile("${outfile}_${config_command}.txt",@config); } if ($os eq "SunOS") { &createfile("${outfile}_prtdiag.txt",@prtdiag) if ($prtdiag_exec); &createfile("${outfile}_prtfru.txt",@prtfru) if ($prtfru_cmd); &createfile("${outfile}_prtpicl.txt",@prtpicl) if ($prtpicl_cmd); &createfile("${outfile}_psrinfo.txt",@psrinfo) if ($psrinfo_cmd); &createfile("${outfile}_virtinfo.txt",@virtinfo) if ($virtinfo_cmd); &createfile("${outfile}_cfgadm.txt",@cfgadm) if ($cfgadm_cmd); &createfile("${outfile}_smbios.txt",@smbios) if ($smbios_cmd); &createfile("${outfile}_kstat.txt",@kstat) if ($kstat_cmd); &createfile("${outfile}_ldm.txt",@ldm) if ($ldm_cmd); } &createfile("${outfile}_cpuinfo.txt",@cpuinfo) if (-r '/proc/cpuinfo'); &createfile("${outfile}_meminfo.txt",@meminfo) if (-r '/proc/meminfo'); &createfile("${outfile}_free.txt",@free) if ($free_cmd); &createfile("${outfile}_xm_info.txt",@xm_info) if ($xm_info_cmd); if (-x '/usr/bin/xenstore-ls') { $domid=&mychomp(`/usr/bin/xenstore-read domid 2>/dev/null`); if ($domid) { @xenstore=`/usr/bin/xenstore-ls /local/domain/$domid 2>/dev/null`; &createfile("${outfile}_xenstore-ls.txt",@xenstore); } } &createfile("${outfile}_decodedimms.txt",@decodedimms) if ($decodedimms_cmd); &createfile("${outfile}_ipmitool.txt",@ipmitool) if ($ipmitool_cmd); if ($os eq "HP-UX") { &createfile("${outfile}_machinfo.txt",@machinfo) if (-x '/usr/contrib/bin/machinfo'); } `cd /tmp; tar cf /tmp/${outfile}.tar @filelist 2>/dev/null`; if ($sendmail) { # Make MIME attachment using sendmail open(MAIL, "|$sendmail -t"); print MAIL "To: tschmidt\@micron.com\n"; print MAIL "Subject: $mail_subject\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-Type: multipart/mixed; boundary=\"memconf_UNIQUE_LINE\"\n"; print MAIL "\n"; print MAIL "This is a multi-part message in MIME format.\n"; print MAIL "--memconf_UNIQUE_LINE\n"; print MAIL "Content-Type: text/plain; charset=\"ISO-8859-1\"; format=flowed\n"; print MAIL "\n"; print MAIL "Attached is output and regression test files from memconf $version $version_date from $mail_subj\n\n"; open(FILE, "/tmp/${outfile}.txt"); @tmp=<FILE>; close(FILE); print MAIL @tmp; print MAIL "\n--memconf_UNIQUE_LINE\n"; print MAIL "Content-Type: application/octet-stream; name=\"${outfile}.tar\"\n"; print MAIL "Content-Transfer-Encoding: base64\n"; print MAIL "Content-Disposition: attachment; filename=\"${outfile}.tar\"\n"; print MAIL "\n"; print MAIL &b64encodefile("/tmp/${outfile}.tar"); print MAIL "--memconf_UNIQUE_LINE--\n"; close(MAIL); } foreach $tmp (@filelist) { unlink "/tmp/$tmp"; } } ���������������������������������������������������������������UnixAgent-2.10.0/ocsinventory-agent�����������������������������������������������������������������0000775�0000000�0000000�00000022162�14323200667�0017266�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell #Copyright (C) 2006-2016 OCS Inventory Developers # #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. # use strict; use warnings; my $devlib; foreach (@ARGV) { if (/^--devlib$/) { print "[info] --devlib are found, Developer mode enabled\n"; eval "use lib 'lib';"; } } eval "use Ocsinventory::Agent;"; if ($@) { print "Failed to load Ocsinventory::Agent, $@\n"; print "you can run the agent directly for its source directory "; print "with --devlib\n"; exit 1; } eval "Ocsinventory::Agent::run();"; print $@; __END__ =head1 NAME ocsinventory-agent - Unified client for OCS-Inventory =head1 SYNOPSIS B<ocsinventory-agent> S<[ B<-fhilpruw> ]> S<[ I<--server server> | I<--local /tmp> ]>... =head1 EXAMPLES % ocsinventory-agent --server localhost # send an inventory to the OCS server % ocsinventory-agent --server http://localhost/ocsinventory2 # send an inventory over http to a server with a non standard # virtual directory % ocsinventory-agent --server https://localhost/ocsinventory # send an inventory over https to the OCS server % ocsinventory-agent --local /tmp # write an inventory in the /tmp directory % ocsinventory-agent --server localhost --user=toto --password=pw --realm="Restricted Area" # send a report to a server protected by a basic authentication % ocsinventory-agent --lazy # send an inventory only if the a random delay between 0 and PROLOG_FREQ had been run over. % ocsinventory-agent --delaytime 60 -d # If NO PROLOG_FREQ has been preset, pick a time between execution and --delaytime for the agent to contact the server [default is 3600 seconds] =head1 DESCRIPTION F<ocsinventory-agent> creates inventory and send or write them. This agent is the successor of the former linux_agent which was released with OCS 1.01 and prior. It also replaces the Solaris/AIX/BSD unofficial agents. The detailed list of supported Operating System is available in the Wiki. =over 4 =item F<GNU/Linux> =item F<Solaris> =item F<FreeBSD> =item F<NetBSD> =item F<OpenBSD> =item F<AIX> =item F<MacOSX> =item F<GNU/kFreeBSD> =back =head1 OPTIONS Most of the options are available in a I<short> form and a I<long> form. For example, the two lines below are all equivalent: % ocsinventory-agent -s localhost % ocsinventory-agent --server localhost =over 4 =item B<--backend-collect-timeout=SECONDS_BEFORE_KILL> Time before OCS kills modules processing which don't end before the timeout. =item B<--basevardir>=I<DIR> Indicate the place where the agent should store its files. =item B<-d>, B<--daemon> Launch ocsinventory-agent in background. Proc::Daemon is needed. =item B<--debug> Turn the debug mode on. =item B<--devlib> This option is designed for backend module developer. With it enabled, ocsinventry-agent won't try to load the Backend module installed on the system. Instead it will scan the ./lib directory. =item B<--delaytime=SECONDS_TO_WAIT> This option defaults to waiting a random() time between 0 and 3600 before initially contacting the server assuming NO PROLOG_FREQ has been set. Once PROLOG_FREQ has been set, it uses that number at the top end of it's random setting. Useful for pre-setting a deployed agent's initial start time (so you don't jam the server all at once, but don't have to wait an hour to make sure the deployment worked). =item B<-f>, B<--force> The agent will first contact the server during the PROLOG period. If the server doesn't know the machine or has outdated information, it will ask for an inventory. With this option, the agent doesn't run the PROLOG with the server first but directly sends an inventory. =item B<-i>, B<--info> Turn the verbose mode on. The flag is ignored if B<--debug> is enable. =item B<--lazy> Do not contact the server more than one time during the PROLOG_FREQ and do an exit if there is nothing to do. Useful if you want to start the agent script regulary from the crontab but don't want to overload the server. =item B<-l>, B<--local>=I<DIR> Write an inventory in the I<DIR> directory. A new file will be created if needed. =item B<--logfile>=I<FILE> Log message in I<FILE> and turn off STDERR =item B<-p>, B<--password>=I<PASSWORD> Use I<PASSWORD> for an HTTP identification with the server. =item B<-P>, B<--proxy>=I<PROXY> Use I<PROXY> to specify a proxy HTTP server. By default, the agent uses HTTP_PROXY environment variable. =item B<-r>, B<--realm>=I<REALM> Use I<REALM> for an HTTP identification with the server. For example, the value can be 'Restricted Area'. You can find it in the login popup of your Internet browser. =item B<-s>, B<--server>=I<URI> The uri of the server. If I<URI> doesn't start with http:// or https://, the assume the parameter is a hostname and rewrite it like that: % http://servername/ocsinventory If you want to use https or another virtual directory you need to enter the full path. B<--server> is ignored if B<--local> is in use. =item B<--stdout> Print the inventory on stdout. % ocsinventory-agent --stdout > /tmp/report.xml # prepare an inventory and write it in the /tmp/report.xml file. # A file will be created. =item B<--scan-homedirs> Authorized OCS to scan home directories to increase the Virtual Machine inventory. WARNING: beware with user privacy by using this option because it may encounter private data scans (even if it's not designed for !). =item B<--ssl>=I<0|1> Check SSL communications using a certificate. Set to 0 if you want to disable certificate check or 1 to enable (needs CA certificates file path in this case) . Default is set to 1. =item B<--ca>=I<FILE> Path to CA certificates file in PEM format, for server SSL certificate validation. Set to <your server configuration directory>/cacert.pem by default. =item B<--tag>=I<TAG> Mark the machine with the I<TAG> tag. Once the initial inventory is accepted by the server this value is ignored and you've to change the information directly on the server. The server do so in order to centralize the administration of the machine. =item B<-u> I<USER>, B<--user>=I<USER> Use I<USER> for the server authentication. =item B<--version>=I<USER> Print the version and exit. =item B<-w> I<DURATION>, B<--wait>=I<DURATION> Wait before initializing the connexion with the server. If I<DURATION> equal I<server> the agent will use the PROLOG_FREQ of the server to determine the duration of this periode. Exactly like it would had done if it was in --daemon mode. Else if duration is a numerical value, it will be used directly. % ocsinventory-agent --wait 5 --server localhost =item B<--nosoftware> Do not inventory the software installed on the machine. B<--nosoft> also works but is deperecated. =item B<--nolocal> Deactivate local mode even if it is set in config file or command line =back =head1 CONFIG FILE The agent try to initialize the settings from the B<ocsinventory-agent.cfg> config file. It looks for the file in these directories: =over =item /etc/ocsinventory =item /usr/local/etc/ocsinventory =item /etc/ocsinventory-agent =back =head1 AUTHORS The maintainer is Guillaume PROTET <guillaume.protet@mortheres.info> Please read the AUTHORS, Changes and THANKS files to see who is behind OCS Inventory Agent. =head1 SEE ALSO =over 4 =item OCS-Inventory website, http://www.ocsinventory-ng.org/ =item LaunchPad project page, http://launchpad.net/ocsinventory-unix-agent =item forum, http://forums.ocsinventory-ng.org/ =item and wiki http://wiki.ocsinventory-ng.org/ =back =head1 BUGS Please, use the forum as much as possible. You can open your own bug tickets. Patches are welcome. You can also use LaunchPad bugtracker or push your Bazaar branch on LaunchPad and do a merge request. =head1 COPYRIGHT Copyright (C) 2006-2016 OCS Inventory contributors 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 =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/postinst.pl������������������������������������������������������������������������0000775�0000000�0000000�00000045567�14323200667�0015743�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w use strict; use lib 'lib'; use Cwd; use MIME::Base64; use Ocsinventory::Agent::Config; my $old_unix_agent_dir = "/etc/ocsinventory-client"; my $config; my @cacert; my $binpath; my $randomtime; my $crontab; my $cron_line; my $option; my $nowizard; my $configdir; my $remove_old_unix; my $old_unix_config; my $nossl; my $download; my $snmp; my $now; my $nosoftware; for $option (@ARGV){ if ($option=~/--nowizard$/){ $nowizard = 1; } elsif($option=~/--server=(\S*)$/){ $config->{server} = $1; } elsif($option=~/--basevardir=(\S*)$/){ $config->{basevardir} = $1; } elsif($option=~/--configdir=(\S*)$/){ $configdir = $1; } elsif($option=~/--user=(\S*)$/){ $config->{user} = $1; } elsif($option=~/--password=(\S*)$/){ $config->{password} = $1; } elsif($option=~/--realm=(\S*)$/){ $config->{realm} = $1; } elsif($option=~/--tag=(\S*)$/){ $config->{tag} = $1; } elsif($option=~/--crontab$/){ $crontab = 1; } elsif($option=~/--get-old-unix-agent-config$/){ $old_unix_config = 1; } elsif($option=~/--remove-old-unix-agent$/){ $remove_old_unix = 1; } elsif($option=~/--debug$/){ $config->{debug} = 1; } elsif($option=~/--logfile=(\S*)$/){ $config->{logfile} = $1; } elsif($option=~/--nossl$/){ $nossl = 1; } elsif($option=~/--ca=(\S*)$/){ $config->{ca} = $1; } elsif($option=~/--download$/){ $download = 1; } elsif($option=~/--nosoftware$/){ $nosoftware = 1; } elsif($option=~/--snmp$/){ $config->{snmp} = 1; } elsif($option=~/--now$/){ $now = 1; } elsif($option=~/--help/ || $option=~/-h/) { print STDERR <<EOF; Usage : \t--nowizard launch this script without interaction \t--server=url set OCS Inventory NG server address (e.g: http://ocsinventory-ng/ocsinventory) \t--basevardir=path set OCS Inventory NG Unix Unified agent variables directory (e.g: /var/lib/ocsinventory-agent) \t--configdir=path set OCS Inventory NG Unix Unified configuration directory (e.g: /etc/ocsinventory-agent) \t--user=username set username for OCS Inventory server Apache authentication (if needed) \t--password=password set password for OCS Inventory NG server Apache authentication (if needed) \t--realm=realm set realm name for OCS Inventory NG server Apache authentication (if needed) \t--crontab set a crontab while installing OCS Inventory NG Unix Unified agent \t--get-old-unix-agent-config retrieve old OCS Inventory NG Unix agent configuration (if needed) \t--remove-old-unix-agent remove old OCS Inventory NG Unix agent from system (if needed) \t--debug activate debug mode configuration option while installing OCS Inventory NG Unix Unified agent \t--logfile=path set OCS Inventory NG Unix Unified agent log file path (if needed) \t--nossl disable SSL CA verification configuration option while installing OCS Inventory NG Unix Unified agent (not recommended) \t--ca=path set OCS Inventory NG Unix Unified agent CA certificates file path \t--nosoftware disable software inventory \t--download activate package deployment feature while installing OCS Inventory NG Unix Unified agent \t--snmp activate SNMP scans feature while installing OCS Inventory NG Unix Unified agent \t--now launch OCS Inventory NG Unix Unified agent after installation \t-h --help display this help EOF exit 0; } } loadModules (qw/XML::Simple ExtUtils::MakeMaker/); ############ Setting default values ############ my @default_configdirs = ("/etc/ocsinventory", "/usr/local/etc/ocsinventory", "/etc/ocsinventory-agent"); unless ($config->{basevardir}) { if ($^O =~ /solaris/) { $config->{basevardir} = '/var/opt/ocsinventory-agent'; } elsif ($^O =~ /bsd/) { $config->{basevardir} = '/var/db/ocsinventory-agent'; } else { $config->{basevardir} = '/var/lib/ocsinventory-agent'; } } # Default value of SNMP timeout unless ($config->{snmptimeout}) { $config->{snmptimeout} = 3; } # Default value of SNMP retry unless ($config->{snmpretry}) { $config->{snmpretry} = 2; } ############ Asking for questions ############## unless ($nowizard) { if (!ask_yn("Do you want to configure the agent?", 'y')) { exit 0; } unless ($configdir) { $configdir = getConfigDir (@default_configdirs); #If not found unless (-d $configdir) { $configdir = askConfigDir (@default_configdirs); unless (-d $configdir) { unless (ask_yn ("Do you want to create the directory ".$configdir."?", 'y')) { die("Please create ".$configdir." directory first.\n"); } } } } #Old unix agent if (ask_yn("Should the old unix_agent settings be imported?", 'y')) { $old_unix_config=1; } #Getting agent configuration if exists if (-f $configdir."/ocsinventory-agent.cfg") { open (CONFIG, "<".$configdir."/ocsinventory-agent.cfg") or die "Can't open ".$configdir."/ocsinventory-agent.cfg: ".$!; foreach (<CONFIG>) { s/#.+//; if (/(\w+)\s*=\s*(.+)/) { my $key = $1; my $val = $2; # Remove the quotes $val =~ s/\s+$//; $val =~ s/^'(.*)'$/$1/; $val =~ s/^"(.*)"$/$1/; $config->{$key} = $val unless $config->{$key}; } } close CONFIG; } #Getting server name print "[info] The config file will be written in $configdir/ocsinventory-agent.cfg,\n"; $config->{server} = promptUser('What is the address of your ocs server',$config->{server}); #$config->{server} = promptUser('What is the address of your ocs server', exists ($config->{server})?$config->{server}:'ocsinventory-ng'); #Getting credentials if needed if (ask_yn ("Do you need credential for the server? (You probably don't)", 'n')) { $config->{user} = promptUser("user", $config->{user}); $config->{user} = MIME::Base64::encode_base64($config->{user}); $config->{password} = promptUser("password"); $config->{password} = MIME::Base64::encode_base64($config->{password}); print "[info] The realm can be found in the login popup of your Internet browser.\n[info] In general, it's something like 'Restricted Area'.\n"; $config->{realm} = promptUser("realm"); } #Getting tag unless ($config->{tag}){ if (ask_yn('Do you want to apply an administrative tag on this machine?', 'y')) { $config->{tag} = promptUser("tag", $config->{tag}); } } #Getting crontab if ($^O =~ /solaris/ || $^O =~ /bsd/) { if (ask_yn("Do yo want to install the cron task in current user crontab?", 'y')) { $crontab = 1; } } elsif (-d "/etc/cron.d") { if (ask_yn("Do yo want to install the cron task in /etc/cron.d?", 'y')) { $crontab = 1; } } #Getting basevardir $config->{basevardir} = promptUser('Where do you want the agent to store its files? (You probably don\'t need to change it)', $config->{basevardir}, '^\/\w+', 'The location must begin with /'); unless (-d $config->{basevardir}) { unless (ask_yn ("Do you want to create the ".$config->{basevardir}." directory?\n", 'y')) { die("Please create the ".$config->{basevardir}." directory manually and relaunch postinst.pl script\n"); } } #Remove old unix agent ? $remove_old_unix = ask_yn ("Should I remove the old unix_agent?", 'n') unless $remove_old_unix; #Enable debug option ? $config->{debug} = ask_yn("Do you want to activate debug configuration option?", 'y') unless $config->{debug}; #Enable log file ? unless ($config->{logfile}) { if (ask_yn("Do you want to use OCS Inventory NG UNix Unified agent log file?", 'y')){ $config->{logfile} = promptUser('Specify log file path you want to use', $config->{logfile}, '^\/\w+', 'The location must begin with /'); } } #Disable SSL option ? unless ($nossl) { $nossl = ask_yn("Do you want disable SSL CA verification configuration option (not recommended)?", 'n'); } #Set CA certificates file path ? unless ($config->{ca}) { if (ask_yn("Do you want to set CA certificates file path?", 'y')){ $config->{ca} = promptUser('Specify CA certificates file path', $config->{ca}, '^\/\w+', 'The location must begin with /'); } } #Disable software inventory ? unless ($nosoftware) { $nossl = ask_yn("Do you want disable software inventory?", 'n'); } #Enable download feature ? $download = ask_yn("Do you want to use OCS-Inventory software deployment feature?", 'y') unless $download; #Enable SNMP feature ? $config->{snmp} = ask_yn("Do you want to use OCS-Inventory SNMP scans feature?", 'y') unless $config->{snmp}; #Run agent after configuration ? $now = ask_yn("Do you want to send an inventory of this machine?", 'y') unless $now; } ################ Here we go... ############## #Old unix agent if (-f $old_unix_agent_dir.'/ocsinv.conf' && $old_unix_config) { print STDERR "Getting old OCS Inventory NG Unix agent configuration...\n"; my $ocsinv = XMLin($old_unix_agent_dir.'/ocsinv.conf'); $config->{server} = mkFullServerUrl($ocsinv->{'OCSFSERVER'}); if (-f $old_unix_agent_dir.'/cacert.pem') { open CACERT, $old_unix_agent_dir.'/cacert.pem' or die "Can't import the CA certificate: ".$!; @cacert = <CACERT>; close CACERT; } my $admcontent = ''; if (-f "$old_unix_agent_dir/ocsinv.adm") { if (!open(ADM, "<:encoding(iso-8859-1)", "$old_unix_agent_dir/ocsinv.adm")) { warn "Can't open $old_unix_agent_dir/ocsinv.adm"; } else { $admcontent .= $_ foreach (<ADM>); close ADM; my $admdata = XMLin($admcontent) or die; if (ref ($admdata->{ACCOUNTINFO}) eq 'ARRAY') { foreach (@{$admdata->{ACCOUNTINFO}}) { $config->{tag} = $_->{KEYVALUE} if $_->{KEYNAME} =~ /^TAG$/; } } elsif ( exists($admdata->{ACCOUNTINFO}->{KEYNAME}) && exists($admdata->{ACCOUNTINFO}->{KEYVALUE}) && $admdata->{ACCOUNTINFO}->{KEYNAME} eq 'TAG' ){ print $admdata->{ACCOUNTINFO}->{KEYVALUE}."\n"; $config->{tag} = $admdata->{ACCOUNTINFO}->{KEYVALUE}; } } } } #Setting server uri print STDERR "Setting OCS Inventory NG server address...\n"; $config->{server}="ocsinventory-ng" unless $config->{server}; $config->{server} = mkFullServerUrl($config->{server}); if (!$config->{server}) { print "Server is empty. Leaving...\n"; exit 1; } my $uri; if ($config->{server} =~ /^http(|s):\/\//) { $uri = $config->{server}; } else { # just the hostname $uri = "http://".$config->{server}."/ocsinventory" } #Is OCS agent well installed ? print STDERR "Looking for OCS Invetory NG Unix Unified agent installation...\n"; chomp($binpath = `which ocsinventory-agent 2>/dev/null`); if (! -x $binpath) { # Packaged version with perl and agent ? $binpath = $^X; $binpath =~ s/perl/ocsinventory-agent/; } if (! -x $binpath) { print "sorry, can't find ocsinventory-agent in \$PATH\n"; exit 1; } else { print "ocsinventory agent presents: $binpath\n"; } #Setting crontab $randomtime = int(rand(60)).' '.int(rand(24)); $cron_line = $randomtime." * * * root $binpath --lazy > /dev/null 2>&1\n"; if ($crontab) { print STDERR "Setting crontab...\n"; if ($^O =~ /solaris/ || $^O =~ /bsd/) { my $cron = `crontab -l`; # Let's suppress Unix cron/anacron user column $cron_line =~ s/ root / /; $cron .= $cron_line; open CRONP, "| crontab" || die "Can't run crontab: $!"; print CRONP $crontab; close(CRONP); } elsif (-d "/etc/cron.d") { open DEST, '>/etc/cron.d/ocsinventory-agent' or die $!; # Save the root PATH print DEST "PATH=".$ENV{PATH}."\n"; print DEST $randomtime." * * * root $binpath --lazy > /dev/null 2>&1\n"; close DEST; } } #Creating basevardir if (!-d $config->{basevardir}) { print STDERR "Creating $config->{basevardir} directory...\n"; mkdir $config->{basevardir} or die $!; } #Disabling SSL verification if asked $config->{ssl} = 0 if $nossl; #Disabling software inventory if ($nosoftware) { $config->{nosoftware} = 1; } else { $config->{nosoftware} = 0; } #Creating configuration directory $configdir = "/etc/ocsinventory-agent" unless $configdir; #If not set in command line if (grep (/$configdir/,@default_configdirs)) { $configdir = '/etc/ocsinventory-agent' unless $configdir; print STDERR "Creating $configdir directory...\n"; unless (-d $configdir) { unless (mkdir $configdir) { die("Failed to create ".$configdir.". Are you root?\n"); } } print STDERR "Writing OCS Inventory NG Unix Unified agent configuration\n"; open CONFIG, ">$configdir/ocsinventory-agent.cfg" or die "Can't write the config file in $configdir: ".$!; print CONFIG $_."=".$config->{$_}."\n" foreach (keys %$config); close CONFIG; chmod 0600, "$configdir/ocsinventory-agent.cfg"; } else { die("Wrong configuration directory...please choose a directory supported by OCS Inventory NG agent !!!\n"); } #Removing old unix agent if needed if ($remove_old_unix) { print STDERR "Removing old OCS Inventory Unix agent...\n"; foreach (qw# /etc/ocsinventory-client /etc/logrotate.d/ocsinventory-client /usr/sbin/ocsinventory-client.pl /etc/cron.d/ocsinventory-client /bin/ocsinv #) { print $_."\n"; next; rmdir if -d; unlink if -f || -l; } print "done\n" } # Creating vardirectory for this server my $dir = $config->{server}; $dir =~ s/\//_/g; my $vardir = $config->{basevardir}."/".$dir; print STDERR "Creating $vardir directory...\n"; recMkdir($vardir) or die "Can't create $vardir!"; if (@cacert) { # we need to migrate the certificate print STDERR "Copying cacert.pem in $vardir...\n"; open CACERT, ">".$vardir."/cacert.pem" or die "Can't open ".$vardir.'/cacert.pem: '.$!; print CACERT foreach (@cacert); close CACERT; print "Certificate copied in ".$vardir."/cacert.pem\n"; } #We copy custom XML for SNMP MIBs from sources my $workdir = getcwd(); my $source_snmpdir = "$workdir/snmp"; my $snmpdir = "$vardir/snmp"; if ( -d $source_snmpdir && -d $vardir) { unless (-d $snmpdir) { print STDERR "Creating $snmpdir directory...\n"; recMkdir($snmpdir) or die "Can't create $snmpdir!"; } print STDERR "Copying SNMP MIBs XML files...\n"; system("cp -r $source_snmpdir/* $snmpdir"); } print STDERR "Activating modules if needed...\n"; open MODULE, ">$configdir/modules.conf" or die "Can't write modules.conf in $configdir: ".$!; print MODULE "# this list of module will be load by the at run time\n"; print MODULE "# to check its syntax do:\n"; print MODULE "# #perl modules.conf\n"; print MODULE "# You must have NO error. Else the content will be ignored\n"; print MODULE "# This mechanism goal is to launch agent extension modules\n"; print MODULE "\n"; print MODULE ($download?'':'#'); print MODULE "use Ocsinventory::Agent::Modules::Download;\n"; print MODULE ($config->{snmp}?'':'#'); print MODULE "use Ocsinventory::Agent::Modules::SnmpScan;\n"; print MODULE "\n"; print MODULE "# DO NOT REMOVE THE 1;\n"; print MODULE "1;\n"; close MODULE; #Prevent security risks by removing existing snmp_com.txt file which is no longer used my $snmp_com_file = "$snmpdir/snmp_com.txt"; if ( -f $snmp_com_file ) { print STDERR "$snmp_com_file seems to exists...removing it to prevent security risks !\n"; unlink $snmp_com_file; } # Launch agent if asked if ($now) { print STDERR "Launching OCS Inventory NG Unix Unified agent...\n"; system("$binpath --force"); if (($? >> 8)==0) { print " -> Success!\n"; } else { print " -> Failed!\n"; print "You may want to launch the agent with the --verbose or --debug flag.\n"; } } #End print "New settings written! Thank you for using OCS Inventory\n"; ######## Subroutines ################ sub loadModules { my @modules = @_; foreach (@modules) { eval "use $_;"; if ($@) { print STDERR "Failed to load $_. Please install it and restart the postinst.pl script ( ./postinst.pl ).\n"; exit 1; } } } sub ask_yn { my $promptUser = shift; my $default = shift; die unless $default =~ /^(y|n)$/; my $cpt = 5; while (1) { my $line = prompt("$promptUser\nPlease enter 'y' or 'n'?>", $default); return 1 if $line =~ /^y$/; return if $line =~ /^n$/; if ($cpt-- < 0) { print STDERR "too much user input, exit...\n"; exit(0); } } } sub promptUser { my ($promptUser, $default, $regex, $notice) = @_; my $string = $promptUser; $string .= "?>"; my $line; my $cpt = 5; while (1) { $line = prompt($string, $default); if ($regex && $line !~ /$regex/) { print STDERR $notice."\n"; } else { last; } if ($cpt-- < 0) { print STDERR "too much user input, exit...\n"; exit(0); } } return $line; } sub getConfigDir { my @choices = @_; foreach (@choices) { my $t = $_.'/ocsinventory-agent.cfg'; if (-f $t) { print "Config file found are $t! Reusing it.\n"; return $_; } } } sub askConfigDir { my @choices = @_; print STDERR "Where do you want to write the configuration file?\n"; foreach (0..$#choices) { print STDERR " ".$_." -> ".$choices[$_]."\n"; } my $input = -1; my $configdir; while (1) { $input = prompt("?>"); if ($input =~ /^\d+$/ && $input >= 0 && $input <= $#choices) { last; } else { print STDERR "Value must be between 0 and ".$#choices."\n"; } } return $choices[$input]; } sub recMkdir { my $dir = shift; my @t = split /\//, $dir; shift @t; return unless @t; my $t; foreach (@t) { $t .= '/'.$_; if ((!-d $t) && (!mkdir $t)) { return; } } 1; } sub mkFullServerUrl { my $server = shift; my $ret = 'http://' unless $server =~ /^http(s|):\/\//; $ret .= $server; if ($server !~ /http(|s):\/\/\S+\/\S+/) { $ret .= '/ocsinventory'; } return $ret; } �����������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0015511�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/�����������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0017154�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/cpuinfo-vmware-esx�����������������������������������������������0000664�0000000�0000000�00000000000�14323200667�0022624�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-686-1������������������������������������������������������0000664�0000000�0000000�00000001134�14323200667�0020714�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 13 model name : Intel(R) Pentium(R) M processor 1.73GHz stepping : 8 cpu MHz : 1729.038 cache size : 2048 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss tm pbe nx bts est tm2 bogomips : 3462.27 clflush size : 64 power management: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-alpha-1����������������������������������������������������0000664�0000000�0000000�00000001550�14323200667�0021460�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cpu : Alpha cpu model : EV68CB cpu variation : 7 cpu revision : 0 cpu serial number : JA30502089 system type : Titan system variation : Privateer system revision : 0 system serial number : AY31001636 cycle frequency [Hz] : 1250000000 timer frequency [Hz] : 1024.00 page size [bytes] : 8192 phys. address bits : 44 max. addr. space # : 255 BogoMIPS : 2484.04 kernel unaligned acc : 0 (pc=0,va=0) user unaligned acc : 0 (pc=0,va=0) platform string : AlphaServer ES45 Model 3B cpus detected : 3 cpus active : 3 cpu active mask : 0000000000000007 L1 Icache : 64K, 2-way, 64b line L1 Dcache : 64K, 2-way, 64b line L2 cache : n/a L3 cache : n/a ��������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-armel-1����������������������������������������������������0000664�0000000�0000000�00000001130�14323200667�0021465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Processor : XScale-80219 rev 0 (v5l) BogoMIPS : 593.10 Features : swp half fastmult edsp CPU implementer : 0x69 CPU architecture: 5TE CPU variant : 0x0 CPU part : 0x2e3 CPU revision : 0 Cache type : undefined 5 Cache clean : undefined 5 Cache lockdown : undefined 5 Cache format : Harvard I size : 32768 I assoc : 32 I line length : 32 I sets : 32 D size : 32768 D assoc : 32 D line length : 32 D sets : 32 Hardware : Thecus N2100 Revision : 0000 Serial : 0000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-ia64-1�����������������������������������������������������0000664�0000000�0000000�00000001033�14323200667�0021132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������processor : 0 vendor : GenuineIntel arch : IA-64 family : Itanium 2 model : 2 revision : 1 archrev : 0 features : branchlong cpu number : 0 cpu regs : 4 cpu MHz : 1600.000009 itc MHz : 1600.009464 BogoMIPS : 2392.06 siblings : 1 processor : 1 vendor : GenuineIntel arch : IA-64 family : Itanium 2 model : 2 revision : 1 archrev : 0 features : branchlong cpu number : 0 cpu regs : 4 cpu MHz : 1600.000009 itc MHz : 1600.009464 BogoMIPS : 2392.06 siblings : 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-mips-1�����������������������������������������������������0000664�0000000�0000000�00000000644�14323200667�0021346�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������system type : SGI Indigo2 processor : 0 cpu model : R4400SC V5.0 FPU V0.0 BogoMIPS : 74.75 wait instruction : no microsecond timers : yes tlb_entries : 48 extra interrupt vector : no hardware watchpoint : yes ASEs implemented : shadow register sets : 1 VCED exceptions : 640580539 VCEI exceptions : 9972559 ��������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-ppc-1������������������������������������������������������0000664�0000000�0000000�00000000406�14323200667�0021154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������processor : 0 cpu : 604r clock : ??? revision : 49.2 (pvr 0009 3102) bogomips : 299.00 machine : PReP Utah (Powerstack II Pro4000) l2 cache : 512KiB, parity disabled SRAM:synchronous, pipelined, no parity ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-ppc-2������������������������������������������������������0000664�0000000�0000000�00000000427�14323200667�0021160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������processor : 0 cpu : POWER4+ (gq) clock : 1452.000000MHz revision : 2.1 processor : 1 cpu : POWER4+ (gq) clock : 1452.000000MHz revision : 2.1 timebase : 181495202 machine : CHRP IBM,7029-6C3 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/cpuinfo/linux-sparc-1����������������������������������������������������0000664�0000000�0000000�00000000615�14323200667�0021504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cpu : TI UltraSparc IIIi (Jalapeno) fpu : UltraSparc IIIi integrated FPU prom : OBP 4.13.2 2004/03/29 10:11 type : sun4u ncpus probed : 2 ncpus active : 2 D$ parity tl1 : 0 I$ parity tl1 : 0 Cpu0ClkTck : 000000003bb94e80 Cpu1ClkTck : 000000003bb94e80 MMU Type : Cheetah+ State: CPU0: online CPU1: online �������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode-freebsd-6.2����������������������������������������������������0000664�0000000�0000000�00000014471�14323200667�0021273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.8 SMBIOS 2.3 present. 25 structures occupying 643 bytes. Table at 0x000F0800. Handle 0x0000, DMI type 1, 25 bytes System Information Manufacturer: Product Name: Version: Serial Number: UUID: Not Present Wake-up Type: Power Switch Handle 0x0001, DMI type 2, 8 bytes Base Board Information Manufacturer: Product Name: CN700-8237R Version: Serial Number: Handle 0x0002, DMI type 3, 17 bytes Chassis Information Manufacturer: Type: Desktop Lock: Not Present Version: Serial Number: Asset Tag: Boot-up State: Unknown Power Supply State: Unknown Thermal State: Unknown Security Status: Unknown OEM Information: 0x00000000 Handle 0x0003, DMI type 4, 35 bytes Processor Information Socket Designation: NanoBGA2 Type: Central Processor Family: Other Manufacturer: VIA ID: A9 06 00 00 FF BB C9 A7 Version: VIA C7 Voltage: 1.1 V External Clock: 100 MHz Max Speed: 2000 MHz Current Speed: 2000 MHz Status: Populated, Enabled Upgrade: None L1 Cache Handle: 0x0006 L2 Cache Handle: 0x0007 L3 Cache Handle: Not Provided Serial Number: Asset Tag: Part Number: Handle 0x0004, DMI type 5, 18 bytes Memory Controller Information Error Detecting Method: None Error Correcting Capabilities: None Supported Interleave: Eight-way Interleave Current Interleave: Four-way Interleave Maximum Memory Module Size: 1024 MB Maximum Total Memory Size: 1024 MB Supported Speeds: 70 ns 60 ns Supported Memory Types: DIMM SDRAM Memory Module Voltage: 2.9 V Associated Memory Slots: 1 0x0005 Enabled Error Correcting Capabilities: None Handle 0x0005, DMI type 6, 12 bytes Memory Module Information Socket Designation: A0 Bank Connections: 0 Current Speed: 37 ns Type: Other Installed Size: 512 MB (Single-bank Connection) Enabled Size: 512 MB (Single-bank Connection) Error Status: OK Handle 0x0006, DMI type 7, 19 bytes Cache Information Socket Designation: Internal Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 32 KB Maximum Size: 32 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: 4-way Set-associative Handle 0x0007, DMI type 7, 19 bytes Cache Information Socket Designation: Internal Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: External Installed Size: 0 KB Maximum Size: 0 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x0008, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: PRIMARY IDE Internal Connector Type: On Board IDE External Reference Designator: Not Specified External Connector Type: None Port Type: Other Handle 0x0009, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: SECONDARY IDE Internal Connector Type: On Board IDE External Reference Designator: Not Specified External Connector Type: None Port Type: Other Handle 0x000A, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: FDD Internal Connector Type: On Board Floppy External Reference Designator: Not Specified External Connector Type: None Port Type: 8251 FIFO Compatible Handle 0x000B, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: COM1 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16450 Compatible Handle 0x000C, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: COM2 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16450 Compatible Handle 0x000D, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: LPT1 Internal Connector Type: DB-25 female External Reference Designator: External Connector Type: DB-25 female Port Type: Parallel Port ECP/EPP Handle 0x000E, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: Keyboard Internal Connector Type: PS/2 External Reference Designator: External Connector Type: PS/2 Port Type: Keyboard Port Handle 0x000F, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: PS/2 Mouse Internal Connector Type: PS/2 External Reference Designator: External Connector Type: PS/2 Port Type: Mouse Port Handle 0x0010, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: USB0 External Connector Type: Other Port Type: USB Handle 0x0011, DMI type 9, 13 bytes System Slot Information Designation: PCI0 Type: 32-bit PCI Current Usage: Available Length: Long ID: 1 Characteristics: 5.0 V is provided PME signal is supported Handle 0x0012, DMI type 13, 22 bytes BIOS Language Information Installable Languages: 3 n|US|iso8859-1 r|CA|iso8859-1 a|JP|unicode Currently Installed Language: n|US|iso8859-1 Handle 0x0013, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: None Maximum Capacity: 512 MB Error Information Handle: Not Provided Number Of Devices: 1 Handle 0x0014, DMI type 17, 27 bytes Memory Device Array Handle: 0x0013 Error Information Handle: Not Provided Total Width: Unknown Data Width: Unknown Size: 512 MB Form Factor: DIMM Set: None Locator: A0 Bank Locator: Bank0/1 Type: Unknown Type Detail: None Speed: Unknown Manufacturer: None Serial Number: None Asset Tag: None Part Number: None Handle 0x0015, DMI type 19, 15 bytes Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0001FFFFFFF Range Size: 512 MB Physical Array Handle: 0x0013 Partition Width: 0 Handle 0x0016, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0001FFFFFFF Range Size: 512 MB Physical Device Handle: 0x0014 Memory Array Mapped Address Handle: 0x0015 Partition Row Position: 1 Handle 0x0017, DMI type 32, 11 bytes System Boot Information Status: No errors detected Handle 0x0018, DMI type 127, 4 bytes End Of Table �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode-linux-2.6������������������������������������������������������0000664�0000000�0000000�00000032757�14323200667�0021027�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.8 SMBIOS 2.3 present. 60 structures occupying 2446 bytes. Table at 0x000F7860. Handle 0xDA00, DMI type 218, 125 bytes OEM-specific Type Header and Data: DA 7D 00 DA B2 00 0D 5F 0F 37 40 7D 00 00 00 00 00 7E 00 02 00 00 00 40 00 04 00 01 00 41 00 04 00 00 00 90 00 05 00 00 00 91 00 05 00 01 00 92 00 05 00 02 00 45 01 45 01 01 00 44 01 44 01 00 00 00 80 00 80 01 00 00 A0 00 A0 01 00 05 80 05 80 01 00 76 01 76 01 01 00 75 01 75 01 01 00 01 F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00 00 04 F0 04 F0 00 00 FF FF 00 00 00 00 Handle 0x0000, DMI type 0, 20 bytes BIOS Information Vendor: Dell Inc. Version: A06 Release Date: 10/02/2005 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 576 kB Characteristics: ISA is supported PCI is supported PC Card (PCMCIA) is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed Boot from CD is supported Selectable boot is supported 3.5"/720 KB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) ACPI is supported USB legacy is supported AGP is supported Smart battery is supported BIOS boot specification is supported Function key-initiated network boot is supported Handle 0x0100, DMI type 1, 25 bytes System Information Manufacturer: Dell Inc. Product Name: Latitude D610 Version: Not Specified Serial Number: D8XD62J UUID: 44454C4C-3800-1058-8044-C4C04F36324A Wake-up Type: Power Switch Handle 0x0200, DMI type 2, 9 bytes Base Board Information Manufacturer: Dell Inc. Product Name: 0XD762 Version: Serial Number: .D8XD62J.CN4864363E7491. Handle 0x0300, DMI type 3, 13 bytes Chassis Information Manufacturer: Dell Inc. Type: Portable Lock: Not Present Version: Not Specified Serial Number: D8XD62J Asset Tag: Not Specified Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: None Handle 0x0301, DMI type 126, 13 bytes Inactive Handle 0x0400, DMI type 4, 32 bytes Processor Information Socket Designation: Microprocessor Type: Central Processor Family: Pentium M Manufacturer: Intel ID: D8 06 00 00 FF FB E9 AF Signature: Type 0, Family 6, Model 13, Stepping 8 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) TM (Thermal monitor supported) PBE (Pending break enabled) Version: Not Specified Voltage: 3.3 V External Clock: 133 MHz Max Speed: 1800 MHz Current Speed: 1733 MHz Status: Populated, Enabled Upgrade: None L1 Cache Handle: 0x0700 L2 Cache Handle: 0x0701 L3 Cache Handle: Not Provided Handle 0x0700, DMI type 7, 19 bytes Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 8 KB Maximum Size: 8 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: None System Type: Data Associativity: 4-way Set-associative Handle 0x0701, DMI type 7, 19 bytes Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Varies With Memory Address Location: Internal Installed Size: 2048 KB Maximum Size: 2048 KB Supported SRAM Types: Pipeline Burst Installed SRAM Type: Pipeline Burst Speed: 15 ns Error Correction Type: None System Type: Unified Associativity: Other Handle 0x0800, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: PARALLEL Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-25 female Port Type: Parallel Port PS/2 Handle 0x0801, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: SERIAL1 Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-9 male Port Type: Serial Port 16550A Compatible Handle 0x0803, DMI type 126, 9 bytes Inactive Handle 0x0804, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: USB Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0805, DMI type 126, 9 bytes Inactive Handle 0x0806, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: MONITOR Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-15 female Port Type: Video Port Handle 0x0808, DMI type 126, 9 bytes Inactive Handle 0x0809, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: IrDA Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Infrared Port Type: Other Handle 0x080A, DMI type 126, 9 bytes Inactive Handle 0x080C, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: Modem Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: RJ-11 Port Type: Modem Port Handle 0x080D, DMI type 8, 9 bytes Port Connector Information Internal Reference Designator: Ethernet Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: RJ-45 Port Type: Network Port Handle 0x0900, DMI type 9, 13 bytes System Slot Information Designation: PCMCIA 0 Type: 32-bit PC Card (PCMCIA) Current Usage: Available Length: Other ID: Adapter 0, Socket 0 Characteristics: 5.0 V is provided 3.3 V is provided PC Card-16 is supported Cardbus is supported Zoom Video is supported Modem ring resume is supported Handle 0x0902, DMI type 126, 13 bytes Inactive Handle 0x0904, DMI type 9, 13 bytes System Slot Information Designation: MiniPCI Type: 32-bit Other Current Usage: Available Length: Other Characteristics: 5.0 V is provided 3.3 V is provided PME signal is supported Handle 0x0A00, DMI type 10, 6 bytes On Board Device Information Type: Video Status: Enabled Description: Intel 915GM Graphics Handle 0x0A01, DMI type 10, 6 bytes On Board Device Information Type: Sound Status: Enabled Description: Sigmatel 9751 Handle 0x0B00, DMI type 11, 5 bytes OEM Strings String 1: Dell System String 2: 5[0003] String 3: 13[PP11L] Handle 0x0D00, DMI type 13, 22 bytes BIOS Language Information Installable Languages: 1 en|US|iso8859-1 Currently Installed Language: en|US|iso8859-1 Handle 0x1000, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: None Maximum Capacity: 4 GB Error Information Handle: Not Provided Number Of Devices: 2 Handle 0x1100, DMI type 17, 27 bytes Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 64 bits Data Width: 64 bits Size: 1024 MB Form Factor: DIMM Set: None Locator: DIMM_A Bank Locator: Not Specified Type: DDR Type Detail: Synchronous Speed: 533 MHz (1.9 ns) Manufacturer: C100000000000000 Serial Number: 02132010 Asset Tag: Not Specified Part Number: Not Specified Handle 0x1101, DMI type 17, 27 bytes Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 64 bits Data Width: 64 bits Size: 1024 MB Form Factor: DIMM Set: None Locator: DIMM_B Bank Locator: Not Specified Type: DDR Type Detail: Synchronous Speed: 533 MHz (1.9 ns) Manufacturer: C100000000000000 Serial Number: 02132216 Asset Tag: Not Specified Part Number: Not Specified Handle 0x1300, DMI type 19, 15 bytes Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0000009FFFF Range Size: 640 kB Physical Array Handle: 0x1000 Partition Width: 0 Handle 0x1301, DMI type 19, 15 bytes Memory Array Mapped Address Starting Address: 0x00000100000 Ending Address: 0x0007FFFFFFF Range Size: 2047 MB Physical Array Handle: 0x1000 Partition Width: 0 Handle 0x1400, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0000009FFFF Range Size: 640 kB Physical Device Handle: 0x1100 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Handle 0x1401, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00000100000 Ending Address: 0x0003FFFFFFF Range Size: 1023 MB Physical Device Handle: 0x1100 Memory Array Mapped Address Handle: 0x1301 Partition Row Position: 1 Handle 0x1402, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00040000000 Ending Address: 0x0007FFFFFFF Range Size: 1 GB Physical Device Handle: 0x1101 Memory Array Mapped Address Handle: 0x1301 Partition Row Position: 1 Handle 0x1500, DMI type 21, 7 bytes Built-in Pointing Device Type: Touch Pad Interface: Bus Mouse Buttons: 2 Handle 0x1600, DMI type 22, 26 bytes Portable Battery Location: Sys. Battery Bay Manufacturer: Samsung SDI Name: DELL C129563 Design Capacity: 48000 mWh Design Voltage: 11100 mV SBDS Version: 1.0 Maximum Error: 3% SBDS Serial Number: 7734 SBDS Manufacture Date: 2006-03-11 SBDS Chemistry: LION OEM-specific Information: 0x00000001 Handle 0x1601, DMI type 126, 26 bytes Inactive Handle 0x1602, DMI type 126, 26 bytes Inactive Handle 0x1B00, DMI type 27, 12 bytes Cooling Device Type: Fan Status: OK OEM-specific Information: 0x0000DD00 Handle 0x1C00, DMI type 28, 20 bytes Temperature Probe Description: CPU Internal Temperature Location: Processor Status: OK Maximum Value: 127.0 deg C Minimum Value 0.0 deg C Resolution: 1.000 deg C Tolerance: 0.5 deg C Accuracy: Unknown OEM-specific Information: 0x0000DC00 Handle 0x2000, DMI type 32, 11 bytes System Boot Information Status: No errors detected Handle 0xB000, DMI type 176, 5 bytes OEM-specific Type Header and Data: B0 05 00 B0 00 Handle 0xB100, DMI type 177, 12 bytes OEM-specific Type Header and Data: B1 0C 00 B1 01 00 00 00 00 00 00 00 Handle 0xD000, DMI type 208, 10 bytes OEM-specific Type Header and Data: D0 0A 00 D0 01 04 FE 00 82 01 Handle 0xD100, DMI type 209, 12 bytes OEM-specific Type Header and Data: D1 0C 00 D1 00 00 00 03 04 07 80 05 Handle 0xD200, DMI type 210, 12 bytes OEM-specific Type Header and Data: D2 0C 00 D2 F8 03 04 03 06 80 04 05 Handle 0xD300, DMI type 211, 13 bytes OEM-specific Type Header and Data: D3 0D 00 D3 01 04 02 01 00 00 00 00 02 Strings: Back of System Handle 0xD800, DMI type 216, 9 bytes OEM-specific Type Header and Data: D8 09 00 D8 01 03 01 F0 03 Strings: Intel Corp. 1219 Handle 0xD900, DMI type 217, 8 bytes OEM-specific Type Header and Data: D9 08 00 D9 01 02 01 03 Strings: US-101 Proprietary Handle 0xDB00, DMI type 219, 9 bytes OEM-specific Type Header and Data: DB 09 00 DB 03 01 02 03 FF Strings: System Device Bay Floppy, Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk CDRW+DVD Handle 0xDB80, DMI type 126, 9 bytes Inactive Handle 0xDB81, DMI type 126, 9 bytes Inactive Handle 0x8100, DMI type 129, 8 bytes OEM-specific Type Header and Data: 81 08 00 81 01 01 02 01 Strings: Intel_ASF Dell_ASF_001 Handle 0xDC00, DMI type 220, 22 bytes OEM-specific Type Header and Data: DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0 04 F0 00 00 00 00 Handle 0xDD00, DMI type 221, 19 bytes OEM-specific Type Header and Data: DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Handle 0xD400, DMI type 212, 237 bytes OEM-specific Type Header and Data: D4 ED 00 D4 70 00 71 00 00 10 2D 2E 5C 00 78 BF 40 5D 00 78 BF 00 65 00 21 F7 00 66 00 21 F7 08 5E 00 23 FE 01 5F 00 23 FE 00 F1 00 21 FC 00 F2 00 21 FC 01 F3 00 21 FC 02 0F 00 26 F8 00 11 00 26 F8 01 05 00 26 F8 02 12 00 26 F8 03 06 00 26 F8 04 31 00 26 8F 00 32 00 26 8F 10 33 00 26 8F 20 34 00 26 8F 30 35 00 26 8F 40 07 00 25 F8 00 0B 00 25 F8 01 0C 00 25 F8 02 0D 00 25 F8 03 28 00 23 F3 00 29 00 23 F3 04 2A 00 23 F3 08 2B 00 58 00 00 2C 00 59 00 00 E7 00 1D F3 04 E6 00 1D F3 00 0E 01 23 FD 02 0F 01 23 FD 00 9B 00 23 EF 10 9C 00 23 EF 00 87 00 11 FD 02 88 00 11 FD 00 E8 00 23 DF 20 E9 00 23 DF 00 51 01 22 F7 00 50 01 22 F7 08 12 01 34 FB 04 13 01 34 FB 00 08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00 Handle 0xD401, DMI type 212, 127 bytes OEM-specific Type Header and Data: D4 7F 01 D4 70 00 71 00 03 40 49 4A 42 00 48 7F 80 43 00 48 7F 00 55 00 47 BF 00 6D 00 47 BF 40 0C 01 46 FB 04 0D 01 46 FB 00 14 01 46 E7 00 15 01 46 E7 08 16 01 46 E7 10 0A 01 48 EF 10 0B 01 48 EF 00 2D 00 48 DF 20 2E 00 48 DF 00 11 01 48 BF 00 10 01 48 BF 40 F0 00 46 DF 20 ED 00 46 DF 00 41 01 46 FE 01 40 01 46 FE 00 EA 00 67 F3 00 EB 00 67 F3 04 EC 00 67 F3 08 FF FF 00 00 00 Handle 0xDE00, DMI type 222, 13 bytes OEM-specific Type Header and Data: DE 0D 00 DE 01 02 FF FF 00 00 00 00 00 Handle 0x7F00, DMI type 127, 4 bytes End Of Table �����������������UnixAgent-2.10.0/resources/dmidecode-openbsd-3.7����������������������������������������������������0000664�0000000�0000000�00000040102�14323200667�0021303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.6 Legacy DMI 2.0 present. 41 structures occupying 1014 bytes. Table at 0x000F0800. Handle 0x0000 DMI type 0, 18 bytes. BIOS Information Vendor: Award Software International, Inc. Version: 4.51 PG Release Date: 02/11/99 Address: 0xE0000 Runtime Size: 128 kB ROM Size: 256 kB Characteristics: ISA is supported PCI is supported PNP is supported APM is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported Selectable boot is supported BIOS ROM is socketed EDD is supported 5.25"/360 KB floppy services are supported (int 13h) 5.25"/1.2 MB floppy services are supported (int 13h) 3.5"/720 KB floppy services are supported (int 13h) 3.5"/2.88 MB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) Handle 0x0001 DMI type 1, 8 bytes. System Information Manufacturer: VIA Technologies, Inc. Product Name: VT82C691 Version: Serial Number: Handle 0x0002 DMI type 2, 8 bytes. Base Board Information Manufacturer: Tekram Technology Co., Ltd. Product Name: P6PROA5 Version: Rev. 1.0 Serial Number: Handle 0x0003 DMI type 3, 9 bytes. Chassis Information Manufacturer: Type: Unknown Lock: Not Present Version: Serial Number: Asset Tag: Handle 0x0004 DMI type 4, 26 bytes. Processor Information Socket Designation: SLOT 1 Type: Central Processor Family: Pentium II Manufacturer: Intel ID: 52 06 00 00 FF F9 83 01 Signature: Type 0, Family 6, Model 5, Stepping 2 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) Version: Pentium II Voltage: 3.3 V External Clock: 100 MHz Max Speed: 500 MHz Current Speed: 400 MHz Status: Populated, Enabled Upgrade: Slot 1 Handle 0x0005 DMI type 5, 31 bytes. Memory Controller Information Error Detecting Method: 64-bit ECC Error Correcting Capabilities: Single-bit Error Correcting Supported Interleave: Four-way Interleave Current Interleave: One-way Interleave Maximum Memory Module Size: 256 MB Maximum Total Memory Size: 2048 MB Supported Speeds: 70 ns 60 ns Supported Memory Types: Other Unknown Standard FPM EDO Parity ECC SIMM DIMM SDRAM Memory Module Voltage: 5.0 V 3.3 V Associated Memory Slots: 8 0x0006 0x0007 0x0008 0x0009 0x000A 0x000B 0x000C 0x000D Handle 0x0007 DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_1 Bank Connections: 2 Current Speed: 70 ns Type: Unknown Installed Size: Not Installed Enabled Size: Not Installed Error Status: OK Handle 0x0008 DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_2 Bank Connections: 3 Current Speed: 70 ns Type: DIMM SDRAM Installed Size: 64 MB (Single-bank Connection) Enabled Size: 64 MB (Single-bank Connection) Error Status: OK Handle 0x0009 DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_3 Bank Connections: 4 Current Speed: 70 ns Type: Unknown Installed Size: Not Installed Enabled Size: Not Installed Error Status: OK Handle 0x000A DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_4 Bank Connections: 5 Current Speed: 70 ns Type: DIMM SDRAM Installed Size: 64 MB (Single-bank Connection) Enabled Size: 64 MB (Single-bank Connection) Error Status: OK Handle 0x000B DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_5 Bank Connections: 6 Current Speed: 70 ns Type: DIMM SDRAM Installed Size: 64 MB (Single-bank Connection) Enabled Size: 64 MB (Single-bank Connection) Error Status: OK Handle 0x000C DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_6 Bank Connections: 7 Current Speed: 70 ns Type: Unknown Installed Size: Not Installed Enabled Size: Not Installed Error Status: OK Handle 0x000D DMI type 6, 12 bytes. Memory Module Information Socket Designation: BANK_7 Bank Connections: 8 Current Speed: 70 ns Type: Unknown Installed Size: Not Installed Enabled Size: Not Installed Error Status: OK Handle 0x000E DMI type 7, 15 bytes. Cache Information Socket Designation: Internal Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 32 KB Maximum Size: 32 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Handle 0x000F DMI type 7, 15 bytes. Cache Information Socket Designation: External Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: External Installed Size: 512 KB Maximum Size: 2048 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Handle 0x0010 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: PRIMARY IDE Internal Connector Type: On Board IDE External Reference Designator: External Connector Type: None Port Type: Other Handle 0x0011 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: SECONDARY IDE Internal Connector Type: On Board IDE External Reference Designator: External Connector Type: None Port Type: Other Handle 0x0012 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: FLOPPY Internal Connector Type: On Board Floppy External Reference Designator: External Connector Type: None Port Type: Other Handle 0x0013 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: COM1 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16550 Compatible Handle 0x0014 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: COM2 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16550 Compatible Handle 0x0015 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: LPT1 Internal Connector Type: DB-25 female External Reference Designator: External Connector Type: DB-25 female Port Type: Parallel Port ECP/EPP Handle 0x0016 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Keyboard Internal Connector Type: Other External Reference Designator: External Connector Type: PS/2 Port Type: Keyboard Port Handle 0x0017 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: PS/2 Mouse Internal Connector Type: Other External Reference Designator: External Connector Type: PS/2 Port Type: Mouse Port Handle 0x0018 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: IR_CON Internal Connector Type: Other External Reference Designator: External Connector Type: Infrared Port Type: Other Handle 0x0019 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: IR_CON2 Internal Connector Type: Other External Reference Designator: External Connector Type: Infrared Port Type: Other Handle 0x001A DMI type 9, 12 bytes. System Slot Information Designation: AGP Type: 32-bit PCI Current Usage: In Use Length: Long ID: 32 Characteristics: 5.0 V is provided Handle 0x001B DMI type 9, 12 bytes. System Slot Information Designation: PCI1 Type: 32-bit PCI Current Usage: Available Length: Long ID: 12 Characteristics: 5.0 V is provided Handle 0x001C DMI type 9, 12 bytes. System Slot Information Designation: PCI2 Type: 32-bit PCI Current Usage: Available Length: Long ID: 11 Characteristics: 5.0 V is provided Handle 0x001D DMI type 9, 12 bytes. System Slot Information Designation: PCI3 Type: 32-bit PCI Current Usage: In Use Length: Long ID: 10 Characteristics: 5.0 V is provided Handle 0x001E DMI type 9, 12 bytes. System Slot Information Designation: PCI4 Type: 32-bit PCI Current Usage: Available Length: Long ID: 9 Characteristics: 5.0 V is provided Handle 0x001F DMI type 9, 12 bytes. System Slot Information Designation: PCI5 Type: 32-bit PCI Current Usage: Available Length: Long ID: 8 Characteristics: 5.0 V is provided Handle 0x0020 DMI type 9, 12 bytes. System Slot Information Designation: ISA Type: 16-bit ISA Current Usage: Unknown Length: Long Characteristics: 5.0 V is provided Handle 0x0021 DMI type 9, 12 bytes. System Slot Information Designation: ISA Type: 16-bit ISA Current Usage: Unknown Length: Long Characteristics: 5.0 V is provided Handle 0x0022 DMI type 9, 12 bytes. System Slot Information Designation: PCIx Type: 32-bit PCI Current Usage: Unknown Length: Long ID: 0 Characteristics: 5.0 V is provided Handle 0x0023 DMI type 9, 12 bytes. System Slot Information Designation: PCIx Type: 32-bit PCI Current Usage: Unknown Length: Long ID: 0 Characteristics: 5.0 V is provided Handle 0x0024 DMI type 9, 12 bytes. System Slot Information Designation: PCIx Type: 32-bit PCI Current Usage: Unknown Length: Long ID: 0 Characteristics: 5.0 V is provided Handle 0x0025 DMI type 9, 12 bytes. System Slot Information Designation: PCIx Type: 32-bit PCI Current Usage: Unknown Length: Long ID: 0 Characteristics: 5.0 V is provided Handle 0x0026 DMI type 9, 12 bytes. System Slot Information Designation: PCIx Type: 32-bit PCI Current Usage: Unknown Length: Long ID: 0 Characteristics: 5.0 V is provided Handle 0x0027 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: USB Internal Connector Type: Other External Reference Designator: External Connector Type: Other Port Type: USB Handle 0x0028 DMI type 13, 22 bytes. BIOS Language Information Installable Languages: 3 en|US|iso8859-1 fr|CA|iso8859-1 ja|JP|unicode Currently Installed Language: en|US|iso8859-1 Wrong DMI structures count: 41 announced, only 40 decoded. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode-openbsd-3.8����������������������������������������������������0000664�0000000�0000000�00000067563�14323200667�0021330�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ dmidecode 2.6 SMBIOS 2.3 present. 82 structures occupying 3043 bytes. Table at 0x000FA4C0. Handle 0xDA00 DMI type 218, 11 bytes. OEM-specific Type Header and Data: DA 0B 00 DA B2 00 17 00 0E 20 00 Handle 0x0000 DMI type 0, 20 bytes. BIOS Information Vendor: Dell Computer Corporation Version: A05 Release Date: 09/21/2005 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 1024 kB Characteristics: ISA is supported PCI is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported Selectable boot is supported EDD is supported Japanese floppy for Toshiba 1.2 MB is supported (int 13h) 5.25"/360 KB floppy services are supported (int 13h) 5.25"/1.2 MB floppy services are supported (int 13h) 3.5"/720 KB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) ACPI is supported USB legacy is supported LS-120 boot is supported BIOS boot specification is supported Function key-initiated network boot is supported Handle 0x0100 DMI type 1, 25 bytes. System Information Manufacturer: Dell Computer Corporation Product Name: PowerEdge 1800 Version: Not Specified Serial Number: 2K1012J UUID: 44454C4C-4B00-1031-8030-B2C04F31324A Wake-up Type: Power Switch Handle 0x0200 DMI type 2, 9 bytes. Base Board Information Manufacturer: Dell Computer Corporation Product Name: 0P8611 Version: A04 Serial Number: ..CN717035A80217. Handle 0x0300 DMI type 3, 17 bytes. Chassis Information Manufacturer: Dell Computer Corporation Type: Main Server Chassis Lock: Present Version: Not Specified Serial Number: 2K1012J Asset Tag: Not Specified Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: Unknown OEM Information: 0x00000000 Handle 0x0400 DMI type 4, 35 bytes. Processor Information Socket Designation: PROC_1 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 43 0F 00 00 FF FB EB BF Signature: Type 0, Family 15, Model 4, Stepping 3 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) PBE (Pending break enabled) Version: Not Specified Voltage: 1.4 V External Clock: 800 MHz Max Speed: 3600 MHz Current Speed: 3000 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0700 L2 Cache Handle: 0x0701 L3 Cache Handle: 0x0702 Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0401 DMI type 4, 35 bytes. Processor Information Socket Designation: PROC_2 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 00 00 00 00 00 00 00 00 Signature: Type 0, Family 0, Model 0, Stepping 0 Flags: None Version: Not Specified Voltage: 1.4 V External Clock: Unknown Max Speed: 3600 MHz Current Speed: Unknown Status: Unpopulated Upgrade: ZIF Socket L1 Cache Handle: 0x0703 L2 Cache Handle: 0x0704 L3 Cache Handle: 0x0705 Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0700 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Through Location: Internal Installed Size: 16 KB Maximum Size: 16 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Parity System Type: Data Associativity: 8-way Set-associative Handle 0x0701 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 2048 KB Maximum Size: 2048 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 8-way Set-associative Handle 0x0702 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 3 Operational Mode: Write Back Location: Internal Installed Size: 0 KB Maximum Size: 0 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 2-way Set-associative Handle 0x0703 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Through Location: Internal Installed Size: 0 KB Maximum Size: 16 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Parity System Type: Data Associativity: 8-way Set-associative Handle 0x0704 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 0 KB Maximum Size: 2048 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 8-way Set-associative Handle 0x0705 DMI type 7, 19 bytes. Cache Information Socket Designation: Not Specified Configuration: Enabled, Not Socketed, Level 3 Operational Mode: Write Back Location: Internal Installed Size: 0 KB Maximum Size: 0 KB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 2-way Set-associative Handle 0x0800 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: SCSI Internal Connector Type: 68 Pin Dual Inline External Reference Designator: Not Specified External Connector Type: None Port Type: SCSI Wide Handle 0x0801 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-15 female Port Type: Video Port Handle 0x0802 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0803 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0804 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0805 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0806 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-25 female Port Type: Parallel Port PS/2 Handle 0x0807 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: RJ-45 Port Type: Network Port Handle 0x0808 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: DB-9 male Port Type: Serial Port 16550A Compatible Handle 0x0809 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: PS/2 Port Type: Keyboard Port Handle 0x080A DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: Not Specified External Connector Type: PS/2 Port Type: Mouse Port Handle 0x0900 DMI type 9, 13 bytes. System Slot Information Designation: SLOT1 Type: 64-bit PCI Current Usage: Available Length: Long ID: 1 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0901 DMI type 9, 13 bytes. System Slot Information Designation: SLOT2 Type: <OUT OF SPEC><OUT OF SPEC> Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported Handle 0x0902 DMI type 9, 13 bytes. System Slot Information Designation: SLOT3 Type: <OUT OF SPEC><OUT OF SPEC> Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported Handle 0x0903 DMI type 9, 13 bytes. System Slot Information Designation: SLOT4 Type: 32-bit PCI Current Usage: Available Length: Long ID: 4 Characteristics: 5.0 V is provided PME signal is supported Handle 0x0904 DMI type 9, 13 bytes. System Slot Information Designation: SLOT5 Type: 64-bit PCI-X Current Usage: In Use Length: Long ID: 5 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0905 DMI type 9, 13 bytes. System Slot Information Designation: SLOT6 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 6 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0A00 DMI type 10, 10 bytes. On Board Device 1 Information Type: SCSI Controller Status: Enabled Description: LSI Logic 53C1020 Ultra 320 SCSI On Board Device 2 Information Type: Video Status: Enabled Description: ATI RADEON 7000 PCI Video On Board Device 3 Information Type: Ethernet Status: Enabled Description: Intel 82541GI Gigabit Ethernet Handle 0x0B00 DMI type 11, 5 bytes. OEM Strings String 1: Dell System String 2: 5[0000] Handle 0x7E00 DMI type 126, 144 bytes. Inactive Handle 0x0C00 DMI type 12, 5 bytes. System Configuration Options Option 1: NVRAM_CLR: Clear user settable NVRAM areas and set defaults Option 2: PASSWD: Close to enable password Handle 0x0D00 DMI type 13, 22 bytes. BIOS Language Information Installable Languages: 1 en|US|iso8859-1 Currently Installed Language: en|US|iso8859-1 Handle 0x1000 DMI type 16, 15 bytes. Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 12 GB Error Information Handle: Not Provided Number Of Devices: 6 Handle 0x1100 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM1_A Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: CE00000000000000 Serial Number: 50075483 Asset Tag: 010552 Part Number: M3 93T6450FZ0-CCC Handle 0x1101 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM1_B Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: CE00000000000000 Serial Number: 500355A1 Asset Tag: 010552 Part Number: M3 93T6450FZ0-CCC Handle 0x1102 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: 2 Locator: DIMM2_A Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: Asset Tag: Part Number: Handle 0x1103 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: 2 Locator: DIMM2_B Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: Asset Tag: Part Number: Handle 0x1104 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: 3 Locator: DIMM3_A Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: Asset Tag: Part Number: Handle 0x1105 DMI type 17, 27 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: 3 Locator: DIMM3_B Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: Asset Tag: Part Number: Handle 0x1300 DMI type 19, 15 bytes. Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0003FFFFFFF Range Size: 1 GB Physical Array Handle: 0x1000 Partition Width: 0 Handle 0x1301 DMI type 126, 15 bytes. Inactive Handle 0x1400 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0003FFFFFFF Range Size: 1 GB Physical Device Handle: 0x1100 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Handle 0x1401 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0003FFFFFFF Range Size: 1 GB Physical Device Handle: 0x1101 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 2 Handle 0x1402 DMI type 126, 19 bytes. Inactive Handle 0x1403 DMI type 126, 19 bytes. Inactive Handle 0x1404 DMI type 126, 19 bytes. Inactive Handle 0x1405 DMI type 126, 19 bytes. Inactive Handle 0x1406 DMI type 126, 19 bytes. Inactive Handle 0x1407 DMI type 126, 19 bytes. Inactive Handle 0x1408 DMI type 126, 19 bytes. Inactive Handle 0x1409 DMI type 126, 19 bytes. Inactive Handle 0x140A DMI type 126, 19 bytes. Inactive Handle 0x140B DMI type 126, 19 bytes. Inactive Handle 0x140C DMI type 126, 19 bytes. Inactive Handle 0x140D DMI type 126, 19 bytes. Inactive Handle 0x1420 DMI type 126, 19 bytes. Inactive Handle 0x1421 DMI type 126, 19 bytes. Inactive Handle 0x1424 DMI type 126, 19 bytes. Inactive Handle 0x1425 DMI type 126, 19 bytes. Inactive Handle 0x1428 DMI type 126, 19 bytes. Inactive Handle 0x1429 DMI type 126, 19 bytes. Inactive Handle 0x1430 DMI type 126, 19 bytes. Inactive Handle 0x1431 DMI type 126, 19 bytes. Inactive Handle 0x1434 DMI type 126, 19 bytes. Inactive Handle 0x1435 DMI type 126, 19 bytes. Inactive Handle 0x1438 DMI type 126, 19 bytes. Inactive Handle 0x1439 DMI type 126, 19 bytes. Inactive Handle 0x2000 DMI type 32, 11 bytes. System Boot Information Status: No errors detected Handle 0x2600 DMI type 38, 18 bytes. IPMI Device Information Interface Type: KCS (Keyboard Control Style) Specification Version: 1.5 I2C Slave Address: 0x10 NV Storage Device: Not Present Base Address: 0x0000000000000CA8 (I/O) Register Spacing: 32-bit Boundaries Handle 0xD000 DMI type 208, 10 bytes. OEM-specific Type Header and Data: D0 0A 00 D0 01 05 FE 00 83 01 Handle 0xD100 DMI type 209, 12 bytes. OEM-specific Type Header and Data: D1 0C 00 D1 78 03 07 03 04 0F 80 05 Handle 0xD200 DMI type 210, 12 bytes. OEM-specific Type Header and Data: D2 0C 00 D2 F8 03 04 03 06 80 04 05 Handle 0xD400 DMI type 212, 167 bytes. OEM-specific Type Header and Data: D4 A7 00 D4 70 00 71 00 00 10 2D 2E 03 00 11 7F 80 04 00 11 7F 00 07 00 25 9F 00 08 00 25 9F 20 09 00 25 9F 40 0A 00 25 9F 60 0B 00 25 7F 00 0C 00 25 7F 80 0F 00 25 F8 00 11 00 25 F8 01 12 00 25 F8 02 2E 40 25 F8 03 2F 40 25 F8 04 00 00 25 F8 05 42 00 11 FE 01 43 00 11 FE 00 44 00 11 9F 20 45 00 11 9F 00 31 40 11 FB 00 32 40 11 FB 04 9D 00 11 FD 02 9E 00 11 FD 00 9F 00 26 FE 01 A0 00 26 FE 00 51 00 26 3F 00 52 00 26 3F 40 53 00 26 3F 80 54 00 26 3F C0 28 40 26 DF 20 29 40 26 DF 00 FF FF 00 00 00 Handle 0xD401 DMI type 212, 202 bytes. OEM-specific Type Header and Data: D4 CA 01 D4 70 00 71 00 03 40 59 6D 6B 00 78 7F 80 6C 00 78 7F 00 58 00 78 FA 05 59 00 78 FA 00 5C 00 78 BF 40 5D 00 78 BF 00 04 80 78 FD 02 01 A0 78 FD 00 08 40 51 FE 01 09 40 51 FE 00 0A 40 51 FD 02 0B 40 51 FD 00 19 00 55 E7 00 1A 00 55 E7 08 1B 00 55 E7 10 FF 00 55 9F 40 FE 00 55 9F 20 FD 00 55 9F 00 1E 00 55 FD 00 50 00 55 FD 02 8A 00 55 FE 01 8B 00 55 FE 00 BF 00 53 FE 00 C0 00 53 FE 01 33 40 53 E7 00 34 40 53 E7 08 35 40 53 E7 10 36 40 53 E7 18 1A 40 53 FD 02 1B 40 53 FD 00 1C 40 53 FB 04 1D 40 53 FB 00 6E 00 58 FC 01 2D 00 58 FC 02 2E 00 58 FC 00 22 40 58 EF 10 23 40 58 EF 00 FF FF 00 00 00 Handle 0xD402 DMI type 212, 47 bytes. OEM-specific Type Header and Data: D4 2F 02 D4 70 00 71 00 03 40 59 6D D8 00 55 7F 80 D9 00 55 7F 00 00 C0 5C 00 0A 03 C0 67 00 05 83 00 76 00 00 84 00 77 00 00 FF FF 00 00 00 Handle 0xD403 DMI type 212, 177 bytes. OEM-specific Type Header and Data: D4 B1 03 D4 72 00 73 00 00 40 5D 5E 28 01 4A FC 00 29 01 4A FC 01 2A 01 4A FC 02 02 40 4A F7 00 01 40 4A F7 08 D1 00 7E FE 00 D2 00 7E FE 01 2A 40 7E FB 00 2B 40 7E FB 04 D3 00 00 00 02 D4 00 06 00 02 00 90 2C 00 00 01 90 2D 00 00 17 01 4B FE 00 18 01 4B FE 01 19 01 4B FD 00 1A 01 4B FD 02 35 01 4C FC 00 37 01 4C FC 01 39 01 4C FC 02 3B 01 4C F3 04 3D 01 4C F3 08 DE 00 76 FE 01 26 40 42 FE 01 27 40 42 FE 00 37 40 42 FB 00 38 40 42 FB 04 00 00 47 FE 01 00 00 47 FE 00 A1 00 48 FC 02 A3 00 48 FC 01 A2 00 48 FC 00 FF FF 00 00 00 Handle 0xD800 DMI type 216, 9 bytes. OEM-specific Type Header and Data: D8 09 00 D8 01 02 01 00 00 Strings: ATI RADEON 7000 V6.11 Handle 0xDE00 DMI type 222, 15 bytes. OEM-specific Type Header and Data: DE 0F 00 DE 01 04 FF FF 00 00 00 00 00 00 00 Handle 0x7F00 DMI type 127, 4 bytes. End Of Table ���������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode.rhel.2.1�������������������������������������������������������0000664�0000000�0000000�00000013425�14323200667�0020606�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNP BIOS present. PNP BIOS present. SYSID present. SMBIOS 2.3 present. DMI 2.3 present. 40 structures occupying 1146 bytes. DMI table at 0x000FAC20. Handle 0x0000 DMI type 0, 20 bytes. BIOS Information Block Vendor: IBM Version: -[JPE130AUS-1.30]- Release: 12/11/2002 BIOS base: 0xF0000 ROM size: 448K Capabilities: Flags: 0x000000007FFBDE90 Handle 0x0100 DMI type 1, 25 bytes. System Information Block Vendor: IBM Product: -[84803AX]- Version: IBM CORPORATION Serial Number: KBKGW40 Handle 0x0200 DMI type 2, 8 bytes. Board Information Block Vendor: IBM Product: -[M51G]- Version: -1 Serial Number: NA60B7Y0S3Q Handle 0x0300 DMI type 3, 17 bytes. Chassis Information Block Vendor: IBM Chassis Type: Mini Tower Lock present Version: N/A Serial Number: N/A Asset Tag: N/A Handle 0x0400 DMI type 4, 32 bytes. Processor Socket Designation: CPU1 Processor Type: Central Processor Processor Family: Processor Manufacturer: Intel Processor Version: Pentium 4 Handle 0x0500 DMI type 5, 20 bytes. Memory Controller Handle 0x0600 DMI type 6, 12 bytes. Memory Bank Socket: DIMM1 Banks: 0 Type: ECC DIMM SDRAM Installed Size: 256Mbyte Enabled Size: 256Mbyte Handle 0x0601 DMI type 6, 12 bytes. Memory Bank Socket: DIMM2 Type: UNKNOWN Installed Size: Not Installed Enabled Size: Not Installed Handle 0x0700 DMI type 7, 19 bytes. Cache Socket: CPU1 L1 socketed Internal Cache: write-back L1 Cache Size: 32K L1 Cache Maximum: 20K L1 Cache Type: Unknown Handle 0x0701 DMI type 7, 19 bytes. Cache Socket: CPU1 L2 socketed Internal Cache: write-back L2 Cache Size: 512K L2 Cache Maximum: 512K L2 Cache Type: Pipeline burst Handle 0x0800 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: SERIAL1 External Connector Type: DB-9 pin male Port Type: Serial Port 16650A Compatible Handle 0x0801 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: SERIAL2 External Connector Type: DB-9 pin male Port Type: Serial Port 16650A Compatible Handle 0x0802 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: PRINTER External Connector Type: DB-25 pin female Port Type: Parallel Port ECP/EPP Handle 0x0803 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: KEYBOARD External Connector Type: PS/2 Port Type: Keyboard Port Handle 0x0804 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: MOUSE External Connector Type: PS/2 Port Type: Mouse Port Handle 0x0805 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: USB1 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0806 DMI type 8, 9 bytes. Port Connector Internal Designator: Internal Connector Type: None External Designator: USB2 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0807 DMI type 8, 9 bytes. Port Connector Internal Designator: IDE1 Internal Connector Type: On Board IDE External Designator: External Connector Type: None Port Type: Other Handle 0x0808 DMI type 8, 9 bytes. Port Connector Internal Designator: IDE2 Internal Connector Type: On Board IDE External Designator: External Connector Type: None Port Type: Other Handle 0x0809 DMI type 8, 9 bytes. Port Connector Internal Designator: FDD Internal Connector Type: On Board Floppy External Designator: External Connector Type: None Port Type: Other Handle 0x080A DMI type 8, 9 bytes. Port Connector Internal Designator: SCSI1 Internal Connector Type: SSA SCSI External Designator: External Connector Type: None Port Type: SCSI II Handle 0x0900 DMI type 9, 12 bytes. Card Slot Slot: AGP Type: Slot Features: 5v Handle 0x0901 DMI type 9, 12 bytes. Card Slot Slot: PCI1 Type: 32bit PCI Status: Available. Slot Features: 5v Handle 0x0902 DMI type 9, 13 bytes. Card Slot Slot: PCI2 Type: 32bit PCI Status: In use. Slot Features: 5v Handle 0x0903 DMI type 9, 13 bytes. Card Slot Slot: PCI3 Type: 32bit PCI Status: Available. Slot Features: 5v Handle 0x0904 DMI type 9, 13 bytes. Card Slot Slot: PCI4 Type: 32bit PCI Status: Available. Slot Features: 5v Handle 0x0905 DMI type 9, 13 bytes. Card Slot Slot: PCI5 Type: 32bit PCI Status: Available. Slot Features: 5v Handle 0x0A00 DMI type 10, 14 bytes. On Board Devices Information Description: ATI RAGE XL : Enabled Type: Description: Adaptec 7892 SCSI : Enabled Type: Description: Broadcom 5702 : Enabled Type: Description: AC 97 : Enabled Type: Description: IBM Automatic Server Restart - Machine Type 8480 : Enabled Type: Handle 0x0D00 DMI type 13, 22 bytes. BIOS Language Information Handle 0x0F00 DMI type 15, 39 bytes. Event Log Log Area: 511 bytes. Log Header At: 0. Log Data At: 16. Log Type: 3. Log Valid: Yes. Handle 0x1000 DMI type 16, 15 bytes. Physical Memory Array Handle 0x1100 DMI type 17, 23 bytes. Memory Device Handle 0x1101 DMI type 17, 23 bytes. Memory Device Handle 0x1300 DMI type 19, 15 bytes. Memory Array Mapped Address Handle 0x1400 DMI type 20, 19 bytes. Memory Device Mapped Address Handle 0x1401 DMI type 20, 19 bytes. Memory Device Mapped Address Handle 0x2000 DMI type 32, 12 bytes. System Boot Information Handle 0x2200 DMI type 34, 11 bytes. 01 06 5a 00 00 00 05 ..Z.... Handle 0x8900 DMI type 137, 10 bytes. 01 02 03 04 05 06 ...... Handle 0x7F00 DMI type 127, 4 bytes. End-of-Table �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode.rhel.3.4�������������������������������������������������������0000664�0000000�0000000�00000030001�14323200667�0020577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.2 SMBIOS 2.33 present. 59 structures occupying 2374 bytes. Table at 0x7FF77000. Handle 0x0000 DMI type 0, 20 bytes. BIOS Information Vendor: IBM Version: IBM BIOS Version 1.57-[PME157AUS-1.57]- Release Date: 08/25/2005 Address: 0xE03F0 Runtime Size: 130064 bytes ROM Size: 1024 kB Characteristics: PCI is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported Selectable boot is supported BIOS ROM is socketed Print screen service is supported (int 5h) Serial services are supported (int 14h) ACPI is supported USB legacy is supported BIOS boot specification is supported Handle 0x0001 DMI type 1, 25 bytes. System Information Manufacturer: IBM Product Name: IBM eServer x226-[8488PCR]- Version: Not Applicable Serial Number: KDXPC16 UUID: A8346631-8E88-3AE3-898C-F3AC9F61C316 Wake-up Type: Power Switch Handle 0x0002 DMI type 2, 8 bytes. Base Board Information Manufacturer: IBM Product Name: MSI-9151 Boards Version: Not Applicable Serial Number: #A123456789 Handle 0x0003 DMI type 3, 17 bytes. Chassis Information Manufacturer: IBM Type: Tower Lock: Not Present Version: N/A Serial Number: N/A Asset Tag: 12345678901234567890123456789012 Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: None OEM Information: 0x00001234 Handle 0x0004 DMI type 4, 35 bytes. Processor Information Socket Designation: CPU#1 Type: Central Processor Family: Xeon MP Manufacturer: Intel Corporation ID: 41 0F 00 00 FF FB EB BF Signature: Type 0, Family F, Model 4, Stepping 1 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Intel(R) Xeon(TM) CPU 2.80GHz Voltage: 1.3 V External Clock: 200 MHz Max Speed: 3600 MHz Current Speed: 2800 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0006 L2 Cache Handle: 0x0007 L3 Cache Handle: Not Provided Serial Number: Asset Tag: Part Number: Handle 0x0005 DMI type 4, 35 bytes. Processor Information Socket Designation: CPU#2 Type: Central Processor Family: Xeon MP Manufacturer: Intel Corporation ID: 41 0F 00 00 FF FB EB BF Signature: Type 0, Family F, Model 4, Stepping 1 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Intel(R) Xeon(TM) CPU 2.80GHz Voltage: 1.3 V External Clock: 200 MHz Max Speed: 3600 MHz Current Speed: 2800 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0009 L2 Cache Handle: 0x000A L3 Cache Handle: Not Provided Serial Number: Asset Tag: Part Number: Handle 0x0006 DMI type 7, 19 bytes. Cache Information Socket Designation: L1 Cache for CPU#1 Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 16 KB Maximum Size: 16 KB Supported SRAM Types: Burst Pipeline Burst Installed SRAM Type: Burst Pipeline Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Data Associativity: 4-way Set-associative Handle 0x0007 DMI type 7, 19 bytes. Cache Information Socket Designation: L2 Cache for CPU#1 Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 1024 KB Maximum Size: 2048 KB Supported SRAM Types: Burst Pipeline Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 4-way Set-associative Handle 0x0008 DMI type 126, 19 bytes. Inactive Handle 0x0009 DMI type 7, 19 bytes. Cache Information Socket Designation: L1 Cache for CPU#2 Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 16 KB Maximum Size: 16 KB Supported SRAM Types: Burst Pipeline Burst Installed SRAM Type: Burst Pipeline Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Data Associativity: 4-way Set-associative Handle 0x000A DMI type 7, 19 bytes. Cache Information Socket Designation: L2 Cache for CPU#2 Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 1024 KB Maximum Size: 2048 KB Supported SRAM Types: Burst Pipeline Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 4-way Set-associative Handle 0x000B DMI type 126, 19 bytes. Inactive Handle 0x000C DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J2A1 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: COM 1 External Connector Type: DB-9 male Port Type: Serial Port 16550A Compatible Handle 0x000D DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J2A2 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: COM 2 External Connector Type: DB-9 male Port Type: Serial Port 16550A Compatible Handle 0x000E DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J3A1 Internal Connector Type: 25 Pin Dual Inline (pin 26 cut) External Reference Designator: Parallel External Connector Type: DB-25 female Port Type: Parallel Port ECP/EPP Handle 0x000F DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J1A1 Internal Connector Type: None External Reference Designator: Keyboard External Connector Type: Circular DIN-8 male Port Type: Keyboard Port Handle 0x0010 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J1A1 Internal Connector Type: None External Reference Designator: PS/2 Mouse External Connector Type: Circular DIN-8 male Port Type: Keyboard Port Handle 0x0011 DMI type 9, 13 bytes. System Slot Information Designation: PCIE Slot #1 Type: PCI Current Usage: Available Length: Other ID: 1 Characteristics: PME signal is supported Handle 0x0012 DMI type 9, 13 bytes. System Slot Information Designation: PCI/33 Slot #2 Type: 32-bit PCI Current Usage: Available Length: Short ID: 2 Characteristics: 5.0 V is provided 3.3 V is provided PME signal is supported Handle 0x0013 DMI type 9, 13 bytes. System Slot Information Designation: PCI/33 Slot #3 Type: 32-bit PCI Current Usage: Available Length: Short ID: 3 Characteristics: 5.0 V is provided 3.3 V is provided PME signal is supported Handle 0x0014 DMI type 9, 13 bytes. System Slot Information Designation: PCIX 133 Slot #4 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 4 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0015 DMI type 9, 13 bytes. System Slot Information Designation: PCIX100(ZCR) Slot #5 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 5 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0016 DMI type 9, 13 bytes. System Slot Information Designation: PCIX100 Slot #6 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 6 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0017 DMI type 10, 6 bytes. On Board Device Information Type: Other Status: Enabled Description: IBM Automatic Server Restart - Machine Type 8648 Handle 0x0018 DMI type 10, 6 bytes. On Board Device Information Type: Video Status: Enabled Description: ATI Rage 7000 Handle 0x0019 DMI type 10, 6 bytes. On Board Device Information Type: SCSI Controller Status: Enabled Description: Adaptec AIC 7902 Handle 0x001A DMI type 10, 6 bytes. On Board Device Information Type: Ethernet Status: Enabled Description: BoardCom BCM5721 Handle 0x001D DMI type 11, 5 bytes. OEM Strings String 1: IBM Remote Supervisor Adapter -[GRET15AUS]- Handle 0x001E DMI type 12, 5 bytes. System Configuration Options Option 1: JCMOS1: 1-2 Keep CMOS Data(Default), 2-3 Clear CMOS Data (make sure the AC power cord(s) is(are) removed from the system) Handle 0x001F DMI type 12, 5 bytes. System Configuration Options Option 1: JCON1: 1-2 Normal(Default), 2-3 Configuration, No Jumper - BIOS Crisis Recovery Handle 0x0020 DMI type 13, 22 bytes. BIOS Language Information Installable Languages: 1 en|US|iso8859-1 Currently Installed Language: en|US|iso8859-1 Handle 0x0021 DMI type 15, 29 bytes. System Event Log Area Length: 320 bytes Header Start Offset: 0x0000 Header Length: 16 bytes Data Start Offset: 0x0010 Access Method: General-pupose non-volatile data functions Access Address: 0x0000 Status: Valid, Not Full Change Token: 0x00000013 Header Format: Type 1 Supported Log Type Descriptors: 3 Descriptor 1: POST error Data Format 1: POST results bitmap Descriptor 2: Single-bit ECC memory error Data Format 2: Multiple-event Descriptor 3: Multi-bit ECC memory error Data Format 3: Multiple-event Handle 0x0022 DMI type 16, 15 bytes. Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Single-bit ECC Maximum Capacity: 16 GB Error Information Handle: No Error Number Of Devices: 6 Handle 0x0023 DMI type 17, 27 bytes. Memory Device Array Handle: 0x0022 Error Information Handle: No Error Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM 1 Bank Locator: BANK 1 Type: DDR Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: 460360BB Asset Tag: 3342 Part Number: M3 93T6553BZ3-CCC Handle 0x0024 DMI type 17, 27 bytes. Memory Device Array Handle: 0x0022 Error Information Handle: No Error Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM 2 Bank Locator: BANK 1 Type: DDR Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: Serial Number: 460360E8 Asset Tag: 3342 Part Number: M3 93T6553BZ3-CCC Handle 0x0025 DMI type 17, 27 bytes. Memory Device Array Handle: 0x0022 Error Information Handle: No Error Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: DIMM Set: 2 Locator: DIMM 3 Bank Locator: BANK 2 Type: DDR Type Detail: Synchronous Speed: 400 MHz (2.5 ns) Manufacturer: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode.rhel.4.3�������������������������������������������������������0000664�0000000�0000000�00000044015�14323200667�0020611�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.2 SMBIOS 2.2 present. 57 structures occupying 1719 bytes. Table at 0x000F0000. Handle 0x0000 DMI type 0, 19 bytes. BIOS Information Vendor: IBM Version: -[OQE115A]- Release Date: 03/14/2006 Address: 0xE0000 Runtime Size: 128 kB ROM Size: 1024 kB Characteristics: PCI is supported PNP is supported APM is supported BIOS is upgradeable BIOS shadowing is allowed Boot from CD is supported Selectable boot is supported BIOS ROM is socketed EDD is supported 5.25"/360 KB floppy services are supported (int 13h) 5.25"/1.2 MB floppy services are supported (int 13h) 3.5"/720 KB floppy services are supported (int 13h) 3.5"/2.88 MB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) ACPI is supported USB legacy is supported AGP is supported LS-120 boot is supported ATAPI Zip drive boot is supported Handle 0x0001 DMI type 1, 25 bytes. System Information Manufacturer: IBM Product Name: -[86494jg]- Version: 2.0 Serial Number: KDMAH1Y UUID: 0339D4C3-44C0-9D11-A20E-85CDC42DE79C Wake-up Type: Other Handle 0x0002 DMI type 2, 8 bytes. Base Board Information Manufacturer: IBM Product Name: MS-9121 Version: 2.0 Serial Number: 48Z1LX Handle 0x0003 DMI type 3, 13 bytes. Chassis Information Manufacturer: IBM Type: Tower Lock: Present Version: Serial Number: Asset Tag: Boot-up State: Unknown Power Supply State: Unknown Thermal State: Unknown Security Status: Unknown Handle 0x0004 DMI type 4, 32 bytes. Processor Information Socket Designation: CPU1 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 29 0F 00 00 FF FB EB BF Signature: Type 0, Family F, Model 2, Stepping 9 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Intel Xeon(tm) Voltage: 1.4 V External Clock: 133 MHz Max Speed: 3200 MHz Current Speed: 2666 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x000B L2 Cache Handle: 0x000D L3 Cache Handle: 0x000F Handle 0x0005 DMI type 4, 32 bytes. Processor Information Socket Designation: CPU2 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 29 0F 00 00 FF FB EB BF Signature: Type 0, Family F, Model 2, Stepping 9 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Intel Xeon(tm) Voltage: 1.4 V External Clock: 133 MHz Max Speed: 3200 MHz Current Speed: 2666 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x000C L2 Cache Handle: 0x000E L3 Cache Handle: 0x0010 Handle 0x0006 DMI type 5, 24 bytes. Memory Controller Information Error Detecting Method: 8-bit Parity Error Correcting Capabilities: Single-bit Error Correcting Double-bit Error Correcting Error Scrubbing Supported Interleave: One-way Interleave Current Interleave: One-way Interleave Maximum Memory Module Size: 2048 MB Maximum Total Memory Size: 8192 MB Supported Speeds: Other Supported Memory Types: Other ECC DIMM Memory Module Voltage: 3.3 V Associated Memory Slots: 4 0x0007 0x0008 0x0009 0x000A Enabled Error Correcting Capabilities: Single-bit Error Correcting Double-bit Error Correcting Error Scrubbing Handle 0x0007 DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM1 Bank Connections: 0 Current Speed: Unknown Type: Other DIMM Installed Size: 512 MB (Single-bank Connection) Enabled Size: 512 MB (Single-bank Connection) Error Status: OK Handle 0x0008 DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM2 Bank Connections: 2 Current Speed: Unknown Type: Other DIMM Installed Size: 512 MB (Single-bank Connection) Enabled Size: 512 MB (Single-bank Connection) Error Status: OK Handle 0x0009 DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM3 Bank Connections: 4 Current Speed: Unknown Type: Other DIMM Installed Size: 512 MB (Single-bank Connection) Enabled Size: 512 MB (Single-bank Connection) Error Status: OK Handle 0x000A DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM4 Bank Connections: 6 Current Speed: Unknown Type: Other DIMM Installed Size: 512 MB (Single-bank Connection) Enabled Size: 512 MB (Single-bank Connection) Error Status: OK Handle 0x000B DMI type 7, 19 bytes. Cache Information Socket Designation: Level 1 Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 20 KB Maximum Size: 20 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x000C DMI type 7, 19 bytes. Cache Information Socket Designation: Level 1 Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 20 KB Maximum Size: 20 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x000D DMI type 7, 19 bytes. Cache Information Socket Designation: Level 2 Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 512 KB Maximum Size: 512 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x000E DMI type 7, 19 bytes. Cache Information Socket Designation: Level 2 Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 512 KB Maximum Size: 512 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x000F DMI type 7, 19 bytes. Cache Information Socket Designation: Tertiary (Level 3) Cache Configuration: Disabled, Not Socketed, Level 3 Operational Mode: Write Back Location: Internal Installed Size: 0 KB Maximum Size: 0 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x0010 DMI type 7, 19 bytes. Cache Information Socket Designation: Tertiary (Level 3) Cache Configuration: Disabled, Not Socketed, Level 3 Operational Mode: Write Back Location: Internal Installed Size: 0 KB Maximum Size: 0 KB Supported SRAM Types: Synchronous Installed SRAM Type: Synchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x0011 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: IDE1 Internal Connector Type: On Board IDE External Reference Designator: Not Specified External Connector Type: None Port Type: Other Handle 0x0012 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: IDE2 Internal Connector Type: On Board IDE External Reference Designator: Not Specified External Connector Type: None Port Type: Other Handle 0x0013 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: FDD Internal Connector Type: On Board Floppy External Reference Designator: Not Specified External Connector Type: None Port Type: 8251 FIFO Compatible Handle 0x0014 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: COM1 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16450 Compatible Handle 0x0015 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: COM2 Internal Connector Type: 9 Pin Dual Inline (pin 10 cut) External Reference Designator: External Connector Type: DB-9 male Port Type: Serial Port 16450 Compatible Handle 0x0016 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: LPT1 Internal Connector Type: DB-25 female External Reference Designator: External Connector Type: DB-25 female Port Type: Parallel Port ECP/EPP Handle 0x0017 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Keyboard Internal Connector Type: PS/2 External Reference Designator: External Connector Type: PS/2 Port Type: Keyboard Port Handle 0x0018 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: PS/2 Mouse Internal Connector Type: PS/2 External Reference Designator: External Connector Type: PS/2 Port Type: Mouse Port Handle 0x0019 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: JUSB1 External Connector Type: Other Port Type: USB Handle 0x001A DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: JUSB2 External Connector Type: Other Port Type: USB Handle 0x001B DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: AUD1 External Connector Type: None Port Type: Audio Port Handle 0x001C DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: JLAN1 External Connector Type: RJ-45 Port Type: Network Port Handle 0x001D DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: SCSI1 External Connector Type: None Port Type: SCSI Wide Handle 0x001E DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: Not Specified Internal Connector Type: None External Reference Designator: SCSI2 External Connector Type: None Port Type: SCSI Wide Handle 0x001F DMI type 9, 13 bytes. System Slot Information Designation: PCI1 Type: 32-bit PCI Current Usage: Available Length: Other ID: 1 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0020 DMI type 9, 13 bytes. System Slot Information Designation: PCI6 Type: 32-bit PCI Current Usage: In Use Length: Other ID: 2 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0021 DMI type 10, 14 bytes. On Board Device Information Type: Other Status: Enabled Description: IBM Automatic Server Restart - Machine Type 8480 On Board Device Information Type: SCSI Controller Status: Enabled Description: LSI Logic 1030 Ultra320 SCSI Adapter - SCSI1 On Board Device Information Type: SCSI Controller Status: Enabled Description: LSI Logic 1030 Ultra320 SCSI Adapter - SCSI2 On Board Device Information Type: Ethernet Status: Enabled Description: Broadcom BCM5703 NetXtreme Gigabit Ethernet - JLAN1 On Board Device Information Type: Sound Status: Enabled Description: SoundMax Integrated Digital Audio - AUD1 Handle 0x0022 DMI type 9, 13 bytes. System Slot Information Designation: AGP Type: 32-bit AGP Current Usage: Available Length: Long ID: 8 Characteristics: 5.0 V is provided Handle 0x0023 DMI type 9, 13 bytes. System Slot Information Designation: PCI2 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 2 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0024 DMI type 9, 13 bytes. System Slot Information Designation: PCI3 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 3 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0025 DMI type 9, 13 bytes. System Slot Information Designation: PCI4 Type: 64-bit PCI-X Current Usage: In Use Length: Long ID: 1 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0026 DMI type 9, 13 bytes. System Slot Information Designation: PCI5 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 2 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0027 DMI type 13, 22 bytes. BIOS Language Information Installable Languages: 3 n|US|iso8859-1 n|US|iso8859-1 r|CA|iso8859-1 Currently Installed Language: n|US|iso8859-1 Handle 0x0028 DMI type 16, 15 bytes. Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 8 GB Error Information Handle: No Error Number Of Devices: 4 Handle 0x0029 DMI type 17, 21 bytes. Memory Device Array Handle: 0x0028 Error Information Handle: 0x002D Total Width: 257 bits Data Width: 256 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM1 Bank Locator: Bank0 Type: DDR Type Detail: None Handle 0x002A DMI type 17, 21 bytes. Memory Device Array Handle: 0x0028 Error Information Handle: 0x002E Total Width: 257 bits Data Width: 256 bits Size: 512 MB Form Factor: DIMM Set: 1 Locator: DIMM2 Bank Locator: Bank1 Type: DDR Type Detail: None Handle 0x002B DMI type 17, 21 bytes. Memory Device Array Handle: 0x0028 Error Information Handle: 0x002F Total Width: 257 bits Data Width: 256 bits Size: 512 MB Form Factor: DIMM Set: 2 Locator: DIMM3 Bank Locator: Bank2 Type: DDR Type Detail: None Handle 0x002C DMI type 17, 21 bytes. Memory Device Array Handle: 0x0028 Error Information Handle: 0x0030 Total Width: 257 bits Data Width: 256 bits Size: 512 MB Form Factor: DIMM Set: 2 Locator: DIMM4 Bank Locator: Bank3 Type: DDR Type Detail: None Handle 0x002D DMI type 18, 23 bytes. 32-bit Memory Error Information Type: Other Granularity: Other Operation: Other Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Handle 0x002E DMI type 18, 23 bytes. 32-bit Memory Error Information Type: Other Granularity: Other Operation: Other Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Handle 0x002F DMI type 18, 23 bytes. 32-bit Memory Error Information Type: Other Granularity: Other Operation: Other Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Handle 0x0030 DMI type 18, 23 bytes. 32-bit Memory Error Information Type: Other Granularity: Other Operation: Other Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Handle 0x0031 DMI type 19, 15 bytes. Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0007FFFFFFF Range Size: 2 GB Physical Array Handle: 0x0028 Partition Width: 0 Handle 0x0032 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0001FFFFFFF Range Size: 512 MB Physical Device Handle: 0x0029 Memory Array Mapped Address Handle: 0x0031 Partition Row Position: 1 Handle 0x0033 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00020000000 Ending Address: 0x0003FFFFFFF Range Size: 512 MB Physical Device Handle: 0x002A Memory Array Mapped Address Handle: 0x0031 Partition Row Position: 1 Handle 0x0034 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00040000000 Ending Address: 0x0005FFFFFFF Range Size: 512 MB Physical Device Handle: 0x002B Memory Array Mapped Address Handle: 0x0031 Partition Row Position: 1 Handle 0x0035 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00060000000 Ending Address: 0x0007FFFFFFF Range Size: 512 MB Physical Device Handle: 0x002C Memory Array Mapped Address Handle: 0x0031 Partition Row Position: 1 Handle 0x0036 DMI type 32, 11 bytes. System Boot Information Status: No errors detected Handle 0x0037 DMI type 129, 8 bytes. OEM-specific Type Header And Data: 81 08 37 00 01 01 02 01 Strings: Alert Standard Format IBM 0053 Handle 0x0038 DMI type 127, 4 bytes. End Of Table �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/dmidecode.rhel.4.6�������������������������������������������������������0000664�0000000�0000000�00000045616�14323200667�0020624�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# dmidecode 2.2 SMBIOS 2.4 present. 74 structures occupying 2059 bytes. Table at 0x000EE000. Handle 0x0000 DMI type 0, 24 bytes. BIOS Information Vendor: HP Version: D21 Release Date: 01/24/2008 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 4096 kB Characteristics: PCI is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported Selectable boot is supported EDD is supported 5.25"/360 KB floppy services are supported (int 13h) 5.25"/1.2 MB floppy services are supported (int 13h) 3.5"/720 KB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) ACPI is supported USB legacy is supported BIOS boot specification is supported Function key-initiated network boot is supported Handle 0x0100 DMI type 1, 27 bytes. System Information Manufacturer: HP Product Name: ProLiant ML350 G5 Version: Not Specified Serial Number: GB8814HE7S UUID: 34313236-3435-4742-3838-313448453753 Wake-up Type: Power Switch Handle 0x0300 DMI type 3, 17 bytes. Chassis Information Manufacturer: HP Type: Tower Lock: Not Present Version: Not Specified Serial Number: GB8814HE7S Asset Tag: Boot-up State: Unknown Power Supply State: Unknown Thermal State: Unknown Security Status: Unknown OEM Information: 0x00000000 Handle 0x0400 DMI type 4, 40 bytes. Processor Information Socket Designation: Proc 1 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 76 06 01 00 FF FB EB BF Signature: Type 0, Family 6, Model 17, Stepping 6 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Hyper-threading technology) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Not Specified Voltage: 1.4 V External Clock: 1333 MHz Max Speed: 4800 MHz Current Speed: 2333 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0710 L2 Cache Handle: 0x0720 L3 Cache Handle: 0x0730 Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0406 DMI type 4, 40 bytes. Processor Information Socket Designation: Proc 2 Type: Central Processor Family: Xeon Manufacturer: Intel ID: 00 00 00 00 00 00 00 00 Signature: Type 0, Family 0, Model 0, Stepping 0 Flags: None Version: Not Specified Voltage: 1.4 V External Clock: 200 MHz Max Speed: 4800 MHz Current Speed: Unknown Status: Unpopulated Upgrade: ZIF Socket L1 Cache Handle: 0x0716 L2 Cache Handle: 0x0726 L3 Cache Handle: 0x0736 Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0710 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 1 Internal L1 Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 128 KB Maximum Size: 128 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Data Associativity: 8-way Set-associative Handle 0x0716 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 2 Internal L1 Cache Configuration: Disabled, Not Socketed, Level 1 Operational Mode: Unknown Location: Internal Installed Size: 0 KB Maximum Size: 128 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Data Associativity: 8-way Set-associative Handle 0x0720 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 1 Internal L2 Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 12288 KB Maximum Size: 16384 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unknown Associativity: 8-way Set-associative Handle 0x0726 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 2 Internal L2 Cache Configuration: Disabled, Not Socketed, Level 2 Operational Mode: Unknown Location: Internal Installed Size: 0 KB Maximum Size: 16384 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unknown Associativity: 8-way Set-associative Handle 0x0730 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 1 Internal L3 Cache Configuration: Disabled, Not Socketed, Level 3 Operational Mode: Unknown Location: Internal Installed Size: 0 KB Maximum Size: 8192 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unknown Associativity: Other Handle 0x0736 DMI type 7, 19 bytes. Cache Information Socket Designation: Processor 2 Internal L3 Cache Configuration: Disabled, Not Socketed, Level 3 Operational Mode: Unknown Location: Internal Installed Size: 0 KB Maximum Size: 8192 KB Supported SRAM Types: Burst Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unknown Associativity: Other Handle 0x0801 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J16 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 1 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0802 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J19 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 2 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0803 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J69 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 3 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0804 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J69 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 4 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0805 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J02 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 5 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0806 DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: J03 Internal Connector Type: Access Bus (USB) External Reference Designator: USB Port 6 External Connector Type: Access Bus (USB) Port Type: USB Handle 0x0901 DMI type 9, 13 bytes. System Slot Information Designation: PCI Slot 1 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 1 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0902 DMI type 9, 13 bytes. System Slot Information Designation: PCI Slot 2 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 2 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0903 DMI type 9, 13 bytes. System Slot Information Designation: PCI Slot 3 Type: 64-bit PCI-X Current Usage: Available Length: Long ID: 3 Characteristics: 3.3 V is provided PME signal is supported Handle 0x0904 DMI type 9, 13 bytes. System Slot Information Designation: PCI-E Slot 4 Type: <OUT OF SPEC><OUT OF SPEC> Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported Handle 0x0905 DMI type 9, 13 bytes. System Slot Information Designation: PCI-E Slot 5 Type: <OUT OF SPEC><OUT OF SPEC> Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported Handle 0x0906 DMI type 9, 13 bytes. System Slot Information Designation: PCI-E Slot 6 Type: <OUT OF SPEC><OUT OF SPEC> Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported Handle 0x0B00 DMI type 11, 5 bytes. OEM Strings String 1: Product ID: 412645-B21 Handle 0x1000 DMI type 16, 15 bytes. Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Single-bit ECC Maximum Capacity: 32 GB Error Information Handle: Not Provided Number Of Devices: 8 Handle 0x1100 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: <OUT OF SPEC> Set: 1 Locator: DIMM 1A Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1101 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 1024 MB Form Factor: <OUT OF SPEC> Set: 2 Locator: DIMM 2B Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1102 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 1024 MB Form Factor: <OUT OF SPEC> Set: 3 Locator: DIMM 3C Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1103 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: <OUT OF SPEC> Set: 4 Locator: DIMM 4D Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: Unknown Handle 0x1104 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 512 MB Form Factor: <OUT OF SPEC> Set: 1 Locator: DIMM 5A Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1105 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 1024 MB Form Factor: <OUT OF SPEC> Set: 2 Locator: DIMM 6B Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1106 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 1024 MB Form Factor: <OUT OF SPEC> Set: 3 Locator: DIMM 7C Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: 667 MHz (1.5 ns) Handle 0x1107 DMI type 17, 23 bytes. Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: <OUT OF SPEC> Set: 4 Locator: DIMM 8D Bank Locator: Not Specified Type: <OUT OF SPEC> Type Detail: Synchronous Speed: Unknown Handle 0x1300 DMI type 19, 15 bytes. Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Array Handle: 0x1000 Partition Width: 0 Handle 0x1400 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1100 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 1 Interleaved Data Depth: Unknown Handle 0x1401 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1101 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 1 Interleaved Data Depth: Unknown Handle 0x1402 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1102 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 1 Interleaved Data Depth: Unknown Handle 0x1403 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000000003FF Range Size: 1 kB Physical Device Handle: 0x1103 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 1 Interleaved Data Depth: Unknown Handle 0x1404 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1104 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 2 Interleaved Data Depth: Unknown Handle 0x1405 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1105 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 2 Interleaved Data Depth: Unknown Handle 0x1406 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0015FFFFFFF Range Size: 5632 MB Physical Device Handle: 0x1106 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 2 Interleaved Data Depth: Unknown Handle 0x1407 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000000003FF Range Size: 1 kB Physical Device Handle: 0x1107 Memory Array Mapped Address Handle: 0x1300 Partition Row Position: 1 Interleave Position: 2 Interleaved Data Depth: Unknown Handle 0x2000 DMI type 32, 11 bytes. System Boot Information Status: No errors detected Handle 0x2600 DMI type 38, 18 bytes. IPMI Device Information Interface Type: KCS (Keyboard Control Style) Specification Version: 2.0 I2C Slave Address: 0x10 NV Storage Device: Not Present Base Address: 0x0000000000000CA2 (I/O) Register Spacing: Successive Byte Boundaries Handle 0xC100 DMI type 193, 7 bytes. OEM-specific Type Header And Data: C1 07 00 C1 01 01 02 Strings: 11/13/2007 11/13/2007 Handle 0xC200 DMI type 194, 5 bytes. OEM-specific Type Header And Data: C2 05 00 C2 01 Handle 0xC300 DMI type 195, 5 bytes. OEM-specific Type Header And Data: C3 05 00 C3 01 Strings: $0E110764 Handle 0xC400 DMI type 196, 5 bytes. OEM-specific Type Header And Data: C4 05 00 C4 00 Handle 0xC500 DMI type 197, 10 bytes. OEM-specific Type Header And Data: C5 0A 00 C5 00 04 00 01 FF 01 Handle 0xDF00 DMI type 223, 7 bytes. OEM-specific Type Header And Data: DF 07 00 DF 66 46 70 Handle 0xC506 DMI type 197, 10 bytes. OEM-specific Type Header And Data: C5 0A 06 C5 06 04 00 00 FF 02 Handle 0xD300 DMI type 211, 7 bytes. OEM-specific Type Header And Data: D3 07 00 D3 00 04 4E Handle 0xD306 DMI type 211, 7 bytes. OEM-specific Type Header And Data: D3 07 06 D3 06 04 00 Handle 0xC600 DMI type 198, 11 bytes. OEM-specific Type Header And Data: C6 0B 00 C6 17 00 00 01 3C 00 01 Handle 0xC700 DMI type 199, 112 bytes. OEM-specific Type Header And Data: C7 70 00 C7 0B 06 00 00 08 20 19 01 76 06 01 00 0B 06 00 00 08 20 19 01 76 06 01 00 04 04 00 00 07 20 08 06 74 06 01 00 04 04 00 00 07 20 08 06 74 06 01 00 B4 00 00 00 07 20 14 03 FB 06 00 00 B4 00 00 00 07 20 14 03 FB 06 00 00 67 00 00 00 07 20 26 03 F7 06 00 00 C9 00 00 00 07 20 26 03 F6 06 00 00 02 00 00 00 05 20 15 12 64 0F 00 00 Handle 0xCD00 DMI type 205, 22 bytes. OEM-specific Type Header And Data: CD 16 00 CD 01 01 46 41 54 78 00 00 E0 FF 00 00 00 00 00 00 0D 00 Handle 0xCA00 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 00 CA 00 11 FF 01 Handle 0xCA01 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 01 CA 01 11 FF 02 Handle 0xCA02 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 02 CA 02 11 FF 03 Handle 0xCA03 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 03 CA 03 11 FF 04 Handle 0xCA04 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 04 CA 04 11 FF 05 Handle 0xCA05 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 05 CA 05 11 FF 06 Handle 0xCA06 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 06 CA 06 11 FF 07 Handle 0xCA07 DMI type 202, 8 bytes. OEM-specific Type Header And Data: CA 08 07 CA 07 11 FF 08 Handle 0xD100 DMI type 209, 12 bytes. OEM-specific Type Header And Data: D1 0C 00 D1 00 03 00 1F 29 62 C4 A4 Handle 0xD400 DMI type 212, 24 bytes. OEM-specific Type Header And Data: D4 18 00 D4 24 43 52 55 00 F8 F6 FF 00 00 00 00 00 40 00 00 00 00 00 00 Handle 0xD500 DMI type 213, 28 bytes. OEM-specific Type Header And Data: D5 1C 00 D5 00 00 36 00 00 00 BF 1F 00 00 46 00 00 00 00 00 00 00 00 00 00 00 00 00 Handle 0xD600 DMI type 214, 44 bytes. OEM-specific Type Header And Data: D6 2C 00 D6 31 31 00 02 0E 20 00 00 13 20 00 00 00 60 00 00 00 20 00 00 02 20 00 00 04 20 00 00 06 20 00 00 0C 20 00 00 08 20 00 00 Handle 0xD700 DMI type 215, 6 bytes. OEM-specific Type Header And Data: D7 06 00 D7 00 05 Handle 0xDB00 DMI type 219, 8 bytes. OEM-specific Type Header And Data: DB 08 00 DB FF 00 00 00 Handle 0xDC00 DMI type 218, 45 bytes. OEM-specific Type Header And Data: DA 2D 00 DC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Handle 0xDC01 DMI type 220, 45 bytes. OEM-specific Type Header And Data: DC 2D 01 DC 08 00 00 C5 00 FF 01 00 C5 01 FF 02 00 C5 02 FF 03 00 C5 03 FF 04 06 C5 02 FF 05 06 C5 03 FF 06 06 C5 00 FF 07 06 C5 01 FF Handle 0xDD00 DMI type 221, 12 bytes. OEM-specific Type Header And Data: DD 0C 00 DD 00 03 00 1F 29 62 C4 A5 Handle 0x7F00 DMI type 127, 4 bytes. End Of Table ������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/ipdiscover/��������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0017660�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/ipdiscover/ipdiscover.c��������������������������������������������������0000664�0000000�0000000�00000015474�14323200667�0022206�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ############################################################################### ##OCSInventory Version NG Beta ##Copyleft Pascal DANEK 2006 ##Web : http://ocsinventory.sourceforge.net ## ##This code is open source and may be copied and modified as long as the source ##code is always made freely available. ##Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ */ #include "ipdiscover.h" /* We get IP address, netmask, index number and mac address of the adapter */ void get_iface_infos( packet *ppacket, int *index, char *iface, struct sockaddr_in *ipaddr, struct sockaddr_in *netmask){ int tmpsock; struct ifreq ifr; if( ( tmpsock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ){ perror("Socket creation problem"); exit(1); } /* Initialize */ memset( &ifr, 0x0, sizeof(struct ifreq)); /* We put into the ifreq struct the name of adapter */ strncpy(ifr.ifr_name, iface, IF_NAMESIZE-1); /* IP */ if(ioctl(tmpsock, SIOCGIFADDR, &ifr)< 0){ close(tmpsock); perror("Cannot get the ip address"); exit(1); } memcpy( &ipaddr->sin_addr, &( (struct sockaddr_in *) &ifr.ifr_addr )->sin_addr, 4 ); memcpy( ppacket->arphdr.ar_sip, &( (struct sockaddr_in *) &ifr.ifr_addr )->sin_addr, 4 ); /*******************/ /* SNM */ if(ioctl(tmpsock, SIOCGIFNETMASK, &ifr)< 0){ close(tmpsock); perror("Cannot get the net submask"); exit(1); } memcpy(&netmask->sin_addr, &((struct sockaddr_in *) &ifr.ifr_netmask)->sin_addr, 4); /*******************/ /* MAC */ if(ioctl(tmpsock, SIOCGIFHWADDR, &ifr)< 0){ close(tmpsock); perror("Cannot get the mac address"); exit(1); } memcpy( ppacket->ethhdr.h_source, (unsigned char *)&ifr.ifr_hwaddr.sa_data, ETH_ALEN ); memcpy( ppacket->arphdr.ar_sha, (unsigned char *)&ifr.ifr_hwaddr.sa_data, ETH_ALEN ); /*******************/ /* INDEX */ if(ioctl(tmpsock, SIOCGIFINDEX, &ifr)< 0){ close(tmpsock); perror("Cannot get the interface index"); exit(1); } *index = ifr.ifr_ifindex; /*******************/ close(tmpsock); } void data_init( struct sockaddr_in *ipaddr, struct sockaddr_in *netmask, packet **ppacket, struct sockaddr_ll *sll, int index ){ memset(ipaddr, 0x00, sizeof(struct sockaddr_in)); memset(netmask, 0x00, sizeof(struct sockaddr_in)); /* Arp structure */ *ppacket = malloc( sizeof( packet ) ); /* Tie to adapter */ sll->sll_family = AF_PACKET; sll->sll_protocol = htons(ETH_P_ARP); /* Building the packet */ memset( (*ppacket)->ethhdr.h_dest, 0xFF, 6 ); (*ppacket)->ethhdr.h_proto = htons(0x806); /* arp header */ (*ppacket)->arphdr.arp_hrdad = htons(ARPHRD_ETHER); (*ppacket)->arphdr.arp_prot = htons(ETH_P_IP); (*ppacket)->arphdr.arp_halen = ETH_ALEN; (*ppacket)->arphdr.arp_prlen = 4; (*ppacket)->arphdr.arp_opcode = htons(ARPOP_REQUEST); memset( (*ppacket)->arphdr.ar_tha, 0x0,ETH_ALEN ); } void print_xml(struct in_addr *ipsrc, packet *ppacket_r, struct hostent* name){ printf("<H><I>%s</I><M>%02x:%02x:%02x:%02x:%02x:%02x</M><N>%s</N></H>\n",inet_ntoa(*ipsrc), *ppacket_r->arphdr.ar_sha,ppacket_r->arphdr.ar_sha[1],ppacket_r->arphdr.ar_sha[2], ppacket_r->arphdr.ar_sha[3],ppacket_r->arphdr.ar_sha[4],ppacket_r->arphdr.ar_sha[5], name?name->h_name:"-"); } void create_socket(int *sd, struct sockaddr_ll *sll, int index){ /* Socket creation */ *sd = socket( PF_PACKET, SOCK_RAW, htons( ETH_P_ARP ) ); /* Put the iface index in sockaddr_ll structure to bind */ sll->sll_ifindex = index; if( *sd < 0 ){ perror("Socket creation problem"); exit(1); } if( fcntl( *sd, F_SETFL, O_NONBLOCK ) == -1 ){ perror("Cannot set socket mode to O_NONBLOCK"); exit(1); } /* Bind */ if( bind( *sd, (struct sockaddr*)sll, sizeof(*sll) ) == -1 ){ perror("Bind error"); exit(1); } } void validate_iface( struct sockaddr_in *ipaddr, struct sockaddr_in *netmask, packet *ppacket ){ char error_str[100]; if( ntohl(netmask->sin_addr.s_addr) < 0xFFFF0000){ snprintf(error_str, 100, "Invalid netmask -> too large (%s). Stop\n", inet_ntoa(netmask->sin_addr)); perror( error_str ); exit(1); } } void scan_init( unsigned long *unet, unsigned long *uhost, struct sockaddr_in *ipaddr, struct sockaddr_in *netmask, struct in_addr *ipsrc, packet **ppacket_r ){ /* Netid */ *unet = ntohl(ipaddr->sin_addr.s_addr) & ntohl(netmask->sin_addr.s_addr); /* Supposed number of hosts */ *uhost = ~( ntohl(netmask->sin_addr.s_addr) ); memset(ipsrc, 0, sizeof(struct in_addr)); *ppacket_r = malloc( sizeof( packet ) ); } int main(int argc, char ** argv){ /* Declarations */ /* full packet (tx and rx) */ packet *ppacket, *ppacket_r; /* Socket descriptor, nic index */ int sd = 0; int flag = 0; int index = 0; /* ip data */ unsigned long unet,uhost,ipdst,tip; /* The name of the interface is given in parameter to the binary */ char * iface; /* detected device's FQDN */ struct hostent* name; /* ip level sockaddr */ struct sockaddr_in ipaddr, netmask; /* Lowlevel sockaddr */ struct sockaddr_ll sll = {0x0}; /* source ip to put in packet */ struct in_addr ipsrc; int request_latency = REQUEST_LATENCY_DEFAULT; int p=0; /* Take at least one argument */ if(argc<2){ printf("IPDISCOVER binary ver. %d \nUsage : ipdiscover [iface name] [latency in ms]\n", VERSION); exit(0); }else{ iface = argv[1]; if( argc==3 ) request_latency = atoi( argv[2] ); } /* Initialize data */ data_init( &ipaddr, &netmask, &ppacket, &sll, index ); /* Reading nic parameters */ get_iface_infos( ppacket, &index, iface, &ipaddr, &netmask ); /* Check iface settings */ validate_iface( &ipaddr, &netmask, ppacket ); /* Creating socket */ create_socket( &sd, &sll, index ); /* Initialize packet target ip, potential hosts number... */ scan_init( &unet, &uhost, &ipaddr, &netmask, &ipsrc, &ppacket_r ); /* We are looking for all the possible connected host */ for(ipdst=1;ipdst<uhost;ipdst++){ tip = htonl(ipdst+unet); memcpy( ppacket->arphdr.ar_tip, &tip, 4 ); /* Sending the packet */ if( write( sd, ppacket, sizeof(packet) ) < 0 ){ perror("Transmission error"); exit(1); } flag = 0; usleep( request_latency * 1000 ); while( flag>=0 ){ memset( ppacket_r, 0, sizeof( packet ) ); flag = read( sd, ppacket_r, sizeof( packet ) ); if( flag>0 ) memcpy(&ipsrc, ppacket_r->arphdr.ar_sip, sizeof(struct in_addr)); if(ntohs(ppacket_r->arphdr.arp_opcode) == 2){ char * c; if(p==0) printf("<IPDISCOVER>\n"); p++; name = gethostbyaddr(&ipsrc, sizeof(struct in_addr), AF_INET); if(name){ while((c=strchr(name->h_name,'<')) || (c=strchr(name->h_name,'>'))){ strncpy(c,"x",sizeof(c)); } } usleep( NAME_RES_LATENCY ); print_xml( &ipsrc, ppacket_r, name ); } } } if(p) printf("</IPDISCOVER>\n"); /* That's all */ exit(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/resources/ipdiscover/ipdiscover.h��������������������������������������������������0000664�0000000�0000000�00000003000�14323200667�0022171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ############################################################################### ##OCSInventory Version NG Beta ##Copyleft Pascal DANEK 2006 ##Web : http://ocsinventory.sourceforge.net ## ##This code is open source and may be copied and modified as long as the source ##code is always made freely available. ##Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt ################################################################################ */ #include <sys/socket.h> #include <linux/if_ether.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <linux/if_packet.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/sockios.h> #include <sys/ioctl.h> #include <net/if.h> #include <fcntl.h> #include <time.h> #include <netdb.h> #ifndef ARPHRD_ETHER #define ARPHRD_ETHER 1 #endif #ifndef ARPOP_REQUEST #define ARPOP_REQUEST 1 #endif #ifndef ARPOP_REPLY #define ARPOP_REPLY 2 #endif #define VERSION 5 #define NAME_RES_LATENCY 1000000 #define REQUEST_LATENCY_DEFAULT 100 /* ms */ /* Trame ARP */ struct arphdr{ unsigned short arp_hrdad; unsigned short arp_prot; unsigned char arp_halen; unsigned char arp_prlen; unsigned short arp_opcode; unsigned char ar_sha[ETH_ALEN]; unsigned char ar_sip[4]; unsigned char ar_tha[ETH_ALEN]; unsigned char ar_tip[4]; }; /* Ethernet header*/ struct Packet{ struct ethhdr ethhdr; struct arphdr arphdr; }; typedef struct Packet packet; UnixAgent-2.10.0/snmp/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0014454�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0015406�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/�������������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0016500�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/1588.xml�����������������������������������������������������������0000664�0000000�0000000�00000007707�14323200667�0017642�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<T_1588> <PARAMETERS> <PARSER>1</PARSER> <VERSION>1</VERSION> <NAME>Brocade</NAME> <EXECUTE> <RUN>Host_Resources_Mib</RUN> <RUN>If_Mib</RUN> <RUN>Entity_Mib</RUN> </EXECUTE> </PARAMETERS> <DATA> <COMMON> <TYPE> <SET>San</SET> </TYPE> </COMMON> <SWITCH_SAN> <SERIALNUMBER> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.1.10.0</VALUE> </SERIALNUMBER> <MANUFACTURER> <SET>Brocade</SET> </MANUFACTURER> <SOFTVERSION> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.1.6.0</VALUE> </SOFTVERSION> <DOMAIN_ID> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.2.1.0</VALUE> </DOMAIN_ID> <PRINCIPAL_ID> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.2.2.0</VALUE> </PRINCIPAL_ID> </SWITCH_SAN> </DATA> <LOOPS> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.1</VALUE> <INDEX>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.1.(\S+)</INDEX> <NAME_INDEX>IDX</NAME_INDEX> <DATA> <NETWORKS> <SLOT> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.37.IDX</VALUE> </SLOT> <PHYSICAL> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.3.IDX</VALUE> <REPLACE> <STRING>1</STRING> <BY>No Card</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>No Gbic</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Laser Fault</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>No Light</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>No Sync</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>In Sync</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>Port Fault</BY> </REPLACE> <REPLACE> <STRING>8</STRING> <BY>Diagnostics Fault</BY> </REPLACE> <REPLACE> <STRING>9</STRING> <BY>Lock Reference Signal</BY> </REPLACE> </PHYSICAL> <OP_STATUS> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.4.IDX</VALUE> <REPLACE> <STRING>0</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>1</STRING> <BY>Online</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Offline</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>testing</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Faulty</BY> </REPLACE> </OP_STATUS> <STATUS> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.5.IDX</VALUE> <REPLACE> <STRING>1</STRING> <BY>Online</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Offline</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Testing</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Faulty</BY> </REPLACE> </STATUS> <TYPE> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.7.IDX</VALUE> <REPLACE> <STRING>1</STRING> <BY>unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>long wave laser (lw)</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>short wave laser (sw)</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>long wave LED (ld)</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>copper (CU)</BY> </REPLACE> </TYPE> <SPEED> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.35.IDX</VALUE> <REPLACE> <STRING>1</STRING> <BY>1 GB</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>2 GB</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>auto</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>4 GB</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>8 GB</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>10 GB</BY> </REPLACE> </SPEED> <MACADDR> <VALUE>1.3.6.1.4.1.1588.2.1.1.1.6.2.1.34.IDX</VALUE> </MACADDR> </NETWORKS> </DATA> </LOOPS> </T_1588> ���������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/18552.xml����������������������������������������������������������0000664�0000000�0000000�00000000273�14323200667�0017710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<T_18552> <PARAMETERS> <PARSER>1</PARSER> <VERSION>1</VERSION> <NAME>xxx</NAME> <EXECUTE> <RUN>8072</RUN> </EXECUTE> </PARAMETERS> </T_18552> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/24681.xml����������������������������������������������������������0000664�0000000�0000000�00000002137�14323200667�0017711�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<T_24681> <PARAMETERS> <PARSER>1</PARSER> <VERSION>1</VERSION> <NAME>Nas</NAME> </PARAMETERS> <DATA> <COMMON> <TYPE> <SET>San</SET> </TYPE> <UPTIME> <VALUE>1.3.6.1.4.1.24681.1.4</VALUE> </UPTIME> </COMMON> <MEMORIES> <CAPACITY> <VALUE>1.3.6.1.4.1.24681.1.2</VALUE> </CAPACITY> </MEMORIES> </DATA> <LOOPS> <VALUE>1.3.6.1.4.1.24681.1.9.1.2</VALUE> <INDEX>1.3.6.1.4.1.24681.1.9.1.(\S+)</INDEX> <NAME_INDEX>IDX</NAME_INDEX> <DATA> <NETWORKS> <DESCRIPTION> <VALUE>1.3.6.1.4.1.24681.1.9.1.2.IDX</VALUE> </DESCRIPTION> </NETWORKS> </DATA> </LOOPS> <LOOPS> <VALUE>1.3.6.1.4.1.24681.1.11.1.2</VALUE> <INDEX>1.3.6.1.4.1.24681.1.11.1.(\S+)</INDEX> <NAME_INDEX>IDX</NAME_INDEX> <DATA> <TYPE> <VALUE>1.3.6.1.4.1.24681.1.11.5.IDX</VALUE> </TYPE> <TOTAL> <VALUE>1.3.6.1.4.1.24681.1.11.6.IDX</VALUE> </TOTAL> <LABEL> <VALUE>1.3.6.1.4.1.24681.1.11.2.IDX</VALUE> </LABEL> </DATA> </LOOPS> </T_24681> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/6876.xml�����������������������������������������������������������0000664�0000000�0000000�00000006042�14323200667�0017636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<T_6876> <PARAMETERS> <PARSER>1</PARSER> <VERSION>1</VERSION> <NAME>Vmware</NAME> <EXECUTE> <RUN>Host_Resources_Mib</RUN> <RUN>If_Mib</RUN> </EXECUTE> </PARAMETERS> <DATA> <COMMON> <DESCRIPTION> <VALUE>1.3.6.1.4.1.6876.1.1.0</VALUE> </DESCRIPTION> <TYPE> <SET>Virtual Server</SET> </TYPE> </COMMON> <VIRTUAL> <TYPE> <VALUE>1.3.6.1.4.1.6876.1.1.0</VALUE> </TYPE> <MANUFACTURER> <SET>VmWare</SET> </MANUFACTURER> <SOFTVERSION> <VALUE>1.3.6.1.4.1.6876.1.2.0</VALUE> </SOFTVERSION> <REVISION> <VALUE>1.3.6.1.4.1.6876.1.4.0</VALUE> </REVISION> </VIRTUAL> </DATA> <LOOPS> <VALUE>1.3.6.1.4.1.6876.2.1.1.2</VALUE> <INDEX>1.3.6.1.4.1.6876.2.1.1.2.(\S+)</INDEX> <NAME_INDEX>VM</NAME_INDEX> <DATA> <VIRTUALMACHINES> <NAME> <VALUE>1.3.6.1.4.1.6876.2.1.1.2.VM</VALUE> </NAME> <CONFIG_FILE> <VALUE>1.3.6.1.4.1.6876.2.1.1.3.VM</VALUE> </CONFIG_FILE> <OS> <VALUE>1.3.6.1.4.1.6876.2.1.1.4.VM</VALUE> </OS> <MEMORY> <VALUE>1.3.6.1.4.1.6876.2.1.1.5.VM</VALUE> </MEMORY> <POWER> <VALUE>1.3.6.1.4.1.6876.2.1.1.6.VM</VALUE> </POWER> <CPU> <VALUE>1.3.6.1.4.1.6876.2.1.1.9.VM</VALUE> </CPU> <UUID> <VALUE>1.3.6.1.4.1.6876.2.1.1.10.VM</VALUE> </UUID> <LOOPS> <VALUE>1.3.6.1.4.1.6876.2.3.1.3.VM</VALUE> <INDEX>1.3.6.1.4.1.6876.2.3.1.3.VM.(\S+)</INDEX> <NAME_INDEX>DISK</NAME_INDEX> <DATA> <DISKS> <NAME> <VALUE>1.3.6.1.4.1.6876.2.3.1.3.VM.DISK</VALUE> </NAME> </DISKS> </DATA> </LOOPS> <LOOPS> <VALUE>1.3.6.1.4.1.6876.2.4.1.3.VM</VALUE> <INDEX>1.3.6.1.4.1.6876.2.4.1.3.VM.(\S+)</INDEX> <NAME_INDEX>NET</NAME_INDEX> <DATA> <NETWORKS> <DRIVER> <VALUE>1.3.6.1.4.1.6876.2.4.1.3.VM.NET</VALUE> </DRIVER> <DESCRIPTION> <VALUE>1.3.6.1.4.1.6876.2.4.1.4.VM.NET</VALUE> </DESCRIPTION> <MACADDR> <VALUE>1.3.6.1.4.1.6876.2.4.1.7.VM.NET</VALUE> </MACADDR> <STATUS> <VALUE>1.3.6.1.4.1.6876.2.4.1.6.VM.NET</VALUE> <REPLACE> <STRING>true</STRING> <BY>Up</BY> </REPLACE> <REPLACE> <STRING>false</STRING> <BY>Down</BY> </REPLACE> </STATUS> </NETWORKS> </DATA> </LOOPS> </VIRTUALMACHINES> </DATA> </LOOPS> </T_6876> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/snmp/mibs/local/7244.xml�����������������������������������������������������������0000664�0000000�0000000�00000031042�14323200667�0017622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<T_7244> <PARAMETERS> <PARSER>1</PARSER> <VERSION>1</VERSION> <NAME>Blade</NAME> </PARAMETERS> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.1</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.1.(\S+)</INDEX> <NAME_INDEX>POWER</NAME_INDEX> <DATA> <POWERSUPPLIES> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.2.POWER</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Ok</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Not present</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Error</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Critical</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Off</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>dummy</BY> </REPLACE> </STATUS> <MANUFACTURER> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.3.POWER</VALUE> </MANUFACTURER> <REFERENCE> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.4.POWER</VALUE> </REFERENCE> <TYPE> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.5.1.5.POWER</VALUE> </TYPE> <REVISION> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.6.POWER</VALUE> </REVISION> <SERIALNUMBER> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.2.4.1.7.POWER</VALUE> </SERIALNUMBER> </POWERSUPPLIES> </DATA> </LOOPS> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.1.1.1.1</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.4.1.1.1.1.(\S+)</INDEX> <NAME_INDEX>LAME</NAME_INDEX> <DATA> <DEVICE> <POWER> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.1.1.1.5.LAME</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>On</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Off</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Power-cycle</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Reset</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Nmi</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>Force Off</BY> </REPLACE> </POWER> <DATA> <POSITION> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.1.1.1.1.LAME</VALUE> </POSITION> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.2.LAME</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Ok</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Not Present</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Error</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Critical</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Standby</BY> </REPLACE> </STATUS> </DATA> <MANUFACTURER> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.3.LAME</VALUE> <REPLACE> <STRING>FSC</STRING> <BY>Fujitsu Siemens Computers</BY> </REPLACE> </MANUFACTURER> <SERIAL> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.5.LAME</VALUE> </SERIAL> <PRODUCT> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.6.LAME</VALUE> </PRODUCT> <HARDWARE> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.8.LAME</VALUE> </HARDWARE> <FIRMWARE> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.9.LAME</VALUE> </FIRMWARE> <BIOS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.10.LAME</VALUE> </BIOS> <BIOS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.10.LAME</VALUE> </BIOS> <SOCKET> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.11.LAME</VALUE> </SOCKET> <MEMORY_SLOT> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.12.LAME</VALUE> </MEMORY_SLOT> <TYPE> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.2.1.1.22.LAME</VALUE> </TYPE> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.1.LAME</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.1.LAME.(\S+)</INDEX> <NAME_INDEX>CPU</NAME_INDEX> <DATA> <CPUS> <TYPE> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.3.LAME.CPU</VALUE> <REPLACE> <STRING>12</STRING> <BY>Xeon</BY> </REPLACE> <REPLACE> <STRING>11</STRING> <BY>Pentium M</BY> </REPLACE> <REPLACE> <STRING>10</STRING> <BY>Pentium IV</BY> </REPLACE> <REPLACE> <STRING>9</STRING> <BY>M Un</BY> </REPLACE> <REPLACE> <STRING>8</STRING> <BY>Pentium III</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>Pentium II Xeon</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Celeron</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Pentium MMX</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Pentium II</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Pentium Pro</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Pentium</BY> </REPLACE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> </TYPE> <SPEED> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.4.LAME.CPU</VALUE> </SPEED> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.6.LAME.CPU</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>OK</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Not Present</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Error</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Critical</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Missing termination</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>Disabled</BY> </REPLACE> </STATUS> <MANUFACTURER> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.3.1.1.9.LAME.CPU</VALUE> </MANUFACTURER> </CPUS> </DATA> </LOOPS> <MEMORY> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.1.1.2.LAME</VALUE> </MEMORY> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.1.LAME</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.1.LAME.(\S+)</INDEX> <NAME_INDEX>SLOT</NAME_INDEX> <DATA> <MEMORIES> <NUMSLOTS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.2.LAME.SLOT</VALUE> </NUMSLOTS> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.3.LAME.SLOT</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Disable</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Ok</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Not Present</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Critical</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Prefailure Warning</BY> </REPLACE> </STATUS> <CAPACITY>3 <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.4.LAME.SLOT</VALUE> </CAPACITY> <DESCRIPTION> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.6.LAME.SLOT</VALUE> </DESCRIPTION> <SPEED> <VALUE>1.3.6.1.4.1.7244.1.1.1.4.4.2.1.7.LAME.SLOT</VALUE> </SPEED> </MEMORIES> </DATA> </LOOPS> </DEVICE> </DATA> </LOOPS> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.3.1.1.2</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.3.3.1.1.2.(\S+)</INDEX> <NAME_INDEX>FAN</NAME_INDEX> <DATA> <FANS> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.3.1.1.2.FAN</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Disable</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Ok</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Fail</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Prefailure predicted</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Redundant fan failed</BY> </REPLACE> <REPLACE> <STRING>7</STRING> <BY>Not manageable</BY> </REPLACE> <REPLACE> <STRING>8</STRING> <BY>Not present</BY> </REPLACE> <REPLACE> <STRING>9</STRING> <BY>Not available</BY> </REPLACE> </STATUS> <DESCRIPTION> <VALUE>1.3.6.1.4.1.7244.1.1.1.3.3.1.1.3.FAN</VALUE> </DESCRIPTION> </FANS> </DATA> </LOOPS> <LOOPS> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.3</VALUE> <INDEX>1.3.6.1.4.1.7244.1.1.1.2.1.1.3.(\S+)</INDEX> <NAME_INDEX>BLADE</NAME_INDEX> <DATA> <BLADE> <STATUS> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.2.BLADE</VALUE> <REPLACE> <STRING>1</STRING> <BY>Unknown</BY> </REPLACE> <REPLACE> <STRING>2</STRING> <BY>Ok</BY> </REPLACE> <REPLACE> <STRING>3</STRING> <BY>Not present</BY> </REPLACE> <REPLACE> <STRING>4</STRING> <BY>Error</BY> </REPLACE> <REPLACE> <STRING>5</STRING> <BY>Critical</BY> </REPLACE> <REPLACE> <STRING>6</STRING> <BY>Standby</BY> </REPLACE> </STATUS> <MANUFACTURER> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.3.BLADE</VALUE> <REPLACE> <STRING>FSC</STRING> <BY>Fujitsu Siemens Computers</BY> </REPLACE> </MANUFACTURER> <SERIALNUMBER> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.5.BLADE</VALUE> </SERIALNUMBER> <TYPE> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.6.BLADE</VALUE> </TYPE> <SERIALNUMBER> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.7.BLADE</VALUE> </SERIALNUMBER> <FIRMVERSION> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.8.BLADE</VALUE> </FIRMVERSION> <SOFTVERSION> <VALUE>1.3.6.1.4.1.7244.1.1.1.2.1.1.9.BLADE</VALUE> </SOFTVERSION> </BLADE> </DATA> </LOOPS> </T_7244> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/�����������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14323200667�0014637�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/build-perl-tree.sh�����������������������������������������������������������0000775�0000000�0000000�00000004635�14323200667�0020202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # A script to prepare a installation of Perl + OCSInventory-agent for # Unix/Linux # This in order to be able to provide an installation for system without # Perl > 5.6 set -e MAKE="make" TMP="/home2/goneri/tmp" PREFIX="$TMP/build/opt/ocsinventory-agent" ETCDIR="$PREFIX/etc" BASEDIR="$PREFIX/var/ocsinventory-agent" LOGDIR="$PREFIX/log/ocsinventory-agent" PIDFILE="$PREFIX/var/run" PERLVERSION="5.10.0" if [ ! -d $TMP ]; then echo "tmp $TMP dir is missing" fi cd $TMP if [ ! -f perl-$PERLVERSION.tar.gz ]; then wget -O perl-$PERLVERSION.tar.gz.part http://cpan.perl.org/src/perl-$PERLVERSION.tar.gz mv perl-$PERLVERSION.tar.gz.part perl-$PERLVERSION.tar.gz fi gunzip < perl-$PERLVERSION.tar.gz | tar xvf - cd perl-$PERLVERSION # AIX #./Configure -Dusenm -des -Dinstallprefix=$PREFIX -Dsiteprefix=$PREFIX -Dprefix=$PREFIX #./Configure -Dcc="gcc" -des -Dinstallprefix=$PREFIX -Dsiteprefix=$PREFIX -Dprefix=$PREFIX ./Configure -des -Dinstallprefix=$PREFIX -Dsiteprefix=$PREFIX -Dprefix=$PREFIX $MAKE $MAKE install PATH=$PREFIX/bin:$PATH export PATH cpanp 's conf prereqs 1; i XML::SAX' cpanp 's conf prereqs 1; i XML::Simple' cpanp 's conf prereqs 1; i LWP' cpanp 's conf prereqs 1; i Proc::Daemon' cpanp 's conf prereqs 1; i HTML::Parser' # For what? # Report error about IPv6 on Solaris 10 cpanp 's conf prereqs 1; i --force Net::IP' cpanp 's conf prereqs 1; i --force PAR::Packer' cpanp 's conf prereqs 1; i --force Net::SSLeay' exit; if [ ! openssl-0.9.8j.tar.gz ]; then wget -O openssl-0.9.8j.tar.gz.part http://www.openssl.org/source/openssl-0.9.8j.tar.gz mv openssl-0.9.8j.tar.gz.part openssl-0.9.8j.tar.gz fi gunzip < openssl-0.9.8j.tar.gz | tar xvf - cd openssl-0.9.8j ./config --prefix=/home2/goneri/tmp/openssl make make install ln -s apps bin #for i in `ls ../tarballs/*.gz`; do # gunzip < $i | tar xvf - #done #cd ../expat-2.0.0/ #./configure --prefix=$PREFIX #$MAKE #cd ../Ocsinventory-Agent-0.0.2/ #$PERL Makefile.PL PREFIX=$PREFIX #$MAKE PREFIX=$PREFIX #$MAKE install PREFIX=$PREFIX #:$PATH#perl -i -pe "s!/etc/ocsinventory-agent!$ETCDIR!" $PREFIX/bin/ocsinventory-agent #perl -i -pe "s!/var/lib/ocsinventory-agent!$BASEDIR!" $PREFIX/bin/ocsinventory-agent #perl -i -pe "s!/var/log/ocsinventory-agent!$LOGDIR!" $PREFIX/bin/ocsinventory-agent #perl -i -pe "s!/var/run/ocsinventory-agent.pid!$PIDFILE!" $PREFIX/bin/ocsinventory-agent #mkdir -p $ETCDIR #mkdir -p $BASEDIR #mkdir -p $LOGDIR #mkdir -p $PIDFILE ���������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/encryptText.pm���������������������������������������������������������������0000775�0000000�0000000�00000000607�14323200667�0017534�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # Requirements use MIME::Base64; # (1) quit unless we have the correct number of command-line args $num_args = $#ARGV + 1; if ($num_args != 1) { print "\nUsage: perl encryptPassword.pm clearTextPassword \n"; exit; } my $hash = encode_base64($ARGV[0]); print "Password's hash is : \n"; print "$hash \n"; print "You can now put it in ocsinventory-agent.cfg \n"; �������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/makedist.sh������������������������������������������������������������������0000775�0000000�0000000�00000000663�14323200667�0017004�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # Hack because of # http://rt.cpan.org/Public/Bug/Display.html?id=43060 perl Makefile.PL make manifest make dist gunzip < Ocsinventory-Agent-0.0.10beta3.tar.gz | tar xf - perl -i -pe 's/^exit;//' Ocsinventory-Agent-0.0.10beta3/inc/BUNDLES/libwww-perl-5.823/Makefile.PL rm Ocsinventory-Agent-0.0.10beta3.tar.gz tar cf Ocsinventory-Agent-0.0.10beta3.tar Ocsinventory-Agent-0.0.10beta3 gzip Ocsinventory-Agent-0.0.10beta3.tar �����������������������������������������������������������������������������UnixAgent-2.10.0/tools/parseVmware.pl���������������������������������������������������������������0000664�0000000�0000000�00000000623�14323200667�0017471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; my $data = { cpu => {}, mem => {}, }; open VMWARECPU,"</proc/vmware/cpuinfo" or die; foreach (<VMWARECPU>) { if (/^\s*(\w+)\s+(\w.*)\s*/) { my $key = $1; my @data = split(/\s+/,$2); print Dumper(\@data); $data->{cpu}->{$key} = \@data; #print $1." -> '".$2."'\n"; } } print Dumper($data); close VMWARECPU; �������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/pre-nobundle.sh��������������������������������������������������������������0000664�0000000�0000000�00000000216�14323200667�0017564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh make distclean rm -f MANIFEST Makefile sed -i 's/^bundle/#bundle/' Makefile.PL rm -rf inc/BUNDLES* perl Makefile.PL make manifest ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UnixAgent-2.10.0/tools/standalone.sh����������������������������������������������������������������0000775�0000000�0000000�00000003771�14323200667�0017336�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh echo "WARNINGS: Very experimental tool" [ -f standalone.sh ] && cd .. if [ ! -f tools/standalone.sh ]; then echo "Can't find tools/standalone.sh" exit 1 fi if [ ! -f MANIFEST ]; then echo "Can't find the MANIFEST, please run:" echo " perl Makefile.PL" echo " make manifest" exit 1 fi if [ ! -x "`which pp 2>/dev/null`" ]; then echo "Can't find the pp command. Please install PAR::Packer:" echo " -CPAN: 'cpan PAR::Packer'" echo " -source: download the archive from" echo " http://search.cpan.org/dist/PAR-Packer/" echo " -Debian/Ubuntu: 'aptitude install libpar-packer-perl' OR 'aptitude install libpar-perl'" exit 1 fi BACKENDMODULE=`cat MANIFEST | perl -pe 's/.*// unless (/Ocsinventory\/Agent\/Backend\// && !/^inc/ && /pm$/); s/lib\/(.*)\.pm/ $1/; s/\//::/g; chomp'` cat > lib/Ocsinventory/Agent/Backend/ModuleToLoad.pm <<EOF # This is a workaround for PAR::Packer. Since it resets @INC # I can't find the backend modules to load dynamically. So # I prepare a list and include it. package Ocsinventory::Agent::Backend::ModuleToLoad; our @list = qw/ $BACKENDMODULE /; 1; EOF MODULES="`cat MANIFEST | perl -pe 's/.*// unless (!/^inc/ && /pm$/ && !/^contrib/); s/lib\/(.*)\.pm/ -M $1/; s/\//::/g; chomp'` -M XML::SAX::PurePerl -M XML::SAX::Expat -M PerlIO -M Getopt::Long -M Digest::MD5 -M Net::IP -M Ocsinventory::Agent::Backend::ModuleToLoad" for i in `echo $MODULES| perl -nle 's/\-M//g;print'`; do perl -I "lib" -M$i -e "1" || MISSING="$MISSING $i" ;done if [ ! -z "$MISSING" ]; then echo "Some modules are missing in your installation or failed to build, please install them first." echo "->$MISSING" exit 1 fi #pp --lib lib $MODULES -o ocsinventory-agent.bin ocsinventory-agent pp --lib lib $MODULES -B -p ocsinventory-agent -vvv -o ocsinventory-agent.par pp -o ocsinventory-agent.bin ocsinventory-agent.par if [ -f ocsinventory-agent.bin ]; then echo "ocsinventory-agent.bin generated!" else echo "Failed to generate ocsinventory-agent.bin!" fi �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������